r472 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-application/src/main/java/fr/ulr/sammoa/application/device sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController sammoa-application/src/main/resources/i18n sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-persistence/src/test/java/
Author: fdesbois Date: 2012-08-24 19:13:35 +0200 (Fri, 24 Aug 2012) New Revision: 472 Url: http://forge.codelutin.com/repositories/revision/sammoa/472 Log: refs #1204 : - add validation bar - add valid actions - improve audioReaderMock - improve all actions Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/DeviceAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/FlightAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAudioAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAudioAction.java 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 Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceState.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsConfig.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightImpl.java trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/ObservationsTest.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/AddAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/BeginAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/EndAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextTransectAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/SammoaAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/DeviceStateLED.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/observations/EffortPanelHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.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/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/SammoaConfig.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-24 17:13:35 UTC (rev 472) @@ -77,6 +77,10 @@ public static final String PROPERTY_CIRCLE_BACK = "circleBack"; + public static final String PROPERTY_VALID_ROUTE = "validRoute"; + + public static final String PROPERTY_VALID_OBSERVATION = "validObservation"; + public static final String PROPERTY_GPS_CONFIG = "gpsConfig"; /** Delegate application config object containing configuration. */ @@ -413,7 +417,7 @@ "true", Boolean.class ), - /** Time in seconds before timeout (ERROR, NO_DEVICE) */ + /** Time in seconds before timeout (ERROR, UNAVAILABLE) */ CAMPAIGN_ID("campaign.id", n_("sammoa.config.campaign.id"), null, @@ -489,6 +493,21 @@ KeyStroke.class, false, false), + + KEY_VALID_ROUTE("ui." + PROPERTY_VALID_ROUTE, + n_("sammoa.config.ui.validRoute"), + "alt pressed R", + KeyStroke.class, + false, + false), + + KEY_VALID_OBSERVATION("ui." + PROPERTY_VALID_OBSERVATION, + n_("sammoa.config.ui.validObservation"), + "alt pressed O", + KeyStroke.class, + false, + false), + CSV_SEPARATOR("sammoa.csv.separator", n_("sammoa.config.csv.separator"), ";", char.class); Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java (rev 0) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-08-24 17:13:35 UTC (rev 472) @@ -0,0 +1,199 @@ +package fr.ulr.sammoa.application; +/* + * #%L + * SAMMOA :: Application + * $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.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; +import fr.ulr.sammoa.persistence.ObserverPositionDAO; +import fr.ulr.sammoa.persistence.Route; +import fr.ulr.sammoa.persistence.RouteDAO; +import fr.ulr.sammoa.persistence.SammoaDAOHelper; +import fr.ulr.sammoa.persistence.TransectFlight; +import fr.ulr.sammoa.persistence.TransectFlightDAO; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.TopiaRuntimeException; + +import java.util.List; + +/** + * Created: 23/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public class ValidationService extends SammoaServiceSupport { + + public void validateTransect(Flight flight, + TransectFlight transectFlight) { + + TopiaContext tx = beginTransaction(); + try { + + TransectFlightDAO transectFlightDAO = SammoaDAOHelper.getTransectFlightDAO(tx); + TransectFlight transectFlightExists = transectFlightDAO.findByTopiaId(transectFlight.getTopiaId()); + + boolean valid = !transectFlight.isValid(); + + if (transectFlightExists.isDeleted()) { + + 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); + + } else { + + RouteDAO routeDAO = SammoaDAOHelper.getRouteDAO(tx); + List<Route> routes = routeDAO.findAllByTransectFlight(transectFlightExists); + + for (Route route : routes) { + validateRoute(tx, route, valid); + } + + transectFlightExists.setValid(valid); + transectFlightDAO.update(transectFlightExists); + } + + tx.commitTransaction(); + + transectFlight.setValid(valid); + + } catch (TopiaException ex) { + throw new TopiaRuntimeException(ex); + } finally { + endTransaction(tx); + } + } + + public void validateRoute(Route route) { + + TopiaContext tx = beginTransaction(); + try { + + RouteDAO routeDAO = SammoaDAOHelper.getRouteDAO(tx); + Route routeExists = routeDAO.findByTopiaId(route.getTopiaId()); + + boolean valid = !route.isValid(); + + validateRoute(tx, routeExists, valid); + + tx.commitTransaction(); + + route.setValid(valid); + + } catch (TopiaException ex) { + throw new TopiaRuntimeException(ex); + } finally { + endTransaction(tx); + } + } + + public void validateObservation(Observation observation) { + + TopiaContext tx = beginTransaction(); + try { + + ObservationDAO dao = SammoaDAOHelper.getObservationDAO(tx); + Observation observationExists = + dao.findByTopiaId(observation.getTopiaId()); + + boolean valid = !observation.isValid(); + + validateObservation(tx, observationExists, valid); + + tx.commitTransaction(); + + observation.setValid(valid); + + } catch (TopiaException ex) { + throw new TopiaRuntimeException(ex); + } finally { + endTransaction(tx); + } + } + + protected void validateRoute(TopiaContext tx, + Route route, + boolean valid) + throws TopiaException { + + RouteDAO routeDAO = SammoaDAOHelper.getRouteDAO(tx); + + if (route.isDeleted()) { + + // TODO-fdesbois-2012-08-23 : manage observerPosition attached to observations + ObserverPositionDAO observerPositionDAO = SammoaDAOHelper.getObserverPositionDAO(tx); + observerPositionDAO.deleteAll(route.getObserverPosition()); + + routeDAO.delete(route); + + } else { + + Flight flight = route.getFlight(); + + List<Route> routes = routeDAO.findAllByFlight(flight); + + ObservationDAO observationDAO = SammoaDAOHelper.getObservationDAO(tx); + List<Observation> observations = observationDAO.findAllByFlight(flight); + + Iterable<Observation> routeObservations = + Observations.filterInRoute(observations, route, routes, true); + + for (Observation observation : routeObservations) { + validateObservation(tx, observation, valid); + } + + route.setValid(valid); + routeDAO.update(route); + } + } + + protected void validateObservation(TopiaContext tx, + Observation observation, + boolean valid) + throws TopiaException { + + ObservationDAO dao = SammoaDAOHelper.getObservationDAO(tx); + + if (observation.isDeleted()) { + + dao.delete(observation); + + } else { + + observation.setValid(valid); + dao.update(observation); + } + } + +} Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-08-24 17:13:35 UTC (rev 472) @@ -1,5 +1,29 @@ package fr.ulr.sammoa.application.device; +/* + * #%L + * SAMMOA :: Application + * $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 com.google.common.base.Preconditions; import com.google.common.base.Supplier; import com.google.common.base.Throwables; import com.google.common.collect.Sets; @@ -54,6 +78,7 @@ } public <T extends DeviceManager> T getDeviceManager(Class<T> deviceManagerClass) { + Preconditions.checkNotNull(deviceManagerClass); for (DeviceManager deviceManager : deviceManagers) { if (deviceManagerClass.isAssignableFrom(deviceManager.getClass())) { return (T) deviceManager; Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceState.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceState.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceState.java 2012-08-24 17:13:35 UTC (rev 472) @@ -31,11 +31,11 @@ */ public enum DeviceState { /** voyant gris : pas de peripherique */ - NO_DEVICE, + UNAVAILABLE, /** voyant bleu : peripherique prêt */ READY, - /** voyant vert : reception de données */ - RECORDING, + /** voyant vert : reception des données ou lecture en cours */ + RUNNING, /** voyant rouge clignotant : périphirique prêt mais aucune données */ ERROR } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReader.java 2012-08-24 17:13:35 UTC (rev 472) @@ -1,4 +1,27 @@ package fr.ulr.sammoa.application.device.audio; +/* + * #%L + * SAMMOA :: Application + * $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.device.DeviceManager; @@ -18,6 +41,9 @@ /** @param file Audio file to load, then you can call start() and stop() */ void load(File file); + /** Unload the current audio file */ + void unload(); + /** @return loaded audio in milliseconds or 0 if no audio is loaded */ long getLength(); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioReaderMock.java 2012-08-24 17:13:35 UTC (rev 472) @@ -1,12 +1,37 @@ package fr.ulr.sammoa.application.device.audio; +/* + * #%L + * SAMMOA :: Application + * $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 com.google.common.base.Preconditions; +import com.google.common.collect.Sets; import fr.ulr.sammoa.application.device.DeviceState; +import fr.ulr.sammoa.application.device.DeviceStateEvent; import fr.ulr.sammoa.application.device.DeviceStateListener; import fr.ulr.sammoa.application.device.DeviceTechnicalException; import javax.sound.sampled.AudioFileFormat; import java.io.File; -import java.util.Collections; import java.util.Set; /** @@ -18,6 +43,10 @@ protected long position; + protected DeviceState state = DeviceState.UNAVAILABLE; + + protected Set<DeviceStateListener> listeners = Sets.newHashSet(); + @Override public AudioFileFormat.Type getOutputType() { return AudioFileFormat.Type.WAVE; @@ -25,9 +54,19 @@ @Override public void load(File file) { + Preconditions.checkNotNull(file); + Preconditions.checkArgument(file.exists()); + unload(); + setState(DeviceState.READY); } @Override + public void unload() { + stop(); + setState(DeviceState.UNAVAILABLE); + } + + @Override public long getLength() { return 0; } @@ -44,35 +83,55 @@ @Override public void open() throws DeviceTechnicalException { + // no state set here, only open device and throw error } @Override public void start() { + if (state == DeviceState.READY) { + setState(DeviceState.RUNNING); + } } @Override public void stop() { + if (state == DeviceState.RUNNING) { + setState(DeviceState.READY); + } } @Override public void close() throws DeviceTechnicalException { + unload(); } @Override public DeviceState getState() { - return DeviceState.READY; + return state; } + protected void setState(DeviceState state) { + DeviceState oldValue = getState(); + this.state = state; + + DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state); + for (DeviceStateListener listener : listeners) { + listener.stateChanged(event); + } + } + @Override public void addDeviceStateListener(DeviceStateListener listener) { + listeners.add(listener); } @Override public void removeDeviceStateListener(DeviceStateListener listener) { + listeners.remove(listener); } @Override public Set<DeviceStateListener> getDeviceStateListeners() { - return Collections.emptySet(); + return listeners; } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderDefault.java 2012-08-24 17:13:35 UTC (rev 472) @@ -121,7 +121,7 @@ this.audioFormat = audioFormat; this.outputType = outputType; this.listeners = Sets.newHashSet(); - this.state = DeviceState.NO_DEVICE; + this.state = DeviceState.UNAVAILABLE; } @Override @@ -134,9 +134,9 @@ this.state = state; // Fire on listeners + DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state); + event.setError(error); for (DeviceStateListener listener : listeners) { - DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state); - event.setError(error); listener.stateChanged(event); } } @@ -183,19 +183,19 @@ } } catch (IllegalArgumentException e) { - setState(DeviceState.NO_DEVICE, null); + setState(DeviceState.UNAVAILABLE, null); throw new DeviceTechnicalException(this, "Can't open audio device", e); } catch (IllegalStateException e) { - setState(DeviceState.NO_DEVICE, null); + setState(DeviceState.UNAVAILABLE, null); throw new DeviceTechnicalException(this, "Can't open audio device", e); } catch (SecurityException e) { - setState(DeviceState.NO_DEVICE, null); + setState(DeviceState.UNAVAILABLE, null); throw new DeviceTechnicalException(this, "Can't open audio device", e); } catch (LineUnavailableException e) { - setState(DeviceState.NO_DEVICE, null); + setState(DeviceState.UNAVAILABLE, null); throw new DeviceTechnicalException(this, "Can't open audio device", e); } } @@ -218,7 +218,7 @@ @Override public void record(File outputFile, long delaySeconds) { - if (DeviceState.NO_DEVICE == state) { + if (DeviceState.UNAVAILABLE == state) { if (logger.isWarnEnabled()) { logger.warn("Can't record " + outputFile.getAbsolutePath() + ", no available dataLine"); } @@ -285,7 +285,7 @@ @Override public void stop() { - if (getState() != DeviceState.NO_DEVICE) { + if (getState() != DeviceState.UNAVAILABLE) { logger.info("Stop audio line reading"); @@ -311,7 +311,7 @@ dataLine.close(); dataLine = null; - setState(DeviceState.NO_DEVICE, null); + setState(DeviceState.UNAVAILABLE, null); } } @@ -341,7 +341,7 @@ if (!recorders.isEmpty()) { - setState(DeviceState.RECORDING, null); + setState(DeviceState.RUNNING, null); numBytesRead = dataLine.read(buffer, 0, bufferSize); synchronized (recorders) { Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/AudioRecorderMock.java 2012-08-24 17:13:35 UTC (rev 472) @@ -43,7 +43,7 @@ @Override public DeviceState getState() { - return DeviceState.NO_DEVICE; + return DeviceState.UNAVAILABLE; } @Override Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-24 17:13:35 UTC (rev 472) @@ -41,7 +41,7 @@ * Base class for {@link GpsHandler} interface. This class contains common behaviour * for automatic check on a given {@code period}. For that, this class contains * a {@link TimerTask} scheduled from {@link #start()}. The {@link #open()} method - * will be called on start if state is still {@link DeviceState#NO_DEVICE}. + * will be called on start if state is still {@link DeviceState#UNAVAILABLE}. * The method {@link #getCurrentLocation()} must return null if the location doesn't * change or the GPS is down. * <p/> @@ -76,7 +76,7 @@ public BaseGpsHandler(GpsConfig config) { this.config = config; - this.state = DeviceState.NO_DEVICE; + this.state = DeviceState.UNAVAILABLE; this.deviceStateListeners = Sets.newHashSet(); this.gpsLocationListeners = Sets.newHashSet(); this.nbFailuresMax = @@ -161,9 +161,9 @@ this.state = state; // Fire on listeners + DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state); + event.setError(error); for (DeviceStateListener listener : deviceStateListeners) { - DeviceStateEvent event = new DeviceStateEvent(this, oldValue, state); - event.setError(error); listener.stateChanged(event); } } @@ -232,7 +232,7 @@ // GPS is recording } else { - setState(DeviceState.RECORDING, null); + setState(DeviceState.RUNNING, null); // Fire events for location change for (GpsLocationListener listener : gpsLocationListeners) { Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-08-24 17:13:35 UTC (rev 472) @@ -64,19 +64,19 @@ // Timer timer = new Timer(); // timer.schedule(new TimerTask() { // protected Random r = new Random(); -// protected DeviceState currentState = DeviceState.NO_DEVICE; +// protected DeviceState currentState = DeviceState.UNAVAILABLE; // // @Override // public void run() { // DeviceState newState = currentState; // if (r.nextInt(32) > 25) { -// newState = DeviceState.NO_DEVICE; +// newState = DeviceState.UNAVAILABLE; // } else { // if (started) { // if (r.nextInt(32) > 25) { // newState = DeviceState.ERROR; // } else { -// newState = DeviceState.RECORDING; +// newState = DeviceState.RUNNING; // } // } else { // newState = DeviceState.READY; @@ -114,7 +114,7 @@ @Override public void close() throws DeviceTechnicalException { - setState(DeviceState.NO_DEVICE, null); + setState(DeviceState.UNAVAILABLE, null); } @Override Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsConfig.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsConfig.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsConfig.java 2012-08-24 17:13:35 UTC (rev 472) @@ -101,7 +101,7 @@ "2", Integer.class ), - /** Time in seconds before timeout (ERROR, NO_DEVICE) */ + /** Time in seconds before timeout (ERROR, UNAVAILABLE) */ GPS_TIMEOUT("gps.timeout", n_("sammoa.config.gps.timeout"), "10", Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-08-24 17:13:35 UTC (rev 472) @@ -122,7 +122,7 @@ } catch (GPSException ex) { - setState(DeviceState.NO_DEVICE, null); + setState(DeviceState.UNAVAILABLE, null); throw new DeviceTechnicalException(this, "Can't open GPS device", ex); } @@ -133,7 +133,7 @@ stop(); - if (gpsDataProcessor != null && getState() != DeviceState.NO_DEVICE) { + if (gpsDataProcessor != null && getState() != DeviceState.UNAVAILABLE) { logger.info("Closing GPS device..."); try { @@ -144,7 +144,7 @@ logger.info("GPS device is closed"); - setState(DeviceState.NO_DEVICE, null); + setState(DeviceState.UNAVAILABLE, null); opened = false; } catch (GPSException e) { Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-08-24 17:13:35 UTC (rev 472) @@ -1,4 +1,27 @@ package fr.ulr.sammoa.application.flightController; +/* + * #%L + * SAMMOA :: Application + * $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 com.google.common.base.Preconditions; import fr.ulr.sammoa.application.device.DeviceManager; @@ -104,7 +127,9 @@ protected GeoPoint getLocation(TopiaContext tx) throws TopiaException { GeoPoint result = gpsHandler.getCurrentLocation(); result.setFlight(flight); - SammoaDAOHelper.getGeoPointDAO(tx).create(result); + if (result.getTopiaId() == null) { + SammoaDAOHelper.getGeoPointDAO(tx).create(result); + } return result; } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-08-24 17:13:35 UTC (rev 472) @@ -1,4 +1,27 @@ package fr.ulr.sammoa.application.flightController; +/* + * #%L + * SAMMOA :: Application + * $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 com.google.common.base.Preconditions; import fr.ulr.sammoa.application.device.DeviceManager; @@ -59,18 +82,6 @@ } @Override - public void setCurrentRoute(Route currentRoute) { - super.setCurrentRoute(currentRoute); - - if (currentRoute != null) { - - File file = flightStorage.getAudioFile(currentRoute, - audioReader.getOutputType().getExtension()); - audioReader.load(file); - } - } - - @Override protected GeoPoint getLocation(TopiaContext tx) throws TopiaException { Preconditions.checkNotNull(currentRoute, "You must set the current route to retrieve location"); @@ -157,6 +168,19 @@ logger.debug("Add route {} to cache", Routes.toString(event.getRoute())); } routes.add(event.getRoute()); + + } else { + + audioReader.unload(); + if (currentRoute != null) { + + File file = flightStorage.getAudioFile( + currentRoute, audioReader.getOutputType().getExtension()); + + if (file.exists()) { + audioReader.load(file); + } + } } } @@ -174,4 +198,12 @@ public void onObservationAdded(ObservationEvent event) { // nothing to do } + + @Override + protected void fireRouteAdded(Route previousRoute, Route newRoute) { + + // Ensure previous, it could be different from argument because + // the audio time could overflow on more than one route + super.fireRouteAdded(Routes.findPrevious(routes, newRoute), newRoute); + } } Modified: trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties =================================================================== --- trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-24 17:13:35 UTC (rev 472) @@ -28,6 +28,8 @@ sammoa.config.ui.rightObservation=Observation from the right place sammoa.config.ui.start=Start sammoa.config.ui.stop=Stop +sammoa.config.ui.validObservation=Validate the selected observation +sammoa.config.ui.validRoute=Validate the selected route sammoa.copyright.text=Copyright CRMM 2012 sammoa.datePattern=dd/MM/yyyy sammoa.dateTimePattern=dd/MM/yyyy HH\:mm\:ss 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-08-24 17:13:35 UTC (rev 472) @@ -63,6 +63,13 @@ return Sets.newHashSet(Iterables.transform(observations, TO_OBSERVER_POSITION_FUNCTION)); } + public static Iterable<Observation> filterInRoute(Iterable<Observation> observations, + Route route, + Iterable<Route> routes, + boolean ignoreDeleted) { + return Iterables.filter(observations, inRoute(route, routes, ignoreDeleted)); + } + public static Observation findFirstInRoute(Iterable<Observation> observations, Route route, Iterable<Route> routes, @@ -75,7 +82,7 @@ } else { result = FluentIterable.from(observations) - .filter(Observations.inRoute(route, routes, ignoreDeleted)) + .filter(inRoute(route, routes, ignoreDeleted)) .first() .orNull(); } Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightImpl.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightImpl.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightImpl.java 2012-08-24 17:13:35 UTC (rev 472) @@ -74,16 +74,6 @@ } @Override - public int getIndexInFlight() { - return 0; //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public void setIndexInFlight(int indexInFlight) { - //To change body of implemented methods use File | Settings | File Templates. - } - - @Override public void setObserverByPosition(Position position, Observer observer) { ObserverPosition observerPositionToUpdate = getObserverPositionByPosition(position); Modified: trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/ObservationsTest.java =================================================================== --- trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/ObservationsTest.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/ObservationsTest.java 2012-08-24 17:13:35 UTC (rev 472) @@ -1,4 +1,27 @@ package fr.ulr.sammoa.persistence; +/* + * #%L + * SAMMOA :: Persistence + * $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 com.google.common.collect.Lists; import junit.framework.Assert; Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-24 17:13:35 UTC (rev 472) @@ -320,6 +320,10 @@ helper.setOptionCallBack("actions"); helper.addOption(SammoaConfig.SammoaConfigOption.KEY_CIRCLE_BACK); helper.setOptionCallBack("actions"); + helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_OBSERVATION); + helper.setOptionCallBack("actions"); + helper.addOption(SammoaConfig.SammoaConfigOption.KEY_VALID_ROUTE); + helper.setOptionCallBack("actions"); // gps helper.registerCallBack("gps", Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java 2012-08-24 17:13:35 UTC (rev 472) @@ -51,8 +51,10 @@ public static final Color NEXT_TRANSECT_ROW_COLOR = new Color(233, 255, 235); - public static final Color OBSERVATION_FOR_ROUTE_ROW_COLOR = new Color(233, 255, 235); + public static final Color OBSERVATION_FOR_ROUTE_ROW_COLOR = new Color(171, 214, 255); + public static final Color ROUTE_FOR_TRANSECT_ROW_COLOR = new Color(171, 214, 255); + public static final Color ROUTE_NO_MODIFICATION_ROW_COLOR = new Color(255, 233, 233); public static final Color FLIGHT_TRACKING_LINE_COLOR = Color.RED; Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/AddAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/AddAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/AddAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -24,6 +24,7 @@ package fr.ulr.sammoa.ui.swing.action; import fr.ulr.sammoa.application.flightController.FlightState; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; import org.nuiton.util.Resource; @@ -37,13 +38,14 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class AddAction extends SammoaAction { +public class AddAction extends FlightAction { private static final long serialVersionUID = 1L; public AddAction(JAXXContext context) { super(Resource.getIcon("/icons/action-add.png"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.add.tip")); + bindModelProperties(FlightUIModel.PROPERTY_FLIGHT_STATE); } @Override Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/BeginAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/BeginAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/BeginAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -25,8 +25,8 @@ import fr.ulr.sammoa.application.flightController.FlightState; import fr.ulr.sammoa.persistence.RouteType; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; -import org.nuiton.util.Resource; import javax.swing.Action; import java.awt.event.ActionEvent; @@ -38,13 +38,18 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class BeginAction extends SammoaAction { +public class BeginAction extends FlightAction { private static final long serialVersionUID = 1L; public BeginAction(JAXXContext context) { - super(Resource.getIcon("/icons/playback_play.png"), context); + super(_("sammoa.action.begin"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.begin.tip")); + bindModelProperties( + FlightUIModel.PROPERTY_FLIGHT_STATE, + FlightUIModel.PROPERTY_CURRENT_ROUTE, + FlightUIModel.PROPERTY_NEXT_TRANSECT + ); } @Override Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -27,6 +27,7 @@ import fr.ulr.sammoa.persistence.Observation; import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.persistence.RouteType; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; import org.nuiton.util.Resource; @@ -43,7 +44,7 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class CircleBackAction extends SammoaAction { +public class CircleBackAction extends FlightAction { private static final long serialVersionUID = 1L; @@ -54,6 +55,7 @@ public CircleBackAction(JAXXContext context) { super(CIRCLE_BACK_ICON, context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.circleBack.tip")); + bindModelProperties(FlightUIModel.PROPERTY_CURRENT_ROUTE); } @Override Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/DeviceAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/DeviceAction.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/DeviceAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -0,0 +1,71 @@ +/* + * #%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% + */ +package fr.ulr.sammoa.ui.swing.action; + +import fr.ulr.sammoa.application.device.DeviceManager; +import fr.ulr.sammoa.application.device.DeviceStateEvent; +import fr.ulr.sammoa.application.device.DeviceStateListener; +import jaxx.runtime.JAXXContext; + +import javax.swing.Icon; + +/** + * Created: 03/07/12 + * + * @author fdesbois <desbois@codelutin.com> + */ +public abstract class DeviceAction<T extends DeviceManager> extends SammoaAction { + + private static final long serialVersionUID = 1L; + + protected T device; + + protected DeviceAction(Icon icon, JAXXContext context) { + super(icon, context); + } + + protected DeviceAction(String name, JAXXContext context) { + super(name, context); + } + + protected T getDevice() { + if (device == null) { + device = getFlightController().getDeviceManager(getDeviceClass()); + device.addDeviceStateListener(new DeviceStateListener() { + + @Override + public void stateChanged(DeviceStateEvent event) { + setEnabled(checkEnabled()); + } + }); + } + return device; + } + + protected boolean hasDevice() { + return device != null || getFlightController().getDeviceManager(getDeviceClass()) != null; + } + + protected abstract Class<T> getDeviceClass(); +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/DeviceAction.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/action/EndAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/EndAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/EndAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -24,8 +24,8 @@ package fr.ulr.sammoa.ui.swing.action; import fr.ulr.sammoa.application.flightController.FlightState; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; -import org.nuiton.util.Resource; import javax.swing.Action; import java.awt.event.ActionEvent; @@ -37,13 +37,14 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class EndAction extends SammoaAction { +public class EndAction extends FlightAction { private static final long serialVersionUID = 1L; public EndAction(JAXXContext context) { - super(Resource.getIcon("/icons/playback_stop.png"), context); + super(_("sammoa.action.end"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.end.tip")); + bindModelProperties(FlightUIModel.PROPERTY_FLIGHT_STATE); } @Override Copied: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/FlightAction.java (from rev 471, trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java) =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/FlightAction.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/FlightAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -0,0 +1,64 @@ +/* + * #%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% + */ +package fr.ulr.sammoa.ui.swing.action; + +import fr.ulr.sammoa.application.flightController.FlightState; +import fr.ulr.sammoa.persistence.Flight; +import fr.ulr.sammoa.persistence.Route; +import fr.ulr.sammoa.persistence.TransectFlight; +import jaxx.runtime.JAXXContext; + +import javax.swing.Icon; + +/** + * Created: 03/07/12 + * + * @author fdesbois <desbois@codelutin.com> + */ +public abstract class FlightAction extends SammoaAction { + + public FlightAction(Icon icon, JAXXContext context) { + super(icon, context); + } + + public FlightAction(String name, JAXXContext context) { + super(name, context); + } + + protected FlightState getFlightState() { + return getModel().getFlightState(); + } + + protected Flight getFlight() { + return getModel().getFlight(); + } + + protected TransectFlight getNextTransect() { + return getModel().getNextTransect(); + } + + protected Route getCurrentRoute() { + return getModel().getCurrentRoute(); + } +} Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -24,8 +24,8 @@ package fr.ulr.sammoa.ui.swing.action; import fr.ulr.sammoa.application.flightController.FlightState; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; -import org.nuiton.util.Resource; import javax.swing.Action; import java.awt.event.ActionEvent; @@ -37,13 +37,14 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class NextAction extends SammoaAction { +public class NextAction extends FlightAction { private static final long serialVersionUID = 1L; public NextAction(JAXXContext context) { - super(Resource.getIcon("/icons/playback_next.png"), context); + super(_("sammoa.action.next"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.next.tip")); + bindModelProperties(FlightUIModel.PROPERTY_FLIGHT_STATE); } @Override Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextTransectAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextTransectAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextTransectAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -27,7 +27,8 @@ import jaxx.runtime.JAXXContext; import org.nuiton.util.Resource; -import javax.swing.*; +import javax.swing.Action; +import javax.swing.JComponent; import java.awt.event.ActionEvent; import static org.nuiton.i18n.I18n._; @@ -37,7 +38,7 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class NextTransectAction extends SammoaAction { +public class NextTransectAction extends FlightAction { private static final long serialVersionUID = 1L; Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -25,6 +25,7 @@ import fr.ulr.sammoa.application.flightController.FlightState; import fr.ulr.sammoa.persistence.Position; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; import java.awt.event.ActionEvent; @@ -34,7 +35,7 @@ * * @author fdesbois <desbois@codelutin.com> */ -public abstract class ObservationAction extends SammoaAction { +public abstract class ObservationAction extends FlightAction { private static final long serialVersionUID = 1L; @@ -43,6 +44,7 @@ public ObservationAction(String name, JAXXContext context, Position position) { super(name, context); this.position = position; + bindModelProperties(FlightUIModel.PROPERTY_FLIGHT_STATE); } @Override Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/SammoaAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/SammoaAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/SammoaAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -24,10 +24,6 @@ package fr.ulr.sammoa.ui.swing.action; import fr.ulr.sammoa.application.flightController.FlightController; -import fr.ulr.sammoa.application.flightController.FlightState; -import fr.ulr.sammoa.persistence.Flight; -import fr.ulr.sammoa.persistence.Route; -import fr.ulr.sammoa.persistence.TransectFlight; import fr.ulr.sammoa.ui.swing.flight.FlightUIHandler; import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; @@ -42,14 +38,12 @@ * * @author fdesbois <desbois@codelutin.com> */ -public abstract class SammoaAction extends AbstractAction implements PropertyChangeListener { +public abstract class SammoaAction extends AbstractAction { - private static final long serialVersionUID = 1L; - protected JAXXContext context; - public SammoaAction(Icon icon, JAXXContext context) { - super("", icon); + public SammoaAction(String name, Icon icon, JAXXContext context) { + super(name, icon); init(context); } @@ -58,17 +52,15 @@ init(context); } + public SammoaAction(Icon icon, JAXXContext context) { + this("", icon, context); + } + protected void init(JAXXContext context) { this.context = context; - getModel().addPropertyChangeListener(this); setEnabled(checkEnabled()); } - @Override - public final void propertyChange(PropertyChangeEvent evt) { - setEnabled(checkEnabled()); - } - protected FlightController getFlightController() { return context.getContextValue(FlightUIHandler.class).getFlightController(); } @@ -77,21 +69,19 @@ return context.getContextValue(FlightUIHandler.class).getModel(); } - protected FlightState getFlightState() { - return getModel().getFlightState(); + protected void bindModelProperties(String... properties) { + for (String property : properties) { + getModel().addPropertyChangeListener(property, enabledListener); + } } - protected Flight getFlight() { - return getModel().getFlight(); - } + protected PropertyChangeListener enabledListener = new PropertyChangeListener() { - protected TransectFlight getNextTransect() { - return getModel().getNextTransect(); - } + @Override + public void propertyChange(PropertyChangeEvent evt) { + setEnabled(checkEnabled()); + } + }; - protected Route getCurrentRoute() { - return getModel().getCurrentRoute(); - } - protected abstract boolean checkEnabled(); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -24,6 +24,7 @@ package fr.ulr.sammoa.ui.swing.action; import fr.ulr.sammoa.application.flightController.FlightState; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; import org.nuiton.util.Resource; @@ -37,13 +38,14 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class StartAction extends SammoaAction { +public class StartAction extends FlightAction { private static final long serialVersionUID = 1L; public StartAction(JAXXContext context) { super(Resource.getIcon("/icons/playback_play.png"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.start.tip")); + bindModelProperties(FlightUIModel.PROPERTY_FLIGHT_STATE); } @Override Copied: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAudioAction.java (from rev 471, trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java) =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAudioAction.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAudioAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -0,0 +1,64 @@ +/* + * #%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% + */ +package fr.ulr.sammoa.ui.swing.action; + +import fr.ulr.sammoa.application.device.DeviceState; +import fr.ulr.sammoa.application.device.audio.AudioReader; +import jaxx.runtime.JAXXContext; +import org.nuiton.util.Resource; + +import javax.swing.Action; +import java.awt.event.ActionEvent; + +import static org.nuiton.i18n.I18n._; + +/** + * Created: 05/07/12 + * + * @author fdesbois <desbois@codelutin.com> + */ +public class StartAudioAction extends DeviceAction<AudioReader> { + + private static final long serialVersionUID = 1L; + + public StartAudioAction(JAXXContext context) { + super(Resource.getIcon("/icons/playback_play.png"), context); + putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.startAudio.tip")); + } + + @Override + public void actionPerformed(ActionEvent e) { + getDevice().start(); + } + + @Override + protected boolean checkEnabled() { + return hasDevice() && getDevice().getState() == DeviceState.READY; + } + + @Override + protected Class<AudioReader> getDeviceClass() { + return AudioReader.class; + } +} Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -24,6 +24,7 @@ package fr.ulr.sammoa.ui.swing.action; import fr.ulr.sammoa.application.flightController.FlightState; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; import jaxx.runtime.JAXXContext; import org.nuiton.util.Resource; @@ -37,13 +38,14 @@ * * @author fdesbois <desbois@codelutin.com> */ -public class StopAction extends SammoaAction { +public class StopAction extends FlightAction { private static final long serialVersionUID = 1L; public StopAction(JAXXContext context) { super(Resource.getIcon("/icons/playback_stop.png"), context); putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.stop.tip")); + bindModelProperties(FlightUIModel.PROPERTY_FLIGHT_STATE); } @Override Copied: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAudioAction.java (from rev 471, trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java) =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAudioAction.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAudioAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -0,0 +1,64 @@ +/* + * #%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% + */ +package fr.ulr.sammoa.ui.swing.action; + +import fr.ulr.sammoa.application.device.DeviceState; +import fr.ulr.sammoa.application.device.audio.AudioReader; +import jaxx.runtime.JAXXContext; +import org.nuiton.util.Resource; + +import javax.swing.Action; +import java.awt.event.ActionEvent; + +import static org.nuiton.i18n.I18n._; + +/** + * Created: 05/07/12 + * + * @author fdesbois <desbois@codelutin.com> + */ +public class StopAudioAction extends DeviceAction<AudioReader> { + + private static final long serialVersionUID = 1L; + + public StopAudioAction(JAXXContext context) { + super(Resource.getIcon("/icons/playback_stop.png"), context); + putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.stopAudio.tip")); + } + + @Override + public void actionPerformed(ActionEvent e) { + getDevice().stop(); + } + + @Override + protected boolean checkEnabled() { + return hasDevice() && getDevice().getState() == DeviceState.RUNNING; + } + + @Override + protected Class<AudioReader> getDeviceClass() { + return AudioReader.class; + } +} Added: 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 (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -0,0 +1,100 @@ +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 com.google.common.base.Preconditions; +import com.google.common.collect.Maps; +import fr.ulr.sammoa.application.ValidationService; +import fr.ulr.sammoa.ui.swing.SammoaUIContext; +import jaxx.runtime.JAXXContext; +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.util.Map; + +/** + * Created: 23/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public abstract class ValidAction extends SammoaAction { + + protected ValidationService validationService; + + protected Map<Class<?>, BeanListValidator<?>> validators = Maps.newHashMap(); + + public ValidAction(String name, JAXXContext context) { + super(name, Resource.getIcon("/icons/action-tick.png"), context); + } + + protected ValidationService getValidationService() { + if (validationService == null) { + validationService = + SammoaUIContext.getUIContext().getService(ValidationService.class); + } + return validationService; + } + + /** + * Retrieve a validator for the {@code beanClass}. A cache + * is used to keep the validator for this property. A listener is also + * used to call checkEnabled() on each validation change. + * + * @param beanClass Class of the bean + * @param <E> generic type of the bean + * @return the {@link BeanListValidator} found + * @throws NullPointerException if no validator exists in context for the + * given {@code modelPropertyName} + */ + private <E> BeanListValidator<E> getValidator(Class<E> beanClass) { + BeanListValidator<E> validator = (BeanListValidator<E>) validators.get(beanClass); + if (validator == null) { + String prefix = beanClass.getSimpleName().toLowerCase(); + String contextValueName = prefix + "Validator"; + validator = context.getContextValue(BeanListValidator.class, + contextValueName); + Preconditions.checkNotNull(validator, + "No validator exists for bean type : " + + beanClass.getName() + + " (property from context = " + + contextValueName + ")" + ); + validator.addBeanListValidatorListener(new BeanListValidatorListener() { + + @Override + public void onFieldChanged(BeanListValidatorEvent event) { + setEnabled(checkEnabled()); + } + }); + validators.put(beanClass, validator); + } + return validator; + } + + protected <E> boolean isValid(E bean) { + return getValidator((Class<E>) bean.getClass()).getContext(bean).isValid(); + } +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidAction.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: 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 (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -0,0 +1,79 @@ +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.persistence.Observation; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; +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 ValidObservationAction extends ValidAction { + + /** Logger. */ + private static final Logger logger = LoggerFactory.getLogger(ValidObservationAction.class); + + private static final long serialVersionUID = 1L; + + public ValidObservationAction(JAXXContext context) { + super(_("sammoa.action.validObservation"), context); + putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validObservation.tip")); + bindModelProperties(FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN); + } + + @Override + public void actionPerformed(ActionEvent e) { + + Observation observation = getModel().getObservationEditBean(); + + if (observation != null) { + + if (logger.isDebugEnabled()) { + logger.debug("Validation for observation {}", observation.getObservationNumber()); + } + + getValidationService().validateObservation(observation); + + if (observation.isDeleted()) { + getModel().removeObservation(observation); + } + } + } + + @Override + protected boolean checkEnabled() { + Observation observation = getModel().getObservationEditBean(); + return observation != null && (observation.isDeleted() || isValid(observation)); + } +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidObservationAction.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: 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 (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.java 2012-08-24 17:13:35 UTC (rev 472) @@ -0,0 +1,143 @@ +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 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; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; +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 ValidRouteAction extends ValidAction { + + /** Logger. */ + private static final Logger logger = LoggerFactory.getLogger(ValidRouteAction.class); + + private static final long serialVersionUID = 1L; + + protected boolean validatorIsAdjusting; + + public ValidRouteAction(JAXXContext context) { + super(_("sammoa.action.validRoute"), context); + putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.validRoute.tip")); + bindModelProperties(FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN); + } + + @Override + public void actionPerformed(ActionEvent e) { + + Route route = getModel().getRouteEditBean(); + + if (route != null) { + + if (logger.isDebugEnabled()) { + logger.debug("Validation for route {} : {}", + route.getRouteType(), + route.getEffortNumber() + ); + } + + getValidationService().validateRoute(route); + + if (route.isDeleted()) { + getModel().removeRoute(route); + } else { + + validatorIsAdjusting = true; + + getModel().setObservationEditBean(null); + + // Reload all observations + FlightService service = + context.getContextValue(SammoaUIContext.class).getService(FlightService.class); + getModel().clearObservation(); + getModel().addAllObservation(service.getObservations(getModel().getFlight())); + + validatorIsAdjusting = false; + } + } + } + + @Override + protected boolean checkEnabled() { + boolean result = isEnabled(); + if (!validatorIsAdjusting) { + Route bean = getModel().getRouteEditBean(); + result = bean != null && (bean.isDeleted() || isRouteValid(bean)); + } + 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; + } +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ValidRouteAction.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/DeviceStateLED.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/DeviceStateLED.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/DeviceStateLED.java 2012-08-24 17:13:35 UTC (rev 472) @@ -80,13 +80,13 @@ getClass().getSimpleName(), state); switch (state) { - case NO_DEVICE: + case UNAVAILABLE: setIcon(NO_DEVICE_ICON); break; case READY: setIcon(READY_ICON); break; - case RECORDING: + case RUNNING: setIcon(RECORDING_ICON); break; case ERROR: 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css 2012-08-24 17:13:35 UTC (rev 472) @@ -23,11 +23,20 @@ * #L% */ -#lblTime { - delay:1000; - pattern:"dd/MM/yyyy HH:mm:ss"; +#stateBar { + background: {model.getEffortPanelColor()}; } +#clockTime { + delay: 1000; + pattern: "dd/MM/yyyy HH:mm:ss"; + visible: {!flightUIModel.isValidationMode()}; +} +#audioTime { + visible: {flightUIModel.isValidationMode()}; + text: {dateFormat.format(flightUIModel.getCurrentRoute().getBeginTime())}; +} + #beginButton { _actionName: {"begin"}; } @@ -41,45 +50,45 @@ } #effortButtonPanel { - background:{model.getEffortPanelColor()}; + background: {model.getEffortPanelColor()}; } #statusPanel { - background:{model.getEffortPanelColor()}; + background: {model.getEffortPanelColor()}; } #lblEffort { - text:{flightUIModel.getFlightState().name()}; + text: {flightUIModel.getFlightState().name()}; } #lblTransect { - text:{flightUIModel.getCurrentRoute().getTransectFlight().getTransect().getName()}; + text: {flightUIModel.getCurrentRoute().getTransectFlight().getTransect().getName()}; } #lblStatus { - text:{flightUIModel.getCurrentRoute().getRouteType().name()}; + text: {flightUIModel.getCurrentRoute().getRouteType().name()}; } #cbPanel { - background:{model.getEffortPanelColor()}; + background: {model.getEffortPanelColor()}; } #gpsLED { - text:"sammoa.statusBar.gps"; + text: "sammoa.statusBar.gps"; } #audioLED { - text:"sammoa.statusBar.audio"; + text: "sammoa.statusBar.audio"; } #indicatorPanel { - background:{model.getEffortPanelColor()}; + background: {model.getEffortPanelColor()}; } #lblAlt { - text:{model.getAlt()}; + text: {model.getAlt()}; } #lblSpeed { - text:{model.getSpeed()}; + text: {model.getSpeed()}; } 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.jaxx 2012-08-24 17:13:35 UTC (rev 472) @@ -22,9 +22,10 @@ <http://www.gnu.org/licenses/gpl-3.0.html>. #L% --> -<Table id='statusBar' background="{model.getEffortPanelColor()}"> +<JPanel id='statusBar' layout='{new GridLayout(0,1,0,0)}'> <import> + java.text.SimpleDateFormat javax.swing.BoxLayout javax.swing.SwingConstants jaxx.runtime.swing.ClockWidget @@ -44,59 +45,85 @@ <FlightBarModel id='model'/> - <row> - <cell fill='horizontal' weightx='0.2'> - <ClockWidget id='lblTime' - delay='1000' - pattern='dd/MM/yyyy HH:mm:ss'/> - </cell> - <cell fill='vertical'> - <JSeparator constructorParams='SwingConstants.VERTICAL'/> - </cell> - <cell fill='horizontal'> - <JPanel id='effortButtonPanel' - layout='{new BoxLayout(effortButtonPanel, BoxLayout.X_AXIS)}'> - <JButton id='beginButton'/> - <JButton id='endButton'/> - <JButton id='nextButton'/> - </JPanel> - </cell> - <cell fill='vertical'> - <JSeparator constructorParams='SwingConstants.VERTICAL'/> - </cell> - <cell fill='horizontal' weightx='0.2' anchor='center'> + <SimpleDateFormat id='dateFormat' constructorParams='"dd/MM/yyyy HH:mm:ss"'/> + + <Table id='validationBar'> + <row> + <cell fill='horizontal' weightx='0.2'> + <JPanel id='audioButtonPanel' + layout='{new BoxLayout(audioButtonPanel, BoxLayout.X_AXIS)}'> + <JButton id='startAudioButton'/> + <JButton id='stopAudioButton'/> + </JPanel> + </cell> + <cell fill='horizontal'> + <JSlider id='audioSlider' enabled='false'/> + </cell> + <cell fill='horizontal' weightx='0.2'> + <JPanel id='validButtonPanel' + layout='{new BoxLayout(validButtonPanel, BoxLayout.X_AXIS)}'> + <JButton id='validRouteButton'/> + <JButton id='validObservationButton'/> + </JPanel> + </cell> + </row> + </Table> + <Table id='stateBar'> + <row> + <cell fill='horizontal' weightx='0.2'> + <ClockWidget id='clockTime'/> + </cell> + <cell fill='horizontal' weightx='0.2'> + <JLabel id='audioTime'/> + </cell> + <cell fill='vertical'> + <JSeparator constructorParams='SwingConstants.VERTICAL'/> + </cell> + <cell fill='horizontal'> + <JPanel id='effortButtonPanel' + layout='{new BoxLayout(effortButtonPanel, BoxLayout.X_AXIS)}'> + <JButton id='beginButton'/> + <JButton id='endButton'/> + <JButton id='nextButton'/> + </JPanel> + </cell> + <cell fill='vertical'> + <JSeparator constructorParams='SwingConstants.VERTICAL'/> + </cell> + <cell fill='horizontal' weightx='0.2' anchor='center'> <JLabel id='lblEffort'/> - </cell> - <cell fill='vertical'> - <JSeparator constructorParams='SwingConstants.VERTICAL'/> - </cell> - <cell fill='horizontal' weightx='0.2' anchor='center'> + </cell> + <cell fill='vertical'> + <JSeparator constructorParams='SwingConstants.VERTICAL'/> + </cell> + <cell fill='horizontal' weightx='0.2' anchor='center'> <JLabel id='lblTransect'/> - </cell> - <cell fill='vertical'> - <JSeparator constructorParams='SwingConstants.VERTICAL'/> - </cell> - <cell fill='horizontal' weightx='0.2' anchor='center'> - <JLabel id='lblStatus'/> - </cell> - <cell fill='vertical'> - <JSeparator constructorParams='SwingConstants.VERTICAL'/> - </cell> - <cell fill='horizontal' weightx='0.2' anchor='center'> - <JPanel id='cbPanel' layout='{new BoxLayout(cbPanel, BoxLayout.Y_AXIS)}'> - <DeviceStateLED id='gpsLED' /> - <DeviceStateLED id='audioLED' /> - </JPanel> - </cell> - <cell fill='vertical'> - <JSeparator constructorParams='SwingConstants.VERTICAL'/> - </cell> - <cell fill='horizontal' weightx='0.2' anchor='center'> - <JPanel id='indicatorPanel' - layout='{new BoxLayout(indicatorPanel, BoxLayout.Y_AXIS)}'> - <JLabel id='lblAlt'/> - <JLabel id='lblSpeed'/> - </JPanel> - </cell> - </row> -</Table> + </cell> + <cell fill='vertical'> + <JSeparator constructorParams='SwingConstants.VERTICAL'/> + </cell> + <cell fill='horizontal' weightx='0.2' anchor='center'> + <JLabel id='lblStatus'/> + </cell> + <cell fill='vertical'> + <JSeparator constructorParams='SwingConstants.VERTICAL'/> + </cell> + <cell fill='horizontal' weightx='0.2' anchor='center'> + <JPanel id='cbPanel' layout='{new BoxLayout(cbPanel, BoxLayout.Y_AXIS)}'> + <DeviceStateLED id='gpsLED' /> + <DeviceStateLED id='audioLED' /> + </JPanel> + </cell> + <cell fill='vertical'> + <JSeparator constructorParams='SwingConstants.VERTICAL'/> + </cell> + <cell fill='horizontal' weightx='0.2' anchor='center'> + <JPanel id='indicatorPanel' + layout='{new BoxLayout(indicatorPanel, BoxLayout.Y_AXIS)}'> + <JLabel id='lblAlt'/> + <JLabel id='lblSpeed'/> + </JPanel> + </cell> + </row> + </Table> +</JPanel> 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBarHandler.java 2012-08-24 17:13:35 UTC (rev 472) @@ -30,7 +30,6 @@ import fr.ulr.sammoa.application.flightController.FlightState; import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.ui.swing.SammoaColors; -import fr.ulr.sammoa.ui.swing.SammoaUIContext; import jaxx.runtime.JAXXUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +43,7 @@ private static final Logger logger = LoggerFactory.getLogger(FlightBarHandler.class); - protected FlightBar ui; + protected final FlightBar ui; public FlightBarHandler(FlightBar ui) { this.ui = ui; @@ -60,15 +59,26 @@ public void init() { - ui.getFlightUIModel().addPropertyChangeListener(this); + FlightUIModel flightUIModel = ui.getFlightUIModel(); + flightUIModel.addPropertyChangeListener(this); + FlightController flightController = ui.getContextValue(FlightUIHandler.class).getFlightController(); - if (SammoaUIContext.getUIContext().isValidationMode()) { - // nothing + if (flightUIModel.isValidationMode()) { + + // Put actionName for validation buttons + ui.getStartAudioButton().putClientProperty("actionName", "startAudio"); + ui.getStopAudioButton().putClientProperty("actionName", "stopAudio"); + ui.getValidObservationButton().putClientProperty("actionName", "validObservation"); + ui.getValidRouteButton().putClientProperty("actionName", "validRoute"); + } else { + // Remove the bar used only for validation + ui.remove(ui.getValidationBar()); + AudioRecorder audioRecorder = flightController.getDeviceManager(AudioRecorder.class); ui.getAudioLED().setState(audioRecorder.getState()); audioRecorder.addDeviceStateListener(ui.getAudioLED()); 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-24 17:13:35 UTC (rev 472) @@ -97,7 +97,11 @@ import fr.ulr.sammoa.ui.swing.action.NextTransectAction; import fr.ulr.sammoa.ui.swing.action.RightObservationAction; import fr.ulr.sammoa.ui.swing.action.StartAction; +import fr.ulr.sammoa.ui.swing.action.StartAudioAction; import fr.ulr.sammoa.ui.swing.action.StopAction; +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.flight.layer.BaseGeoPointLayer; import fr.ulr.sammoa.ui.swing.flight.layer.LineGeoPointLayer; import fr.ulr.sammoa.ui.swing.flight.layer.SimpleGeoPointLayer; @@ -177,7 +181,7 @@ protected final UIDecoratorService decoratorService; - protected final FlightController flightController; + protected FlightController flightController; public FlightUIHandler(SammoaUIContext context, FlightUI ui) { this.context = context; @@ -187,13 +191,6 @@ this.flightService = context.getService(FlightService.class); this.referentialService = context.getService(ReferentialService.class); this.decoratorService = context.getService(UIDecoratorService.class); - - if (context.isValidationMode()) { - this.flightController = context.getService(FlightControllerValidation.class); - - } else { - this.flightController = context.getService(FlightControllerOnBoard.class); - } } public FlightController getFlightController() { @@ -246,9 +243,9 @@ startTime = timeLog.log(startTime, "beforeInitUI", "entities are loaded"); - flightController.addFlightControllerListener(this); - if (context.isValidationMode()) { + flightController = context.getService(FlightControllerValidation.class); + flightController.addFlightControllerListener(this); if (logger.isDebugEnabled()) { logger.debug("Open devices for VALIDATION"); @@ -257,6 +254,8 @@ openDevice(AudioReader.class); } else { + flightController = context.getService(FlightControllerOnBoard.class); + flightController.addFlightControllerListener(this); if (logger.isDebugEnabled()) { logger.debug("Open devices for ON_BOARD"); @@ -274,6 +273,7 @@ flightController.init(flight); + model.setValidationMode(context.isValidationMode()); model.setObservers(referentialObservers); model.setFlight(flight); model.setFlightObserverForPositions(observers); @@ -731,6 +731,12 @@ putAction("centerObservation", new CenterObservationAction(ui)); putAction("rightObservation", new RightObservationAction(ui)); putAction("circleBack", new CircleBackAction(ui)); + if (getModel().isValidationMode()) { + putAction("validObservation", new ValidObservationAction(ui)); + putAction("validRoute", new ValidRouteAction(ui)); + putAction("startAudio", new StartAudioAction(ui)); + putAction("stopAudio", new StopAudioAction(ui)); + } getModel().setActionMap(getActionMap()); 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java 2012-08-24 17:13:35 UTC (rev 472) @@ -32,10 +32,10 @@ import fr.ulr.sammoa.persistence.Observer; import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.persistence.TransectFlight; -import jaxx.runtime.validator.swing.SwingValidatorMessageTableModel; import org.jdesktop.beans.AbstractSerializableBean; import javax.swing.ActionMap; +import java.util.Collection; import java.util.List; /** @@ -63,7 +63,7 @@ public static final String PROPERTY_ROUTES = "routes"; - public static final String PROPERTY_VALIDATOR_TABLE_MODEL = "validatorTableModel"; +// public static final String PROPERTY_VALIDATOR_TABLE_MODEL = "validatorTableModel"; public static final String PROPERTY_OBSERVATION_EDIT_BEAN = "observationEditBean"; @@ -83,6 +83,8 @@ public static final String PROPERTY_GEO_POINTS = "geoPoints"; + public static final String PROPERTY_VALIDATION_MODE = "validationMode"; + protected Flight flight; protected List<Observer> observers; @@ -139,8 +141,10 @@ protected List<GeoPoint> geoPoints; - protected SwingValidatorMessageTableModel validatorTableModel - = new SwingValidatorMessageTableModel(); + protected boolean validationMode; +// +// protected SwingValidatorMessageTableModel validatorTableModel +// = new SwingValidatorMessageTableModel(); public Flight getFlight() { return flight; @@ -217,17 +221,36 @@ } public void setObservations(List<Observation> observations) { - List<Observation> oldValue = Lists.newArrayList(getObservations()); this.observations = observations; - firePropertyChange(PROPERTY_OBSERVATIONS, oldValue, observations); + firePropertyChange(PROPERTY_OBSERVATIONS, null, observations); } public void addObservation(Observation observation) { + List<Observation> oldValue = Lists.newArrayList(getObservations()); int index = getObservations().size(); getObservations().add(observation); - setObservationEditBean(observation); - fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, null, observation); + fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, oldValue, getObservations()); } + + public void removeObservation(Observation observation) { + List<Observation> oldValue = Lists.newArrayList(getObservations()); + int index = getObservations().indexOf(observation); + getObservations().remove(index); + fireIndexedPropertyChange(PROPERTY_OBSERVATIONS, index, oldValue, getObservations()); + } + + public void clearObservation() { + List<Observation> oldValue = Lists.newArrayList(getObservations()); + getObservations().clear(); + firePropertyChange(PROPERTY_OBSERVATIONS, oldValue, getObservations()); + } + + public void addAllObservation(Collection<Observation> observations) { + List<Observation> oldValue = Lists.newArrayList(getObservations()); + getObservations().addAll(observations); + firePropertyChange(PROPERTY_OBSERVATIONS, oldValue, getObservations()); + } + public List<Route> getRoutes() { if (routes == null) { routes = Lists.newArrayList(); @@ -254,20 +277,28 @@ } public void addRoute(int index, Route route) { + List<Route> oldValue = Lists.newArrayList(getRoutes()); getRoutes().add(index, route); - fireIndexedPropertyChange(PROPERTY_ROUTES, index, null, route); + fireIndexedPropertyChange(PROPERTY_ROUTES, index, oldValue, getRoutes()); } - public SwingValidatorMessageTableModel getValidatorTableModel() { - return validatorTableModel; + public void removeRoute(Route route) { + List<Route> oldValue = Lists.newArrayList(getRoutes()); + int index = getRoutes().indexOf(route); + getRoutes().remove(index); + fireIndexedPropertyChange(PROPERTY_ROUTES, index, oldValue, getRoutes()); } +// +// public SwingValidatorMessageTableModel getValidatorTableModel() { +// return validatorTableModel; +// } +// +// public void setValidatorTableModel(SwingValidatorMessageTableModel validatorTableModel) { +// SwingValidatorMessageTableModel oldValidatorTableModel = validatorTableModel; +// this.validatorTableModel = validatorTableModel; +// firePropertyChange(PROPERTY_VALIDATOR_TABLE_MODEL, oldValidatorTableModel, validatorTableModel); +// } - public void setValidatorTableModel(SwingValidatorMessageTableModel validatorTableModel) { - SwingValidatorMessageTableModel oldValidatorTableModel = validatorTableModel; - this.validatorTableModel = validatorTableModel; - firePropertyChange(PROPERTY_VALIDATOR_TABLE_MODEL, oldValidatorTableModel, validatorTableModel); - } - public Observation getObservationEditBean() { return observationEditBean; } @@ -392,4 +423,14 @@ this.geoPoints = geoPoints; firePropertyChange(PROPERTY_GEO_POINTS, oldValue, geoPoints); } + + public boolean isValidationMode() { + return validationMode; + } + + public void setValidationMode(boolean validationMode) { + boolean oldValue = isValidationMode(); + this.validationMode = validationMode; + firePropertyChange(PROPERTY_VALIDATION_MODE, oldValue, validationMode); + } } 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-08-24 17:13:35 UTC (rev 472) @@ -119,6 +119,12 @@ protected static final Color DEVICE_ERROR_BACKGROUND_COLOR = Color.RED; + public static final String ROUTE_VALIDATOR_CONTEXT_VALUE = + "routeimplValidator"; + + public static final String OBSERVATION_VALIDATOR_CONTEXT_VALUE = + "observationimplValidator"; + protected boolean comboIsAdjusting; private final SammoaUIContext context; @@ -166,13 +172,14 @@ ); FlightUIModel flightUIModel = ui.getFlightUIModel(); - String validatorContext = context.isValidationMode() ? "validation" : "onBoard"; + String validatorContext = flightUIModel.isValidationMode() ? "validation" : "onBoard"; // init route section { BeanListValidator<Route> validator = ui.getRouteValidator(); validator.setContext(validatorContext); + getParentUI().setContextValue(validator, ROUTE_VALIDATOR_CONTEXT_VALUE); RouteTableModel tableModel = ui.getRouteTableModel(); @@ -214,7 +221,7 @@ logger.info("Select route from index {}", newSelectedRow); } - if (context.isValidationMode()) { + if (flightUIModel.isValidationMode()) { getParentUI().getHandler().getFlightController().setCurrentRoute(route); } @@ -312,10 +319,14 @@ // init observation section { + BeanListValidator<Observation> validator = ui.getObservationValidator(); + validator.setContext(validatorContext); + getParentUI().setContextValue(validator, OBSERVATION_VALIDATOR_CONTEXT_VALUE); + FlightController flightController = getParentUI().getHandler().getFlightController(); - if (context.isValidationMode()) { + if (flightUIModel.isValidationMode()) { // nothing for the moment @@ -484,9 +495,6 @@ column.setCellEditor(editorRenderer); column.setCellRenderer(editorRenderer); - BeanListValidator<Observation> validator = ui.getObservationValidator(); - validator.setContext(validatorContext); - ObservationValidatorDataLocator dataLocator = new ObservationValidatorDataLocator(); @@ -636,7 +644,8 @@ // make tab key to focus only next editable cell table.setSelectionModel(new ForceSelectionSelectionModel()); - table.setSortable(context.isValidationMode()); +// table.setSortable(context.isValidationMode()); + table.setSortable(false); table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java 2012-08-24 17:13:35 UTC (rev 472) @@ -78,8 +78,9 @@ @Override public boolean isCellEditable(int row, int column) { + Observation observation = getBean(row); ObservationColumn observationColumn = ObservationColumn.valueOf(column); - boolean result = observationColumn.isEditable(); + boolean result = observationColumn.isEditable(observation); return result; } @@ -231,8 +232,8 @@ } } - public boolean isEditable() { - boolean result = editable; + public boolean isEditable(Observation bean) { + boolean result = !bean.isValid() && editable; return result; } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java 2012-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java 2012-08-24 17:13:35 UTC (rev 472) @@ -209,7 +209,7 @@ } public boolean isEditable(Route bean) { - boolean result = editable; + boolean result = !bean.isValid() && editable; return result; } 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/DeletedRowHighlightPredicate.java 2012-08-24 17:13:35 UTC (rev 472) @@ -1,4 +1,27 @@ package fr.ulr.sammoa.ui.swing.util; +/* + * #%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.persistence.Deletable; 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java 2012-08-24 17:13:35 UTC (rev 472) @@ -24,11 +24,14 @@ */ import org.jdesktop.swingx.JXTable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.swing.table.AbstractTableModel; import java.beans.IndexedPropertyChangeEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.Collection; /** * Created: 17/07/12 @@ -37,6 +40,9 @@ */ public class TableDataChangeListener implements PropertyChangeListener { + /** Logger. */ + private static final Logger logger = LoggerFactory.getLogger(TableDataChangeListener.class); + public static final int NO_COLUMN_INDEX_TO_EDIT_ON_INSERT = -1; protected JXTable table; @@ -51,30 +57,70 @@ @Override public void propertyChange(PropertyChangeEvent evt) { - if (evt instanceof IndexedPropertyChangeEvent) { - final int rowIndex = ((IndexedPropertyChangeEvent) evt).getIndex(); - Object oldValue = evt.getOldValue(); - Object newValue = evt.getNewValue(); + // All data is fired + if (evt.getOldValue() == null) { + tableModel.fireTableDataChanged(); - if (oldValue == null) { - tableModel.fireTableRowsInserted(rowIndex, rowIndex); + } else { - int columnIndex = getFirstEditableColumn(rowIndex); - if (columnIndex != NO_COLUMN_INDEX_TO_EDIT_ON_INSERT) { - table.changeSelection(rowIndex, columnIndex, false, false); - table.editCellAt(rowIndex, columnIndex); + int oldSize = ((Collection) evt.getOldValue()).size(); + int newSize = ((Collection) evt.getNewValue()).size(); + + int rowIndex; + if (evt instanceof IndexedPropertyChangeEvent) { + rowIndex = ((IndexedPropertyChangeEvent) evt).getIndex(); + } else { + rowIndex = -1; + } + + if (logger.isDebugEnabled()) { + logger.debug("Fire table change oldSize:{}, newSize:{}, index:{}", + new Object[]{oldSize, newSize, rowIndex}); + } + + // INSERT + if (oldSize < newSize) { + + if (rowIndex == -1) { + tableModel.fireTableRowsInserted(oldSize, newSize -1); + if (oldSize > 0) { + tableModel.fireTableRowsUpdated(0, oldSize - 1); + } + + } else { + tableModel.fireTableRowsInserted(rowIndex, rowIndex); + + int columnIndex = getFirstEditableColumn(rowIndex); + if (columnIndex != NO_COLUMN_INDEX_TO_EDIT_ON_INSERT) { + table.changeSelection(rowIndex, columnIndex, false, false); + table.editCellAt(rowIndex, columnIndex); + } } - } else if (newValue == null) { - tableModel.fireTableRowsDeleted(rowIndex, rowIndex); + // DELETE + } else if (oldSize > newSize) { + if (rowIndex == -1) { + tableModel.fireTableRowsDeleted(newSize, oldSize - 1); + if (newSize > 0) { + tableModel.fireTableRowsUpdated(0, newSize - 1); + } + + } else { + tableModel.fireTableRowsDeleted(rowIndex, rowIndex); + } + + // UPDATE } else { - tableModel.fireTableRowsUpdated(rowIndex, rowIndex); + + if (rowIndex == -1) { + tableModel.fireTableRowsUpdated(0, newSize - 1); + + } else { + tableModel.fireTableRowsUpdated(rowIndex, rowIndex); + } } - - } else { - tableModel.fireTableDataChanged(); } } 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ValidRowHighlightPredicate.java 2012-08-24 17:13:35 UTC (rev 472) @@ -1,4 +1,27 @@ package fr.ulr.sammoa.ui.swing.util; +/* + * #%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.persistence.Validatable; 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-08-24 17:12:53 UTC (rev 471) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-24 17:13:35 UTC (rev 472) @@ -3,6 +3,7 @@ sammoa.action.about=About sammoa.action.about.tip=About sammoa.action.add.tip=ADD \: create a new LEG route for the current Transect (the observation conditions have changed) +sammoa.action.begin=Begin sammoa.action.begin.tip=BEGIN \: begin effort to create a new LEG route for the next selected Transect sammoa.action.cancel=Cancel sammoa.action.cancelExport=Cancel @@ -14,6 +15,7 @@ sammoa.action.configuration.tip=Configuration sammoa.action.create=Create sammoa.action.edit=Edit +sammoa.action.end=End sammoa.action.end.tip=END \: end effort and create a new TRANSIT route sammoa.action.exportApplication=Export sammoa.action.exportEffortsMap=Export Efforts @@ -26,6 +28,7 @@ sammoa.action.left.tip=LEFT \: create a new Observation for the observer on the left side sammoa.action.loadImportApplicationFile=Load selected import file sammoa.action.new=New +sammoa.action.next=Next sammoa.action.next.tip=NEXT \: end previous effort and create a new LEG route for the next selected Transect sammoa.action.nextTransect.tip=NEXT TRANSECT \: choose this transect to be the next one sammoa.action.onBoard=On Board @@ -39,8 +42,14 @@ sammoa.action.site=Site sammoa.action.site.tip=Display project site sammoa.action.start.tip=START \: start the flight and create a new TRANSIT route +sammoa.action.startAudio.tip=Start audio sammoa.action.startExport=Start sammoa.action.stop.tip=STOP \: stop the flight. No other actions on routes and observations could be done after stop. +sammoa.action.stopAudio.tip=Stop audio +sammoa.action.validObservation=Observation +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.validation=Validation sammoa.config.category.applications=Application sammoa.config.category.applications.description=Application
participants (1)
-
fdesbois@users.forge.codelutin.com