diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9cbabcaa7435745f1be7ceba6c4696768a2bcdae..d8db44858604f849ff3ebec26936e5023068f896 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+## Sprint 87 - v3.9.4
+
+- Pas de mise à jour de modèle
+
+
+## Sprint 86 - v3.9.3
+
+- Pas de mise à jour de modèle
+
+
## Sprint 85 - v3.8.3
- Pas de mise à jour de modèle
@@ -12,6 +22,37 @@
- Version corrective devant utiliser le server de synchronisation 3.6.3.1 uniquement
+## Sprint 83 - v3.9.2
+
+- Pas de mise à jour de modèle
+
+- Une nouvelle option a été ajoutée pour gérer les transcodages des référentiels suivant :
+
+ reefdb.transcribingItemType.label.pmfmExtraction
+
+ Sa valeur par défaut est `REEFDB-PMFM.PMFM_EXTRACTION`. Couplée avec l'option `reefdb.transcribingItemType.label.pmfmNm`, elle permet de transcoder les libellé des PSFMU lors des extractions avec la priorité suivante:
+
+ 1- libellé transcodé pour extraction
+ 2- libellé transcodé pour écran de saisie
+ 3- libellé interne du psfmu (issu du transcodage pour écran de saisie)
+ 4- libellé du paramètre
+
+- Pour simplifier la configuration du serveur de synchronisation, l'option `quadrige3.synchro.import.referential.transcribingItemType.label.includes`
+ qui doit contenir tous les libellés des types de transcodage à importer, accepte désormais le caractère '%'.
+
+ quadrige3.synchro.import.referential.transcribingItemType.label.includes=REEFDB% (tous les types de transcodage commençant par REEFDB seront importés)
+
+
+## Sprint 82 - v3.9.1
+
+- Pas de mise à jour de modèle
+
+
+## Sprint 81 - v3.9.0
+
+- Pas de mise à jour de modèle
+
+
## Sprint 80 - v3.8.1
- Pas de mise à jour de modèle
diff --git a/pom.xml b/pom.xml
index 9deafa7eac6f6eb66e3f81069c7fdcd8395a4ea7..6935c13e3e5dfeda064531061beff8057e7db6e1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
fr.ifremer.reefdbreefdb
- 3.8.4-SNAPSHOT
+ 3.9.5-SNAPSHOTpomReef DB
@@ -171,7 +171,7 @@
true
- 3.6.3.2
+ 3.6.103.0.3
@@ -261,7 +261,7 @@
reefdb-public-group
- http://server.e-is.pro/nexus/content/groups/reefdb
+ https://nexus.e-is.pro/nexus/content/groups/reefdbtruefail
@@ -276,7 +276,7 @@
reefdb-public-group
- http://server.e-is.pro/nexus/content/groups/reefdb
+ https://nexus.e-is.pro/nexus/content/groups/reefdbtruefail
@@ -342,6 +342,18 @@
${junit.version}test
+
+ junit-addons
+ junit-addons
+ 1.4
+ test
+
+
+ junit
+ junit
+
+
+ fr.ifremer.quadrige3quadrige3-test-shared
@@ -1119,10 +1131,10 @@
scpexe://${distribution.site.host}${distribution.site.path}eis-nexus-deploy
- http://server.e-is.pro/nexus/content/repositories/reefdb-releases
+ https://nexus.e-is.pro/nexus/content/repositories/reefdb-releaseseis-nexus-deploy
- http://server.e-is.pro/nexus/content/repositories/reefdb-snapshots
+ https://nexus.e-is.pro/nexus/content/repositories/reefdb-snapshots${distribution.repository.url}
diff --git a/reefdb-converter/pom.xml b/reefdb-converter/pom.xml
index eeffe37a4263e8ea2d1dd70819a99b73b1c04f2c..83fc00ea80e465fd8e5dbb47d323ab7c43706a80 100644
--- a/reefdb-converter/pom.xml
+++ b/reefdb-converter/pom.xml
@@ -76,7 +76,7 @@
reefdb-public-group
- http://server.e-is.pro/nexus/content/groups/reefdb
+ https://nexus.e-is.pro/nexus/content/groups/reefdbtruefail
@@ -91,7 +91,7 @@
reefdb-public-group
- http://server.e-is.pro/nexus/content/groups/reefdb
+ https://nexus.e-is.pro/nexus/content/groups/reefdbtruefail
@@ -242,12 +242,12 @@
eis-nexus-deploy
- http://server.e-is.pro/nexus/content/repositories/reefdb-releases
+ https://nexus.e-is.pro/nexus/content/repositories/reefdb-releaseseis-nexus-deploy
- http://server.e-is.pro/nexus/content/repositories/reefdb-snapshots
+ https://nexus.e-is.pro/nexus/content/repositories/reefdb-snapshots
- http://server.e-is.pro/nexus/content/groups/public
+ https://nexus.e-is.pro/nexus/content/groups/public
diff --git a/reefdb-core/pom.xml b/reefdb-core/pom.xml
index c7098d6dcb062d33c1784c26950c8af06c000aed..3ddec9765e795dd5097462a3735f498d2ceb2049 100644
--- a/reefdb-core/pom.xml
+++ b/reefdb-core/pom.xml
@@ -4,7 +4,7 @@
fr.ifremer.reefdbreefdb
- 3.8.4-SNAPSHOT
+ 3.9.5-SNAPSHOTreefdb-core
@@ -60,6 +60,16 @@
quadrige3-test-sharedtest
+
+ junit
+ junit
+ test
+
+
+ junit-addons
+ junit-addons
+ test
+
diff --git a/reefdb-core/src/license/THIRD-PARTY.properties b/reefdb-core/src/license/THIRD-PARTY.properties
index 2ed7e5ebaa358dae84a891359a1f409f5ef1b02e..7a5b719617c5eb4e7c6694195253a250d624e2bd 100644
--- a/reefdb-core/src/license/THIRD-PARTY.properties
+++ b/reefdb-core/src/license/THIRD-PARTY.properties
@@ -35,8 +35,11 @@
# Please fill the missing licenses for dependencies :
#
#
-#Fri Feb 09 17:30:26 CET 2018
+#Thu Feb 27 14:37:52 CET 2020
com.oracle--ojdbc7--12.1.0.2.0=OTN license
commons-primitives--commons-primitives--1.0=The Apache Software License, Version 2.0
dom4j--dom4j--1.6.1=BSD License
+junit-addons--junit-addons--1.4=
org.hibernate--hibernate-spatial--4.3-20140213=Lesser General Public License (LGPL)
+xerces--xercesImpl--2.6.2=
+xerces--xmlParserAPIs--2.6.2=
diff --git a/reefdb-core/src/main/java/fr/ifremer/reefdb/config/ReefDbConfiguration.java b/reefdb-core/src/main/java/fr/ifremer/reefdb/config/ReefDbConfiguration.java
index 6d45a61efc59b27d68a11d4cfca8412e4982efe6..1221ef63f12c325bd6e29c621aa9de49f1a4daf8 100644
--- a/reefdb-core/src/main/java/fr/ifremer/reefdb/config/ReefDbConfiguration.java
+++ b/reefdb-core/src/main/java/fr/ifremer/reefdb/config/ReefDbConfiguration.java
@@ -967,6 +967,10 @@ public final class ReefDbConfiguration extends QuadrigeCoreConfiguration {
return applicationConfig.getOption(ReefDbConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PMFM_NM.getKey());
}
+ public String getTranscribingItemTypeLbForPmfmExtraction() {
+ return applicationConfig.getOption(ReefDbConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PMFM_EXTRACTION.getKey());
+ }
+
/**
*
getAlternativeTaxonOriginTaxRef.
*
diff --git a/reefdb-core/src/main/java/fr/ifremer/reefdb/config/ReefDbConfigurationOption.java b/reefdb-core/src/main/java/fr/ifremer/reefdb/config/ReefDbConfigurationOption.java
index 3a08a719b0669e24d3c5cf45eea0720c1e368d59..24c91253a3182ecfdf5c3e1f8b752ed527fc2951 100644
--- a/reefdb-core/src/main/java/fr/ifremer/reefdb/config/ReefDbConfigurationOption.java
+++ b/reefdb-core/src/main/java/fr/ifremer/reefdb/config/ReefDbConfigurationOption.java
@@ -24,7 +24,6 @@ package fr.ifremer.reefdb.config;
*/
import fr.ifremer.quadrige3.core.dao.referential.UnitId;
-import fr.ifremer.quadrige3.core.dao.referential.transcribing.TranscribingItemTypeLb;
import fr.ifremer.quadrige3.core.dao.technical.QuadrigeEnumerationDef;
import org.nuiton.config.ConfigOptionDef;
import org.nuiton.version.Version;
@@ -303,7 +302,13 @@ public enum ReefDbConfigurationOption implements ConfigOptionDef {
TRANSCRIBING_ITEM_TYPE_LB_PMFM_NM(
"reefdb.transcribingItemType.label.pmfmNm",
n("reefdb.config.option.transcribingItemType.label.pmfmNm.description"),
- String.format("${%s}", TranscribingItemTypeLb.REEFDB_PMFM_NM.getKey()), // 1
+ String.format("${%s%s}", QuadrigeEnumerationDef.CONFIG_OPTION_PREFIX, "TranscribingItemTypeLb.REEFDB_PMFM_NM"),
+ String.class,
+ false),
+ TRANSCRIBING_ITEM_TYPE_LB_PMFM_EXTRACTION(
+ "reefdb.transcribingItemType.label.pmfmExtraction",
+ n("reefdb.config.option.transcribingItemType.label.pmfmExtraction.description"),
+ String.format("${%s%s}", QuadrigeEnumerationDef.CONFIG_OPTION_PREFIX, "TranscribingItemTypeLb.REEFDB_PMFM_EXTRACTION"),
String.class,
false),
/* constants used to calculate transition length */
diff --git a/reefdb-core/src/main/java/fr/ifremer/reefdb/dao/administration/strategy/ReefDbStrategyDao.java b/reefdb-core/src/main/java/fr/ifremer/reefdb/dao/administration/strategy/ReefDbStrategyDao.java
index 4b065649a1288440f62e9e5c7249be051c46ac6d..84a944278abbc40c835741cf6402c78bee0eb8d1 100644
--- a/reefdb-core/src/main/java/fr/ifremer/reefdb/dao/administration/strategy/ReefDbStrategyDao.java
+++ b/reefdb-core/src/main/java/fr/ifremer/reefdb/dao/administration/strategy/ReefDbStrategyDao.java
@@ -102,6 +102,16 @@ public interface ReefDbStrategyDao {
@Cacheable(value = PMFM_STRATEGIES_BY_PROG_LOC_DATE_CACHE)
Set getPmfmStrategiesByProgramCodeAndLocation(String programCode, Integer monitoringLocationId, LocalDate date);
+ /**
+ * Retrieve all PMFM strategies that are applied on given programs and date range
+ *
+ * @param programCodes program codes
+ * @param startDate
+ * @param endDate
+ * @return set of pmfm strategies
+ */
+ Set getPmfmStrategiesByProgramCodesAndDates(Collection programCodes, LocalDate startDate, LocalDate endDate);
+
/**
* Retrieve all strategies that are applied on the given program and monitoring location
*
diff --git a/reefdb-core/src/main/java/fr/ifremer/reefdb/dao/administration/strategy/ReefDbStrategyDaoImpl.java b/reefdb-core/src/main/java/fr/ifremer/reefdb/dao/administration/strategy/ReefDbStrategyDaoImpl.java
index 912a9a0cca940a4ac5d76fd837024158b0ffc034..7134746710c4fcc3c3ff315e3536d812c7903d2b 100644
--- a/reefdb-core/src/main/java/fr/ifremer/reefdb/dao/administration/strategy/ReefDbStrategyDaoImpl.java
+++ b/reefdb-core/src/main/java/fr/ifremer/reefdb/dao/administration/strategy/ReefDbStrategyDaoImpl.java
@@ -241,6 +241,39 @@ public class ReefDbStrategyDaoImpl extends StrategyDaoImpl implements ReefDbStra
return ImmutableSet.copyOf(pmfmStrategies);
}
+ @Override
+ public Set getPmfmStrategiesByProgramCodesAndDates(Collection programCodes, LocalDate startDate, LocalDate endDate) {
+ Set pmfmStrategies = new HashSet<>();
+
+ List appliedStrategies = getAppliedStrategiesByProgramCodes(programCodes);
+ for (ProgStratDTO appliedStrategy: appliedStrategies) {
+ // filter on date range
+ if (appliedStrategy.getStartDate() != null && appliedStrategy.getEndDate() != null
+ && !appliedStrategy.getStartDate().isAfter(endDate) && !appliedStrategy.getEndDate().isBefore(startDate)) {
+ // add all pmfm strategies in date range
+ pmfmStrategies.addAll(getPmfmsAppliedStrategy(appliedStrategy.getId()));
+ }
+ }
+
+ return ImmutableSet.copyOf(pmfmStrategies);
+
+ }
+
+ @SuppressWarnings("unchecked")
+ private List getAppliedStrategiesByProgramCodes(Collection programCodes) {
+ Query query = createQuery("appliedStrategiesByProgramCodes").setParameterList("programCodes", programCodes);
+ Iterator
*/
- @SuppressWarnings("unchecked")
public void reloadComboBox() {
getModel().setLoading(true);
- BeanFilterableComboBox cb = getUI().getRuleListComboBox();
+ BeanFilterableComboBox cb = getUI().getRuleListComboBox();
cb.setData(null);
List ruleLists = getContext().getRuleListService().getRuleLists();
-
cb.setData(ruleLists);
-// if (cb.getSelectedItem() != null) {
-// RulesUI parentUI = (RulesUI) ReefDbUIs.getParentUI(getUI());
-// cb.setSelectedItem(parentUI.getModel().getRuleListUIModel().getSingleSelectedRow());
-// }
+
+ // clear selected item if not present in list (Mantis #50537)
+ if (cb.getSelectedItem() instanceof RuleListDTO && !ruleLists.contains(cb.getSelectedItem())) {
+ cb.setSelectedItem(null);
+ }
+
getModel().setLoading(false);
}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/ObservationUI.jaxx b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/ObservationUI.jaxx
index e0421c801a408f5d793267e70d9331296bc6d3d2..727fd445ccbd40193b70eb83ba2166fd9274266f 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/ObservationUI.jaxx
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/ObservationUI.jaxx
@@ -30,7 +30,7 @@
fr.ifremer.reefdb.ui.swing.content.ReefDbMainUI
fr.ifremer.quadrige3.ui.swing.ApplicationUI
fr.ifremer.quadrige3.ui.swing.ApplicationUIUtil
- fr.ifremer.quadrige3.ui.swing.plaf.WaitBlockingLayerUI
+ fr.ifremer.quadrige3.ui.swing.plaf.ComponentBlockingLayerUI
fr.ifremer.reefdb.ui.swing.content.observation.survey.SurveyDetailsTabUI
fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.SurveyMeasurementsTabUI
@@ -54,7 +54,7 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUI.jcss b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUI.jcss
new file mode 100644
index 0000000000000000000000000000000000000000..b3c7de30f8c34be821096f16403d5a0d0ee4d2e6
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUI.jcss
@@ -0,0 +1,44 @@
+/*
+ * #%L
+ * Reef DB :: UI
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2014 - 2015 Ifremer
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ * #L%
+ */
+
+#operationMeasurementsMultiEditUI {
+ modal: true;
+ resizable: false;
+ title: "reefdb.measurement.grouped.multiEdit.title";
+}
+
+
+#cancelButton {
+ actionIcon: cancel;
+ text: "reefdb.common.cancel";
+ toolTipText: "reefdb.common.cancel";
+ i18nMnemonic: "reefdb.common.cancel.mnemonic";
+}
+
+#validButton {
+ actionIcon: accept;
+ text: "reefdb.common.validate";
+ toolTipText: "reefdb.common.validate";
+ i18nMnemonic: "reefdb.common.validate.mnemonic";
+ enabled: {model.isValid() && model.isModify()};
+}
\ No newline at end of file
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUIHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..64f922fed2c2daa85a6cefca87abf633457f526a
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUIHandler.java
@@ -0,0 +1,130 @@
+package fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.multiedit;
+
+/*
+ * #%L
+ * Reef DB :: UI
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2014 - 2015 Ifremer
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ * #L%
+ */
+
+import fr.ifremer.quadrige3.ui.swing.ApplicationUIUtil;
+import fr.ifremer.quadrige3.ui.swing.table.ColumnIdentifier;
+import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementAware;
+import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedRowModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedTableUI;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsMultiEditUIHandler;
+import org.jdesktop.swingx.table.TableColumnExt;
+import org.nuiton.jaxx.application.swing.util.Cancelable;
+
+/**
+ * Controleur pour les mesures de l'observation.
+ */
+public class OperationMeasurementsMultiEditUIHandler
+ extends AbstractMeasurementsMultiEditUIHandler
+ implements Cancelable {
+
+ /**
+ *
Constructor for OperationMeasurementsMultiEditUIHandler.
+ */
+ public OperationMeasurementsMultiEditUIHandler() {
+ super();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public AbstractMeasurementsGroupedTableModel getTableModel() {
+ return (OperationMeasurementsGroupedTableModel) getTable().getModel();
+ }
+
+ @Override
+ protected OperationMeasurementsMultiEditUIModel createNewModel() {
+ return new OperationMeasurementsMultiEditUIModel();
+ }
+
+ @Override
+ protected OperationMeasurementsGroupedRowModel createNewRow(boolean readOnly, MeasurementAware parentBean) {
+ return new OperationMeasurementsGroupedRowModel(readOnly);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SwingTable getTable() {
+ return getUI().getOperationGroupedMeasurementMultiEditTable();
+ }
+
+ @Override
+ protected SwingTable getReferentTable() {
+ return ((OperationMeasurementsGroupedTableUI) ApplicationUIUtil.getParentUI(getUI())).getOperationGroupedMeasurementTable();
+ }
+
+ /**
+ * Initialisation du tableau.
+ */
+ @Override
+ protected void initTable() {
+
+ final TableColumnExt samplingCol = addColumn(OperationMeasurementsGroupedTableModel.SAMPLING);
+ samplingCol.setEditable(false);
+
+ // Colonne groupe taxon
+ addColumn(
+ taxonGroupCellEditor,
+ newTableCellRender(OperationMeasurementsGroupedTableModel.TAXON_GROUP),
+ OperationMeasurementsGroupedTableModel.TAXON_GROUP);
+
+ // Colonne taxon
+ addColumn(
+ taxonCellEditor,
+ newTableCellRender(OperationMeasurementsGroupedTableModel.TAXON),
+ OperationMeasurementsGroupedTableModel.TAXON);
+
+ // Colonne taxon saisi
+ final TableColumnExt colInputTaxon = addColumn(OperationMeasurementsGroupedTableModel.INPUT_TAXON_NAME);
+ colInputTaxon.setEditable(false);
+
+ // Colonne analyste
+ addColumn(
+ departmentCellEditor,
+ newTableCellRender(AbstractMeasurementsGroupedTableModel.ANALYST),
+ (ColumnIdentifier) AbstractMeasurementsGroupedTableModel.ANALYST);
+
+ // No comment column because comment editor is also a JDialog
+// final TableColumnExt colComment = addCommentColumn(OperationMeasurementsGroupedTableModel.COMMENT);
+
+ // Modele de la table
+ final OperationMeasurementsGroupedTableModel tableModel = new OperationMeasurementsGroupedTableModel(getTable().getColumnModel(), false);
+ tableModel.setNoneEditableCols();
+ getTable().setModel(tableModel);
+
+ // Initialisation de la table
+ initTable(getTable());
+
+ // border
+ addEditionPanelBorder();
+ }
+
+
+}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUIModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUIModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f0587703dd08fa57ed514df1e17d82920b4ea2f
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/grouped/multiedit/OperationMeasurementsMultiEditUIModel.java
@@ -0,0 +1,49 @@
+package fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.multiedit;
+
+/*
+ * #%L
+ * Reef DB :: UI
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2014 - 2015 Ifremer
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ * #L%
+ */
+
+import com.google.common.collect.ImmutableSet;
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementDTO;
+import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedRowModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsMultiEditUIModel;
+import fr.ifremer.reefdb.ui.swing.util.table.ReefDbColumnIdentifier;
+
+import java.util.Set;
+
+public class OperationMeasurementsMultiEditUIModel
+ extends AbstractMeasurementsMultiEditUIModel {
+
+ @Override
+ public Set> getIdentifiersToCheck() {
+ return ImmutableSet.of(
+ OperationMeasurementsGroupedTableModel.SAMPLING,
+ OperationMeasurementsGroupedTableModel.TAXON_GROUP,
+ OperationMeasurementsGroupedTableModel.TAXON,
+ OperationMeasurementsGroupedTableModel.INPUT_TAXON_NAME,
+ (ReefDbColumnIdentifier) AbstractMeasurementsGroupedTableModel.ANALYST
+ );
+ }
+}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/ungrouped/OperationMeasurementsUngroupedTableUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/ungrouped/OperationMeasurementsUngroupedTableUIHandler.java
index bcf66ede6e370d8dec60aa905163738db99cb05a..569b76954ec8fd25012286d62f1ee066b2f48e8f 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/ungrouped/OperationMeasurementsUngroupedTableUIHandler.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/ungrouped/OperationMeasurementsUngroupedTableUIHandler.java
@@ -23,7 +23,6 @@ package fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.ung
* #L%
*/
-import fr.ifremer.quadrige3.core.dao.technical.AlphanumericComparator;
import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
import fr.ifremer.quadrige3.ui.swing.table.editor.ExtendedComboBoxCellEditor;
import fr.ifremer.reefdb.decorator.DecoratorService;
@@ -174,7 +173,9 @@ public class OperationMeasurementsUngroupedTableUIHandler extends AbstractReefDb
getContext().restoreComponentFromSwingSession(getTable());
// hide analyst if no pmfm
- forceColumnVisibleAtLastPosition(OperationMeasurementsUngroupedTableModel.ANALYST, notEmpty);
+// forceColumnVisibleAtLastPosition(OperationMeasurementsUngroupedTableModel.ANALYST, notEmpty);
+ // Don't force position (Mantis #49537)
+ forceColumnVisible(OperationMeasurementsUngroupedTableModel.ANALYST, notEmpty);
// set columns with errors visible (Mantis #40752)
ensureColumnsWithErrorAreVisible(getModel().getRows());
@@ -284,17 +285,6 @@ public class OperationMeasurementsUngroupedTableUIHandler extends AbstractReefDb
addEditionPanelBorder();
}
- @Override
- protected void installSortController() {
- super.installSortController();
-
- getSortController().setComparator(
- getTable().getColumnModel().getColumnExt(OperationMeasurementsUngroupedTableModel.NAME).getModelIndex(),
- new AlphanumericComparator()
- );
-
- }
-
/**
* {@inheritDoc}
*/
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/ungrouped/OperationMeasurementsUngroupedTableUIModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/ungrouped/OperationMeasurementsUngroupedTableUIModel.java
index 4d492a095e9bdd00552af3aa2092f371fcf9d96b..6e830aba2ebdc61c5b69771ddc8a8df6e8b08d34 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/ungrouped/OperationMeasurementsUngroupedTableUIModel.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/ungrouped/OperationMeasurementsUngroupedTableUIModel.java
@@ -42,6 +42,7 @@ public class OperationMeasurementsUngroupedTableUIModel extends AbstractReefDbTa
private ObservationUIModel survey;
private SamplingOperationDTO samplingFilter;
+ private Integer calculatedLengthStartPositionPmfmId;
/**
* Constructor.
@@ -113,6 +114,14 @@ public class OperationMeasurementsUngroupedTableUIModel extends AbstractReefDbTa
return measurements;
}
+ public Integer getCalculatedLengthStartPositionPmfmId() {
+ return calculatedLengthStartPositionPmfmId;
+ }
+
+ public void setCalculatedLengthStartPositionPmfmId(Integer calculatedLengthStartPositionPmfmId) {
+ this.calculatedLengthStartPositionPmfmId = calculatedLengthStartPositionPmfmId;
+ }
+
public void fireMeasurementsLoaded() {
firePropertyChange(EVENT_MEASUREMENTS_LOADED, null, null);
}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/photo/ImportAction.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/photo/ImportAction.java
index f1817c836376672021eab9ad11040d39ec430d80..b18416a3460a8b9c49794d6f0e9584db4df3b66a 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/photo/ImportAction.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/photo/ImportAction.java
@@ -12,12 +12,12 @@ package fr.ifremer.reefdb.ui.swing.content.observation.photo;
* it under the terms of the GNU Affero 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 Affero General Public License
* along with this program. If not, see .
* #L%
@@ -29,9 +29,12 @@ import fr.ifremer.reefdb.dto.ReefDbBeanFactory;
import fr.ifremer.reefdb.dto.data.photo.PhotoDTO;
import fr.ifremer.reefdb.dto.data.sampling.SamplingOperationDTO;
import fr.ifremer.reefdb.ui.swing.action.AbstractReefDbAction;
+import org.apache.commons.collections4.CollectionUtils;
import java.io.File;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
import java.util.Objects;
import static org.nuiton.i18n.I18n.t;
@@ -41,8 +44,8 @@ import static org.nuiton.i18n.I18n.t;
*/
public class ImportAction extends AbstractReefDbAction {
- private File originalImage;
- private PhotoDTO newPhoto;
+ private List originalImages;
+ private List newPhotos;
/**
* Constructor.
@@ -53,80 +56,110 @@ public class ImportAction extends AbstractReefDbAction 0 && originalImage.length() > maxSize) {
+ if (maxSize > 0 && originalImages.stream().anyMatch(file -> file.length() > maxSize)) {
displayErrorMessage(getActionDescription(),
- t("reefdb.action.photo.import.fileTooLarge.message", maxSize, Files.byteCountToDisplaySize(maxSize)));
- originalImage = null;
+ t("reefdb.action.photo.import.fileTooLarge.message", maxSize, Files.byteCountToDisplaySize(maxSize)));
+ return false;
}
- }
- return originalImage != null;
+ return true;
+
+ } else {
+
+ // no selection
+ return false;
+ }
}
- /** {@inheritDoc} */
+ /**
+ * {@inheritDoc}
+ */
@Override
public void doAction() {
getModel().setLoading(true);
-
- File tempFile = Images.importAndPrepareImageFile(originalImage, getConfig().getTempDirectory());
-
- newPhoto = ReefDbBeanFactory.newPhotoDTO();
- newPhoto.setDirty(true);
- newPhoto.setDate(new Date());
- newPhoto.setName(originalImage.getName());
- // set path file to null
- newPhoto.setPath(null);
- newPhoto.setFullPath(tempFile.getAbsolutePath());
-
- // set sampling operation
- if (getContext().getSelectedSamplingOperationId() != null){
- for (SamplingOperationDTO samplingOperation : getModel().getObservationModel().getSamplingOperations()) {
- if (Objects.equals(samplingOperation.getId(), getContext().getSelectedSamplingOperationId())) {
- newPhoto.setSamplingOperation(samplingOperation);
- break;
+ newPhotos = new ArrayList<>();
+
+ originalImages.forEach(originalImage -> {
+
+ File tempFile = Images.importAndPrepareImageFile(originalImage, getConfig().getTempDirectory());
+
+ PhotoDTO newPhoto = ReefDbBeanFactory.newPhotoDTO();
+ newPhoto.setDirty(true);
+ newPhoto.setDate(new Date());
+ newPhoto.setName(originalImage.getName());
+ // set path file to null
+ newPhoto.setPath(null);
+ newPhoto.setFullPath(tempFile.getAbsolutePath());
+
+ // set sampling operation
+ if (getContext().getSelectedSamplingOperationId() != null) {
+ for (SamplingOperationDTO samplingOperation : getModel().getObservationModel().getSamplingOperations()) {
+ if (Objects.equals(samplingOperation.getId(), getContext().getSelectedSamplingOperationId())) {
+ newPhoto.setSamplingOperation(samplingOperation);
+ break;
+ }
}
}
- }
+
+ newPhotos.add(newPhoto);
+
+ });
}
- /** {@inheritDoc} */
+ /**
+ * {@inheritDoc}
+ */
@Override
public void postSuccessAction() {
super.postSuccessAction();
- if (newPhoto != null) {
- getHandler().setFocusOnCell(getModel().addNewRow(newPhoto));
+ if (CollectionUtils.isNotEmpty(newPhotos)) {
+
+ PhotosTableRowModel firstRow = null;
+ for (PhotoDTO newPhoto : newPhotos) {
+ PhotosTableRowModel newRow = getModel().addNewRow(newPhoto);
+ if (firstRow == null)
+ firstRow = newRow;
+ }
+ if (firstRow != null)
+ getHandler().setFocusOnCell(firstRow);
+
getModel().setModify(true);
}
}
- /** {@inheritDoc} */
+ /**
+ * {@inheritDoc}
+ */
@Override
protected void releaseAction() {
super.releaseAction();
- originalImage = null;
- newPhoto = null;
+ originalImages = null;
+ newPhotos = null;
getModel().setLoading(false);
}
}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedRowModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedRowModel.java
index 2fe3a0c9c00ff7593b0d593953557fe487a1d719..3227c3e215f981abc964a225f61eba194febd306 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedRowModel.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedRowModel.java
@@ -26,7 +26,7 @@ package fr.ifremer.reefdb.ui.swing.content.observation.shared;
import com.google.common.collect.Lists;
import fr.ifremer.quadrige3.core.dao.technical.factorization.pmfm.AllowedQualitativeValuesMap;
import fr.ifremer.quadrige3.ui.core.dto.CommentAware;
-import fr.ifremer.quadrige3.ui.core.dto.QuadrigeBean;
+import fr.ifremer.quadrige3.ui.swing.table.ColumnIdentifier;
import fr.ifremer.reefdb.dto.ErrorAware;
import fr.ifremer.reefdb.dto.ErrorDTO;
import fr.ifremer.reefdb.dto.ReefDbBeans;
@@ -38,17 +38,14 @@ import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbRowUIModel;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
* @author peck7 on 08/01/2019.
*/
-public abstract class AbstractMeasurementsGroupedRowModel>
+public abstract class AbstractMeasurementsGroupedRowModel>
extends AbstractReefDbRowUIModel implements CommentAware, MeasurementAware, ErrorAware {
public static String PROPERTY_INDIVIDUAL_ID = "individualId";
@@ -77,15 +74,21 @@ public abstract class AbstractMeasurementsGroupedRowModel preconditionErrors;
+ // used with multi edit model
+ private List> multipleValuesOnIdentifier;
+ private List multipleValuesOnPmfmIds;
+
/**
*
Constructor for AbstractReefDbRowUIModel.
*/
public AbstractMeasurementsGroupedRowModel(boolean readOnly) {
super(null, null);
- this.individualMeasurements = Lists.newArrayList();
- this.errors = Lists.newArrayList();
- this.preconditionErrors = Lists.newArrayList();
+ this.individualMeasurements = new ArrayList<>();
+ this.errors = new ArrayList<>();
+ this.preconditionErrors = new ArrayList<>();
this.allowedQualitativeValuesMap = new AllowedQualitativeValuesMap();
+ this.multipleValuesOnIdentifier = new ArrayList<>();
+ this.multipleValuesOnPmfmIds = new ArrayList<>();
this.readOnly = readOnly;
}
@@ -291,6 +294,22 @@ public abstract class AbstractMeasurementsGroupedRowModel> getMultipleValuesOnIdentifier() {
+ return multipleValuesOnIdentifier;
+ }
+
+ public void addMultipleValuesOnIdentifier(ColumnIdentifier extends R> identifier) {
+ multipleValuesOnIdentifier.add(identifier);
+ }
+
+ public List getMultipleValuesOnPmfmIds() {
+ return multipleValuesOnPmfmIds;
+ }
+
+ public void addMultipleValuesOnPmfmId(Integer pmfmId) {
+ multipleValuesOnPmfmIds.add(pmfmId);
+ }
+
public boolean isSameRow(AbstractMeasurementsGroupedRowModel, ?> that) {
return Objects.equals(this.getTaxonGroup(), that.getTaxonGroup())
&& Objects.equals(this.getTaxon(), that.getTaxon());
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableModel.java
index 2c678f3f095b358d3df8b7487ee565688a53aadf..6ca7cc38f382c65b64bc3b412ecf6068eac04e00 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableModel.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableModel.java
@@ -23,6 +23,7 @@ package fr.ifremer.reefdb.ui.swing.content.observation.shared;
* #L%
*/
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementDTO;
import fr.ifremer.reefdb.dto.referential.DepartmentDTO;
import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableModel;
import fr.ifremer.reefdb.ui.swing.util.table.ReefDbColumnIdentifier;
@@ -33,19 +34,19 @@ import static org.nuiton.i18n.I18n.n;
/**
* @author peck7 on 08/01/2019.
*/
-public abstract class AbstractMeasurementsGroupedTableModel>
+public abstract class AbstractMeasurementsGroupedTableModel>
extends AbstractReefDbTableModel {
/**
* Identifiant pour la colonne analyst.
*/
- public static final ReefDbColumnIdentifier extends AbstractMeasurementsGroupedRowModel> ANALYST = ReefDbColumnIdentifier.newId(
+ public static final ReefDbColumnIdentifier extends AbstractMeasurementsGroupedRowModel> ANALYST = ReefDbColumnIdentifier.newId(
AbstractMeasurementsGroupedRowModel.PROPERTY_ANALYST,
n("reefdb.property.analyst"),
n("reefdb.measurement.analyst.tip"),
DepartmentDTO.class);
- public static final ReefDbColumnIdentifier extends AbstractMeasurementsGroupedRowModel> INDIVIDUAL_ID = ReefDbColumnIdentifier.newReadOnlyId(
+ public static final ReefDbColumnIdentifier extends AbstractMeasurementsGroupedRowModel> INDIVIDUAL_ID = ReefDbColumnIdentifier.newReadOnlyId(
AbstractMeasurementsGroupedRowModel.PROPERTY_INDIVIDUAL_ID,
n("reefdb.property.individualId"),
n("reefdb.property.individualId"),
@@ -56,8 +57,8 @@ public abstract class AbstractMeasurementsGroupedTableModel getPmfmInsertPosition();
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableUIHandler.java
index 18641b829e5731513dcb6e9867b327a406144ba7..1a229dd2576eb3e81d82fc9a7aed548f2248467f 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableUIHandler.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableUIHandler.java
@@ -49,6 +49,7 @@ import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
import fr.ifremer.reefdb.dto.referential.pmfm.QualitativeValueDTO;
+import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedRowModel;
import fr.ifremer.reefdb.ui.swing.util.ReefDbUI;
import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableUIHandler;
import fr.ifremer.reefdb.ui.swing.util.table.PmfmTableColumn;
@@ -59,7 +60,12 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
+import java.awt.Dimension;
+import java.awt.Insets;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
@@ -71,8 +77,8 @@ import static org.nuiton.i18n.I18n.t;
* @author peck7 on 08/01/2019.
*/
public abstract class AbstractMeasurementsGroupedTableUIHandler<
- R extends AbstractMeasurementsGroupedRowModel, R>,
- M extends AbstractMeasurementsGroupedTableUIModel, R, M>,
+ R extends AbstractMeasurementsGroupedRowModel,
+ M extends AbstractMeasurementsGroupedTableUIModel,
UI extends ReefDbUI>
extends AbstractReefDbTableUIHandler {
@@ -102,7 +108,6 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
@Override
public void afterInit(UI ui) {
- // Initialiser l UI
initUI(ui);
createTaxonGroupCellEditor();
@@ -285,8 +290,10 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
// restore table from swing session
getContext().restoreComponentFromSwingSession(getTable());
- // hide analyst if no pmfm TODO
- forceColumnVisibleAtLastPosition(AbstractMeasurementsGroupedTableModel.ANALYST, notEmpty);
+ // hide analyst if no pmfm
+// forceColumnVisibleAtLastPosition(AbstractMeasurementsGroupedTableModel.ANALYST, notEmpty);
+ // Don't force position (Mantis #49537)
+ forceColumnVisible(AbstractMeasurementsGroupedTableModel.ANALYST, notEmpty);
// set columns with errors visible (Mantis #40752)
ensureColumnsWithErrorAreVisible(getModel().getRows());
@@ -299,7 +306,7 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
}
- private List buildRows(boolean readOnly) {
+ protected List buildRows(boolean readOnly) {
List rows = new ArrayList<>();
@@ -610,6 +617,10 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
}
+ private void setDirty(Object bean) {
+ if (bean instanceof DirtyAware) ((DirtyAware) bean).setDirty(true);
+ }
+
protected void updateMeasurementFromRow(MeasurementDTO measurement, R row) {
measurement.setIndividualId(row.getIndividualId());
measurement.setTaxonGroup(row.getTaxonGroup());
@@ -670,6 +681,18 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
protected boolean isRowValid(R row) {
boolean valid = super.isRowValid(row);
+ if (!valid && !row.isMandatoryValid()) {
+ // check invalid mandatory errors
+ new ArrayList<>(row.getInvalidMandatoryIdentifiers()).forEach(invalidIdentifier -> {
+ if (row.getMultipleValuesOnIdentifier().contains(invalidIdentifier)) {
+ // if this identifier has multiple value, remove error
+ row.getErrors().removeIf(error -> error.getPropertyName().size() == 1 && error.getPropertyName().contains(invalidIdentifier.getPropertyName()));
+ row.getInvalidMandatoryIdentifiers().remove(invalidIdentifier);
+ }
+ });
+ valid = row.isMandatoryValid();
+ }
+
boolean noUnicityDuplicates = hasNoUnicityDuplicates(row);
boolean noPreconditionErrors = hasNoPreconditionErrors(row);
boolean noGroupedRuleErrors = hasNoGroupedRuleErrors(row);
@@ -679,7 +702,8 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
}
protected boolean hasAnalyst(R row) {
- if (row.getAnalyst() == null && row.getIndividualMeasurements().stream().anyMatch(this::isMeasurementNotEmpty)) {
+ if (!row.getMultipleValuesOnIdentifier().contains(AbstractMeasurementsGroupedTableModel.ANALYST)
+ && row.getAnalyst() == null && row.getIndividualMeasurements().stream().anyMatch(this::isMeasurementNotEmpty)) {
ReefDbBeans.addError(row,
t("reefdb.validator.error.analyst.required"),
AbstractMeasurementsGroupedRowModel.PROPERTY_ANALYST);
@@ -1099,12 +1123,92 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
}
}
-
- /*
- Private methods
+ /**
+ * Open the multiline edit dialog (Mantis #49615)
+ *
+ * @param dialog the dialog to open
*/
+ protected void editSelectedMeasurements(JDialog dialog) {
+ // save current table state to be able to restore it in dialog's table
+ saveTableInSwingSession();
+
+ Assert.isInstanceOf(ReefDbUI.class, dialog);
+ ReefDbUI, ?> multiEditUI = (ReefDbUI, ?>) dialog;
+ Assert.isInstanceOf(AbstractMeasurementsMultiEditUIModel.class, multiEditUI.getModel());
+ AbstractMeasurementsMultiEditUIModel multiEditModel = (AbstractMeasurementsMultiEditUIModel) multiEditUI.getModel();
+ multiEditModel.setObservationHandler(getModel().getObservationUIHandler());
+ multiEditModel.setRowsToEdit(getModel().getSelectedRows());
+ multiEditModel.setPmfms(getModel().getPmfms());
+ multiEditModel.setSurvey(getModel().getSurvey());
+
+ // get parent component for dialog centering
+ JComponent parent = getUI().getParentContainer(getTable(), JScrollPane.class);
+ Insets borderInsets = parent.getBorder().getBorderInsets(parent);
+ openDialog(dialog, new Dimension(parent.getWidth() + borderInsets.left + borderInsets.right, 160), true, parent);
+
+ // if dialog is valid
+ if (multiEditModel.isValid()) {
+
+ // affect all non multiple column values to selected rows
+ R multiEditRow = multiEditModel.getRows().get(0);
+
+ for (R row : getModel().getSelectedRows()) {
+
+ // affect column values
+ for (ReefDbColumnIdentifier identifier : multiEditModel.getIdentifiersToCheck()) {
+ // be sure that sampling operation value can not be changed
+ if (identifier.getPropertyName().equals(OperationMeasurementsGroupedRowModel.PROPERTY_SAMPLING_OPERATION))
+ continue;
- private void setDirty(Object bean) {
- if (bean instanceof DirtyAware) ((DirtyAware) bean).setDirty(true);
+ // get values
+ Object multiValue = identifier.getValue(multiEditRow);
+ Object currentValue = identifier.getValue(row);
+ boolean isMultiple = multiEditRow.getMultipleValuesOnIdentifier().contains(identifier);
+ // affect value if a multiple value has been replaced, or modification has been made
+ if ((!isMultiple || multiValue != null) && !Objects.equals(multiValue, currentValue)) {
+ identifier.setValue(row, multiValue);
+ // special case for INPUT_TAXON_NAME
+ if (identifier.getPropertyName().equals(AbstractMeasurementsGroupedRowModel.PROPERTY_INPUT_TAXON_NAME)) {
+ // affect also INPUT_TAXON_ID
+ row.setInputTaxonId(multiEditRow.getInputTaxonId());
+ }
+ }
+ }
+
+ // for measurement columns
+ for (PmfmDTO pmfm : getModel().getPmfms()) {
+ MeasurementDTO multiMeasurement = ReefDbBeans.getIndividualMeasurementByPmfmId(multiEditRow, pmfm.getId());
+ if (multiMeasurement == null) {
+ // can happened if user pass on on a cel without setting a value
+ multiMeasurement = ReefDbBeanFactory.newMeasurementDTO();
+ }
+ boolean isMultiple = multiEditRow.getMultipleValuesOnPmfmIds().contains(pmfm.getId());
+ // affect value if a multiple value has been replaced, or modification has been made
+ if (!isMultiple || !ReefDbBeans.isMeasurementEmpty(multiMeasurement)) {
+ MeasurementDTO measurement = ReefDbBeans.getIndividualMeasurementByPmfmId(row, pmfm.getId());
+ if (measurement == null) {
+ // create and add the measurement if not exists
+ measurement = ReefDbBeanFactory.newMeasurementDTO();
+ measurement.setPmfm(pmfm);
+ measurement.setIndividualId(row.getIndividualId());
+ row.getIndividualMeasurements().add(measurement);
+ }
+ // affect value (either numeric or qualitative)
+ if (!ReefDbBeans.measurementValuesEquals(multiMeasurement, measurement)) {
+ measurement.setNumericalValue(multiMeasurement.getNumericalValue());
+ measurement.setQualitativeValue(multiMeasurement.getQualitativeValue());
+ }
+ }
+ }
+
+ // save modifications
+ saveMeasurementsInModel(row);
+ }
+
+ // done
+ getModel().setModify(true);
+ getTable().repaint();
+ }
}
+
}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableUIModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableUIModel.java
index 15b24bab9ead4b50539e0f955dc650624f8bfb40..f8fbca9d4b3a9cae849d5dbefedaacebb6fe2154 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableUIModel.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsGroupedTableUIModel.java
@@ -25,10 +25,10 @@ package fr.ifremer.reefdb.ui.swing.content.observation.shared;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
-import fr.ifremer.quadrige3.ui.core.dto.QuadrigeBean;
import fr.ifremer.reefdb.dto.configuration.control.ControlRuleDTO;
import fr.ifremer.reefdb.dto.configuration.control.PreconditionRuleDTO;
import fr.ifremer.reefdb.dto.configuration.control.RuleGroupDTO;
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementDTO;
import fr.ifremer.reefdb.dto.data.sampling.SamplingOperationDTO;
import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
@@ -46,7 +46,7 @@ import java.util.Map;
* @author peck7 on 08/01/2019.
*/
public abstract class AbstractMeasurementsGroupedTableUIModel<
- B extends QuadrigeBean,
+ B extends MeasurementDTO,
R extends AbstractMeasurementsGroupedRowModel,
M extends AbstractMeasurementsGroupedTableUIModel>
extends AbstractReefDbTableUIModel {
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsMultiEditUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsMultiEditUIHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca251614895e28b17960dc3d31fb7a153e9fd631
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsMultiEditUIHandler.java
@@ -0,0 +1,239 @@
+package fr.ifremer.reefdb.ui.swing.content.observation.shared;
+
+/*
+ * #%L
+ * Reef DB :: UI
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2014 - 2015 Ifremer
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ * #L%
+ */
+
+import com.google.common.collect.ImmutableList;
+import fr.ifremer.quadrige3.core.dao.technical.Assert;
+import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
+import fr.ifremer.quadrige3.ui.swing.table.state.SwingTableSessionState;
+import fr.ifremer.reefdb.dto.ReefDbBeanFactory;
+import fr.ifremer.reefdb.dto.ReefDbBeans;
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementAware;
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementDTO;
+import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
+import fr.ifremer.reefdb.ui.swing.util.ReefDbUI;
+import fr.ifremer.reefdb.ui.swing.util.table.ReefDbColumnIdentifier;
+import fr.ifremer.reefdb.ui.swing.util.table.renderer.MultipleValueCellRenderer;
+import jaxx.runtime.swing.session.State;
+import org.nuiton.jaxx.application.swing.util.Cancelable;
+
+import javax.swing.table.TableColumn;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * abstract handler for multiline edition
+ */
+public abstract class AbstractMeasurementsMultiEditUIHandler<
+ R extends AbstractMeasurementsGroupedRowModel,
+ M extends AbstractMeasurementsMultiEditUIModel,
+ UI extends ReefDbUI
+ >
+ extends AbstractMeasurementsGroupedTableUIHandler
+ implements Cancelable {
+
+ /**
+ *
Constructor for AbstractMeasurementsMultiEditUIHandler.
+ */
+ public AbstractMeasurementsMultiEditUIHandler() {
+ super(R.PROPERTY_TAXON_GROUP,
+ R.PROPERTY_TAXON,
+ R.PROPERTY_INDIVIDUAL_PMFMS,
+ R.PROPERTY_COMMENT);
+ }
+
+ /**
+ * get the referent table for columns adjustments
+ *
+ * @return the referent table
+ */
+ protected abstract SwingTable getReferentTable();
+
+ /**
+ * Don't really build rows but create a multi edit row
+ *
+ * @param readOnly readOnly
+ * @return rows from model
+ */
+ @Override
+ protected List buildRows(boolean readOnly) {
+
+ if (getModel().getRowsToEdit().isEmpty())
+ return null;
+
+ // Create a ghost row without parent
+ R multiEditRow = createNewRow(readOnly, null);
+ multiEditRow.setIndividualPmfms(new ArrayList<>(getModel().getPmfms()));
+ ReefDbBeans.createEmptyMeasurements(multiEditRow);
+
+ boolean firstRow = true;
+ for (R row : getModel().getRowsToEdit()) {
+
+ // find multiple value on each known columns
+ findMultipleValueOnIdentifier(row, multiEditRow, firstRow);
+
+ // find multiple value on each measurement
+ findMultipleValueOnPmfmIdentifier(row, multiEditRow, firstRow);
+
+ firstRow = false;
+ }
+
+ overrideColumnRenderersAndEditors(multiEditRow);
+
+ overrideColumnWidthAndPosition();
+
+ return ImmutableList.of(multiEditRow);
+ }
+
+ // detect multiple values on each column
+ private void findMultipleValueOnIdentifier(R row, R multiEditRow, boolean firstRow) {
+
+ for (ReefDbColumnIdentifier identifier : getModel().getIdentifiersToCheck()) {
+ if (!multiEditRow.getMultipleValuesOnIdentifier().contains(identifier)) {
+ if (!Objects.equals(identifier.getValue(row), identifier.getValue(multiEditRow))) {
+ if (firstRow) {
+ // on first row, consider a unique value
+ identifier.setValue(multiEditRow, identifier.getValue(row));
+ } else {
+ // on other rows, if the value differs, set it as multiple
+ identifier.setValue(multiEditRow, null);
+ multiEditRow.addMultipleValuesOnIdentifier(identifier);
+ }
+ }
+ }
+ }
+ }
+
+ // detect multiple values on each pmfm column
+ private void findMultipleValueOnPmfmIdentifier(R row, R multiEditRow, boolean firstRow) {
+
+ for (PmfmDTO pmfm : getModel().getPmfms()) {
+ if (!multiEditRow.getMultipleValuesOnPmfmIds().contains(pmfm.getId())) {
+ MeasurementDTO multiMeasurement = ReefDbBeans.getIndividualMeasurementByPmfmId(multiEditRow, pmfm.getId());
+ Assert.notNull(multiMeasurement, "should be already present");
+ MeasurementDTO measurement = ReefDbBeans.getIndividualMeasurementByPmfmId(row, pmfm.getId());
+ if (measurement == null) {
+ // create ghost measurement
+ measurement = ReefDbBeanFactory.newMeasurementDTO();
+ measurement.setPmfm(pmfm);
+ }
+
+ if (!ReefDbBeans.measurementValuesEquals(multiMeasurement, measurement)) {
+ if (firstRow) {
+ // on first row, consider a unique value
+ multiMeasurement.setNumericalValue(measurement.getNumericalValue());
+ multiMeasurement.setQualitativeValue(measurement.getQualitativeValue());
+ } else {
+ // on other rows, if the value differs, set it as multiple
+ multiMeasurement.setNumericalValue(null);
+ multiMeasurement.setQualitativeValue(null);
+ multiEditRow.addMultipleValuesOnPmfmId(pmfm.getId());
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Override all column renderers with specific behavior if multiple values is found
+ *
+ * @param multiEditRow
+ */
+ private void overrideColumnRenderersAndEditors(R multiEditRow) {
+
+ multiEditRow.getMultipleValuesOnIdentifier().forEach(identifier -> {
+ TableColumn col = getTable().getColumnExt(identifier);
+ // override the renderer
+ col.setCellRenderer(new MultipleValueCellRenderer(col.getCellRenderer()));
+ });
+ multiEditRow.getMultipleValuesOnPmfmIds().forEach(pmfmId ->
+ getModel().getPmfmColumns().stream().filter(pmfmTableColumn -> pmfmTableColumn.getPmfmId() == pmfmId).findFirst()
+ .ifPresent(pmfmTableColumn -> {
+ // override the renderer
+ pmfmTableColumn.setCellRenderer(new MultipleValueCellRenderer(pmfmTableColumn.getCellRenderer()));
+ // and set not editable if the pmfm is set as read-only
+ if (getModel().getReadOnlyPmfmIds().contains(pmfmId))
+ pmfmTableColumn.setEditable(false);
+ }
+ ));
+ }
+
+ private void overrideColumnWidthAndPosition() {
+
+ // get the state of the referent table
+ State referentState = getContext().getSwingSession().findStateByComponentName(".*" + getReferentTable().getName());
+
+ // apply this state to the current table
+ if (referentState instanceof SwingTableSessionState) {
+ referentState.setState(getTable(), referentState);
+ }
+ }
+
+ @Override
+ protected void onRowsAdded(List addedRows) {
+ // Don't call super method because the row is already initialized in buildRows()
+// super.onRowsAdded(addedRows);
+ }
+
+ @Override
+ public void saveMeasurementsInModel(R row) {
+ // Don't call super method; the selected rows will be saved after multi-line validation
+// super.saveMeasurementsInModel(row);
+ }
+
+ @Override
+ protected List extends MeasurementAware> getMeasurementAwareModels() {
+ // nothing to return, this handler don't save model
+ return null;
+ }
+
+ @Override
+ protected MeasurementAware getMeasurementAwareModelForRow(R row) {
+ // nothing to return, this handler don't save model
+ return null;
+ }
+
+ @Override
+ protected void filterMeasurements() {
+ }
+
+ @Override
+ protected void removeIndividualMeasurements(List measurementToDelete) {
+ }
+
+ public void valid() {
+ if (getModel().isValid()) {
+ closeDialog();
+ }
+ }
+
+ @Override
+ public void cancel() {
+ stopListenValidatorValid(getValidator());
+ getModel().setValid(false);
+ closeDialog();
+ }
+
+}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsMultiEditUIModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsMultiEditUIModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..379426413e30372f3d52377f8122b5df45c32320
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/shared/AbstractMeasurementsMultiEditUIModel.java
@@ -0,0 +1,71 @@
+package fr.ifremer.reefdb.ui.swing.content.observation.shared;
+
+/*
+ * #%L
+ * Reef DB :: UI
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2014 - 2015 Ifremer
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ * #L%
+ */
+
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementDTO;
+import fr.ifremer.reefdb.ui.swing.util.table.ReefDbColumnIdentifier;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Modele pour les mesures de l'observation.
+ */
+public abstract class AbstractMeasurementsMultiEditUIModel<
+ B extends MeasurementDTO,
+ R extends AbstractMeasurementsGroupedRowModel,
+ M extends AbstractMeasurementsMultiEditUIModel>
+ extends AbstractMeasurementsGroupedTableUIModel {
+
+ // rows selected by caller
+ Set rowsToEdit;
+
+ // pmfm ids as read-only
+ List readOnlyPmfmIds;
+
+ public Set getRowsToEdit() {
+ if (rowsToEdit == null)
+ rowsToEdit = new HashSet<>();
+ return rowsToEdit;
+ }
+
+ public void setRowsToEdit(Set rowsToEdit) {
+ this.rowsToEdit = rowsToEdit;
+ }
+
+ public List getReadOnlyPmfmIds() {
+ if (readOnlyPmfmIds == null)
+ readOnlyPmfmIds = new ArrayList<>();
+ return readOnlyPmfmIds;
+ }
+
+ public void setReadOnlyPmfmIds(List readOnlyPmfmIds) {
+ this.readOnlyPmfmIds = readOnlyPmfmIds;
+ }
+
+ public abstract Set> getIdentifiersToCheck();
+
+}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIHandler.java
index 7388ec0ba6289ce63244f44deec8241d991d618a..08e6cf1ba56a0d0957bac24fb04b33c83abb81bd 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIHandler.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIHandler.java
@@ -60,6 +60,8 @@ public class SurveyMeasurementsTabUIHandler extends AbstractReefDbUIHandler pmfmIdsToIgnore = ImmutableList.of(getConfig().getDepthValuesPmfmId());
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedRowModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedRowModel.java
index c8de4905f84f4817c9101671ebc67823a843310a..89783e1d96205c7d4c1a4a0f8715392fb48d0cd5 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedRowModel.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedRowModel.java
@@ -36,7 +36,7 @@ public class SurveyMeasurementsGroupedRowModel extends AbstractMeasurementsGroup
*
* @param readOnly a boolean.
*/
- SurveyMeasurementsGroupedRowModel(boolean readOnly) {
+ public SurveyMeasurementsGroupedRowModel(boolean readOnly) {
super(readOnly);
}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableModel.java
index fd7ce8c27675c8ea3e35072fe4131fc2a3ef29e6..6624eec2029e7aa8bf14d2d04d0e565e98fdbd62 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableModel.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableModel.java
@@ -28,6 +28,7 @@ import fr.ifremer.reefdb.dto.data.survey.SurveyDTO;
import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsGroupedTableUIModel;
import fr.ifremer.reefdb.ui.swing.util.table.ReefDbColumnIdentifier;
import org.jdesktop.swingx.table.TableColumnModelExt;
@@ -42,47 +43,46 @@ public class SurveyMeasurementsGroupedTableModel extends AbstractMeasurementsGro
* Identifiant pour la colonne groupe taxon.
*/
public static final ReefDbColumnIdentifier TAXON_GROUP = ReefDbColumnIdentifier.newId(
- SurveyMeasurementsGroupedRowModel.PROPERTY_TAXON_GROUP,
- n("reefdb.property.taxonGroup.short"),
- n("reefdb.survey.measurement.grouped.taxonGroup.tip"),
- TaxonGroupDTO.class);
+ SurveyMeasurementsGroupedRowModel.PROPERTY_TAXON_GROUP,
+ n("reefdb.property.taxonGroup.short"),
+ n("reefdb.survey.measurement.grouped.taxonGroup.tip"),
+ TaxonGroupDTO.class);
/**
* Identifiant pour la colonne taxon.
*/
public static final ReefDbColumnIdentifier TAXON = ReefDbColumnIdentifier.newId(
- SurveyMeasurementsGroupedRowModel.PROPERTY_TAXON,
- n("reefdb.property.taxon"),
- n("reefdb.survey.measurement.grouped.taxon.tip"),
- TaxonDTO.class,
- DecoratorService.WITH_CITATION);
+ SurveyMeasurementsGroupedRowModel.PROPERTY_TAXON,
+ n("reefdb.property.taxon"),
+ n("reefdb.survey.measurement.grouped.taxon.tip"),
+ TaxonDTO.class,
+ DecoratorService.WITH_CITATION);
/**
* Identifiant pour la colonne taxon saisi.
*/
- public static final ReefDbColumnIdentifier INPUT_TAXON_NAME = ReefDbColumnIdentifier.newReadOnlyId(
- SurveyMeasurementsGroupedRowModel.PROPERTY_INPUT_TAXON_NAME,
- n("reefdb.property.inputTaxon"),
- n("reefdb.survey.measurement.grouped.inputTaxon.tip"),
- String.class);
+ public static final ReefDbColumnIdentifier INPUT_TAXON_NAME = ReefDbColumnIdentifier.newId(
+ SurveyMeasurementsGroupedRowModel.PROPERTY_INPUT_TAXON_NAME,
+ n("reefdb.property.inputTaxon"),
+ n("reefdb.survey.measurement.grouped.inputTaxon.tip"),
+ String.class);
/**
* Identifiant pour la colonne valeur.
*/
public static final ReefDbColumnIdentifier COMMENT = ReefDbColumnIdentifier.newId(
- SurveyMeasurementsGroupedRowModel.PROPERTY_COMMENT,
- n("reefdb.property.comment"),
- n("reefdb.survey.measurement.grouped.comment.tip"),
- String.class);
-
+ SurveyMeasurementsGroupedRowModel.PROPERTY_COMMENT,
+ n("reefdb.property.comment"),
+ n("reefdb.survey.measurement.grouped.comment.tip"),
+ String.class);
/**
* Constructor.
*
* @param columnModel Le modele pour les colonnes
*/
- public SurveyMeasurementsGroupedTableModel(final TableColumnModelExt columnModel) {
- super(columnModel);
+ public SurveyMeasurementsGroupedTableModel(final TableColumnModelExt columnModel, boolean createNewRow) {
+ super(columnModel, createNewRow);
}
/**
@@ -110,8 +110,8 @@ public class SurveyMeasurementsGroupedTableModel extends AbstractMeasurementsGro
* {@inheritDoc}
*/
@Override
- public SurveyMeasurementsGroupedTableUIModel getTableUIModel() {
- return (SurveyMeasurementsGroupedTableUIModel) super.getTableUIModel();
+ public AbstractMeasurementsGroupedTableUIModel getTableUIModel() {
+ return (AbstractMeasurementsGroupedTableUIModel) super.getTableUIModel();
}
/**
@@ -122,8 +122,8 @@ public class SurveyMeasurementsGroupedTableModel extends AbstractMeasurementsGro
if (getTableUIModel().getSurvey() != null && getTableUIModel().getSurvey().getProgram() != null) {
return SurveyMeasurementsGroupedTableUIModel.PROPERTY_SURVEY + '_'
- + SurveyDTO.PROPERTY_INDIVIDUAL_PMFMS + '_'
- + getTableUIModel().getSurvey().getProgram().getCode();
+ + SurveyDTO.PROPERTY_INDIVIDUAL_PMFMS + '_'
+ + getTableUIModel().getSurvey().getProgram().getCode();
}
return super.getStateContext();
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUI.jaxx b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUI.jaxx
index 714c8e48a1f1a44867b2af65ee99f17e03ce1f49..9cad090d4c7f228a430dea9e5f478132997f1bd5 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUI.jaxx
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUI.jaxx
@@ -59,9 +59,10 @@
-
-
-
+
+
+
+
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUI.jcss b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUI.jcss
index aa03aac507d704e1be05ca47493a19206c9222d9..b105be5b3167db835b1dd0a9397eb9ec9c5745ed 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUI.jcss
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUI.jcss
@@ -34,21 +34,21 @@
toggledToolTipText: {t("reefdb.table.view.unFullScreen.tip")};
}
-#tableauBasNouveauBouton {
+#newButton {
actionIcon: add;
text: "reefdb.common.new";
toolTipText: "reefdb.survey.measurement.grouped.new.tip";
enabled: {model.getSurvey().isEditable() && !model.getPmfms().isEmpty()};
}
-#tableauBasSupprimerBouton {
+#deleteButton {
actionIcon: delete;
text: "reefdb.common.delete";
toolTipText: "reefdb.survey.measurement.grouped.delete.tip";
enabled: {model.getSurvey().isEditable() && !model.getSelectedRows().isEmpty() && !model.getPmfms().isEmpty()};
}
-#tableauBasDupliquerBouton {
+#duplicateButton {
actionIcon: copy;
text: "reefdb.action.duplicate.label";
toolTipText: "reefdb.action.duplicate.measurement.tip";
@@ -56,6 +56,13 @@
enabled: {model.getSurvey().isEditable() && !model.getSelectedRows().isEmpty() && (model.getSelectedRows().size() == 1) && !model.getPmfms().isEmpty()};
}
+#multiEditButton {
+ actionIcon: edit;
+ text: "reefdb.common.edit";
+ toolTipText: "reefdb.measurement.grouped.multiEdit.tip";
+ enabled: {model.getSurvey().isEditable() && !model.getSelectedRows().isEmpty() && (model.getSelectedRows().size() >= 2) && !model.getPmfms().isEmpty()};
+}
+
#tableBlockLayer {
blockingColor: {handler.getConfig().getColorBlockingLayer()};
block:{model.isLoading()};
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUIHandler.java
index 813381e1f4cf66ca4ebd239e1469118087f8cca5..66732d7381b6cdef309f0b44621e2dd61fb68db6 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUIHandler.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/SurveyMeasurementsGroupedTableUIHandler.java
@@ -30,6 +30,7 @@ import fr.ifremer.reefdb.dto.data.measurement.MeasurementAware;
import fr.ifremer.reefdb.dto.data.measurement.MeasurementDTO;
import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsGroupedTableModel;
import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsGroupedTableUIHandler;
+import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.multiedit.SurveyMeasurementsMultiEditUI;
import jaxx.runtime.SwingUtil;
import org.jdesktop.swingx.table.TableColumnExt;
@@ -89,8 +90,8 @@ public class SurveyMeasurementsGroupedTableUIHandler
super.afterInit(ui);
// Les boutons sont desactives
- getUI().getTableauBasSupprimerBouton().setEnabled(false);
- getUI().getTableauBasDupliquerBouton().setEnabled(false);
+ getUI().getDeleteButton().setEnabled(false);
+ getUI().getDuplicateButton().setEnabled(false);
SwingUtil.setLayerUI(ui.getTableauBasScrollPane(), ui.getTableBlockLayer());
// Keep initial border
@@ -193,10 +194,9 @@ public class SurveyMeasurementsGroupedTableUIHandler
// Colonne commentaire
final TableColumnExt colComment = addCommentColumn(SurveyMeasurementsGroupedTableModel.COMMENT);
- setDefaultColumnMinWidth(colComment);
// Modele de la table
- final SurveyMeasurementsGroupedTableModel tableModel = new SurveyMeasurementsGroupedTableModel(getTable().getColumnModel());
+ final SurveyMeasurementsGroupedTableModel tableModel = new SurveyMeasurementsGroupedTableModel(getTable().getColumnModel(), true);
tableModel.setNoneEditableCols();
getTable().setModel(tableModel);
@@ -221,4 +221,10 @@ public class SurveyMeasurementsGroupedTableUIHandler
getModel().setModify(true);
}
+
+ public void editSelectedMeasurements() {
+
+ editSelectedMeasurements(new SurveyMeasurementsMultiEditUI(getUI()));
+
+ }
}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUI.jaxx b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUI.jaxx
new file mode 100644
index 0000000000000000000000000000000000000000..d6316f7b061d13ff30583815e35eb4900274156e
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUI.jaxx
@@ -0,0 +1,61 @@
+
+
+
+ fr.ifremer.reefdb.ui.swing.ReefDbHelpBroker
+ fr.ifremer.reefdb.ui.swing.ReefDbUIContext
+ fr.ifremer.reefdb.ui.swing.util.ReefDbUI
+ fr.ifremer.quadrige3.ui.swing.ApplicationUI
+ fr.ifremer.quadrige3.ui.swing.ApplicationUIUtil
+
+ java.awt.FlowLayout
+ javax.swing.Box
+ javax.swing.BoxLayout
+ java.awt.BorderLayout
+
+ fr.ifremer.quadrige3.ui.swing.table.SwingTable
+
+ static org.nuiton.i18n.I18n.*
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUI.jcss b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUI.jcss
new file mode 100644
index 0000000000000000000000000000000000000000..69d088d271d06879982def8b24403244e6fef019
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUI.jcss
@@ -0,0 +1,44 @@
+/*
+ * #%L
+ * Reef DB :: UI
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2014 - 2015 Ifremer
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ * #L%
+ */
+
+#surveyMeasurementsMultiEditUI {
+ modal: true;
+ resizable: false;
+ title: "reefdb.measurement.grouped.multiEdit.title";
+}
+
+
+#cancelButton {
+ actionIcon: cancel;
+ text: "reefdb.common.cancel";
+ toolTipText: "reefdb.common.cancel";
+ i18nMnemonic: "reefdb.common.cancel.mnemonic";
+}
+
+#validButton {
+ actionIcon: accept;
+ text: "reefdb.common.validate";
+ toolTipText: "reefdb.common.validate";
+ i18nMnemonic: "reefdb.common.validate.mnemonic";
+ enabled: {model.isValid() && model.isModify()};
+}
\ No newline at end of file
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUIHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..1803d22563ea13706e98ee4633f3b8fff94ce677
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUIHandler.java
@@ -0,0 +1,127 @@
+package fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.multiedit;
+
+/*
+ * #%L
+ * Reef DB :: UI
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2014 - 2015 Ifremer
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ * #L%
+ */
+
+import fr.ifremer.quadrige3.ui.swing.ApplicationUIUtil;
+import fr.ifremer.quadrige3.ui.swing.table.ColumnIdentifier;
+import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementAware;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsMultiEditUIHandler;
+import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.SurveyMeasurementsGroupedRowModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.SurveyMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.SurveyMeasurementsGroupedTableUI;
+import org.jdesktop.swingx.table.TableColumnExt;
+import org.nuiton.jaxx.application.swing.util.Cancelable;
+
+/**
+ * Controleur pour les mesures de l'observation.
+ */
+public class SurveyMeasurementsMultiEditUIHandler
+ extends AbstractMeasurementsMultiEditUIHandler
+ implements Cancelable {
+
+ /**
+ *
Constructor for SurveyMeasurementsMultiEditUIHandler.
+ */
+ public SurveyMeasurementsMultiEditUIHandler() {
+ super();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public AbstractMeasurementsGroupedTableModel getTableModel() {
+ return (SurveyMeasurementsGroupedTableModel) getTable().getModel();
+ }
+
+ @Override
+ protected SurveyMeasurementsMultiEditUIModel createNewModel() {
+ return new SurveyMeasurementsMultiEditUIModel();
+ }
+
+ @Override
+ protected SurveyMeasurementsGroupedRowModel createNewRow(boolean readOnly, MeasurementAware parentBean) {
+ return new SurveyMeasurementsGroupedRowModel(readOnly);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SwingTable getTable() {
+ return getUI().getSurveyGroupedMeasurementMultiEditTable();
+ }
+
+ @Override
+ protected SwingTable getReferentTable() {
+ return ((SurveyMeasurementsGroupedTableUI) ApplicationUIUtil.getParentUI(getUI())).getSurveyGroupedMeasurementTable();
+ }
+
+ /**
+ * Initialisation du tableau.
+ */
+ @Override
+ protected void initTable() {
+
+ // Colonne groupe taxon
+ addColumn(
+ taxonGroupCellEditor,
+ newTableCellRender(SurveyMeasurementsGroupedTableModel.TAXON_GROUP),
+ SurveyMeasurementsGroupedTableModel.TAXON_GROUP);
+
+ // Colonne taxon
+ addColumn(
+ taxonCellEditor,
+ newTableCellRender(SurveyMeasurementsGroupedTableModel.TAXON),
+ SurveyMeasurementsGroupedTableModel.TAXON);
+
+ // Colonne taxon saisi
+ final TableColumnExt colInputTaxon = addColumn(SurveyMeasurementsGroupedTableModel.INPUT_TAXON_NAME);
+ colInputTaxon.setEditable(false);
+
+ // Colonne analyste
+ addColumn(
+ departmentCellEditor,
+ newTableCellRender(AbstractMeasurementsGroupedTableModel.ANALYST),
+ (ColumnIdentifier) AbstractMeasurementsGroupedTableModel.ANALYST);
+
+ // No comment column because comment editor is also a JDialog
+// final TableColumnExt colComment = addCommentColumn(SurveyMeasurementsGroupedTableModel.COMMENT);
+
+ // Modele de la table
+ final SurveyMeasurementsGroupedTableModel tableModel = new SurveyMeasurementsGroupedTableModel(getTable().getColumnModel(), false);
+ tableModel.setNoneEditableCols();
+ getTable().setModel(tableModel);
+
+ // Initialisation de la table
+ initTable(getTable());
+
+ // border
+ addEditionPanelBorder();
+ }
+
+
+}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUIModel.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUIModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..b184008a96e2e43b24057c8d5d7ef9cc6dd8ad7b
--- /dev/null
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/grouped/multiedit/SurveyMeasurementsMultiEditUIModel.java
@@ -0,0 +1,48 @@
+package fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.multiedit;
+
+/*
+ * #%L
+ * Reef DB :: UI
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2014 - 2015 Ifremer
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License
+ * along with this program. If not, see .
+ * #L%
+ */
+
+import com.google.common.collect.ImmutableSet;
+import fr.ifremer.reefdb.dto.data.measurement.MeasurementDTO;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.shared.AbstractMeasurementsMultiEditUIModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.SurveyMeasurementsGroupedRowModel;
+import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.SurveyMeasurementsGroupedTableModel;
+import fr.ifremer.reefdb.ui.swing.util.table.ReefDbColumnIdentifier;
+
+import java.util.Set;
+
+public class SurveyMeasurementsMultiEditUIModel
+ extends AbstractMeasurementsMultiEditUIModel {
+
+ @Override
+ public Set> getIdentifiersToCheck() {
+ return ImmutableSet.of(
+ SurveyMeasurementsGroupedTableModel.TAXON_GROUP,
+ SurveyMeasurementsGroupedTableModel.TAXON,
+ SurveyMeasurementsGroupedTableModel.INPUT_TAXON_NAME,
+ (ReefDbColumnIdentifier) AbstractMeasurementsGroupedTableModel.ANALYST
+ );
+ }
+}
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/ungrouped/SurveyMeasurementsUngroupedTableUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/ungrouped/SurveyMeasurementsUngroupedTableUIHandler.java
index 0ae103fe921285e34d879a8d9cef01539fc9df09..092b7a83c9ef513b99f3175e09074c0d88b84c85 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/ungrouped/SurveyMeasurementsUngroupedTableUIHandler.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/ungrouped/SurveyMeasurementsUngroupedTableUIHandler.java
@@ -175,7 +175,9 @@ public class SurveyMeasurementsUngroupedTableUIHandler
getContext().restoreComponentFromSwingSession(getTable());
// hide analyst if no pmfm
- forceColumnVisibleAtLastPosition(SurveyMeasurementsUngroupedTableModel.ANALYST, notEmpty);
+// forceColumnVisibleAtLastPosition(SurveyMeasurementsUngroupedTableModel.ANALYST, notEmpty);
+ // Don't force position (Mantis #49537)
+ forceColumnVisible(SurveyMeasurementsUngroupedTableModel.ANALYST, notEmpty);
// Install save state listener
installSaveTableStateListener();
diff --git a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/util/table/AbstractReefDbTableUIHandler.java b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/util/table/AbstractReefDbTableUIHandler.java
index c96767e34cbd030a8f86a855791ee2f2e05113c5..951a01d2d3ae5b6dfcd2d963b112898455063035 100644
--- a/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/util/table/AbstractReefDbTableUIHandler.java
+++ b/reefdb-ui-swing/src/main/java/fr/ifremer/reefdb/ui/swing/util/table/AbstractReefDbTableUIHandler.java
@@ -27,6 +27,8 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import fr.ifremer.quadrige3.core.dao.technical.Assert;
import fr.ifremer.quadrige3.ui.swing.table.AbstractTableUIHandler;
+import fr.ifremer.quadrige3.ui.swing.table.ColumnIdentifier;
+import fr.ifremer.quadrige3.ui.swing.table.HiddenColumn;
import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
import fr.ifremer.quadrige3.ui.swing.table.action.AdditionalTableActions;
import fr.ifremer.quadrige3.ui.swing.table.renderer.ColorCheckBoxRenderer;
@@ -296,12 +298,26 @@ public abstract class AbstractReefDbTableUIHandler beans) {
if (CollectionUtils.isNotEmpty(beans)) {
// Get all columns
- List columns = getTable().getColumns(true).stream().filter(Objects::nonNull).map(TableColumnExt.class::cast).collect(Collectors.toList());
+ List columns = getTable().getColumns(true).stream()
+ .filter(Objects::nonNull).filter(tableColumn -> !(tableColumn instanceof HiddenColumn))
+ .map(TableColumnExt.class::cast).collect(Collectors.toList());
// Build map of columns indexed by property name
Map map = Maps.uniqueIndex(columns, column -> {
Assert.notNull(column);
@@ -329,7 +348,7 @@ public abstract class AbstractReefDbTableUIHandler.
+ * #L%
+ */
+
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.table.TableCellRenderer;
+import java.awt.Component;
+
+import static org.nuiton.i18n.I18n.t;
+
+/**
+ * @author peck7 on 24/01/2020.
+ */
+public class MultipleValueCellRenderer implements TableCellRenderer {
+
+ private final TableCellRenderer delegate;
+ private final JLabel multiValueLabel;
+
+ public MultipleValueCellRenderer(TableCellRenderer delegate) {
+ this.delegate = delegate;
+ multiValueLabel = createMultiValueLabel();
+ }
+
+ private JLabel createMultiValueLabel() {
+ JLabel label = new JLabel(t("reefdb.measurement.grouped.multiEdit.multiValueLabel"));
+ label.setOpaque(true);
+ return label;
+ }
+
+ @Override
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+ return value == null
+ ? multiValueLabel
+ : delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+ }
+}
diff --git a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/home/HomeUIModel-error-validation.xml b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/home/HomeUIModel-error-validation.xml
index 23c350619085cde3bf6d91b01c35ddefa07b8bd0..a0139bdf84cb30dea64d8e1cfe13263d7789f198 100644
--- a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/home/HomeUIModel-error-validation.xml
+++ b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/home/HomeUIModel-error-validation.xml
@@ -35,7 +35,7 @@
error
- none
+ error
@@ -46,7 +46,7 @@
error
- none
+ error
diff --git a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/home/HomeUIModel-warning-validation.xml b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/home/HomeUIModel-warning-validation.xml
index b85618514843c93029c584d09f0bfcff1ad4525b..869662646dbf85bcf31a9770dbb0ba075001b619 100644
--- a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/home/HomeUIModel-warning-validation.xml
+++ b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/home/HomeUIModel-warning-validation.xml
@@ -31,14 +31,14 @@
warning
- all
+ warning
warning
- all
+ warning
diff --git a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/OperationMeasurementsTabUIModel-error-validation.xml b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/OperationMeasurementsTabUIModel-error-validation.xml
index b0720251132cd49e5bd3e07dccf7791652f10dca..20aecfe354646da12dc1ce1d5320f0cd8a10215d 100644
--- a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/OperationMeasurementsTabUIModel-error-validation.xml
+++ b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/OperationMeasurementsTabUIModel-error-validation.xml
@@ -35,7 +35,7 @@
error
- none
+ error
@@ -46,7 +46,7 @@
error
- none
+ error
diff --git a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/OperationMeasurementsTabUIModel-warning-validation.xml b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/OperationMeasurementsTabUIModel-warning-validation.xml
index e6f549fc753d26dfdacf3693ba8fa65829473f2c..71fcd454babd48a95a0f35663759e84fd384d587 100644
--- a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/OperationMeasurementsTabUIModel-warning-validation.xml
+++ b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/operation/measurement/OperationMeasurementsTabUIModel-warning-validation.xml
@@ -31,14 +31,14 @@
warning
- all
+ warning
warning
- all
+ warning
diff --git a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIModel-error-validation.xml b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIModel-error-validation.xml
index c628cf9aed4e61604bfe04283efbcc746678cfbb..62eb7196378d80e03e6d6312980d9436fb2d3002 100644
--- a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIModel-error-validation.xml
+++ b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIModel-error-validation.xml
@@ -35,7 +35,7 @@
error
- none
+ error
@@ -46,7 +46,7 @@
error
- none
+ error
diff --git a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIModel-warning-validation.xml b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIModel-warning-validation.xml
index 5b13df23efee5918128fd4ad000b13a9490ae88b..4eceb89fbd4df45439e9eace23a417eac0a3ddcd 100644
--- a/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIModel-warning-validation.xml
+++ b/reefdb-ui-swing/src/main/resources/fr/ifremer/reefdb/ui/swing/content/observation/survey/measurement/SurveyMeasurementsTabUIModel-warning-validation.xml
@@ -30,11 +30,15 @@
+ warning
+ warning
+ warning
+ warning
diff --git a/reefdb-ui-swing/src/main/resources/i18n/reefdb-ui-swing_en_GB.properties b/reefdb-ui-swing/src/main/resources/i18n/reefdb-ui-swing_en_GB.properties
index 2de25c0aab3dfeb454a968ba9f38279a4d974212..a739c8e900a10da02b3dbdae47202f432051c3e5 100644
--- a/reefdb-ui-swing/src/main/resources/i18n/reefdb-ui-swing_en_GB.properties
+++ b/reefdb-ui-swing/src/main/resources/i18n/reefdb-ui-swing_en_GB.properties
@@ -873,6 +873,9 @@ reefdb.measurement.grouped.duplicates=
reefdb.measurement.grouped.duplicates.taxonUnique=
reefdb.measurement.grouped.incoherentQualitativeAndNumericalValues=
reefdb.measurement.grouped.invalidGroupedRule=
+reefdb.measurement.grouped.multiEdit.multiValueLabel=
+reefdb.measurement.grouped.multiEdit.tip=
+reefdb.measurement.grouped.multiEdit.title=
reefdb.observation.label=
reefdb.observation.onglet.prelevement.general.bouton.effacer.tip=
reefdb.observation.onglet.prelevement.general.selection.commentaire.label=
diff --git a/reefdb-ui-swing/src/main/resources/i18n/reefdb-ui-swing_fr_FR.properties b/reefdb-ui-swing/src/main/resources/i18n/reefdb-ui-swing_fr_FR.properties
index f1050ce548a3fb0da8b4c75b7ca388383aa32f8a..cdb2485ff1741535a3bb10e68f73109d6d57eba8 100644
--- a/reefdb-ui-swing/src/main/resources/i18n/reefdb-ui-swing_fr_FR.properties
+++ b/reefdb-ui-swing/src/main/resources/i18n/reefdb-ui-swing_fr_FR.properties
@@ -161,9 +161,9 @@ reefdb.action.photo.export.chooseDirectory.buttonLabel=Exporter
reefdb.action.photo.export.chooseDirectory.title=Sélection du répertoire pour l'exportation des photos
reefdb.action.photo.export.done=Exportation réussie dans le répertoire\: %s
reefdb.action.photo.export.title=Exportation des photos
-reefdb.action.photo.import.chooseFile.buttonLabel=Sélectionnez une photo
+reefdb.action.photo.import.chooseFile.buttonLabel=Sélectionnez des photos
reefdb.action.photo.import.chooseFile.filterDescription=Fichier %s uniquement
-reefdb.action.photo.import.chooseFile.title=Sélection de la photo à importer
+reefdb.action.photo.import.chooseFile.title=Sélection des photos à importer
reefdb.action.photo.import.fileTooLarge.message=La taille de l’image est trop importante pour être téléchargée par le système. Taille maximum autorisée\: %d octets (soit %s)
reefdb.action.photo.loading=Chargement de la photo
reefdb.action.save.analysisInstruments=Sauvegarde des engins d'analyse
@@ -672,10 +672,8 @@ reefdb.home.samplingOperation.title=3/ Liste des réplicats
reefdb.home.survey.changeStatus=Changer Etat
reefdb.home.survey.control=Contrôler
reefdb.home.survey.duplicate.coordinate=Dupliquer les coordonnées
-reefdb.home.survey.duplicate.help=Simple \: Seul l'observation sera dupliquée Complète \: L'observation et ses réplicats seront dupliqués
-reefdb.home.survey.duplicate.message=Sélectionner le type de duplication souhaité
-reefdb.home.survey.duplicate.option.full=Duplication complète
-reefdb.home.survey.duplicate.option.simple=Duplication simple
+reefdb.home.survey.duplicate.option.full=Observation + réplicats
+reefdb.home.survey.duplicate.option.simple=Observation seule
reefdb.home.survey.duplicate.surveyMeasurements=Dupliquer les mesures de l'observation
reefdb.home.survey.duplicate.title=Choix du type de duplication
reefdb.home.survey.edit=Général
@@ -891,6 +889,9 @@ reefdb.measurement.grouped.duplicates=Un taxon ou un groupe de taxon est présen
reefdb.measurement.grouped.duplicates.taxonUnique=Un taxon ou un groupe de taxon est présent plusieurs fois pour une même valeur du mesures \: %s
reefdb.measurement.grouped.incoherentQualitativeAndNumericalValues=La valeur du paramètre '%s' n'est pas cohérente avec la valeur du paramètre '%s'. Vérifiez votre saisie.
reefdb.measurement.grouped.invalidGroupedRule=Au moins une ces valeurs doit être renseignées\: %s
+reefdb.measurement.grouped.multiEdit.multiValueLabel=\#\#\#\#\#\#\#\#
+reefdb.measurement.grouped.multiEdit.tip=Modification des lignes sélectionnées
+reefdb.measurement.grouped.multiEdit.title=Modification des lignes sélectionnées
reefdb.observation.label=Observation \:
reefdb.observation.onglet.prelevement.general.bouton.effacer.tip=Effacer toutes les valeurs 'profondeur précise'
reefdb.observation.onglet.prelevement.general.selection.commentaire.label=Commentaire
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ccdd2fb6033a0ae5d7b1789c3daa5e3bf02862d1..fcd947530e74fe9d9d7eb4c3119113f115712931 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,107 @@
+
+
+ RulePrecondQualUIHandler: adjust preconditioned qualitative values double list size
+
+
+ Report of issue #50455
+
+
+ Change reefdb.transcribingItemType.label.pmfmExtraction default value to REEFDB-PMFM-EXTRACT.PMFM_NM
+
+
+ Upgrade quadrige3-core to version 3.6.10
+
+
+ Extraction: use measurements REMOTE_ID instead of local id
+
+
+
+
+
+ Change reefdb.transcribingItemType.label.pmfmExtraction default value to REEFDB-PMFM-EXTRACTION.PMFM_NM
+
+
+ Photo import can select multiple files
+
+
+ Extraction: fix createCommonTable query
+
+
+ Observation save: Postpone model modify state
+
+
+
+
+
+ New extraction perform service using xmlQuery (version 1.1+)
+
+
+ Pmfmu labels are transcribed with specific label for extraction, if exists, or with "screen" label
+
+
+ DuplicateSurveyAction: postpone duplicate line insertion in Swing thread
+
+
+ Empty result won't crash on referential search
+
+
+ MultiEdit: sampling operation is detected correctly and pmfm ids for transition length calculated are read-only
+
+
+
+
+
+ Change EIS nexus url
+
+
+ Add multiline edition dialog for survey's and operation's grouped measurement tables
+
+
+ RuleControl: The model can be valid if control is valid
+
+
+
+
+
+ Opening qualitative values modal from PMFMU will now load correctly the qualitative values from selected parameter
+
+
+ Delete a rule list which is selected in selection combobox will be removed before reload
+
+
+ Recompute rows valid state when a sampling operation is removed
+
+
+ HomeUI: default program filter now includes local programs
+
+
+ Update title on context change
+ Taxon group and taxon filters in measurement screens are initialized once and avoid circular effect
+
+
+ Don't force the analyst column at the last column
+
+
+ ControlRuleTable: Stop table edition to avoid rendering exception
+
+
+ ImportSynchroAction: If user cancel the program selection, then cancel synchro
+
+
+ Set default pmfm column min width
+
+
+ DuplicateSurveyAction: Change message and buttons
+
+
+ RuleControl: The model can be valid if control is valid
+ For now, only HomeUI is done...
+
+
+
Upgrade quadrige3-core version 3.6.3.2