r357 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing/content/cruise java/fr/ifremer/tutti/ui/swing/content/home 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/split java/fr/ifremer/tutti/ui/swing/content/program java/fr/ifremer/tutti/ui/swing/content/protocol resources/fr/ifremer/tutti/ui/swing/content/cruise resources/fr/ifremer/tutti/ui/swin
Author: kmorin Date: 2013-02-07 12:20:45 +0100 (Thu, 07 Feb 2013) New Revision: 357 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/357 Log: - fixes #1850 [ERGO] - Gestion des champs obligatoires - [catches - split] add checkboxes to select the split values Added: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-warning-validation.xml Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/DeleteProtocolAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.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/EditFishingOperationUIModel.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/SpeciesBatchUIHandler.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/SplitSpeciesBatchTableModel.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/SplitSpeciesBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-error-validation.xml trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml trunk/tutti-ui-swing/src/main/resources/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/program/EditProgramUIModel-error-validation.xml trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-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/content/cruise/EditCruiseUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java 2013-02-07 11:20:45 UTC (rev 357) @@ -275,19 +275,10 @@ return ui.getValidator(); } - public static final String cruiseNameFormat = "%1$s_%2$s"; - public void generateCampaignName() { EditCruiseUIModel model = getModel(); - Program program = model.getProgram(); - Integer year = model.getYear(); - String name = String.format(cruiseNameFormat, program.getName(), year); - - String surveyPart = model.getSurveyPart(); - if (StringUtils.isNotEmpty(surveyPart)) { - name += "_" + surveyPart; - } + String name = model.getGeneratedCampaignName(); model.setName(name); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java 2013-02-07 11:20:45 UTC (rev 357) @@ -36,6 +36,7 @@ import java.util.Date; import java.util.List; +import org.apache.commons.lang3.StringUtils; /** * Model of UI {@link EditCruiseUI}. @@ -283,4 +284,13 @@ return program != null && year != null; } + public static final String cruiseNameFormat = "%1$s_%2$s"; + + public String getGeneratedCampaignName() { + String name = String.format(cruiseNameFormat, program.getName(), year); + if (StringUtils.isNotEmpty(surveyPart)) { + name += "_" + surveyPart; + } + return name; + } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/DeleteProtocolAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/DeleteProtocolAction.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/DeleteProtocolAction.java 2013-02-07 11:20:45 UTC (rev 357) @@ -33,6 +33,7 @@ import java.awt.event.ActionEvent; import java.util.List; +import javax.swing.JOptionPane; import static org.nuiton.i18n.I18n._; @@ -60,6 +61,22 @@ } @Override + protected boolean prepareAction(ActionEvent event) { + boolean result = super.prepareAction(event); + + TuttiProtocol protocol = getHandler().getModel().getProtocol(); + int answer = JOptionPane.showConfirmDialog( + getHandler().getUI(), + _("tutti.action.deleteProtocol.message", protocol.getName()), + _("tutti.action.deleteProtocol.title"), + JOptionPane.OK_CANCEL_OPTION + ); + result &= answer == JOptionPane.OK_OPTION; + + return result; + } + + @Override protected void doAction(ActionEvent e) { TuttiProtocol protocol = getModel().getProtocol(); Preconditions.checkNotNull(protocol); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-02-07 11:20:45 UTC (rev 357) @@ -90,6 +90,7 @@ <field name='gearShootingEndDate' component='gearShootingEndDateField'/> <field name='comment' component='commentPane'/> <field name='saisisseur' component='saisisseurList'/> + <field name='trawlDistance' component='trawlDistanceField'/> <field name='vessel' component='vesselComboBox'/> <field name='gear' component='gearComboBox'/> <field name='multirigAggregation' component='multirigAggregationField'/> @@ -141,6 +142,11 @@ component='gearShootingEndLongitudeDMDDegreeField'/> <field name='gearShootingEndLongitudeDecimalMinute' component='gearShootingEndLongitudeDMDMinuteField'/> + <field name='fishingOperationValid' + component='fishingOperationValidPanel'/> + <field name='strata' component='strataComboBox'/> + <field name='subStrata' component='subStrataComboBox'/> + <field name='location' component='locationComboBox'/> </BeanValidator> <CardLayout2Ext id='gearShootingStartLongitudeLayout' 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 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-07 11:20:45 UTC (rev 357) @@ -52,6 +52,7 @@ import fr.ifremer.tutti.ui.swing.util.TabHandler; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.time.DateUtils; @@ -61,6 +62,7 @@ import javax.swing.JOptionPane; import javax.swing.JTabbedPane; import java.awt.Color; +import java.awt.Component; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -143,7 +145,7 @@ EditFishingOperationUIModel model = new EditFishingOperationUIModel(); model.setCoordinateEditorType(getConfig().getCoordinateEditorType()); model.setValidationContext(getContext().getValidationContext()); - + // model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_EMPTY, new PropertyChangeListener() { // @Override // public void propertyChange(PropertyChangeEvent evt) { @@ -180,24 +182,38 @@ } }); - model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE, new PropertyChangeListener() { + 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) { - Boolean rectiligne = (Boolean) evt.getNewValue(); - if (rectiligne) { + if (properties.contains(evt.getPropertyName())) { EditFishingOperationUIModel source = (EditFishingOperationUIModel) evt.getSource(); - Float latS = source.getGearShootingStartLatitude(); - Float longS = source.getGearShootingStartLongitude(); - Float latE = source.getGearShootingEndLatitude(); - Float longE = source.getGearShootingEndLongitude(); - - if (latS != null && longS != null - && latE != null && longE != null) { - LatLng start = new LatLng(latS, longS); - LatLng end = new LatLng(latE, longE); - Double distance = LatLngTool.distance(start, end, LengthUnit.METER); - source.setTrawlDistance(distance.floatValue()); + if (source.isFishingOperationRectiligne()) { + source.computeDictance(); } } } @@ -217,6 +233,9 @@ color = Color.RED; fontColor = Color.WHITE; } + Component tab = getTabPanel().getTabComponentAt(0); + tab.setForeground(fontColor); + tab.setBackground(color); } }); @@ -443,6 +462,10 @@ bean = new FishingOperation(); } + List<FishingOperation> operations = parentUi.getModel().getFishingOperation(); + operations.remove(bean); + model.setExistingOperations(operations); + FishingOperationLocation strata = bean.getStrata(); FishingOperationLocation subStrata = bean.getSubStrata(); FishingOperationLocation location = bean.getLocation(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java 2013-02-07 11:20:45 UTC (rev 357) @@ -25,6 +25,9 @@ */ import com.google.common.collect.Lists; +import com.javadocmd.simplelatlng.LatLng; +import com.javadocmd.simplelatlng.LatLngTool; +import com.javadocmd.simplelatlng.util.LengthUnit; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; @@ -193,6 +196,8 @@ protected String multirigAggregation; protected CoordinateEditorType coordinateEditorType; + + protected List<FishingOperation> existingOperations; protected static Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, @@ -714,6 +719,14 @@ return DateUtil.between(date, cruise.getBeginDate(), cruise.getEndDate()); } + public List<FishingOperation> getExistingOperations() { + return existingOperations; + } + + public void setExistingOperations(List<FishingOperation> existingOperations) { + this.existingOperations = existingOperations; + } + public void convertGearShootingCoordinatesDDToDMS() { SexagecimalPosition position; Integer degree; @@ -776,4 +789,17 @@ setGearShootingEndLongitude(decimalValue); } + public void computeDictance() { + if (coordinateEditorType != CoordinateEditorType.DD) { + convertGearShootingCoordinatesDMSToDD(); + } + if (gearShootingStartLatitude != null && gearShootingStartLongitude != null + && gearShootingEndLatitude != null && gearShootingEndLongitude != null) { + LatLng start = new LatLng(gearShootingStartLatitude, gearShootingStartLongitude); + LatLng end = new LatLng(gearShootingEndLatitude, gearShootingEndLongitude); + Double distance = LatLngTool.distance(start, end, LengthUnit.METER); + setTrawlDistance(distance.floatValue()); + } + } + } \ No newline at end of file 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 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java 2013-02-07 11:20:45 UTC (rev 357) @@ -93,7 +93,7 @@ } public boolean isValid() { - return categoryValue != null && categoryWeight != null; + return categoryValue != null; } public boolean isEmpty() { 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 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-02-07 11:20:45 UTC (rev 357) @@ -256,10 +256,10 @@ // &&!row.getSortedUnsortedCategory().isEmpty() && // row.getSortedUnsortedCategory().isValid(); - result &= row.getSizeCategory().isEmptyOrValid(); - result &= row.getSexCategory().isEmptyOrValid(); - result &= row.getMaturityCategory().isEmptyOrValid(); - result &= row.getAgeCategory().isEmptyOrValid(); +// result &= row.getSizeCategory().isEmptyOrValid(); +// result &= row.getSexCategory().isEmptyOrValid(); +// result &= row.getMaturityCategory().isEmptyOrValid(); +// result &= row.getAgeCategory().isEmptyOrValid(); return result; } 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 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-02-07 11:20:45 UTC (rev 357) @@ -107,10 +107,4 @@ firePropertyChange(PROPERTY_WEIGHT, oldValue, weight); } - //TODO Use validator - @Override - public boolean isValid() { - return category.isValid(); - } - } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java 2013-02-07 11:20:45 UTC (rev 357) @@ -42,6 +42,11 @@ private static final long serialVersionUID = 1L; + public static final ColumnIdentifier<SplitSpeciesBatchRowModel> SELECTED = ColumnIdentifier.newId( + SplitSpeciesBatchRowModel.PROPERTY_VALID, + n_("tutti.table.species.sampleCategory.header.selected"), + n_("tutti.table.species.sampleCategory.header.selected")); + public static final ColumnIdentifier<SplitSpeciesBatchRowModel> EDITABLE_CATEGORY_VALUE = ColumnIdentifier.newId( SplitSpeciesBatchRowModel.PROPERTY_CATEGORY_VALUE, n_("tutti.table.species.sampleCategory.header.category"), 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 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css 2013-02-07 11:20:45 UTC (rev 357) @@ -51,6 +51,7 @@ #sampleCheckBox { text: "tutti.label.sampleCategoryConfiguration.sample"; selected: {model.isSample()}; + enabled: {model.getBatchWeight() != null}; } #speciesLabel { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java 2013-02-07 11:20:45 UTC (rev 357) @@ -98,8 +98,7 @@ @Override protected boolean isRowValid(SplitSpeciesBatchRowModel row) { - //TODO - return row.getCategoryValue() != null && row.getWeight() != null; + return row.isValid(); } @Override @@ -339,6 +338,11 @@ DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + { // Selection + + addBooleanColumnToModel(columnModel, SplitSpeciesBatchTableModel.SELECTED, getTable()); + } + boolean editableCategoryValue = false; if (category != null) { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java 2013-02-07 11:20:45 UTC (rev 357) @@ -24,6 +24,7 @@ * #L% */ +import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler; @@ -35,6 +36,7 @@ import javax.swing.JOptionPane; import java.awt.event.ActionEvent; +import java.util.List; /** * Handler of UI {@link EditProgramUI}. @@ -65,6 +67,16 @@ EditProgramUIModel model = new EditProgramUIModel(); + //TODO 20130206 kmorin put the programs loaded in the home screen in a + //kind of context to avoid loading the programs again + List<Program> programs = persistenceService.getAllProgram(); + List<Program> loadedPrograms = + Lists.newArrayListWithCapacity(programs.size()); + for (Program program : programs) { + loadedPrograms.add(persistenceService.getProgram(program.getId())); + } + model.setExistingPrograms(loadedPrograms); + String surveyId = context.getProgramId(); if (surveyId == null) { @@ -80,6 +92,8 @@ Program program = persistenceService.getProgram(surveyId); model.fromBean(program); + + model.getExistingPrograms().remove(program); } listModelIsModify(model); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel.java 2013-02-07 11:20:45 UTC (rev 357) @@ -27,6 +27,7 @@ import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.referential.Zone; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; +import java.util.List; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; @@ -51,6 +52,8 @@ protected String comment; protected Zone zone; + + private List<Program> existingPrograms; protected static Binder<EditProgramUIModel, Program> toBeanBinder = BinderFactory.newBinder(EditProgramUIModel.class, @@ -94,4 +97,12 @@ firePropertyChange(PROPERTY_ZONE, oldValue, zone); } + public List<Program> getExistingPrograms() { + return existingPrograms; + } + + public void setExistingPrograms(List<Program> existingPrograms) { + this.existingPrograms = existingPrograms; + } + } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-02-07 11:20:45 UTC (rev 357) @@ -159,8 +159,8 @@ allSpecies = TuttiEntities.splitById(persistenceService.getAllSpecies()); - List<String> protocolNames = persistenceService.getAllProtocolNames(); - model.setProtocolNames(protocolNames); + List<TuttiProtocol> protocols = persistenceService.getAllProtocol(); + model.setExistingProtocols(protocols); caracteristics = persistenceService.getAllCaracteristic(); allCaracteristic = TuttiEntities.splitById(caracteristics); @@ -206,7 +206,12 @@ if (mustClone != null && mustClone) { ui.setContextValue(false, MainUIHandler.CLONE_PROTOCOL); model.setId(null); + + } else { + log.debug(model.getExistingProtocols()); + model.getExistingProtocols().remove(protocol); } + } else { // create new protocol @@ -217,13 +222,6 @@ } } - String existingProtocolName = model.getName(); - if (existingProtocolName != null) { - - // remove existing protocol name from the already used list - model.getProtocolNames().remove(existingProtocolName); - } - SwingValidator validator = ui.getValidator(); listenValidatorValid(validator, model); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java 2013-02-07 11:20:45 UTC (rev 357) @@ -85,7 +85,7 @@ protected static Binder<TuttiProtocol, EditProtocolUIModel> fromBeanBinder = BinderFactory.newBinder(TuttiProtocol.class, EditProtocolUIModel.class); - private List<String> protocolNames; + private List<TuttiProtocol> existingProtocols; public EditProtocolUIModel() { super(TuttiProtocol.class, fromBeanBinder, toBeanBinder); @@ -181,18 +181,6 @@ firePropertyChange(PROPERTY_REMOVE_SPECIES_ENABLED, oldValue, removeSpeciesEnabled); } - public void setProtocolNames(List<String> protocolNames) { - this.protocolNames = protocolNames; - } - - public List<String> getProtocolNames() { - return protocolNames; - } - - public boolean isNameAlreadyUsed() { - return protocolNames.contains(getName()); - } - public boolean isImported() { return imported; } @@ -203,4 +191,12 @@ firePropertyChange(PROPERTY_IMPORTED, oldValue, imported); } + public List<TuttiProtocol> getExistingProtocols() { + return existingProtocols; + } + + public void setExistingProtocols(List<TuttiProtocol> existingProtocols) { + this.existingProtocols = existingProtocols; + } + } \ No newline at end of file Copied: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-warning-validation.xml (from rev 349, trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-error-validation.xml) =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-warning-validation.xml (rev 0) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-warning-validation.xml 2013-02-07 11:20:45 UTC (rev 357) @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%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% + --> +<!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="name"> + + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ name == null || name.equals(getGeneratedCampaignName()) ]]></param> + <message>tutti.validator.warning.cruise.name.format</message> + </field-validator> + + </field> + +</validators> Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357) @@ -41,6 +41,14 @@ tutti.validator.error.fishingOperation.stationNumber.too.long##${maxLength} </message> </field-validator> + + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingOperations</param> + <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> + <message>tutti.validator.error.fishingOperation.existingKey</message> + </field-validator> </field> @@ -51,6 +59,14 @@ tutti.validator.error.fishingOperation.fishingOperationNumber.required </message> </field-validator> + + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingOperations</param> + <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> + <message>tutti.validator.error.fishingOperation.existingKey</message> + </field-validator> </field> @@ -67,8 +83,16 @@ <field name="gearShootingStartDate"> <field-validator type="required" short-circuit="true"> - <message>tutti.validator.error.fishingOperation.date.required</message> + <message>tutti.validator.error.fishingOperation.date.start.required</message> </field-validator> + + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingOperations</param> + <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> + <message>tutti.validator.error.fishingOperation.existingKey</message> + </field-validator> </field> Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357) @@ -41,6 +41,14 @@ tutti.validator.error.fishingOperation.stationNumber.too.long##${maxLength} </message> </field-validator> + + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingOperations</param> + <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> + <message>tutti.validator.error.fishingOperation.existingKey</message> + </field-validator> </field> @@ -51,6 +59,14 @@ tutti.validator.error.fishingOperation.fishingOperationNumber.required </message> </field-validator> + + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingOperations</param> + <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> + <message>tutti.validator.error.fishingOperation.existingKey</message> + </field-validator> </field> @@ -63,13 +79,48 @@ </field-validator> </field> + + <field name='strata'> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ strata != null || subStrata != null || location != null ]]> + </param> + <message>tutti.validator.error.fishingOperation.strataLocation.required</message> + </field-validator> + </field> + + <field name='subStrata'> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ strata != null || subStrata != null || location != null ]]> + </param> + <message>tutti.validator.error.fishingOperation.strataLocation.required</message> + </field-validator> + </field> + + <field name='location'> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ strata != null || subStrata != null || location != null ]]> + </param> + <message>tutti.validator.error.fishingOperation.strataLocation.required</message> + </field-validator> + </field> <field name="gearShootingStartDate"> <field-validator type="required" short-circuit="true"> - <message>tutti.validator.error.fishingOperation.date.required</message> + <message>tutti.validator.error.fishingOperation.date.start.required</message> </field-validator> + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingOperations</param> + <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> + <message>tutti.validator.error.fishingOperation.existingKey</message> + </field-validator> + <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> <![CDATA[ gearShootingEndDate == null || gearShootingStartDate.compareTo(gearShootingEndDate) <= 0 ]]> @@ -79,7 +130,7 @@ <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> - <![CDATA[ gearShootingStartDate == null || isDateInCruise(gearShootingStartDate) ]]> + <![CDATA[ isDateInCruise(gearShootingStartDate) ]]> </param> <message>tutti.validator.error.fishingOperation.dates.startOutOfCruiseDates</message> </field-validator> @@ -88,9 +139,13 @@ <field name="gearShootingEndDate"> + <field-validator type="required" short-circuit="true"> + <message>tutti.validator.error.fishingOperation.date.end.required</message> + </field-validator> + <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> - <![CDATA[ gearShootingStartDate == null || gearShootingEndDate == null || gearShootingStartDate.compareTo(gearShootingEndDate) <= 0 ]]> + <![CDATA[ gearShootingStartDate == null || gearShootingStartDate.compareTo(gearShootingEndDate) <= 0 ]]> </param> <message>tutti.validator.error.fishingOperation.dates.endBeforeStart</message> </field-validator> @@ -113,7 +168,9 @@ <param name="expression"> <![CDATA[ !"DD".equals(coordinateEditorType.toString()) || - ( -doubles.min <= gearShootingStartLatitude && gearShootingStartLatitude <= doubles.max ) + ( gearShootingStartLatitude != null + && -doubles.min <= gearShootingStartLatitude + && gearShootingStartLatitude <= doubles.max ) ]]> </param> @@ -129,12 +186,13 @@ <param name="intParams">min:90|max:90</param> <param name="expression"> <![CDATA[ - !"DMS".equals(coordinateEditorType.toString()) || ( - ( -ints.min < getGearShootingStartLatitudeDegree() && getGearShootingStartLatitudeDegree() < ints.max ) + !"DMS".equals(coordinateEditorType.toString()) || ( + getGearShootingStartLatitudeDegree() != null && + (( -ints.min < getGearShootingStartLatitudeDegree() && getGearShootingStartLatitudeDegree() < ints.max ) || ( ( getGearShootingStartLatitudeDegree() == ints.max || getGearShootingStartLatitudeDegree() == -ints.min ) && getGearShootingStartLatitudeMinute() == 0 && getGearShootingStartLatitudeSecond() == 0 - ) + )) ) ]]> </param> @@ -152,11 +210,12 @@ <param name="expression"> <![CDATA[ !"DMD".equals(coordinateEditorType.toString()) || ( - ( -ints.min < getGearShootingStartLatitudeDecimalDegree() && getGearShootingStartLatitudeDecimalDegree() < ints.max ) + getGearShootingStartLatitudeDecimalDegree() != null && + (( -ints.min < getGearShootingStartLatitudeDecimalDegree() && getGearShootingStartLatitudeDecimalDegree() < ints.max ) || ( ( getGearShootingStartLatitudeDecimalDegree() == ints.max || getGearShootingStartLatitudeDecimalDegree() == -ints.min ) && getGearShootingStartLatitudeDecimalMinute() == 0.0 - ) + )) ) ]]> </param> @@ -174,7 +233,9 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || - ( ints.min <= getGearShootingStartLatitudeMinute() && getGearShootingStartLatitudeMinute() < ints.max ) + ( getGearShootingStartLatitudeMinute() != null + && ints.min <= getGearShootingStartLatitudeMinute() + && getGearShootingStartLatitudeMinute() < ints.max ) ]]> </param> @@ -191,7 +252,9 @@ <param name="expression"> <![CDATA[ !"DMD".equals(coordinateEditorType.toString()) || - ( doubles.min <= getGearShootingStartLatitudeDecimalMinute() && getGearShootingStartLatitudeDecimalMinute() < doubles.max ) + ( getGearShootingStartLatitudeDecimalMinute() != null + && doubles.min <= getGearShootingStartLatitudeDecimalMinute() + && getGearShootingStartLatitudeDecimalMinute() < doubles.max ) ]]> </param> <message>tutti.validator.warning.latitude.minute.outOfBounds</message> @@ -207,7 +270,9 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || - ( ints.min <= getGearShootingStartLatitudeSecond() && getGearShootingStartLatitudeSecond() < ints.max ) + ( getGearShootingStartLatitudeSecond() != null + && ints.min <= getGearShootingStartLatitudeSecond() + && getGearShootingStartLatitudeSecond() < ints.max ) ]]> </param> @@ -226,7 +291,9 @@ <param name="expression"> <![CDATA[ !"DD".equals(coordinateEditorType.toString()) || - ( -doubles.min <= gearShootingStartLongitude && gearShootingStartLongitude <= doubles.max ) + ( gearShootingStartLongitude != null + && -doubles.min <= gearShootingStartLongitude + && gearShootingStartLongitude <= doubles.max ) ]]> </param> @@ -243,11 +310,12 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || ( - (-ints.min < getGearShootingStartLongitudeDegree() && getGearShootingStartLongitudeDegree() < ints.max) + getGearShootingStartLongitudeDegree() != null && + ((-ints.min < getGearShootingStartLongitudeDegree() && getGearShootingStartLongitudeDegree() < ints.max) || ( ( getGearShootingStartLongitudeDegree() == ints.max || getGearShootingStartLongitudeDegree() == -ints.min ) && getGearShootingStartLongitudeMinute() == 0 && getGearShootingStartLongitudeSecond() == 0 - ) + )) ) ]]> </param> @@ -265,11 +333,12 @@ <param name="expression"> <![CDATA[ !"DMD".equals(coordinateEditorType.toString()) || ( - (-ints.min < getGearShootingStartLongitudeDecimalDegree() && getGearShootingStartLongitudeDecimalDegree() < ints.max) + getGearShootingStartLongitudeDecimalDegree() != null && + (( -ints.min < getGearShootingStartLongitudeDecimalDegree() && getGearShootingStartLongitudeDecimalDegree() < ints.max) || ( ( getGearShootingStartLongitudeDecimalDegree() == ints.max || getGearShootingStartLongitudeDecimalDegree() == -ints.min ) && getGearShootingStartLongitudeDecimalMinute() == 0.0 - ) + )) ) ]]> </param> @@ -287,7 +356,9 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || - ( ints.min <= getGearShootingStartLongitudeMinute() && getGearShootingStartLongitudeMinute() < ints.max ) + ( getGearShootingStartLongitudeMinute() != null + && ints.min <= getGearShootingStartLongitudeMinute() + && getGearShootingStartLongitudeMinute() < ints.max ) ]]> </param> @@ -304,7 +375,9 @@ <param name="expression"> <![CDATA[ !"DMD".equals(coordinateEditorType.toString()) || - ( doubles.min <= getGearShootingStartLongitudeDecimalMinute() && getGearShootingStartLongitudeDecimalMinute() < doubles.max ) + ( getGearShootingStartLongitudeDecimalMinute() != null + && doubles.min <= getGearShootingStartLongitudeDecimalMinute() + && getGearShootingStartLongitudeDecimalMinute() < doubles.max ) ]]> </param> <message>tutti.validator.warning.longitude.minute.outOfBounds</message> @@ -320,7 +393,9 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || - ( ints.min <= getGearShootingStartLongitudeSecond() && getGearShootingStartLongitudeSecond() < ints.max ) + ( getGearShootingStartLongitudeSecond() != null + && ints.min <= getGearShootingStartLongitudeSecond() + && getGearShootingStartLongitudeSecond() < ints.max ) ]]> </param> @@ -339,7 +414,9 @@ <param name="expression"> <![CDATA[ !"DD".equals(coordinateEditorType.toString()) || - ( -doubles.min <= gearShootingEndLatitude && gearShootingEndLatitude <= doubles.max ) + ( gearShootingEndLatitude != null + && -doubles.min <= gearShootingEndLatitude + && gearShootingEndLatitude <= doubles.max ) ]]> </param> @@ -357,11 +434,12 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || ( - (-ints.min < getGearShootingEndLatitudeDegree() && getGearShootingEndLatitudeDegree() < ints.max) + getGearShootingEndLatitudeDegree() != null && + (( -ints.min < getGearShootingEndLatitudeDegree() && getGearShootingEndLatitudeDegree() < ints.max) || ( ( getGearShootingEndLatitudeDegree() == ints.max || getGearShootingEndLatitudeDegree() == -ints.min ) && getGearShootingEndLatitudeMinute() == 0 && getGearShootingEndLatitudeSecond() == 0 - ) + )) ) ]]> </param> @@ -379,11 +457,12 @@ <param name="expression"> <![CDATA[ !"DMD".equals(coordinateEditorType.toString()) || ( - (-ints.min < getGearShootingEndLatitudeDecimalDegree() && getGearShootingEndLatitudeDecimalDegree() < ints.max) + getGearShootingEndLatitudeDecimalDegree() != null && + (( -ints.min < getGearShootingEndLatitudeDecimalDegree() && getGearShootingEndLatitudeDecimalDegree() < ints.max) || ( ( getGearShootingEndLatitudeDecimalDegree() == ints.max || getGearShootingEndLatitudeDecimalDegree() == -ints.min ) && getGearShootingEndLatitudeDecimalMinute() == 0.0 - ) + )) ) ]]> </param> @@ -401,7 +480,9 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || - ( ints.min <= getGearShootingEndLatitudeMinute() && getGearShootingEndLatitudeMinute() < ints.max ) + ( getGearShootingEndLatitudeMinute() != null + && ints.min <= getGearShootingEndLatitudeMinute() + && getGearShootingEndLatitudeMinute() < ints.max ) ]]> </param> @@ -418,7 +499,9 @@ <param name="expression"> <![CDATA[ !"DMD".equals(coordinateEditorType.toString()) || - ( doubles.min <= getGearShootingEndLatitudeDecimalMinute() && getGearShootingEndLatitudeDecimalMinute() < doubles.max ) + ( getGearShootingEndLatitudeDecimalMinute() != null + && doubles.min <= getGearShootingEndLatitudeDecimalMinute() + && getGearShootingEndLatitudeDecimalMinute() < doubles.max ) ]]> </param> <message>tutti.validator.warning.latitude.minute.outOfBounds</message> @@ -434,7 +517,9 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || - ( ints.min <= getGearShootingEndLatitudeSecond() && getGearShootingEndLatitudeSecond() < ints.max ) + ( getGearShootingEndLatitudeSecond() != null + && ints.min <= getGearShootingEndLatitudeSecond() + && getGearShootingEndLatitudeSecond() < ints.max ) ]]> </param> @@ -453,7 +538,9 @@ <param name="expression"> <![CDATA[ !"DD".equals(coordinateEditorType.toString()) || - ( -doubles.min <= gearShootingEndLongitude && gearShootingEndLongitude <= doubles.max ) + ( gearShootingEndLongitude != null + && -doubles.min <= gearShootingEndLongitude + && gearShootingEndLongitude <= doubles.max ) ]]> </param> @@ -470,11 +557,12 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || ( - (-ints.min < getGearShootingEndLongitudeDegree() && getGearShootingEndLongitudeDegree() < ints.max) + getGearShootingEndLongitudeDegree() != null && + ((-ints.min < getGearShootingEndLongitudeDegree() && getGearShootingEndLongitudeDegree() < ints.max) || ( ( getGearShootingEndLongitudeDegree() == ints.max || getGearShootingEndLongitudeDegree() == -ints.min ) && getGearShootingEndLongitudeMinute() == 0 && getGearShootingEndLongitudeSecond() == 0 - ) + )) ) ]]> </param> @@ -492,11 +580,12 @@ <param name="expression"> <![CDATA[ !"DMD".equals(coordinateEditorType.toString()) || ( - (-ints.min < getGearShootingEndLongitudeDecimalDegree() && getGearShootingEndLongitudeDecimalDegree() < ints.max) + getGearShootingEndLongitudeDecimalDegree() != null && + (( -ints.min < getGearShootingEndLongitudeDecimalDegree() && getGearShootingEndLongitudeDecimalDegree() < ints.max) || ( ( getGearShootingEndLongitudeDecimalDegree() == ints.max || getGearShootingEndLongitudeDecimalDegree() == -ints.min ) && getGearShootingEndLongitudeDecimalMinute() == 0.0 - ) + )) ) ]]> </param> @@ -514,7 +603,9 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || - ( ints.min <= getGearShootingEndLongitudeMinute() && getGearShootingEndLongitudeMinute() < ints.max ) + ( getGearShootingEndLongitudeMinute() != null + && ints.min <= getGearShootingEndLongitudeMinute() + && getGearShootingEndLongitudeMinute() < ints.max ) ]]> </param> @@ -531,7 +622,9 @@ <param name="expression"> <![CDATA[ !"DMD".equals(coordinateEditorType.toString()) || - ( doubles.min <= getGearShootingEndLongitudeDecimalMinute() && getGearShootingEndLongitudeDecimalMinute() < doubles.max ) + ( getGearShootingEndLongitudeDecimalMinute() != null + && doubles.min <= getGearShootingEndLongitudeDecimalMinute() + && getGearShootingEndLongitudeDecimalMinute() < doubles.max ) ]]> </param> <message>tutti.validator.warning.longitude.minute.outOfBounds</message> @@ -547,7 +640,9 @@ <param name="expression"> <![CDATA[ !"DMS".equals(coordinateEditorType.toString()) || - ( ints.min <= getGearShootingEndLongitudeSecond() && getGearShootingEndLongitudeSecond() < ints.max ) + ( getGearShootingEndLongitudeSecond() != null + && ints.min <= getGearShootingEndLongitudeSecond() + && getGearShootingEndLongitudeSecond() < ints.max ) ]]> </param> @@ -557,11 +652,63 @@ </field> + <field name="trawlDistance"> + + <field-validator type="required" short-circuit="true"> + <message>tutti.validator.error.fishingOperation.trawlDistance.required</message> + </field-validator> + + </field> + + <field name="fishingOperationValid"> + + <field-validator type="required" short-circuit="true"> + <message>tutti.validator.error.fishingOperation.fishingOperationValid.required</message> + </field-validator> + + </field> + + <field name="saisisseur"> + + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ saisisseur != null && !saisisseur.isEmpty() ]]> + </param> + <message>tutti.validator.error.fishingOperation.catcher.required</message> + </field-validator> + + </field> + + <field name="vessel"> + + <field-validator type="required" short-circuit="true"> + <message>tutti.validator.error.fishingOperation.vessel.required</message> + </field-validator> + + </field> + + <field name="gear"> + + <field-validator type="required" short-circuit="true"> + <message>tutti.validator.error.fishingOperation.gear.required</message> + </field-validator> + + </field> + <field name="comment"> + <field-validator type="stringlength" short-circuit="true"> <param name="maxLength">2000</param> <message>tutti.validator.error.comment.too.long##${maxLength}</message> </field-validator> + + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ fishingOperationValid == null || fishingOperationValid || (comment != null && !comment.isEmpty()) ]]> + </param> + <message>tutti.validator.error.fishingOperation.comment.required</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 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357) @@ -36,13 +36,8 @@ <field name="sampleWeight"> - <field-validator type="required" short-circuit="true"> - <message>tutti.validator.error.splitSpeciesBatch.sampleWeight.required - </message> - </field-validator> - <field-validator type="fieldexpression" short-circuit="true"> - <param name="expression"><![CDATA[ sampleWeight > 0 ]]></param> + <param name="expression"><![CDATA[ sampleWeight == null || sampleWeight > 0 ]]></param> <message> tutti.validator.error.splitSpeciesBatch.sampleWeight.invalidValue </message> @@ -50,7 +45,7 @@ <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> - <![CDATA[ sampleWeight <= batchWeight]]></param> + <![CDATA[ sampleWeight == null || sampleWeight <= batchWeight]]></param> <message> tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight </message> @@ -58,7 +53,7 @@ <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> - <![CDATA[ ( sample || batchWeight == sampleWeight ) ]]></param> + <![CDATA[ ( sampleWeight == null || sample || batchWeight == sampleWeight ) ]]></param> <message> tutti.validator.error.splitSpeciesBatch.sampleWeight.mismatchBatchWeight </message> Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357) @@ -32,6 +32,14 @@ <field-validator type="requiredstring" short-circuit="true"> <message>tutti.validator.error.program.name.required</message> </field-validator> + + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingPrograms</param> + <param name="keys">name, zone</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> + <message>tutti.validator.error.program.existingKey</message> + </field-validator> </field> @@ -40,6 +48,14 @@ <field-validator type="required" short-circuit="true"> <message>tutti.validator.error.program.zone.required</message> </field-validator> + + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingPrograms</param> + <param name="keys">name, zone</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> + <message>tutti.validator.error.program.existingKey</message> + </field-validator> </field> Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357) @@ -31,10 +31,11 @@ <message>tutti.validator.error.protocol.name.required</message> </field-validator> - <field-validator type="fieldexpression" short-circuit="true"> - <param name="expression"> - <![CDATA[ !nameAlreadyUsed ]]> - </param> + <field-validator type="collectionUniqueKey" short-circuit="true"> + <param name="collectionFieldName">existingProtocols</param> + <param name="keys">name</param> + <param name="againstMe">true</param> + <param name="nullValueSkipped">true</param> <message>tutti.validator.error.protocol.name.alreadyUsed</message> </field-validator> 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 11:16:52 UTC (rev 356) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-07 11:20:45 UTC (rev 357) @@ -29,7 +29,9 @@ tutti.action.configuration.tip=Configurer Tutti tutti.action.createSpeciesBatch=Créer un lot pour une espèce tutti.action.deleteProtocol=Supprimer +tutti.action.deleteProtocol.message=Vous êtes sur le point de supprimer le protocol %s tutti.action.deleteProtocol.tip=Supprimer le protocole sélectioné +tutti.action.deleteProtocol.title=Supprimer le protocole sélectioné tutti.action.editCatches=Saisir les captures tutti.action.editCatches.tip=Saisir des captures tutti.action.editCruise=Éditer @@ -315,6 +317,7 @@ tutti.option.ui.shortcut.closePopup.description=Fermer une popup tutti.option.ui.showNumberEditorButton.description=Afficher le pavé numérique de saisie tutti.option.update.url.description=URL de mise à jour +tutti.propety.no.species.surveyCode=\# tutti.sampleCategoryType.age=Age tutti.sampleCategoryType.maturity=Maturité tutti.sampleCategoryType.sex=Sexe @@ -393,6 +396,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.weight=Poids (kg) tutti.timeeditor.H=H tutti.title.about=À propos de Tutti @@ -453,14 +457,24 @@ tutti.validator.error.cruise.program.required=La série est obligatoire tutti.validator.error.cruise.vessel.required=Au moins un bateau doit être sélectionné tutti.validator.error.cruise.year.required=L'année est obligatoire -tutti.validator.error.fishingOperation.date.required=La date du fishingOperation est obligatoire +tutti.validator.error.fishingOperation.catcher.required=Au moins un saisisseur est obligatoire +tutti.validator.error.fishingOperation.comment.required=Le commentaire est obligatoire si le traît est invalide +tutti.validator.error.fishingOperation.date.end.required=La date de la fin du trait est obligatoire +tutti.validator.error.fishingOperation.date.start.required=La date du début du trait est obligatoire tutti.validator.error.fishingOperation.dates.endBeforeStart=La date de fin doit être après la date de début tutti.validator.error.fishingOperation.dates.endOutOfCruiseDates=La date de fin est en dehors des dates de la campagne tutti.validator.error.fishingOperation.dates.startOutOfCruiseDates=La date de début est en dehors des dates de la campagne +tutti.validator.error.fishingOperation.existingKey=La clé code station/numéro de trait/date de début existe déjà tutti.validator.error.fishingOperation.fishingOperationNumber.required=Le numéro de trait est obligatoire +tutti.validator.error.fishingOperation.fishingOperationValid.required=La validité du traît est obligatoire +tutti.validator.error.fishingOperation.gear.required=L'engin est obligatoire tutti.validator.error.fishingOperation.stationNumber.required=Le numéro de station est obligatoire tutti.validator.error.fishingOperation.stationNumber.too.long=Valeur trop longue (limitée à %s caractères) +tutti.validator.error.fishingOperation.strataLocation.required=La strate, sous-strate ou la localité doit être renseignée +tutti.validator.error.fishingOperation.trawlDistance.required=La distance est obligatoire tutti.validator.error.fishingOperation.trawlNetNumber.required=Le numéro de poche est obligatoire +tutti.validator.error.fishingOperation.vessel.required=Le navire est obligatoire +tutti.validator.error.program.existingKey=Le couple nom/zone existe déjà tutti.validator.error.program.name.required=Le nom de la série est obligatoire tutti.validator.error.program.zone.required=La zone de la série est obligatoire tutti.validator.error.protocol.name.alreadyUsed=Le nom du protocol est déjà utilisé @@ -472,6 +486,7 @@ tutti.validator.error.splitSpeciesBatch.sampleWeight.required=Pas de poids ventilé tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight=La somme des poids ventilés doit être inférieur ou égale à celle du poids du lot tutti.validator.error.splitSpeciesBatch.selectedCategory.required=La catégorie est obligatoire +tutti.validator.warning.cruise.name.format=Le format n'est pas celui ... tutti.validator.warning.latitude.degree.outOfBounds=Le degré de la latitude doit être compris entre -90 et 90 tutti.validator.warning.latitude.minute.outOfBounds=La minute de la latitude doit être comprise entre 0 et 60 tutti.validator.warning.latitude.outOfBounds=La Latitude doit être comprise entre -90.0 et 90.0
participants (1)
-
kmorin@users.forge.codelutin.com