r675 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort sammoa-ui-swing/src/main/resources sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence sammoa-ui-swing/src/main/resources/i18n
Author: sbavencoff Date: 2014-05-20 10:44:47 +0200 (Tue, 20 May 2014) New Revision: 675 Url: http://forge.codelutin.com/projects/sammoa/repository/revisions/675 Log: refs #4791 : on validation flight; show all geoPoint, indicate if observation's geo point is out of date. Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/GeoPointTableModel.java trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/GeoPoint-validation-warning-validation.xml Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationTopiaDao.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteTopiaDao.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanel.css trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanel.jaxx trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanelHandler.java trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties trunk/sammoa-ui-swing/src/main/resources/logback.xml 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 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/DecoratorService.java 2014-05-20 08:44:47 UTC (rev 675) @@ -25,6 +25,7 @@ import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; +import fr.ulr.sammoa.persistence.GeoPoint; import fr.ulr.sammoa.persistence.Observation; import fr.ulr.sammoa.persistence.Observer; import fr.ulr.sammoa.persistence.Position; @@ -105,6 +106,8 @@ registerJXPathDecorator(Region.class, "${code}$s"); registerMultiJXPathDecorator(Campaign.class, "${code}$s##${region/code}$s", "##", " - "); + registerJXPathDecorator(GeoPoint.class, "${recordTime}$tT => Lat ${latitude}$s - Lon ${longitude}$S"); + registerDecorator(new Decorator<Flight>(Flight.class) { private static final long serialVersionUID = 1L; 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 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2014-05-20 08:44:47 UTC (rev 675) @@ -393,9 +393,6 @@ timeLog.log(startTime, "begin()", "Fired"); - } catch (TopiaException e) { - throw new TopiaException(e); - } finally { endTransaction(tx); } 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 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2014-05-20 08:44:47 UTC (rev 675) @@ -101,6 +101,10 @@ return new WithDatePredicate(date); } + public static Predicate<GeoPoint> afterDate(Date date) { + return new AfterDatePredicate(date); + } + private static Function<GeoPoint, Date> TO_DATE_FUNCTION = new Function<GeoPoint, Date>() { @Override @@ -131,6 +135,20 @@ } } + private static class AfterDatePredicate implements Predicate<GeoPoint> { + + protected Date date; + + private AfterDatePredicate(Date date) { + this.date = date; + } + + @Override + public boolean apply(GeoPoint input) { + return date != null && (date.equals(input.getRecordTime()) || input.getRecordTime().after(date)); + } + } + private static class ToClosestPointFunction implements Function<Date, GeoPoint> { protected Date date; Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationTopiaDao.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationTopiaDao.java 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationTopiaDao.java 2014-05-20 08:44:47 UTC (rev 675) @@ -59,19 +59,22 @@ && species.getTopiaId() == null) { SpeciesTopiaDao speciesDAO = topiaDaoSupplier.getDao(Species.class, SpeciesTopiaDao.class); - Species existSpecies = speciesDAO.findByNaturalId(species.getCode(), species.getRegion()); - if (existSpecies == null) { + if (speciesDAO.existByNaturalId(species.getCode(), species.getRegion())) { + + Species existSpecies = speciesDAO.findByNaturalId(species.getCode(), species.getRegion()); + + logger.debug("Use existing species '{}'", existSpecies.getCode()); + + e.setSpecies(existSpecies); + + } else { + logger.debug("Create a new species '{}'", species.getCode()); species.setLocalCreation(true); speciesDAO.create(species); - } else { - - logger.debug("Use existing species '{}'", existSpecies.getCode()); - - e.setSpecies(existSpecies); } } Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteTopiaDao.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteTopiaDao.java 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/RouteTopiaDao.java 2014-05-20 08:44:47 UTC (rev 675) @@ -115,7 +115,7 @@ ImmutableMap<String, Object> parameters = ImmutableMap.of( "flight", (Object) flight); - Integer queryResult = findFirstOrNull(hql, parameters ); + Integer queryResult = findAnyOrNull(hql, parameters ); int result = queryResult == null ? 1 : queryResult + 1; 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 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2014-05-20 08:44:47 UTC (rev 675) @@ -41,6 +41,7 @@ import com.bbn.openmap.proj.coords.LatLonPoint; import com.bbn.openmap.util.PropUtils; import com.google.common.base.Objects; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Strings; @@ -1315,6 +1316,23 @@ } } + protected void selectGeoPointFromTime(Date time) { + + Optional<GeoPoint> geoPointOptional = FluentIterable + .from(getModel().getGeoPoints()) + .filter(GeoPoints.afterDate(time)) + .first(); + + if (geoPointOptional.isPresent()) { + + int geoPointIndex = getModel().indexOfGeoPoint(geoPointOptional.get()); + SammoaUtil.selectTableRow(ui.getEffortPanel().getGeoPointTable(), geoPointIndex); + + } else { + SammoaUtil.unselectAll(ui.getEffortPanel().getGeoPointTable()); + } + } + protected GeoPoint ensureGeoPoint(Date date) { List<GeoPoint> modelPoints = getModel().getGeoPoints(); @@ -1384,6 +1402,9 @@ // Reset the ValidModel getValidModel().resetRouteValid(newValue); + + // set geo point + selectGeoPointFromTime(newValue.getBeginTime()); } } @@ -1405,6 +1426,9 @@ // Reset the ValidModel getValidModel().resetObservationValid(newValue); + + // set geo point + selectGeoPointFromTime(newValue.getObservationTime()); } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIModel.java 2014-05-20 08:44:47 UTC (rev 675) @@ -491,4 +491,8 @@ this.validationMode = validationMode; firePropertyChange(PROPERTY_VALIDATION_MODE, oldValue, validationMode); } + + public int indexOfGeoPoint(GeoPoint geoPoint) { + return getGeoPoints().indexOf(geoPoint); + } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanel.css =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanel.css 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanel.css 2014-05-20 08:44:47 UTC (rev 675) @@ -162,3 +162,18 @@ _actionName: {"rightObservation"}; background: {SammoaColors.POSITION_RIGHT_COLOR}; } + +#geoPointTable { + model:{geoPointTableModel}; + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; + _terminateEditOnFocusLost: {true}; +} + +JSplitPane { + oneTouchExpandable: true; + continuousLayout: true; + dividerSize: 12; +} Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanel.jaxx =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanel.jaxx 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanel.jaxx 2014-05-20 08:44:47 UTC (rev 675) @@ -33,6 +33,7 @@ fr.ulr.sammoa.persistence.Route fr.ulr.sammoa.persistence.Observer fr.ulr.sammoa.persistence.Observation + fr.ulr.sammoa.persistence.GeoPoint fr.ulr.sammoa.ui.swing.SammoaColors fr.ulr.sammoa.ui.swing.flight.FlightUIModel @@ -74,6 +75,9 @@ <!--ObservationTableListSelectionListener id='observationSelectionModel' constructorParams='flightUIModel'/--> + <GeoPointTableModel id='geoPointTableModel' + constructorParams='model'/> + <!-- validator --> <BeanListValidator id='routeValidator' genericType='Route' initializer='BeanListValidator.newValidator(Route.class, null)'/> @@ -81,6 +85,9 @@ <BeanListValidator id='observationValidator' genericType='Observation' initializer='BeanListValidator.newValidator(Observation.class, null)'/> + <BeanListValidator id='geoPointValidator' genericType='GeoPoint' + initializer='BeanListValidator.newValidator(GeoPoint.class, null)'/> + <script><![CDATA[ protected void $afterCompleteSetup() { @@ -161,12 +168,16 @@ </row> <row> <cell fill='both' weightx='1.0' weighty='1.0' columns='4'> - <JScrollPane id='observationTableScroll'> - <JXTable id='observationTable' /> - </JScrollPane> + <JSplitPane> + <JScrollPane id='observationTableScroll'> + <JXTable id='observationTable' /> + </JScrollPane> + <JScrollPane id='geoPointTableScroll'> + <JXTable id='geoPointTable'/> + </JScrollPane> + </JSplitPane> </cell> </row> - </Table> </cell> </row> Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanelHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanelHandler.java 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/EffortPanelHandler.java 2014-05-20 08:44:47 UTC (rev 675) @@ -25,8 +25,11 @@ import com.ezware.oxbow.swingbits.table.filter.TableRowFilterSupport; import com.google.common.base.Objects; +import com.google.common.base.Optional; import com.google.common.base.Supplier; +import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; import fr.ulr.sammoa.application.FlightService; import fr.ulr.sammoa.application.device.DeviceState; import fr.ulr.sammoa.application.device.DeviceStateEvent; @@ -34,6 +37,8 @@ import fr.ulr.sammoa.application.device.audio.AudioRecorder; import fr.ulr.sammoa.application.device.gps.GpsHandler; import fr.ulr.sammoa.application.flightController.FlightController; +import fr.ulr.sammoa.persistence.GeoPoint; +import fr.ulr.sammoa.persistence.GeoPoints; import fr.ulr.sammoa.persistence.Observation; import fr.ulr.sammoa.persistence.ObservationStatus; import fr.ulr.sammoa.persistence.Observations; @@ -76,6 +81,8 @@ import jaxx.runtime.validator.swing.SwingValidatorUtil; import org.apache.commons.lang3.tuple.Pair; import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.decorator.ComponentAdapter; +import org.jdesktop.swingx.decorator.HighlightPredicate; import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.TableColumnExt; import org.nuiton.decorator.Decorator; @@ -97,9 +104,10 @@ import java.beans.PropertyChangeListener; import java.util.Date; import java.util.List; +import java.util.Set; +import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; -import static org.nuiton.i18n.I18n.n; /** * Handler of {@link EffortPanel} ui. @@ -120,6 +128,9 @@ public static final String OBSERVATION_VALIDATOR_CONTEXT_VALUE = "observationValidator"; + public static final String GEO_POINT_VALIDATOR_CONTEXT_VALUE = + "geoPointValidator"; + protected boolean comboIsAdjusting; private final SammoaUIContext context; @@ -175,6 +186,8 @@ initRouteTable(); initObservationTable(); + + initGeoPointTable(); } @@ -184,6 +197,7 @@ * @param validator the validator where to find bean states * @param editor the editor of beans * @param dataLocator the data locator + * @param isToValidate the predicate if bean is to validate (may be null) * @param scopes scopes to hightlight * @param <O> type of bean to validate * @since 2.5.3 @@ -191,15 +205,20 @@ public static <O> void addHightLighterOnEditor(BeanListValidator<O> validator, JXTable editor, SwingListValidatorDataLocator<O> dataLocator, + HighlightPredicate isToValidate, NuitonValidatorScope... scopes) { for (NuitonValidatorScope scope : scopes) { - SwingListValidatorHighlightPredicate<O> predicate = SwingListValidatorHighlightPredicate.newPredicate( + HighlightPredicate predicate = SwingListValidatorHighlightPredicate.newPredicate( scope, validator, dataLocator ); + if (isToValidate != null) { + predicate = new HighlightPredicate.AndHighlightPredicate(isToValidate, predicate); + } + Highlighter highlighter = SammoaUtil.newBackgroundColorHighlighter( predicate, SwingValidatorUtil.getColor(scope)); editor.addHighlighter(highlighter); @@ -406,6 +425,7 @@ validator, table, dataLocator, + null, NuitonValidatorScope.ERROR, NuitonValidatorScope.WARNING ); @@ -625,6 +645,7 @@ validator, table, dataLocator, + null, NuitonValidatorScope.ERROR, NuitonValidatorScope.WARNING ); @@ -640,6 +661,121 @@ } } + public void initGeoPointTable() { + JXTable table = ui.getGeoPointTable(); + + if (getModel().isValidationMode()) { + + SwingUtil.setI18nTableHeaderRenderer( + table, + n("sammoa.geoPoints.geoPointTable.column.recordTime"), + n("sammoa.geoPoints.geoPointTable.column.recordTime.tip"), + n("sammoa.geoPoints.geoPointTable.column.latitude"), + n("sammoa.geoPoints.geoPointTable.column.latitude.tip"), + n("sammoa.geoPoints.geoPointTable.column.longitude"), + n("sammoa.geoPoints.geoPointTable.column.longitude.tip"), + n("sammoa.geoPoints.geoPointTable.column.altitude"), + n("sammoa.geoPoints.geoPointTable.column.altitude.tip"), + n("sammoa.geoPoints.geoPointTable.column.speed"), + n("sammoa.geoPoints.geoPointTable.column.speed.tip"), + n("sammoa.geoPoints.geoPointTable.column.captureDelay"), + n("sammoa.geoPoints.geoPointTable.column.captureDelay.tip") + ); + + init(table, new SelectionModelAdapter<GeoPoint>() { + + @Override + public List<GeoPoint> getElements() { + return getModel().getGeoPoints(); + } + + @Override + public void setSelectedElement(GeoPoint element) { + + } + }); + + // Validation + BeanListValidator<GeoPoint> validator = ui.getGeoPointValidator(); + final GeoPointValidatorDataLocator dataLocator = + new GeoPointValidatorDataLocator(); + + JTable errorTable = ui.getErrorTable(); + SwingListValidatorMessageTableModel errorTableModel = ui.getErrorTableModel(); + + validator.setContext(getValidatorContext()); + getParentUI().setContextValue(validator, GEO_POINT_VALIDATOR_CONTEXT_VALUE); + + SwingValidatorUtil.registerListValidator( + validator, + errorTableModel, + table, + errorTable, + dataLocator + ); + + final Set<GeoPoint> geoPointsToValidate = Sets.newHashSet(); + + for (Observation observation : ui.getObservationTableModel().getBean()) { + Optional<GeoPoint> geoPointOptional = FluentIterable + .from(getModel().getGeoPoints()) + .filter(GeoPoints.afterDate(observation.getObservationTime())) + .first(); + + if (geoPointOptional.isPresent()) { + geoPointsToValidate.add(geoPointOptional.get()); + } + } + + validator.addAllBeans(geoPointsToValidate); + + + // listener + + // Refresh matching observations from selected route + getModel().addPropertyChangeListener( + FlightUIModel.PROPERTY_OBSERVATION_EDIT_BEAN, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + onObservationChanged((Observation) evt.getOldValue(), + (Observation) evt.getNewValue()); + } + } + ); + + table.addHighlighter(SammoaUtil.newBackgroundColorHighlighter( + new GoePointForSelectedObservationHighlightPredicate(getModel()), + SammoaColors.OBSERVATION_FOR_ROUTE_ROW_COLOR) + ); + + addHightLighterOnEditor( + validator, + table, + dataLocator, + new HighlightPredicate() { + @Override + public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { + + int rowIndex = adapter.convertRowIndexToModel(adapter.row); + JTable component = (JTable) adapter.getComponent(); + Object bean = dataLocator.locateBean(component.getModel(), rowIndex); + + boolean result = geoPointsToValidate.contains(bean); + + return result; + } + }, + NuitonValidatorScope.ERROR, + NuitonValidatorScope.WARNING + ); + } else { + + ui.getGeoPointTableScroll().setVisible(false); + + } + } + public <T> void init(final JXTable table, SelectionModelAdapter<T> selectionModelAdapter) { @@ -698,6 +834,17 @@ // textField.setBorder(BasicBorders.getTextFieldBorder()); table.setDefaultEditor(int.class, editor); table.setDefaultEditor(Integer.class, editor); + + NumberCellEditor<Double> editorDouble = + JAXXWidgetUtil.newNumberTableCellEditor(Double.class, true); + editorDouble.getNumberEditor().setSelectAllTextOnError(true); + JTextField textFieldDouble = editorDouble.getNumberEditor().getTextField(); + textFieldDouble.addKeyListener(goNextCellAdapter); + textFieldDouble.setBorder(new LineBorder(Color.GRAY, 2)); +// textField.setBorder(BasicBorders.getTextFieldBorder()); + table.setDefaultEditor(double.class, editorDouble); + table.setDefaultEditor(Double.class, editorDouble); + } // Boolean @@ -993,6 +1140,38 @@ } } + private static class GeoPointValidatorDataLocator implements SwingListValidatorDataLocator<GeoPoint> { + + @Override + public boolean acceptType(Class<?> beanType) { + return GeoPoint.class.isAssignableFrom(beanType); + } + + @Override + public Pair<Integer, Integer> locateDataCell(TableModel tableModel, + GeoPoint bean, + String fieldName) { + GeoPointTableModel model = (GeoPointTableModel) tableModel; + + Pair<Integer, Integer> cell = + model.getCell(bean, fieldName); + return cell; + } + + @Override + public int locateBeanRowIndex(TableModel tableModel, GeoPoint bean) { + GeoPointTableModel model = (GeoPointTableModel) tableModel; + return model.getBeanIndex(bean); + } + + @Override + public GeoPoint locateBean(TableModel tableModel, int rowIndex) { + GeoPointTableModel model = + (GeoPointTableModel) tableModel; + return model.getBean(rowIndex); + } + } + public static class RouteForSelectedTransectFlightHighlightPredicate extends AbstractRowHighlightPredicate { protected FlightUIModel UIModel; @@ -1093,4 +1272,36 @@ return model.getRow(rowIndex); } } + + public static class GoePointForSelectedObservationHighlightPredicate extends AbstractRowHighlightPredicate { + + protected FlightUIModel UIModel; + + public GoePointForSelectedObservationHighlightPredicate(FlightUIModel UIModel) { + this.UIModel = UIModel; + } + + @Override + protected boolean isHighlighted(int rowIndex) { + + Observation observation = UIModel.getObservationEditBean(); + + boolean result; + if (observation != null) { + + GeoPoint geoPoint = getValueAt(rowIndex); + + result = observation.getObservationTime().equals(geoPoint.getRecordTime()); + + } else { + result = false; + } + return result; + } + + @Override + protected GeoPoint getValueAt(int rowIndex) { + return UIModel.getGeoPoints().get(rowIndex); + } + } } Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/GeoPointTableModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/GeoPointTableModel.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/effort/GeoPointTableModel.java 2014-05-20 08:44:47 UTC (rev 675) @@ -0,0 +1,181 @@ +package fr.ulr.sammoa.ui.swing.flight.effort; + +import fr.ulr.sammoa.persistence.GeoPoint; +import fr.ulr.sammoa.ui.swing.flight.FlightUIModel; +import fr.ulr.sammoa.ui.swing.util.SammoaUtil; +import jaxx.runtime.SwingUtil; +import org.apache.commons.lang3.tuple.Pair; + +import javax.swing.table.AbstractTableModel; +import java.util.Date; +import java.util.List; + +/** + * @author Sylvain Bavencoff <bavencoff@codelutin.com> + */ +public class GeoPointTableModel extends AbstractTableModel { + + private static final long serialVersionUID = 1L; + + protected FlightUIModel flightUIModel; + + public GeoPointTableModel(FlightUIModel flightUIModel) { + this.flightUIModel = flightUIModel; + } + + @Override + public int getRowCount() { + return getBean().size(); + } + + @Override + public int getColumnCount() { + return GeoPointColumn.values().length; + } + + @Override + public String getColumnName(int column) { + GeoPointColumn geoPointColumn = GeoPointColumn.valueOf(column); + return geoPointColumn.getColumnName(); + } + + @Override + public Class<?> getColumnClass(int column) { + GeoPointColumn geoPointColumn = GeoPointColumn.valueOf(column); + return geoPointColumn.getType(); + } + + @Override + public boolean isCellEditable(int row, int column) { + GeoPoint geoPoint = getBean(row); + GeoPointColumn geoPointColumn = GeoPointColumn.valueOf(column); + boolean result = geoPointColumn.isEditable(geoPoint, flightUIModel.isValidationMode()); + return result; + } + + @Override + public Object getValueAt(int row, int column) { + GeoPoint geoPoint = getBean(row); + GeoPointColumn geoPointColumn = GeoPointColumn.valueOf(column); + Object result = geoPointColumn.getValue(geoPoint); + return result; + } + + @Override + public void setValueAt(Object aValue, int row, int column) { + GeoPoint geoPoint = getBean(row); + GeoPointColumn geoPointColumn = GeoPointColumn.valueOf(column); + geoPointColumn.setValue(geoPoint, aValue); + fireTableRowsUpdated(row, row); + } + + public int getBeanIndex(GeoPoint bean) { + int row = getBean().indexOf(bean); + return row; + } + + public List<GeoPoint> getBean() { + return flightUIModel.getGeoPoints(); + } + + public GeoPoint getBean(int row) { + SwingUtil.ensureRowIndex(this, row); + GeoPoint bean = getBean().get(row); + return bean; + } + + public Pair<Integer, Integer> getCell(GeoPoint bean, String fieldName) { + + int row = getBeanIndex(bean); + int col = GeoPointColumn.getValueFromFieldName(fieldName).ordinal(); + + Pair<Integer, Integer> cell = Pair.of(row, col); + return cell; + } + + public FlightUIModel getFlightUIModel() { + return flightUIModel; + } + + + public enum GeoPointColumn { + + RECORD_TIME(false, Date.class, GeoPoint.PROPERTY_RECORD_TIME), + LATITUDE(true, double.class, GeoPoint.PROPERTY_LATITUDE), + LONGITUDE(true, double.class, GeoPoint.PROPERTY_LONGITUDE), + ALTITUDE(true, double.class, GeoPoint.PROPERTY_ALTITUDE), + SPEED(true, double.class, GeoPoint.PROPERTY_SPEED), + CAPTURE_DELAY(true, int.class, GeoPoint.PROPERTY_CAPTURE_DELAY); + + private boolean editable; + + private String[] beanProperties; + + private Class<?> type; + + private final String columnName; + + private GeoPointColumn(boolean editable, + Class<?> type, + String... beanProperties) { + this.editable = editable; + this.type = type; + this.beanProperties = beanProperties; + this.columnName = beanProperties[0]; + } + + public Class<?> getType() { + return type; + } + + public String getColumnName() { + return columnName; + } + + public int getColumnIndex() { + return ordinal(); + } + + public Object getValue(GeoPoint bean) { + Object result = SammoaUtil.getPropertyValue(bean, beanProperties); + return result; + } + + public void setValue(GeoPoint bean, Object value) { + if (type.isPrimitive() && value == null) { + // can not set a null value to a primitive field + } else { + SammoaUtil.setPropertyValue(bean, value, beanProperties); + } + } + + public boolean isEditable(GeoPoint bean, boolean validationMode) { + boolean result = editable && validationMode; + return result; + } + + public static GeoPointColumn valueOf(int ordinal) { + for (GeoPointColumn value : values()) { + if (ordinal == value.ordinal()) { + return value; + } + } + throw new EnumConstantNotPresentException(GeoPointColumn.class, + "ordinal=" + ordinal); + } + + public static GeoPointColumn getValueFromFieldName(String fieldName) { + GeoPointColumn result = null; + for (GeoPointColumn value : values()) { + if (fieldName.equals(value.columnName)) { + result = value; + break; + } + } + return result; + } + + + } + +} Added: trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/GeoPoint-validation-warning-validation.xml =================================================================== --- trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/GeoPoint-validation-warning-validation.xml (rev 0) +++ trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/GeoPoint-validation-warning-validation.xml 2014-05-20 08:44:47 UTC (rev 675) @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="captureDelay"> + <field-validator type="int" short-circuit="true"> + <param name="max">5</param> + <message>sammoa.validator.observation.position.outOfDate</message> + </field-validator> + + </field> + +</validators> 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 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2014-05-20 08:44:47 UTC (rev 675) @@ -105,6 +105,18 @@ sammoa.flightPanel.table.column.position.left=Left sammoa.flightPanel.table.column.position.navigator=Nav sammoa.flightPanel.table.column.position.right=Right +sammoa.geoPoints.geoPointTable.column.altitude=Alt +sammoa.geoPoints.geoPointTable.column.altitude.tip=Altitude +sammoa.geoPoints.geoPointTable.column.captureDelay=delay +sammoa.geoPoints.geoPointTable.column.captureDelay.tip=Capture delay +sammoa.geoPoints.geoPointTable.column.latitude=Lat +sammoa.geoPoints.geoPointTable.column.latitude.tip=Latitude +sammoa.geoPoints.geoPointTable.column.longitude=Lon +sammoa.geoPoints.geoPointTable.column.longitude.tip=Longitude +sammoa.geoPoints.geoPointTable.column.recordTime=Time +sammoa.geoPoints.geoPointTable.column.recordTime.tip=Time +sammoa.geoPoints.geoPointTable.column.speed=Speed +sammoa.geoPoints.geoPointTable.column.speed.tip=Speed sammoa.importApplication.flightTable.column.flightExist=Flight exist sammoa.importApplication.flightTable.column.flightExist.tip=Flight exist sammoa.importApplication.flightTable.column.flightName=Flight name @@ -291,6 +303,7 @@ sammoa.validator.observation.cue.unkownValue=The cue must be between 2 and 9 or U for underwater and A for surface sammoa.validator.observation.decAngle.invalidRange=The angle must be between %1$s and %2$s degrees or for the band \: 1 (in the band), 2 (outside the band), 3 (put in the band) sammoa.validator.observation.podSize.invalidMin=The pod size must be higher than %1$s +sammoa.validator.observation.position.outOfDate=capture delay is out of date sammoa.validator.observation.species.required=The species is mandatory sammoa.validator.observation.swimDir.invalidRange=The swim direction must be between %1$s and %2$s degrees sammoa.validator.observation.unknown.species=The species with code %s does not exist in referential Modified: trunk/sammoa-ui-swing/src/main/resources/logback.xml =================================================================== --- trunk/sammoa-ui-swing/src/main/resources/logback.xml 2014-05-19 07:34:49 UTC (rev 674) +++ trunk/sammoa-ui-swing/src/main/resources/logback.xml 2014-05-20 08:44:47 UTC (rev 675) @@ -49,7 +49,7 @@ <logger name="fr.ulr.sammoa" level="INFO"/> - <logger name="fr.ulr.sammoa.application.device.gps" level="TRACE"/> + <!--logger name="fr.ulr.sammoa.application.device.gps" level="TRACE"/--> <root level="ERROR"> <!--<appender-ref ref="FILE"/>-->
participants (1)
-
sbavencoff@users.forge.codelutin.com