Author: fdesbois Date: 2012-09-07 13:43:11 +0200 (Fri, 07 Sep 2012) New Revision: 552 Url: http://forge.codelutin.com/repositories/revision/sammoa/552 Log: fixes #1465 : resolve issue with deleted on nextTransect + improve action bindings Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.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/action/BaseFlightAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/BeginAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/NextAction.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 Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-09-07 08:48:22 UTC (rev 551) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-09-07 11:43:11 UTC (rev 552) @@ -356,8 +356,9 @@ isOffEffort(), "You can call begin() only if flight is running (started, not ended, not on effort)"); Preconditions.checkState( - nextTransect != null, "You can't call begin() if no transect is selected. " + - "Call setNextTransect() method first"); + nextTransect != null && !nextTransect.isDeleted(), + "You can't call begin() if no transect is selected or if it is " + + "deleted. Call setNextTransect() method first"); TopiaContext tx = beginTransaction(); try { 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-07 08:48:22 UTC (rev 551) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-09-07 11:43:11 UTC (rev 552) @@ -613,7 +613,7 @@ // use it as next one boolean result = Routes.isAnyMatchTransectFlight( getModel().getRoutes(), transectFlight); - return !result; + return !transectFlight.isDeleted() && !result; } }); Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/BaseFlightAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/BaseFlightAction.java 2012-09-07 08:48:22 UTC (rev 551) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/BaseFlightAction.java 2012-09-07 11:43:11 UTC (rev 552) @@ -23,16 +23,23 @@ */ package fr.ulr.sammoa.ui.swing.flight.action; +import com.google.common.base.Splitter; import fr.ulr.sammoa.application.flightController.FlightController; import fr.ulr.sammoa.ui.swing.SammoaUIContext; import fr.ulr.sammoa.ui.swing.flight.FlightUIHandler; import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; +import fr.ulr.sammoa.ui.swing.util.SammoaUtil; import jaxx.runtime.JAXXContext; +import org.jdesktop.beans.AbstractBean; +import org.nuiton.topia.persistence.TopiaEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.swing.AbstractAction; import javax.swing.Icon; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.Iterator; /** * Created: 03/07/12 @@ -41,6 +48,9 @@ */ public abstract class BaseFlightAction extends AbstractAction { + /** Logger. */ + private static final Logger logger = LoggerFactory.getLogger(BaseFlightAction.class); + protected JAXXContext context; public BaseFlightAction(String name, Icon icon, JAXXContext context) { @@ -76,17 +86,94 @@ protected void bindModelProperties(String... properties) { for (String property : properties) { - getModel().addPropertyChangeListener(property, enabledListener); + EnabledListener enabledListener = new EnabledListener(property); + getModel().addPropertyChangeListener(enabledListener.getProperty(), enabledListener); } } - protected PropertyChangeListener enabledListener = new PropertyChangeListener() { + protected class EnabledListener implements PropertyChangeListener { + protected String property; + + protected EnabledListener embeddedListener; + + public EnabledListener(String property) { + + if (logger.isDebugEnabled()) { + logger.debug("[{}] New EnabledListener for property '{}'", + BaseFlightAction.this.getClass().getSimpleName(), + property); + } + + // Init embeddedListener for nestedProperty + if (property.contains(".")) { + Iterator<String> it = + Splitter.on(".").limit(2).split(property).iterator(); + + // First element is the property + this.property = it.next(); + + // Next property is the nested one + String nestedProperty = it.next(); + if (logger.isDebugEnabled()) { + logger.debug("[{}] Add embedded EnabledListener for " + + "nestedProperty '{}', this EnabledListener " + + "attached to '{}'", + new Object[] { + BaseFlightAction.this.getClass().getSimpleName(), + nestedProperty, + this.property + }); + } + this.embeddedListener = new EnabledListener(nestedProperty); + + // Attach embedded on the current value from model + Object currentValue = + SammoaUtil.getPropertyValue(getModel(), this.property); + attachEmbeddedListener(null, currentValue); + + } else { + this.property = property; + } + } + + public String getProperty() { + return property; + } + @Override public void propertyChange(PropertyChangeEvent evt) { + if (embeddedListener != null) { + attachEmbeddedListener(evt.getOldValue(), evt.getNewValue()); + } setEnabled(checkEnabled()); } - }; + protected void attachEmbeddedListener(Object oldValue, Object newValue) { + + if (oldValue != null) { + if (oldValue instanceof TopiaEntity) { + TopiaEntity entity = (TopiaEntity) oldValue; + entity.removePropertyChangeListener(embeddedListener.getProperty(), embeddedListener); + + } else if (oldValue instanceof AbstractBean) { + AbstractBean entity = (AbstractBean) oldValue; + entity.removePropertyChangeListener(embeddedListener.getProperty(), embeddedListener); + } + } + + if (newValue != null) { + if (newValue instanceof TopiaEntity) { + TopiaEntity entity = (TopiaEntity) newValue; + entity.addPropertyChangeListener(embeddedListener.getProperty(), embeddedListener); + + } else if (newValue instanceof AbstractBean) { + AbstractBean entity = (AbstractBean) newValue; + entity.addPropertyChangeListener(embeddedListener.getProperty(), embeddedListener); + } + } + } + } + protected abstract boolean checkEnabled(); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/BeginAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/BeginAction.java 2012-09-07 08:48:22 UTC (rev 551) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/BeginAction.java 2012-09-07 11:43:11 UTC (rev 552) @@ -50,7 +50,7 @@ bindModelProperties( FlightUIModel.PROPERTY_FLIGHT_STATE, FlightUIModel.PROPERTY_CURRENT_ROUTE, - FlightUIModel.PROPERTY_NEXT_TRANSECT + FlightUIModel.PROPERTY_NEXT_TRANSECT + ".deleted" ); } @@ -67,6 +67,7 @@ TransectFlight nextTransect = getModel().getNextTransect(); boolean isReadyForLeg = nextTransect != null + && !nextTransect.isDeleted() && getModel().getFlightState() == FlightState.OFF_EFFORT; return isCircleBack || isReadyForLeg; Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/NextAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/NextAction.java 2012-09-07 08:48:22 UTC (rev 551) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/NextAction.java 2012-09-07 11:43:11 UTC (rev 552) @@ -44,7 +44,8 @@ public NextAction(JAXXContext context) { super(_("sammoa.action.next"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.next.tip")); - bindModelProperties(FlightUIModel.PROPERTY_FLIGHT_STATE, FlightUIModel.PROPERTY_NEXT_TRANSECT); + bindModelProperties(FlightUIModel.PROPERTY_FLIGHT_STATE, + FlightUIModel.PROPERTY_NEXT_TRANSECT + ".deleted"); } @Override @@ -55,6 +56,7 @@ @Override protected boolean checkEnabled() { return getModel().getFlightState() == FlightState.ON_EFFORT - && getModel().getNextTransect() != null; + && getModel().getNextTransect() != null + && !getModel().getNextTransect().isDeleted(); } } 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 08:48:22 UTC (rev 551) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidAction.java 2012-09-07 11:43:11 UTC (rev 552) @@ -31,15 +31,11 @@ import fr.ulr.sammoa.persistence.Validable; import fr.ulr.sammoa.ui.swing.SammoaUIContext; import jaxx.runtime.JAXXContext; -import org.jdesktop.beans.AbstractBean; -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; /** @@ -109,47 +105,47 @@ return getValidator(Observation.class); } - protected <E extends TopiaEntity & Validable> void bindValidableEntity(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); - } - }); - } - - protected <E extends AbstractBean & Validable> void bindValidableModel(String propertyName, - Class<E> propertyClass) { - - getModel().addPropertyChangeListener(propertyName, new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - AbstractBean oldValue = (AbstractBean) evt.getOldValue(); - if (oldValue != null) { - oldValue.removePropertyChangeListener( - "deleted", enabledListener); - } - AbstractBean newValue = (AbstractBean) evt.getNewValue(); - if (newValue != null) { - newValue.addPropertyChangeListener( - "deleted", enabledListener); - } - enabledListener.propertyChange(evt); - } - }); - } +// protected <E extends TopiaEntity & Validable> void bindValidableEntity(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); +// } +// }); +// } +// +// protected <E extends AbstractBean & Validable> void bindValidableModel(String propertyName, +// Class<E> propertyClass) { +// +// getModel().addPropertyChangeListener(propertyName, new PropertyChangeListener() { +// +// @Override +// public void propertyChange(PropertyChangeEvent evt) { +// AbstractBean oldValue = (AbstractBean) evt.getOldValue(); +// if (oldValue != null) { +// oldValue.removePropertyChangeListener( +// "deleted", enabledListener); +// } +// AbstractBean newValue = (AbstractBean) 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/flight/action/ValidObservationAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidObservationAction.java 2012-09-07 08:48:22 UTC (rev 551) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidObservationAction.java 2012-09-07 11:43:11 UTC (rev 552) @@ -50,7 +50,7 @@ public ValidObservationAction(JAXXContext context) { super(_("sammoa.action.validObservation"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validObservation.tip")); - bindValidableEntity(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class); + bindModelProperties(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN + ".deleted"); } @Override 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 08:48:22 UTC (rev 551) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidRouteAction.java 2012-09-07 11:43:11 UTC (rev 552) @@ -24,7 +24,6 @@ */ import fr.ulr.sammoa.application.FlightService; -import fr.ulr.sammoa.persistence.Observation; import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.persistence.Routes; import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; @@ -54,8 +53,8 @@ public ValidRouteAction(JAXXContext context) { super(_("sammoa.action.validRoute"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validRoute.tip")); - bindValidableEntity(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class); - bindValidableEntity(FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, Route.class); + bindModelProperties(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN + ".deleted", + FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN + ".deleted"); } @Override 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 08:48:22 UTC (rev 551) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/ValidTransectAction.java 2012-09-07 11:43:11 UTC (rev 552) @@ -24,7 +24,6 @@ */ 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; @@ -56,9 +55,9 @@ public ValidTransectAction(JAXXContext context) { super(_("sammoa.action.validTransect"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validTransect.tip")); - bindValidableEntity(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, Observation.class); - bindValidableEntity(FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, Route.class); - bindValidableModel(FlightUIModel.PROPERTY_TRANSECT_FLIGHT_EDIT_BEAN, TransectFlightModel.class); + bindModelProperties(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN + ".deleted", + FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN + ".deleted", + FlightUIModel.PROPERTY_TRANSECT_FLIGHT_EDIT_BEAN + ".deleted"); } @Override