[tutti] branch develop updated (ab2c655 -> c517126)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository tutti. See http://git.codelutin.com/tutti.git from ab2c655 merge feature/5842 to develop new 9458974 refs #5128 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO new 32d974d refs #5128 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO new 3667ed5 refs #6000 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO new c517126 fixes #6000 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO The 4 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit c517126c14f978134e1d7cf79d2d19e17a646fa6 Author: Kevin Morin <morin@codelutin.com> Date: Thu Oct 23 18:04:40 2014 +0200 fixes #6000 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO commit 3667ed5c67918700cffb1509f8d6e62c363405aa Author: Kevin Morin <morin@codelutin.com> Date: Thu Oct 23 10:49:24 2014 +0200 refs #6000 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO commit 32d974dd1745ba8774ca2f8dcad1566d603096a4 Author: Kevin Morin <morin@codelutin.com> Date: Wed Oct 22 19:21:15 2014 +0200 refs #5128 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO commit 945897407bd0edc5c32edce69bc00c6743742938 Author: Kevin Morin <morin@codelutin.com> Date: Tue Oct 21 18:25:09 2014 +0200 refs #5128 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO Summary of changes: pom.xml | 7 + tutti-ui-swing/pom.xml | 5 + .../BenthosFrequencyLogCellComponent.java | 170 ++++++++++++++++++++ .../frequency/BenthosFrequencyLogRowModel.java | 43 +++++ .../frequency/BenthosFrequencyLogsTableModel.java} | 34 ++-- .../frequency/BenthosFrequencyTableModel.java | 9 +- .../benthos/frequency/BenthosFrequencyUI.css | 17 ++ .../benthos/frequency/BenthosFrequencyUI.jaxx | 18 ++- .../frequency/BenthosFrequencyUIHandler.java | 162 ++++++++++++++++++- .../SpeciesFrequencyLogCellComponent.java | 172 ++++++++++++++++++++ .../frequency/SpeciesFrequencyLogRowModel.java | 45 ++++++ .../frequency/SpeciesFrequencyLogsTableModel.java} | 41 ++--- .../frequency/SpeciesFrequencyTableModel.java | 11 +- .../species/frequency/SpeciesFrequencyUI.css | 17 ++ .../species/frequency/SpeciesFrequencyUI.jaxx | 18 ++- .../frequency/SpeciesFrequencyUIHandler.java | 178 ++++++++++++++++++++- .../resources/i18n/tutti-ui-swing_en_GB.properties | 9 ++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 4 + .../src/main/resources/icons/action-delete.png | Bin 715 -> 363 bytes tutti-ui-swing/src/main/resources/test.shp | Bin 0 -> 448188 bytes 20 files changed, 905 insertions(+), 55 deletions(-) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogCellComponent.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogRowModel.java copy tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/{fishing/GearUseFeatureTableModel.java => catches/benthos/frequency/BenthosFrequencyLogsTableModel.java} (52%) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java copy tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/{fishing/VesselUseFeatureTableModel.java => catches/species/frequency/SpeciesFrequencyLogsTableModel.java} (50%) create mode 100644 tutti-ui-swing/src/main/resources/test.shp -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 945897407bd0edc5c32edce69bc00c6743742938 Author: Kevin Morin <morin@codelutin.com> Date: Tue Oct 21 18:25:09 2014 +0200 refs #5128 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO --- pom.xml | 7 ++ tutti-ui-swing/pom.xml | 5 + .../frequency/SpeciesFrequencyLogRowModel.java | 40 ++++++++ .../frequency/SpeciesFrequencyLogsTableModel.java | 64 +++++++++++++ .../frequency/SpeciesFrequencyTableModel.java | 10 +- .../species/frequency/SpeciesFrequencyUI.css | 7 ++ .../species/frequency/SpeciesFrequencyUI.jaxx | 17 +++- .../frequency/SpeciesFrequencyUIHandler.java | 106 ++++++++++++++++++++- .../ui/swing/util/ThreeColumnsSplitPaneModel.java | 34 +++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 4 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 2 + tutti-ui-swing/src/main/resources/test.shp | Bin 0 -> 448188 bytes 12 files changed, 287 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 8b6fa2f..84714d2 100644 --- a/pom.xml +++ b/pom.xml @@ -494,6 +494,13 @@ <scope>runtime</scope> </dependency> + <!-- JFreeChart --> + <dependency> + <groupId>org.jfree</groupId> + <artifactId>jfreechart</artifactId> + <version>1.0.19</version> + </dependency> + <!-- Test --> <dependency> <groupId>org.mockito</groupId> diff --git a/tutti-ui-swing/pom.xml b/tutti-ui-swing/pom.xml index 9a0bb8d..4a3cd59 100644 --- a/tutti-ui-swing/pom.xml +++ b/tutti-ui-swing/pom.xml @@ -264,6 +264,11 @@ <scope>runtime</scope> </dependency> + <dependency> + <groupId>org.jfree</groupId> + <artifactId>jfreechart</artifactId> + </dependency> + <!-- Tests --> <dependency> <groupId>junit</groupId> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java new file mode 100644 index 0000000..d6ea6a2 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java @@ -0,0 +1,40 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import org.apache.commons.lang3.time.DateFormatUtils; +import org.jdesktop.beans.AbstractBean; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class SpeciesFrequencyLogRowModel extends AbstractBean implements Serializable { + + public static final String PROPERTY_LABEL = "label"; + + protected Float lengthStep; + protected Date date; + + public Float getLengthStep() { + return lengthStep; + } + + public void setLengthStep(Float lengthStep) { + this.lengthStep = lengthStep; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getLabel() { + String formattedTime = DateFormatUtils.format(date, "HH:mm:ss"); + return formattedTime + " : " + lengthStep.toString(); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogsTableModel.java new file mode 100644 index 0000000..83750f1 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogsTableModel.java @@ -0,0 +1,64 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +/* + * #%L + * Tutti :: UI + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.Maps; +import fr.ifremer.tutti.type.WeightUnit; +import org.jdesktop.swingx.table.TableColumnModelExt; +import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; +import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.List; +import java.util.Map; + +import static org.nuiton.i18n.I18n.n; + +/** + * Model of the species frequency log table. + * + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class SpeciesFrequencyLogsTableModel extends AbstractApplicationTableModel<SpeciesFrequencyLogRowModel> { + + private static final long serialVersionUID = 1L; + + public static final ColumnIdentifier<SpeciesFrequencyRowModel> LABEL = ColumnIdentifier.newId( + SpeciesFrequencyLogRowModel.PROPERTY_LABEL, + n("tutti.editSpeciesFrequencies.logTable.header.label"), + n("tutti.editSpeciesFrequencies.logTable.header.label")); + + + public SpeciesFrequencyLogsTableModel(TableColumnModelExt columnModel) { + super(columnModel, true, false); + setNoneEditableCols(LABEL); + } + + @Override + public SpeciesFrequencyLogRowModel createNewRow() { + SpeciesFrequencyLogRowModel result = new SpeciesFrequencyLogRowModel(); + return result; + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java index 99ca712..83f74ac 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java @@ -24,6 +24,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import com.google.common.collect.Maps; import fr.ifremer.tutti.type.WeightUnit; +import org.jfree.data.xy.XYSeries; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; import org.jdesktop.swingx.table.TableColumnModelExt; @@ -71,13 +72,17 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp */ protected final WeightUnit weightUnit; + protected final PropertyChangeListener rowPropertyChangeListener; + public SpeciesFrequencyTableModel(WeightUnit weightUnit, TableColumnModelExt columnModel, - SpeciesFrequencyUIModel uiModel) { + SpeciesFrequencyUIModel uiModel, + PropertyChangeListener rowPropertyChangeListener) { super(columnModel, true, true); this.weightUnit = weightUnit; this.uiModel = uiModel; this.rowCache = Maps.newTreeMap(); + this.rowPropertyChangeListener = rowPropertyChangeListener; setNoneEditableCols(); } @@ -112,6 +117,9 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } } }); + + result.addPropertyChangeListener(rowPropertyChangeListener); + result.setLengthStepCaracteristic(uiModel.getLengthStepCaracteristic()); result.setLengthStep(defaultStep); result.setValid(defaultStep != null); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css index ef03cb7..5300876 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css @@ -192,6 +192,13 @@ ComputableDataEditor { layout: {dataFieldLayout}; } +#logsTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; +} + #tableScrollPane { _validatorLabel: {t("tutti.editSpeciesFrequencies.field.rows")}; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx index 66c9a4c..7fa2c0a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx @@ -28,6 +28,7 @@ fr.ifremer.tutti.ui.swing.TuttiHelpBroker fr.ifremer.tutti.ui.swing.content.operation.catches.FrequencyConfigurationMode + fr.ifremer.tutti.ui.swing.util.ThreeColumnsSplitPaneModel fr.ifremer.tutti.ui.swing.util.TuttiUI fr.ifremer.tutti.ui.swing.util.TuttiUIUtil fr.ifremer.tutti.ui.swing.util.computable.ComputableDataEditor @@ -37,6 +38,7 @@ jaxx.runtime.swing.editor.NumberEditor org.jdesktop.swingx.JXTable + org.jdesktop.swingx.JXMultiSplitPane javax.swing.ListSelectionModel javax.swing.SwingConstants @@ -193,9 +195,18 @@ public SpeciesFrequencyUI(TuttiUI parentUI) { </JPanel> <JPanel id='dataFieldPanel' constraints='BorderLayout.CENTER'> - <JScrollPane id='tableScrollPane' constraints='"lengthCaracteristicPmfm"'> - <JXTable id='table'/> - </JScrollPane> + <JXMultiSplitPane constraints='"lengthCaracteristicPmfm"' model="{new ThreeColumnsSplitPaneModel()}"> + <JScrollPane id='logsScrollPane' constraints="ThreeColumnsSplitPaneModel.LEFT"> + <JXTable id='logsTable'/> + </JScrollPane> + <JScrollPane id='tableScrollPane' constraints="ThreeColumnsSplitPaneModel.CENTER"> + <JXTable id='table'/> + </JScrollPane> + <JPanel constraints="ThreeColumnsSplitPaneModel.RIGHT" + id="histogramPanel" + layout="{new BorderLayout()}"> + </JPanel> + </JXMultiSplitPane> <Table constraints='"noLengthCaracteristicPmfm"' fill='horizontal'> <row> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index 03ac92f..ab34892 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -51,20 +51,36 @@ import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXMultiSplitPane; import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.JXTitledPanel; +import org.jdesktop.swingx.MultiSplitLayout; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.data.statistics.HistogramDataset; +import org.jfree.data.statistics.HistogramType; +import org.jfree.data.xy.DefaultIntervalXYDataset; +import org.jfree.data.xy.IntervalXYDataset; +import org.jfree.data.xy.XYIntervalSeries; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; import org.nuiton.jaxx.application.ApplicationBusinessException; import org.nuiton.jaxx.application.swing.util.Cancelable; -import javax.swing.JComponent; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -87,6 +103,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci private Map<String, Caracteristic> lengthStepCaracteristics; + private XYSeriesCollection dataset; + /** * Weight unit. * @@ -158,8 +176,14 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SpeciesFrequencyUIModel model = getModel(); model.setEmptyRows(Sets.<SpeciesFrequencyRowModel>newHashSet()); if (CollectionUtils.isNotEmpty(rows)) { + XYSeries series = dataset.getSeries(0); + series.clear(); for (SpeciesFrequencyRowModel row : rows) { model.updateRowWithWeight(row); + Float lengthStep = row.getLengthStep(); + if (lengthStep != null) { + series.add(lengthStep, row.getNumber()); + } } for (SpeciesFrequencyRowModel row : rows) { recomputeRowValidState(row); @@ -317,6 +341,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // get step from the pmfm float step = getStep(newValue); getModel().setStep(step); + dataset.setIntervalWidth(step); if (CollectionUtils.isNotEmpty(getModel().getRows())) { for (SpeciesFrequencyRowModel rowModel : getModel().getRows()) { rowModel.setLengthStepCaracteristic(newValue); @@ -346,6 +371,30 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } }); + // init histogram + final XYSeries series = new XYSeries("", true, false); + dataset = new XYSeriesCollection(series); + dataset.setIntervalPositionFactor(0); + dataset.setIntervalWidth(step); + + JFreeChart chart = ChartFactory.createXYBarChart(null, + t("tutti.editSpeciesFrequencies.table.header.lengthStep"), + false, + t("tutti.editSpeciesFrequencies.table.header.number"), + dataset); + chart.clearSubtitles(); + chart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); + + final ChartPanel chartPanel = new ChartPanel(chart); + chartPanel.setDomainZoomable(false); + chartPanel.setMouseZoomable(false); + chartPanel.setPopupMenu(null); + + JPanel histogramPanel = ui.getHistogramPanel(); + histogramPanel.add(chartPanel, BorderLayout.CENTER); + + // init data table + JXTable table = getTable(); // create table column model @@ -380,7 +429,25 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci new SpeciesFrequencyTableModel( weightUnit, columnModel, - model); + model, + new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); + + if (SpeciesFrequencyRowModel.PROPERTY_LENGTH_STEP.equals(evt.getPropertyName())) { + Float oldValue = (Float) evt.getOldValue(); + if (oldValue != null) { + series.remove(oldValue); + } + } + + Float lengthStep = row.getLengthStep(); + if (lengthStep != null) { + series.addOrUpdate(lengthStep, row.getNumber()); + } + } + }); table.setModel(tableModel); table.setColumnModel(columnModel); @@ -389,7 +456,29 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci installTableKeyListener(columnModel, table); + // init log table + + JXTable logTable = ui.getLogsTable(); + + // create log table column model + DefaultTableColumnModelExt logColumnModel = new DefaultTableColumnModelExt(); + + { // Date + addColumnToModel(logColumnModel, SpeciesFrequencyLogsTableModel.LABEL); + } + + // create log table model + SpeciesFrequencyLogsTableModel logTableModel = new SpeciesFrequencyLogsTableModel(logColumnModel); + logTableModel.setRows(new ArrayList<SpeciesFrequencyLogRowModel>()); + + logTable.setModel(logTableModel); + logTable.setColumnModel(logColumnModel); + + // by default do not authorize to change column orders + logTable.getTableHeader().setReorderingAllowed(false); + listenValidatorValid(this.ui.getValidator(), model); + } @Override @@ -571,6 +660,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci String unit = model.getLengthStepCaracteristicUnit(); showInformationMessage(t("tutti.editSpeciesFrequencies.addMeasure", step, aroundLengthStep, unit)); } + + JXTable logsTable = getUI().getLogsTable(); + SpeciesFrequencyLogsTableModel logsTableModel = (SpeciesFrequencyLogsTableModel) logsTable.getModel(); + SpeciesFrequencyLogRowModel newRow = logsTableModel.createNewRow(); + newRow.setDate(new Date()); + newRow.setLengthStep(step); + logsTableModel.addNewRow(0, newRow); } public void editBatch(FrequencyCellEditor editor) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ThreeColumnsSplitPaneModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ThreeColumnsSplitPaneModel.java new file mode 100644 index 0000000..679af5c --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ThreeColumnsSplitPaneModel.java @@ -0,0 +1,34 @@ +package fr.ifremer.tutti.ui.swing.util; + +import org.jdesktop.swingx.MultiSplitLayout; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class ThreeColumnsSplitPaneModel extends MultiSplitLayout.Split { + public static final String LEFT = "left"; + public static final String CENTER = "center"; + public static final String RIGHT = "right"; + + /** Creates a new instance of ThreeColumnsSplitPaneLayout */ + public ThreeColumnsSplitPaneModel() { + MultiSplitLayout.Split row = new MultiSplitLayout.Split(); + MultiSplitLayout.Leaf leftLeaf = new MultiSplitLayout.Leaf(LEFT); + leftLeaf.setWeight(0.1); + MultiSplitLayout.Leaf centerLeaf = new MultiSplitLayout.Leaf(CENTER); + centerLeaf.setWeight(0.5); + MultiSplitLayout.Leaf rightLeaf = new MultiSplitLayout.Leaf(RIGHT); + rightLeaf.setWeight(0.4); + + MultiSplitLayout.Divider divider1 = new MultiSplitLayout.Divider(); + divider1.setVisible(true); + + MultiSplitLayout.Divider divider2 = new MultiSplitLayout.Divider(); + divider2.setVisible(true); + + setChildren(leftLeaf, divider1, + centerLeaf, divider2, + rightLeaf); + } +} diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 7276739..1410ca0 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -1,5 +1,6 @@ application.action.create.error= application.error.ui.business.warning= +gtrph= swing.error.cannot.open.file= tutti.about.bottomText= tutti.about.message= @@ -1155,6 +1156,9 @@ tutti.editSpeciesFrequencies.field.totalWeight= tutti.editSpeciesFrequencies.field.totalWeight.tip= tutti.editSpeciesFrequencies.ichtyometerConnected= tutti.editSpeciesFrequencies.label.no.configuration= +tutti.editSpeciesFrequencies.logTable.header.date= +tutti.editSpeciesFrequencies.logTable.header.label= +tutti.editSpeciesFrequencies.logTable.header.lengthStep= tutti.editSpeciesFrequencies.simpleCountingAndFrequencies= tutti.editSpeciesFrequencies.table.header.lengthStep= tutti.editSpeciesFrequencies.table.header.number= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 29d2a77..55e2323 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -1,5 +1,6 @@ application.action.create.error= application.error.ui.business.warning= +gtrph= swing.error.cannot.open.file=Aucun programme n'est défini pour ouvrir ce type de fichier. Enregistrez le fichier et ouvrez le en dehors de l'application tutti.about.bottomText=Copyright %s - %s - version %s tutti.about.message=<h3>Tutti</h3><p><strong>Outil de saisie de données d'opérations et de captures au cours des campagnes halieutiques.</strong></p><br/><p>Ce logiciel permettra la saisie en mer des données d'opération de pêche (positions, environnement, engin, etc) et des captures associées (composition de la capture en espèces scientifiques avec poids, nombres, tailles etc) pour l'ensemble des campagnes halieutiques réalisées par l'Ifremer.</p><p>Ce projet a été initiée en 2012 par l' [...] @@ -1131,6 +1132,7 @@ tutti.editSpeciesFrequencies.field.totalNumber.tip=Nombre total d'individus des tutti.editSpeciesFrequencies.field.totalWeight=Poids total tutti.editSpeciesFrequencies.field.totalWeight.tip=Poids total des lignes valides tutti.editSpeciesFrequencies.label.no.configuration=< Pas de configuration > +tutti.editSpeciesFrequencies.logTable.header.label=Logs tutti.editSpeciesFrequencies.simpleCountingAndFrequencies=Des mensurations ont été saisies dans le tableau. Saisir un simple dénombrement les effacera. tutti.editSpeciesFrequencies.table.header.lengthStep=Classe de taille tutti.editSpeciesFrequencies.table.header.number=Nombre diff --git a/tutti-ui-swing/src/main/resources/test.shp b/tutti-ui-swing/src/main/resources/test.shp new file mode 100644 index 0000000..63e155c Binary files /dev/null and b/tutti-ui-swing/src/main/resources/test.shp differ -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 32d974dd1745ba8774ca2f8dcad1566d603096a4 Author: Kevin Morin <morin@codelutin.com> Date: Wed Oct 22 19:21:15 2014 +0200 refs #5128 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO --- .../SpeciesFrequencyLogCellComponent.java | 172 +++++++++++++++++++++ .../frequency/SpeciesFrequencyLogRowModel.java | 7 +- .../frequency/SpeciesFrequencyLogsTableModel.java | 3 +- .../species/frequency/SpeciesFrequencyUI.css | 10 ++ .../species/frequency/SpeciesFrequencyUI.jaxx | 23 +-- .../frequency/SpeciesFrequencyUIHandler.java | 122 ++++++++++----- .../ui/swing/util/ThreeColumnsSplitPaneModel.java | 34 ---- .../resources/i18n/tutti-ui-swing_en_GB.properties | 2 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 3 +- 9 files changed, 292 insertions(+), 84 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java new file mode 100644 index 0000000..8128f2b --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java @@ -0,0 +1,172 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +/* + * #%L + * Tutti :: UI + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * 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.JAXXWidgetUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import sun.swing.DefaultLookup; + +import javax.swing.*; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.Serializable; + +import static org.nuiton.i18n.I18n.t; + +/** + * Component to render and edit frequency stuff from batch table. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.2 + */ +public class SpeciesFrequencyLogCellComponent extends JPanel implements Serializable { + + private static final long serialVersionUID = 1L; + + /** Logger. */ + private static final Log log = LogFactory.getLog(SpeciesFrequencyLogCellComponent.class); + + private JLabel label = new JLabel(); + + private JButton deleteButton = new JButton(); + + private SpeciesFrequencyLogRowModel row; + + public SpeciesFrequencyLogCellComponent() { + setLayout(new BorderLayout()); + + Font defaultFont = UIManager.getFont("Table.font"); + label.setFont(defaultFont); + label.setOpaque(false); + add(label, BorderLayout.CENTER); + + deleteButton.setIcon(JAXXWidgetUtil.createActionIcon("delete")); + deleteButton.setBorderPainted(false); + deleteButton.setBorder(null); + deleteButton.setBackground(null); + label.setOpaque(false); + add(deleteButton, BorderLayout.EAST); + } + + public SpeciesFrequencyLogCellComponent(final SpeciesFrequencyUIHandler speciesFrequencyUIHandler) { + this(); + deleteButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (row != null) { + int i = JOptionPane.showConfirmDialog( + speciesFrequencyUIHandler.getTopestUI(), + t("tutti.editSpeciesFrequencies.logTable.removeRow.confirm.message", row.getLabel()), + t("tutti.editSpeciesFrequencies.logTable.removeRow.confirm.title"), + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + + if (i == JOptionPane.YES_OPTION) { + speciesFrequencyUIHandler.decrementLengthStep(row); + } + } + } + }); + } + + public void setData(String data) { + label.setText(data); + } + + public void setRow(SpeciesFrequencyLogRowModel row) { + this.row = row; + } + + public static TableCellRenderer newRender() { + return new FrequencyLogCellRenderer(); + } + + public static TableCellEditor newEditor(SpeciesFrequencyUIHandler speciesFrequencyUIHandler) { + return new FrequencyLogCellEditor(speciesFrequencyUIHandler); + } + + public static class FrequencyLogCellEditor extends AbstractCellEditor implements TableCellEditor { + + private static final long serialVersionUID = 1L; + + protected final SpeciesFrequencyLogCellComponent component; + + public FrequencyLogCellEditor(SpeciesFrequencyUIHandler speciesFrequencyUIHandler) { + component = new SpeciesFrequencyLogCellComponent(speciesFrequencyUIHandler); + } + + @Override + public Component getTableCellEditorComponent(JTable table, + Object value, + boolean isSelected, + int row, + int column) { + + SpeciesFrequencyLogsTableModel tableModel = (SpeciesFrequencyLogsTableModel) table.getModel(); + SpeciesFrequencyLogRowModel editRow = tableModel.getEntry(row); + component.setRow(editRow); + + String data = (String) value; + component.setData(data); + + return component; + } + + @Override + public Object getCellEditorValue() { + return null; + } + + } + + public static class FrequencyLogCellRenderer implements TableCellRenderer { + + protected final SpeciesFrequencyLogCellComponent component; + + public FrequencyLogCellRenderer() { + component = new SpeciesFrequencyLogCellComponent(); + } + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, + boolean isSelected, + boolean hasFocus, + int row, + int column) { + String data = (String) value; + component.setData(data); + + component.setBackground(Color.WHITE); + + return component; + } + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java index d6ea6a2..f620239 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java @@ -2,6 +2,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import org.apache.commons.lang3.time.DateFormatUtils; import org.jdesktop.beans.AbstractBean; +import org.jdesktop.beans.AbstractSerializableBean; import java.io.Serializable; import java.util.Date; @@ -10,7 +11,7 @@ import java.util.Date; * @author Kevin Morin (Code Lutin) * @since 3.8 */ -public class SpeciesFrequencyLogRowModel extends AbstractBean implements Serializable { +public class SpeciesFrequencyLogRowModel extends AbstractSerializableBean { public static final String PROPERTY_LABEL = "label"; @@ -37,4 +38,8 @@ public class SpeciesFrequencyLogRowModel extends AbstractBean implements Seriali String formattedTime = DateFormatUtils.format(date, "HH:mm:ss"); return formattedTime + " : " + lengthStep.toString(); } + + public void setLabel(String label) { + //do nothing, used by the editor + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogsTableModel.java index 83750f1..7736918 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogsTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogsTableModel.java @@ -53,7 +53,7 @@ public class SpeciesFrequencyLogsTableModel extends AbstractApplicationTableMode public SpeciesFrequencyLogsTableModel(TableColumnModelExt columnModel) { super(columnModel, true, false); - setNoneEditableCols(LABEL); + setNoneEditableCols(); } @Override @@ -61,4 +61,5 @@ public class SpeciesFrequencyLogsTableModel extends AbstractApplicationTableMode SpeciesFrequencyLogRowModel result = new SpeciesFrequencyLogRowModel(); return result; } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css index 5300876..395a20e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css @@ -192,6 +192,16 @@ ComputableDataEditor { layout: {dataFieldLayout}; } +#firstSplitPane { + oneTouchExpandable: true; + resizeWeight: 0.6; +} + +#secondSplitPane { + oneTouchExpandable: true; + resizeWeight: 0.1; +} + #logsTable { selectionMode: {ListSelectionModel.SINGLE_SELECTION}; selectionBackground: {null}; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx index 7fa2c0a..b0ffb8a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx @@ -28,7 +28,6 @@ fr.ifremer.tutti.ui.swing.TuttiHelpBroker fr.ifremer.tutti.ui.swing.content.operation.catches.FrequencyConfigurationMode - fr.ifremer.tutti.ui.swing.util.ThreeColumnsSplitPaneModel fr.ifremer.tutti.ui.swing.util.TuttiUI fr.ifremer.tutti.ui.swing.util.TuttiUIUtil fr.ifremer.tutti.ui.swing.util.computable.ComputableDataEditor @@ -195,18 +194,20 @@ public SpeciesFrequencyUI(TuttiUI parentUI) { </JPanel> <JPanel id='dataFieldPanel' constraints='BorderLayout.CENTER'> - <JXMultiSplitPane constraints='"lengthCaracteristicPmfm"' model="{new ThreeColumnsSplitPaneModel()}"> - <JScrollPane id='logsScrollPane' constraints="ThreeColumnsSplitPaneModel.LEFT"> - <JXTable id='logsTable'/> - </JScrollPane> - <JScrollPane id='tableScrollPane' constraints="ThreeColumnsSplitPaneModel.CENTER"> - <JXTable id='table'/> - </JScrollPane> - <JPanel constraints="ThreeColumnsSplitPaneModel.RIGHT" - id="histogramPanel" + <JSplitPane constraints='"lengthCaracteristicPmfm"' + id="firstSplitPane"> + <JSplitPane id="secondSplitPane"> + <JScrollPane id='logsScrollPane' > + <JXTable id='logsTable'/> + </JScrollPane> + <JScrollPane id='tableScrollPane' > + <JXTable id='table'/> + </JScrollPane> + </JSplitPane> + <JPanel id="histogramPanel" layout="{new BorderLayout()}"> </JPanel> - </JXMultiSplitPane> + </JSplitPane> <Table constraints='"noLengthCaracteristicPmfm"' fill='horizontal'> <row> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index ab34892..96aceed 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -51,19 +51,13 @@ import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.JXMultiSplitPane; import org.jdesktop.swingx.JXTable; -import org.jdesktop.swingx.JXTitledPanel; -import org.jdesktop.swingx.MultiSplitLayout; +import org.jdesktop.swingx.decorator.HighlightPredicate; +import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; -import org.jfree.data.statistics.HistogramDataset; -import org.jfree.data.statistics.HistogramType; -import org.jfree.data.xy.DefaultIntervalXYDataset; -import org.jfree.data.xy.IntervalXYDataset; -import org.jfree.data.xy.XYIntervalSeries; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.nuiton.jaxx.application.ApplicationBusinessException; @@ -71,9 +65,6 @@ import org.nuiton.jaxx.application.swing.util.Cancelable; import javax.swing.*; import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; @@ -365,6 +356,20 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (componentToFocus != null) { componentToFocus.grabFocus(); } + + boolean rafaleMode = newValue == FrequencyConfigurationMode.RAFALE; + SpeciesFrequencyUI ui = getUI(); + JSplitPane firstSplitPane = ui.getFirstSplitPane(); + JSplitPane secondSplitPane = ui.getSecondSplitPane(); + + int lastDividerLocation = secondSplitPane.getLastDividerLocation(); + if (lastDividerLocation == 0) { + lastDividerLocation = 200; + } + secondSplitPane.setDividerLocation(rafaleMode ? lastDividerLocation : 0); + secondSplitPane.setDividerSize(rafaleMode ? firstSplitPane.getDividerSize() : 0); + + ui.getLogsScrollPane().setVisible(rafaleMode); } } ); @@ -372,26 +377,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci }); // init histogram - final XYSeries series = new XYSeries("", true, false); - dataset = new XYSeriesCollection(series); - dataset.setIntervalPositionFactor(0); - dataset.setIntervalWidth(step); - - JFreeChart chart = ChartFactory.createXYBarChart(null, - t("tutti.editSpeciesFrequencies.table.header.lengthStep"), - false, - t("tutti.editSpeciesFrequencies.table.header.number"), - dataset); - chart.clearSubtitles(); - chart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); - - final ChartPanel chartPanel = new ChartPanel(chart); - chartPanel.setDomainZoomable(false); - chartPanel.setMouseZoomable(false); - chartPanel.setPopupMenu(null); - - JPanel histogramPanel = ui.getHistogramPanel(); - histogramPanel.add(chartPanel, BorderLayout.CENTER); + final XYSeries series = initHistogram(ui, step); // init data table @@ -456,15 +442,47 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci installTableKeyListener(columnModel, table); - // init log table + initLogTable(ui); + listenValidatorValid(this.ui.getValidator(), model); + + } + + private XYSeries initHistogram(SpeciesFrequencyUI ui, float step) { + final XYSeries series = new XYSeries("", true, false); + dataset = new XYSeriesCollection(series); + dataset.setIntervalPositionFactor(0); + dataset.setIntervalWidth(step); + + JFreeChart chart = ChartFactory.createXYBarChart(null, + t("tutti.editSpeciesFrequencies.table.header.lengthStep"), + false, + t("tutti.editSpeciesFrequencies.table.header.number"), + dataset); + chart.clearSubtitles(); + chart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); + + final ChartPanel chartPanel = new ChartPanel(chart); + chartPanel.setDomainZoomable(false); + chartPanel.setMouseZoomable(false); + chartPanel.setPopupMenu(null); + + JPanel histogramPanel = ui.getHistogramPanel(); + histogramPanel.add(chartPanel, BorderLayout.CENTER); + return series; + } + + private void initLogTable(SpeciesFrequencyUI ui) { JXTable logTable = ui.getLogsTable(); // create log table column model DefaultTableColumnModelExt logColumnModel = new DefaultTableColumnModelExt(); { // Date - addColumnToModel(logColumnModel, SpeciesFrequencyLogsTableModel.LABEL); + addColumnToModel(logColumnModel, + SpeciesFrequencyLogCellComponent.newEditor(this), + SpeciesFrequencyLogCellComponent.newRender(), + SpeciesFrequencyLogsTableModel.LABEL); } // create log table model @@ -476,9 +494,11 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // by default do not authorize to change column orders logTable.getTableHeader().setReorderingAllowed(false); - - listenValidatorValid(this.ui.getValidator(), model); - + Highlighter evenHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( + HighlightPredicate.ODD, +// Color.RED); + getConfig().getColorAlternateRow()); + logTable.addHighlighter(evenHighlighter); } @Override @@ -828,12 +848,20 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // keep batch (will be used to push back editing entry) model.setBatch(speciesBatch); + + //remove log rows + SpeciesFrequencyLogsTableModel logsTableModel = (SpeciesFrequencyLogsTableModel) getUI().getLogsTable().getModel(); + logsTableModel.setRows(new ArrayList<SpeciesFrequencyLogRowModel>()); } public void reset() { // remove all frequencies getModel().setRows(Lists.<SpeciesFrequencyRowModel>newArrayList()); + + //remove log rows + SpeciesFrequencyLogsTableModel logsTableModel = (SpeciesFrequencyLogsTableModel) getUI().getLogsTable().getModel(); + logsTableModel.setRows(new ArrayList<SpeciesFrequencyLogRowModel>()); } public void saveAndClose() { @@ -1019,4 +1047,26 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } return precision; } + + /** + * Decrement the frequency of the lengthstep of the row + * @param logRow + */ + public void decrementLengthStep(SpeciesFrequencyLogRowModel logRow) { + if (logRow != null) { + SpeciesFrequencyTableModel tableModel = getTableModel(); + SpeciesFrequencyRowModel speciesFrequencyRowModel = tableModel.getRowCache().get(logRow.getLengthStep()); + if (speciesFrequencyRowModel != null) { + Integer number = speciesFrequencyRowModel.getNumber(); + if (number != null && number > 0) { + speciesFrequencyRowModel.setNumber(number - 1); + tableModel.fireTableDataChanged(); + } + } + + SpeciesFrequencyLogsTableModel logsTableModel = (SpeciesFrequencyLogsTableModel) getUI().getLogsTable().getModel(); + int index = logsTableModel.getRowIndex(logRow); + logsTableModel.removeRow(index); + } + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ThreeColumnsSplitPaneModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ThreeColumnsSplitPaneModel.java deleted file mode 100644 index 679af5c..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ThreeColumnsSplitPaneModel.java +++ /dev/null @@ -1,34 +0,0 @@ -package fr.ifremer.tutti.ui.swing.util; - -import org.jdesktop.swingx.MultiSplitLayout; - -/** - * @author Kevin Morin (Code Lutin) - * @since x.x - */ -public class ThreeColumnsSplitPaneModel extends MultiSplitLayout.Split { - public static final String LEFT = "left"; - public static final String CENTER = "center"; - public static final String RIGHT = "right"; - - /** Creates a new instance of ThreeColumnsSplitPaneLayout */ - public ThreeColumnsSplitPaneModel() { - MultiSplitLayout.Split row = new MultiSplitLayout.Split(); - MultiSplitLayout.Leaf leftLeaf = new MultiSplitLayout.Leaf(LEFT); - leftLeaf.setWeight(0.1); - MultiSplitLayout.Leaf centerLeaf = new MultiSplitLayout.Leaf(CENTER); - centerLeaf.setWeight(0.5); - MultiSplitLayout.Leaf rightLeaf = new MultiSplitLayout.Leaf(RIGHT); - rightLeaf.setWeight(0.4); - - MultiSplitLayout.Divider divider1 = new MultiSplitLayout.Divider(); - divider1.setVisible(true); - - MultiSplitLayout.Divider divider2 = new MultiSplitLayout.Divider(); - divider2.setVisible(true); - - setChildren(leftLeaf, divider1, - centerLeaf, divider2, - rightLeaf); - } -} diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 1410ca0..04c3fcc 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -1159,6 +1159,8 @@ tutti.editSpeciesFrequencies.label.no.configuration= tutti.editSpeciesFrequencies.logTable.header.date= tutti.editSpeciesFrequencies.logTable.header.label= tutti.editSpeciesFrequencies.logTable.header.lengthStep= +tutti.editSpeciesFrequencies.logTable.removeRow.confirm.message= +tutti.editSpeciesFrequencies.logTable.removeRow.confirm.title= tutti.editSpeciesFrequencies.simpleCountingAndFrequencies= tutti.editSpeciesFrequencies.table.header.lengthStep= tutti.editSpeciesFrequencies.table.header.number= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 55e2323..8b61979 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -1,6 +1,5 @@ application.action.create.error= application.error.ui.business.warning= -gtrph= swing.error.cannot.open.file=Aucun programme n'est défini pour ouvrir ce type de fichier. Enregistrez le fichier et ouvrez le en dehors de l'application tutti.about.bottomText=Copyright %s - %s - version %s tutti.about.message=<h3>Tutti</h3><p><strong>Outil de saisie de données d'opérations et de captures au cours des campagnes halieutiques.</strong></p><br/><p>Ce logiciel permettra la saisie en mer des données d'opération de pêche (positions, environnement, engin, etc) et des captures associées (composition de la capture en espèces scientifiques avec poids, nombres, tailles etc) pour l'ensemble des campagnes halieutiques réalisées par l'Ifremer.</p><p>Ce projet a été initiée en 2012 par l' [...] @@ -1133,6 +1132,8 @@ tutti.editSpeciesFrequencies.field.totalWeight=Poids total tutti.editSpeciesFrequencies.field.totalWeight.tip=Poids total des lignes valides tutti.editSpeciesFrequencies.label.no.configuration=< Pas de configuration > tutti.editSpeciesFrequencies.logTable.header.label=Logs +tutti.editSpeciesFrequencies.logTable.removeRow.confirm.message=Êtes-vous sûr de vouloir supprimer la mesure %s ? +tutti.editSpeciesFrequencies.logTable.removeRow.confirm.title=Suppression d'une mesure tutti.editSpeciesFrequencies.simpleCountingAndFrequencies=Des mensurations ont été saisies dans le tableau. Saisir un simple dénombrement les effacera. tutti.editSpeciesFrequencies.table.header.lengthStep=Classe de taille tutti.editSpeciesFrequencies.table.header.number=Nombre -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 3667ed5c67918700cffb1509f8d6e62c363405aa Author: Kevin Morin <morin@codelutin.com> Date: Thu Oct 23 10:49:24 2014 +0200 refs #6000 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO --- .../frequency/SpeciesFrequencyUIHandler.java | 188 +++++++++++---------- 1 file changed, 103 insertions(+), 85 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index 96aceed..6d8be0f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -356,26 +356,26 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (componentToFocus != null) { componentToFocus.grabFocus(); } - - boolean rafaleMode = newValue == FrequencyConfigurationMode.RAFALE; - SpeciesFrequencyUI ui = getUI(); - JSplitPane firstSplitPane = ui.getFirstSplitPane(); - JSplitPane secondSplitPane = ui.getSecondSplitPane(); - - int lastDividerLocation = secondSplitPane.getLastDividerLocation(); - if (lastDividerLocation == 0) { - lastDividerLocation = 200; - } - secondSplitPane.setDividerLocation(rafaleMode ? lastDividerLocation : 0); - secondSplitPane.setDividerSize(rafaleMode ? firstSplitPane.getDividerSize() : 0); - - ui.getLogsScrollPane().setVisible(rafaleMode); + updateLogVisibility(); } } ); } }); + getContext().addPropertyChangeListener(TuttiUIContext.PROPERTY_ICHTYOMETER_CONNECTED, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + SwingUtilities.invokeLater( + new Runnable() { + @Override + public void run() { + updateLogVisibility(); + } + }); + } + }); + // init histogram final XYSeries series = initHistogram(ui, step); @@ -448,59 +448,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - private XYSeries initHistogram(SpeciesFrequencyUI ui, float step) { - final XYSeries series = new XYSeries("", true, false); - dataset = new XYSeriesCollection(series); - dataset.setIntervalPositionFactor(0); - dataset.setIntervalWidth(step); - - JFreeChart chart = ChartFactory.createXYBarChart(null, - t("tutti.editSpeciesFrequencies.table.header.lengthStep"), - false, - t("tutti.editSpeciesFrequencies.table.header.number"), - dataset); - chart.clearSubtitles(); - chart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); - - final ChartPanel chartPanel = new ChartPanel(chart); - chartPanel.setDomainZoomable(false); - chartPanel.setMouseZoomable(false); - chartPanel.setPopupMenu(null); - - JPanel histogramPanel = ui.getHistogramPanel(); - histogramPanel.add(chartPanel, BorderLayout.CENTER); - return series; - } - - private void initLogTable(SpeciesFrequencyUI ui) { - JXTable logTable = ui.getLogsTable(); - - // create log table column model - DefaultTableColumnModelExt logColumnModel = new DefaultTableColumnModelExt(); - - { // Date - addColumnToModel(logColumnModel, - SpeciesFrequencyLogCellComponent.newEditor(this), - SpeciesFrequencyLogCellComponent.newRender(), - SpeciesFrequencyLogsTableModel.LABEL); - } - - // create log table model - SpeciesFrequencyLogsTableModel logTableModel = new SpeciesFrequencyLogsTableModel(logColumnModel); - logTableModel.setRows(new ArrayList<SpeciesFrequencyLogRowModel>()); - - logTable.setModel(logTableModel); - logTable.setColumnModel(logColumnModel); - - // by default do not authorize to change column orders - logTable.getTableHeader().setReorderingAllowed(false); - Highlighter evenHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - HighlightPredicate.ODD, -// Color.RED); - getConfig().getColorAlternateRow()); - logTable.addHighlighter(evenHighlighter); - } - @Override protected JComponent getComponentToFocus() { FrequencyConfigurationMode configurationMode = getModel().getConfigurationMode(); @@ -892,6 +839,28 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } } + /** + * Decrement the frequency of the lengthstep of the row + * @param logRow + */ + public void decrementLengthStep(SpeciesFrequencyLogRowModel logRow) { + if (logRow != null) { + SpeciesFrequencyTableModel tableModel = getTableModel(); + SpeciesFrequencyRowModel speciesFrequencyRowModel = tableModel.getRowCache().get(logRow.getLengthStep()); + if (speciesFrequencyRowModel != null) { + Integer number = speciesFrequencyRowModel.getNumber(); + if (number != null && number > 0) { + speciesFrequencyRowModel.setNumber(number - 1); + tableModel.fireTableDataChanged(); + } + } + + SpeciesFrequencyLogsTableModel logsTableModel = (SpeciesFrequencyLogsTableModel) getUI().getLogsTable().getModel(); + int index = logsTableModel.getRowIndex(logRow); + logsTableModel.removeRow(index); + } + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -1048,25 +1017,74 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci return precision; } - /** - * Decrement the frequency of the lengthstep of the row - * @param logRow - */ - public void decrementLengthStep(SpeciesFrequencyLogRowModel logRow) { - if (logRow != null) { - SpeciesFrequencyTableModel tableModel = getTableModel(); - SpeciesFrequencyRowModel speciesFrequencyRowModel = tableModel.getRowCache().get(logRow.getLengthStep()); - if (speciesFrequencyRowModel != null) { - Integer number = speciesFrequencyRowModel.getNumber(); - if (number != null && number > 0) { - speciesFrequencyRowModel.setNumber(number - 1); - tableModel.fireTableDataChanged(); - } - } + protected void updateLogVisibility() { - SpeciesFrequencyLogsTableModel logsTableModel = (SpeciesFrequencyLogsTableModel) getUI().getLogsTable().getModel(); - int index = logsTableModel.getRowIndex(logRow); - logsTableModel.removeRow(index); + boolean logVisible = getModel().isRafaleMode() || getContext().isIchtyometerConnected(); + SpeciesFrequencyUI ui = getUI(); + JSplitPane firstSplitPane = ui.getFirstSplitPane(); + JSplitPane secondSplitPane = ui.getSecondSplitPane(); + + int lastDividerLocation = secondSplitPane.getLastDividerLocation(); + if (lastDividerLocation == 0) { + lastDividerLocation = 200; + } + secondSplitPane.setDividerLocation(logVisible ? lastDividerLocation : 0); + secondSplitPane.setDividerSize(logVisible ? firstSplitPane.getDividerSize() : 0); + + ui.getLogsScrollPane().setVisible(logVisible); + } + + protected XYSeries initHistogram(SpeciesFrequencyUI ui, float step) { + final XYSeries series = new XYSeries("", true, false); + dataset = new XYSeriesCollection(series); + dataset.setIntervalPositionFactor(0); + dataset.setIntervalWidth(step); + + JFreeChart chart = ChartFactory.createXYBarChart(null, + t("tutti.editSpeciesFrequencies.table.header.lengthStep"), + false, + t("tutti.editSpeciesFrequencies.table.header.number"), + dataset); + chart.clearSubtitles(); + chart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); + + final ChartPanel chartPanel = new ChartPanel(chart); + chartPanel.setDomainZoomable(false); + chartPanel.setMouseZoomable(false); + chartPanel.setPopupMenu(null); + + JPanel histogramPanel = ui.getHistogramPanel(); + histogramPanel.add(chartPanel, BorderLayout.CENTER); + return series; + } + + protected void initLogTable(SpeciesFrequencyUI ui) { + JXTable logTable = ui.getLogsTable(); + + // create log table column model + DefaultTableColumnModelExt logColumnModel = new DefaultTableColumnModelExt(); + + { // Date + addColumnToModel(logColumnModel, + SpeciesFrequencyLogCellComponent.newEditor(this), + SpeciesFrequencyLogCellComponent.newRender(), + SpeciesFrequencyLogsTableModel.LABEL); } + + // create log table model + SpeciesFrequencyLogsTableModel logTableModel = new SpeciesFrequencyLogsTableModel(logColumnModel); + logTableModel.setRows(new ArrayList<SpeciesFrequencyLogRowModel>()); + + logTable.setModel(logTableModel); + logTable.setColumnModel(logColumnModel); + + // by default do not authorize to change column orders + logTable.getTableHeader().setReorderingAllowed(false); + Highlighter evenHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( + HighlightPredicate.ODD, +// Color.RED); + getConfig().getColorAlternateRow()); + logTable.addHighlighter(evenHighlighter); } + } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit c517126c14f978134e1d7cf79d2d19e17a646fa6 Author: Kevin Morin <morin@codelutin.com> Date: Thu Oct 23 18:04:40 2014 +0200 fixes #6000 [BIGFIN] Idée d'amélioration : graphique dans l'écran mensuration et liste enregistrement : s'imprégner de l'application android WLO --- .../BenthosFrequencyLogCellComponent.java} | 44 +++--- .../frequency/BenthosFrequencyLogRowModel.java | 43 ++++++ .../frequency/BenthosFrequencyLogsTableModel.java | 58 ++++++++ .../frequency/BenthosFrequencyTableModel.java | 9 +- .../benthos/frequency/BenthosFrequencyUI.css | 17 +++ .../benthos/frequency/BenthosFrequencyUI.jaxx | 18 ++- .../frequency/BenthosFrequencyUIHandler.java | 162 ++++++++++++++++++++- .../SpeciesFrequencyLogCellComponent.java | 6 +- .../frequency/SpeciesFrequencyTableModel.java | 3 +- .../frequency/SpeciesFrequencyUIHandler.java | 4 + .../resources/i18n/tutti-ui-swing_en_GB.properties | 3 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 1 + .../src/main/resources/icons/action-delete.png | Bin 715 -> 363 bytes 13 files changed, 331 insertions(+), 37 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogCellComponent.java similarity index 75% copy from tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java copy to tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogCellComponent.java index 8128f2b..8dc9ad5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogCellComponent.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; +package fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.frequency; /* * #%L @@ -25,10 +25,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import jaxx.runtime.swing.JAXXWidgetUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import sun.swing.DefaultLookup; import javax.swing.*; -import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import java.awt.*; @@ -39,25 +37,25 @@ import java.io.Serializable; import static org.nuiton.i18n.I18n.t; /** - * Component to render and edit frequency stuff from batch table. + * Component to render and delete log items from logs table. * - * @author tchemit <chemit@codelutin.com> - * @since 0.2 + * @author Kevin Morin (Code Lutin) + * @since 3.8 */ -public class SpeciesFrequencyLogCellComponent extends JPanel implements Serializable { +public class BenthosFrequencyLogCellComponent extends JPanel implements Serializable { private static final long serialVersionUID = 1L; /** Logger. */ - private static final Log log = LogFactory.getLog(SpeciesFrequencyLogCellComponent.class); + private static final Log log = LogFactory.getLog(BenthosFrequencyLogCellComponent.class); private JLabel label = new JLabel(); private JButton deleteButton = new JButton(); - private SpeciesFrequencyLogRowModel row; + private BenthosFrequencyLogRowModel row; - public SpeciesFrequencyLogCellComponent() { + public BenthosFrequencyLogCellComponent() { setLayout(new BorderLayout()); Font defaultFont = UIManager.getFont("Table.font"); @@ -73,21 +71,21 @@ public class SpeciesFrequencyLogCellComponent extends JPanel implements Serializ add(deleteButton, BorderLayout.EAST); } - public SpeciesFrequencyLogCellComponent(final SpeciesFrequencyUIHandler speciesFrequencyUIHandler) { + public BenthosFrequencyLogCellComponent(final BenthosFrequencyUIHandler benthosFrequencyUIHandler) { this(); deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (row != null) { int i = JOptionPane.showConfirmDialog( - speciesFrequencyUIHandler.getTopestUI(), + benthosFrequencyUIHandler.getTopestUI(), t("tutti.editSpeciesFrequencies.logTable.removeRow.confirm.message", row.getLabel()), t("tutti.editSpeciesFrequencies.logTable.removeRow.confirm.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (i == JOptionPane.YES_OPTION) { - speciesFrequencyUIHandler.decrementLengthStep(row); + benthosFrequencyUIHandler.decrementLengthStep(row); } } } @@ -98,7 +96,7 @@ public class SpeciesFrequencyLogCellComponent extends JPanel implements Serializ label.setText(data); } - public void setRow(SpeciesFrequencyLogRowModel row) { + public void setRow(BenthosFrequencyLogRowModel row) { this.row = row; } @@ -106,18 +104,18 @@ public class SpeciesFrequencyLogCellComponent extends JPanel implements Serializ return new FrequencyLogCellRenderer(); } - public static TableCellEditor newEditor(SpeciesFrequencyUIHandler speciesFrequencyUIHandler) { - return new FrequencyLogCellEditor(speciesFrequencyUIHandler); + public static TableCellEditor newEditor(BenthosFrequencyUIHandler benthosFrequencyUIHandler) { + return new FrequencyLogCellEditor(benthosFrequencyUIHandler); } public static class FrequencyLogCellEditor extends AbstractCellEditor implements TableCellEditor { private static final long serialVersionUID = 1L; - protected final SpeciesFrequencyLogCellComponent component; + protected final BenthosFrequencyLogCellComponent component; - public FrequencyLogCellEditor(SpeciesFrequencyUIHandler speciesFrequencyUIHandler) { - component = new SpeciesFrequencyLogCellComponent(speciesFrequencyUIHandler); + public FrequencyLogCellEditor(BenthosFrequencyUIHandler benthosFrequencyUIHandler) { + component = new BenthosFrequencyLogCellComponent(benthosFrequencyUIHandler); } @Override @@ -127,8 +125,8 @@ public class SpeciesFrequencyLogCellComponent extends JPanel implements Serializ int row, int column) { - SpeciesFrequencyLogsTableModel tableModel = (SpeciesFrequencyLogsTableModel) table.getModel(); - SpeciesFrequencyLogRowModel editRow = tableModel.getEntry(row); + BenthosFrequencyLogsTableModel tableModel = (BenthosFrequencyLogsTableModel) table.getModel(); + BenthosFrequencyLogRowModel editRow = tableModel.getEntry(row); component.setRow(editRow); String data = (String) value; @@ -146,10 +144,10 @@ public class SpeciesFrequencyLogCellComponent extends JPanel implements Serializ public static class FrequencyLogCellRenderer implements TableCellRenderer { - protected final SpeciesFrequencyLogCellComponent component; + protected final BenthosFrequencyLogCellComponent component; public FrequencyLogCellRenderer() { - component = new SpeciesFrequencyLogCellComponent(); + component = new BenthosFrequencyLogCellComponent(); } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogRowModel.java new file mode 100644 index 0000000..b2ba620 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogRowModel.java @@ -0,0 +1,43 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.frequency; + +import org.apache.commons.lang3.time.DateFormatUtils; +import org.jdesktop.beans.AbstractSerializableBean; + +import java.util.Date; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class BenthosFrequencyLogRowModel extends AbstractSerializableBean { + + public static final String PROPERTY_LABEL = "label"; + + protected Float lengthStep; + protected Date date; + + public Float getLengthStep() { + return lengthStep; + } + + public void setLengthStep(Float lengthStep) { + this.lengthStep = lengthStep; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getLabel() { + String formattedTime = DateFormatUtils.format(date, "HH:mm:ss"); + return formattedTime + " : " + lengthStep.toString(); + } + + public void setLabel(String label) { + //do nothing, used by the editor + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogsTableModel.java new file mode 100644 index 0000000..3f32637 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyLogsTableModel.java @@ -0,0 +1,58 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.frequency; + +/* + * #%L + * Tutti :: UI + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * 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 org.jdesktop.swingx.table.TableColumnModelExt; +import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; +import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; + +import static org.nuiton.i18n.I18n.n; + +/** + * Model of the benhtos frequency log table. + * + * @author Kevin Morin (Code Lutin) + * @since 3.8 + */ +public class BenthosFrequencyLogsTableModel extends AbstractApplicationTableModel<BenthosFrequencyLogRowModel> { + + private static final long serialVersionUID = 1L; + + public static final ColumnIdentifier<BenthosFrequencyRowModel> LABEL = ColumnIdentifier.newId( + BenthosFrequencyLogRowModel.PROPERTY_LABEL, + n("tutti.editBenthosFrequencies.logTable.header.label"), + n("tutti.editBenthosFrequencies.logTable.header.label")); + + + public BenthosFrequencyLogsTableModel(TableColumnModelExt columnModel) { + super(columnModel, true, false); + setNoneEditableCols(); + } + + @Override + public BenthosFrequencyLogRowModel createNewRow() { + BenthosFrequencyLogRowModel result = new BenthosFrequencyLogRowModel(); + return result; + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyTableModel.java index 2c69ea3..e3bac3f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyTableModel.java @@ -71,13 +71,17 @@ public class BenthosFrequencyTableModel extends AbstractApplicationTableModel<Be */ protected final WeightUnit weightUnit; + protected final PropertyChangeListener rowPropertyChangeListener; + public BenthosFrequencyTableModel(WeightUnit weightUnit, TableColumnModelExt columnModel, - BenthosFrequencyUIModel uiModel) { + BenthosFrequencyUIModel uiModel, + PropertyChangeListener rowPropertyChangeListener) { super(columnModel, true, true); this.weightUnit = weightUnit; this.uiModel = uiModel; this.rowCache = Maps.newTreeMap(); + this.rowPropertyChangeListener = rowPropertyChangeListener; setNoneEditableCols(); } @@ -112,6 +116,9 @@ public class BenthosFrequencyTableModel extends AbstractApplicationTableModel<Be } } }); + + result.addPropertyChangeListener(rowPropertyChangeListener); + result.setLengthStepCaracteristic(uiModel.getLengthStepCaracteristic()); result.setLengthStep(defaultStep); result.setValid(defaultStep != null); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUI.css index 819a82c..169c3a0 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUI.css @@ -192,6 +192,23 @@ ComputableDataEditor { layout: {dataFieldLayout}; } +#firstSplitPane { + oneTouchExpandable: true; + resizeWeight: 0.6; +} + +#secondSplitPane { + oneTouchExpandable: true; + resizeWeight: 0.1; +} + +#logsTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; +} + #tableScrollPane { _validatorLabel: {t("tutti.editBenthosFrequencies.field.rows")}; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUI.jaxx index dc0e313..dfeed1f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUI.jaxx @@ -193,9 +193,21 @@ public BenthosFrequencyUI(TuttiUI parentUI) { </JPanel> <JPanel id='dataFieldPanel' constraints='BorderLayout.CENTER'> - <JScrollPane id='tableScrollPane' constraints='"lengthCaracteristicPmfm"'> - <JXTable id='table'/> - </JScrollPane> + <JSplitPane constraints='"lengthCaracteristicPmfm"' + id="firstSplitPane"> + <JSplitPane id="secondSplitPane"> + <JScrollPane id='logsScrollPane' > + <JXTable id='logsTable'/> + </JScrollPane> + <JScrollPane id='tableScrollPane' > + <JXTable id='table'/> + </JScrollPane> + </JSplitPane> + <JPanel id="histogramPanel" + layout="{new BorderLayout()}"> + </JPanel> + </JSplitPane> + <Table constraints='"noLengthCaracteristicPmfm"' fill='horizontal'> <row> <cell columns='2'> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUIHandler.java index ebe7ec5..f7b6eea 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/frequency/BenthosFrequencyUIHandler.java @@ -26,6 +26,13 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import fr.ifremer.tutti.util.Numbers; +import org.jdesktop.swingx.decorator.HighlightPredicate; +import org.jdesktop.swingx.decorator.Highlighter; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; import org.nuiton.jaxx.application.swing.util.Cancelable; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.persistence.entities.TuttiEntities; @@ -49,15 +56,15 @@ import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; -import javax.swing.JComponent; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; +import javax.swing.*; +import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -80,6 +87,8 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth private Map<String, Caracteristic> lengthStepCaracteristics; + private XYSeriesCollection dataset; + /** * Weight unit. * @@ -122,10 +131,20 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth BenthosFrequencyUIModel model = getModel(); model.setEmptyRows(Sets.<BenthosFrequencyRowModel>newHashSet()); + if (CollectionUtils.isNotEmpty(rows)) { + XYSeries series = dataset.getSeries(0); + series.clear(); + for (BenthosFrequencyRowModel row : rows) { model.updateRowWithWeight(row); + + Float lengthStep = row.getLengthStep(); + if (lengthStep != null) { + series.add(lengthStep, row.getNumber()); + } } + for (BenthosFrequencyRowModel row : rows) { recomputeRowValidState(row); } @@ -292,12 +311,17 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth if (componentToFocus != null) { componentToFocus.grabFocus(); } + updateLogVisibility(); } } ); } }); + // init histogram + final XYSeries series = initHistogram(ui, step); + + // init data table JXTable table = getTable(); // create table column model @@ -332,7 +356,25 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth new BenthosFrequencyTableModel( weightUnit, columnModel, - model); + model, + new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + BenthosFrequencyRowModel row = (BenthosFrequencyRowModel) evt.getSource(); + + if (BenthosFrequencyRowModel.PROPERTY_LENGTH_STEP.equals(evt.getPropertyName())) { + Float oldValue = (Float) evt.getOldValue(); + if (oldValue != null) { + series.remove(oldValue); + } + } + + Float lengthStep = row.getLengthStep(); + if (lengthStep != null) { + series.addOrUpdate(lengthStep, row.getNumber()); + } + } + }); table.setModel(tableModel); @@ -342,6 +384,8 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth installTableKeyListener(columnModel, table); + initLogTable(ui); + listenValidatorValid(ui.getValidator(), model); } @@ -514,6 +558,13 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth model.setTotalNumber(totalNumber + 1); getTable().scrollRowToVisible(rowIndex); + + JXTable logsTable = getUI().getLogsTable(); + BenthosFrequencyLogsTableModel logsTableModel = (BenthosFrequencyLogsTableModel) logsTable.getModel(); + BenthosFrequencyLogRowModel newRow = logsTableModel.createNewRow(); + newRow.setDate(new Date()); + newRow.setLengthStep(step); + logsTableModel.addNewRow(0, newRow); } public void editBatch(BenthosFrequencyCellComponent.FrequencyCellEditor editor) { @@ -670,12 +721,21 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth // keep batch (will be used to push back editing entry) model.setBatch(speciesBatch); + + //remove log rows + BenthosFrequencyLogsTableModel logsTableModel = (BenthosFrequencyLogsTableModel) getUI().getLogsTable().getModel(); + logsTableModel.setRows(new ArrayList<BenthosFrequencyLogRowModel>()); + } public void reset() { // remove all frequencies getModel().setRows(Lists.<BenthosFrequencyRowModel>newArrayList()); + + //remove log rows + BenthosFrequencyLogsTableModel logsTableModel = (BenthosFrequencyLogsTableModel) getUI().getLogsTable().getModel(); + logsTableModel.setRows(new ArrayList<BenthosFrequencyLogRowModel>()); } public void saveAndClose() { @@ -706,6 +766,28 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth } } + /** + * Decrement the frequency of the lengthstep of the row + * @param logRow + */ + public void decrementLengthStep(BenthosFrequencyLogRowModel logRow) { + if (logRow != null) { + BenthosFrequencyTableModel tableModel = getTableModel(); + BenthosFrequencyRowModel speciesFrequencyRowModel = tableModel.getRowCache().get(logRow.getLengthStep()); + if (speciesFrequencyRowModel != null) { + Integer number = speciesFrequencyRowModel.getNumber(); + if (number != null && number > 0) { + speciesFrequencyRowModel.setNumber(number - 1); + tableModel.fireTableDataChanged(); + } + } + + BenthosFrequencyLogsTableModel logsTableModel = (BenthosFrequencyLogsTableModel) getUI().getLogsTable().getModel(); + int index = logsTableModel.getRowIndex(logRow); + logsTableModel.removeRow(index); + } + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -822,4 +904,74 @@ public class BenthosFrequencyUIHandler extends AbstractTuttiTableUIHandler<Benth } return precision; } + + protected void updateLogVisibility() { + + boolean logVisible = getModel().isRafaleMode(); + BenthosFrequencyUI ui = getUI(); + JSplitPane firstSplitPane = ui.getFirstSplitPane(); + JSplitPane secondSplitPane = ui.getSecondSplitPane(); + + int lastDividerLocation = secondSplitPane.getLastDividerLocation(); + if (lastDividerLocation == 0) { + lastDividerLocation = 200; + } + secondSplitPane.setDividerLocation(logVisible ? lastDividerLocation : 0); + secondSplitPane.setDividerSize(logVisible ? firstSplitPane.getDividerSize() : 0); + + ui.getLogsScrollPane().setVisible(logVisible); + } + + protected XYSeries initHistogram(BenthosFrequencyUI ui, float step) { + final XYSeries series = new XYSeries("", true, false); + dataset = new XYSeriesCollection(series); + dataset.setIntervalPositionFactor(0); + dataset.setIntervalWidth(step); + + JFreeChart chart = ChartFactory.createXYBarChart(null, + t("tutti.editSpeciesFrequencies.table.header.lengthStep"), + false, + t("tutti.editSpeciesFrequencies.table.header.number"), + dataset); + chart.clearSubtitles(); + chart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); + + final ChartPanel chartPanel = new ChartPanel(chart); + chartPanel.setDomainZoomable(false); + chartPanel.setMouseZoomable(false); + chartPanel.setPopupMenu(null); + + JPanel histogramPanel = ui.getHistogramPanel(); + histogramPanel.add(chartPanel, BorderLayout.CENTER); + return series; + } + + protected void initLogTable(BenthosFrequencyUI ui) { + JXTable logTable = ui.getLogsTable(); + + // create log table column model + DefaultTableColumnModelExt logColumnModel = new DefaultTableColumnModelExt(); + + { // Date + addColumnToModel(logColumnModel, + BenthosFrequencyLogCellComponent.newEditor(this), + BenthosFrequencyLogCellComponent.newRender(), + BenthosFrequencyLogsTableModel.LABEL); + } + + // create log table model + BenthosFrequencyLogsTableModel logTableModel = new BenthosFrequencyLogsTableModel(logColumnModel); + logTableModel.setRows(new ArrayList<BenthosFrequencyLogRowModel>()); + + logTable.setModel(logTableModel); + logTable.setColumnModel(logColumnModel); + + // by default do not authorize to change column orders + logTable.getTableHeader().setReorderingAllowed(false); + Highlighter evenHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( + HighlightPredicate.ODD, +// Color.RED); + getConfig().getColorAlternateRow()); + logTable.addHighlighter(evenHighlighter); + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java index 8128f2b..47ca61d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogCellComponent.java @@ -39,10 +39,10 @@ import java.io.Serializable; import static org.nuiton.i18n.I18n.t; /** - * Component to render and edit frequency stuff from batch table. + * Component to render and delete log items from logs table. * - * @author tchemit <chemit@codelutin.com> - * @since 0.2 + * @author Kevin Morin (Code Lutin) + * @since 3.8 */ public class SpeciesFrequencyLogCellComponent extends JPanel implements Serializable { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java index 83f74ac..0ac5ae6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java @@ -24,7 +24,6 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import com.google.common.collect.Maps; import fr.ifremer.tutti.type.WeightUnit; -import org.jfree.data.xy.XYSeries; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; import org.jdesktop.swingx.table.TableColumnModelExt; @@ -153,4 +152,4 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } } } -} +} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index 6d8be0f..2c264ee 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -166,16 +166,20 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SpeciesFrequencyUIModel model = getModel(); model.setEmptyRows(Sets.<SpeciesFrequencyRowModel>newHashSet()); + if (CollectionUtils.isNotEmpty(rows)) { XYSeries series = dataset.getSeries(0); series.clear(); + for (SpeciesFrequencyRowModel row : rows) { model.updateRowWithWeight(row); + Float lengthStep = row.getLengthStep(); if (lengthStep != null) { series.add(lengthStep, row.getNumber()); } } + for (SpeciesFrequencyRowModel row : rows) { recomputeRowValidState(row); } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 04c3fcc..2133567 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -527,7 +527,10 @@ tutti.editBenthosFrequencies.field.totalNumber.tip= tutti.editBenthosFrequencies.field.totalWeight= tutti.editBenthosFrequencies.field.totalWeight.tip= tutti.editBenthosFrequencies.label.no.configuration= +tutti.editBenthosFrequencies.logTable.header.label= tutti.editBenthosFrequencies.simpleCountingAndFrequencies= +tutti.editBenthosFrequencies.table.header.lengthStep= +tutti.editBenthosFrequencies.table.header.number= tutti.editBenthosFrequencies.title= tutti.editBenthosFrequencies.title.addLengthStepCaracteristic= tutti.editCaracteristics.title= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 8b61979..8a0a2be 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -517,6 +517,7 @@ tutti.editBenthosFrequencies.field.totalNumber.tip=Nombre total d'individus des tutti.editBenthosFrequencies.field.totalWeight=Poids total tutti.editBenthosFrequencies.field.totalWeight.tip=Poids total des lignes valides tutti.editBenthosFrequencies.label.no.configuration=< Pas de configuration > +tutti.editBenthosFrequencies.logTable.header.label=Logs tutti.editBenthosFrequencies.simpleCountingAndFrequencies=Des mensurations ont été saisies dans le tableau. Saisir un simple dénombrement les effacera. tutti.editBenthosFrequencies.title=Mensuration tutti.editBenthosFrequencies.title.addLengthStepCaracteristic=Choisir une autre caractéristique diff --git a/tutti-ui-swing/src/main/resources/icons/action-delete.png b/tutti-ui-swing/src/main/resources/icons/action-delete.png index 08f2493..afe22ba 100644 Binary files a/tutti-ui-swing/src/main/resources/icons/action-delete.png and b/tutti-ui-swing/src/main/resources/icons/action-delete.png differ -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm