Sammoa-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
August 2012
- 4 participants
- 171 discussions
30 Aug '12
Author: fdesbois
Date: 2012-08-30 17:58:32 +0200 (Thu, 30 Aug 2012)
New Revision: 500
Url: http://forge.codelutin.com/repositories/revision/sammoa/500
Log:
fixes #1434 : resolve issue with flightNumber
Added:
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java
trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.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/FlightService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -232,26 +232,26 @@
}
/**
- * Create a new flight using the last flight number. The flight number is
- * calculated from the last existing flight or from
- * configuration {@link SammoaConfig#getFlightNumber()}.
+ * Create a new flight using the {@code flightNumber}. The flight number
+ * could be calculated using {@link #getNextFlightNumber()}.
*
+ * @param flightNumber the number of the new flight
* @param campaign The campaign of the flight
* @return a new flight
- * @see FlightDAO#findLastFlightNumber(int)
+ * @see #getNextFlightNumber()
* @since 0.4
*/
- public Flight createFlight(Campaign campaign) {
+ public Flight createFlight(Campaign campaign, int flightNumber) {
- TopiaContext transaction = beginTransaction();
+ TopiaContext tx = beginTransaction();
try {
- FlightDAO dao = SammoaDAOHelper.getFlightDAO(transaction);
+ FlightDAO dao = SammoaDAOHelper.getFlightDAO(tx);
+ int nextFlightNumber = getNextFlightNumber(tx);
+ Preconditions.checkArgument(flightNumber >= nextFlightNumber);
+
String systemId = config.getSystemId();
- int startNumber = config.getFlightNumber();
- int flightNumber = dao.findLastFlightNumber(startNumber);
-
Flight result = dao.createByNaturalId(systemId,
flightNumber,
campaign);
@@ -264,8 +264,12 @@
);
}
- transaction.commitTransaction();
+ tx.commitTransaction();
+ // Update flightNumber in config
+ config.setFlightNumber(flightNumber);
+ config.save();
+
// create flight storage
CampaignStorage campaignStorage =
getCampaignStorage(campaign.getTopiaId());
@@ -277,11 +281,31 @@
} catch (TopiaException e) {
throw new TopiaRuntimeException(e);
} finally {
- endTransaction(transaction);
+ endTransaction(tx);
}
}
/**
+ * Retrieve the next flight number to use. It is the maximum value available
+ * between the database maximum flightNumber and the configuration one.
+ *
+ * @return the next available flight number
+ */
+ public int getNextFlightNumber() {
+
+ TopiaContext tx = persistence.beginTransaction();
+ try {
+ int result = getNextFlightNumber(tx);
+ return result;
+
+ } catch (TopiaException e) {
+ throw new TopiaRuntimeException(e);
+ } finally {
+ endTransaction(tx);
+ }
+ }
+
+ /**
* Remove the given flight from db and storage.
*
* @param flightId the flight id to remove
@@ -994,6 +1018,19 @@
}
}
+ protected int getNextFlightNumber(TopiaContext tx) throws TopiaException {
+
+ FlightDAO dao = SammoaDAOHelper.getFlightDAO(tx);
+
+ int confNumber = config.getFlightNumber();
+ Integer dbNumber = dao.findLastFlightNumber();
+
+ int result = dbNumber == null
+ ? confNumber : Math.max(confNumber, dbNumber);
+ result++;
+ return result;
+ }
+
public Flight getFlightByNaturalId(Map<String, Object> naturalId) {
TopiaContext tx = beginTransaction();
try {
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-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -223,6 +223,10 @@
return result;
}
+ public void setFlightNumber(int flightNumber) {
+ applicationConfig.setOption(SammoaConfigOption.FLIGHT_NUMBER.key, String.valueOf(flightNumber));
+ }
+
/** @return {@link SammoaConfigOption#BACKGROUND_SHAPE_FILE} value */
public File getBackgroundShapeFile() {
File result = applicationConfig.getOptionAsFile(SammoaConfigOption.BACKGROUND_SHAPE_FILE.key);
@@ -359,7 +363,7 @@
/** The starting value to increment flight number */
FLIGHT_NUMBER("flight.number",
n_("sammoa.config.flight.number"),
- "1",
+ "0",
Integer.class
),
/** The backgroud shape file to display the world */
Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -39,6 +39,7 @@
import fr.ulr.sammoa.persistence.Transect;
import fr.ulr.sammoa.persistence.TransectDAO;
import fr.ulr.sammoa.persistence.TransectFlight;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
@@ -47,21 +48,24 @@
/**
* Created: 08/06/12
- * <p/>
- * FIXME-fdesbois-2012-07-03 : This test is ignored, waiting for a more stable AutoCommitSaver
*
* @author fdesbois <desbois(a)codelutin.com>
*/
public class FlightServiceTest {
public SammoaConfig config =
- new SammoaConfig("sammoa-test.properties");
+ new SammoaConfigMock("sammoa-test.properties");
@Rule
public SammoaDatabase database = new SammoaDatabase(
"/" + config.getApplicationConfig().getConfigFileName(),
config.getAutoCommitDelay());
+ @After
+ public void tearDown() {
+ config.setFlightNumber(0);
+ }
+
@Test
public void testCreateFlight() throws Exception {
@@ -71,15 +75,57 @@
Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
- context.getConfig().applicationConfig.setOption(
- SammoaConfig.SammoaConfigOption.FLIGHT_NUMBER.getKey(), "18");
+ context.getConfig().setFlightNumber(17);
- Flight flight1 = service.createFlight(campaign);
+ Flight flight = service.createFlight(campaign, 18);
- Assert.assertEquals(18, flight1.getFlightNumber());
+ Assert.assertEquals(18, flight.getFlightNumber());
+ Assert.assertEquals(18, (int) config.getFlightNumber());
}
+ @Test(expected = IllegalArgumentException.class)
+ public void testCreateFlightError() throws Exception {
+
+ SammoaContext context = new SammoaContext(config, database.getPersistence());
+
+ FlightService service = context.getService(FlightService.class);
+
+ Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
+
+ context.getConfig().setFlightNumber(18);
+
+ service.createFlight(campaign, 1);
+ }
+
@Test
+ public void testGetNextFlightNumber() throws Exception {
+
+ SammoaContext context = new SammoaContext(config, database.getPersistence());
+
+ FlightService service = context.getService(FlightService.class);
+
+ Campaign campaign = database.createCampaign("PACOMM", "FRANCE");
+
+ {
+ service.createFlight(campaign, 124);
+ int result = service.getNextFlightNumber();
+ Assert.assertEquals(125, result);
+ }
+
+ {
+ config.setFlightNumber(18);
+ int result = service.getNextFlightNumber();
+ Assert.assertEquals(125, result);
+ }
+
+ {
+ config.setFlightNumber(149);
+ int result = service.getNextFlightNumber();
+ Assert.assertEquals(150, result);
+ }
+ }
+
+ @Test
public void testAddTransects() throws Exception {
SammoaContext context = new SammoaContext(config, database.getPersistence());
@@ -91,7 +137,7 @@
// Create the strate
Strate strate = createStrate(campaign, 1, StrateType.COAST);
- Flight flight = service.createFlight(campaign);
+ Flight flight = service.createFlight(campaign, service.getNextFlightNumber());
// add 4 observers in flight
for (int i = 0; i < 4; i++) {
Added: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java (rev 0)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -0,0 +1,29 @@
+package fr.ulr.sammoa.application;
+
+/**
+ * Created: 30/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class SammoaConfigMock extends SammoaConfig {
+
+ protected int flightNumber;
+
+ public SammoaConfigMock(String file, String... args) {
+ super(file, args);
+ }
+
+ @Override
+ public Integer getFlightNumber() {
+ return flightNumber;
+ }
+
+ @Override
+ public void setFlightNumber(int flightNumber) {
+ this.flightNumber = flightNumber;
+ }
+
+ @Override
+ public void save() {
+ }
+}
Property changes on: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -24,6 +24,7 @@
*/
import fr.ulr.sammoa.application.SammoaConfig;
+import fr.ulr.sammoa.application.SammoaConfigMock;
import fr.ulr.sammoa.application.SammoaContext;
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Observer;
@@ -49,7 +50,7 @@
public class ImportCsvServiceTest {
public SammoaConfig config =
- new SammoaConfig("sammoa-test.properties");
+ new SammoaConfigMock("sammoa-test.properties");
@Rule
public SammoaDatabase database = new SammoaDatabase(
Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java
===================================================================
--- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -26,6 +26,7 @@
import com.google.common.collect.Lists;
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.SammoaConfig;
+import fr.ulr.sammoa.application.SammoaConfigMock;
import fr.ulr.sammoa.application.SammoaContext;
import fr.ulr.sammoa.application.io.input.map.DbfImport;
import fr.ulr.sammoa.application.io.input.map.DoubleToIntegerValueParser;
@@ -71,7 +72,7 @@
public class ExportMapServiceTest {
public SammoaConfig config =
- new SammoaConfig("sammoa-test.properties");
+ new SammoaConfigMock("sammoa-test.properties");
@Rule
public SammoaDatabase database = new SammoaDatabase("/" +
@@ -100,7 +101,7 @@
campaign.setEndDate(DateUtil.createDate(31, 12, 2012));
FlightService flightService = context.getService(FlightService.class);
- Flight flight = flightService.createFlight(campaign);
+ Flight flight = flightService.createFlight(campaign, flightService.getNextFlightNumber());
flight.setBeginDate(DateUtil.createDate(18, 0, 12, 18, 7, 2012));
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -43,18 +43,18 @@
*/
public class FlightDAOImpl<E extends Flight> extends FlightDAOAbstract<E> {
- public int findLastFlightNumber(int defaultValue) {
+ public Integer findLastFlightNumber() {
String ql = "SELECT max(flightNumber) FROM FlightImpl";
try {
- Integer queryResult = findByQuery(Integer.class, ql);
+ Integer result = findByQuery(Integer.class, ql);
- int result = queryResult == null ? defaultValue : queryResult + 1;
-
- if (result < defaultValue) {
- result = defaultValue;
- }
+// int result = queryResult == null ? defaultValue : queryResult + 1;
+//
+// if (result < defaultValue) {
+// result = defaultValue;
+// }
return result;
} catch (TopiaException e) {
throw new TopiaRuntimeException(e);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -217,7 +217,7 @@
observerFile.getAbsolutePath());
}
- success &= uiImporter.importCvs(observerImporter, observerFile);
+ success &= uiImporter.importCsv(observerImporter, observerFile);
}
SammoaUtil.updateBusyState(ui, false);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -39,13 +39,17 @@
import fr.ulr.sammoa.ui.swing.SammoaUIContext;
import fr.ulr.sammoa.ui.swing.SammoaUIHandler;
import fr.ulr.sammoa.ui.swing.UIDecoratorService;
+import fr.ulr.sammoa.ui.swing.util.SammoaUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.swing.JOptionPane;
import java.util.Collection;
import java.util.List;
import java.util.Set;
+import static org.nuiton.i18n.I18n._;
+
/**
* Created: 19/07/12
*
@@ -281,10 +285,36 @@
if (flight == null) {
- // Create a new Flight for the selected Campaign
- flight = flightService.createFlight(campaign);
+ int nextFlightNumber = flightService.getNextFlightNumber();
+
+ String response = JOptionPane.showInputDialog(
+ ui, _("sammoa.inputDialog.flightNumber.message"), nextFlightNumber);
+
+ if (response == null) {
+ // nothing to do
+
+ } else {
+ try {
+ int flightNumber = Integer.parseInt(response);
+
+ if (flightNumber < nextFlightNumber) {
+ SammoaUtil.showErrorMessage(
+ ui, _("sammoa.inputDialog.flightNumber.error.greaterThanNextFlightNumber", nextFlightNumber));
+
+ } else {
+
+ // Create the flight
+ flight = flightService.createFlight(campaign, flightNumber);
+
+ context.changeScreen(SammoaScreen.FLIGHT, campaign, flight);
+ }
+
+ } catch (NumberFormatException ex) {
+ SammoaUtil.showErrorMessage(
+ ui, _("sammoa.inputDialog.flightNumber.error.notANumber"));
+ }
+ }
}
- context.changeScreen(SammoaScreen.FLIGHT, campaign, flight);
}
public void showValidation() {
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -30,8 +30,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.swing.JOptionPane;
-import javax.swing.UIManager;
import java.awt.Component;
import java.io.File;
import java.io.IOException;
@@ -67,7 +65,7 @@
SammoaUtil.updateBusyState(ui, false);
- JOptionPane.showMessageDialog(ui, successMessage);
+ SammoaUtil.showSuccessMessage(ui, successMessage);
result = true;
@@ -80,7 +78,7 @@
return result;
}
- public boolean importCvs(CsvImporter importer, File file) {
+ public boolean importCsv(CsvImporter importer, File file) {
boolean result = false;
try {
@@ -91,7 +89,7 @@
SammoaUtil.updateBusyState(ui, false);
- JOptionPane.showMessageDialog(ui, successMessage);
+ SammoaUtil.showSuccessMessage(ui, successMessage);
result = true;
@@ -109,9 +107,7 @@
if (logger.isInfoEnabled()) {
logger.info("Import error from file '" + file.getAbsolutePath() + "'", e);
}
- JOptionPane.showMessageDialog(
- ui, e.getMessage(), "Error",
- JOptionPane.ERROR_MESSAGE, UIManager.getIcon("error"));
+ SammoaUtil.showErrorMessage(ui, e.getMessage());
}
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java 2012-08-30 15:58:32 UTC (rev 500)
@@ -131,7 +131,7 @@
speciesFile.getAbsolutePath());
}
- success = uiImporter.importCvs(speciesImporter, speciesFile);
+ success = uiImporter.importCsv(speciesImporter, speciesFile);
}
SammoaUtil.updateBusyState(ui, false);
Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-30 14:42:03 UTC (rev 499)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-30 15:58:32 UTC (rev 500)
@@ -94,6 +94,9 @@
sammoa.info.importApplication.importfile.loaded.on.existingCampaign=Import an existing campaign %s, please choose which flights of the following list to import
sammoa.info.importApplication.importfile.loaded.on.newCampaign=Import a new campaign %s, all the flights of the following list will be imported
sammoa.info.importApplication.no.importfile.loaded=No import file loaded, choose an file to import then press the 'load import file' button
+sammoa.inputDialog.flightNumber.error.greaterThanNextFlightNumber=The flight number can't be greater than %d
+sammoa.inputDialog.flightNumber.error.notANumber=The flight number must be a valid integer
+sammoa.inputDialog.flightNumber.message=Choose the flight number
sammoa.label.campaign=Campaign\:
sammoa.label.campaign.beginDate=Begin\:
sammoa.label.campaign.code=Code\:
1
0
Author: tchemit
Date: 2012-08-30 16:42:03 +0200 (Thu, 30 Aug 2012)
New Revision: 499
Url: http://forge.codelutin.com/repositories/revision/sammoa/499
Log:
updates to mavenpom 3.3.7
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-08-30 13:38:08 UTC (rev 498)
+++ trunk/pom.xml 2012-08-30 14:42:03 UTC (rev 499)
@@ -10,7 +10,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.3.7-SNAPSHOT</version>
+ <version>3.3.7</version>
</parent>
<groupId>fr.ulr</groupId>
1
0
r498 - trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application
by tchemit@users.forge.codelutin.com 30 Aug '12
by tchemit@users.forge.codelutin.com 30 Aug '12
30 Aug '12
Author: tchemit
Date: 2012-08-30 15:38:08 +0200 (Thu, 30 Aug 2012)
New Revision: 498
Url: http://forge.codelutin.com/repositories/revision/sammoa/498
Log:
fix typo
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-30 13:28:13 UTC (rev 497)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-30 13:38:08 UTC (rev 498)
@@ -58,7 +58,7 @@
import static org.nuiton.i18n.I18n._;
/**
- * Handelr of {@link ExportApplicationUI}.
+ * Handler of {@link ExportApplicationUI}.
*
* @author tchemit <chemit(a)codelutin.com>
* @since 0.6
1
0
30 Aug '12
Author: fdesbois
Date: 2012-08-30 15:28:13 +0200 (Thu, 30 Aug 2012)
New Revision: 497
Url: http://forge.codelutin.com/repositories/revision/sammoa/497
Log:
fixes #1419 : allow change time, do not keep milliseconds
Added:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.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/GpsHandlerGpsylon.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java
trunk/sammoa-persistence/src/main/xmi/sammoa.properties
trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/GeoPointsTest.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUI.css
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/TextCellEditor.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -843,7 +843,10 @@
RouteDAO dao = SammoaDAOHelper.getRouteDAO(transaction);
// Create the new Route
- Route result = dao.createByNaturalId(beginTime, type, flight);
+ Route result = dao.create();
+ result.setBeginTime(beginTime);
+ result.setRouteType(type);
+ result.setFlight(flight);
// Copy previous data
if (previousRoute != null) {
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -29,6 +29,7 @@
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPointImpl;
import fr.ulr.sammoa.persistence.GeoPoints;
+import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -133,13 +134,13 @@
GeoPoint result;
if (currentLocation == null) {
result = new GeoPointImpl(GeoPoints.EMPTY_COORDINATE, GeoPoints.EMPTY_COORDINATE);
- result.setRecordTime(new Date());
+ result.setRecordTime(getDate());
} else if (currentLocation.getTopiaId() != null) {
result = new GeoPointImpl(currentLocation.getLatitude(), currentLocation.getLongitude());
result.setAltitude(currentLocation.getAltitude());
result.setSpeed(currentLocation.getSpeed());
- result.setRecordTime(new Date());
+ result.setRecordTime(getDate());
} else {
result = currentLocation;
@@ -171,11 +172,17 @@
longitude += random.nextDouble() - 0.5;
currentLocation = new GeoPointImpl(latitude, longitude);
- currentLocation.setRecordTime(new Date());
+ currentLocation.setRecordTime(getDate());
count--;
}
}
}
+ protected Date getDate() {
+ Date result = new Date();
+ result = DateUtils.setMilliseconds(result, 0);
+ return result;
+ }
+
}
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -31,6 +31,7 @@
import fr.ulr.sammoa.persistence.GeoPointImpl;
import fr.ulr.sammoa.persistence.GeoPoints;
import gnu.io.CommPortIdentifier;
+import org.apache.commons.lang3.time.DateUtils;
import org.dinopolis.gpstool.gpsinput.GPSDataProcessor;
import org.dinopolis.gpstool.gpsinput.GPSDevice;
import org.dinopolis.gpstool.gpsinput.GPSException;
@@ -173,15 +174,17 @@
// }
double latitude = lastPosition != null
- ? lastPosition.getLatitude() : GeoPoints.EMPTY_COORDINATE;
+ ? lastPosition.getLatitude()
+ : GeoPoints.EMPTY_COORDINATE;
+
double longitude = lastPosition != null
- ? lastPosition.getLongitude() : GeoPoints.EMPTY_COORDINATE;
+ ? lastPosition.getLongitude()
+ : GeoPoints.EMPTY_COORDINATE;
GeoPoint result = new GeoPointImpl(latitude, longitude);
result.setAltitude(lastAltitude);
result.setSpeed(lastSpeed);
- // FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp
- result.setRecordTime(new Date());
+ result.setRecordTime(getDate());
if (logger.isWarnEnabled() && lastPosition == null) {
logger.warn("Retrieve a location without any coordinates : {}", result);
@@ -255,6 +258,13 @@
super.finalize();
}
+ protected Date getDate() {
+ // FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp
+ Date result = new Date();
+ result = DateUtils.setMilliseconds(result, 0);
+ return result;
+ }
+
/**
* Si l'on recoit des evenements, c'est que le gps fonctionne.
* Il sont envoyé par le traitement des flux NMEA et propagé par le
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -41,6 +41,7 @@
import org.slf4j.LoggerFactory;
import java.io.File;
+import java.util.Calendar;
import java.util.Date;
import java.util.List;
@@ -102,30 +103,33 @@
Date newTime;
if (position > 0) {
- newTime = DateUtils.addMilliseconds(previousTime, (int) position);
+ newTime = DateUtils.addSeconds(previousTime, (int) position);
} else {
- // Arbitrary add 1 second for the newTime
- newTime = DateUtils.addMilliseconds(previousTime, 1000);
+ newTime = new Date();
+ newTime.setTime(previousTime.getTime());
- // Ensure that newTime is before nextRoute time
- Route nextRoute = Routes.findNext(routes, currentRoute);
- if (nextRoute != null) {
-
- logger.debug(String.format("Next route %1$s at %2$tH:%2$tM:%2$tS.%2$tL",
- nextRoute.getRouteType(),
- nextRoute.getBeginTime())
- );
-
- // If greater or equals than the nextRoute, we use the middle
- // time between previous and next route
- if (newTime.after(nextRoute.getBeginTime())
- || newTime.equals(nextRoute.getBeginTime())) {
-
- newTime = Routes.getMiddleTime(currentRoute, nextRoute);
- }
- }
+// // Arbitrary add 1 second for the newTime
+// newTime = DateUtils.addMilliseconds(previousTime, 1000);
+//
+// // Ensure that newTime is before nextRoute time
+// Route nextRoute = Routes.findNext(routes, currentRoute);
+// if (nextRoute != null) {
+//
+// logger.debug(String.format("Next route %1$s at %2$tH:%2$tM:%2$tS.%2$tL",
+// nextRoute.getRouteType(),
+// nextRoute.getBeginTime())
+// );
+//
+// // If greater or equals than the nextRoute, we use the middle
+// // time between previous and next route
+// if (newTime.after(nextRoute.getBeginTime())
+// || newTime.equals(nextRoute.getBeginTime())) {
+//
+// newTime = Routes.getMiddleTime(currentRoute, nextRoute);
+// }
+// }
}
if (logger.isDebugEnabled()) {
@@ -140,12 +144,16 @@
// Create a new location if no one is available for the newTime
if (!location.getRecordTime().equals(newTime)) {
- // Note that the captureDelay is keeped but maybe we need to update it
- // depends on modified time ?
result = new GeoPointImpl(location.getLatitude(), location.getLongitude());
result.setSpeed(location.getSpeed());
result.setAltitude(location.getAltitude());
- result.setCaptureDelay(location.getCaptureDelay());
+
+ // Ensure captureDelay of the new recording time
+ long locationSeconds = DateUtils.getFragmentInSeconds(location.getRecordTime(), Calendar.MINUTE);
+ long newSeconds = DateUtils.getFragmentInSeconds(newTime, Calendar.MINUTE);
+ int captureDelay = (int) newSeconds - (int) locationSeconds;
+ result.setCaptureDelay(captureDelay);
+
result.setFlight(flight);
result.setRecordTime(newTime);
SammoaDAOHelper.getGeoPointDAO(tx).create(result);
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -92,23 +92,4 @@
}
}
-// public List<Flight> findAllByCampaignOrderedByBeginDateDesc(Campaign campaign) {
-//
-// List<Flight> result;
-//
-// String ql = String.format("FROM %1$s WHERE %2$s = :campaign ORDER BY %3$s DESC",
-// FlightImpl.class.getSimpleName(),
-// Flight.PROPERTY_CAMPAIGN,
-// Flight.PROPERTY_BEGIN_DATE
-// );
-//
-// try {
-// result = context.findAll(ql, "campaign", campaign);
-//
-// } catch (TopiaException e) {
-// throw new TopiaRuntimeException(e);
-// }
-// return result;
-// }
-
}
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -32,11 +32,9 @@
public List<E> findAllByFlightOrderedByRecordTime(Flight flight) {
- String ql = String.format("FROM %1$s WHERE %2$s = :flight ORDER BY %3$s",
- GeoPointImpl.class.getSimpleName(),
- GeoPoint.PROPERTY_FLIGHT,
- GeoPoint.PROPERTY_RECORD_TIME
- );
+ String ql = "FROM GeoPointImpl " +
+ "WHERE flight = :flight " +
+ "ORDER BY recordTime";
try {
List<E> result = findAllByQuery(ql, "flight", flight);
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPointImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -52,6 +52,7 @@
.append(PROPERTY_ALTITUDE, altitude)
.append(PROPERTY_SPEED, speed)
.append(PROPERTY_RECORD_TIME, recordTime)
+ .append(PROPERTY_CAPTURE_DELAY, captureDelay)
.build();
}
}
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -101,7 +101,7 @@
for (Date date : dates) {
// We continue starting from the previous index to avoid loop on all the date list
- index = getClosestDateIndex(index > 0 ? index - 1 : 0, geoPointDates, date);
+ index = getBeforeDateIndex(index > 0 ? index - 1 : 0, geoPointDates, date);
result.add(geoPoints.get(index));
}
@@ -120,41 +120,44 @@
List<Date> geoPointDates = Lists.transform(source, toDate());
- int index = getClosestDateIndex(0, geoPointDates, date);
+ int index = getBeforeDateIndex(0, geoPointDates, date);
result = geoPoints.get(index);
}
return result;
}
- protected static int getClosestDateIndex(int startIndex, List<Date> source, Date date) {
+ protected static int getBeforeDateIndex(int startIndex, List<Date> source, Date date) {
int size = source.size();
for (int index = startIndex; index < size; index++) {
int nextIndex = index + 1;
if (nextIndex < size) {
- Date before = source.get(index);
- Date after = source.get(nextIndex);
+ Date end = source.get(nextIndex);
- // If the date is equal or before we take the current index
- if (date.equals(before) || date.before(before)) {
+ if (date.before(end)) {
return index;
+ }
- // If the date is before the next date, we check which one
- // of the before and after is the nearest value and we return
- // its index
- } else if (date.before(after)) {
-
- long diffBefore = date.getTime() - before.getTime();
- long diffAfter = after.getTime() - date.getTime();
-
- if (diffBefore <= diffAfter) {
- return index;
-
- } else {
- return nextIndex;
- }
- }
+// // If the date is equal or before we take the current index
+// if (date.equals(before) || date.before(before)) {
+// return index;
+//
+// // If the date is before the next date, we check which one
+// // of the before and after is the nearest value and we return
+// // its index
+// } else if (date.before(after)) {
+//
+// long diffBefore = date.getTime() - before.getTime();
+// long diffAfter = after.getTime() - date.getTime();
+//
+// if (diffBefore <= diffAfter) {
+// return index;
+//
+// } else {
+// return nextIndex;
+// }
+// }
}
}
// We loop over the whole list, we return the last index
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -81,7 +81,9 @@
public List<E> findAllByFlightOrderedByObservationTime(Flight flight) {
- String ql = "FROM ObservationImpl WHERE flight = :flight ORDER BY observationTime";
+ String ql = "FROM ObservationImpl " +
+ "WHERE flight = :flight " +
+ "ORDER BY observationTime, topiaCreateDate";
try {
List<E> result = findAllByQuery(ql, "flight", flight);
@@ -93,7 +95,9 @@
public int findLastObservationNumber(Flight flight) {
- String ql = "SELECT max(observationNumber) FROM ObservationImpl WHERE flight = :flight";
+ String ql = "SELECT max(observationNumber) " +
+ "FROM ObservationImpl " +
+ "WHERE flight = :flight";
try {
Integer queryResult = findByQuery(Integer.class, ql, "flight", flight);
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -39,7 +39,7 @@
String ql = "FROM RouteImpl " +
"WHERE flight = :flight " +
- "ORDER BY beginTime";
+ "ORDER BY beginTime, topiaCreateDate";
try {
List<E> result = findAllByQuery(ql, "flight", flight);
@@ -54,7 +54,7 @@
String ql = "FROM RouteImpl " +
"WHERE flight = :flight " +
"AND deleted = :deleted " +
- "ORDER BY beginTime DESC";
+ "ORDER BY beginTime DESC, topiaCreateDate DESC";
try {
List<E> queryResults = findAllByQueryWithBound(
@@ -75,7 +75,7 @@
"AND routeType = :type " +
"AND beginTime <= :date " +
"AND deleted = :deleted " +
- "ORDER BY beginTime DESC";
+ "ORDER BY beginTime DESC, topiaCreateDate DESC";
try {
List<E> queryResults = findAllByQueryWithBound(
@@ -100,7 +100,7 @@
"WHERE flight = :flight " +
"AND beginTime <= :date " +
"AND deleted = :deleted " +
- "ORDER BY beginTime DESC";
+ "ORDER BY beginTime DESC, topiaCreateDate DESC";
try {
List<E> queryResults = findAllByQueryWithBound(
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Routes.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -28,6 +28,7 @@
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Iterables;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
@@ -94,31 +95,38 @@
boolean result = Objects.equal(o1.getRouteType(), o2.getRouteType());
- result &= Objects.equal(o1.getTransectFlight(), o2.getTransectFlight());
- result &= Objects.equal(o1.getCircleBackCause(), o2.getCircleBackCause());
+ // We assume that time equality for a same routeType is an equivalence
+ if (result && Objects.equal(o1.getBeginTime(), o2.getBeginTime())) {
+ result = true;
- result &= Objects.equal(o1.isDeleted(), o2.isDeleted());
+ } else {
- result &= Objects.equal(o1.getSeaState(), o2.getSeaState());
- result &= Objects.equal(o1.getSwell(), o2.getSwell());
- result &= Objects.equal(o1.getTurbidity(), o2.getTurbidity());
- result &= Objects.equal(o1.getCloudCover(), o2.getCloudCover());
- result &= Objects.equal(o1.getSkyGlint(), o2.getSkyGlint());
- result &= Objects.equal(o1.getGlareFrom(), o2.getGlareFrom());
- result &= Objects.equal(o1.getGlareTo(), o2.getGlareTo());
- result &= Objects.equal(o1.isGlareUnder(), o2.isGlareUnder());
- result &= Objects.equal(o1.getGlareSeverity(), o2.getGlareSeverity());
- result &= Objects.equal(o1.getSubjectiveConditions(), o2.getSubjectiveConditions());
+ result &= Objects.equal(o1.getTransectFlight(), o2.getTransectFlight());
+ result &= Objects.equal(o1.getCircleBackCause(), o2.getCircleBackCause());
- result &= o1.getObserverPosition().size() == o2.getObserverPosition().size();
+ result &= Objects.equal(o1.isDeleted(), o2.isDeleted());
- if (result) {
+ result &= Objects.equal(o1.getSeaState(), o2.getSeaState());
+ result &= Objects.equal(o1.getSwell(), o2.getSwell());
+ result &= Objects.equal(o1.getTurbidity(), o2.getTurbidity());
+ result &= Objects.equal(o1.getCloudCover(), o2.getCloudCover());
+ result &= Objects.equal(o1.getSkyGlint(), o2.getSkyGlint());
+ result &= Objects.equal(o1.getGlareFrom(), o2.getGlareFrom());
+ result &= Objects.equal(o1.getGlareTo(), o2.getGlareTo());
+ result &= Objects.equal(o1.isGlareUnder(), o2.isGlareUnder());
+ result &= Objects.equal(o1.getGlareSeverity(), o2.getGlareSeverity());
+ result &= Objects.equal(o1.getSubjectiveConditions(), o2.getSubjectiveConditions());
- for (ObserverPosition position1 : o1.getObserverPosition()) {
- ObserverPosition position2 =
- o2.getObserverPositionByPosition(position1.getPosition());
+ result &= o1.getObserverPosition().size() == o2.getObserverPosition().size();
- result &= Objects.equal(position1.getObserver(), position2.getObserver());
+ if (result) {
+
+ for (ObserverPosition position1 : o1.getObserverPosition()) {
+ ObserverPosition position2 =
+ o2.getObserverPositionByPosition(position1.getPosition());
+
+ result &= Objects.equal(position1.getObserver(), position2.getObserver());
+ }
}
}
return result;
@@ -160,15 +168,15 @@
return Iterables.find(routes, new WithObservationPredicate(observation, routes, ignoreDeleted), null);
}
- public static Date getMiddleTime(Route previousRoute, Route nextRoute) {
- Date previousTime = previousRoute.getBeginTime();
- Date nextTime = nextRoute.getBeginTime();
+// public static Date getMiddleTime(Route previousRoute, Route nextRoute) {
+// Date previousTime = previousRoute.getBeginTime();
+// Date nextTime = nextRoute.getBeginTime();
+//
+// long diff = nextTime.getTime() - previousTime.getTime();
+// Date result = new Date(nextTime.getTime() - diff / 2);
+// return result;
+// }
- long diff = nextTime.getTime() - previousTime.getTime();
- Date result = new Date(nextTime.getTime() - diff / 2);
- return result;
- }
-
public static Predicate<Route> isDeleted() {
return IS_DELETED_PREDICATE;
}
@@ -181,12 +189,12 @@
@Override
public int compare(Route o1, Route o2) {
-// int result = ComparisonChain
-// .start()
-// .compare(o1.getBeginTime(), o2.getBeginTime())
-// .compare(o1.getTopiaCreateDate(), o2.getTopiaCreateDate())
-// .result();
- return o1.getBeginTime().compareTo(o2.getBeginTime());
+ int result = ComparisonChain
+ .start()
+ .compare(o1.getBeginTime(), o2.getBeginTime())
+ .compare(o1.getTopiaCreateDate(), o2.getTopiaCreateDate())
+ .result();
+ return result;
}
};
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -32,13 +32,9 @@
public List<E> findAllByCampaignOrderedByName(Campaign campaign) {
- String ql = String.format("FROM %1$s WHERE %2$s.%3$s.%4$s = :campaign ORDER BY %5$s",
- TransectImpl.class.getSimpleName(),
- Transect.PROPERTY_STRATE,
- Strate.PROPERTY_SECTOR,
- Sector.PROPERTY_CAMPAIGN,
- Transect.PROPERTY_NAME
- );
+ String ql = "FROM TransectImpl " +
+ "WHERE strate.sector.campaign = :campaign " +
+ "ORDER BY name";
try {
List<E> result = findAllByQuery(ql, "campaign", campaign);
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -35,7 +35,8 @@
public Map<Transect, Long> countAllByTransect() {
- String ql = "SELECT transect, count(*) FROM TransectFlightImpl " +
+ String ql = "SELECT transect, count(*) " +
+ "FROM TransectFlightImpl " +
"GROUP BY transect";
try {
@@ -55,8 +56,10 @@
public Map<Transect, Long> countAllByTransects(Collection<Transect> transects) {
- String ql = "SELECT transect, count(*) FROM TransectFlightImpl " +
- "WHERE transect IN (:transects) GROUP BY transect";
+ String ql = "SELECT transect, count(*) " +
+ "FROM TransectFlightImpl " +
+ "WHERE transect IN (:transects) " +
+ "GROUP BY transect";
try {
List<Object[]> queryResults = findAllByQuery(
@@ -86,23 +89,5 @@
getContext().executeSQL(builder.toString());
}
-// public Long countByTransect(Transect transect) {
-//
-// Long result;
-//
-// String ql = String.format("SELECT count(*) FROM %1$s WHERE %2$s = :transect",
-// TransectFlightImpl.class.getSimpleName(),
-// TransectFlight.PROPERTY_TRANSECT
-// );
-//
-// try {
-// result = (Long) context.findUnique(ql, "transect", transect);
-//
-// } catch (TopiaException e) {
-// throw new TopiaRuntimeException(e);
-// }
-// return result;
-// }
-
}
Modified: trunk/sammoa-persistence/src/main/xmi/sammoa.properties
===================================================================
--- trunk/sammoa-persistence/src/main/xmi/sammoa.properties 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/main/xmi/sammoa.properties 2012-08-30 13:28:13 UTC (rev 497)
@@ -112,10 +112,10 @@
############## ROUTE
-fr.ulr.sammoa.persistence.Route.class.tagvalue.naturalIdMutable=true
-fr.ulr.sammoa.persistence.Route.attribute.routeType.tagvalue.naturalId=true
-fr.ulr.sammoa.persistence.Route.attribute.flight.tagvalue.naturalId=true
-fr.ulr.sammoa.persistence.Route.attribute.beginTime.tagvalue.naturalId=true
+#fr.ulr.sammoa.persistence.Route.class.tagvalue.naturalIdMutable=true
+#fr.ulr.sammoa.persistence.Route.attribute.routeType.tagvalue.naturalId=true
+#fr.ulr.sammoa.persistence.Route.attribute.flight.tagvalue.naturalId=true
+#fr.ulr.sammoa.persistence.Route.attribute.beginTime.tagvalue.naturalId=true
# transectFlight is not a collection (EAGER load)
fr.ulr.sammoa.persistence.Route.attribute.transectFlight.tagvalue.lazy=false
Modified: trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/GeoPointsTest.java
===================================================================
--- trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/GeoPointsTest.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/GeoPointsTest.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -55,7 +55,7 @@
Assert.assertEquals(3, result.size());
Assert.assertEquals(4000, result.get(0).getRecordTime().getTime());
- Assert.assertEquals(6000, result.get(1).getRecordTime().getTime());
+ Assert.assertEquals(5000, result.get(1).getRecordTime().getTime());
Assert.assertEquals(85000, result.get(2).getRecordTime().getTime());
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUI.css
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUI.css 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUI.css 2012-08-30 13:28:13 UTC (rev 497)
@@ -85,7 +85,7 @@
#beginDatePicker {
patternLayout:{_("sammoa.dateTimePattern")};
showPopupButton:false;
- editable:false;
+ editable:{model.isValidationMode()};
date:{bean.getBeginDate()};
}
@@ -96,7 +96,7 @@
#endDatePicker {
patternLayout:{_("sammoa.dateTimePattern")};
showPopupButton:false;
- editable:false;
+ editable:{model.isValidationMode()};
date:{bean.getEndDate()};
}
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -58,9 +58,11 @@
import fr.ulr.sammoa.ui.swing.util.SammoaUtil;
import fr.ulr.sammoa.ui.swing.util.TableDataChangeListener;
import fr.ulr.sammoa.ui.swing.util.TextCellEditor;
+import fr.ulr.sammoa.ui.swing.util.TimeCellEditor;
import fr.ulr.sammoa.ui.swing.util.ValidRowHighlightPredicate;
import jaxx.runtime.JAXXUtil;
import jaxx.runtime.SwingUtil;
+import jaxx.runtime.swing.JAXXDatePicker;
import jaxx.runtime.swing.JAXXWidgetUtil;
import jaxx.runtime.swing.editor.cell.NumberCellEditor;
import jaxx.runtime.validator.swing.SwingListValidatorDataLocator;
@@ -154,7 +156,6 @@
ui.getConavComboBox().setRenderer(observeCellRenderer);
JTable errorTable = ui.getErrorTable();
- SwingListValidatorMessageTableModel errorTableModel = ui.getErrorTableModel();
// prepare error table ui
SwingValidatorUtil.installUI(
@@ -170,139 +171,282 @@
}
);
- FlightUIModel flightUIModel = ui.getFlightUIModel();
- String validatorContext = flightUIModel.isValidationMode() ? "validation" : "onBoard";
+ initRouteTable();
- // init route section
- {
- JXTable table = ui.getRouteTable();
+ initObservationTable();
+ }
- RouteTableModel tableModel = ui.getRouteTableModel();
- BeanListValidator<Route> validator = ui.getRouteValidator();
- validator.setContext(validatorContext);
- getParentUI().setContextValue(validator, ROUTE_VALIDATOR_CONTEXT_VALUE);
+ /**
+ * Add hightlighters on the editor of beans.
+ *
+ * @param validator the validator where to find bean states
+ * @param editor the editor of beans
+ * @param dataLocator the data locator
+ * @param scopes scopes to hightlight
+ * @param <O> type of bean to validate
+ * @since 2.5.3
+ */
+ public static <O> void addHightLighterOnEditor(BeanListValidator<O> validator,
+ JXTable editor,
+ SwingListValidatorDataLocator<O> dataLocator,
+ NuitonValidatorScope... scopes) {
- init(table, new ListSelectionListener() {
- @Override
- public void valueChanged(ListSelectionEvent e) {
+ for (NuitonValidatorScope scope : scopes) {
- if (!e.getValueIsAdjusting()) {
+ SwingListValidatorHighlightPredicate<O> predicate = SwingListValidatorHighlightPredicate.newPredicate(
+ scope,
+ validator, dataLocator
+ );
- ListSelectionModel listSelectionModel =
- (ListSelectionModel) e.getSource();
- int firstIndex = e.getFirstIndex();
- int lastIndex = e.getLastIndex();
- Integer newSelectedRow = null;
+ Highlighter highlighter = SammoaUtil.newBackgroundColorHighlighter(
+ predicate, SwingValidatorUtil.getColor(scope));
+ editor.addHighlighter(highlighter);
+ }
+ }
- if (listSelectionModel.isSelectionEmpty()) {
+ public Observer getObserverByPosition(Route route, Position position) {
+ Observer result;
+ if (route != null) {
+ ObserverPosition observerPosition =
+ route.getObserverPositionByPosition(position);
+ result = observerPosition.getObserver();
- // no selection
- } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+ } else {
+ result = null;
+ }
+ return result;
+ }
- // use first index
- newSelectedRow = firstIndex;
- } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
+ public void setObserverByPosition(Observer newValue, Position position) {
+ if (!comboIsAdjusting) {
- // use last index
- newSelectedRow = lastIndex;
- }
- FlightUIModel flightUIModel = ui.getFlightUIModel();
- List<Route> routes = flightUIModel.getRoutes();
- Route route = null;
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
- if (newSelectedRow != null &&
- newSelectedRow < routes.size()) {
- route = routes.get(newSelectedRow);
+ Route route = flightUIModel.getRouteEditBean();
+ if (route != null) {
- if (logger.isInfoEnabled()) {
- logger.info("Select route from index {}", newSelectedRow);
- }
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Set observer %s for position %s", newValue, position));
+ }
- if (flightUIModel.isValidationMode()) {
- getParentUI().getHandler().getFlightController().setCurrentRoute(route);
- }
+ FlightService flightService = context.getService(FlightService.class);
+ flightService.setRouteObserverByPosition(route, newValue, position);
- } else {
- if (logger.isInfoEnabled()) {
- logger.info("No route selected");
- }
+ // the method setObserverByPosition could update other positions
+ // so we need to refresh all comboboxes
+ comboIsAdjusting = true;
+
+ try {
+ if (Position.NAVIGATOR != position) {
+ ObserverPosition navPosition = route.getObserverPositionByPosition(Position.NAVIGATOR);
+ ui.getNavComboBox().setSelectedItem(navPosition.getObserver());
+ }
+
+ if (Position.FRONT_LEFT != position) {
+ ObserverPosition leftPosition = route.getObserverPositionByPosition(Position.FRONT_LEFT);
+ ui.getLeftComboBox().setSelectedItem(leftPosition.getObserver());
+ }
+
+ if (Position.FRONT_RIGHT != position) {
+ ObserverPosition rightPosition = route.getObserverPositionByPosition(Position.FRONT_RIGHT);
+ ui.getRightComboBox().setSelectedItem(rightPosition.getObserver());
+ }
+
+ if (Position.CO_NAVIGATOR != position) {
+ ObserverPosition conavPosition = route.getObserverPositionByPosition(Position.CO_NAVIGATOR);
+ ui.getConavComboBox().setSelectedItem(conavPosition.getObserver());
+ }
+ } finally {
+
+ comboIsAdjusting = false;
+ }
+
+ // Fire on TableModel to update the row (highlighting)
+ // ensureRowIndex in case of new route, otherwise the size is
+ // not updated yet in tableModel and an IndexOutOfBounds appears
+ int index = flightUIModel.indexOfRoutes(route);
+ SwingUtil.ensureRowIndex(ui.getRouteTableModel(), index);
+ ui.getRouteTableModel().fireTableRowsUpdated(index, index);
+
+ // Update observation table to ensure observer's name during validation
+ if (flightUIModel.isValidationMode()) {
+ fireObservationsUpdated(route, false);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void stateChanged(DeviceStateEvent event) {
+ DeviceState state = event.getNewValue();
+ if (DeviceState.ERROR == state) {
+ ui.getObservationTable().setBackground(DEVICE_ERROR_BACKGROUND_COLOR);
+
+ } else {
+ ui.getObservationTable().setBackground(Color.WHITE);
+ }
+ }
+
+ public void initRouteTable() {
+
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
+
+ JXTable table = ui.getRouteTable();
+ RouteTableModel tableModel = ui.getRouteTableModel();
+
+ SwingUtil.setI18nTableHeaderRenderer(
+ table,
+ n_("sammoa.observations.routeTable.column.effortNumber"),
+ n_("sammoa.observations.routeTable.column.effortNumber.tip"),
+ n_("sammoa.observations.routeTable.column.beginTime"),
+ n_("sammoa.observations.routeTable.column.beginTime.tip"),
+ n_("sammoa.observations.routeTable.column.routeType"),
+ n_("sammoa.observations.routeTable.column.routeType.tip"),
+ n_("sammoa.observations.routeTable.column.transect"),
+ n_("sammoa.observations.routeTable.column.transect.tip"),
+ n_("sammoa.observations.routeTable.column.seaState"),
+ n_("sammoa.observations.routeTable.column.seaState.tip"),
+ n_("sammoa.observations.routeTable.column.swell"),
+ n_("sammoa.observations.routeTable.column.swell.tip"),
+ n_("sammoa.observations.routeTable.column.turbidity"),
+ n_("sammoa.observations.routeTable.column.turbidity.tip"),
+ n_("sammoa.observations.routeTable.column.skyGlint"),
+ n_("sammoa.observations.routeTable.column.skyGlint.tip"),
+ n_("sammoa.observations.routeTable.column.glareFrom"),
+ n_("sammoa.observations.routeTable.column.glareFrom.tip"),
+ n_("sammoa.observations.routeTable.column.glareTo"),
+ n_("sammoa.observations.routeTable.column.glareTo.tip"),
+ n_("sammoa.observations.routeTable.column.glareSeverity"),
+ n_("sammoa.observations.routeTable.column.glareSeverity.tip"),
+ n_("sammoa.observations.routeTable.column.glareUnder"),
+ n_("sammoa.observations.routeTable.column.glareUnder.tip"),
+ n_("sammoa.observations.routeTable.column.cloudCover"),
+ n_("sammoa.observations.routeTable.column.cloudCover.tip"),
+ n_("sammoa.observations.routeTable.column.subjectiveConditions"),
+ n_("sammoa.observations.routeTable.column.subjectiveConditions.tip"),
+ n_("sammoa.observations.routeTable.column.unexpectedLeft"),
+ n_("sammoa.observations.routeTable.column.unexpectedLeft.tip"),
+ n_("sammoa.observations.routeTable.column.unexpectedRight"),
+ n_("sammoa.observations.routeTable.column.unexpectedRight.tip"),
+ n_("sammoa.observations.routeTable.column.comment"),
+ n_("sammoa.observations.routeTable.column.comment.tip"),
+ n_("sammoa.observations.routeTable.column.deleted"),
+ n_("sammoa.observations.routeTable.column.deleted.tip")
+ );
+
+ init(table, new ListSelectionListener() {
+
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+
+ if (!e.getValueIsAdjusting()) {
+
+ ListSelectionModel listSelectionModel =
+ (ListSelectionModel) e.getSource();
+ int firstIndex = e.getFirstIndex();
+ int lastIndex = e.getLastIndex();
+ Integer newSelectedRow = null;
+
+ if (listSelectionModel.isSelectionEmpty()) {
+
+ // no selection
+ } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+
+ // use first index
+ newSelectedRow = firstIndex;
+ } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
+
+ // use last index
+ newSelectedRow = lastIndex;
+ }
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
+ List<Route> routes = flightUIModel.getRoutes();
+ Route route = null;
+
+ if (newSelectedRow != null &&
+ newSelectedRow < routes.size()) {
+ route = routes.get(newSelectedRow);
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Select route from index {}", newSelectedRow);
}
- // set new route in model to validate
- flightUIModel.setRouteEditBean(route);
+ } else {
+ if (logger.isInfoEnabled()) {
+ logger.info("No route selected");
+ }
}
+
+ // set new route in model to validate
+ flightUIModel.setRouteEditBean(route);
}
- });
+ }
+ });
- SwingUtil.setI18nTableHeaderRenderer(
- table,
- n_("sammoa.observations.routeTable.column.effortNumber"),
- n_("sammoa.observations.routeTable.column.effortNumber.tip"),
- n_("sammoa.observations.routeTable.column.beginTime"),
- n_("sammoa.observations.routeTable.column.beginTime.tip"),
- n_("sammoa.observations.routeTable.column.routeType"),
- n_("sammoa.observations.routeTable.column.routeType.tip"),
- n_("sammoa.observations.routeTable.column.transect"),
- n_("sammoa.observations.routeTable.column.transect.tip"),
- n_("sammoa.observations.routeTable.column.seaState"),
- n_("sammoa.observations.routeTable.column.seaState.tip"),
- n_("sammoa.observations.routeTable.column.swell"),
- n_("sammoa.observations.routeTable.column.swell.tip"),
- n_("sammoa.observations.routeTable.column.turbidity"),
- n_("sammoa.observations.routeTable.column.turbidity.tip"),
- n_("sammoa.observations.routeTable.column.skyGlint"),
- n_("sammoa.observations.routeTable.column.skyGlint.tip"),
- n_("sammoa.observations.routeTable.column.glareFrom"),
- n_("sammoa.observations.routeTable.column.glareFrom.tip"),
- n_("sammoa.observations.routeTable.column.glareTo"),
- n_("sammoa.observations.routeTable.column.glareTo.tip"),
- n_("sammoa.observations.routeTable.column.glareSeverity"),
- n_("sammoa.observations.routeTable.column.glareSeverity.tip"),
- n_("sammoa.observations.routeTable.column.glareUnder"),
- n_("sammoa.observations.routeTable.column.glareUnder.tip"),
- n_("sammoa.observations.routeTable.column.cloudCover"),
- n_("sammoa.observations.routeTable.column.cloudCover.tip"),
- n_("sammoa.observations.routeTable.column.subjectiveConditions"),
- n_("sammoa.observations.routeTable.column.subjectiveConditions.tip"),
- n_("sammoa.observations.routeTable.column.unexpectedLeft"),
- n_("sammoa.observations.routeTable.column.unexpectedLeft.tip"),
- n_("sammoa.observations.routeTable.column.unexpectedRight"),
- n_("sammoa.observations.routeTable.column.unexpectedRight.tip"),
- n_("sammoa.observations.routeTable.column.comment"),
- n_("sammoa.observations.routeTable.column.comment.tip"),
- n_("sammoa.observations.routeTable.column.deleted"),
- n_("sammoa.observations.routeTable.column.deleted.tip")
- );
-
+ // Listeners
+ {
int columnToEditOnInsert = RouteTableModel.RouteColumn.SEA_STATE.ordinal();
flightUIModel.addPropertyChangeListener(
FlightUIModel.PROPERTY_ROUTES,
new TableDataChangeListener(table, columnToEditOnInsert)
);
- // Highlighter for no modification
- table.addHighlighter(
- SammoaUtil.newForegroundColorHighlighter(
- new RouteNoModificationHighlightPredicate(tableModel),
- SammoaColors.ROUTE_NO_MODIFICATION_ROW_COLOR)
- );
+ if (flightUIModel.isValidationMode()) {
+ flightUIModel.addPropertyChangeListener(
+ FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN,
+ new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ Route route = (Route) evt.getNewValue();
+ getParentUI().getHandler().getFlightController().setCurrentRoute(route);
+ }
+ }
+ );
+ }
+ }
+
+ // Validation
+ {
+ JTable errorTable = ui.getErrorTable();
+ SwingListValidatorMessageTableModel errorTableModel = ui.getErrorTableModel();
+
+ BeanListValidator<Route> validator = ui.getRouteValidator();
+ validator.setContext(getValidatorContext());
+ getParentUI().setContextValue(validator, ROUTE_VALIDATOR_CONTEXT_VALUE);
+
RouteValidatorDataLocator dataLocator = new RouteValidatorDataLocator();
SwingValidatorUtil.registerListValidator(
validator,
errorTableModel,
table,
- errorTable, dataLocator);
+ errorTable,
+ dataLocator
+ );
addHightLighterOnEditor(
- validator, table, dataLocator,
+ validator,
+ table,
+ dataLocator,
NuitonValidatorScope.ERROR,
- NuitonValidatorScope.WARNING);
+ NuitonValidatorScope.WARNING
+ );
+ for (Route route : tableModel.getBean()) {
+ validator.addBean(route);
+ }
+ }
+
+ // Highlighters
+ {
table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ new RouteNoModificationHighlightPredicate(tableModel),
+ SammoaColors.ROUTE_NO_MODIFICATION_ROW_COLOR)
+ );
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new DeletedRowHighlightPredicate(flightUIModel.getRoutes()),
SammoaColors.DELETED_ROW_COLOR)
);
@@ -310,32 +454,106 @@
new ValidRowHighlightPredicate(flightUIModel.getRoutes()),
SammoaColors.VALID_ROW_COLOR)
);
-
- for (Route route : tableModel.getBean()) {
- validator.addBean(route);
- }
}
+ }
- // init observation section
- {
- JXTable table = ui.getObservationTable();
+ public void initObservationTable() {
- BeanListValidator<Observation> validator = ui.getObservationValidator();
- validator.setContext(validatorContext);
- getParentUI().setContextValue(validator, OBSERVATION_VALIDATOR_CONTEXT_VALUE);
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
- FlightController flightController =
- getParentUI().getHandler().getFlightController();
+ JXTable table = ui.getObservationTable();
+ ObservationTableModel tableModel = ui.getObservationTableModel();
- if (flightUIModel.isValidationMode()) {
+ SwingUtil.setI18nTableHeaderRenderer(
+ table,
+ n_("sammoa.observations.observationTable.column.observationNumber"),
+ n_("sammoa.observations.observationTable.column.observationNumber.tip"),
+ n_("sammoa.observations.observationTable.column.observationTime"),
+ n_("sammoa.observations.observationTable.column.observationTime.tip"),
+ n_("sammoa.observations.observationTable.column.position"),
+ n_("sammoa.observations.observationTable.column.position.tip"),
+ n_("sammoa.observations.observationTable.column.podSize"),
+ n_("sammoa.observations.observationTable.column.podSize.tip"),
+ n_("sammoa.observations.observationTable.column.species"),
+ n_("sammoa.observations.observationTable.column.species.tip"),
+ n_("sammoa.observations.observationTable.column.age"),
+ n_("sammoa.observations.observationTable.column.age.tip"),
+ n_("sammoa.observations.observationTable.column.decAngle"),
+ n_("sammoa.observations.observationTable.column.decAngle.tip"),
+ n_("sammoa.observations.observationTable.column.cue"),
+ n_("sammoa.observations.observationTable.column.cue.tip"),
+ n_("sammoa.observations.observationTable.column.behaviour"),
+ n_("sammoa.observations.observationTable.column.behaviour.tip"),
+ n_("sammoa.observations.observationTable.column.swimDir"),
+ n_("sammoa.observations.observationTable.column.swimDir.tip"),
+ n_("sammoa.observations.observationTable.column.calves"),
+ n_("sammoa.observations.observationTable.column.calves.tip"),
+ n_("sammoa.observations.observationTable.column.photo"),
+ n_("sammoa.observations.observationTable.column.photo.tip"),
+ n_("sammoa.observations.observationTable.column.comment"),
+ n_("sammoa.observations.observationTable.column.comment.tip"),
+ n_("sammoa.observations.observationTable.column.observationStatus"),
+ n_("sammoa.observations.observationTable.column.observationStatus.tip"),
+ n_("sammoa.observations.observationTable.column.deleted"),
+ n_("sammoa.observations.observationTable.column.deleted.tip"),
+ n_("sammoa.observations.observationTable.column.circleback"),
+ n_("sammoa.observations.observationTable.column.circleback.tip")
+ );
- // nothing for the moment
+ init(table, new ListSelectionListener() {
- } else {
- flightController.getDeviceManager(GpsHandler.class).addDeviceStateListener(this);
- flightController.getDeviceManager(AudioRecorder.class).addDeviceStateListener(this);
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
+
+ if (!e.getValueIsAdjusting()) {
+
+ ListSelectionModel listSelectionModel =
+ (ListSelectionModel) e.getSource();
+ int firstIndex = e.getFirstIndex();
+ int lastIndex = e.getLastIndex();
+ Integer newSelectedRow = null;
+
+ if (listSelectionModel.isSelectionEmpty()) {
+
+ // no selection
+ } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+
+ // use first index
+ newSelectedRow = firstIndex;
+ } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
+
+ // use last index
+ newSelectedRow = lastIndex;
+ }
+ List<Observation> observations = flightUIModel.getObservations();
+ Observation observation = null;
+
+ if (newSelectedRow != null &&
+ newSelectedRow < observations.size()) {
+ observation = observations.get(newSelectedRow);
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Select observation from index {}", newSelectedRow);
+ }
+
+ } else {
+ if (logger.isInfoEnabled()) {
+ logger.info("No observation selected");
+ }
+ }
+
+ // set new observation in model to validate
+ flightUIModel.setObservationEditBean(observation);
+ }
}
+ });
+ // Listeners
+ {
+ FlightController flightController =
+ getParentUI().getHandler().getFlightController();
int columnToEditOnInsert = ObservationTableModel.ObservationColumn.POD_SIZE.ordinal();
flightUIModel.addPropertyChangeListener(
@@ -345,107 +563,118 @@
// For CircleBack buttons
flightUIModel.addPropertyChangeListener(
- FlightUIModel.PROPERTY_FLIGHT_STATE, observationUpdateListener);
+ FlightUIModel.PROPERTY_FLIGHT_STATE,
+ new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+
+ FlightUIModel model = (FlightUIModel) evt.getSource();
+
+ if (model.sizeObservations() > 0) {
+
+ ui.getObservationTableModel().fireTableRowsUpdated(
+ 0, model.sizeObservations() - 1);
+ }
+ }
+ });
+
// For highlighting depends on selected route
flightUIModel.addPropertyChangeListener(
- FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, observationUpdateListener);
+ FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN,
+ new PropertyChangeListener() {
- SwingUtil.setI18nTableHeaderRenderer(
- table,
- n_("sammoa.observations.observationTable.column.observationNumber"),
- n_("sammoa.observations.observationTable.column.observationNumber.tip"),
- n_("sammoa.observations.observationTable.column.observationTime"),
- n_("sammoa.observations.observationTable.column.observationTime.tip"),
- n_("sammoa.observations.observationTable.column.position"),
- n_("sammoa.observations.observationTable.column.position.tip"),
- n_("sammoa.observations.observationTable.column.podSize"),
- n_("sammoa.observations.observationTable.column.podSize.tip"),
- n_("sammoa.observations.observationTable.column.species"),
- n_("sammoa.observations.observationTable.column.species.tip"),
- n_("sammoa.observations.observationTable.column.age"),
- n_("sammoa.observations.observationTable.column.age.tip"),
- n_("sammoa.observations.observationTable.column.decAngle"),
- n_("sammoa.observations.observationTable.column.decAngle.tip"),
- n_("sammoa.observations.observationTable.column.cue"),
- n_("sammoa.observations.observationTable.column.cue.tip"),
- n_("sammoa.observations.observationTable.column.behaviour"),
- n_("sammoa.observations.observationTable.column.behaviour.tip"),
- n_("sammoa.observations.observationTable.column.swimDir"),
- n_("sammoa.observations.observationTable.column.swimDir.tip"),
- n_("sammoa.observations.observationTable.column.calves"),
- n_("sammoa.observations.observationTable.column.calves.tip"),
- n_("sammoa.observations.observationTable.column.photo"),
- n_("sammoa.observations.observationTable.column.photo.tip"),
- n_("sammoa.observations.observationTable.column.comment"),
- n_("sammoa.observations.observationTable.column.comment.tip"),
- n_("sammoa.observations.observationTable.column.observationStatus"),
- n_("sammoa.observations.observationTable.column.observationStatus.tip"),
- n_("sammoa.observations.observationTable.column.deleted"),
- n_("sammoa.observations.observationTable.column.deleted.tip"),
- n_("sammoa.observations.observationTable.column.circleback"),
- n_("sammoa.observations.observationTable.column.circleback.tip")
- );
-
-// init(dataTable, new ObservationTableListSelectionListener(ui.getFlightUIModel()));
- init(table, new ListSelectionListener() {
@Override
- public void valueChanged(ListSelectionEvent e) {
+ public void propertyChange(PropertyChangeEvent evt) {
- FlightUIModel flightUIModel = ui.getFlightUIModel();
+ Route oldValue = (Route) evt.getOldValue();
+ if (oldValue != null) {
+ fireObservationsUpdated(oldValue, false);
+ }
+ Route newValue = (Route) evt.getNewValue();
+ if (newValue != null) {
+ fireObservationsUpdated(newValue, true);
+ }
+ }
+ });
- if (!e.getValueIsAdjusting()) {
+ if (flightUIModel.isValidationMode()) {
- ListSelectionModel listSelectionModel =
- (ListSelectionModel) e.getSource();
- int firstIndex = e.getFirstIndex();
- int lastIndex = e.getLastIndex();
- Integer newSelectedRow = null;
+ // For validation, time change is listening to properly select the route
+ flightUIModel.addPropertyChangeListener(
+ FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN,
+ new PropertyChangeListener() {
- if (listSelectionModel.isSelectionEmpty()) {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
- // no selection
- } else if (listSelectionModel.isSelectedIndex(firstIndex)) {
+ Observation oldValue = (Observation) evt.getNewValue();
+ if (oldValue != null) {
+ oldValue.removePropertyChangeListener(
+ Observation.PROPERTY_OBSERVATION_TIME,
+ observationTimeChangeListener);
+ }
+ Observation newValue = (Observation) evt.getNewValue();
+ if (newValue != null) {
+ newValue.addPropertyChangeListener(
+ Observation.PROPERTY_OBSERVATION_TIME,
+ observationTimeChangeListener);
- // use first index
- newSelectedRow = firstIndex;
- } else if (listSelectionModel.isSelectedIndex(lastIndex)) {
-
- // use last index
- newSelectedRow = lastIndex;
+ selectRouteByObservation(newValue);
}
- List<Observation> observations = flightUIModel.getObservations();
- Observation observation = null;
+ }
+ });
- if (newSelectedRow != null &&
- newSelectedRow < observations.size()) {
- observation = observations.get(newSelectedRow);
+ } else {
+ flightController.getDeviceManager(GpsHandler.class).addDeviceStateListener(this);
+ flightController.getDeviceManager(AudioRecorder.class).addDeviceStateListener(this);
+ }
+ }
- if (logger.isInfoEnabled()) {
- logger.info("Select observation from index {}", newSelectedRow);
- }
+ table.addHighlighter(
+ SammoaUtil.newBackgroundColorHighlighter(
+ new ObservationForSelectedRouteHighlightPredicate(flightUIModel),
+ SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR)
+ );
- // We need to auto-select the route in validation mode
- if (flightUIModel.isValidationMode()) {
- Route route = Routes.findWithObservation(
- flightUIModel.getRoutes(), observation, true);
+ // Validation
+ {
+ JTable errorTable = ui.getErrorTable();
+ SwingListValidatorMessageTableModel errorTableModel = ui.getErrorTableModel();
- int routeIndex = flightUIModel.indexOfRoutes(route);
- ui.getRouteTable().getSelectionModel().setSelectionInterval(routeIndex, routeIndex);
- }
+ BeanListValidator<Observation> validator = ui.getObservationValidator();
+ validator.setContext(getValidatorContext());
+ getParentUI().setContextValue(validator, OBSERVATION_VALIDATOR_CONTEXT_VALUE);
- } else {
- if (logger.isInfoEnabled()) {
- logger.info("No observation selected");
- }
- }
+ ObservationValidatorDataLocator dataLocator =
+ new ObservationValidatorDataLocator();
- // set new observation in model to validate
- flightUIModel.setObservationEditBean(observation);
- }
- }
- });
+ SwingValidatorUtil.registerListValidator(
+ validator,
+ errorTableModel,
+ table,
+ errorTable,
+ dataLocator
+ );
+ addHightLighterOnEditor(
+ validator,
+ table,
+ dataLocator,
+ NuitonValidatorScope.ERROR,
+ NuitonValidatorScope.WARNING
+ );
+
+ for (Observation observation : tableModel.getBean()) {
+ validator.addBean(observation);
+ }
+ }
+
+ // Renderers/Editors/Highlighters
+ {
+ UIDecoratorService decoratorService =
+ context.getService(UIDecoratorService.class);
+
TableCellRenderer stringRenderer = table.getDefaultRenderer(String.class);
// ObservationStatus
@@ -499,26 +728,6 @@
column.setCellRenderer(editorRenderer);
}
- ObservationValidatorDataLocator dataLocator =
- new ObservationValidatorDataLocator();
-
- SwingValidatorUtil.registerListValidator(
- validator,
- errorTableModel,
- table,
- errorTable, dataLocator);
-
- table.addHighlighter(
- SammoaUtil.newBackgroundColorHighlighter(
- new ObservationForSelectedRouteHighlightPredicate(flightUIModel),
- SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR)
- );
-
- addHightLighterOnEditor(
- validator, table, dataLocator,
- NuitonValidatorScope.ERROR,
- NuitonValidatorScope.WARNING);
-
table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new DeletedRowHighlightPredicate(flightUIModel.getObservations()),
SammoaColors.DELETED_ROW_COLOR)
@@ -527,139 +736,12 @@
new ValidRowHighlightPredicate(flightUIModel.getObservations()),
SammoaColors.VALID_ROW_COLOR)
);
-
- ObservationTableModel tableModel = ui.getObservationTableModel();
- for (Observation observation : tableModel.getBean()) {
- validator.addBean(observation);
- }
}
}
-
- /**
- * Add hightlighters on the editor of beans.
- *
- * @param validator the validator where to find bean states
- * @param editor the editor of beans
- * @param dataLocator the data locator
- * @param scopes scopes to hightlight
- * @param <O> type of bean to validate
- * @since 2.5.3
- */
- public static <O> void addHightLighterOnEditor(BeanListValidator<O> validator,
- JXTable editor,
- SwingListValidatorDataLocator<O> dataLocator,
- NuitonValidatorScope... scopes) {
-
- for (NuitonValidatorScope scope : scopes) {
-
- SwingListValidatorHighlightPredicate<O> predicate = SwingListValidatorHighlightPredicate.newPredicate(
- scope,
- validator, dataLocator
- );
-
- Highlighter highlighter = SammoaUtil.newBackgroundColorHighlighter(
- predicate, SwingValidatorUtil.getColor(scope));
- editor.addHighlighter(highlighter);
- }
- }
-
- public Observer getObserverByPosition(Route route, Position position) {
- Observer result;
- if (route != null) {
- ObserverPosition observerPosition =
- route.getObserverPositionByPosition(position);
- result = observerPosition.getObserver();
-
- } else {
- result = null;
- }
- return result;
- }
-
- public void setObserverByPosition(Observer newValue, Position position) {
- if (!comboIsAdjusting) {
-
- FlightUIModel flightUIModel = ui.getFlightUIModel();
-
- Route route = flightUIModel.getRouteEditBean();
- if (route != null) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(String.format("Set observer %s for position %s", newValue, position));
- }
-
- FlightService flightService = context.getService(FlightService.class);
- flightService.setRouteObserverByPosition(route, newValue, position);
-
- // the method setObserverByPosition could update other positions
- // so we need to refresh all comboboxes
- comboIsAdjusting = true;
-
- try {
- if (Position.NAVIGATOR != position) {
- ObserverPosition navPosition = route.getObserverPositionByPosition(Position.NAVIGATOR);
- ui.getNavComboBox().setSelectedItem(navPosition.getObserver());
- }
-
- if (Position.FRONT_LEFT != position) {
- ObserverPosition leftPosition = route.getObserverPositionByPosition(Position.FRONT_LEFT);
- ui.getLeftComboBox().setSelectedItem(leftPosition.getObserver());
- }
-
- if (Position.FRONT_RIGHT != position) {
- ObserverPosition rightPosition = route.getObserverPositionByPosition(Position.FRONT_RIGHT);
- ui.getRightComboBox().setSelectedItem(rightPosition.getObserver());
- }
-
- if (Position.CO_NAVIGATOR != position) {
- ObserverPosition conavPosition = route.getObserverPositionByPosition(Position.CO_NAVIGATOR);
- ui.getConavComboBox().setSelectedItem(conavPosition.getObserver());
- }
- } finally {
-
- comboIsAdjusting = false;
- }
-
- // Fire on TableModel to update the row (highlighting)
- // ensureRowIndex in case of new route, otherwise the size is
- // not updated yet in tableModel and an IndexOutOfBounds appears
- int index = flightUIModel.indexOfRoutes(route);
- SwingUtil.ensureRowIndex(ui.getRouteTableModel(), index);
- ui.getRouteTableModel().fireTableRowsUpdated(index, index);
-
- // Update observation table to ensure observer's name during validation
- if (flightUIModel.isValidationMode()) {
- updateObservationTable(route, false);
- }
- }
- }
- }
-
- @Override
- public void stateChanged(DeviceStateEvent event) {
- DeviceState state = event.getNewValue();
- if (DeviceState.ERROR == state) {
- ui.getObservationTable().setBackground(DEVICE_ERROR_BACKGROUND_COLOR);
-
- } else {
- ui.getObservationTable().setBackground(Color.WHITE);
- }
- }
-
public void init(final JXTable table,
- ListSelectionListener selectionListener) {
+ ListSelectionListener selectionListener) {
- // make tab key to focus only next editable cell
-// table.setSelectionModel(new ForceSelectionSelectionModel());
-// table.setSelectionBackground(null);
-// table.setSelectionForeground(Color.BLACK);
-//
-//// table.setSortable(context.isValidationMode());
-// table.setSortable(false);
-
-// table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
-
final Action moveToNextEditableCell = new MoveToNextEditableCellAction(table);
final Action moveToPreviousEditableCell = new MoveToPreviousEditableCellAction(table);
final Action moveToPreviousRowEditableCell = new MoveToPreviousRowEditableAction(table);
@@ -674,6 +756,7 @@
// Key adapter à ajouter sur les éditeurs où l'on souhaite gérer les
// touches "entrer", "gauche", "doite" de facon personnalisée.
KeyListener goNextCellAdapter = new KeyAdapter() {
+
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER ||
@@ -693,7 +776,7 @@
}
};
- // TextCellEditor
+ // Text
{
TextCellEditor editor = new TextCellEditor();
JTextField textField = editor.getComponent();
@@ -702,7 +785,8 @@
// textField.setBorder(BasicBorders.getTextFieldBorder());
table.setDefaultEditor(String.class, editor);
}
- // NumberCellEditor
+
+ // Number
{
NumberCellEditor<Integer> editor =
JAXXWidgetUtil.newNumberTableCellEditor(Integer.class, false);
@@ -715,48 +799,41 @@
table.setDefaultEditor(Integer.class, editor);
}
- // Boolean editor
+ // Boolean
{
+ TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class);
+ table.setDefaultRenderer(boolean.class, renderer);
+
TableCellEditor editor = table.getDefaultEditor(Boolean.class);
table.setDefaultEditor(boolean.class, editor);
- TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class);
- table.setDefaultRenderer(boolean.class, renderer);
}
- // Renderers
- TableCellRenderer defaultDateCellRenderer = table.getDefaultRenderer(Date.class);
- table.setDefaultRenderer(Date.class, JAXXWidgetUtil.newDateTableCellRenderer(defaultDateCellRenderer, _("sammoa.timePattern")));
+ // Date
+ {
+ TableCellRenderer defaultDateCellRenderer = table.getDefaultRenderer(Date.class);
+ TableCellRenderer renderer = JAXXWidgetUtil.newDateTableCellRenderer(
+ defaultDateCellRenderer, _("sammoa.timePattern"));
+ table.setDefaultRenderer(Date.class, renderer);
+ JAXXDatePicker datePicker = new JAXXDatePicker();
+ datePicker.setShowPopupButton(false);
+ datePicker.setPatternLayout(_("sammoa.timePattern"));
+ JTextField textField = datePicker.getEditor();
+// textField.addKeyListener(goNextCellAdapter);
+ textField.setBorder(new LineBorder(Color.GRAY, 2));
+ table.setDefaultEditor(Date.class, new TimeCellEditor(datePicker));
+ }
+
table.getSelectionModel().addListSelectionListener(selectionListener);
SwingUtil.scrollToTableSelection(table);
+ }
-// table.getModel().addTableModelListener(new TableModelListener() {
-// @Override
-// public void tableChanged(TableModelEvent e) {
-// switch (e.getType()) {
-// case TableModelEvent.INSERT:
-//
-// // auto select new added line
-// table.getSelectionModel().setSelectionInterval(e.getFirstRow(), e.getFirstRow());
-// Rectangle rect = table.getCellRect(e.getFirstRow(), 0, true);
-// table.scrollRectToVisible(rect);
-// break;
-//
-// case TableModelEvent.DELETE:
-// case TableModelEvent.UPDATE:
-//
-// // auto select first line ?
-// if (table.getSelectedRow() < 0 && table.getRowCount() > 0) {
-// table.getSelectionModel().setSelectionInterval(0, 0);
-// }
-// break;
-// }
-// }
-// });
+ protected String getValidatorContext() {
+ return ui.getFlightUIModel().isValidationMode() ? "validation" : "onBoard";
}
- protected void updateObservationTable(Route route, boolean scrollToFirst) {
+ protected void fireObservationsUpdated(Route route, boolean scrollToFirst) {
FlightUIModel model = ui.getFlightUIModel();
@@ -786,31 +863,22 @@
}
}
- private PropertyChangeListener observationUpdateListener = new PropertyChangeListener() {
+ protected void selectRouteByObservation(Observation observation) {
- @Override
- public void propertyChange(PropertyChangeEvent evt) {
+ FlightUIModel flightUIModel = ui.getFlightUIModel();
-// int selectedRow = ui.getObservationTable().getSelectedRow();
+ Route route = Routes.findWithObservation(
+ flightUIModel.getRoutes(), observation, true);
-// ui.getObservationTableModel().fireTableDataChanged();
+ int routeIndex = flightUIModel.indexOfRoutes(route);
+ ui.getRouteTable().getSelectionModel().setSelectionInterval(routeIndex, routeIndex);
+ }
- if (FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN.equals(evt.getPropertyName())) {
+ private PropertyChangeListener observationTimeChangeListener = new PropertyChangeListener() {
- Route oldValue = (Route) evt.getOldValue();
- if (oldValue != null) {
- updateObservationTable(oldValue, false);
- }
- Route newValue = (Route) evt.getNewValue();
- if (newValue != null) {
- updateObservationTable(newValue, true);
- }
-
- } else if (ui.getFlightUIModel().sizeObservations() > 0) {
-
- ui.getObservationTableModel().fireTableRowsUpdated(
- 0, ui.getFlightUIModel().sizeObservations() - 1);
- }
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ selectRouteByObservation((Observation) evt.getSource());
}
};
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -79,7 +79,7 @@
public boolean isCellEditable(int row, int column) {
Observation observation = getBean(row);
ObservationColumn observationColumn = ObservationColumn.valueOf(column);
- boolean result = observationColumn.isEditable(observation);
+ boolean result = observationColumn.isEditable(observation, flightUIModel.isValidationMode());
return result;
}
@@ -133,7 +133,13 @@
public enum ObservationColumn {
OBSERVATION_NUMBER(false, int.class, Observation.PROPERTY_OBSERVATION_NUMBER),
- OBSERVATION_TIME(false, Date.class, Observation.PROPERTY_OBSERVATION_TIME),
+ OBSERVATION_TIME(true, Date.class, Observation.PROPERTY_OBSERVATION_TIME) {
+
+ @Override
+ public boolean isEditable(Observation bean, boolean validationMode) {
+ return super.isEditable(bean, validationMode) && validationMode;
+ }
+ },
POSITION(true, Position.class, Observation.PROPERTY_POSITION),
POD_SIZE(true, int.class, Observation.PROPERTY_POD_SIZE),
SPECIES(true, String.class, Observation.PROPERTY_SPECIES, Species.PROPERTY_CODE) {
@@ -231,7 +237,7 @@
}
}
- public boolean isEditable(Observation bean) {
+ public boolean isEditable(Observation bean, boolean validationMode) {
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-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -82,7 +82,7 @@
public boolean isCellEditable(int row, int column) {
Route route = getRow(row);
RouteColumn routeColumn = RouteColumn.valueOf(column);
- boolean result = routeColumn.isEditable(route);
+ boolean result = routeColumn.isEditable(route, flightUIModel.isValidationMode());
return result;
}
@@ -129,7 +129,13 @@
protected enum RouteColumn {
EFFORT_NUMBER(false, Integer.class, Route.PROPERTY_EFFORT_NUMBER),
- BEGIN_TIME(false, Date.class, Route.PROPERTY_BEGIN_TIME),
+ BEGIN_TIME(true, Date.class, Route.PROPERTY_BEGIN_TIME) {
+
+ @Override
+ public boolean isEditable(Route bean, boolean validationMode) {
+ return super.isEditable(bean, validationMode) && validationMode;
+ }
+ },
ROUTE_TYPE(false, RouteType.class, Route.PROPERTY_ROUTE_TYPE),
TRANSECT(false, String.class,
Route.PROPERTY_TRANSECT_FLIGHT,
@@ -209,7 +215,7 @@
}
}
- public boolean isEditable(Route bean) {
+ public boolean isEditable(Route bean, boolean validationMode) {
boolean result = !bean.isValid() && editable;
return result;
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TextCellEditor.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TextCellEditor.java 2012-08-30 13:27:48 UTC (rev 496)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TextCellEditor.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -42,7 +42,11 @@
private static final long serialVersionUID = 1L;
public TextCellEditor() {
- super(new JTextField());
+ this(new JTextField());
+ }
+
+ public TextCellEditor(JTextField textField) {
+ super(textField);
setClickCountToStart(1);
getComponent().addFocusListener(new FocusListener() {
Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java (rev 0)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java 2012-08-30 13:28:13 UTC (rev 497)
@@ -0,0 +1,90 @@
+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 jaxx.runtime.swing.JAXXDatePicker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.JTable;
+import javax.swing.table.TableCellEditor;
+import java.awt.Component;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Created: 17/07/12
+ *
+ * @author fdesbois <desbois(a)codelutin.com>
+ */
+public class TimeCellEditor extends TextCellEditor implements TableCellEditor {
+
+ /** Logger. */
+ private static final Logger logger = LoggerFactory.getLogger(TimeCellEditor.class);
+
+ private static final long serialVersionUID = 1L;
+
+ protected JAXXDatePicker datePicker;
+
+ protected Calendar referenceCalendar;
+
+ public TimeCellEditor(JAXXDatePicker datePicker) {
+ super(datePicker.getEditor());
+ this.datePicker = datePicker;
+ this.referenceCalendar = Calendar.getInstance();
+ }
+
+ @Override
+ public Component getTableCellEditorComponent(JTable table,
+ Object value,
+ boolean isSelected,
+ int row,
+ int column) {
+ Date date = (Date) value;
+ referenceCalendar.setTime(date);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Set editor date: %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", date));
+ }
+
+ datePicker.setDate(date);
+ return datePicker;
+ }
+
+ @Override
+ public Object getCellEditorValue() {
+
+ Calendar editCalendar = Calendar.getInstance();
+ editCalendar.setTime(datePicker.getDate());
+ editCalendar.set(Calendar.DATE, referenceCalendar.get(Calendar.DATE));
+ editCalendar.set(Calendar.MONTH, referenceCalendar.get(Calendar.MONTH));
+ editCalendar.set(Calendar.YEAR, referenceCalendar.get(Calendar.YEAR));
+
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Get editor date: %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", editCalendar.getTime()));
+ }
+
+ return editCalendar.getTime();
+ }
+}
Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TimeCellEditor.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
1
0
r496 - in trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application: device device/audio flightController
by fdesbois@users.forge.codelutin.com 30 Aug '12
by fdesbois@users.forge.codelutin.com 30 Aug '12
30 Aug '12
Author: fdesbois
Date: 2012-08-30 15:27:48 +0200 (Thu, 30 Aug 2012)
New Revision: 496
Url: http://forge.codelutin.com/repositories/revision/sammoa/496
Log:
refs #1197 : integration of SammoaAudioRecorder (not working on file change)
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.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/audio/SammoaAudioRecorder.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java 2012-08-30 13:27:33 UTC (rev 495)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManager.java 2012-08-30 13:27:48 UTC (rev 496)
@@ -45,7 +45,9 @@
*/
void start();
- /** Stop the device session */
+ /**
+ * Stop the device session
+ */
void stop();
/**
@@ -55,16 +57,24 @@
*/
void close() throws DeviceTechnicalException;
- /** @return the DeviceState */
+ /**
+ * @return the DeviceState
+ */
DeviceState getState();
- /** @param listener DeviceStateListener to add */
+ /**
+ * @param listener DeviceStateListener to add
+ */
void addDeviceStateListener(DeviceStateListener listener);
- /** @param listener DeviceStateListener to remove */
+ /**
+ * @param listener DeviceStateListener to remove
+ */
void removeDeviceStateListener(DeviceStateListener listener);
- /** @return all the listeners */
+ /**
+ * @return all the listeners
+ */
Set<DeviceStateListener> getDeviceStateListeners();
}
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-30 13:27:33 UTC (rev 495)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceManagerProvider.java 2012-08-30 13:27:48 UTC (rev 496)
@@ -31,7 +31,7 @@
import fr.ulr.sammoa.application.device.audio.AudioReader;
import fr.ulr.sammoa.application.device.audio.AudioReaderMock;
import fr.ulr.sammoa.application.device.audio.AudioRecorder;
-import fr.ulr.sammoa.application.device.audio.AudioRecorderDefault;
+import fr.ulr.sammoa.application.device.audio.SammoaAudioRecorder;
import fr.ulr.sammoa.application.device.gps.GpsConfig;
import fr.ulr.sammoa.application.device.gps.GpsHandler;
import fr.ulr.sammoa.application.device.gps.GpsLocationListener;
@@ -145,7 +145,8 @@
@Override
public AudioRecorder get() {
- return new AudioRecorderDefault();
+// return new AudioRecorderDefault();
+ return new SammoaAudioRecorder(44100, 16);
}
});
return result;
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-08-30 13:27:33 UTC (rev 495)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/audio/SammoaAudioRecorder.java 2012-08-30 13:27:48 UTC (rev 496)
@@ -25,14 +25,14 @@
package fr.ulr.sammoa.application.device.audio;
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 java.io.File;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
@@ -40,8 +40,11 @@
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
/**
* Created: 16/05/12
@@ -50,11 +53,11 @@
*/
public class SammoaAudioRecorder implements AudioRecorder {
- private static final Logger log = LoggerFactory.getLogger(SammoaAudioRecorder.class);
+ private static final Logger logger = LoggerFactory.getLogger(SammoaAudioRecorder.class);
protected AudioFormat audioFormat;
- protected AudioFileFormat.Type outputType = AudioFileFormat.Type.WAVE;
+ protected AudioFileFormat.Type outputType;
protected DeviceState state;
@@ -62,13 +65,12 @@
protected AudioRecorderThread currentRecorder;
- public SammoaAudioRecorder(
- float sampleRate, // 8000,11025,16000,22050,44100
- int sampleSizeInBits // 8,16
- ) {
+ public SammoaAudioRecorder(float sampleRate, // 8000,11025,16000,22050,44100
+ int sampleSizeInBits) { // 8,16
+
int channels = 1; // 1,2
- boolean signed = true; //true,false
- boolean bigEndian = false; //true,false
+ boolean signed = true; // true,false
+ boolean bigEndian = false; // true,false
audioFormat = new AudioFormat(
sampleRate,
@@ -76,17 +78,14 @@
channels,
signed,
bigEndian);
+
+ outputType = AudioFileFormat.Type.WAVE;
+ listeners = Sets.newHashSet();
}
@Override
public DeviceState getState() {
- DeviceState result;
- if (currentRecorder == null) {
- result = DeviceState.READY;
- } else {
- result = DeviceState.RUNNING;
- }
- return result;
+ return state;
}
public void setState(DeviceState state, DeviceTechnicalException error) {
@@ -123,28 +122,36 @@
@Override
public void open() throws DeviceTechnicalException {
- // rien a faire
+ setState(DeviceState.READY, null);
}
@Override
public void start() {
- // rien a faire
+ // nothing to do
}
@Override
public void record(File outputFile, long delaySeconds) {
- Preconditions.checkArgument(outputFile != null);
+ Preconditions.checkNotNull(outputFile);
try {
// stop last started if necessary
stop();
// start new recorder thread
currentRecorder = new AudioRecorderThread(
- audioFormat, outputType, outputFile, delaySeconds);
+ audioFormat, outputType, outputFile, delaySeconds, this);
currentRecorder.start();
- } catch (Exception eee) {
- eee.printStackTrace();
- log.error("Can't record audio", eee);
+
+ setState(DeviceState.RUNNING, null);
+
+ } catch (LineUnavailableException ex) {
+ fireError("Error recording " + outputFile.getName(), ex);
+ } catch (IllegalArgumentException ex) {
+ fireError("Error recording " + outputFile.getName(), ex);
+ } catch (IllegalStateException ex) {
+ fireError("Error recording " + outputFile.getName(), ex);
+ } catch (SecurityException ex) {
+ fireError("Error recording " + outputFile.getName(), ex);
}
}
@@ -158,6 +165,7 @@
if (currentRecorder != null) {
currentRecorder.stopRecord();
currentRecorder = null;
+ setState(DeviceState.READY, null);
}
}
@@ -166,26 +174,40 @@
stop();
}
- static protected class AudioRecorderThread extends Thread{
+ protected void fireError(String message, Throwable cause) {
+ if (logger.isErrorEnabled()) {
+ logger.error(message, cause);
+ }
+ DeviceTechnicalException error = new DeviceTechnicalException(
+ this, message, cause);
+ setState(DeviceState.ERROR, error);
+ }
+
+ protected static class AudioRecorderThread extends Thread {
+
protected TargetDataLine targetDataLine;
protected AudioFileFormat.Type fileType;
- protected File filename;
+ protected File file;
protected long delayToClose;
protected AudioInputStream stream;
+ protected SammoaAudioRecorder audioRecorder;
- public AudioRecorderThread(
- AudioFormat audioFormat, AudioFileFormat.Type fileType,
- File filename, long delayToClose) throws LineUnavailableException {
+ public AudioRecorderThread(AudioFormat audioFormat,
+ AudioFileFormat.Type fileType,
+ File file,
+ long delayToClose,
+ SammoaAudioRecorder audioRecorder)
+ throws LineUnavailableException {
+
this.fileType = fileType;
- this.filename = filename;
+ this.file = file;
this.delayToClose = delayToClose;
+ this.audioRecorder = audioRecorder;
-
DataLine.Info dataLineInfo = new DataLine.Info(
TargetDataLine.class, audioFormat);
- targetDataLine = (TargetDataLine)
- AudioSystem.getLine(dataLineInfo);
+ targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
AudioFormat.Encoding targetEncoding = AudioFormat.Encoding.ULAW;
targetDataLine.open(audioFormat);
@@ -200,29 +222,36 @@
* le parametre delayToClose passer lors de la construction du thread
*/
public void stopRecord() {
- System.out.println("Arret demande ...");
+ if (logger.isDebugEnabled()) {
+ logger.debug("Ask for stop record... close in {} seconds",
+ delayToClose);
+ }
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
targetDataLine.stop();
targetDataLine.close();
- System.out.println("... arret reel");
+ if (logger.isDebugEnabled()) {
+ logger.debug("Closing record: {}", file);
+ }
+
}
}, delayToClose * 1000);
}
@Override
public void run(){
- try{
- System.out.println("Write audio to: " + filename);
- log.debug("Write audio to: " + filename);
- AudioSystem.write(stream, fileType, filename);
- }catch (Exception eee) {
- eee.printStackTrace();
- log.error("Can't record audio", eee);
+ if (logger.isDebugEnabled()) {
+ logger.debug("Write audio to: {}", file);
}
+ try {
+ AudioSystem.write(stream, fileType, file);
+
+ } catch (IOException ex) {
+ audioRecorder.fireError("Error recording " + file.getName(), ex);
+ }
}
}
}
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-30 13:27:33 UTC (rev 495)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-08-30 13:27:48 UTC (rev 496)
@@ -88,7 +88,7 @@
if (state == FlightState.ON_EFFORT
|| currentRoute.getRouteType() == RouteType.CIRCLE_BACK) {
- saveAudio(0);
+ saveAudio(3);
}
}
}
@@ -141,7 +141,6 @@
if (RouteType.LEG == newRoute.getRouteType()
|| RouteType.CIRCLE_BACK == newRoute.getRouteType()) {
- // Stop previous recording after 3 seconds
saveAudio(3);
} else {
1
0
r495 - in trunk/sammoa-ui-swing/src/main: java/fr/ulr/sammoa/ui/swing resources/i18n
by fdesbois@users.forge.codelutin.com 30 Aug '12
by fdesbois@users.forge.codelutin.com 30 Aug '12
30 Aug '12
Author: fdesbois
Date: 2012-08-30 15:27:33 +0200 (Thu, 30 Aug 2012)
New Revision: 495
Url: http://forge.codelutin.com/repositories/revision/sammoa/495
Log:
refs #1422: little improvements
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java
trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
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-30 13:27:15 UTC (rev 494)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaColors.java 2012-08-30 13:27:33 UTC (rev 495)
@@ -51,7 +51,7 @@
// public static final Color NEXT_TRANSECT_ROW_COLOR = new Color(233, 255, 235);
- public static final Color NEXT_TRANSECT_ROW_COLOR = new Color(152, 106, 255);
+ public static final Color NEXT_TRANSECT_ROW_COLOR = new Color(200, 0, 255);
public static final Color OBSERVATION_FOR_ROUTE_ROW_COLOR = new Color(171, 214, 255);
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-30 13:27:15 UTC (rev 494)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-30 13:27:33 UTC (rev 495)
@@ -36,8 +36,8 @@
sammoa.action.quitExportMaps=Quit
sammoa.action.quitImportApplication=Quit
sammoa.action.reload.actions=Reload actions
-sammoa.action.reload.campaign=Reload home screen
sammoa.action.reload.gps=Reload GPS
+sammoa.action.reload.home=Reload home screen
sammoa.action.reload.ui=Reload sammoa ui
sammoa.action.right.tip=RIGHT \: create a new Observation for the observer on the right side
sammoa.action.save=Save
1
0
r494 - in trunk: sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight
by fdesbois@users.forge.codelutin.com 30 Aug '12
by fdesbois@users.forge.codelutin.com 30 Aug '12
30 Aug '12
Author: fdesbois
Date: 2012-08-30 15:27:15 +0200 (Thu, 30 Aug 2012)
New Revision: 494
Url: http://forge.codelutin.com/repositories/revision/sammoa/494
Log:
fixes #1432 : change strate order
Modified:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StrateDAOImpl.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.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/StrateModel.java
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StrateDAOImpl.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StrateDAOImpl.java 2012-08-29 15:37:14 UTC (rev 493)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/StrateDAOImpl.java 2012-08-30 13:27:15 UTC (rev 494)
@@ -32,14 +32,10 @@
public List<E> findAllByCampaignOrderedByCode(Campaign campaign) {
+ String ql = "FROM StrateImpl " +
+ "WHERE sector.campaign = :campaign " +
+ "ORDER BY sector.sectorNumber, code";
- String ql = String.format("FROM %1$s WHERE %2$s.%3$s = :campaign ORDER BY %4$s",
- StrateImpl.class.getSimpleName(),
- Strate.PROPERTY_SECTOR,
- Sector.PROPERTY_CAMPAIGN,
- Strate.PROPERTY_CODE
- );
-
try {
List<E> result = findAllByQuery(ql, "campaign", campaign);
return result;
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java 2012-08-29 15:37:14 UTC (rev 493)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Strates.java 2012-08-30 13:27:15 UTC (rev 494)
@@ -25,8 +25,7 @@
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Ordering;
+import com.google.common.collect.ComparisonChain;
import java.util.Comparator;
@@ -42,19 +41,19 @@
}
public static String getCode(Strate strate) {
- Preconditions.checkArgument(strate != null,
- "Can't retrieve code from null strate");
+ Preconditions.checkNotNull(strate,
+ "Can't retrieve code from null strate");
String result;
if (strate.getCode() == null) {
StrateType strateType = strate.getStrateType();
- Preconditions.checkArgument(strateType != null,
- "Can't retrieve code if strateType is null");
+ Preconditions.checkNotNull(strateType,
+ "Can't retrieve code if strateType is null");
Sector sector = strate.getSector();
- Preconditions.checkArgument(sector != null,
- "Can't retrieve code if sector is null");
+ Preconditions.checkNotNull(sector,
+ "Can't retrieve code if sector is null");
result = "" + strateType.getCode() + sector.getSectorNumber();
} else {
@@ -67,15 +66,19 @@
public static Function<Strate, String> toCode() {
return TO_CODE_FUNCTION;
}
+//
+// public static Predicate<Strate> withCode(String code) {
+// return new StrateWithCodePredicate(code);
+// }
+//
+// public static Comparator<Strate> orderByCode() {
+// return ORDER_BY_CODE_COMPARATOR;
+// }
- public static Predicate<Strate> withCode(String code) {
- return new StrateWithCodePredicate(code);
+ public static Comparator<Strate> orderBySector() {
+ return ORDER_BY_SECTOR_COMPARATOR;
}
- public static Comparator<Strate> onCode() {
- return ON_CODE_COMPARATOR;
- }
-
protected static Function<Strate, String> TO_CODE_FUNCTION =
new Function<Strate, String>() {
@@ -84,32 +87,46 @@
return input.getCode();
}
};
+//
+// protected static Comparator<Strate> ORDER_BY_CODE_COMPARATOR =
+// new Comparator<Strate>() {
+//
+// @Override
+// public int compare(Strate o1, Strate o2) {
+// int result = Ordering.natural()
+// .nullsFirst()
+// .compare(o1.getCode(), o2.getCode());
+// return result;
+// }
+// };
- protected static Comparator<Strate> ON_CODE_COMPARATOR =
+ protected static Comparator<Strate> ORDER_BY_SECTOR_COMPARATOR =
new Comparator<Strate>() {
@Override
public int compare(Strate o1, Strate o2) {
- int result = Ordering.natural()
- .nullsFirst()
- .compare(o1.getCode(), o2.getCode());
+ int result = ComparisonChain
+ .start()
+ .compare(o1.getSector().getSectorNumber(), o2.getSector().getSectorNumber())
+ .compare(o1.getStrateType(), o2.getStrateType())
+ .result();
return result;
}
};
+//
+// protected static class StrateWithCodePredicate
+// implements Predicate<Strate> {
+//
+// protected String code;
+//
+// public StrateWithCodePredicate(String code) {
+// this.code = code;
+// }
+//
+// @Override
+// public boolean apply(Strate input) {
+// return code.equals(input.getCode());
+// }
+// }
- protected static class StrateWithCodePredicate
- implements Predicate<Strate> {
-
- protected String code;
-
- public StrateWithCodePredicate(String code) {
- this.code = code;
- }
-
- @Override
- public boolean apply(Strate input) {
- return code.equals(input.getCode());
- }
- }
-
}
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-29 15:37:14 UTC (rev 493)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-30 13:27:15 UTC (rev 494)
@@ -630,19 +630,15 @@
public void showNewTransect() {
- // The first strate contains all transect and doesn't have any strate, we remove it because we don't need it
- // in TransectUI
+ // The first strate contains all transect and doesn't have any strate,
+ // we remove it because we don't need it in TransectUI
StrateModel allStrate = getModel().getStrates().get(0);
List<StrateModel> referential = Lists.newArrayList(getModel().getStrates());
referential.remove(allStrate);
- // We keep currentStrate only if there is a defined source strate
- StrateModel currentStrate;
- if (getModel().getCurrentStrate().getSource() != null) {
- currentStrate = getModel().getCurrentStrate();
-
- } else {
+ StrateModel currentStrate = getModel().getCurrentStrate();
+ if (allStrate.equals(currentStrate)) {
currentStrate = null;
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java 2012-08-29 15:37:14 UTC (rev 493)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/StrateModel.java 2012-08-30 13:27:15 UTC (rev 494)
@@ -25,6 +25,7 @@
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
import fr.ulr.sammoa.persistence.Strate;
import fr.ulr.sammoa.persistence.Strates;
import org.jdesktop.beans.AbstractSerializableBean;
@@ -77,7 +78,10 @@
@Override
public int compareTo(StrateModel o) {
- int result = Strates.onCode().compare(getSource(), o.getSource());
+ int result = Ordering
+ .from(Strates.orderBySector())
+ .nullsFirst()
+ .compare(getSource(), o.getSource());
return result;
}
1
0
r493 - in trunk/sammoa-ui-swing/src/main: java/fr/ulr/sammoa/ui/swing java/fr/ulr/sammoa/ui/swing/home resources/i18n
by fdesbois@users.forge.codelutin.com 29 Aug '12
by fdesbois@users.forge.codelutin.com 29 Aug '12
29 Aug '12
Author: fdesbois
Date: 2012-08-29 17:37:14 +0200 (Wed, 29 Aug 2012)
New Revision: 493
Url: http://forge.codelutin.com/repositories/revision/sammoa/493
Log:
fixes #1433 : resolve issue with new campaign + problem with systemId change
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/home/HomeUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIModel.java
trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties
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-29 14:52:48 UTC (rev 492)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-29 15:37:14 UTC (rev 493)
@@ -265,12 +265,27 @@
reloadSammoa();
}
});
+ helper.registerCallBack(
+ "home",
+ n_("sammoa.action.reload.home"),
+ SwingUtil.createActionIcon("config"),
+ new Runnable() {
+ @Override
+ public void run() {
+ if (SammoaScreen.HOME == ui.getScreen()) {
+ HomeUI homeUI = (HomeUI) currentBody;
+ homeUI.getHandler().selectCampaign();
+ }
+ }
+ });
+
// categorie applications
helper.addCategory(n_("sammoa.config.category.applications"),
n_("sammoa.config.category.applications.description"));
helper.addOption(SammoaConfig.SammoaConfigOption.SYSTEM_ID);
+ helper.setOptionCallBack("home");
helper.addOption(SammoaConfig.SammoaConfigOption.DATA_DIRECTORY);
helper.setOptionCallBack("ui");
// helper.addOption(SammoaConfig.SammoaConfigOption.CAMPAIGN_DIRECTORY);
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-29 14:52:48 UTC (rev 492)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-29 15:37:14 UTC (rev 493)
@@ -154,6 +154,7 @@
}
List<Flight> flights = flightService.getFlights(campaign);
+ ui.getModel().setFlights(flights);
Set<String> systemIds =
Sets.newTreeSet(Iterables.transform(flights, Flights.toSystemId()));
@@ -163,17 +164,6 @@
if (logger.isDebugEnabled()) {
- String flightsString = "[" + Joiner.on(";").join(
- Iterables.transform(flights, Flights.toFlightNumber())
- ) + "]";
-
- logger.debug("Init flights combobox = {}", flightsString);
- }
-
- ui.getFlightListModel().setElements(flights);
-
- if (logger.isDebugEnabled()) {
-
String systemsIdString = "[" + Joiner.on(";").join(
systemIds
) + "]";
@@ -211,7 +201,7 @@
getModel().setSystemId(systemId);
- Collection<Flight> flights = ui.getFlightListModel().getElements();
+ Collection<Flight> flights = ui.getModel().getFlights();
List<Flight> filteredFlights =
Lists.newArrayList(Iterables.filter(flights, Flights.withSystemId(systemId)));
@@ -260,6 +250,7 @@
}
public void showNewCampaign() {
+ context.setCampaignId(null);
context.changeScreen(SammoaScreen.CAMPAIGN);
}
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIModel.java 2012-08-29 14:52:48 UTC (rev 492)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIModel.java 2012-08-29 15:37:14 UTC (rev 493)
@@ -23,10 +23,14 @@
* #L%
*/
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
import fr.ulr.sammoa.persistence.Campaign;
import fr.ulr.sammoa.persistence.Flight;
import org.jdesktop.beans.AbstractSerializableBean;
+import java.util.List;
+
/**
* Created: 19/07/12
*
@@ -38,6 +42,8 @@
public static final String PROPERTY_CAMPAIGN = "campaign";
+ public static final String PROPERTY_FLIGHTS = "flights";
+
public static final String PROPERTY_CAMPAIGN_FOUND = "campaignFound";
public static final String PROPERTY_SYSTEM_ID = "systemId";
@@ -48,6 +54,8 @@
protected Campaign campaign;
+ protected List<Flight> flights;
+
protected String systemId;
protected Flight flight;
@@ -65,6 +73,19 @@
firePropertyChange(PROPERTY_CAMPAIGN_FOUND, oldValue != null, campaign != null);
}
+ public List<Flight> getFlights() {
+ if (flights == null) {
+ flights = Lists.newArrayList();
+ }
+ return flights;
+ }
+
+ public void setFlights(List<Flight> flights) {
+ List<Flight> oldValue = ImmutableList.copyOf(getFlights());
+ this.flights = flights;
+ firePropertyChange(PROPERTY_FLIGHTS, oldValue, flights);
+ }
+
public boolean isCampaignFound() {
return campaign != null;
}
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-29 14:52:48 UTC (rev 492)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 15:37:14 UTC (rev 493)
@@ -36,6 +36,7 @@
sammoa.action.quitExportMaps=Quit
sammoa.action.quitImportApplication=Quit
sammoa.action.reload.actions=Reload actions
+sammoa.action.reload.campaign=Reload home screen
sammoa.action.reload.gps=Reload GPS
sammoa.action.reload.ui=Reload sammoa ui
sammoa.action.right.tip=RIGHT \: create a new Observation for the observer on the right side
1
0
r492 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map
by fdesbois@users.forge.codelutin.com 29 Aug '12
by fdesbois@users.forge.codelutin.com 29 Aug '12
29 Aug '12
Author: fdesbois
Date: 2012-08-29 16:52:48 +0200 (Wed, 29 Aug 2012)
New Revision: 492
Url: http://forge.codelutin.com/repositories/revision/sammoa/492
Log:
fixes #1427 : set END date properly
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-29 14:43:17 UTC (rev 491)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-29 14:52:48 UTC (rev 492)
@@ -222,6 +222,9 @@
LegStatus.END,
record);
+ // add date using the current route one
+ fillDateRecord(route.getBeginTime(), record);
+
// add geoPoint data and flush
fillGeoPointRecordAndFlush(geoPoint,
record,
1
0
29 Aug '12
Author: fdesbois
Date: 2012-08-29 16:43:17 +0200 (Wed, 29 Aug 2012)
New Revision: 491
Url: http://forge.codelutin.com/repositories/revision/sammoa/491
Log:
fixes #1418 : change link between observation and position
Added:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
Removed:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ForceSelectionSelectionModel.java
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.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/xmi/sammoa.zargo
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/FlightUIHandler.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.css
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.jaxx
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/TableDataChangeListener.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/DecoratorService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -27,6 +27,7 @@
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.Observer;
+import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.Region;
import fr.ulr.sammoa.persistence.Route;
import fr.ulr.sammoa.persistence.RouteType;
@@ -124,6 +125,15 @@
return result;
}
});
+
+ registerDecorator(new Decorator<Position>(Position.class) {
+
+ @Override
+ public String toString(Object bean) {
+ Position position = (Position) bean;
+ return _(position.getLabel());
+ }
+ });
}
};
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -42,7 +42,6 @@
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.ObservationDAO;
import fr.ulr.sammoa.persistence.ObservationStatus;
-import fr.ulr.sammoa.persistence.Observations;
import fr.ulr.sammoa.persistence.Observer;
import fr.ulr.sammoa.persistence.ObserverPosition;
import fr.ulr.sammoa.persistence.ObserverPositionDAO;
@@ -352,7 +351,7 @@
// delete observations
List<Observation> observations = getObservations(tx, flight);
// keep observerPositions to delete
- positions.addAll(Observations.toObserverPositions(observations));
+// positions.addAll(Observations.toObserverPositions(observations));
ObservationDAO observationDAO = SammoaDAOHelper.getObservationDAO(tx);
observationDAO.deleteAll(observations);
@@ -750,7 +749,7 @@
public Observation createObservation(TopiaContext transaction,
Flight flight,
Date beginTime,
- ObserverPosition observer)
+ Position position)
throws TopiaException {
Observation result;
@@ -761,7 +760,7 @@
result = dao.createByNaturalId(number, flight);
result.setObservationTime(beginTime);
- result.setObserverPosition(observer);
+ result.setPosition(position);
result.setObservationStatus(ObservationStatus.NEW);
return result;
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -39,7 +39,6 @@
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.ObservationDAO;
import fr.ulr.sammoa.persistence.ObservationStatus;
-import fr.ulr.sammoa.persistence.ObserverPosition;
import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.Route;
import fr.ulr.sammoa.persistence.RouteType;
@@ -488,48 +487,6 @@
}
}
- public void insert(RouteType routeType) {
-
- switch (routeType) {
- case LEG:
-
- if (currentRoute != null) {
-
- switch (currentRoute.getRouteType()) {
- case LEG:
- add();
- break;
-
- case CIRCLE_BACK:
- case TRANSIT:
- begin();
- break;
-
- default:
- }
- }
- break;
-
- case TRANSIT:
-
- if (currentRoute != null) {
-
- switch (currentRoute.getRouteType()) {
- case LEG:
- end();
- break;
-
- case CIRCLE_BACK:
- case TRANSIT:
- default:
- }
- }
- break;
-
- default:
- }
- }
-
@Override
public void next() {
@@ -562,25 +519,23 @@
Date currentDate = geoPoint.getRecordTime();
- ObserverPosition observer;
- if (currentRoute == null) {
+// ObserverPosition observer;
+// if (currentRoute == null) {
+//
+// // problem we don't have any observerPosition
+// observer = null;
+//
+// } else {
+// observer = currentRoute.getObserverPositionByPosition(position);
+// }
- // problem we don't have any observerPosition
- observer = null;
-
- } else {
- observer = currentRoute.getObserverPositionByPosition(position);
- }
-
if (logger.isInfoEnabled()) {
- logger.info(String.format("Create Observation %2$s at %1$tH:%1$tM:%1$tS.%1$tL (observer = %3$s)",
+ logger.info(String.format("Create Observation %2$s at %1$tH:%1$tM:%1$tS.%1$tL",
currentDate,
- position,
- observer != null && observer.getObserver() != null
- ? observer.getObserver().getInitials() : "")
+ position)
);
}
- Observation observation = service.createObservation(transaction, flight, currentDate, observer);
+ Observation observation = service.createObservation(transaction, flight, currentDate, position);
transaction.commitTransaction();
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -39,6 +39,7 @@
import fr.ulr.sammoa.persistence.GeoPoints;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.Observations;
+import fr.ulr.sammoa.persistence.Observer;
import fr.ulr.sammoa.persistence.ObserverPosition;
import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.Region;
@@ -521,13 +522,17 @@
record.put("SWIM_DIR", observation.getSwimDir());
record.put("CALVES", observation.getCalves());
record.put("PHOTO", observation.isPhoto());
- ObserverPosition observerPosition = observation.getObserverPosition();
+
+ ObserverPosition observerPosition =
+ route.getObserverPositionByPosition(observation.getPosition());
if (observerPosition != null) {
- if (observerPosition.getObserver() == null) {
- record.put("OBSERVER", observerPosition.getObserver().getInitials());
+ Observer observer = observerPosition.getObserver();
+ if (observer != null) {
+ record.put("OBSERVER", observer.getInitials());
}
- record.put("SIDE", observerPosition.getPosition());
}
+
+ record.put("SIDE", observation.getPosition());
record.put("STATUS", observation.getObservationStatus());
record.put("COMMENT", observation.getComment());
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-29 14:43:17 UTC (rev 491)
@@ -15,6 +15,7 @@
sammoa.config.gps.handler=GpsHandler class \: fr.ulr.sammoa.application.device.gps.GpsHandlerGpylon or fr.ulr.sammoa.application.device.gps.FakeGpsHandler
sammoa.config.gps.speed=GPS speed for capture
sammoa.config.gps.timeout=Time in seconds before GPS going to timeout (always the same data is received for this laps of time) and return error
+sammoa.config.license.organizationName=
sammoa.config.log.file=Path for application log file
sammoa.config.system.id=Id of the default system to use
sammoa.config.tmp.directory=Temporary directory used for different task (import, export,...)
@@ -38,3 +39,9 @@
sammoa.flight.decorator.newFlight=New flight
sammoa.flight.decorator.notEnded=not ended
sammoa.flight.decorator.notStarted=not started
+sammoa.position.backLeft=LEFT
+sammoa.position.backRight=RIGHT
+sammoa.position.coNavigator=CENTER
+sammoa.position.frontLeft=LEFT
+sammoa.position.frontRight=RIGHT
+sammoa.position.navigator=CENTER
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -26,11 +26,9 @@
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
-import org.nuiton.util.DateUtil;
import org.nuiton.util.PeriodDates;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +36,6 @@
import java.util.Date;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
/**
* Created: 16/07/12
@@ -58,35 +55,12 @@
return Iterables.transform(observations, TO_DATE_FUNCTION);
}
- public static Set<ObserverPosition> toObserverPositions(Iterable<Observation> observations) {
- 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,
-// boolean ignoreDeleted) {
-//
-// Observation result;
-// if (route == null) {
-// result = null;
-//
-// } else {
-//
-// result = FluentIterable.from(observations)
-// .filter(inRoute(route, routes, ignoreDeleted))
-// .first()
-// .orNull();
-// }
-// return result;
-// }
public static boolean inRoute(Observation observation,
Route route,
@@ -121,13 +95,9 @@
Date begin = previousRoute.getBeginTime();
Date end = nextRoute != null ? nextRoute.getBeginTime() : null;
- boolean result =
- DateUtil.between(observation.getObservationTime(), begin, end);
+ PeriodDates period = new PeriodDates(begin, end);
- // Max bound exclusive
- result &= !observation.getObservationTime().equals(end);
-
- return result;
+ return inPeriod(observation, period);
}
public static Predicate<Observation> inRoute(Route route,
@@ -136,6 +106,24 @@
return new InRoutePredicate(route, routes, ignoreDeleted);
}
+ public static boolean inPeriod(Observation observation, PeriodDates periodDate) {
+
+ Date thruDate = periodDate.getThruDate();
+
+ boolean result;
+ if (thruDate == null) {
+ result = periodDate.afterBegin(observation.getObservationTime());
+ } else {
+ result = periodDate.between(observation.getObservationTime())
+ && !thruDate.equals(observation.getObservationTime());
+ }
+ return result;
+ }
+
+ public static Predicate<Observation> inPeriod(PeriodDates periodDate) {
+ return new InPeriodPredicate(periodDate);
+ }
+
public static void removeOtherSpecies(List<Observation> observations,
List<Species> species) {
if (CollectionUtils.isNotEmpty(species)) {
@@ -154,29 +142,37 @@
public static List<Observation> retainsObservations(List<Observation> observations,
PeriodDates periodDate) {
- List<Observation> result = Lists.newArrayList();
- Iterator<Observation> itr = observations.iterator();
- if (periodDate.getThruDate() == null) {
- Date fromDate = periodDate.getFromDate();
- // no up bound
- while (itr.hasNext()) {
- Observation observation = itr.next();
- Date observationTime = observation.getObservationTime();
- if (fromDate.before(observationTime)) {
- itr.remove();
- result.add(observation);
- }
- }
- } else {
- while (itr.hasNext()) {
- Observation observation = itr.next();
- Date observationTime = observation.getObservationTime();
- if (periodDate.between(observationTime)) {
- itr.remove();
- result.add(observation);
- }
- }
- }
+// List<Observation> result = Lists.newArrayList();
+// Iterator<Observation> itr = observations.iterator();
+// if (periodDate.getThruDate() == null) {
+// Date fromDate = periodDate.getFromDate();
+// // no up bound
+// while (itr.hasNext()) {
+// Observation observation = itr.next();
+// Date observationTime = observation.getObservationTime();
+// if (fromDate.before(observationTime) || fromDate.equals(observationTime)) {
+// itr.remove();
+// result.add(observation);
+// }
+// }
+// } else {
+// while (itr.hasNext()) {
+// Observation observation = itr.next();
+// Date observationTime = observation.getObservationTime();
+// if (periodDate.between(observationTime) && !periodDate.getThruDate().equals(observationTime)) {
+// itr.remove();
+// result.add(observation);
+// }
+// }
+// }
+
+ List<Observation> result = FluentIterable
+ .from(observations)
+ .filter(inPeriod(periodDate))
+ .toImmutableList();
+
+ Iterables.removeAll(observations, result);
+
return result;
}
@@ -188,14 +184,6 @@
}
};
- private static Function<Observation, ObserverPosition> TO_OBSERVER_POSITION_FUNCTION = new Function<Observation, ObserverPosition>() {
-
- @Override
- public ObserverPosition apply(Observation input) {
- return input.getObserverPosition();
- }
- };
-
private static class InRoutePredicate implements Predicate<Observation> {
protected Route route;
@@ -220,4 +208,19 @@
}
}
+ private static class InPeriodPredicate implements Predicate<Observation> {
+
+ protected PeriodDates periodDate;
+
+ public InPeriodPredicate(PeriodDates periodDate) {
+ Preconditions.checkNotNull(periodDate);
+ this.periodDate = periodDate;
+ }
+
+ @Override
+ public boolean apply(Observation input) {
+ return Observations.inPeriod(input, periodDate);
+ }
+ }
+
}
Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java (rev 0)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -0,0 +1,33 @@
+package fr.ulr.sammoa.persistence;
+
+import static org.nuiton.i18n.I18n.n_;
+
+/**
+ * Created: 29/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public enum Position {
+
+ NAVIGATOR(n_("sammoa.position.navigator")),
+
+ FRONT_LEFT(n_("sammoa.position.frontLeft")),
+
+ FRONT_RIGHT(n_("sammoa.position.frontRight")),
+
+ BACK_LEFT(n_("sammoa.position.backLeft")),
+
+ BACK_RIGHT(n_("sammoa.position.backRight")),
+
+ CO_NAVIGATOR(n_("sammoa.position.coNavigator"));
+
+ private String label;
+
+ private Position(String label) {
+ this.label = label;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+}
Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-persistence/src/main/xmi/sammoa.zargo
===================================================================
--- trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-08-29 14:43:17 UTC (rev 491)
@@ -1,90 +1,99 @@
-PK;cAsammoa.argo�TK��0�ﯰr��l�B��.�bϕO���8��zƱ�8}����JQ5��y�̔\7��@T�*{�Uw��Bծ��rK�G�ζJ����,#e��(Ot�#T���weq�'���)c�(��+
+PKhiAsammoa.argo�TK��0�ﯰr��l�B��.�bϕO���8��zƱ�8}����JQ5��y�̔\7��@T�*{�Uw��Bծ��rK�G�ζJ����,#e��(Ot�#T���weq�'���)c�(��+
X�}c��^N�q�������)��V�7J
_���\(�9��@�PJ�= ����j�V�����N���%�C�H�N��I����L<�'9�h���R���Vh��I�Ijì�`O���A4��^�I��*p�����G[N�i�P�=
�V�Ch��(`�5��18��!F��NݹU�'��nP5eq&��/�����<��-�����휈3F��@ o4�|T���jIm�&o�g&���v�e���*�����LJ��OO+FM݆4F
�2j�-J�☆��y��E�uT�Ge�y��g��}䞽~nh:�B�ӝ�7�_���3
-V��M�w��d����o�zm�j�4�s�%�Ts�m�����}I�gi�q{�qi�����Xҳ��^[7L��2���ճ-��wc�UY%�]<�q��d�h�����G<1�hx����7PK��DH�PK;cAsammoa_Diagrammedeclasses.pgml�]��8r�?O���VRe�!@$g��:+�e��dkkkJG�9֮$���3N��y���D�F�IAERɸ�IэF���?����t�5\,'���t���Q4�̟^������b��7���/7�����v���o�������^����/���p9ZL�W�Ӣ���p���E����i1�],W��d��r�X�V�Ex��\��˻��p���\�?{��W���+愈1��\��w��W��8?8��g��w��3���/�Ϛ�|X�Q��p��7������y{������X�)���1��9��?��r����p��/���a�~N���U��շ��/����Ώ�s����rw!z��p�ZL֫P�:�E���[�X����t�"�}M����q�����g>�蟡x���-����Oo��z^L�W��o�K�|�G���i
-o�"}'�~�1����w9����>����K8y���#G���OO��yr������?V���4p$�jG�� ���T�S6�� ����h�J�f=����������d��|��c���������w�X/W���h���p�W���7���|���O��wn�T��"}�(�I��J�����\(Q"�4���lE���U��L/�ཽ�^"�&R[��+|!�[�
-�֨i�f��w���fn�x�z�>��*k�ٚ�w���˟Ysd�(�f9,�D���4]��ǿ��������'I���h�)�ש6��LL�����L�Z���֔��\.�-�:�=��m�a���0wUŐR�<�PR��߿LVaMy��.�T��'�`�h�vy>�R��9�a����IT)F�q ��]��4�?��p�o�5?.�"� =�ň���b�_p�I1�A-��"���%x������
-G�� N�]�q��+�����]��i4N�a��!���p^��_����%���'�p�1��W�x%x����Ûd��LFo������*|
-��)�Y�T&�t����R��~��(؞�1��Q���1j@�`i�/,p�*k&��1��c�s�w�1!��fƄ����1!$ń8������v�5����bB���G��;����=,�!k!��D�#B�Ix:i!a}j+��!�E���M�'"������Qf�7�JDv#B
-����0�uUè!M&9H0���s�!�AH�՟G����x��A:�n�_)���giq!y�{ZJ�Ec�Jl���E�:�:X�]�v���;X�n�T,� B]̍s�db����v��m����po=�X|����6���c��7���ï�/��e6�߂%K���8ʪ¾��ܓ�p��p�#�Y������#��型B��[�į"��� ʬ�]DI:͎5���J�ujZ�M�`���tzNj����`����n��
+V��M�w��d����o�zm�j�4�s�%�Ts�m�����}I�gi�q{�qi�����Xҳ��^[7L��2���ճ-��wc�UY%�]<�q��d�h�����G<1�hx����7PK��DH�PKhiAsammoa_Diagrammedeclasses.pgml�]m��6���_�*{B� &����s�c����m��R�k�����[���w�;��H��lR�D��nR�D���F���t����q6�.��h���p�
+��(O����rw��=����^�������}�<=�>�����σg�.ƫ�3~E��8\�ӧU�h�p1\<Dk~Q��x:|X/���j:�m�Z�G��"�XO/~����l�\^o���������sB�y��\/&s���q���<��A��W϶�z��������w��5/��i{������X�)�~�=��9��S��#��O��N���Y�j2�-���pF�oO�_������p1�����B�����j��ޯW��u:�/�p��[���!��l�"�y͢ūg�q�����g>���P�a������p�{�����O����*���{鏛��h5�?�B�\����W�8��?}�/w��?����uw�| �_V|�(��2���i�3On0�~;�U��J8���Sm�H8A�j�v��=�#6}?��d�̢��w��p6�z������h6V������3���z��N���f9]�s.��_�-��%�/����B�.ˋ�Q��ܬ����Z�?�/J�,J/��?��O�����U��L/�ཽ�^"/(mImU���%K�&�&)���w���fn�x��~�NU]k�ٚ����?�
+�Y��Uh^��+��_f�����շ�<�?����}�4_��T�u�L�����L�Z���֔��\.�-�*z|.V�����������*����.J�a��/�UXs=�kR�]��`�h�vyNV�n���0�����AT)F�q ����.�{�V_8��њJwK��b��ip��o8�q��Kg��
+x��]��
+����J'��Y�8��
+x�%x{��Y��,
+gW�0��E�p8/E�� ���g �����c��O�R����މ������O_����q�'��|>���g����Q�&�t����R��~��(؞�1��Q�+;�cԀ�V���� ��*2��g��P�{�s�9ۘ�N3cB�~����bBSQ�ppz;��~LI1����#m�� }^qq�"B�ZD���dI"�!�$<���� ���6="������#B�D��R�5���X��nDh�av��z]�0j@H[�$ؚ��s�!�AH�՟G����x��A:�n�_)���giq!y�{ZJ�Ec���N���n�~,Ȯ�e�u��,g�u�}!B]̍s�d�h��|���_�po}�X����6���c��7���ï-��A�2�o���%W�CeUa��!�$$\,9\��e��j#�ԑw��rǗB��[�į"Y��Գ�vW�Yhv��]D)���$�M�`���tzNj����`����n��
��>�
-��_b`�A�V�V���V�xv(�g�lT�.�FڙI:�Rr���c"�� \��|_�������8�-�������ץP�eP�s=�"ԟ�}�x[
-4)�D�3�]�և�����X#�CK�F|-=� ֈU����-bɥu�����2H�Tw��ieڣJ�p��F�dͤ�� �҇,��b^G�9��j=�Z��jߧ�d��Å����h��ʄ�x���b��ÿy�C��������؏�Wь����}���IJl.-X�s���~��
-c]��@�/Þ�Gvϵs�s�\��<\XYh�'z.��#
-�6���e�1}!��%����z��<�w��v8̯K1w�`^r�����v>��ϣ��EO?��>i(��Y�7�J�eȑ_s�P̏����Gn�%���?��@0�����PO�#��..�_��i��5�
->�f}
-W��^ž:���QZa��<��i��7pL8
-%�e� ,P���&�t�ӈ�HB�ep�> u2�� %2!]�iPO;��4J�_|G^����lr{FG�BG���i���aW
-��>��臇e����R%�D&�C<���;�10������ >����){X��vT���{�+���^s.UC����w�}.:��袢f�|EMQ��Hl3�_�&[��$�jщ�82c��A14�r� (1���M�r�蜵�Ĉ����z�.����G�qwM��w3�q�\�B��3®��eة!��.���?�����m,y֣-�=G������m�x��-�=|&�4�
-���Y��Բ��W�g�sփ-��~~�D�r�rc��r������j�h˜�h��d8���~�nTx|�u�z�EC�K���Y� ��MϘ{�.%��bL�%^x���z�Ŀ,��å��[feBhk��p�@p�J�k�w�6
-p�Z�t~9�]��f����e1������m+��u��cd����F�8_f���7�䣇����
-��c��/=�)P��g�g�J1|סҸ�.C5��}&A���rR���"��5ĒI-�6_��;_����ڜj!|a}�+�Rf�i�V�mT��ן4���d`"(��J�|Y_{N����D�x�.�9��ZF�櫂�A
-�C`�y�p>�����=��A�ȉ��y�����O��}�E�5�M�z�E��>}x�ۻۻ�r���5�M��z�u�?������&�`����`�`_]^�l]�b�=�u� 5lY�b����P�l밾��qw�ڢgV6��,�$S۪k61�}�,'쟟���fU!4�H�"]?�� U��_(�KO�|��nP�-���p)U��z|��$,�TP:4��[e���t3��9UL��?�ƭ՛�:�n$U}���
->�5g,�<ƅ&}b�[���I�7Ӝ���T��i�6)��i�����3��ɨb�V�Ӂ7�����Cf7�j�]��.8��Su~�E��ji�,�$���!��L��֞Gw�W�����4g��83�+z�%�Մ�I��qy�`��d5ȱ���C^���4Ǭ�8�,�E��`h��CN
-���$Z�yi5��~�,|=�x��U8�C�.^1�A��������o��������ɘ@�VLK��7E�{��ܶp:���u��}������\�L��x� �����+
-S8��_����~�NC���ϢƠ~�x8���~(��'Qcd�\�i:\����I���������o����,ڷ�U�.�1/>���zM=��ï�n/��C�1��G]C�nͪ����o*�ԣ.�>>F�UZ�|��7�m2�a:��<�F��u��T
-�rr@�T����_c
-�d�Ug�fr��V)t������/:������ʩ����#� �D��CM�8T��e�g����q4r�ˁOY��*k�@��'��Tx!ȸ����Mu�n����;&�ΓxvX*^8Z����nS�<\@�=k�;W�b�4���J�r�O��a��E���pOs(w�F��?��r��Γ(w��&Z곮��M���R�6څx[�b+����ʸ��Tx�$����ț�_��ٵI���Qi�����խ������&��#P6�5��o�hzu+�i��WYٲ}�@Cs�t'R����Ko*�#���S�F��ps�+@�>��A�n7�1s��A��9h�m7�����\�`���A��[�
-�7�7��j�I�����:��/\�syPv9��h�S���'}DW|�jK�ff�_g�T���3ޗ;����,�5=�fG�cV!
-$o�/�ս�Y�[UH��l�|��5���M|����_�f�T- 4����4��EvJsj����d�������(j�oP��jڪ�2���h���h[�G�O��NxM"��Ly�⣁��^��f���
-���1,�#���5ȍ}�z���
-ܺ5��5̍��z��'�ِ/��z��
-_��ycK�y����&����F�快��j�K���
-ެoSQ
-��-RZTT`����(gT�^��Q�P��fS��i��!g�rW ��RT�H��-(���^��'#\gF�����Wk_��u&z��3��@���9�\E�q�W��9�f\�E�>����8����N���p�90^���A��_�����S|Oۆ�)]FN���A���p2��ʮ�ys-�i_�F��Z�1aE��ƧncJ7���E�:lc
-kM����ﴉys]
-�}�&f������&�M9��r]��aUP�mL��mc��ۘӦ���mL��>�jcf���l�[�~�[�~����1sݘ���L�\/fzO���0o˽��0q�-��S81qoaV��`������mbޖ;ѬgQq�{��m7��D&'&B,���L�Q��03����F��׳-)�o�1e:ΐ�qu��Q�,���C��7��[0p�u��D)�J�R^�L���)ehJ�y'S�Iw��k�RX�ٍT��A�=���l)��t)�"b��&϶ҥ�Dm}�1�
--��ˋ������� K����]�V�bڔ��}-m������k�M�[�nk��E�{[EC-�=CE�fNi�i��`M
-��"q*�G���Σ�4��O��?��/��'H�B���iE�����۟�Qv�Q6��0���4�뷟����vuy�U7H1�A� Y��Ш
-�j�B�=2�n�G[��p{T�4145�5�a��
-��N����d+�;����L�ڎߥD�ߥ�I�I7I���?/�p�NcVf��E�H�#xw~)����W�������#�� �F��x��U��v�4=��<M#&GȜʆ�1�'^�Il�Y���-�+qN{[���hfQB�� �B�]�0/�5�<� ຟv��,��p��^�{��*�x�q#�<��VW��2+�ʗ��)��1׃ڜ�<mN����}��Z���I������]?e�����+�Tm�b��Ru�o�O�0s�����I���m1�Z�3��3�����iƬ1�P\����L3Q��"\�h�#�D��8y�Zb��;f2di6}{���fLb��ڛ�&2͘m�Y�h�1�<�YE�2�T�$�&�<F���2�j��j����9�n�/?���鶘�4���5�~�]����g9�n1��5�0�~���I1��FS�Zwmj��}�E��G�,�Ծ�=v�}�h���>M(öqԾ�9U����_X�^9Ҝ��^9���h���ͱBs�������ִ��}^�㮢@�n�8�ׇ]+�o���u:�*�y�ۧ�y}е���}^�ì(0q���C�˹�R�Ş]�/��`����U��`]��ܬ�6$TJ3�=J�ԗB�B
-���
-GW=��a��q���7V�K��������u.���K?''���o-B�_C"����ŢA=T���)���B�5j�{�i�v�#�c:U����������]��QUe)2��`̇l���V�h�e,U�8G-��Gu���"OZ�����'R9�t��E�b�l���� �uױ�;�u��x�:�&��%�c`���q��>�F���"��0~��i8�W�EŘ����D�5b����.����jTO�J��۸�^f��,�'t^����6�zYm�a��9ZX/u��a=�&����o�ᰞ��W�캭PPj�������a=R��v���Xj�n�A�0h�����nG�H�̧���"?��T�*o����߆�8_��8��5 M��AN�/�8T)֗�l�����á���1�3-��K�8@+Q���I���dsf,���H�)�C�}���,3�s0ne��:�����x�qp#��S�M����W�í�T_g�ȃ�:���O�M���T6�i46q�ֻ�ƨ.�Zo��2�Ьص��TF��r�'%��䈤2�b�JX4�S���)��Q >I8�S���2>r$��#�9e[���YeYc����%�UVG��"P#���oRi�Ie�t������}He�]��2Ug�������ʶJ��He1���ZF%��b)�`�Xb&��`�%3)S0��t��4�OV�\�8N �t֓�J@�,���`fY��[��d�uu~�
-:)�T�]�o����wl>(�x$��7Ά�i�Y �n��� `����J��;K~�L�UM�0"YX9!���#�d���yDn��H�
-����`�v8iC��j���5��@�������
-��즒��.m�/�l��UP;�7C��w��ᗗ\zE`�
+��_b`�A�V�V���V��v(�g�lT��:��3���OH�Śf��t�'p����]�k��&�\����Oo��^�B�Amb��P�P~���M)ФhU�tw�Z�n.��2
+�FD��f�0-=� ֈU���a�����:C[DuiV!�����2�Q%|�\F�i"3��{ě�!�h��W�|��C<�Zϻ���i����pa���1Z�8�2a+��C��6��o�G�P�G�!��������=r�z�h���������ȟ��?�#�o����L>�;���K��?���i�d����;�b�0�,�x�g��_8n(�?�g���x��o����sQ�U w
+��8o����<Z�Z���蓆���.W2���
+�ӆb~|�/��E^1_��@0�����P�oo�������,��`�d�O��<F_�U��W1S��9;J6���<
+�� G�ĺ�4�J:?�Є�N~a�$�_��C R'��R"�E���3-M�4��9��FG���%
+]��
+�W�])4���LB����k�KQl�Xd��+2��[��
+����p<�1��%��M���w������3\Al��s��=���sщ�E�g�W������6����d+����U-:]Z��1YѰ14�r� (1���M�r�蜵�Ĉ������>\�ω��.��8�=�f����ą��g�]%�˰SC��]��)�7���m,y֣-�=G������m�x��-�=|&�4�
+���Y��Բ��_�o�sփ-�}~~�F�rV���Y�X�����j�h˜�h��d8���~J7*<���:g=�!�%ZE�,���o�=���@cL/<b��g=��_���UD��p�pˬLm
+��p����Y)�Yt�2Wo���L�����5�UϬ��,/C�k�q��lܶ��]�<x��8{��9Η�E!�
+1��!|*��9��������K�j
+�����çR�u�4n��P����a�I�c���E�>
+�ʤ�s�/Uݝ��
+���ڜj!|A>U ���l���h�b��'
+��=����k�R$_���<"j;�9Q2���#B骖Q����� �C`+��|�����z�o���m/����˻�
+��T��kP�
+��P�P�~����w7���T�kX����X�Xz����M��6�����~sy��0���P���"�j�X{�X�3�����a}��7��0�EϬlj�,�$S۪k61�B�����V}��"4�H�"]?�� U���J�ғ�����ܲ��RuY��Ǒ�����
+J�f�`wR�4���Y��̩�$,a�4n��$#긻�T�)Z7��9c�;��c\h�����%�O��=�+�*�&mRB��9c�O�Ϩ�'�ʓ����������mzvS�6�%�[�K9U�^T/��"M�%ӊ��<|/��yakϣ�ԫ��a
+���4g���g:W�Kܫ)?��G1���^���� �JymF��9f5� �`�,�C#�rj<���%�z��V��������'n^��O1p��#�[(��k8�xc̾^~�^�O��
+H��d+
+pS�\�mg3 ب�Pg���hKh�������k\�w��P��n��x��o
+���K������41�A_|5�{�%����?�C/>�#�=�"���"�e>N��@-uT|eN��B`���h��W�C�(Ǽ�<�L��z�5�?�_��^DŇRcJY�����"z�"��Rf*�ԣ.�N&�b��%_| e��M�0Lg�G�h=�������"[N��@e�z���`�5�Mg\u�o&7Jj�B�<l�~��<��DMUN��\
+�;B
+˕(��AS#�v��ٟj����A��\�|�h#k��ɚE4�h�KD;,^2��n�pS�<��c��|�g���偣�=��:�n��6���$�ٷF��q5� �Ms��Q�ވ]W�k�;�������i���(w�'�S������N��DK}�5��)w�]��F��]l�c��vQwڂ44-���c�M��Kwvvm�t[=*m��c��n�d�I�ǚ,�G�l���Xҿ)9%)�of��UNh`�'&����I?e����T�1�?1���N�)(�v����,�m�هY;���}Sr������J�y٢L;�0��� F�S��ig����k?�s�a��GQ���Ǡ��l2�g��vI�>�v�U���ԋz��V���iE����ҍ�ϣ�UD�߸���vc�1-�H��X?��\�|�XT��YLK8�07���10�>>�x�ֳ�W���b䍥�{��|��
+��4��iyG*��|�q��2W��+�۔�h»�š��F�貕�r�j�r<�m�k6��zrv,wձ�-W5���������zj�Kf�T9�-��h��Uz�ғ��h�Ź(s�r���z���`��Ӳ����w7���b�L��)��8�_R���Ŀy�C�M�/�M/�o�������C���C��Ŏ�ͥ"�?�-�G>�0�(��3�|dw\�'����E�ÅQ�>�.x����L&�p�}� '��qC�y=[M����5��@������0���P��y3_���JV�'��XG�`�u@�Rđ�W���=wL������/�w XQ��rͨ�p����K�G~��h�
+`~xS��'�T`���*J�X_ۂ�ZA�f���r"�J��s<8%ƥ��}2����]���J�Ӿ������K&H��lv�֥t���,VC��y)Ț��*�;�?G�����U)���K�yo_��m_r�;m`
+�F�/���W��Ą��&&r�nc�6ݭ��hc�/g�����'�1o,{0o�z0o��%R�13��LL����5�:laޔ;0`a�n[�7'p`r�{�?��Icu�ļ)��al_�{��m5��D&'&B^���k ���L���')�&k+���p̕�S�p�N��=�C��w�x��-����50C
+a)E���W�Q�R�]�#��qR��r����`2p-G
+ky��#�td���(M��i+O���xu�]�jKyR���>�D�Q��1e!-�#z�D�d6��l�L)qש�.�߇�/�hm��K��w'q̈́�x��m�"s�h��U4�R��3T4jʔ�4�Mt)��~���d%*:�����>]������r�4.D�3U ��~w�S9�n1ʦ��}sk����OW�n~���W� ��y���L�Fm�V����#����g�=�y �24u�:����DN����d+�[��ξ��L�ڎߥ���R��𤛤^zS����p�VcVf��E��nG�nY)���˪`�G���[爹�� �F��xn����������k19Bz���o������w�8��yi��|#�io3����,�Bȵ0�Y���e��@�9\������.�@v�_��Ƅ���
+%�t��,��@���U@��
+/�r�?#=��P�����ɡ4ۜ�iG��WNb��Vf(�����a�zMf��j�6�����S*��-� Af�'�qZ�#i�T�-�YKz%������B���4Cq1n��2���tbD�� �%����%�A�f��#ڟiF%���� n"ӌ�f�%�����ǝU4*�L]��T�Ӵ4�Q�@ŨL����n�O7W��~�tŜ��L�J��.��o��e�e
+�u��UjR��Q�ۍ�6��J�>�" R��Q�Uj�� �Ծs�GTj��(öqԾl��
+��q���o�G����7N�=�xM5�F�K�K�J7IԾ������(k��p�>��qWqA�n�8�ׇ]+�o���u:�*�y�ۧ�y}е���}^�ì(0q���C�˹㦒5�g����#0��]�⽊r�]��6}$TJ�u{�P�/�J�,q���z�5��U���o�ԗb����#���kY�?�3 �~NN<�R�Z����dUv����)��xtO���H �d�R�b���0|-F��t�IkO�H�����㣪�Rd�Ӻ��j�⭖ �V�X��q�ZF����2��<i)_�֟H�x�9��}q�Ճ{�&��b�]�v��֡� k�����-�+��Z�,
+gW�p�>�f�p^ucz�.��fԈ]�jPo������zg���Q=}Uh��ƅ���� � -W��������^V��zX/}��+�*�$���X��zb{_���BA�e>���Y��z�@�v�3X,ި�����*��zV!��u;�G
+�|�.�SM��S�
+�q>�۰�c���9X[�IQ� ȉ���G����֪�Nܡ;�\ |g��?<�@\��^���Z��v�N�� ���Y�$�����צ���i����Z٥��Z���u|P��
+F~�������x�*T�ke��:;F��id�oSo~~�"��}@���w�w]�Q]Ե�|92����GHe;��qRR#G$���1+a�DNv$N��P|�p�,��19e|�H9�G�sʶ�S�#,d�a�����dY�Xeu��Y�bD�@�M��6�T�LٚNO*ۇT�߅H*Su6m ���*�l�d�T�;�eTR��,�%X�,�[��`�%3)S0��t��4�OW�/\�8N �t�'���>�.���`fY��[�:2˺�:?V���n�Ѓ.��7��|���
+<- U:{��������^ �n��� `����K��;K~�UM�0"YX9!���#�d����Dn��H�
+�����q�����!TZ�A�`RQ�=IB3࣑62US����T�è��
+V�L)��vo���2m���\zA`�
�
-�=m���C�Gp�*��˴
-�@�:m��
-8�H�W��ej��35��J��9L
-���q��z�5<��aԎLo��(<6���j��t�N��
-m�{J���]c��)�SS�C���8�]6F��p�KQr�{[?٢����e[TE�@n�u{[��5~�-ќ�y�h`�,�^.[�;4S'�C��6��K);oO;�R�:�`��o����S��H��лR�
-Vڇ�EƤ�v�e��CIo�V�䒦�� �t��,Я;-��+�V������DA�3�S�4�%���礯aj*������ٚ�?}�E(�"���ob���m����
-�Êy �^�R��t����ѩ���|y��&����7y�J�knF��i��箙�}&�k?���H)��K���5�Ҟю��5A� �)E�N���Z�+2�r�,���\Sgn'��j�k�gS%qm��4��y��5*%�����-ZW����.3���[K̶Wt��N��aԴ5U&�=�M2��P$k�jYk�'R�i��E�{�-���$��/�b�=Ւ�4̍M�{̥���d�ǐ��5?2����n�!݃.����bN�176��10N+cN�17���1�z[<���pjjka�R�T�
-�c�M8~ӛ�@s1gJ6̩��L5�0��2���E[��R����jƔ&���Q�06.aJJ/�mfɊA_1���e�倁���#����2�w�CV�(�X&�b�.�|�p��1SUSʈ�����2Q�,;�ib5yZL�q���y.�Otƅ1�a�vn�#j�sS���˩����.q͗��^�rq�Y���:������+^���P%b�>�w�X����8a�N1�+1FX��*{P�}7�|���d:Y}Ko��s����#%��4m?vM �ǫ�$����ϲ�<y.�L�m���6q��Wfʿ�\fQl_pqL������wS�b���s��q=QR�1����;��c��]>����:�ד倯��?~�����$η׃�w� �l��d��Mu;~
-�G�,7Q�N*�q?��G����h�,E��r�=�Ga��<rHHqNRإ~���x3���d�hތ����e����BL%I$��9e����ȡ�ȑ6����&ᲐIa��<�T"P�:Rt%h����
-��h�����N_x/2��Z^Uٚ)݄:W�[�o���ª�Y˨t
-],�EOZX�-��L:[�p��eQ���:�}Y�r�g�h^���\^��/�Z
-{̧��:)A�/�Z�z��WD������]�k���5r�=�������[���@�7��V�] F�!�"�ˢ�����s�U2��\�T����"�͢�" (����d:�r����l��B��I��B��ee;���Z����5�P�t�cJo*I�ZW��B�>�k����Ei���~�����.l�+�R �V���c�!n��Z��:6�]q-h:=Q!ҧ4�?i�< �W�gd����/>�I��r�����3^��pXF����8p��/3�!�'���ב�S�P�g5�v'75*w�̇`gd�ۓ��Ǎ�q�Ҹ�:Y��Z�}�gBθ_�K����8Q[
-�6bɌ}.+�hԒ$����]�sĈ*n_�t)�T�Z݃��h��=#��l���TehԞM��U�
-Ei3�܅�����#�J��h�m5e��0*?C�IS�]�LR`��d%�:h4i�y4@��,�E�\N�O�׳�p����ŀ��0=�����k�kƄ54n�&���4\�9hC�J1jW�W
-^�W���7P���8��o�NIJ\3��<�,m�jl�b퉵D'� *F�f��_��s�>� �W�y7��1�
-O��-��e>15ꗹ���|��K�C��E���Zk��`Q?�x�~�2�W��@���ᠷ<�g���q�[���m�An=�碶G���o9�碦��|_�n����4_���%�݃u�gC��@��W������İ$>r�� ���la�f'-�d`�zw��n���U�m_W�:M�ξleW�:Ҙ��uV�����6�j���_���u��<��[���*o~��e�{�'��usQl�)���~N�%�Y�9�_�x=\z����&�m����5��`=������?�p=�sS"
-z��fD{л-�A_c�i�Ù���A_C�0�o����E���E�ق��~���}õ�-�-�o�pm|zs#O�gX��[�r��s
-LՓ��aVkŎ������oFv�0)>b5�W��p4rh�����@�ox_���t��n�eMB��q��[jd�8�,��)��c�<r-㢫�0����!�x
-s-��\�"���z����,j2Đ*�-a�j���1�� [��b�nA�tEi���oq��/.��o��2��m���wV˨ �X���b&�<=�@���'��^�z� �p�WL+|�����HK�&�u.��n�9)��B���b�Ǖ�%�{�ʣݭ
-�� 1�L#�L g�㛉V���fb@A�[m&�ID�T@=ظ��TN�j�|Eܥ)J?I�ir҅�OS}���(�*jD<s��!q�.)�(��$~B[��ڴ��ⴍQ�Z"��+�.�xn�7�� �շa=JN�%����An?LN�&��?
-�S)�{а9mz�<�L�j~�ωlX[����ж���Ih���6v1�3.�����жp�mbh[���f]�XU��ݝu�V�eG棆���v}*���FNԑw#��)|�_����6
-�T�\D��E��Y���V��FM��Q�m����N��+�ͤ����=�ciP��
-ۮǒ�
-lo��GwZ�!�U3jd[�K��4ʥC`�y��6�B�{̤�A�
-�m���u�C��fh�i�m
-p#y�\i���$����5?��CNJ 7�7z�UȇT���@n"p��ˡ��S�e�J078L�w�N�1�Y��\�(V��>�FY�Vy�����Un�Gp�F��#������(���d��xT���E�*<�pU�����#HE�Pw47�>��$��u�G�NR��8������9P����́ST��z�@���V�9�1�8�5�8 ��w��y��d���.�zq@�{t"�S(�d�漴js^��������sW�6��e�Plž��w��,ݾ���6g��ۜ~�mΫr=c���{�����:�M�215�Sc����4V#�|}Lv�f�f{��RX&��
-��O;\��/^%�J��VFU�e��$-���[����[�Ao�V�ߺUt�*-��
-a�hH�{��lۥA��RjN�B2ۙ9�� �[��]�٥Dʊ��f�Z��!�X�b�^�I��5nѐ27$8Y����c44�A���
-2�d��1r��#�L�����M����Q�}��95ni���F��cF�ҵ�<-&�X�.�ᒿ�D�\E�DK�؉��T�Ss+
-�GmJn��P���/�;F�*� �!|ӫ���j��r���7��)Z�J�'o���8Q�8����uTh uN�5��w��B��Qʾ��~�S�"mp�v��q�t_��)5��(��粛IE����,k5#��W�p=�#\
-����6�3\���Y��.Κ,�|ͅ��p��"_��8��5=�8�?��#K�����#����D��No1^l���7B��������YՇk�:~{��m>&�ΐ�L����?N>'�B?�pųX�x�r��� ���@Z���2�>��%`��P^É��-j
-��}>�x_��E���"��]���]Qkly�c�A+>��y��6�G�_�lA@�/i|�T⛼�>�q��d�V�<pHE#�b�Ӽ��|=�f��
-9{9�8�cSk�~��0{�;�b�f���md��ʢr[�$�Gq���8��
-���R3��JGA�-}~{��"�Tn��ܓF����>oH����7�q!�����1Z��,�"���[�ˈE%=�ʊn����[�8?�6FTs�y���j��[��[���Lٚ�����i@Vnͭt�Ux��R�-Uy3�V�Ay��n�)�ĭ[x+6v;����5���R�h��Qo����eL�I�p��V2�2-��^K��T;���_>��-�Ғ �K�6��0!
-���:�o>�z%#
-Q�bmEq3-���m�6�Fm3g���k��Ym��Y4� e�i�YH���QP>�q�t���������2z�J�I
-�7��/Iw�T���t;,u�LB��~�Q)���T9�zv,!}P
-��$B��B1š�\�rq`�B��E��>��6�6lK*���-�P��X�eQ�k�m �s%��Xg�i��ٖ�lXG�0�o[��S�M��ۖ�lXg��Cܾm��>�6�m[6�/`�m�H^��klX�z�+����+Tj�<<Y���|�������pa���$�WN���2Ul�RV��h�
-�H7-�U�Zg��Zk��p,k�[K �@�o���[�V�n²6���v�<��۰��6�U�m���F���a$��4�+^N�y�������w�PK��-�^*�PK;cA&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PK;cAsammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)�1/]өחӤ�VݺI�4�(qRn$D@��t����@Jwi�N�8���<��1��1��;F^0髠��
+�=m��� �#8E���e�4�M�����
+0���"�9@�����25<S������r��|=����0jG�W��(<6���j��t�N�_�
+`zO����5F��b;5�8��?��1�ׅ�^��C�ۢ`� ���
+9�]�E�PT��mQ�ۢp�-'�a�tK4��t�%-˪�˖<���x2;4��a���H�{ڡ���y;4U�������v��-UQ/`���-2��v�e��C���?�%M�8�]�C/��N� �ʹb/no��_� �=�S�m�)J�͡=������P�W���Pna��5���4���X��.o�g�e�m8V�Kp����8��?�4�Nm����d��M^���o����܌��<�Q�]3��Lr�~
+���RU_��r��{H{F;�Rׄ5�M)���)����"s/�ɲpO��5u�vK���V6U���M�H\#R⚬�Mݢuu]���23�ݼ�D�l{E'�뤫FM[Sפ�DziM:�(��F�����´?w�"ѽ��D���4���"Ṯ'ZҚ���it����0�����q��G�r��bЍ=�{Х��UU�I1��F�=���Ye�i1��=�Ro��0W�+���Z���0�*�Gç��tΆ��f"�\̙�
+s�j)S�0̭�L%�9u��0��1u�v��1�-FS�q16.a*Cv/�m��H
+��`ƅ����*>����H���Yԣ�b����r��0)*�c��O)# ��2wb�D9hvr�b5}XL�q���i.�Otƅ1�a�vn�#j�sS���˩����.q͗��^�rq�Y���:������+^���P%b�>�w�X����8a�N1�7b��p�U��J�n�����l����de?�+�1GJڏ9h�~���W�I67s�f'Zy6�\���ۄ#�V{���B^�)��r=x�b��/��l8-��7(�>E���p%�����M��(���.�6��q���.\�~����.���8�^
+2O�Ev�(������6���!|Y�XL�D�:�@O�L�~b ����1ђY�6h��b+z��foy�$�✤�KYȂ�$ތ�wOƠQ�U6���Z^��$ɀD�4���Z9T9�F��2�����4\2)�����!Y�T��*:�4zkyAB5m|`������E��[˫*[3��P��rk���a.�
+p���J�З%���I�����IgK��1�,��V^�/�Z��c4�P�Vo.���E-�=�STE����F-C=��+�NKP��D�.�����B�����'����[i�K ��jw+Ǯ#��s��eQ�E�i��*�es.����c��fі" �Gg�ʓ�,t�̖*(t�D�1��?,[Q��I鬵�����CI�MR�)��$%����EA�>k��oa��:�1s��.X�K]Vܥ�-�tQg��C�~�5��:6�]q�5������(��O/O������t~����1I�e�AP�����*=��w�e��x8��q���/�3���drx~F �38�¡�euIv'7=��/����f�/;#��,� ��[�s���E���}&䌻�p���vϺ��X�h����W�ze�Z+ �&pt������`b�KYRM��E���FP��Q6U�g������P�����Е����]��F�x�V�P��F�ghk��e״&)0
+svF��3jϣr4�u��XD��t��~�x.�l]3�v'��]��+�7
+4z����cB�r�5���Y�
+s0��bO�=���Վ�=��^�[��؞�|������y�Y�c�`��d�+I"V� �X\�P{���!��0��`��JR��kqN� `��e����G
+f>=�L�I�%���a�:��֒5�s�0 G��a�Z2���o��Aoy ��� ��0Xk�ȃ�z(�u�
+����X��4=Ș6��A�4_���5�:�e���=�����Cb���\`b�'U�7[������6�L�Gp�y��m������#h��p�e+���Y�y�[�����2o���J�*��м��g�anߺl}�y���6.�d>�����b�M�if�>`9
+�<����qXE��pM��$�F��H�>c�"t������A�҃v����9M�sS$�M��6��!f��p�k;���X�y��7]�ߔ�"������I_c��Cܾ������m�6�'���'�3,�~ޭq9���r���0��b����cq.�Gv�1)>by���p4rh"�؟���5
+��o4z����+�_�Y��$���0E��c���#G��y�Z
+FW�c^
+��|�)J��`�J��/"Y�T ��::�"
+1�
+oK�QMJ�^!3��5��B�>��]����v-���`���&`l����[-�Xg�����-K��f̴,�A-�/j
+F��t���@f8.�@,�����&��%��}E���Ç�<�i��`NJ0�P������q%�i �>�iw��bB�D1�H5����f�դ���PP��V��j��*�l\�@W">ZM�K�m���t!����.��C����jD<s��!q�.�쮒� i]P���i��E�I�ⵖd�/<�"�>�7�Vy-�[}֣䤍Q�Z�H�����ar��#��
+��>�2��
+��������g���v�5iU����-�`OB�.�������(.`�F����lC�r�v7k�Ī\��Bz����|��6�B�.���]m�Dy7B۟��ea`�Zl�א�ʘk������:_�ۂ�j2j��F����c:}`{��6�۪��5��Ae�+l�Kj7���2>�i�tVͨ�m}]���q]:�0ڦZh{��t6U!�M�жx`�A���mS-��n$o�+]��Ѿq���r�I �&�F�
+���
+���M�r9�=�&�^ �&� �.� 8�9r��E�b��~�#i�Un�G���]?�Z�xgh��<}9����c�x�̜�G�@5�*<P���W*s�h<��=��令_һJL^�y�$�����NQ�����:�8Ee(�gT���m��C�^Ӊ;z�ٜ罜z�ڥ^#d0����%Y�9/�ڜofs�|�j�͉�P���� (�b���;ns^��n���{����mN��6�r=c���{�����:�M�215�Sc����4V#�|}Lv�f�J�8Od��0��i��0�BΨ�歹Qźl����UZ�ȾU�z���֭R�q�����Hѐ*��v)�
+ضKY��RjN�B2ۙ9�� �[��]��٥��h�4��1�u .1�:�7���q �V��-R�
+ Nd���p��F��٨ sJ&>%g*�r�bdv�&�qK����IS����[�t��yu�٪ �j���.��u����'��¸�L�$��(M��05���zԦ�l�U��/���9s�|�0�l�^->�W{�7��7T�!xM�JV�>ys��ĉ��1o�4���BK�s
+�1��c�2]�R��7����i�;��p�C����Af�+�Qf��e7���g{9Y�jF�}=\�� ��G�<E�l4�=\��w��p�]�57X�̅���|�D�n�q�m�{G7��}d��02���\W�
+u�_Y��b#�4�j��5@Fo�x=ȪΒŭ�Bߏ}�m>&g�h&m��g�'/��V����x�����u��-���b_ia#�b�}R�K�U&By�N��mQk���7������/�������%��Zc��C���
+�-w���9�r�>���_��&�������8s]�d�V�<pHE#�b�Ӽ��|�����9��|@q��lSk�~��0{�;�b�f���md�IeQ��M����c��E�f��aq�����K ĩ��t����g�-��r[|�4r��\�yC�m�������V�h�x��BQ�-��݊_F�DQ�S���V��T�wkXN�ϻ��\���DT��֨�e����8�t���@kn�=�d����J��Z���
+o����j%�w�궚�Op��[� �ۡ�$����ܭ�!���6���8=Ce��$lq��V2�2-��^K��T;��۟?��)�Ғ �K�6��0!
+���:��?��FF����,����p[3���,��9;�]\���j[-͢�Ap
+6�4��:�!*�G�?����R}���2����n�n*�_��
+R�S�"��a�d"��J���r��*g�[ώ%n���o9 ��MC!���Pq�A�80e!���"Kk�͢
+ےJ��=mK*T$<�mY��k[B�\I�:�4�s8۲����<��ۖ��h~�e+��1��o[��O�M�mۖ���c[z$/�56�z=r������ZH�ƃ*��>
+�^���1:��(0
+\.�����ͩ�Z���Wj!�ԯ����P�t�Ѳ-Qu�u�k-Y�>�3`i
+�Z2t�,m�k�&,m� [k�ȃܾ
+K�n�Z�߶K�nĚ���䘘F�}��ie������ #�O�c�G�!2
+�3H�σ��� ͵G�Y皣�b֤�
+TjH��9�9��*5�c����4P���us��
+Tj�y��7G;�@�"���Ѣ�)�j_�����}�cd�N��#���8{���PK+����*֡PKhiA&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PKhiAsammoa_Diagrammedeclasses2.pgml��o�8��_���t'�)�1/]өחӤ�VݺI�4�(qRn$D@��t����@Jwi�N�8���<��1��1��;F^0髠��
����������KUޜ��r�����Յ2�/|����⽢��� ��Frc@"7��q�Z�zN8
f��x�(tƽ(vb��;�Ù�Bқy�O�ߝ�N�����y�����0d{hX�G��iG����)�g�I_M��-�e��H��� �u<
��4�x鍴��M��$&|EP�W2�����oS'���EލO�CǏ��(&! �)�����:���a�4*Vt�8�nf1)����
@@ -103,74 +112,66 @@
j���z!�%;����joƋ�j��`AO�"�(�P^"��nEPIY�Ƭ��ST�U�
q{��a���
U
-=�3)��3�������P�h�3)��hS��1���bC�%_�t��t+��N�Z
-*�>�)�WS�d �T['�L�Ty�>�SM���?tL��dዙ�YO��P�X
-�B���aT��Ϯ�ΉOb��n��BݝJ��c 2�/["���"��B�(��8��rL9�ϥZ���B���VZ
-Ϧ����[b<�ض�f���ʦ��{N,3
-'hÉp�T�ЪHhTq��N�e�dU3 ܼ��wd��ċ�e�~�M9��>q&5��a��@s�|�
-'�eU���^t���u�Y蒫 �i�OTQ�b�������Jűo�7r�;NG�) �Uc�g�Ũ�]�$o5ͫ6�m�-m���LX�o����ڤ=����l���'$�d:�O�(���G0��aD�X]�Ƣva��9qa���xD����)��߸
-�������`����٠%���Eq���&iu���:�?t����϶�m�m�%��#��;̶�@��Ʋ���*Xkٮ��6ۆlÍ�
-[�
-ɶ��l~��l�mCv��C����6֫��Ͷ�������Wt�`�7C���!��Df饌�h����t��S��N����B���ţ�����L�8K�f������������l�$2+^o�:_t�*ה#nV����x��Yz9��� ����f� pN0��p�U�9����"�U<&T��6ঘok�n&����q����ۓѧ��
-)2�U�,_��e���2����LF��*2Z�W�і�2�&EfZ�Ș�ZKF��}�1���ٮ=�Z�m{��>[�6�WJ�х}5�m�ٮ9ڪc�ۮs��fh���s��w#ܵ����.ӽ��hp%�����x�d������7-�����PK�M���VPK;cAsammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|��
+=�3)��3�������P�h�3)˒�1�Њ�So�*6t\�H7p�N�r��t����퓚�z5�N��0O�u�j�DN��^�s9�*�J>�CǴ,N��{��)T<���a,t�;����s�ء��$�Pw�R1�X���˖�6�H.��x,��0�-�S!��s��f촐��Bų�b<����7�m��!����&瞄�L� ��p";�9�*U���}Y8Y�7o����y0�d'�_S�h��O�IM i�j/�\'�qC��qY�.6���gi�`��*c���UԼ���mk�ߣe��Cq�[�������9bJ�z��h1��g�?�[M�
+�|E�}K۽�6����y�6iϮ�$۲��� ;�N�D2ʫ��L��p�5V���]بsN\��j/�!5�wJ/�7����&�2�ǻqpG�E6h �gQ\x��IZ�A �����%l���mhc[kɶ�H���m4P�!���l�
+�Z����Ͷ!�pclÖl�G�m�2ۂ_.>bې�m�P&�4�����k�m�����7���6X�͐5�mH�0�Yz)#?Ba/v9�l����f��v�����D`��殤�?�f��������m(;y%C�.n<�'�̊�۹���5�H�����5�%�:n�^��#2F��DbD~���q����4�t�N�D|w��!F� Uq���)&�ۚ�� �d!\�{�@��d���dtC��l�"�W�fm���>�o:�Ѻ�����e�%���I���:)2&�֒Ѷl�m�톣�F�k��Vd��e�ϖ�
+��Rdta_�m[v�k������\����po�ܺ!��wm�{E����t/?�\�nkE��&;�5�:�1D��M�Fc�d�PKe����VPKhiAsammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|��
���,���\�l�v�
-l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPK;cAsammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���>
+l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPKhiAsammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���>
�z& Q}�0�
-�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PK;cA
-sammoa.xmi�]ݖ�8r�ߧ���cϜl��CR�=�9�klj������\�HH�5Ej��c�U^#w���*��I�$%�I ��T��[@��
-�B��?|^���|�u�?)/[��K;�kZΜ~����U��Û�}���)�V#ռ��|g;���|O�q�y�]�����_"7ȏ/��"�X�v��2�J���گ��+MSF����l�_������512��FQ֟M�� P@(��6���K�Hہ7w)1߆>}�8�b��
-%�/�E�l^���w�_�z�n��U�7�FG�V�N���cS!w���%�y�l]�ZJ��M�UKU��|�T���u�����9Q��?(�gƷ�����EL���Vb�����$��Oߴ�7�oVwZ30��:������7���hH�ݫ�y��+��[��k�jutܟ�j���5��W���ӵ�k�Q��]��bᢗ���/�a�,#z���>��|t� ��{�f�_��h���x�H�}�)su�9��b�F#wA�=�=����mλM]��H�m����W�Ӣ
-}�|����ڝ��{�:�/~�j�~�&q�$�
-�8.���=7���_�óC�q�{y�"�Z��T��pp�M�q��F�x{w��PY�E&V��(�0�o�:���0|���Z�9V\o5
-�y�����X|V�3gFc�)�`�%�Ę̀$�(K>Q2��6G+��xX���lˏ�v�Dyt=_�`������Q^������/��k���W<��!�N1H���i�{��8&"�^�z�8�p��!���!��="�gbә�iL���-B����U?���r�t|�5���<^L�����DRq��D�?YsBn�)8�&�dc�7(����������dUL�'�ae-z������<��bR��Ƥ��X6�f��'����#y&O��w��( e����{?�Ho�ѽ�.!�xD����ߦa@��,*�
-�CY��s��Td�����o�J���|�=���������Gr;��]#9��
-��ْ��#r�8VR1B&�3���0s6�I�r���$��L|/?��_���도ex���ÉX��Nf>����?;
-�\*_X�>���&KL����;[�B��C�y�:F��kdV8�[�rO�蒻P��PI;�O!C�c:���$�n�
-YP,p�Z���ْ�f�A�K�6Ͷ�E}�E�xؓ�A�\D�Au�j6�'��WcD~'���ꢼ��k��~k�ehQ����w+
-��߃-�<l�~(���B�C�'�h��u�}�@tt�f����4��u]� �y���~�.m,�R���Y���&�Z�S7�o��i8q���[�s��I�n�%��vO�*��X�?��֛6l�A�v�ݖ�W
-�e�p��${>NF����?N8l�>�#�&)�c.��;K;Z��ƌ�D[�j=՜1ab��ѻ�����
-���u�m{Ez��)`0hf!���,d�Gj�<{�&���gs����=MG�~��8ִn����F�����T�,ߚZd�"ݿ��e�D�ܻ7�et� U+�G�I��oa��ț�`�>�LY��>�B��
-�7+�5�XKB.�=�[��M4;��C&}�G5<��Y�>���������_�J����.���Z�x-�R���cy}�`f�@�e�E�0Fz M�ǵ���W��D��pa7\o~M�3�,���-���3Dh��;zBt[���m;��X֛�I\���u6��nj���ׁ�?�{;x��Xu=�x��|��������R���O��wo���vx�R��<|U��zb�
-lC��n�v��*��v�i�En:
-��V�pu��P�u���N�~�Dꗲ��w���}䋽Ĺ���tp_��ԟ�}�=���P������]|H�~�G��h2� ��'|b+�ط����ox�4�؉W��V6vߙ��y��Wg.ve���!����8���L�cC'��M���|���榎�p�\�H�7ʹ�yY&/Ѷ'=��D�Z�g\�R��q)a�P����/�����;�'�"�1ɑ<"v��c�G����6��g��I��pl.F��k��q^@+�ћ����1�m|m`���٫��ltz`�@��b7�!�<�s��<t��hkr'��; ��&�7�hM�UH����K�$F;���$FL�r�-�<&�6m�-�mP-m�Y{ff���UG�ӧ_w$>��~0�{]?3!�*np�".Z�N^�"fG�����&:�S�W�������t���-�mJi�������)�-�t��bY����\�Sdr�N��c�Wr����%/���c]���a����8 ����&3̸����VZ{E|��vR��3*��7̘s@����n��DŽ;����cfb�����|�͒/�n��9��KVǧ��*�:>��䦘�T �S/"�?-�"w�/�b�
-�L�d��0����S8O.Gw�S4#xLḥ�p���a��aq������X�<�"4 &h㡚�V���Xe溪�6>�SDU˽����\�N��l�$���n��SH���Z��U��'��u����WH
-��/&r^�<��yP��>�t
-|�ȸ��5��̑Y��z����)����O`O�K���$&O,h��ȽSlc�D#seD��*��qv�溫bvV^X�&�_̚X�>Xou�y���d@���e�ʪ�w
/E�VȣW�u0����p�e�g�x��O#�q��ƭ%[NxϪ�I7�ۤc-�/��>J��y^m-^�n�?��2�������O,dV����S ��8LF�9\�s�G82��m��C�PӚy��Bz�~I����n��+f�U�a4�* 'B�.�~@f��QK����4�"^tw��R�Az6E�bw|�{M�a��vս&j���{�q�-��!�.ޙP�^��Ť��o�d���<���U�~��9���zs*u/!��j��H]}S�H�#��2�������{�tn|O)a0b��Ā`-�<��h�����@��a�`T�\���3�B�u��-�`����E���g��IJ�\7j9���\A�P��@����A[l���
-@p�L���vO�Q��������ecf���,| ��c#X���_�ϧ\0X�O!��$��p#�<�ѷ>�%�N`!{�C�^m~oX=ď��r�DaP�=�t��m������A�0!����'�1-�0���3}6�O�D/zε(U[-�16�����ٲt���ѥ!r�U�����S%�(%2�4P<�i
-f�)<��9�(V2�?%���|v�<����c��5��g1ȕJ����(L�����E�N��[*6Q�yu����Z�x���qRxx2�J�@�Um2�=6�~Ւ�����$�]��S���)#zmS�5��a�ۨ\���R�vq��ӗi��|���?�K���fG2�v�F�L����8�LW��r�Õ���d�5*��T���8eV���AÓ���y_{����\ܒ�3�;+�XB�b�ε��
-;zq�g�G���z�n���k 2LS�P�>f����R�9�����:s+M�)��<}�n���uy8p��B��\��2� dY�� 27��HP/$_N�937�76@�<-&O��b��.
-�!�cHv �ЂN0�'�R�w��5���T3[����q�-)�cl�/\-�,&��T���:8�6�T��}�۩���Ò#��˶�c�ĎI�� x�4^�����Y;�����h�����6a L��a &+��0�v��h�A&��<C܃�Ⱦ
-�ט��5B�$rW#�3��z�q�Y�m1q�`]��PYc$ߍ�̐���"j�JѠADC�D44�:sw;F��k�[���)�j�F�yZ$�.�m[����Ll��
-H ��b�-�ӗy|�^����L�h �͒��@z�T�J%�kQ�M�l��R�,&�8}��9���7za�:�B�)�������5�q됻Y��j-���Ԯ\1����&A�C���ʁH` � ��2-&z@�>�Hu��5 ,]nY����2�,�&�8}P�!���@�[¸�0�wB�Ay���E�a�C���so�������-8�(�P��'G�E�uy0Po{�Joiz�m4����6��y�m<�����z�di1Q�Ba�Ce��$5{;�>�xH]xȨY�=f��R;M
-e)��˽��1C
-���F�אZ���u�Ȉ0ZmdtM��^fn6�00�<?�� ��O����0}L�A|\$p��A�,-��0}�~Luh�GܨS��X�80��C����Sa� �4����7�/�e��p3a� �,ա� Q��[��v
-d�<�<c��o)A �Lu���"���w�ڎ���-v��7�li�.ĝI3q� �,ա�0P�|�Ý���.��[;���g�m>�v�x�?�D.+CPD�d�1�'y#�p�R%3S�ǘ)6{BE9>ٓ�`n����֟S*�$N x�Sj��T\(n�A#��$��i1A#B�H�C��, �Ű��a g�a�M��`�bC���Â:���G�[p��eFA�Ce��k�o� ����Y.�d\u:��9�R��i�.�m�]�L�mg��K^n_ze<���B�}I���:F�yԷE���/!1W,d��;�K���)]�U���-�GX`�#bwq�#�H����0y�����嘉�\���͙C��IG�1^4_�s�E��jy���L�\$�-�G��sd&N�Hc��3`z�O0>�&Rn�e��L�w� ����<l�2�`r[�cl2���jt��0�##s8��H�[H"7$��gh19�$�$x�U_d�t@��u<��L&{�͏��Q�-a$U�9[��Y��"��Sj�~�Y�u�����@���r�A�yN-�������S�$L�u�O�)�'N��Ku��+���`��6c��g1��s���Xh\g�N����!#�1���ԇu\$�� ��p-��:�"��,ӭ���O_��D�ʱ�SnИY����`����ȭ��ct�CN�^0��T��
-i�:� �:SdM���ΦZ�Ô��ƍ.����?;�!���\-(�@�@1Hu�y�����-���ܔ�h�k$��p��� G�V=��D(p���;��|-(�@�>�,Hu��A\,�K��x��@��zɡ���2�.
-�l'��Bų�����rl-��0}�5ա�P �Mf?�������Ь!3u\n�@e�����Ae�%I�<��$͈���w˟NU55C���g3��Y�mE����x��(��bj��5�R*�3Ķ�����Á�7e�Y�?I�@p(�:�8 U<��#T�::�Ũ������Lu�l��iג��{}cF婭O��j��)Sv"Z7KI
-X�t�%Ͻ�l�F�A(m!��b6 ��
-�T����2�MI���XEJ2���<��Am�T������{��&�p@��%O�6��ͩ�D&��8�.dyZL5q��G�C�q@"y.�l3��gl1'�%�#Ω��)!��Ѧ]��Qj����){*M��²��C�q��n�T���2�<ڶI�J�a���,�_Հ���)��������;(QRa{����`;Z�ztY�ag"���A
-l����q�\���g1F��`�:TS��Pɭί�[L1 �@�C��_��o���r��,��Hu��QP�u���8��3����m!M�`����:6[��xja���W8)A���ֽ��,yB�>$�Ou���\��-CouL*C��ִ��1�<���y�( ��b��HgBR�ǁ^q���K��p@�����J����i�P@��U�'�Y�:
-P�������Hq��pa!<�p 3]���g1�%��ة�F��.
-@d��-
-� 8Hu�wd��N-w���>X�C���
-�9Z̦�8}�g��P�\�-����BF��U{:3�Є]��9sZ>Z�;�ğ
-d�Z�h��PͲ6'��=�#Mۡr7�5��ۺ�v��)�l��7�KL��1��B���(�Y��ښ�gmL��W��lu;l��Y2s���O�ÂK�% ���f}O�Q�O��.ִng̔17aQs�S{Oػs}�>o�%����C��L��S��/�9c��z�h��~Z���J/�y���C���,7��K����@�]���!��T���Ä(�g�|�3ђk
-l���M�$Z~Bu0�0T��\�R���c���N��r3[������L�p�ƈ#�g�@���Ϫ�Ԅ[u��i�~�[�%���,�$��Y�3�������T���+D�Be��� ٖ ~
-~��
-*3�5�.t�B��%�?b�Hq��l���A��T����J����)��B��n�M���:T�g�
-8Rrr��M�)'��ǟ7=�WEx�4�{|��Nr|�5ȝ}|��H�s�=��ԙ�=����=�����LK�j����c�� �Rn`�Bʎ�Q�m�r��u����Pٛ����)���wN>���`p����%�s�У�^քd.�+q��L��]�&d����w�g��ϙ�O��Dž^|�5,��`���B#���0��~�[�ؐ��"�G�:��O����Ɯ��$��<{�3�_�N� ��ǡ�����M��lq7�2�H�iEu+f�H��L��f����"�*d�Hr(Y�O�+ ����sӉ�
-� ����P��q�`.K���#��`��1�HƬ�@�L��3B�N�L�c��f����T�hE�^�?�tڈe·Z��g��V���3��`� lW�
-c�n��<�Og=���b2��'�&��̈�S� &���T`��
-Ŕ��O��1DN��u��4m�u�ۉ����^�̈́��\���ߜ���/Ax���x����7崿�%��x�n��F?���L�a4�H����T�w��6i�x�*���_���k-,�ff�ZP�Eq��6�����K��%@��K �x���� F~�� IYq+3)W�13k(���M�qf<2�@oalG��^ߘQc[�j=�d�K�!��L"��s��-f>Ë�õ��u��<��]��!=\�}��`�fzOSg�^��nS5f}��8i��b��ӗyN�^�y��Njr4������!��<]J��f��S�J����4�N����'J^�:�_Ƃ{�����!�{��( ��vA�z� ;�(pI(��fҲQ��.�8�);df�����IR6p0J
-L+1 ���qT/;0��@��Bs��3�@��e�{j3�����b��[K&��$YZL9 ��L�Ce� ��ky�/5w��c��Ys�a��s�v��g1a 2݈�uy
-|˴8%ס;L��,�;��T@�����xn9ļ(�cj1u�%��ĩ�CA]In1��,-&ա�I%@p4�
-��,� ��iz��h��f�@����44��k1q�`}��P��ħu+W�ng&Q���4�k���ͦmN�nK7"�ꬉ��ӯ?7+��l'3�='�g���fq9���Y�3q�u�{�<4+.�C����j%��xg8T�W��*����R떷D��/3mI���BH.2o���L�p�.*�#)�|>k�|�x��3!��l�\oA�-G��K@��� �E��3f_���U�#�������� �%�:
-��0����C92W����;��$�\��īC��3�
-S|C�@���թ�I�NY����Z�rѮ�x+���ߜ�
-j8�M��;E5p�nu��Z2���@W�P;s��n�՟"=���{�l�[}&�̜�U��~�9v9ZX���'P,5#�aɌ߃����%�����%��r��k���ۚ�gmL
-����f��aGQj;[t���T�y������.:~���1�c|i���Û�бj䮈�K�6�>� ���A�;���ypz,@4���0?��I�Y�
-afQ~�A�܄yg��̢�/�ڴ���6%�k�Y{f���jm��K�mJ� 3c�?�6Vg��8��ɼ��t���I�����pR,-�/A�X����-T�4��
-Q��p���&!�S�1X~�d�~B4���B�}I�%KU#�<�M�>�%$j�B�|�����x��!~DO��&�'�X�u��.ns�pd�䋇�Ä(���O�c&ZrqiC7g�l��i��kQ�ZfOB��]u��4��#v.ucٜք߉��E�%�Gu�uG)֣;�{ �,�/�SXa�78W�漜+z湗?#�2Qe�+y-���|Ė� T�YPu3�����v��O���%��A����P���w3>��NJ�9�r'�I=A�s������N[�Ә"��#%�Ů)F+�[E�{�D�����l������r��ѵ'��\�A�h�|�(�_3�CZ�ݜ:�N���M�E/f�YvI�=��Ϋ_E��rK�F�̑��鹝�ST�w1��bbeI�2�GĠ��9!�W�������b�@K��?/]/P��P�!�Ɗ�l#��(K;���XyB6�$�s|ѡ܋�0 ��N��e醞����3}��G��b��f���[��@��(`��禹,�{��ߵ��KG�����Z�1p���<�Gn���R���1
-a�M�Xͮ�X��96����vc��U�On��T��L��"��YwT�G0h'�_w)|~��o��v�}Fnw��g�
-���������r"d�>����PK����"W�PK;cA��DH�sammoa.argoPK;cA��-�^*��sammoa_Diagrammedeclasses.pgmlPK;cAǒV9�&+-sammoa_Diagrammedecasdutilisation.pgmlPK;cA�M���VM.sammoa_Diagrammedeclasses2.pgmlPK;cAP����K�6sammoa.todoPK;cA8��7y��7sammoa_profile.profilePK;cA����"W�
-k8sammoa.xmiPK�}[
\ No newline at end of file
+�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PKhiA
+sammoa.xmi�]ݖ�8r�ߧ���cϜl�%��${�s��N'�w���jD�j�)RCR=�^�5r��L����IP�Z�@�(�G��%d�P��P(T}��癫<� t|O����h>W�g���M�?��\u�+?����{{�|�9�Ts�9����?�}C��ißM���f8�#7ȏϕ�!#4��vŖ�_L����/Z���2��+j��>�E��k<`d�����>[���a/B���Z��?�� "m��ԧ�|��;���#/T(�
+�d���m���:՛u˟��_5m�[�;%��NH�'w��E�%�y�l]�Z���P�/Z��O仦��[���B����;S������>~��'�k��0�oaWI���oȻ~�9.���о�~��ӊ� ?Mߋ�}W�$]_�]�α�!U;W�+�*WWF��KƦm��mtۨ���l6_47���?_�D�r�f3=W��n�M�v��U�O6rCL���Q�7�O_����I��h�%���R���ak����
+���~{�{�����*�w�����rۡ�uq���C������? q�w����|�����7�n ��40^響��p���}�~��u��k1:R�N���ܷ|���;����;-��Sda���2C怜�0�
+���]8s4Ŋ,GA��@ М���
+���(�`�e����� ;�/)_��%������_G��s{d�<�A��0e�߿���S����7��Ϧ�K���Wl�dH�SLҀ�����ye9�^�)��ȭW��?������=�E��p@�hď���t�d) C���C�AL�?��l�K�lK�L4ߣ3%R�]��r��H�_��N��p+�����b��b�,9��G�U,j����r�%�ܯ��H��tx �� �����0���.қ̯�^s��b> �l���ED��K���������b:�_������6�� �/e�w1]b>�?����l|�8��-�!> o�POe��p���I��F2��?,�.���^�<Q�z��^~$,��?�NĂ�~2s�T��(��S��R�"@Dd��wȟ.1�1 j�E8l(���[�V���̍f�i�Y�T�c���'w��O��vH�B�>�t N��Z(���F �L�8���m�F�C�4-U렞�"l4�ʍj?e^!Ť�d9� �7�П�cD~'���ꢼ���!w����C�Zs�-5����x`�X�C��$�d~���^�=��&��۳Z�n�֙���u��7h��:�1�K�0�SLfM����ꎻ�[�߾�ݺ��#��`Iϑz'��,y�$awd�a��'����zӆK���n���ͲᱬlS�ɞ��a���O��\���!��w㿖���������m���=Ӧ0���Y6&F���~��2��U��%���f�D�~���V�`!?VC�8hؘ�O�3F�E�C�}�Z�R���z=��8��N�����F�ÿ�=W�Й8d�b�?_L\��1�"ypg���6d
+!�V�2c�=�<��%��P0���}v��b�],L�6��,�ט-�șr��Y��F�cY:`��|T#�/�՜��#m,�L�L.����T魟+��<��A+�e^j�5s,����̳ȡF(B������h��������
+?�^����%�5���][�F�����GD�A��ض�l�e���e��\g#�~�8�M!.p|����u������~��#����w����ܗ�Vu?�o_�s9�m�6Ey���%��l6�\����UJ��&�b��t�/l�ֿ�
+��_�u����$���u)�4.e���dM���{�s���#i��3�7��<>���KA(way����2����.����q��?s���0�M'� ���I��i.>�7^��'y��}gV�g����?� ��[�oz9�����qh:
+�t}S��8�
+�K$s՛fZc���,��hۓ��t�M��3�e)c�8��0W�GJ Y�[Hr�����Xߘ�H�V�1ۣ�s�N�Lճ���x��l�m<d.Ahc}��Z�jR���lն2���^յ�m��6�:����S�k��������8�8�w{�R�n���(b�p����gqne�V\% N �[�\��9ѡ�۔�c�݃-��-vSv[���\`�Ud�VV[l|�N��e:EΏ��n�1v��1�y��CeT�_�O��ۘeU�7��A�W�7�`��+ⳮ��S���Q$�aF��[|�<&\�q�]3�#�����l�|ats�t'Pljh�b'�����Γ�q�1��S�\L��d�������\�6h2���7�Ϊ����Q=<h��yr9z��N�M��q˰q���u����aq�����X�<�"4uhざy���Xcf���6>�SD�ʽ�h̔�N��l�$�yA�n��SH��Z��U��Yc;u����WH
+'�-&r^�<��yP��>�t
+|�ȸ���5���nfB���.7k�|�Z�Ff<�= /A#��C�<���/N#wO��U�̕qk��G��뮊ٹ�`I,����\̚X�>Xou�y���d@���e�ʪ�w
/E�ֵ�W�u0����p�\�N`�x��OC���.)=�[K ���0�UI���.�I�.5�\[}(��7���Z��I�R��9d�8^��3+N�X�,��ˍ��@H�q���s���M�0�о7�3}��BͬM/!=M�$Ly�{T�[���d4a�l�t��Reҏq���ʾ�P�Kv���gT�����
+���e�T`��Mѓ�_�V�ml��6���D�^��e�>n�E��/��٭UjeXZL�IQ��M�+��s��\5j�H�c�Z�{�7��B0 rͭ�f����b6�P�Z��)'��&�.
+*[�:_@��!= 8�"�1n<��pdg�D�0�?,{��aE���pF�ŭ4?�S�#�)��u��A��-��`CZN(P�+�
+�gH��Ur PŶ�����j�jW7P��������e#f���,�'�b3Z��_�ϧ\08�|����E`ό�
+��Er�:��u�������c��( �p���I�chg�{�L��x���\�Z�͙>��'N�?�Z�����f����D�ٲt���ѥ!r�e�����S%�(%��4P<�i
+f�)<��9�(V2�?m���@yNoq��(�k����+�V+��Q�VkuԮ�A�N��[�P�yu����Z����qRxx2�J�@�Um2�=6�~Ւ�����$�]jX��2(#����M����6��_����T���B����eZ��_i��O�ƒntt�X&�N��b� �c�g��*�].g�P:\�Mf^��I�_a��SfX`4<�[N˟��o���a��[�"|�vg�H�k��C�^\���f�������ޙAD�S��-���h!��ƮT<BN@0`ƨ$@���ԉ��OK�>c7���uy8p��B��\��2� dYj� 27��HP/$_N��93ױ7.@�<-&O��b��.
+�!�cHv �ЂN0�'�R�w:�5{M{�[����KйF����v�� �c�FA�Ces�v�I*^�>��I���Ò#���u�#<ǞE�� x�4^�1Uװ�ƻ�=
+��V������,���9,�d����Γm���Ӟg�{Pٷ!�S2�F�x�D�j�S/1n^�4+�-fa"N�KR*k��q�q�6 ᠈��0g��G4�ѐ�
+͑���N�`�[w�?`�B��z�Q�`�I��C�z���"{?+�}o�H���j���eߤ ��"7S3�Hq���k���9ա�G �ZpS3�@)n��Y�>HƜ�@d��0Y�[@�)�������5�q됻Y���F��Ԯ\1����&A�C���ʁH`"���2-&z@�>�Hu��5 ,nY�����2�,�&�8}P�!���@�[¸�0�wB�Ay���E�a�C���so������#r8�(�P��'��E�uy0Po{��h醪��81�DŸm1����� B�8�Sϒ,-&�P�@#Lu�,�$�fwC�'�5˚Q��L`�Tjǡi���,��^�א]fHAr]�¨�R�zݎfKEf����e�fc���;yu�x����1��8p�8�]@H���ch����1�`�9r�N ������7ÂO����T�"�x3<C� �ς�̈́�p�T�c�D�*naK�7�;0�-����P�2ա��KB��B��ƚ�=��Z��mn���q}�;��g1qg��A�Y�Cea�,�t;K��]�~�dP�l.���a��,��1�����PA��
+���9�TÕJ��XLAc��� 1��xOB��sX��ZL-�Ȓ8��Nu�q�Rq����XN�_�@����HQ#��.�$,�&3�%�E<��7�ƂA�y=�.�W$~�o��XZ�Q L ��u��O mx���J�U���Zv��EW�tP�R-v�/n�22����/y�}�U�� \������g.�����!�uA��{����=fJ�`��qc��( ,�p��I�#������0������Y-�X���3�֍7��x 3�|�Ϲ�j��9�&3�S]�d��'ϑ{�Y#��>��}��Y6��p�.k@<5`r��L�<�T&�aC������c��N�U���̀����G��B�)� �<C�Ɂ'A $�Ku��"3�
+=��y���d�G���L��FRU A������O.��9ա��gq�eZ�h��R��z�sj�`P'0���-�G��8a:�dxZL=q���^���X��c�v��?�9�(N�[Lu��B�:����8>2�=+�_�O}X�E�0{����A�,��2��kH����@�K�����.�.�8Xڌ�:!Fw:���#�VL%
+q���F�C���=A����q���=�{m�\�unt��E�ɳI�_?0��jA!�B�A�C�C��En��
+��GK^#���\��;
+��7� F�;���Q��kA���AdA�C���b�\:���&�g2<5J̴��uyPPg�@8a67*�m?��-fpȱ��J���AF�T�:C��7�y�l�����?��f
+�@���r�3�$�.*�<(Ij�A{'iF� w،|(�[�t����:��Pm�kv�mE����x��(��bj��5�R*�3Ķ���������7e�Y�?I�@p(�:�8 U<��#T�::�Ű������Lu�l��iגm���=Ӧ���Y6;e�ND�z)I�˟n���ג��݈0 �-d�Y��8}���Pc�Q\&��#i~�{�HI�S�G�>�͓�Pc ޝp�9�dvH���Іp�9�p����4�s�Y�S�C�>(Ƒ�Pc�H��=�>��[� g �s�Ce}�B�`��I�@]zԵ�Y=M��b��҄�f�ǘ�Z��@�>p�:��,� �Ѷu�TB @�;�%�f9����$N�k�dEXo.G�A��
+�[^�'����ף�*
+�c�}�j`K\��U�k�B@�4?�1r%+7ա�*.�Jnp~��b�H�R���?���eg10 N�@�C5��Ҭ{w�%�qO䀞ټ��o�Fkj�W�k�j!��I��7���pR�7�=�{e�Y��=Hh��PM'��Z��j[T(ڦ�k�I�)#�y{��P@��� � ΄�:��
+�w��̻ ���G��� 6zS��[�{��?�f!N T�Hu�B�/rE����hQ��Bx��@f
+�
+kP@���Ė *b�:���#�(�1�3�(8&� աޑ1�;��Mor���V?(�h1�����A�C�s�4l ԋ�
+��nG�̬Bcv����h������?Ȱ� 4�� ա�emN*'�{`G��C�n\g� 0�u���S̹�o��`�g2Dm�«�Q�����mS6�4l6[�6[E*KfN���i{XpI�z� �
+�o����ףVX�z��3fʈ��������8���}��K�ױ��^�����l����E�q�7��O�{�X�%4/3�{�У�o���Ed,9�!is�en�'�`B�dz|>9��ђk
+����u�M�>��j�a��Ϲ�j��Ɔ���96��l�?:N�#3��4F1>}��d|�M�&ܲ�O�h�3�>�ooz`�$ ���E��Ŝ����:��]!*�W���u,�S��sXnИA��0p��:7�-Y���@���d���ݦ:T�8T:m�jMp,Z�0
+S��
+��P �*�H�ɑ">4ev��Ğf^?��^����R��aZ;���@�����G
+�k�jUww��t�~�����Z;�l̴DK���? >6� )��(�lkmMU-ʉ��n�&Scobs�;����n�|"�u��(>*���K������� �\�m��aB0!;{�vu���Z����E���?g�_<?z�C�t8�+���[��L6�Àn�Ul=l�bC������L;P>1�;"S���X8p�)�j�ş��z�N<]���=�6w�(S���V�Q�bv�$�DPz����[DW��I%k� pE���rz�;�2�ݜ}!�X=��eɑ ���)�,9F*�1�$!�,����&���iy�f ݞh:���m��v[E,��2v<����ߜ�w#L`;�a�����<�M�.��K1 ���LvCf�
+�)�Gfr*����bJt��'v�"�}�:�_�nc��c�B�^��e3�f'�A��/�7gf��K^��<*�@�0}b��^e���M9�/q�`*�_5��ϫ���d�M=4�cO�^�)h�掇��JX��[̽v�¢nfaFke]'��o3�@^Z��zX$��������
+b�7:���U�2�r�_3���"�_ߔ]g�#��ƶ�.��L��Uc�w5��?r4(�~�F03���Q���/N�.6S��!6�Lz�Wv=,V��p���N��yD]]�{ݘ͝�f�=��8i�z1U���<�D/̼D_'5��
+�a}}�S�rG{�.%y}�k�)s%nep�^��t� '�ςJ^�%/S�/c�=�s�bw��=�N���ZСq��
+\
+��LZ.��:P�R�����@f�'z]�$e7��P��7�Au;9�e�fY��(�X(`�C<���`Ȳ��{O*3(�.��db,�@��Ŕ�� �ɤ:T�ȿ���Rsg�:�!�͑3��Z�01��a��`~� A Ӎ�\��0��L�SrJ��$�ϲ����NJu�[�x���G�k�9�S�X�@(L��?TЕ��#��@ ��bRJX�T�G���T�X&t��4
+������f�D�0��44��k1q�`}��P��ħu+W�V3�(M\R��5���fӶ&V�e�1,�n"�k��k���
+�9���fE�ĉ�Y/&�Y\*ba��L�x�n9͊�E�:;>hz��A,���U��
+�fs�����-��L[R�d�����[!&#co1Kޑq>���\�X�ˇÙ���\�~0�ޖ�py�% ���� �E�t3f�F�7ˆG2���zw��Û1�%�:
+��0����rd.o/�w�`+H���[�3�W��gg�,����P}c�S%��$.��de�<�]��V\��93P�p�&%w�������d0�Á���v�ߝN�7AF�atu�ƭ�Ff�Ɋ*a�W?��-,�肎̈(����d��~Y���q
+��E���j9�ᕎ��ê�a[����i�l�:mv���E�)NL5���x �����Gx�={旆�:�9�9
+�F�轄l��@�z��md����lrV��$�'fc'(��E� cA�s�3�r�0듦��UJt�B�j[�&�Z#��҅y��#��X쏰��噫"�k0G2��9�3�i�Se����,�K���K(V���sU>
+gpC��=�~�b���)��0L�^?!8�|��K���"�6�߆��Q�r�c�؏�k��zt��a"kq��_>$m��̚|ɐ���8��\\Z�͙/���<A?�Z�ĭ�ٓPjt�]�3�m���K][6�5�w�/��gQ~��QCd�Q���N�3��K�VG���
+Εb�9/犑y��g�:��{%�%U���� c6���<�Nf:XP�vA������F��^Gm���6�Ɲ�E���:D��:gtQ��� ����N'\re��Y�P ���e
+���{ W�4��D%������DS7�k��O�S���6A���M�O���YO)�#"y�ߧҷާ1A!^f+��d���J�Vq���o��fk��t�m�sr8֮�Y�9�jrFs�SDq�E�g�ۻ)��I�H�f��S�gW�C<_�/F�-Y�3
+0G&���vBL|+�"���$����9�Ȕ-����]b?��/������%�<��H!�C�)D���5��=e�.Bz3GV���&�s|с܋�ED�ӟ�G��_J��'"���!@��i�r���oEy�������bpu
+#-���^:R��T�����kF�������6���(��6��sy��j�O��3rG�_{�����'7�w3��5R�X��=�����~��a�]
+�����i������6p���րۙ����ooo�1��=����PKH.�?�"��PKhiA��DH�sammoa.argoPKhiA+����*֡�sammoa_Diagrammedeclasses.pgmlPKhiAǒV9�&�-sammoa_Diagrammedecasdutilisation.pgmlPKhiAe����V�.sammoa_Diagrammedeclasses2.pgmlPKhiAP����K27sammoa.todoPKhiA8��7y�O8sammoa_profile.profilePKhiAH.�?�"��
+9sammoa.xmiPK�\
\ No newline at end of file
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightBar.css 2012-08-29 14:43:17 UTC (rev 491)
@@ -66,7 +66,10 @@
}
#lblStatus {
- text: {flightUIModel.getCurrentRoute().getRouteType().name()};
+ text: {flightUIModel.getCurrentRoute().getRouteType().name()
+ + (flightUIModel.getCurrentRoute().getEffortNumber() != null
+ ? " " + flightUIModel.getCurrentRoute().getEffortNumber()
+ : "")};
}
#cbPanel {
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -125,6 +125,7 @@
import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.ActionMap;
+import javax.swing.DefaultCellEditor;
import javax.swing.InputMap;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
@@ -422,13 +423,24 @@
// OBSERVER columns (Left, Right, Nav, Co-Nav positions)
{
+ final JComboBox comboBox = new JComboBox();
+ comboBox.setRenderer(observerListCellRenderer);
+ SwingUtil.fillComboBox(comboBox, getModel().getFlightObserverForPositions(), null);
+
+ getModel().addPropertyChangeListener(
+ FlightUIModel.PROPERTY_FLIGHT_OBSERVER_FOR_POSITIONS,
+ new PropertyChangeListener() {
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ SwingUtil.fillComboBox(comboBox, (List<Observer>) evt.getNewValue(), null);
+ }
+ });
+
table.setDefaultEditor(
- Observer.class,
- new ObserverTableCellEditor(tableModel.getReference(), observerListCellRenderer)
- );
-
- table.setDefaultRenderer(Observer.class,
- decoratorService.newTableCellRender(Observer.class));
+ Observer.class, new DefaultCellEditor(comboBox));
+ table.setDefaultRenderer(
+ Observer.class, decoratorService.newTableCellRender(Observer.class));
}
// CROSSING_NUMBER column
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.css
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.css 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.css 2012-08-29 14:43:17 UTC (rev 491)
@@ -123,6 +123,11 @@
#routeTable {
model: {routeTableModel};
+ selectionMode: {ListSelectionModel.SINGLE_SELECTION};
+ selectionBackground: {null};
+ selectionForeground: {Color.BLACK};
+ sortable: false;
+ _terminateEditOnFocusLost: {true};
}
#addButton {
@@ -130,13 +135,18 @@
}
#lblObservation2 {
- text:"sammoa.observation.title";
- horizontalTextPosition:"{JLabel.CENTER}";
- horizontalAlignment:"{JLabel.CENTER}";
+ text: "sammoa.observation.title";
+ horizontalTextPosition: {JLabel.CENTER};
+ horizontalAlignment: {JLabel.CENTER};
}
#observationTable {
model:{observationTableModel};
+ selectionMode: {ListSelectionModel.SINGLE_SELECTION};
+ selectionBackground: {null};
+ selectionForeground: {Color.BLACK};
+ sortable: false;
+ _terminateEditOnFocusLost: {true};
}
#leftButton {
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.jaxx
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.jaxx 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanel.jaxx 2012-08-29 14:43:17 UTC (rev 491)
@@ -26,6 +26,8 @@
<import>
java.awt.Dimension
+ java.awt.Color
+ javax.swing.ListSelectionModel
fr.ulr.sammoa.persistence.Position
fr.ulr.sammoa.persistence.Route
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/EffortPanelHandler.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -24,6 +24,7 @@
*/
import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import fr.ulr.sammoa.application.FlightService;
import fr.ulr.sammoa.application.device.DeviceState;
@@ -71,6 +72,7 @@
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.table.TableColumnExt;
+import org.nuiton.util.decorator.Decorator;
import org.nuiton.validator.NuitonValidatorScope;
import org.nuiton.validator.bean.list.BeanListValidator;
import org.slf4j.Logger;
@@ -83,17 +85,14 @@
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
-import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
-import javax.swing.event.TableModelEvent;
-import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import java.awt.Color;
-import java.awt.Rectangle;
+import java.awt.Component;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
@@ -177,16 +176,15 @@
// init route section
{
+ JXTable table = ui.getRouteTable();
+ RouteTableModel tableModel = ui.getRouteTableModel();
+
BeanListValidator<Route> validator = ui.getRouteValidator();
validator.setContext(validatorContext);
getParentUI().setContextValue(validator, ROUTE_VALIDATOR_CONTEXT_VALUE);
- RouteTableModel tableModel = ui.getRouteTableModel();
-
- JXTable dataTable = ui.getRouteTable();
-
- init(dataTable, new ListSelectionListener() {
+ init(table, new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
@@ -239,7 +237,7 @@
});
SwingUtil.setI18nTableHeaderRenderer(
- dataTable,
+ table,
n_("sammoa.observations.routeTable.column.effortNumber"),
n_("sammoa.observations.routeTable.column.effortNumber.tip"),
n_("sammoa.observations.routeTable.column.beginTime"),
@@ -278,13 +276,14 @@
n_("sammoa.observations.routeTable.column.deleted.tip")
);
+ int columnToEditOnInsert = RouteTableModel.RouteColumn.SEA_STATE.ordinal();
flightUIModel.addPropertyChangeListener(
FlightUIModel.PROPERTY_ROUTES,
- new TableDataChangeListener(dataTable, tableModel)
+ new TableDataChangeListener(table, columnToEditOnInsert)
);
// Highlighter for no modification
- dataTable.addHighlighter(
+ table.addHighlighter(
SammoaUtil.newForegroundColorHighlighter(
new RouteNoModificationHighlightPredicate(tableModel),
SammoaColors.ROUTE_NO_MODIFICATION_ROW_COLOR)
@@ -295,19 +294,19 @@
SwingValidatorUtil.registerListValidator(
validator,
errorTableModel,
- dataTable,
+ table,
errorTable, dataLocator);
addHightLighterOnEditor(
- validator, dataTable, dataLocator,
+ validator, table, dataLocator,
NuitonValidatorScope.ERROR,
NuitonValidatorScope.WARNING);
- dataTable.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new DeletedRowHighlightPredicate(flightUIModel.getRoutes()),
SammoaColors.DELETED_ROW_COLOR)
);
- dataTable.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new ValidRowHighlightPredicate(flightUIModel.getRoutes()),
SammoaColors.VALID_ROW_COLOR)
);
@@ -319,6 +318,7 @@
// init observation section
{
+ JXTable table = ui.getObservationTable();
BeanListValidator<Observation> validator = ui.getObservationValidator();
validator.setContext(validatorContext);
@@ -337,10 +337,10 @@
}
+ int columnToEditOnInsert = ObservationTableModel.ObservationColumn.POD_SIZE.ordinal();
flightUIModel.addPropertyChangeListener(
FlightUIModel.PROPERTY_OBSERVATIONS,
- new TableDataChangeListener(ui.getObservationTable(),
- ui.getObservationTableModel())
+ new TableDataChangeListener(table, columnToEditOnInsert)
);
// For CircleBack buttons
@@ -351,25 +351,14 @@
flightUIModel.addPropertyChangeListener(
FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN, observationUpdateListener);
- JXTable dataTable = ui.getObservationTable();
-
- // set combobox renderer for ObservationStatus
- dataTable.setDefaultEditor(ObservationStatus.class, new DefaultCellEditor(new JComboBox(ObservationStatus.values())));
-
- dataTable.addHighlighter(
- SammoaUtil.newBackgroundColorHighlighter(
- new ObservationForSelectedRouteHighlightPredicate(flightUIModel),
- SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR)
- );
-
SwingUtil.setI18nTableHeaderRenderer(
- dataTable,
+ table,
n_("sammoa.observations.observationTable.column.observationNumber"),
n_("sammoa.observations.observationTable.column.observationNumber.tip"),
n_("sammoa.observations.observationTable.column.observationTime"),
n_("sammoa.observations.observationTable.column.observationTime.tip"),
- n_("sammoa.observations.observationTable.column.observer"),
- n_("sammoa.observations.observationTable.column.observer.tip"),
+ n_("sammoa.observations.observationTable.column.position"),
+ n_("sammoa.observations.observationTable.column.position.tip"),
n_("sammoa.observations.observationTable.column.podSize"),
n_("sammoa.observations.observationTable.column.podSize.tip"),
n_("sammoa.observations.observationTable.column.species"),
@@ -399,7 +388,7 @@
);
// init(dataTable, new ObservationTableListSelectionListener(ui.getFlightUIModel()));
- init(dataTable, new ListSelectionListener() {
+ init(table, new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
@@ -457,45 +446,84 @@
}
});
- // set renderer and editor as button for circle back action
- int circleBack = ObservationTableModel.ObservationColumn.CIRCLE_BACK.ordinal();
- ButtonActionTableCellEditorRenderer editorRenderer = new ButtonActionTableCellEditorRenderer(
- CircleBackAction.CLIENT_PROPERTY_OBSERVATION,
- new Supplier<Action>() {
+ TableCellRenderer stringRenderer = table.getDefaultRenderer(String.class);
- @Override
- public Action get() {
- FlightUIHandler flightUIHandler = getParentUI().getHandler();
- return flightUIHandler.getActionMap().get("circleBack");
- }
- },
- null
- );
- TableColumnExt column = dataTable.getColumnExt(circleBack);
+ // ObservationStatus
+ {
+ JComboBox comboBox = new JComboBox(ObservationStatus.values());
+ table.setDefaultEditor(
+ ObservationStatus.class, new DefaultCellEditor(comboBox));
+ }
- column.setSortable(false);
- column.setCellEditor(editorRenderer);
- column.setCellRenderer(editorRenderer);
+ // Position
+ {
+ TableCellRenderer renderer;
+ if (flightUIModel.isValidationMode()) {
+ renderer = new ObservationPositionCellRenderer(
+ stringRenderer, decoratorService, ui.getObservationTableModel());
+ } else {
+ renderer = decoratorService.newTableCellRender(Position.class);
+ }
+
+ JComboBox comboBox = new JComboBox();
+ comboBox.setRenderer(decoratorService.newListCellRender(Position.class));
+ SwingUtil.fillComboBox(comboBox, ImmutableList.of(
+ Position.FRONT_LEFT, Position.NAVIGATOR, Position.FRONT_RIGHT
+ ), null);
+
+ table.setDefaultRenderer(Position.class, renderer);
+ table.setDefaultEditor(
+ Position.class, new DefaultCellEditor(comboBox));
+ }
+
+ // CircleBack action
+ {
+ int circleBack = ObservationTableModel.ObservationColumn.CIRCLE_BACK.ordinal();
+ ButtonActionTableCellEditorRenderer editorRenderer = new ButtonActionTableCellEditorRenderer(
+ CircleBackAction.CLIENT_PROPERTY_OBSERVATION,
+ new Supplier<Action>() {
+
+ @Override
+ public Action get() {
+ FlightUIHandler flightUIHandler = getParentUI().getHandler();
+ return flightUIHandler.getActionMap().get("circleBack");
+ }
+ },
+ null
+ );
+ TableColumnExt column = table.getColumnExt(circleBack);
+
+ column.setSortable(false);
+ column.setCellEditor(editorRenderer);
+ column.setCellRenderer(editorRenderer);
+ }
+
ObservationValidatorDataLocator dataLocator =
new ObservationValidatorDataLocator();
SwingValidatorUtil.registerListValidator(
validator,
errorTableModel,
- dataTable,
+ table,
errorTable, dataLocator);
+ table.addHighlighter(
+ SammoaUtil.newBackgroundColorHighlighter(
+ new ObservationForSelectedRouteHighlightPredicate(flightUIModel),
+ SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR)
+ );
+
addHightLighterOnEditor(
- validator, dataTable, dataLocator,
+ validator, table, dataLocator,
NuitonValidatorScope.ERROR,
NuitonValidatorScope.WARNING);
- dataTable.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new DeletedRowHighlightPredicate(flightUIModel.getObservations()),
SammoaColors.DELETED_ROW_COLOR)
);
- dataTable.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
+ table.addHighlighter(SammoaUtil.newForegroundColorHighlighter(
new ValidRowHighlightPredicate(flightUIModel.getObservations()),
SammoaColors.VALID_ROW_COLOR)
);
@@ -594,17 +622,16 @@
}
// Fire on TableModel to update the row (highlighting)
- // invokeLater in case of new route, otherwise the size is not updated yet
- // in tableModel and an IndexOutOfBounds appears
- SwingUtilities.invokeLater(new Runnable() {
+ // ensureRowIndex in case of new route, otherwise the size is
+ // not updated yet in tableModel and an IndexOutOfBounds appears
+ int index = flightUIModel.indexOfRoutes(route);
+ SwingUtil.ensureRowIndex(ui.getRouteTableModel(), index);
+ ui.getRouteTableModel().fireTableRowsUpdated(index, index);
- @Override
- public void run() {
- Route route = ui.getFlightUIModel().getRouteEditBean();
- int index = ui.getFlightUIModel().indexOfRoutes(route);
- ui.getRouteTableModel().fireTableRowsUpdated(index, index);
- }
- });
+ // Update observation table to ensure observer's name during validation
+ if (flightUIModel.isValidationMode()) {
+ updateObservationTable(route, false);
+ }
}
}
}
@@ -624,15 +651,15 @@
ListSelectionListener selectionListener) {
// make tab key to focus only next editable cell
- table.setSelectionModel(new ForceSelectionSelectionModel());
- table.setSelectionBackground(null);
- table.setSelectionForeground(Color.BLACK);
+// table.setSelectionModel(new ForceSelectionSelectionModel());
+// table.setSelectionBackground(null);
+// table.setSelectionForeground(Color.BLACK);
+//
+//// table.setSortable(context.isValidationMode());
+// table.setSortable(false);
-// table.setSortable(context.isValidationMode());
- table.setSortable(false);
+// table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
- table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
-
final Action moveToNextEditableCell = new MoveToNextEditableCellAction(table);
final Action moveToPreviousEditableCell = new MoveToPreviousEditableCellAction(table);
final Action moveToPreviousRowEditableCell = new MoveToPreviousRowEditableAction(table);
@@ -704,29 +731,59 @@
SwingUtil.scrollToTableSelection(table);
- table.getModel().addTableModelListener(new TableModelListener() {
- @Override
- public void tableChanged(TableModelEvent e) {
- switch (e.getType()) {
- case TableModelEvent.INSERT:
+// table.getModel().addTableModelListener(new TableModelListener() {
+// @Override
+// public void tableChanged(TableModelEvent e) {
+// switch (e.getType()) {
+// case TableModelEvent.INSERT:
+//
+// // auto select new added line
+// table.getSelectionModel().setSelectionInterval(e.getFirstRow(), e.getFirstRow());
+// Rectangle rect = table.getCellRect(e.getFirstRow(), 0, true);
+// table.scrollRectToVisible(rect);
+// break;
+//
+// case TableModelEvent.DELETE:
+// case TableModelEvent.UPDATE:
+//
+// // auto select first line ?
+// if (table.getSelectedRow() < 0 && table.getRowCount() > 0) {
+// table.getSelectionModel().setSelectionInterval(0, 0);
+// }
+// break;
+// }
+// }
+// });
+ }
- // auto select new added line
- table.getSelectionModel().setSelectionInterval(e.getFirstRow(), e.getFirstRow());
- Rectangle rect = table.getCellRect(e.getFirstRow(), 0, true);
- table.scrollRectToVisible(rect);
- break;
+ protected void updateObservationTable(Route route, boolean scrollToFirst) {
- case TableModelEvent.DELETE:
- case TableModelEvent.UPDATE:
+ FlightUIModel model = ui.getFlightUIModel();
- // auto select first line ?
- if (table.getSelectedRow() < 0 && table.getRowCount() > 0) {
- table.getSelectionModel().setSelectionInterval(0, 0);
- }
- break;
+ Iterable<Observation> observations =
+ Observations.filterInRoute(model.getObservations(), route, model.getRoutes(), true);
+
+ if (Iterables.isEmpty(observations)) {
+ // nothing to do
+
+ } else {
+
+ int firstIndex = -1;
+ int lastIndex = -1;
+ for (Observation observation : observations) {
+ int index = model.indexOfObservations(observation);
+ if (firstIndex == -1 || firstIndex > index) {
+ firstIndex = index;
}
+ if (lastIndex == -1 || lastIndex < index) {
+ lastIndex = index;
+ }
}
- });
+ ui.getObservationTableModel().fireTableRowsUpdated(firstIndex, lastIndex);
+ if (scrollToFirst) {
+ ui.getObservationTable().scrollRowToVisible(firstIndex);
+ }
+ }
}
private PropertyChangeListener observationUpdateListener = new PropertyChangeListener() {
@@ -740,7 +797,6 @@
if (FlightUIModel.PROPERTY_ROUTE_EDIT_BEAN.equals(evt.getPropertyName())) {
-
Route oldValue = (Route) evt.getOldValue();
if (oldValue != null) {
updateObservationTable(oldValue, false);
@@ -750,46 +806,45 @@
updateObservationTable(newValue, true);
}
- } else {
+ } else if (ui.getFlightUIModel().sizeObservations() > 0) {
ui.getObservationTableModel().fireTableRowsUpdated(
0, ui.getFlightUIModel().sizeObservations() - 1);
}
+ }
+ };
+ private static class ObservationPositionCellRenderer implements TableCellRenderer {
-// if (selectedRow != -1) {
-// ui.getObservationTable().scrollRowToVisible(selectedRow);
-// ui.getObservationTable().setRowSelectionInterval(selectedRow, selectedRow);
-// }
+ protected TableCellRenderer delegate;
+
+ protected Decorator<Position> decorator;
+
+ protected ObservationTableModel model;
+
+ public ObservationPositionCellRenderer(TableCellRenderer delegate,
+ UIDecoratorService decoratorService,
+ ObservationTableModel model) {
+ this.delegate = delegate;
+ this.decorator = decoratorService.getDecoratorByType(Position.class);
+ this.model = model;
}
- };
- protected void updateObservationTable(Route route, boolean scrollToFirst) {
+ @Override
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
- FlightUIModel model = ui.getFlightUIModel();
+ Observation observation = model.getBean(row);
- Iterable<Observation> observations =
- Observations.filterInRoute(model.getObservations(), route, model.getRoutes(), true);
+ Route route = Routes.findWithObservation(model.getFlightUIModel().getRoutes(), observation, true);
- if (Iterables.isEmpty(observations)) {
- // nothing to do
- } else {
+ ObserverPosition observerPosition = route.getObserverPositionByPosition(observation.getPosition());
- int firstIndex = -1;
- int lastIndex = -1;
- for (Observation observation : observations) {
- int index = model.indexOfObservations(observation);
- if (firstIndex == -1 || firstIndex > index) {
- firstIndex = index;
- }
- if (lastIndex == -1 || lastIndex < index) {
- lastIndex = index;
- }
+ String newValue = decorator.toString(observation.getPosition());
+ if (observerPosition != null && observerPosition.getObserver() != null) {
+ newValue += " (" + observerPosition.getObserver().getInitials() + ")";
}
- ui.getObservationTableModel().fireTableRowsUpdated(firstIndex, lastIndex);
- if (scrollToFirst) {
- ui.getObservationTable().scrollRowToVisible(firstIndex);
- }
+
+ return delegate.getTableCellRendererComponent(table, newValue, isSelected, hasFocus, row, column);
}
}
Deleted: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ForceSelectionSelectionModel.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ForceSelectionSelectionModel.java 2012-08-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ForceSelectionSelectionModel.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -1,59 +0,0 @@
-/*
- * #%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.observations;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.swing.DefaultListSelectionModel;
-
-/**
- * Surcharge de modele de selection par default pour empecher la deselection
- * de la dernière ligne et pour qu'il y est toujours une ligne selectionnée.
- *
- * @author echatellier
- */
-public class ForceSelectionSelectionModel extends DefaultListSelectionModel {
-
- private static final Logger logger =
- LoggerFactory.getLogger(ForceSelectionSelectionModel.class);
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public int getSelectionMode() {
- return SINGLE_SELECTION;
- }
-
- @Override
- public void removeSelectionInterval(int index0, int index1) {
- // don't do anything
- if (logger.isDebugEnabled()) {
- logger.debug("don't remove selection interval ({}, {})",
- index0, index1);
- }
- }
-}
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/ObservationTableModel.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -29,8 +29,7 @@
import fr.ulr.sammoa.persistence.Flight;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.ObservationStatus;
-import fr.ulr.sammoa.persistence.Observer;
-import fr.ulr.sammoa.persistence.ObserverPosition;
+import fr.ulr.sammoa.persistence.Position;
import fr.ulr.sammoa.persistence.Region;
import fr.ulr.sammoa.persistence.Species;
import fr.ulr.sammoa.persistence.SpeciesImpl;
@@ -127,15 +126,15 @@
return cell;
}
+ public FlightUIModel getFlightUIModel() {
+ return flightUIModel;
+ }
+
public enum ObservationColumn {
OBSERVATION_NUMBER(false, int.class, Observation.PROPERTY_OBSERVATION_NUMBER),
OBSERVATION_TIME(false, Date.class, Observation.PROPERTY_OBSERVATION_TIME),
- OBSERVER(false, String.class,
- Observation.PROPERTY_OBSERVER_POSITION,
- ObserverPosition.PROPERTY_OBSERVER,
- Observer.PROPERTY_INITIALS
- ),
+ POSITION(true, Position.class, Observation.PROPERTY_POSITION),
POD_SIZE(true, int.class, Observation.PROPERTY_POD_SIZE),
SPECIES(true, String.class, Observation.PROPERTY_SPECIES, Species.PROPERTY_CODE) {
@Override
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/observations/RouteTableModel.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -144,10 +144,11 @@
Transect transect = transectFlight.getTransect();
- // retrieve the index of the transectFlight in the flight
- int index = model.getFlight().getTransectFlightIndex(transectFlight);
+// int index = model.getFlight().getTransectFlightIndex(transectFlight);
+// result = transect.getName() + " (" + index + ")";
- result = transect.getName() + " (" + index + ")";
+ int crossingNumber = transectFlight.getCrossingNumber();
+ result = transect.getName() + " (" + crossingNumber + ")";
} else {
result = null;
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/TableDataChangeListener.java 2012-08-29 14:43:17 UTC (rev 491)
@@ -49,10 +49,13 @@
protected AbstractTableModel tableModel;
+ protected int firstEditableColumn;
+
public TableDataChangeListener(JXTable table,
- AbstractTableModel tableModel) {
+ int firstEditableColumn) {
this.table = table;
- this.tableModel = tableModel;
+ this.tableModel = (AbstractTableModel) table.getModel();
+ this.firstEditableColumn = firstEditableColumn;
}
@Override
@@ -91,10 +94,10 @@
} 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);
+// int columnIndex = getFirstEditableColumn(rowIndex);
+ if (firstEditableColumn != NO_COLUMN_INDEX_TO_EDIT_ON_INSERT) {
+ table.changeSelection(rowIndex, firstEditableColumn, false, false);
+ table.editCellAt(rowIndex, firstEditableColumn);
}
}
@@ -123,16 +126,16 @@
}
}
}
-
- protected int getFirstEditableColumn(int rowIndex) {
- for (int columnIndex = 0; columnIndex < tableModel.getColumnCount(); columnIndex++) {
-
- boolean editable = tableModel.isCellEditable(rowIndex, columnIndex);
-
- if (editable) {
- return columnIndex;
- }
- }
- return NO_COLUMN_INDEX_TO_EDIT_ON_INSERT;
- }
+//
+// protected int getFirstEditableColumn(int rowIndex) {
+// for (int columnIndex = 0; columnIndex < tableModel.getColumnCount(); columnIndex++) {
+//
+// boolean editable = tableModel.isCellEditable(rowIndex, columnIndex);
+//
+// if (editable) {
+// return columnIndex;
+// }
+// }
+// return NO_COLUMN_INDEX_TO_EDIT_ON_INSERT;
+// }
}
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-29 14:38:16 UTC (rev 490)
+++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 14:43:17 UTC (rev 491)
@@ -182,12 +182,12 @@
sammoa.observations.observationTable.column.observationStatus.tip=Status
sammoa.observations.observationTable.column.observationTime=Time
sammoa.observations.observationTable.column.observationTime.tip=Time
-sammoa.observations.observationTable.column.observer=Obs
-sammoa.observations.observationTable.column.observer.tip=Obs
sammoa.observations.observationTable.column.photo=Photo
sammoa.observations.observationTable.column.photo.tip=Photo
sammoa.observations.observationTable.column.podSize=Pod size
sammoa.observations.observationTable.column.podSize.tip=Pod size
+sammoa.observations.observationTable.column.position=Pos
+sammoa.observations.observationTable.column.position.tip=Position
sammoa.observations.observationTable.column.species=Species
sammoa.observations.observationTable.column.species.tip=Species
sammoa.observations.observationTable.column.swimDir=Swim dir
1
0