Author: fdesbois Date: 2012-09-07 16:09:48 +0200 (Fri, 07 Sep 2012) New Revision: 556 Url: http://forge.codelutin.com/repositories/revision/sammoa/556 Log: fixes #1477 : add confirm message for deletes Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidObservationAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidRouteAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-07 14:09:48 UTC (rev 556) @@ -63,6 +63,16 @@ return Iterables.filter(observations, inRoute(route, routes, ignoreDeleted)); } + public static boolean isAnyDeletedFromRoute(Iterable<Observation> observations, + Route route, + Iterable<Route> routes) { + boolean result = FluentIterable + .from(observations) + .filter(Observations.inRoute(route, routes, false)) + .anyMatch(Validables.isDeleted()); + return result; + } + public static boolean isValid(Observation observation, BeanListValidator<Observation> validator) { return Validables.isValid(observation, validator); Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-09-07 14:09:48 UTC (rev 556) @@ -197,7 +197,7 @@ } public static Iterable<Route> filterNotDeleted(Iterable<Route> routes) { - return Iterables.filter(routes, Predicates.not(isDeleted())); + return Iterables.filter(routes, Predicates.not(Validables.isDeleted())); } public static Route findPrevious(Iterable<Route> routes, Route route) { @@ -228,10 +228,6 @@ return new IsValidPredicate(validator, obsValidator); } - public static Predicate<Route> isDeleted() { - return IS_DELETED_PREDICATE; - } - public static Comparator<Route> orderByDate() { return BY_DATE_COMPARATOR; } @@ -255,14 +251,6 @@ } }; - private static Predicate<Route> IS_DELETED_PREDICATE = new Predicate<Route>() { - - @Override - public boolean apply(Route input) { - return input.isDeleted(); - } - }; - private static Function<Route, Date> TO_DATE_FUNCTION = new Function<Route, Date>() { @Override Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java 2012-09-07 14:09:48 UTC (rev 556) @@ -81,7 +81,8 @@ if (!result) { // Check validity of routes - result = FluentIterable.from(routeValidator.getBeans()) + result = FluentIterable + .from(routeValidator.getBeans()) .filter(Routes.withTransectFlight(transectFlight)) .allMatch(Routes.isValid(routeValidator, observationValidator)); } Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java 2012-09-07 14:09:48 UTC (rev 556) @@ -38,6 +38,10 @@ // static class do not have instanciation } + public static <E extends Validable> Predicate<E> isDeleted() { + return new IsDeletedPredicate<E>(); + } + public static <E extends Validable> boolean isValid(E bean, BeanListValidator<E> validator) { return bean.isValid() || bean.isDeleted() @@ -48,6 +52,14 @@ return new IsValidPredicate<E>(validator); } + private static class IsDeletedPredicate<E extends Validable> implements Predicate<E> { + + @Override + public boolean apply(E input) { + return input.isDeleted(); + } + } + private static class IsValidPredicate<E extends Validable> implements Predicate<E> { protected BeanListValidator<E> validator; Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidAction.java 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidAction.java 2012-09-07 14:09:48 UTC (rev 556) @@ -30,6 +30,8 @@ import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.persistence.Validable; import fr.ulr.sammoa.ui.swing.SammoaUIContext; +import fr.ulr.sammoa.ui.swing.flight.FlightUI; +import fr.ulr.sammoa.ui.swing.util.SammoaUtil; import jaxx.runtime.JAXXContext; import org.nuiton.util.Resource; import org.nuiton.validator.bean.list.BeanListValidator; @@ -38,6 +40,8 @@ import java.util.Map; +import static org.nuiton.i18n.I18n._; + /** * Created: 23/08/12 * @@ -105,6 +109,21 @@ return getValidator(Observation.class); } + protected boolean askConfirmDelete(String label) { + return SammoaUtil.askQuestion( + (FlightUI) context, + _("sammoa.confirmDialog.validation.delete.message", label) + ); + } + + protected boolean askConfirmDeleteByCascade(String label, + String cascadeLabel) { + return SammoaUtil.askQuestion( + (FlightUI) context, + _("sammoa.confirmDialog.validation.deleteByCascade.message", label, cascadeLabel) + ); + } + // protected <E extends TopiaEntity & Validable> void bindValidableEntity(String propertyName, // Class<E> propertyClass) { // Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidObservationAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidObservationAction.java 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidObservationAction.java 2012-09-07 14:09:48 UTC (rev 556) @@ -50,7 +50,7 @@ public ValidObservationAction(JAXXContext context) { super(_("sammoa.action.validObservation"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validObservation.tip")); - bindModelProperties(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN + ".deleted"); + bindModelProperties(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN + "." + Observation.PROPERTY_DELETED); } @Override @@ -64,11 +64,15 @@ logger.debug("Validation for observation {}", observation.getObservationNumber()); } - Observation observationChanged = getValidationService().validateObservation(observation); + if (observation.isDeleted()) { - if (observationChanged.isDeleted()) { - getModel().removeObservation(observationChanged); + if (askConfirmDelete(_("sammoa.validable.observation"))) { + Observation observationChanged = getValidationService().validateObservation(observation); + getModel().removeObservation(observationChanged); + } + } else { + Observation observationChanged = getValidationService().validateObservation(observation); getModel().updateObservation(observationChanged); getModel().setObservationEditBean(observationChanged); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidRouteAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidRouteAction.java 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidRouteAction.java 2012-09-07 14:09:48 UTC (rev 556) @@ -24,6 +24,7 @@ */ import fr.ulr.sammoa.application.FlightService; +import fr.ulr.sammoa.persistence.Observations; import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.persistence.Routes; import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; @@ -71,27 +72,40 @@ ); } - Route routeChanged = getValidationService().validateRoute(route); + if (route.isDeleted()) { - if (routeChanged.isDeleted()) { - getModel().removeRoute(routeChanged); + if (askConfirmDelete(_("sammoa.validable.route"))) { + Route routeChanged = getValidationService().validateRoute(route); + getModel().removeRoute(routeChanged); + } + } else { - getModel().updateRoute(routeChanged); - validatorIsAdjusting = true; + boolean hasDeletedObservation = Observations.isAnyDeletedFromRoute( + getModel().getObservations(), route, getModel().getRoutes()); - getModel().setCurrentRoute(routeChanged); - getModel().setRouteEditBean(routeChanged); + if (!hasDeletedObservation + || askConfirmDeleteByCascade(_("sammoa.validable.route"), + _("sammoa.validable.observation"))) { - getModel().setObservationEditBean(null); + Route routeChanged = getValidationService().validateRoute(route); + getModel().updateRoute(routeChanged); - // Reload all observations - FlightService service = - getSammoaUIContext().getService(FlightService.class); - getModel().clearObservation(); - getModel().addAllObservation(service.getObservations(getModel().getFlight())); + validatorIsAdjusting = true; - validatorIsAdjusting = false; + getModel().setCurrentRoute(routeChanged); + getModel().setRouteEditBean(routeChanged); + + getModel().setObservationEditBean(null); + + // Reload all observations + FlightService service = + getSammoaUIContext().getService(FlightService.class); + getModel().clearObservation(); + getModel().addAllObservation(service.getObservations(getModel().getFlight())); + + validatorIsAdjusting = false; + } } } } @@ -106,4 +120,25 @@ } return result; } + + protected void doValid(Route route) { + + Route routeChanged = getValidationService().validateRoute(route); + getModel().updateRoute(routeChanged); + + validatorIsAdjusting = true; + + getModel().setCurrentRoute(routeChanged); + getModel().setRouteEditBean(routeChanged); + + getModel().setObservationEditBean(null); + + // Reload all observations + FlightService service = + getSammoaUIContext().getService(FlightService.class); + getModel().clearObservation(); + getModel().addAllObservation(service.getObservations(getModel().getFlight())); + + validatorIsAdjusting = false; + } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java 2012-09-07 14:09:48 UTC (rev 556) @@ -23,10 +23,14 @@ * #L% */ +import com.google.common.collect.FluentIterable; import fr.ulr.sammoa.application.FlightService; +import fr.ulr.sammoa.persistence.Observations; import fr.ulr.sammoa.persistence.Route; +import fr.ulr.sammoa.persistence.Routes; import fr.ulr.sammoa.persistence.TransectFlight; import fr.ulr.sammoa.persistence.TransectFlights; +import fr.ulr.sammoa.persistence.Validables; import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import fr.ulr.sammoa.ui.swing.flight.TransectFlightModel; import jaxx.runtime.JAXXContext; @@ -78,40 +82,67 @@ ); } - TransectFlight transectFlightChanged = + if (transectFlight.isDeleted()) { + + if (askConfirmDelete(_("sammoa.validable.transect"))) { getValidationService().validateTransectFlight(getModel().getFlight(), transectFlight); + getModel().removeTransectFlight(index); + } - if (transectFlightChanged == null) { - getModel().removeTransectFlight(index); - } else { - getModel().updateTransectFlight(transectFlightChanged); - validatorIsAdjusting = true; + // Get routes for this transectFlight + FluentIterable<Route> routes = FluentIterable + .from(getModel().getRoutes()) + .filter(Routes.withTransectFlight(transectFlight)); - Route routeEditBean = getModel().getRouteEditBean(); + boolean hasDeletedRoute = routes.anyMatch(Validables.isDeleted()); - getModel().setRouteEditBean(null); + if (!hasDeletedRoute + || askConfirmDeleteByCascade(_("sammoa.validable.transect"), + _("sammoa.validable.route"))) { - // Reload all routes - FlightService service = - getSammoaUIContext().getService(FlightService.class); - getModel().clearRoute(); - getModel().addAllRoute(service.getRoutes(getModel().getFlight())); + boolean hasDeletedObservation = false; + for (Route route : routes) { + hasDeletedObservation |= Observations.isAnyDeletedFromRoute( + getModel().getObservations(), route, routes); + } - // Keep the route selected - if (routeEditBean != null && !routeEditBean.isDeleted()) { - getModel().setCurrentRoute(routeEditBean); - getModel().setRouteEditBean(routeEditBean); - } + if (!hasDeletedObservation + || askConfirmDeleteByCascade(_("sammoa.validable.transect"), + _("sammoa.validable.observation"))) { - getModel().setObservationEditBean(null); + TransectFlight transectFlightChanged = + getValidationService().validateTransectFlight(getModel().getFlight(), transectFlight); + getModel().updateTransectFlight(transectFlightChanged); - // Reload all observations - getModel().clearObservation(); - getModel().addAllObservation(service.getObservations(getModel().getFlight())); + validatorIsAdjusting = true; - validatorIsAdjusting = false; + Route routeEditBean = getModel().getRouteEditBean(); + + getModel().setRouteEditBean(null); + + // Reload all routes + FlightService service = + getSammoaUIContext().getService(FlightService.class); + getModel().clearRoute(); + getModel().addAllRoute(service.getRoutes(getModel().getFlight())); + + // Keep the route selected + if (routeEditBean != null && !routeEditBean.isDeleted()) { + getModel().setCurrentRoute(routeEditBean); + getModel().setRouteEditBean(routeEditBean); + } + + getModel().setObservationEditBean(null); + + // Reload all observations + getModel().clearObservation(); + getModel().addAllObservation(service.getObservations(getModel().getFlight())); + + validatorIsAdjusting = false; + } + } } } } Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties =================================================================== --- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-07 12:51:11 UTC (rev 555) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-07 14:09:48 UTC (rev 556) @@ -69,10 +69,12 @@ sammoa.config.category.other.description=Other sammoa.config.category.shortcuts=Shortcuts sammoa.config.category.shortcuts.description=List of all the shortcuts -sammoa.confirmDialog.deleteTransect.message=The flight is not started, do you want to definetely delete this flight's transect ? +sammoa.confirmDialog.deleteTransect.message=The flight is not started, do you want to definitely delete this flight's transect ? sammoa.confirmDialog.flightInProgress.message.exit=A flight is in progress, are you sure you want to quit ? sammoa.confirmDialog.flightInProgress.message.showHome=A flight is in progress, are you sure you want to go back to the home screen ? sammoa.confirmDialog.flightInProgress.title=Flight in progress +sammoa.confirmDialog.validation.delete.message=Are you sure you want to definitely delete this %s ? +sammoa.confirmDialog.validation.deleteByCascade.message=This %1$s contains some deleted %2$ss, do you want to continue ? This will definitely delete %2$s marked as deleted. sammoa.datePattern=dd/MM/yyyy sammoa.dateTimePattern=dd/MM/yyyy HH\:mm\:ss sammoa.dialog.title.importSammoaFile=Choose sammoa file to import @@ -261,6 +263,9 @@ sammoa.title.flight=System %1$s - Campaign %2$s - Region %3$s - Flight n°%4$d sammoa.title.home=Home sammoa.title.importApplication=Application import +sammoa.validable.observation=sighting +sammoa.validable.route=route +sammoa.validable.transect=transect sammoa.validator.campaign.beginDate.required=The begin date must be defined sammoa.validator.campaign.code.required=The campaign code must be defined sammoa.validator.campaign.endDate.anterior=The end date can't be anterior to the begin date
participants (1)
-
fdesbois@users.forge.codelutin.com