r504 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map sammoa-persistence sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-persistence/src/main/xmi sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swi
Author: fdesbois Date: 2012-09-01 11:51:22 +0200 (Sat, 01 Sep 2012) New Revision: 504 Url: http://forge.codelutin.com/repositories/revision/sammoa/504 Log: fixes #1417 : - improve validations - add validation for transect - disable delete for the moment Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java trunk/sammoa-persistence/pom.xml trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java 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/xmi/sammoa.zargo trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.jaxx trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectTableModel.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DeletedRowHighlightPredicate.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ValidRowHighlightPredicate.java trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-09-01 09:51:22 UTC (rev 504) @@ -24,7 +24,6 @@ */ import fr.ulr.sammoa.persistence.Flight; -import fr.ulr.sammoa.persistence.FlightDAO; import fr.ulr.sammoa.persistence.Observation; import fr.ulr.sammoa.persistence.ObservationDAO; import fr.ulr.sammoa.persistence.Observations; @@ -47,46 +46,47 @@ */ public class ValidationService extends SammoaServiceSupport { - public void validateTransect(Flight flight, - TransectFlight transectFlight) { + public TransectFlight validateTransectFlight(Flight flight, + TransectFlight transectFlight) { TopiaContext tx = beginTransaction(); try { TransectFlightDAO transectFlightDAO = SammoaDAOHelper.getTransectFlightDAO(tx); - TransectFlight transectFlightExists = transectFlightDAO.findByTopiaId(transectFlight.getTopiaId()); + TransectFlight result = transectFlightDAO.findByTopiaId(transectFlight.getTopiaId()); boolean valid = !transectFlight.isValid(); - if (transectFlightExists.isDeleted()) { + if (transectFlight.isDeleted()) { - ObserverPositionDAO observerPositionDAO = SammoaDAOHelper.getObserverPositionDAO(tx); - observerPositionDAO.deleteAll(transectFlightExists.getObserverPosition()); +// ObserverPositionDAO observerPositionDAO = SammoaDAOHelper.getObserverPositionDAO(tx); +// observerPositionDAO.deleteAll(transectFlightExists.getObserverPosition()); +// +// FlightDAO flightDAO = SammoaDAOHelper.getFlightDAO(tx); +// Flight flightExists = flightDAO.findByTopiaId(flight.getTopiaId()); +// +// flightExists.removeTransectFlight(transectFlightExists); +// +// // XXX-fdesbois-2012-08-23 : maybe useless with cascade on delete ? +// transectFlightDAO.delete(transectFlightExists); - FlightDAO flightDAO = SammoaDAOHelper.getFlightDAO(tx); - Flight flightExists = flightDAO.findByTopiaId(flight.getTopiaId()); - - flightExists.removeTransectFlight(transectFlightExists); - - // XXX-fdesbois-2012-08-23 : maybe useless with cascade on delete ? - transectFlightDAO.delete(transectFlightExists); - } else { RouteDAO routeDAO = SammoaDAOHelper.getRouteDAO(tx); - List<Route> routes = routeDAO.findAllByTransectFlight(transectFlightExists); + List<Route> routes = routeDAO.findAllByTransectFlight(result); for (Route route : routes) { validateRoute(tx, route, valid); } - transectFlightExists.setValid(valid); - transectFlightDAO.update(transectFlightExists); + result.setValid(valid); + transectFlightDAO.update(result); } tx.commitTransaction(); transectFlight.setValid(valid); + return result; } catch (TopiaException ex) { throw new TopiaRuntimeException(ex); @@ -95,21 +95,22 @@ } } - public void validateRoute(Route route) { + public Route validateRoute(Route route) { TopiaContext tx = beginTransaction(); try { RouteDAO routeDAO = SammoaDAOHelper.getRouteDAO(tx); - Route routeExists = routeDAO.findByTopiaId(route.getTopiaId()); + Route result = routeDAO.findByTopiaId(route.getTopiaId()); boolean valid = !route.isValid(); - validateRoute(tx, routeExists, valid); + validateRoute(tx, result, valid); tx.commitTransaction(); route.setValid(valid); + return result; } catch (TopiaException ex) { throw new TopiaRuntimeException(ex); @@ -118,22 +119,23 @@ } } - public void validateObservation(Observation observation) { + public Observation validateObservation(Observation observation) { TopiaContext tx = beginTransaction(); try { ObservationDAO dao = SammoaDAOHelper.getObservationDAO(tx); - Observation observationExists = + Observation result = dao.findByTopiaId(observation.getTopiaId()); boolean valid = !observation.isValid(); - validateObservation(tx, observationExists, valid); + validateObservation(tx, result, valid); tx.commitTransaction(); observation.setValid(valid); + return result; } catch (TopiaException ex) { throw new TopiaRuntimeException(ex); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-09-01 09:51:22 UTC (rev 504) @@ -238,9 +238,9 @@ effortGroup = null; } - boolean routeIsValid = Routes.isRouteAccepted(route, - routeTypes, - strates); + boolean routeIsValid = Routes.isAccepted(route, + routeTypes, + strates); if (routeIsValid) { @@ -475,7 +475,7 @@ routeObservations.size()} ); } - if (!Routes.isRouteAccepted(route, routeTypes, strates)) { + if (!Routes.isAccepted(route, routeTypes, strates)) { // not selected route continue; Modified: trunk/sammoa-persistence/pom.xml =================================================================== --- trunk/sammoa-persistence/pom.xml 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-persistence/pom.xml 2012-09-01 09:51:22 UTC (rev 504) @@ -47,6 +47,11 @@ </dependency> <dependency> + <groupId>org.nuiton</groupId> + <artifactId>nuiton-validator</artifactId> + </dependency> + + <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency> Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/AutoSaveListener.java 2012-09-01 09:51:22 UTC (rev 504) @@ -133,6 +133,11 @@ public synchronized void stop() { stop = true; commit(); + if (logger.isWarnEnabled() && !changedEntities.isEmpty() || !createdEntities.isEmpty()) { + logger.warn("Some entities are removed from autoSave but unsaved, check log for errors"); + } + changedEntities.clear(); + createdEntities.clear(); } protected class AutoCommit extends TimerTask { 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-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-09-01 09:51:22 UTC (rev 504) @@ -30,6 +30,7 @@ import com.google.common.collect.Iterables; import org.apache.commons.collections.CollectionUtils; import org.joda.time.Interval; +import org.nuiton.validator.bean.list.BeanListValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,6 +63,11 @@ return Iterables.filter(observations, inRoute(route, routes, ignoreDeleted)); } + public static boolean isValid(Observation observation, + BeanListValidator<Observation> validator) { + return Validables.isValid(observation, validator); + } + public static boolean inRoute(Observation observation, Route route, Iterable<Route> routes, @@ -104,26 +110,6 @@ return new InRoutePredicate(route, routes, ignoreDeleted); } -// public static boolean inDateInterval(Observation observation, Interval interval) { -// -// boolean result = Dates.inInterval(observation.getObservationTime(), interval); -// -//// Date thruDate = periodDate.getThruDate(); -//// -//// boolean result; -//// if (thruDate == null) { -//// result = periodDate.afterBegin(observation.getObservationTime()); -//// } else { -//// result = periodDate.between(observation.getObservationTime()) -//// && !thruDate.equals(observation.getObservationTime()); -//// } -// return result; -// } - - public static Predicate<Observation> inDateInterval(Interval interval) { - return new InDateIntervalPredicate(interval); - } - public static void removeOtherSpecies(List<Observation> observations, List<Species> species) { if (CollectionUtils.isNotEmpty(species)) { @@ -176,6 +162,14 @@ return result; } + public static Predicate<Observation> inDateInterval(Interval interval) { + return new InDateIntervalPredicate(interval); + } + + public static Predicate<Observation> isValid(BeanListValidator<Observation> validator) { + return new IsValidPredicate(validator); + } + private static Function<Observation, Date> TO_DATE_FUNCTION = new Function<Observation, Date>() { @Override @@ -223,4 +217,19 @@ } } + private static class IsValidPredicate implements Predicate<Observation> { + + protected BeanListValidator<Observation> validator; + + public IsValidPredicate(BeanListValidator<Observation> validator) { + Preconditions.checkNotNull(validator); + this.validator = validator; + } + + @Override + public boolean apply(Observation input) { + return isValid(input, 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-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-09-01 09:51:22 UTC (rev 504) @@ -29,11 +29,13 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ComparisonChain; +import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; import com.google.common.collect.Ordering; import com.google.common.collect.Sets; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.builder.ToStringBuilder; +import org.nuiton.validator.bean.list.BeanListValidator; import java.util.Comparator; import java.util.Date; @@ -71,9 +73,9 @@ return result; } - public static boolean isRouteAccepted(Route route, - List<RouteType> routeTypes, - List<Strate> strates) { + public static boolean isAccepted(Route route, + List<RouteType> routeTypes, + List<Strate> strates) { boolean result = false; if (CollectionUtils.isEmpty(routeTypes) || @@ -91,8 +93,45 @@ return result; } + public static boolean isValid(Route route, + BeanListValidator<Route> routeValidator, + BeanListValidator<Observation> observationValidator) { + + boolean result; + if (route.isDeleted()) { + result = true; + + } else { + + Set<Route> routes = routeValidator.getBeans(); + + result = Validables.isValid(route, routeValidator) + && !Routes.equal(route, Routes.findPrevious(routes, route)); + + if (result) { + + // Check validity of observations + result = FluentIterable + .from(observationValidator.getBeans()) + .filter(Observations.inRoute(route, routes, true)) + .allMatch(Observations.isValid(observationValidator)); + } + } + return result; + } + public static boolean equal(Route o1, Route o2) { + if (o1 == null && o2 != null) { + return false; + } + if (o2 == null && o1 != null) { + return false; + } + if (o1 == null) { + return true; + } + boolean result = Objects.equal(o1.getRouteType(), o2.getRouteType()); // We assume that time equality for a same routeType is an equivalence @@ -165,18 +204,22 @@ Observation observation, boolean ignoreDeleted) { - return Iterables.find(routes, new WithObservationPredicate(observation, routes, ignoreDeleted), null); + return Iterables.find(routes, withObservation(routes, observation, ignoreDeleted)); } -// public static Date getMiddleTime(Route previousRoute, Route nextRoute) { -// Date previousTime = previousRoute.getBeginTime(); -// Date nextTime = nextRoute.getBeginTime(); -// -// long diff = nextTime.getTime() - previousTime.getTime(); -// Date result = new Date(nextTime.getTime() - diff / 2); -// return result; -// } + public static boolean withTransectFlight(Route route, TransectFlight transectFlight) { + return transectFlight.equals(route.getTransectFlight()); + } + public static Predicate<Route> withTransectFlight(TransectFlight transectFlight) { + return new WithTransectFlightPredicate(transectFlight); + } + + public static Predicate<Route> isValid(BeanListValidator<Route> validator, + BeanListValidator<Observation> obsValidator) { + return new IsValidPredicate(validator, obsValidator); + } + public static Predicate<Route> isDeleted() { return IS_DELETED_PREDICATE; } @@ -185,6 +228,12 @@ return BY_DATE_COMPARATOR; } + public static Predicate<Route> withObservation(Iterable<Route> routes, + Observation observation, + boolean ignoreDeleted) { + return new WithObservationPredicate(observation, routes, ignoreDeleted); + } + private static Comparator<Route> BY_DATE_COMPARATOR = new Comparator<Route>() { @Override @@ -238,6 +287,41 @@ } } + private static class WithTransectFlightPredicate implements Predicate<Route> { + + protected TransectFlight transectFlight; + + public WithTransectFlightPredicate(TransectFlight transectFlight) { + Preconditions.checkNotNull(transectFlight); + this.transectFlight = transectFlight; + } + + @Override + public boolean apply(Route input) { + return withTransectFlight(input, transectFlight); + } + } + + private static class IsValidPredicate implements Predicate<Route> { + + protected BeanListValidator<Route> validator; + + protected BeanListValidator<Observation> obsValidator; + + private IsValidPredicate(BeanListValidator<Route> validator, + BeanListValidator<Observation> obsValidator) { + Preconditions.checkNotNull(validator); + Preconditions.checkNotNull(obsValidator); + this.validator = validator; + this.obsValidator = obsValidator; + } + + @Override + public boolean apply(Route input) { + return isValid(input, validator, obsValidator); + } + } + private static <T> T getNext(Iterable<T> elements, final T element, final Comparator<T> comparator) { 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-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlights.java 2012-09-01 09:51:22 UTC (rev 504) @@ -26,7 +26,9 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.FluentIterable; import com.google.common.collect.Sets; +import org.nuiton.validator.bean.list.BeanListValidator; import java.util.Set; @@ -51,6 +53,22 @@ return result; } + public static boolean isValid(TransectFlight transectFlight, + BeanListValidator<Route> routeValidator, + BeanListValidator<Observation> observationValidator) { + + boolean result = transectFlight.isValid() || transectFlight.isDeleted(); + + if (!result) { + + // Check validity of routes + result = FluentIterable.from(routeValidator.getBeans()) + .filter(Routes.withTransectFlight(transectFlight)) + .allMatch(Routes.isValid(routeValidator, observationValidator)); + } + return result; + } + public static Predicate<TransectFlight> isNotDeleted() { return Predicates.not(isDeleted()); } Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java (rev 0) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java 2012-09-01 09:51:22 UTC (rev 504) @@ -0,0 +1,41 @@ +package fr.ulr.sammoa.persistence; + +import com.google.common.base.Predicate; +import org.nuiton.validator.bean.list.BeanListValidator; + +/** + * Created: 31/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public final class Validables { + + private Validables() { + // static class do not have instanciation + } + + public static <E extends Validable> boolean isValid(E bean, BeanListValidator<E> validator) { + return bean.isValid() + || bean.isDeleted() + || validator.getContext(bean).isValid(); + } + + public static <E extends Validable> Predicate<E> isValid(BeanListValidator<E> validator) { + return new IsValidPredicate<E>(validator); + } + + private static class IsValidPredicate<E extends Validable> implements Predicate<E> { + + protected BeanListValidator<E> validator; + + private IsValidPredicate(BeanListValidator<E> validator) { + this.validator = validator; + } + + @Override + public boolean apply(E input) { + return isValid(input, validator); + } + } + +} Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Validables.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-persistence/src/main/xmi/sammoa.zargo =================================================================== --- trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-09-01 09:51:22 UTC (rev 504) @@ -1,9 +1,7 @@ -PKhiAsammoa.argo�TK��0�ﯰr��l�B��.�bϕO���8��zƱ�8}����JQ5��y�̔\7��@T�*{�Uw��Bծ��rK�G�ζJ����,#e��(Ot�#T���weq�'���)c�(��+ +PK(�Asammoa.argo�TK��0�ﯰr��l�B��.�bϕO���8��zƱ�8}����JQ5��y�̔\7��@T�*{�Uw��Bծ��rK�G�ζJ����,#e��(Ot�#T���weq�'���)c�(��+ X�}c��^N�q�������)��V�7J _���\(�9��@�PJ�= ����j�V�����N���%�C�H�N��I����L<�'9�h���R���Vh��I�Ijì�`O���A4��^�I��*p�����G[N�i�P�= -�V�Ch��(`�5��18��!F��NݹU�'��nP5eq&��/�����<��-�����휈3F��@ o4�|T���jIm�&o�g&���v�e���*�����LJ��OO+FM݆4F -�2j�-J�☆��y��E�uT�Ge�y��g��}䞽~nh:�B�ӝ�7�_���3 -V��M�w��d����o�zm�j�4�s�%�Ts�m�����}I�gi�q{�qi�����Xҳ��^[7L��2���ճ-��wc�UY%�]<�q��d�h�����G<1�hx����7PK��DH�PKhiAsammoa_Diagrammedeclasses.pgml�]m��6���_�*{B� &����s�c����m��R�k�����[���w�;��H��lR�D��nR�D���F���t����q6�.��h���p� +�V�Ch��(`�5��18��!F��NݹU�'��nP5eq&��/�����<��-�����휈3F��@ o4�|T���jIm�Q��j��tFh`��ہۖ�����ӷ�~�?=e�5t�7X�g�ʨ �(!��~��Uf(��Q���繟����{�������O�" �I~y"^�(XeJ7�߂����"��/굡~��Ӑ;�i�<�S1�U�!�k���%q#��]`���ǥ��Z��cI��zmQ�0��|Hr�W϶��ލ-oTe�P/t�HǑ*����c��?��(��z���PK/UgH�PK(�Asammoa_Diagrammedeclasses.pgml�]m��6���_�*{B� &����s�c����m��R�k�����[���w�;��H��lR�D��nR�D���F���t����q6�.��h���p� ��(O����rw��=����^�������}�<=�>�����σg�.ƫ�3~E��8\�ӧU�h�p1\<Dk~Q��x:|X/���j:�m�Z�G��"�XO/~����l�\^o���������sB�y��\/&s���q���<��A��W϶�z��������w��5/��i{������X�)�~�=��9��S��#��O��N���Y�j2�-���pF�oO�_������p1�����B�����j��ޯW��u:�/�p��[���!��l�"�y͢ūg�q�����g>���P�a������p�{�����O����*���{鏛��h5�?�B�\����W�8��?}�/w��?����uw�| �_V|�(��2���i�3On0�~;�U��J8���Sm�H8A�j�v��=�#6}?��d�̢��w��p6�z������h6V������3���z��N���f9]�s.��_�-��%�/����B�.ˋ�Q��ܬ����Z�?�/J�,J/��?��O�����U��L/�ཽ�^"/(mImU���%K�&�&)���w���fn�x��~�NU]k�ٚ����?� �Y��Uh^��+��_f�����շ�<�?����}�4_��T�u�L�����L�Z���֔��\.�-�*z|.V�����������*����.J�a��/�UXs=�kR�]��`�h�vyNV�n���0�����AT)F�q ����.�{�V_8��њJwK��b��ip��o8�q��Kg�� x��]�� @@ -93,85 +91,83 @@ K�n�Z�߶K�nĚ���䘘F�}��ie������ #�O�c�G�!2 �3H�σ��� ͵G�Y皣�b֤� TjH��9�9��*5�c����4P���us�� -Tj�y��7G;�@�"���Ѣ�)�j_�����}�cd�N��#���8{���PK+����*֡PKhiA&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PKhiAsammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)�1/]өחӤ�VݺI�4�(qRn$D@��t����@Jwi�N�8���<��1��1��;F^0髠�� -����������KUޜ��r�����Յ2�/|����⽢��� ��Frc@"7��q�Z�zN8 -f��x�(tƽ(vb��;�Ù�Bқy�O�ߝ�N�����y�����0d{hX�G��iG����)�g�I_M��-�e��H��� �u< -��4�x鍴��M��$&|EP�W2�����oS'���EލO�CǏ��(&! �)�����:���a�4*Vt�8�nf1)���� -ɐ����uzj�=ߧ����¾z��$�A-���$�|�;�wv�$�}< -�;'&��a�r^7v�ps��g�G_���]=�+ddW�� ���t���[�n㾪���dW�Y�U�F)�ajIL~�|�A�à�a��a�:��V����ʺZU>&q��2/v|�����e�7�?(�6#�_6b0+�g���s�99gdB]|~�䯀:��!�Z:�e�zy;ʊΉ��s������I���}�߸�;aE���y�����:I���I٩����UtȲKV9��-W&�\or����y��Xf -�@Gf��7���j�jX�����F�+����쇖z�ë��? -OqH�@l�D�c�<4�#�<�j�8�(wl5�|jZ>C�u�Eo[N��,O�0ӱ�J����s�,uc�M�їE��2wnZ2���QDs3�V��}�S�k�0L�D��e��hGŇ|��BE3�*T踂 -]� -��%�Z�ׅ��4�nK���K95(i�f ����%(J(T诠�tS��O��>�D$�K�4�(Н�B�����d���2 -�2 --.��Εɠ�����Z�"�ډ(PQ� -�X��"�[C=MX��n��J�VI(\*�K(P�P�.+(���^&:UPl��6�.f��2�an&����a\E�D`4Ȩ���x�M#�Q����]������֪����Et�JG������,����E���¦Y谠����Ϯ��Cgщ����Mb -v&��4dj -/?�j��j - -j���z!�%;����joƋ�j��`AO�"�(�P^"��nEPIY�Ƭ��ST�U� -q{��a��� -U -=�3)��3�������P�h�3)˒�1�Њ�So�*6t\�H7p�N�r��t����퓚�z5�N��0O�u�j�DN��^�s9�*�J>�CǴ,N��{��)T<���a,t�;����s�ء��$�Pw�R1�X���˖�6�H.��x,��0�-�S!��s��f촐��Bų�b<����7�m��!����&瞄�L� ��p";�9�*U���}Y8Y�7o����y0�d'�_S�h��O�IM i�j/�\'�qC��qY�.6���gi�`��*c���UԼ���mk�ߣe��Cq�[�������9bJ�z��h1��g�?�[M� -�|E�}K۽�6����y�6iϮ�$۲��� ;�N�D2ʫ��L��p�5V���]بsN\��j/�!5�wJ/�7����&�2�ǻqpG�E6h �gQ\x��IZ�A �����%l���mhc[kɶ�H���m4P�!���l� -�Z����Ͷ!�pclÖl�G�m�2ۂ_.>bې�m�P&�4�����k�m�����7���6X�͐5�mH�0�Yz)#?Ba/v9�l����f��v�����D`��殤�?�f��������m(;y%C�.n<�'�̊�۹���5�H�����5�%�:n�^��#2F��DbD~���q����4�t�N�D|w��!F� Uq���)&�ۚ�� �d!\�{�@��d���dtC��l�"�W�fm���>�o:�Ѻ�����e�%���I���:)2&�֒Ѷl�m�톣�F�k��Vd��e�ϖ� -��Rdta_�m[v�k������\����po�ܺ!��wm�{E����t/?�\�nkE��&;�5�:�1D��M�Fc�d�PKe����VPKhiAsammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|�� +Tj�y��7G;�@�"����ƷL�T��>ɱ/]��r�}ɿzx�����PK:�&s�*ѡPK)�A&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PK)�Asammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)6�������i�v�nݤi�N�ʍ�����$�@RJ[��6U1�����>�'&�on��tE��gC +Y�3'��3o(�8�3e��h���_�O��7|������$���Md��\��؉�9KZ#o`G^��J�5�m/������w��Y�p�"���?����q`��ɲ�{���=]�H�Mt�T�Z�n�6:�3E9P�yGJ��=�Cy�֔B�$��Nc �;#�u�E�b��x�{Jzk{��Ą�*Vv%U�w%�Ю����6�����8�C�b�:f4�!����>�*��9�l��q���X���ʳ�^Fԅ������̬�h�p�A +��K���X~���˒U�q`;���Qr�p�W6������,��g^@sc1�F�f(�7ӳ[8S���ڟ�ˡ>NK.��]����iIɮ:��������%�ް|�Q�è�a��a�:��V�����ÒĻZU�3�h$���gv�;C9 ��p�Ro3����i�?������K��������p�߶r`Y~��iK .�1�Q�oć���b�J���k����0NUC�0Z�U��n嬴S�<ȽW1 �!Y��D�2��z�+,����Ʋ��ud���f��Zi5Z�T[����*`��J}v�ʃ3xD���pԐ��D*&b#S�����Rs���y�૭�$]�����l���r��.�eS�q8����/��ܾ���2K�Ϻ�8ڦ�c�d��KnXҀ��^���h����٬ +R� +��J��H_U��SŇl����fU�T�DP�F*T�)=E��RL����R�Ҭ3�u�O�B%�jF(M$�GF(TD(��_��4C��ONP�1���+M���(5�(���rr�9F!���i~h��>P)��/��P ������E�o�z��R�nҍ�P%�V!�*F�G(TB��&�U&(L�پ'�蔠��K,.�Ћ2277+�&Na�T)�G�h����t�"��r��{Qd�h�`�Ԙ�.v'�R�'���[�8 +8 +��R���E�H�(tX )q���Ed�b賀��S�3��aHi�lޔj#���h*�� Bz�)��jo�O��)\�RF�J�Jz�x�OT=�,u>�&㔁J�jQ��5}0��@�@U���({R�I����(�,U��n�'e�=EL�Y�>0���b��Я*6�,��������}ZS\OS�h�ŔG��QGA�jWE��S�RK�RY�ȳ�4�,!M��LSj��>���2M��gWυ�>C�B� ������V�#�m�6z�9H�O��:_˪��H�O��5�Y���NL�XJ-�M��1Q���-kV�j[l��̝��Z�t�5/�t">�W�!xg;>�CJ��DېN�6�qvϞ<���.˒�'����I�dP��I��q��������9�����Z�oG6ko���1��vx�.8�|���"r�y1�c�K@`�_�Q��>(�3�������_�f�Õw8�ATM!μ�W�|$_"[Vmp�9���=�)�g��wޮM���G� +�o.��Ѩ���d���&��S>h�Ӌ�Ƚ���0WG�G]0}p�p�yܶd����,�M�+�B��4��]}М���X��m��� +�&=���i��6����s���Fm#M�F۰��Nۤ��Ʀ`n��s|��~gm�=���i��6���������V�V�6�Զ�wm���ңI��w�6y�`��?PKɟ���FAPK)�Asammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|�� ���,���\�l�v� -l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPKhiAsammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���> +l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPK)�Asammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���> �z& Q}�0� -�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PKhiA -sammoa.xmi�]ݖ�8r�ߧ���cϜl�%��${�s��N'�w���jD�j�)RCR=�^�5r��L����IP�Z�@�(�G��%d�P��P(T}��癫<� t|O����h>W�g���M�?��\u�+?����{{�|�9�Ts�9����?�}C��ißM���f8�#7ȏϕ�!#4��vŖ�_L����/Z���2��+j��>�E��k<`d�����>[���a/B���Z��?�� "m��ԧ�|��;���#/T(� -�d���m���:՛u˟��_5m�[�;%��NH�'w��E�%�y�l]�Z���P�/Z��O仦��[���B����;S������>~��'�k��0�oaWI���oȻ~�9.���о�~��ӊ� ?Mߋ�}W�$]_�]�α�!U;W�+�*WWF��KƦm��mtۨ���l6_47���?_�D�r�f3=W��n�M�v��U�O6rCL���Q�7�O_����I��h�%���R���ak���� -���~{�{�����*�w�����rۡ�uq���C������? q�w����|�����7�n ��40^響��p���}�~��u��k1:R�N���ܷ|���;����;-��Sda���2C怜�0� -���]8s4Ŋ,GA��@ М��� -���(�`�e����� ;�/)_��%������_G��s{d�<�A��0e�߿���S����7��Ϧ�K���Wl�dH�SLҀ�����ye9�^�)��ȭW��?������=�E��p@�hď���t�d) C���C�AL�?��l�K�lK�L4ߣ3%R�]��r��H�_��N��p+�����b��b�,9��G�U,j����r�%�ܯ��H��tx �� �����0���.қ̯�^s��b> �l���ED��K���������b:�_������6�� �/e�w1]b>�?����l|�8��-�!> o�POe��p���I��F2��?,�.���^�<Q�z��^~$,��?�NĂ�~2s�T��(��S��R�"@Dd��wȟ.1�1 j�E8l(���[�V���̍f�i�Y�T�c���'w��O��vH�B�>�t N��Z(���F �L�8���m�F�C�4-U렞�"l4�ʍj?e^!Ť�d9� �7�П�cD~'���ꢼ���!w����C�Zs�-5����x`�X�C��$�d~���^�=��&��۳Z�n�֙���u��7h��:�1�K�0�SLfM����ꎻ�[�߾�ݺ��#��`Iϑz'��,y�$awd�a��'����zӆK���n���ͲᱬlS�ɞ��a���O��\���!��w㿖���������m���=Ӧ0���Y6&F���~��2��U��%���f�D�~���V�`!?VC�8hؘ�O�3F�E�C�}�Z�R���z=��8��N�����F�ÿ�=W�Й8d�b�?_L\��1�"ypg���6d -!�V�2c�=�<��%��P0���}v��b�],L�6��,�ט-�șr��Y��F�cY:`��|T#�/�՜��#m,�L�L.����T魟+��<��A+�e^j�5s,����̳ȡF(B������h�������� -?�^����%�5���][�F�����GD�A��ض�l�e���e��\g#�~�8�M!.p|����u������~��#����w����ܗ�Vu?�o_�s9�m�6Ey���%��l6�\����UJ��&�b��t�/l�ֿ� -��_�u����$���u)�4.e���dM���{�s���#i��3�7��<>���KA(way����2����.����q��?s���0�M'� ���I��i.>�7^��'y��}gV�g���Ů�?� ��[�oz9�����qh: -�t}S��8� -�K$s՛fZc���,��hۓ��t�M��3�e)c�8��0W�GJ Y�[Hr�����Xߘ�H�V�1ۣ�s�N�Lճ���x��l�m<d.Ahc}��Z�jR���lն2���^յ�m��6�:����S�k��������8�8�w{�R�n���(b�p����gqne�V\% N �[�\��9ѡ�۔�c�݃-��-vSv[���\`�Ud�VV[l|�N��e:EΏ��n�1v��1�y��CeT�_�O��ۘeU�7��A�W�7�`��+ⳮ��S���Q$�aF��[|�<&\�q�]3�#�����l�|ats�t'Pljh�b'�����Γ�q�1��S�\L��d�������\�6h2���7�Ϊ����Q=<h��yr9z��N�M��q˰q���u����aq�����X�<�"4uhざy���Xcf���6>�SD�ʽ�h̔�N��l�$�yA�n��SH��Z��U��Yc;u����WH -'�-&r^�<��yP��>�t -|�ȸ���5���nfB���.7k�|�Z�Ff<�= /A#��C�<���/N#wO��U�̕qk��G��뮊ٹ�`I,����\̚X�>Xou�y���d@���e�ʪ�w /E�ֵ�W�u0����p�\�N`�x��OC���.)=�[K ���0�UI���.�I�.5�\[}(��7���Z��I�R��9d�8^��3+N�X�,��ˍ��@H�q���s���M�0�о7�3}��BͬM/!=M�$Ly�{T�[���d4a�l�t��Reҏq���ʾ�P�Kv���gT����� -���e�T`��Mѓ�_�V�ml��6���D�^��e�>n�E��/��٭UjeXZL�IQ��M�+��s��\5j�H�c�Z�{�7��B0 rͭ�f����b6�P�Z��)'��&�. -*[�:_@��!= 8�"�1n<��pdg�D�0�?,{��aE���pF�ŭ4?�S�#�)��u��A��-��`CZN(P�+� -�gH��Ur PŶ�����j�jW7P��������e#f���,�'�b3Z��_�ϧ\08�|����E`ό� -��Er�:��u�������c��( �p���I�chg�{�L��x���\�Z�͙>��'N�?�Z�����f����D�ٲt���ѥ!r�e�����S%�(%��4P<�i -f�)<��9�(V2�?m���@yNoq��(�k����+�V+��Q�VkuԮ�A�N��[�P�yu����Z����qRxx2�J�@�Um2�=6�~Ւ�����$�]jX��2(#����M����6��_����T���B����eZ��_i��O�ƒntt�X&�N��b� �c�g��*�].g�P:\�Mf^��I�_a��SfX`4<�[N˟��o���a��[�"|�vg�H�k��C�^\���f�������ޙAD�S��-���h!��ƮT<BN@0`ƨ$@���ԉ��OK�>c7���uy8p��B��\��2� dYj� 27��HP/$_N��93ױ7.@�<-&O��b��. -�!�cHv �ЂN0�'�R�w:�5{M{�[����KйF����v�� �c�FA�Ces�v�I*^�>��I���Ò#���u�#<ǞE�� x�4^�1Uװ�ƻ�= -��V������,���9,�d����Γm���Ӟg�{Pٷ!�S2�F�x�D�j�S/1n^�4+�-fa"N�KR*k��q�q�6 ᠈��0g��G4�ѐ� -͑���N�`�[w�?`�B��z�Q�`�I��C�z���"{?+�}o�H���j���eߤ ��"7S3�Hq���k���9ա�G �ZpS3�@)n��Y�>HƜ�@d��0Y�[@�)�������5�q됻Y���F��Ԯ\1����&A�C���ʁH`"���2-&z@�>�Hu��5 ,nY�����2�,�&�8}P�!���@�[¸�0�wB�Ay���E�a�C���so������#r8�(�P��'��E�uy0Po{��h醪��81�DŸm1����� B�8�Sϒ,-&�P�@#Lu�,�$�fwC�'�5˚Q��L`�Tjǡi���,��^�א]fHAr]�¨�R�zݎfKEf����e�fc���;yu�x����1��8p�8�]@H���ch����1�`�9r�N ������7ÂO����T�"�x3<C� �ς�̈́�p�T�c�D�*naK�7�;0�-����P�2ա��KB��B��ƚ�=��Z��mn���q}�;��g1qg��A�Y�Cea�,�t;K��]�~�dP�l.���a��,��1�����PA�� -���9�TÕJ��XLAc��� 1��xOB��sX��ZL-�Ȓ8��Nu�q�Rq����XN�_�@����HQ#��.�$,�&3�%�E<��7�ƂA�y=�.�W$~�o��XZ�Q L ��u��O mx���J�U���Zv��EW�tP�R-v�/n�22����/y�}�U�� \������g.�����!�uA��{����=fJ�`��qc��( ,�p��I�#������0������Y-�X���3�֍7��x 3�|�Ϲ�j��9�&3�S]�d��'ϑ{�Y#��>��}��Y6��p�.k@<5`r��L�<�T&�aC������c��N�U���̀����G��B�)� �<C�Ɂ'A $�Ku��"3� -=��y���d�G���L��FRU A������O.��9ա��gq�eZ�h��R��z�sj�`P'0���-�G��8a:�dxZL=q���^���X��c�v��?�9�(N�[Lu��B�:����8>2�=+�_�O}X�E�0{����A�,��2��kH����@�K�����.�.�8Xڌ�:!Fw:���#�VL% -q���F�C���=A����q���=�{m�\�unt��E�ɳI�_?0��jA!�B�A�C�C��En�� -��GK^#���\��; -��7� F�;���Q��kA���AdA�C���b�\:���&�g2<5J̴��uyPPg�@8a67*�m?��-fpȱ��J���AF�T�:C��7�y�l�����?��f -�@���r�3�$�.*�<(Ij�A{'iF� w،|(�[�t����:��Pm�kv�mE����x��(��bj��5�R*�3Ķ���������7e�Y�?I�@p(�:�8 U<��#T�::�Ű������Lu�l��iגm���=Ӧ���Y6;e�ND�z)I�˟n���ג��݈0 �-d�Y��8}���Pc�Q\&��#i~�{�HI�S�G�>�͓�Pc ޝp�9�dvH���Іp�9�p����4�s�Y�S�C�>(Ƒ�Pc�H��=�>��[� g �s�Ce}�B�`��I�@]zԵ�Y=M��b��҄�f�ǘ�Z��@�>p�:��,� �Ѷu�TB @�;�%�f9����$N�k�dEXo.G�A�� -�[^�'����ף�* -�c�}�j`K\��U�k�B@�4?�1r%+7ա�*.�Jnp~��b�H�R���?���eg10 N�@�C5��Ҭ{w�%�qO䀞ټ��o�Fkj�W�k�j!��I��7���pR�7�=�{e�Y��=Hh��PM'��Z��j[T(ڦ�k�I�)#�y{��P@��� � ΄�:�� -�w��̻ ���G��� 6zS��[�{��?�f!N T�Hu�B�/rE����hQ��Bx��@f -� -kP@���Ė *b�:���#�(�1�3�(8&� աޑ1�;��Mor���V?(�h1�����A�C�s�4l ԋ� -��nG�̬Bcv����h������?Ȱ� 4�� ա�emN*'�{`G��C�n\g� 0�u���S̹�o��`�g2Dm�«�Q�����mS6�4l6[�6[E*KfN���i{XpI�z� � -�o����ףVX�z��3fʈ��������8���}��K�ױ��^�����l����E�q�7��O�{�X�%4/3�{�У�o���Ed,9�!is�en�'�`B�dz|>9��ђk -����u�M�>��j�a��Ϲ�j��Ɔ���96��l�?:N�#3��4F1>}��d|�M�&ܲ�O�h�3�>�ooz`�$ ���E��Ŝ����:��]!*�W���u,�S��sXnИA��0p��:7�-Y���@���d���ݦ:T�8T:m�jMp,Z�0 -S�� -��P �*�H�ɑ">4ev��Ğf^?��^����R��aZ;���@�����G -�k�jUww��t�~�����Z;�l̴DK���? >6� )��(�lkmMU-ʉ��n�&Scobs�;����n�|"�u��(>*���K������� �\�m��aB0!;{�vu���Z����E���?g�_<?z�C�t8�+���[��L6�Àn�Ul=l�bC������L;P>1�;"S���X8p�)�j�ş��z�N<]���=�6w�(S���V�Q�bv�$�DPz����[DW��I%k� pE���rz�;�2�ݜ}!�X=��eɑ ���)�,9F*�1�$!�,����&���iy�f ݞh:���m��v[E,��2v<����ߜ�w#L`;�a�����<�M�.��K1 ���LvCf� -�)�Gfr*����bJt��'v�"�}�:�_�nc��c�B�^��e3�f'�A��/�7gf��K^��<*�@�0}b��^e���M9�/q�`*�_5��ϫ���d�M=4�cO�^�)h�掇��JX��[̽v�¢nfaFke]'��o3�@^Z��zX$�������� -b�7:���U�2�r�_3���"�_ߔ]g�#��ƶ�.��L��Uc�w5��?r4(�~�F03���Q���/N�.6S��!6�Lz�Wv=,V��p���N��yD]]�{ݘ͝�f�=��8i�z1U���<�D/̼D_'5�� -�a}}�S�rG{�.%y}�k�)s%nep�^��t� '�ςJ^�%/S�/c�=�s�bw��=�N���ZСq�� -\ -��LZ.��:P�R�����@f�'z]�$e7��P��7�Au;9�e�fY��(�X(`�C<���`Ȳ��{O*3(�.��db,�@��Ŕ�� �ɤ:T�ȿ���Rsg�:�!�͑3��Z�01��a��`~� A Ӎ�\��0��L�SrJ��$�ϲ����NJu�[�x���G�k�9�S�X�@(L��?TЕ��#��@ ��bRJX�T�G���T�X&t��4 -������f�D�0��44��k1q�`}��P��ħu+W�V3�(M\R��5���fӶ&V�e�1,�n"�k��k��� -�9���fE�ĉ�Y/&�Y\*ba��L�x�n9͊�E�:;>hz��A,���U�� -�fs�����-��L[R�d�����[!co1Kޑq>���\�X�ˇÙ���\�~0�ޖ�py�% ���� �E�t3f�F�7ˆG2���zw��Û1�%�: -��0����rd.o/�w�`+H���[�3�W��gg�,����P}c�S%��$.��de�<�]��V\��93P�p�&%w�������d0�Á���v�ߝN�7AF�atu�ƭ�Ff�Ɋ*a�W?��-,�肎̈(����d��~Y���q -��E���j9�ᕎ��ê�a[����i�l�:mv���E�)NL5���x �����Gx�={旆�:�9�9 -�F�轄l��@�z��md����lrV��$�'fc'(��E� cA�s�3�r�0듦��UJt�B�j[�&�Z#��҅y��#��X쏰��噫"�k0G2��9�3�i�Se����,�K���K(V���sU> -gpC��=�~�b���)��0L�^?!8�|��K���"�6�߆��Q�r�c�؏�k��zt��a"kq��_>$m��̚|ɐ���8��\\Z�͙/���<A?�Z�ĭ�ٓPjt�]�3�m���K][6�5�w�/��gQ~��QCd�Q���N�3��K�VG��� -Εb�9/犑y��g�:��{%�%U���� c6���<�Nf:XP�vA������F��^Gm���6�Ɲ�E���:D��:gtQ��� ����N'\re��Y�P ���e -���{ W�4��D%������DS7�k��O�S���6A���M�O���YO)�#"y�ߧҷާ1A!^f+��d���J�Vq���o��fk��t�m�sr8֮�Y�9�jrFs�SDq�E�g�ۻ)��I�H�f��S�gW�C<_�/F�-Y�3 -0G&���vBL|+�"���$����9�Ȕ-����]b?��/������%�<��H!�C�)D���5��=e�.Bz3GV���&�s|с܋�ED�ӟ�G��_J��'"���!@��i�r���oEy�������bpu -#-���^:R��T�����kF�������6���(��6��sy��j�O��3rG�_{�����'7�w3��5R�X��=�����~��a�] -�����i������6p���րۙ����ooo�1��=����PKH.�?�"��PKhiA��DH�sammoa.argoPKhiA+����*֡�sammoa_Diagrammedeclasses.pgmlPKhiAǒV9�&�-sammoa_Diagrammedecasdutilisation.pgmlPKhiAe����V�.sammoa_Diagrammedeclasses2.pgmlPKhiAP����K27sammoa.todoPKhiA8��7y�O8sammoa_profile.profilePKhiAH.�?�"�� -9sammoa.xmiPK�\ \ No newline at end of file +�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PK)�A +sammoa.xmi�]ݖ�8r�ߧ���cϜl�E��({�s$�������{f7Ws TsM����*���\fr�g��$O�բB�����ݒ�X(|U(������S�p����Ey�6�/�[���c��O��K�7��o�o����i��$�y~�����7A8n�q�6��GSd�����c�&S��:t��l��TE5_5�WjW���j/��AQ����8|�(��v`�&؏QL(������� �I�^8(1��"��8a�G +%���K�,_���w�_fz�n����f����N �a[!w����+Jt�^���i���+UW��|�T�}�V�������wʟ��3��'����ẍ́� &�l�))�� +y�oV��/ߨ +���7�;-��� +���wqK������\;R�sѼ �rq�nb��6�شڸ��R_]��f�Us�2����(I�.�h2 �Kō��r�J^��� /����Ag�x������n�Eq�����Q�/p����7�CO�o�l4&�����\�V��(��Џ��.}��#�|�]�0R�hD��Q�ç�s��j���7+�_���|? ��x���������{����btd����=�o���w���� +�)� ��Ɗ�1e��uY�ap%7_�u�N�+A8e�B%DS +d,>+���3��1h�u0�$������L�쉒���1���|��8�J��w�Q2g�O&�cFJS�����|��~7|�b�V�M~ŎC��;�" +�������K�E��ۈ�z���c����!���o}�E#yD��У37"ӘHI����]� +�~��eu\�֡$п�D�=�c"�P��%y++�E�t�u�)脘�b��+6Z��%6ɜ�Xy +<Ŧ���I/Oq=����_O�H�G�L�@o����P#�я0я�,$���J�5 +)�#�϶��>�Ŵ��ұTȸ)�� O��q0�,���������sAHn�-C�Rvr�#��c������w��A��� +���c��z�(+��Cd$,%ڐA�\�a.t�����V��_gA��#a����p$����Ǣx(G�O�B%��""�O�K����Q�/�QC��/d�B��'�o�4,�� +ߢz+���� +-�C�2��S"��L!�7J�e���-/�i�BBX�ikzu�,®��ܨ�2�R,�K�1�pxU�y>F�w�>��.�[|\r�om<��!�5��\c����M!!���A?�ax�b�}@�'�h��uZ��a!:�][m�]�`�nVץ8'l̼�%�Ɣ.-��N1�5]Fj��;�n�~��vˆC����9={�讲��Y���P͢C,o���g�M�f o��f�w�����N�*{>�?}r�ry2R<Ro�-�W\"�~9K[��ͮ�P���#��m� W���|���� +�U��9�m�f�D�^����`!?QC�8l8��O�sF�ǡK�}�Z��L���]��86�Nw����F�ǿ��T����d��?��<��1�"yxo��6d +#�V���=�<��#��Q8���}6��`�}�,�6�]��ט̼؝r��Y�R�J�}Y�g��|T#�/�ל��#m�/�L�L//���T�_*��4��A/e^j�5s,/w���L�ȡ�P�H�qa�=�����%�`6�A8�$k �%K�K�_��A�����'D�A��X��l����y��\g#�v�8�M!.p|����m���c �u���H��xw��˻��C)hն�����?����XjS����VR��Va������/;M�RZl[⦣~fk��5WP�2̨���*��oKAd�\?�N�T�O|��8��]>���K1��C������͠�r����>�����<2��ޭ?8�{QX�A&��_'}ý����^y��ck�Y�����3���7�M�~G^�r�61t3?��m���x���~�s�\�H�7˴��1Y&OѺ'=��H�Z�g\�R��q)a�P����/���7&�w|U�oL�����$Grw�ش:���(6�䪞��G�ƃ�e��h�s!�X@����E}B6r4�����U���J��q�Snmܻb +Bz-�qsE_�[(N��ݞ:E��p6���\�"��I�[�W�����֥�.{�t���6����{�`���.�-��yH/��*�^+�-6<_���<�"��ءYr�nl̯^����P��n� +��'V�m̲*�����+�kf0H��IW��G�Ϩ_3#���[|�<&\�p͝3�#��O��l�|at} +�l'Pǩhc'�����Γ�a�1��S�^L�8g�������o2���7�N���-�Q=�o�yr>z����C�±�v���ى�z�b��8�L�Hz�a,�!�"4uh㾞{���Xgf���6>�SD�˽���̔�N��l$�yA�n��RH���Z�U��Yc;u����WH +'�-&r^�<��yP��>�t|8˸��z5��637�u������%�����O`O�s��Ť�&O,�h����1��j���2"�aT�U~rź�bv.=X*`q>�&��k�j�'.:l9mƁ����p�s���um�U{0,%$�"�Z�#����KJ���-'<�gUҤ��mұK���V� +%� +�<��/bR���o�?��W���̊�'2+�r��1�~�����y�{8r����]�Ps+D�KHO�/ S����>���(MX9�,�̬L��}\,Wye_D��$;���r*@����yċR*0Hϧ�Y���Rkn[���l"��1M���[�(�Bȝ��P�V��Ť��o�d��ҫ<��NU�v��,PkpO��@�H�\sk�9����MF*V��#��2�����Ae+VzfHO +�d��s���L�C8�sP�~���=W�"nj�B8���r+͏��� v��i��y��<�O_�P�3pݨ����L��6�4KՒ�&�M +@P ��r��k��F�n��F��s�]1�$�@@f��[������~>���~���� +�X�o���V�m��a?v��աN��6�����G��+7E!aP�C�t}H��;@���bB�σ�O�o����Ԓn��Y6>r��9��T��<��0#V�&^Ζ���nd�. +q�7��j�.K <6Pr�R"��%�㉦`nQ���Q<���b%����@�Q��O����~�r����,�Ri����i5���v%;�:Vul����|��^[\����~Rxxr�J�@�Um2zlr��%7��72G�I���m��ڦ�05[w��h1�mt���eo�G;�8K��˵V���J��%��1���;]��:��:3�&�Uz3_���2�ܼF%������*4���ixo9��ľ�j�u.�I��ڍ�O*!oq�!pw�� +;zq�g�G���z�n+�w 2L�S�P�>f����R��>3F%/��n<��xZ���V��Á��*���%� H ��vɑ w3�^��B��t��3s{����b�J(��������M1�dr-��8�p�)ӡ�H�p��U���m:#�V[:s/���R:����Hp��@�<0 +2*����LR9�r���F�vK�P`�/�%�]�)�m�����i��-�����j��{W�%0��_[Hc��iR��{,�y��g����1%�k�'.��繽cJ$�ͫ��D���,���B�Ce���n(�� �H�)Ҡ�� �Y��Dd:@�A���uN�`���?`KA��F�Q��<ő^��6��E�>S +6�z��$�bi1U����=VI/@�sEne4��f���� mr�C���jQ�M�l���YL�dq� Ir� � nT�h~�n%�xZ��m*�t�1�[��͂�7wr� +H���I Nld:��) ����p8 ��b����L�[�2��K�>q ��bj%���2�at���� |� ���h�]�pf:��?��Y�^)<!υ�r�K~q�[�^���.ڪ��4��$�i�l�q��!7�����4�$K��"� �3*�%�tin`H��.��!�eY3]�����%p\���R,�{ +i2C +���F�אFW�;1",UCV����e�fc +�F�-�|�r<Պ�a��n��8K�. ��YZ�14a�`���0мp�N ���c�T4g��O����L�"�x3<A� �ς�̈́�p�L�c�D�(n�I/��71�-���Px2ӡ��KB��"��º��#5�6�Uv��7�l�zĝI3q� �,ӡ�0P�<������.� rw2(66��{ϰ�|��m��\V(���ƌ��Ja�X�@~a��l ���pK����[�ZeL-�(�8���t�q&Qq���s�n���@���sH���.J$,�&3�$�܇���Ƃ��<�^�u��?'· +�l�,-�(&��L�ʺm�ߑAB+�g���q�j�L��P�0�Q��f���q�������9�;�^y�H���������,�o�~�_g�\q���H/!�`�t���W�n�B¢�����s�ڹ:<��|6r}{�%��ts�в�x/aN���9��T��<���f{�בΖ���rd��l�ň=Ƨ�p�e|�M�&ܼ�� +�\�*0w>- �����O��<��亩����l91`rGF��tő�`����t��F���䦓 ��e:T}�y��]��y���d�������FRU A������O��9ӡ��gq�eZ�h�;R�����c�`P'0�|�-lG��6a:�dxZLy;q���]������da���x�?�9P(N�'�tH���:����89�1|;�_�OIX�E�0{��A�,��2��KH����B�K[���}.���8�ی��F�1��D�#�^L�q���E�C���5B��4ZI��32�-�\ +nt��C!�ɷwIQ_?0��jA!�B�A�C�C��En� +��GK^����^��w�CnhA��� ���(�ׂ"��ȂL�z��ł�t���uL +dx�.90�Q���AA���D����q�0��MF�,�ckA���L��u�ao2���2���A�Sa��0S��m�̐��:? ���$)�����)��c+�,n�ө�a�RB�� �;-��/�%� +ƣ<[���'N���t����v�~v8B +>�Ĕ�g1�$ ����P�T�D��Pk��b���Z2ӡ��'�]K��]ˡ�G���;e�FD�r)I�˟n���ג��݈��-d�Y��8}���Pc�Q\&��#i����U�$S�)�#N���t�1�N���=2��yZ�th8ܜ�8@d�[�c�)��,O���!N��t�1H$��m���-愳�p�9ӡ�>e!Dh��Q��LzԵ��]]s�b��҄�&�ǘ�Z��@�>pd:��,� �Ѷe�TB @�;�%�f9����$N�lodEXn.��N�� +�[^�'�����*�[C�}�j`K\���ɵr!�R��������PMw�Jnp~���b�H�2���?���eg10 N�@�C5��Ҭ{7���@䀞�<�����v�Z�WӴ��V���a�{���pR�.7�=�{e�Y��]Hh��PM'��U���l*-�0tu�a +��<���q�( ��b��HgB2�fq���K�]� +p@�����J����i�}P@��U�'�Yd: +P�������Hq��pa!<�p 7݊5( ��b +bK�3j���\�Ș�[p��P���Z?zp'�d +��s��Mq�`� ӡ�U��&g������63�А]��9s�>�֍o�π2l- +��4�t�fY�#�ʉ�ؐ��P�k�?�̭�u=|�s�K���SL�Ϸ�6G���(�y��4Cǎ�)�:��j��V�m�sc[H;�8�;Nh���7�6�v�u������ ��&R#��n�� ��ȥ��I��W�镣)�=~���ˊ,[�o��{��ǿ�?]�m +.���|�E�>~DOn��ZS���@뇴;C��ٝS� Q>�"����JK��^����ƫ(����^?ǀL�s)J�Z�� +{�yul��ٲ}t�C��ПM������v��7��p�.K@<�����@���%�$�2a�s�V�>8x��Ps7��X�̣W)<!ϵ� ��A�a@g�����n+�<�d�GL)���V�>�B��Pu ��P�t[�D.t�m�-�f+�C%zv��#�@��)�#�(�4�X�����^�r���Y�`r'�?R����W��u(ufp�3��cj�$�1�-�Z�������&.��������tM�)'�F���F�����C&H������������V.8�҇�<��&$s���� Y���l]��mB�k.>P[ynv���~�d��_Hd/���`�x`��ny*42Yw��Wi���ŋ +yn<$���3�@����D4�t�fu?(�q��c���O>a��84�x�����m ��Q��2��#h��I����Zn5W��. +�#�J����I�)b��\v�{d®9�B2��z�$�˒=A"g�kS�Yr��W$�UI B&�� !b�M�ͱ�r3��g��R���:���X&���7<����ߜ�w#L`;z۲M[�y�9&��K1����LvCf� +�)�Gf�(�� +Ŕ��O�<0ā��`���V��R��d3�z#�@��/�7gf��K^��|UL�a��NM���_��r�_��T�u��jl��V_�FȲ�F"hZ��SІ� +[ŕ����̽v�¢nfaF�eC'��3�@�^�zX$�������� +b�7:���U��ɲꯈ�YC@^_�]��#��ƶ�]ˡ�F�=2L�f�u��t?B#��D@P��a ��f��:�f�Hwˮ����.���Q0B3����i�N�L��i��5X�U3��.(N_�9%zA`�9�B8)�el���#���!�r`�x���]{K�)q+�[��"�CN8)~T�R�@(E��p��ܣ?'-B'�܃��@~j�'P����9���ͤ���5(�8�*;�f�����QR6p0J +L+q +T���h��P�,7�^g�}�����Y��}�IcF�`��b��L�`H���r2B=�L��b�!�b���}��M���S�v���ô3?� K� ��FL��S�[��)�%�a��g��I-p'e: +l�M<�c�'�5@�S��K,A &�t8<TЕ��#�� +@ ��bRJX�T�{���ԜD&�մ�ӫ14�;́��A��ih ��b���� ӡ�Չ��V�v��&Qy��4�K��oͦm��ڶغ�DD���~s���͊���QL`��T��,ə8�:�f9͊�Y�:9>�F��A,����q����떷D���3mI���CH�2o�����$[TxCR��|��s���M>�΄,��� � ����.A�^y�,�3�VZ��7ܓ)������� +9,aH�q��_��ԗ#s.x[پ�l[A��u�J�I�:�>;Q�`1�7$��k�*���( q��� �(��1�Ɔg��zX�͙�ڠ��iRr��NѵN�YH3;���j'�����j'�m�p�v�\h�本��x�c̱����.�Ȍ8�b�AKf��u-,.�p���.��v`=��q�zX3t�h�|][M��bGQ�76rʼn�F}6^�rV����+<ž�}�K��\��#�U͉�J�:�� �a�C��O^�A�8�fl/n�&g!���z\a�p.�0�(?b�g� �F�3�r�0���%�c#Gs�n�]�MD.�L��)̜݃����s����"�k0GR8a�ݔ�"Ξ7a�%L:�Y87�q��/+}�qj���6¿Έ�ȓ���?`;�l��G�j V�)�0#fͨe�i�}#7Qz: !&D�<�r}{�%� ���s^l���gƒ�^����2a%5��.�y����P��Uˢ��n�nw[���b���ǿ���T)��]�@ȇ��p�d�ܣ�=��E'�����]a�@h�����p�A+??��ZY�|�r���fc�Z�����h�f9lGC�W}�Q��a�q/KG��E��&6�:� +��6'�� +�m��sZ�?������9��%3�Mݠ��p�>�KM +�Z�s9�?�|�+d=g����\�6���>���<�͊��F+�[%��{�����z��q|@�+츾{��Pڐ5����!g47^>CG[��Mk33���?�њ̈́H�b*����[������"�h�&k�`Bf�Q����C�Q`'Z�6��B��X��yA�L�тX� ��9����|�S�hD���i� +���H!��B�5��+SoћY8���<<W9��˽(���=���q�L�Y�Dq`}"��\��;�ǯ��9��7��1����A.��Ί�b����L;9%�����#����NﮥV6��Q�m�� +���?���ț�Zt�O�UU�?�a�%��F�����AP9�&���0nR����ߎ�m +�}Bn���'�������{Cq����7�PKa;�v�"��PK(�A/UgH�sammoa.argoPK(�A:�&s�*ѡ�sammoa_Diagrammedeclasses.pgmlPK)�AǒV9�&�-sammoa_Diagrammedecasdutilisation.pgmlPK)�Aɟ���FA�.sammoa_Diagrammedeclasses2.pgmlPK)�AP����K�5sammoa.todoPK)�A8��7y�7sammoa_profile.profilePK)�Aa;�v�"�� +�7sammoa.xmiPK��Z \ No newline at end of file Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java 2012-09-01 09:51:22 UTC (rev 504) @@ -26,13 +26,19 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import fr.ulr.sammoa.application.ValidationService; +import fr.ulr.sammoa.persistence.Observation; +import fr.ulr.sammoa.persistence.Route; +import fr.ulr.sammoa.persistence.Validable; import fr.ulr.sammoa.ui.swing.SammoaUIContext; import jaxx.runtime.JAXXContext; +import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.util.Resource; import org.nuiton.validator.bean.list.BeanListValidator; import org.nuiton.validator.bean.list.BeanListValidatorEvent; import org.nuiton.validator.bean.list.BeanListValidatorListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.Map; /** @@ -69,7 +75,7 @@ * @throws NullPointerException if no validator exists in context for the * given {@code modelPropertyName} */ - private <E> BeanListValidator<E> getValidator(Class<E> beanClass) { + private <E extends Validable> BeanListValidator<E> getValidator(Class<E> beanClass) { BeanListValidator<E> validator = (BeanListValidator<E>) validators.get(beanClass); if (validator == null) { String prefix = beanClass.getSimpleName().toLowerCase(); @@ -94,7 +100,33 @@ return validator; } - protected <E> boolean isValid(E bean) { - return getValidator((Class<E>) bean.getClass()).getContext(bean).isValid(); + protected BeanListValidator<Route> getRouteValidator() { + return getValidator(Route.class); } + + protected BeanListValidator<Observation> getObservationValidator() { + return getValidator(Observation.class); + } + + protected <E extends TopiaEntity & Validable> void bindValidableModel(String propertyName, + Class<E> propertyClass) { + + getModel().addPropertyChangeListener(propertyName, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + TopiaEntity oldValue = (TopiaEntity) evt.getOldValue(); + if (oldValue != null) { + oldValue.removePropertyChangeListener( + "deleted", enabledListener); + } + TopiaEntity newValue = (TopiaEntity) evt.getNewValue(); + if (newValue != null) { + newValue.addPropertyChangeListener( + "deleted", enabledListener); + } + enabledListener.propertyChange(evt); + } + }); + } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java 2012-09-01 09:51:22 UTC (rev 504) @@ -24,6 +24,7 @@ */ import fr.ulr.sammoa.persistence.Observation; +import fr.ulr.sammoa.persistence.Observations; import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; import org.slf4j.Logger; @@ -49,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); + bindValidableModel(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class); } @Override @@ -63,10 +64,13 @@ logger.debug("Validation for observation {}", observation.getObservationNumber()); } - getValidationService().validateObservation(observation); + Observation observationChanged = getValidationService().validateObservation(observation); - if (observation.isDeleted()) { - getModel().removeObservation(observation); + if (observationChanged.isDeleted()) { + getModel().removeObservation(observationChanged); + } else { + getModel().updateObservation(observationChanged); + getModel().setObservationEditBean(observationChanged); } } } @@ -74,6 +78,7 @@ @Override protected boolean checkEnabled() { Observation observation = getModel().getObservationEditBean(); - return observation != null && (observation.isDeleted() || isValid(observation)); + return observation != null + && Observations.isValid(observation, getObservationValidator()); } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java 2012-09-01 09:51:22 UTC (rev 504) @@ -23,11 +23,8 @@ * #L% */ -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; import fr.ulr.sammoa.application.FlightService; import fr.ulr.sammoa.persistence.Observation; -import fr.ulr.sammoa.persistence.Observations; import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.persistence.Routes; import fr.ulr.sammoa.ui.swing.SammoaUIContext; @@ -38,8 +35,6 @@ import javax.swing.Action; import java.awt.event.ActionEvent; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import static org.nuiton.i18n.I18n._; @@ -60,24 +55,8 @@ public ValidRouteAction(JAXXContext context) { super(_("sammoa.action.validRoute"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validRoute.tip")); - getModel().addPropertyChangeListener( - FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - Route oldValue = (Route) evt.getOldValue(); - if (oldValue != null) { - oldValue.removePropertyChangeListener( - Route.PROPERTY_DELETED, enabledListener); - } - Route newValue = (Route) evt.getNewValue(); - if (newValue != null) { - newValue.addPropertyChangeListener( - Route.PROPERTY_DELETED, enabledListener); - } - enabledListener.propertyChange(evt); - } - }); + bindValidableModel(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class); + bindValidableModel(FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, Route.class); } @Override @@ -94,14 +73,18 @@ ); } - getValidationService().validateRoute(route); + Route routeChanged = getValidationService().validateRoute(route); - if (route.isDeleted()) { - getModel().removeRoute(route); + if (routeChanged.isDeleted()) { + getModel().removeRoute(routeChanged); } else { + getModel().updateRoute(routeChanged); validatorIsAdjusting = true; + getModel().setCurrentRoute(routeChanged); + getModel().setRouteEditBean(routeChanged); + getModel().setObservationEditBean(null); // Reload all observations @@ -120,43 +103,9 @@ boolean result = isEnabled(); if (!validatorIsAdjusting) { Route bean = getModel().getRouteEditBean(); - result = bean != null && (bean.isDeleted() || isRouteValid(bean)); + result = bean != null + && Routes.isValid(bean, getRouteValidator(), getObservationValidator()); } return result; } - - protected boolean isRouteValid(Route bean) { - boolean result = isValid(bean) - && isDifferentFromPreviousRoute(bean) - && isObservationsValid(bean); - return result; - } - - protected boolean isDifferentFromPreviousRoute(Route bean) { - boolean result; - Route previousRoute = Routes.findPrevious(getModel().getRoutes(), bean); - result = previousRoute == null || !Routes.equal(bean, previousRoute); - return result; - } - - protected boolean isObservationsValid(Route bean) { - - Iterable<Observation> observations = - Observations.filterInRoute( - getModel().getObservations(), - bean, - getModel().getRoutes(), - true - ); - - // All observations must be deleted or valid - boolean result = Iterables.all(observations, new Predicate<Observation>() { - - @Override - public boolean apply(Observation input) { - return input.isDeleted() || isValid(input); - } - }); - return result; - } } Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java 2012-09-01 09:51:22 UTC (rev 504) @@ -0,0 +1,134 @@ +package fr.ulr.sammoa.ui.swing.action; +/* + * #%L + * SAMMOA :: UI Swing + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * 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 fr.ulr.sammoa.application.FlightService; +import fr.ulr.sammoa.persistence.Observation; +import fr.ulr.sammoa.persistence.Route; +import fr.ulr.sammoa.persistence.TransectFlight; +import fr.ulr.sammoa.persistence.TransectFlights; +import fr.ulr.sammoa.ui.swing.SammoaUIContext; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; +import fr.ulr.sammoa.ui.swing.flight.TransectFlightModel; +import jaxx.runtime.JAXXContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.swing.Action; +import java.awt.event.ActionEvent; + +import static org.nuiton.i18n.I18n._; + +/** + * Created: 23/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public class ValidTransectAction extends ValidAction { + + /** Logger. */ + private static final Logger logger = LoggerFactory.getLogger(ValidTransectAction.class); + + private static final long serialVersionUID = 1L; + + protected boolean validatorIsAdjusting; + + public ValidTransectAction(JAXXContext context) { + super(_("sammoa.action.validTransect"), context); + putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validTransect.tip")); + bindValidableModel(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class); + bindValidableModel(FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, Route.class); + } + + @Override + public void actionPerformed(ActionEvent e) { + + Route route = getModel().getRouteEditBean(); + + if (route != null && route.getTransectFlight() != null) { + + TransectFlight transectFlight = route.getTransectFlight(); + + int index = TransectFlightModel.indexOfTransectFlight( + getModel().getTransectFlights(), transectFlight); + + if (logger.isDebugEnabled()) { + logger.debug("Validation for transectFlight {} : {}", + index, + transectFlight.getTransect().getName() + ); + } + + TransectFlight transectFlightChanged = + getValidationService().validateTransectFlight(getModel().getFlight(), transectFlight); + + if (transectFlightChanged.isDeleted()) { + getModel().removeTransectFlight(index); + + } else { + getModel().updateTransectFlight(transectFlightChanged); + + validatorIsAdjusting = true; + + getModel().setRouteEditBean(null); + + // Reload all routes + FlightService service = + context.getContextValue(SammoaUIContext.class).getService(FlightService.class); + getModel().clearRoute(); + getModel().addAllRoute(service.getRoutes(getModel().getFlight())); + + // Keep the route selected + if (!route.isDeleted()) { + getModel().setCurrentRoute(route); + getModel().setRouteEditBean(route); + } + + getModel().setObservationEditBean(null); + + // Reload all observations + getModel().clearObservation(); + getModel().addAllObservation(service.getObservations(getModel().getFlight())); + + validatorIsAdjusting = false; + } + } + } + + @Override + protected boolean checkEnabled() { + boolean result = isEnabled(); + if (!validatorIsAdjusting) { + Route route = getModel().getRouteEditBean(); + if (route != null) { + TransectFlight bean = route.getTransectFlight(); + result = bean != null + && TransectFlights.isValid(bean, + getRouteValidator(), + getObservationValidator()); + } + } + return result; + } +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidTransectAction.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css 2012-09-01 09:51:22 UTC (rev 504) @@ -72,6 +72,10 @@ : "")}; } +#lblObservation { + text: {flightUIModel.getCurrentRoute().getTransectFlight().getTransect().getName()}; +} + #cbPanel { background: {model.getEffortPanelColor()}; } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.jaxx =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.jaxx 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.jaxx 2012-09-01 09:51:22 UTC (rev 504) @@ -64,6 +64,7 @@ layout='{new BoxLayout(validButtonPanel, BoxLayout.X_AXIS)}'> <JButton id='validRouteButton'/> <JButton id='validObservationButton'/> + <JButton id='validTransectButton'/> </JPanel> </cell> </row> Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java 2012-09-01 09:51:22 UTC (rev 504) @@ -73,6 +73,7 @@ ui.getStopAudioButton().putClientProperty("actionName", "stopAudio"); ui.getValidObservationButton().putClientProperty("actionName", "validObservation"); ui.getValidRouteButton().putClientProperty("actionName", "validRoute"); + ui.getValidTransectButton().putClientProperty("actionName", "validTransect"); } else { Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-01 09:51:22 UTC (rev 504) @@ -102,6 +102,7 @@ import fr.ulr.sammoa.ui.swing.action.StopAudioAction; import fr.ulr.sammoa.ui.swing.action.ValidObservationAction; import fr.ulr.sammoa.ui.swing.action.ValidRouteAction; +import fr.ulr.sammoa.ui.swing.action.ValidTransectAction; import fr.ulr.sammoa.ui.swing.flight.layer.BaseGeoPointLayer; import fr.ulr.sammoa.ui.swing.flight.layer.LineGeoPointLayer; import fr.ulr.sammoa.ui.swing.flight.layer.SimpleGeoPointLayer; @@ -415,6 +416,53 @@ TransectTableModel tableModel = ui.getTransectTableModel(); +// if (getModel().isValidationMode()) { +// +// table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); +// +// SammoaUtil.addTableSelectionListener( +// table, new SelectionModelAdapter<TransectFlightModel>() { +// +// @Override +// public List<TransectFlightModel> getElements() { +// return getModel().getTransectFlights(); +// } +// +// @Override +// public void setSelectedElement(TransectFlightModel element) { +// getModel().setTransectFlightEditBean(element); +// } +// }); +// +// getModel().addPropertyChangeListener( +// FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, new PropertyChangeListener() { +// +// @Override +// public void propertyChange(PropertyChangeEvent evt) { +// +// int index = -1; +// +// if (evt.getNewValue() != null) { +// +// Route route = (Route) evt.getNewValue(); +// +// index = TransectFlightModel.indexOfTransectFlight( +// getModel().getTransectFlights(), route.getTransectFlight()); +// } +// +// // Unselect all +// if (index == -1) { +// +//// SammoaUtil.unselectAll(ui.getTransectTable()); +// +// // Select the corresponding transectFlight +// } else { +// ui.getTransectFlightSelectionModel().setSelectionInterval(index, index); +// } +// } +// }); +// } + NumberCellEditor<Integer> numberCellEditor = JAXXWidgetUtil.newNumberTableCellEditor(Integer.class, false); table.setDefaultEditor(Integer.class, numberCellEditor); table.setDefaultEditor(int.class, numberCellEditor); @@ -491,6 +539,10 @@ column.setCellRenderer(editorRenderer); } + table.setSortable(false); + table.setSelectionBackground(null); + table.setSelectionForeground(Color.BLACK); + table.addHighlighter(SammoaUtil.newBackgroundColorHighlighter( new CurrentTransectHighlightPredicate(tableModel), SammoaColors.CURRENT_TRANSECT_ROW_COLOR) @@ -507,10 +559,6 @@ new ValidRowHighlightPredicate(getModel().getTransectFlights()), SammoaColors.VALID_ROW_COLOR) ); - - table.setSortable(false); - table.setSelectionBackground(null); - table.setSelectionForeground(Color.BLACK); } startTime = timeLog.log(startTime, "afterInitUI", "decoration done (editor/renderer)"); @@ -746,6 +794,7 @@ if (getModel().isValidationMode()) { putAction("validObservation", new ValidObservationAction(ui)); putAction("validRoute", new ValidRouteAction(ui)); + putAction("validTransect", new ValidTransectAction(ui)); putAction("startAudio", new StartAudioAction(ui)); putAction("stopAudio", new StopAudioAction(ui)); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java 2012-09-01 09:51:22 UTC (rev 504) @@ -24,6 +24,7 @@ */ package fr.ulr.sammoa.ui.swing.flight; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import fr.ulr.sammoa.application.flightController.FlightState; import fr.ulr.sammoa.persistence.Flight; @@ -69,6 +70,8 @@ public static final String PROPERTY_ROUTE_EDIT_BEAN = "routeEditBean"; +// public static final String PROPERTY_TRANSECT_FLIGHT_EDIT_BEAN = "transectFlightEditBean"; + public static final String PROPERTY_FLIGHT_OBSERVER_FOR_POSITIONS = "flightObserverForPositions"; public static final String PROPERTY_MAP_FOLLOW = "mapFollow"; @@ -120,6 +123,8 @@ */ protected Route routeEditBean; +// protected TransectFlightModel transectFlightEditBean; + /** * La liste des observateurs du vol, sans les pilotes avec l'observateur null * @@ -164,7 +169,7 @@ } public void setObservers(List<Observer> observers) { - List<Observer> oldValue = Lists.newArrayList(getObservers()); + List<Observer> oldValue = ImmutableList.copyOf(getObservers()); this.observers = observers; firePropertyChange(PROPERTY_OBSERVERS, oldValue, observers); } @@ -230,27 +235,33 @@ } public void addObservation(Observation observation) { - List<Observation> oldValue = Lists.newArrayList(getObservations()); + List<Observation> oldValue = ImmutableList.copyOf(getObservations()); int index = sizeObservations(); getObservations().add(observation); fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, oldValue, getObservations()); } public void removeObservation(Observation observation) { - List<Observation> oldValue = Lists.newArrayList(getObservations()); + List<Observation> oldValue = ImmutableList.copyOf(getObservations()); int index = indexOfObservations(observation); getObservations().remove(index); fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, oldValue, getObservations()); } + public void updateObservation(Observation observation) { + int index = indexOfObservations(observation); + getObservations().set(index, observation); + fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, getObservations(), null); + } + public void clearObservation() { - List<Observation> oldValue = Lists.newArrayList(getObservations()); + List<Observation> oldValue = ImmutableList.copyOf(getObservations()); getObservations().clear(); firePropertyChange(PROPERTY_OBSERVATIONS, oldValue, getObservations()); } public void addAllObservation(Collection<Observation> observations) { - List<Observation> oldValue = Lists.newArrayList(getObservations()); + List<Observation> oldValue = ImmutableList.copyOf(getObservations()); getObservations().addAll(observations); firePropertyChange(PROPERTY_OBSERVATIONS, oldValue, getObservations()); } @@ -281,17 +292,35 @@ } public void addRoute(int index, Route route) { - List<Route> oldValue = Lists.newArrayList(getRoutes()); + List<Route> oldValue = ImmutableList.copyOf(getRoutes()); getRoutes().add(index, route); fireIndexedPropertyChange(PROPERTY_ROUTES, index, oldValue, getRoutes()); } public void removeRoute(Route route) { - List<Route> oldValue = Lists.newArrayList(getRoutes()); + List<Route> oldValue = ImmutableList.copyOf(getRoutes()); int index = getRoutes().indexOf(route); getRoutes().remove(index); fireIndexedPropertyChange(PROPERTY_ROUTES, index, oldValue, getRoutes()); } + + public void updateRoute(Route route) { + int index = getRoutes().indexOf(route); + getRoutes().set(index, route); + fireIndexedPropertyChange(PROPERTY_ROUTES, index, getRoutes(), null); + } + + public void clearRoute() { + List<Route> oldValue = ImmutableList.copyOf(getRoutes()); + getRoutes().clear(); + firePropertyChange(PROPERTY_ROUTES, oldValue, getRoutes()); + } + + public void addAllRoute(Collection<Route> routes) { + List<Route> oldValue = ImmutableList.copyOf(getRoutes()); + getRoutes().addAll(routes); + firePropertyChange(PROPERTY_ROUTES, oldValue, getRoutes()); + } // // public SwingValidatorMessageTableModel getValidatorTableModel() { // return validatorTableModel; @@ -322,6 +351,16 @@ this.routeEditBean = routeEditBean; firePropertyChange(PROPERTY_ROUTE_EDIT_BEAN, oldRouteEditBean, routeEditBean); } +// +// public TransectFlightModel getTransectFlightEditBean() { +// return transectFlightEditBean; +// } +// +// public void setTransectFlightEditBean(TransectFlightModel transectFlightEditBean) { +// TransectFlightModel oldValue = this.transectFlightEditBean; +// this.transectFlightEditBean = transectFlightEditBean; +// firePropertyChange(PROPERTY_TRANSECT_FLIGHT_EDIT_BEAN, oldValue, transectFlightEditBean); +// } public List<Observer> getFlightObserverForPositions() { if (flightObserverForPositions == null) { @@ -331,7 +370,7 @@ } public void setFlightObserverForPositions(List<Observer> flightObserverForPositions) { - List<Observer> oldValue = Lists.newArrayList(getFlightObserverForPositions()); + List<Observer> oldValue = ImmutableList.copyOf(getFlightObserverForPositions()); this.flightObserverForPositions = flightObserverForPositions; firePropertyChange(PROPERTY_FLIGHT_OBSERVER_FOR_POSITIONS, oldValue, flightObserverForPositions); } @@ -381,7 +420,7 @@ } public void setStrates(List<StrateModel> strates) { - List<StrateModel> oldValue = Lists.newArrayList(getStrates()); + List<StrateModel> oldValue = ImmutableList.copyOf(getStrates()); this.strates = strates; firePropertyChange(PROPERTY_STRATES, oldValue, strates); } @@ -410,11 +449,28 @@ } public void setTransectFlights(List<TransectFlightModel> transectFlights) { - List<TransectFlightModel> oldValue = Lists.newArrayList(getTransectFlights()); + List<TransectFlightModel> oldValue = ImmutableList.copyOf(getTransectFlights()); this.transectFlights = transectFlights; firePropertyChange(PROPERTY_TRANSECT_FLIGHTS, oldValue, transectFlights); } + public void removeTransectFlight(int index) { + List<TransectFlightModel> oldValue = ImmutableList.copyOf(getTransectFlights()); + getTransectFlights().remove(index); + fireIndexedPropertyChange(PROPERTY_TRANSECT_FLIGHTS, index, oldValue, getTransectFlights()); + } + + public void updateTransectFlight(TransectFlight transectFlight) { + int index = TransectFlightModel.indexOfTransectFlight( + getTransectFlights(), transectFlight); + getTransectFlights().get(index).setSource(transectFlight); + fireIndexedPropertyChange(PROPERTY_TRANSECT_FLIGHTS, index, getTransectFlights(), null); + + // Update instance in flight list + int flightIndex = getFlight().getTransectFlight().indexOf(transectFlight); + flight.getTransectFlight().set(flightIndex, transectFlight); + } + public List<GeoPoint> getGeoPoints() { if (geoPoints == null) { geoPoints = Lists.newArrayList(); @@ -423,7 +479,7 @@ } public void setGeoPoints(List<GeoPoint> geoPoints) { - List<GeoPoint> oldValue = Lists.newArrayList(getGeoPoints()); + List<GeoPoint> oldValue = ImmutableList.copyOf(getGeoPoints()); this.geoPoints = geoPoints; firePropertyChange(PROPERTY_GEO_POINTS, oldValue, geoPoints); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java 2012-09-01 09:51:22 UTC (rev 504) @@ -27,13 +27,12 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; -import fr.ulr.sammoa.persistence.Deletable; import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.persistence.Observer; import fr.ulr.sammoa.persistence.ObserverPosition; import fr.ulr.sammoa.persistence.Position; import fr.ulr.sammoa.persistence.TransectFlight; -import fr.ulr.sammoa.persistence.Validatable; +import fr.ulr.sammoa.persistence.Validable; import org.jdesktop.beans.AbstractSerializableBean; /** @@ -41,7 +40,7 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class TransectFlightModel extends AbstractSerializableBean implements Deletable, Validatable { +public class TransectFlightModel extends AbstractSerializableBean implements Validable { private static final long serialVersionUID = 1L; @@ -122,7 +121,6 @@ index = getFlight().getTransectFlight().size() - 1; } - getFlight().getTransectFlight().remove(getSource()); // Use add on Flight to fire change @@ -169,11 +167,13 @@ return flightModel.getFlight(); } - public static Predicate<TransectFlightModel> withTransectFlight(TransectFlight transectFlight) { - return new WithTransectFlightPredicate(transectFlight); + public static int indexOfTransectFlight(Iterable<TransectFlightModel> transectFlightModels, + TransectFlight transectFlight) { + return Iterables.indexOf( + transectFlightModels, new WithTransectFlightPredicate(transectFlight)); } - protected static class WithTransectFlightPredicate implements Predicate<TransectFlightModel> { + private static class WithTransectFlightPredicate implements Predicate<TransectFlightModel> { protected TransectFlight transectFlight; Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectTableModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectTableModel.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectTableModel.java 2012-09-01 09:51:22 UTC (rev 504) @@ -24,7 +24,6 @@ */ package fr.ulr.sammoa.ui.swing.flight; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.persistence.Observer; @@ -35,7 +34,7 @@ import fr.ulr.sammoa.persistence.TransectFlight; import fr.ulr.sammoa.ui.swing.util.SammoaUtil; -import javax.swing.*; +import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; import java.util.List; @@ -78,10 +77,8 @@ } public int getRowIndex(final TransectFlight transectFlight) { - int result = Iterables.indexOf( - getTransectFlights(), - TransectFlightModel.withTransectFlight(transectFlight) - ); + int result = TransectFlightModel.indexOfTransectFlight( + getTransectFlights(), transectFlight); return result; } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-09-01 09:51:22 UTC (rev 504) @@ -56,6 +56,7 @@ import fr.ulr.sammoa.ui.swing.util.ButtonActionTableCellEditorRenderer; import fr.ulr.sammoa.ui.swing.util.DeletedRowHighlightPredicate; import fr.ulr.sammoa.ui.swing.util.SammoaUtil; +import fr.ulr.sammoa.ui.swing.util.SelectionModelAdapter; import fr.ulr.sammoa.ui.swing.util.TableDataChangeListener; import fr.ulr.sammoa.ui.swing.util.TextCellEditor; import fr.ulr.sammoa.ui.swing.util.TimeCellEditor; @@ -86,10 +87,7 @@ import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListCellRenderer; -import javax.swing.ListSelectionModel; import javax.swing.border.LineBorder; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; @@ -122,10 +120,10 @@ protected static final Color DEVICE_ERROR_BACKGROUND_COLOR = Color.RED; public static final String ROUTE_VALIDATOR_CONTEXT_VALUE = - "routeimplValidator"; + "routeValidator"; public static final String OBSERVATION_VALIDATOR_CONTEXT_VALUE = - "observationimplValidator"; + "observationValidator"; protected boolean comboIsAdjusting; @@ -291,7 +289,7 @@ public void initRouteTable() { - FlightUIModel flightUIModel = ui.getFlightUIModel(); + final FlightUIModel flightUIModel = ui.getFlightUIModel(); JXTable table = ui.getRouteTable(); RouteTableModel tableModel = ui.getRouteTableModel(); @@ -336,52 +334,16 @@ n_("sammoa.observations.routeTable.column.deleted.tip") ); - init(table, new ListSelectionListener() { + init(table, new SelectionModelAdapter<Route>() { @Override - public void valueChanged(ListSelectionEvent e) { + public List<Route> getElements() { + return ui.getFlightUIModel().getRoutes(); + } - if (!e.getValueIsAdjusting()) { - - ListSelectionModel listSelectionModel = - (ListSelectionModel) e.getSource(); - int firstIndex = e.getFirstIndex(); - int lastIndex = e.getLastIndex(); - Integer newSelectedRow = null; - - if (listSelectionModel.isSelectionEmpty()) { - - // no selection - } else if (listSelectionModel.isSelectedIndex(firstIndex)) { - - // use first index - newSelectedRow = firstIndex; - } else if (listSelectionModel.isSelectedIndex(lastIndex)) { - - // use last index - newSelectedRow = lastIndex; - } - FlightUIModel flightUIModel = ui.getFlightUIModel(); - List<Route> routes = flightUIModel.getRoutes(); - Route route = null; - - if (newSelectedRow != null && - newSelectedRow < routes.size()) { - route = routes.get(newSelectedRow); - - if (logger.isInfoEnabled()) { - logger.info("Select route from index {}", newSelectedRow); - } - - } else { - if (logger.isInfoEnabled()) { - logger.info("No route selected"); - } - } - - // set new route in model to validate - flightUIModel.setRouteEditBean(route); - } + @Override + public void setSelectedElement(Route element) { + ui.getFlightUIModel().setRouteEditBean(element); } }); @@ -402,6 +364,9 @@ public void propertyChange(PropertyChangeEvent evt) { Route route = (Route) evt.getNewValue(); getParentUI().getHandler().getFlightController().setCurrentRoute(route); + + // no unselect but ensure valid button (a select will cause a loop) + flightUIModel.setObservationEditBean(null); } } ); @@ -500,53 +465,16 @@ n_("sammoa.observations.observationTable.column.circleback.tip") ); - init(table, new ListSelectionListener() { + init(table, new SelectionModelAdapter<Observation>() { @Override - public void valueChanged(ListSelectionEvent e) { + public List<Observation> getElements() { + return ui.getFlightUIModel().getObservations(); + } - FlightUIModel flightUIModel = ui.getFlightUIModel(); - - if (!e.getValueIsAdjusting()) { - - ListSelectionModel listSelectionModel = - (ListSelectionModel) e.getSource(); - int firstIndex = e.getFirstIndex(); - int lastIndex = e.getLastIndex(); - Integer newSelectedRow = null; - - if (listSelectionModel.isSelectionEmpty()) { - - // no selection - } else if (listSelectionModel.isSelectedIndex(firstIndex)) { - - // use first index - newSelectedRow = firstIndex; - } else if (listSelectionModel.isSelectedIndex(lastIndex)) { - - // use last index - newSelectedRow = lastIndex; - } - List<Observation> observations = flightUIModel.getObservations(); - Observation observation = null; - - if (newSelectedRow != null && - newSelectedRow < observations.size()) { - observation = observations.get(newSelectedRow); - - if (logger.isInfoEnabled()) { - logger.info("Select observation from index {}", newSelectedRow); - } - - } else { - if (logger.isInfoEnabled()) { - logger.info("No observation selected"); - } - } - - // set new observation in model to validate - flightUIModel.setObservationEditBean(observation); - } + @Override + public void setSelectedElement(Observation element) { + ui.getFlightUIModel().setObservationEditBean(element); } }); @@ -622,6 +550,9 @@ selectRouteByObservation(newValue); } +// else { +// SammoaUtil.unselectAll(ui.getObservationTable()); +// } } }); @@ -739,8 +670,8 @@ } } - public void init(final JXTable table, - ListSelectionListener selectionListener) { + public <T> void init(final JXTable table, + SelectionModelAdapter<T> selectionModelAdapter) { final Action moveToNextEditableCell = new MoveToNextEditableCellAction(table); final Action moveToPreviousEditableCell = new MoveToPreviousEditableCellAction(table); @@ -824,7 +755,7 @@ table.setDefaultEditor(Date.class, new TimeCellEditor(datePicker)); } - table.getSelectionModel().addListSelectionListener(selectionListener); + SammoaUtil.addTableSelectionListener(table, selectionModelAdapter); SwingUtil.scrollToTableSelection(table); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DeletedRowHighlightPredicate.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DeletedRowHighlightPredicate.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DeletedRowHighlightPredicate.java 2012-09-01 09:51:22 UTC (rev 504) @@ -23,7 +23,7 @@ * #L% */ -import fr.ulr.sammoa.persistence.Deletable; +import fr.ulr.sammoa.persistence.Validable; import java.util.List; @@ -34,9 +34,9 @@ */ public class DeletedRowHighlightPredicate extends AbstractRowHighlightPredicate { - protected List<? extends Deletable> model; + protected List<? extends Validable> model; - public DeletedRowHighlightPredicate(List<? extends Deletable> model) { + public DeletedRowHighlightPredicate(List<? extends Validable> model) { this.model = model; } @@ -47,7 +47,7 @@ } @Override - protected Deletable getValueAt(int rowIndex) { + protected Validable getValueAt(int rowIndex) { return model.get(rowIndex); } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-09-01 09:51:22 UTC (rev 504) @@ -67,6 +67,20 @@ // never instanciate util class } + public static void unselectAll(JTable table) { + int size = table.getRowCount(); + if (size > 0) { + table.removeRowSelectionInterval(0, size - 1); + } + } + + public static <T> TableSelectionListener<T> addTableSelectionListener(JTable table, + SelectionModelAdapter<T> selectionModelAdapter) { + TableSelectionListener<T> result = new TableSelectionListener<T>(selectionModelAdapter); + table.getSelectionModel().addListSelectionListener(result); + return result; + } + public static Highlighter newBackgroundColorHighlighter(HighlightPredicate predicate, Color color) { return new SammoaColorHighlighter(predicate, color, false); } Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java 2012-09-01 09:51:22 UTC (rev 504) @@ -0,0 +1,17 @@ +package fr.ulr.sammoa.ui.swing.util; + +import java.util.List; + +/** + * Created: 31/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + * @see TableSelectionListener + */ +public interface SelectionModelAdapter<T> { + + List<T> getElements(); + + void setSelectedElement(T element); + +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SelectionModelAdapter.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java 2012-09-01 09:51:22 UTC (rev 504) @@ -65,6 +65,25 @@ if (evt.getOldValue() == null) { tableModel.fireTableDataChanged(); + // UPDATE : we use null newValue to fire update + } else if (evt.getNewValue() == null) { + + int oldSize = ((Collection) evt.getOldValue()).size(); + + int rowIndex; + if (evt instanceof IndexedPropertyChangeEvent) { + rowIndex = ((IndexedPropertyChangeEvent) evt).getIndex(); + } else { + rowIndex = -1; + } + + if (rowIndex == -1) { + tableModel.fireTableRowsUpdated(0, oldSize - 1); + + } else { + tableModel.fireTableRowsUpdated(rowIndex, rowIndex); + } + } else { int oldSize = ((Collection) evt.getOldValue()).size(); Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java 2012-09-01 09:51:22 UTC (rev 504) @@ -0,0 +1,71 @@ +package fr.ulr.sammoa.ui.swing.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.util.List; + +/** + * Created: 31/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public class TableSelectionListener<T> implements ListSelectionListener { + + private static final Logger logger = LoggerFactory.getLogger(TableSelectionListener.class); + + protected SelectionModelAdapter<T> selectionModelAdapter; + + public TableSelectionListener(SelectionModelAdapter<T> selectionModelAdapter) { + this.selectionModelAdapter = selectionModelAdapter; + } + + @Override + public void valueChanged(ListSelectionEvent e) { + + if (!e.getValueIsAdjusting()) { + + ListSelectionModel listSelectionModel = + (ListSelectionModel) e.getSource(); + int firstIndex = e.getFirstIndex(); + int lastIndex = e.getLastIndex(); + Integer newSelectedRow = null; + + if (listSelectionModel.isSelectionEmpty()) { + + // no selection + } else if (listSelectionModel.isSelectedIndex(firstIndex)) { + + // use first index + newSelectedRow = firstIndex; + } else if (listSelectionModel.isSelectedIndex(lastIndex)) { + + // use last index + newSelectedRow = lastIndex; + } + List<T> elements = selectionModelAdapter.getElements(); + T element = null; + + if (newSelectedRow != null && + newSelectedRow < elements.size()) { + element = elements.get(newSelectedRow); + + if (logger.isInfoEnabled()) { + logger.info("Select {} from index {}", + element.getClass().getSimpleName(), newSelectedRow); + } + + } else { + if (logger.isInfoEnabled()) { + logger.info("No element selected"); + } + } + + // set new element in adapter + selectionModelAdapter.setSelectedElement(element); + } + } +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableSelectionListener.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ValidRowHighlightPredicate.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ValidRowHighlightPredicate.java 2012-09-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ValidRowHighlightPredicate.java 2012-09-01 09:51:22 UTC (rev 504) @@ -23,7 +23,7 @@ * #L% */ -import fr.ulr.sammoa.persistence.Validatable; +import fr.ulr.sammoa.persistence.Validable; import java.util.List; @@ -34,9 +34,9 @@ */ public class ValidRowHighlightPredicate extends AbstractRowHighlightPredicate { - protected List<? extends Validatable> model; + protected List<? extends Validable> model; - public ValidRowHighlightPredicate(List<? extends Validatable> model) { + public ValidRowHighlightPredicate(List<? extends Validable> model) { this.model = model; } @@ -47,7 +47,7 @@ } @Override - protected Validatable getValueAt(int rowIndex) { + protected Validable getValueAt(int rowIndex) { return model.get(rowIndex); } } 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-01 09:51:00 UTC (rev 503) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-01 09:51:22 UTC (rev 504) @@ -52,6 +52,8 @@ sammoa.action.validObservation.tip=Validate the selected observation sammoa.action.validRoute=Route sammoa.action.validRoute.tip=Validate the selected route and all its observations +sammoa.action.validTransect=Transect +sammoa.action.validTransect.tip=Validate the selected transect and all its routes and observations sammoa.action.validation=Validation sammoa.config.category.applications=Application sammoa.config.category.applications.description=Application
participants (1)
-
fdesbois@users.forge.codelutin.com