Observe-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
August 2022
- 1 participants
- 12 discussions
[Git][ultreiaio/ird-observe][develop] Client - Aucune barre de progression Closes #2409
by Tony CHEMIT (@tchemit) 03 Aug '22
by Tony CHEMIT (@tchemit) 03 Aug '22
03 Aug '22
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
cede2ae6 by Tony Chemit at 2022-08-03T11:23:52+02:00
Client - Aucune barre de progression Closes #2409
- - - - -
22 changed files:
- client/core/src/main/java/fr/ird/observe/client/ClientUIContext.java
- client/core/src/main/java/fr/ird/observe/client/ClientUIContextApi.java
- client/core/src/main/java/fr/ird/observe/client/WithClientUIContextApi.java
- client/core/src/main/java/fr/ird/observe/client/main/MainUIModel.java
- client/core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx
- client/core/src/main/java/fr/ird/observe/client/main/ObserveMainUIHandler.java
- client/core/src/main/java/fr/ird/observe/client/main/focus/MainUIFocusModel.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/DataSourceEditorBodyContent.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogHandler.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogModel.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/DeleteEdit.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/DataSourceEditorMenu.jaxx
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/DataSourceEditorMenuModel.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/NavigationTree.java
- toolkit/api/src/main/i18n/getters/java.getter
- toolkit/api/src/main/i18n/translations/toolkit_en_GB.properties
- toolkit/api/src/main/i18n/translations/toolkit_es_ES.properties
- toolkit/api/src/main/i18n/translations/toolkit_fr_FR.properties
- toolkit/api/src/main/java/fr/ird/observe/navigation/tree/navigation/NavigationTreeSelectionModel.java
- toolkit/api/src/main/java/fr/ird/observe/navigation/tree/navigation/NavigationTreeSupport.java
- client/core/src/main/java/fr/ird/observe/client/util/busy/BusyLayerUI.java → toolkit/api/src/main/java/fr/ird/observe/spi/ui/BusyLayerUI.java
- client/core/src/main/java/fr/ird/observe/client/util/busy/BusyModel.java → toolkit/api/src/main/java/fr/ird/observe/spi/ui/BusyModel.java
Changes:
=====================================
client/core/src/main/java/fr/ird/observe/client/ClientUIContext.java
=====================================
@@ -33,7 +33,7 @@ import fr.ird.observe.client.main.body.NoBodyContentComponent;
import fr.ird.observe.client.main.callback.ObserveUICallbackManager;
import fr.ird.observe.client.main.focus.MainUIFocusModel;
import fr.ird.observe.client.util.action.ObserveExecutorService;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import fr.ird.observe.client.util.session.ObserveSwingSessionHelper;
import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPresetsManager;
import fr.ird.observe.navigation.id.IdProjectManager;
=====================================
client/core/src/main/java/fr/ird/observe/client/ClientUIContextApi.java
=====================================
@@ -32,7 +32,7 @@ import fr.ird.observe.client.main.ObserveMainUI;
import fr.ird.observe.client.main.callback.ObserveUICallbackManager;
import fr.ird.observe.client.main.focus.MainUIFocusModel;
import fr.ird.observe.client.util.UIHelper;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import fr.ird.observe.client.util.session.ObserveSwingSessionHelper;
import fr.ird.observe.dto.ObserveUtil;
import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPresetsManager;
=====================================
client/core/src/main/java/fr/ird/observe/client/WithClientUIContextApi.java
=====================================
@@ -31,7 +31,7 @@ import fr.ird.observe.client.main.MainUIModel;
import fr.ird.observe.client.main.ObserveMainUI;
import fr.ird.observe.client.main.callback.ObserveUICallbackManager;
import fr.ird.observe.client.main.focus.MainUIFocusModel;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import fr.ird.observe.client.util.session.ObserveSwingSessionHelper;
import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPresetsManager;
import fr.ird.observe.navigation.id.IdProjectManager;
=====================================
client/core/src/main/java/fr/ird/observe/client/main/MainUIModel.java
=====================================
@@ -24,7 +24,7 @@ package fr.ird.observe.client.main;
import fr.ird.observe.client.configuration.ClientConfig;
import fr.ird.observe.client.main.focus.MainUIFocusModel;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import io.ultreia.java4all.bean.AbstractJavaBean;
import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition;
=====================================
client/core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx
=====================================
@@ -22,7 +22,7 @@
<import>
fr.ird.observe.client.util.JMenuWithAccelerator
- fr.ird.observe.client.util.busy.BusyModel
+ fr.ird.observe.spi.ui.BusyModel
fr.ird.observe.client.configuration.ClientConfig
fr.ird.observe.client.main.MainUIModel
fr.ird.observe.client.main.body.MainUIBodyContentManager
=====================================
client/core/src/main/java/fr/ird/observe/client/main/ObserveMainUIHandler.java
=====================================
@@ -27,8 +27,8 @@ import fr.ird.observe.client.configuration.ClientConfig;
import fr.ird.observe.client.main.body.MainUIBodyContentManager;
import fr.ird.observe.client.util.ObserveKeyStrokesSupport;
import fr.ird.observe.client.util.UIHelper;
-import fr.ird.observe.client.util.busy.BusyLayerUI;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyLayerUI;
+import fr.ird.observe.spi.ui.BusyModel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.nuiton.jaxx.runtime.spi.UIHandler;
=====================================
client/core/src/main/java/fr/ird/observe/client/main/focus/MainUIFocusModel.java
=====================================
@@ -22,7 +22,7 @@ package fr.ird.observe.client.main.focus;
* #L%
*/
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/DataSourceEditorBodyContent.java
=====================================
@@ -44,7 +44,7 @@ import fr.ird.observe.client.main.ObserveMainUI;
import fr.ird.observe.client.main.body.MainUIBodyContent;
import fr.ird.observe.client.main.focus.MainUIFocusModel;
import fr.ird.observe.client.util.UIHelper;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import fr.ird.observe.dto.ProgressionModel;
import fr.ird.observe.dto.ProtectedIdsCommon;
import fr.ird.observe.dto.db.BabModelVersionException;
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogHandler.java
=====================================
@@ -25,7 +25,7 @@ package fr.ird.observe.client.datasource.editor.api.avdth;
import fr.ird.observe.client.WithClientUIContextApi;
import fr.ird.observe.client.util.ObserveBlockingLayerUI;
import fr.ird.observe.client.util.UIHelper;
-import fr.ird.observe.client.util.busy.BusyLayerUI;
+import fr.ird.observe.spi.ui.BusyLayerUI;
import fr.ird.observe.client.util.init.UIInitHelper;
import fr.ird.observe.dto.referential.common.OceanReference;
import fr.ird.observe.dto.referential.ps.common.ProgramReference;
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogModel.java
=====================================
@@ -27,7 +27,7 @@ import fr.ird.observe.client.configuration.ClientConfig;
import fr.ird.observe.client.datasource.api.ObserveSwingDataSource;
import fr.ird.observe.client.datasource.validation.ContentMessageTableModel;
import fr.ird.observe.client.main.focus.FocusDispatcher;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import fr.ird.observe.dto.ProgressionModel;
import fr.ird.observe.services.service.data.ps.AvdthDataImportConfiguration;
import fr.ird.observe.services.service.data.ps.AvdthDataImportResult;
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/DeleteEdit.java
=====================================
@@ -29,7 +29,7 @@ import fr.ird.observe.client.datasource.editor.api.content.ContentUIHandler;
import fr.ird.observe.client.datasource.editor.api.content.data.edit.ContentEditUI;
import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree;
import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import fr.ird.observe.dto.IdDto;
import fr.ird.observe.dto.data.EditableDto;
import fr.ird.observe.spi.decoration.DecoratorService;
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/DataSourceEditorMenu.jaxx
=====================================
@@ -18,20 +18,7 @@
#L%
-->
<JMenu id='menuStorage'>
-
- <!-- <import>-->
- <!-- fr.ird.observe.client.main.MainUIModel-->
- <!-- fr.ird.observe.client.util.busy.BusyModel-->
- <!-- fr.ird.observe.client.util.UIHelper-->
- <!-- java.util.Locale-->
- <!-- java.awt.Dimension-->
- <!-- javax.swing.BoxLayout-->
- <!-- javax.swing.JComponent-->
- <!-- </import>-->
-
<DataSourceEditorMenuModel id="uiModel" initializer="getContextValue(DataSourceEditorMenuModel.class)"/>
- <!-- <BusyModel id='busyModel' initializer='uiModel.getBusyModel()'/>-->
- <!-- <MainUIModel id="mainUiModel" initializer="uiModel.getMainUIModel()"/>-->
<JMenuItem id='changeStorage'/>
<JMenuItem id='reloadStorage' styleClass="optional"/>
<JMenuItem id='closeStorage' styleClass="optional"/>
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/DataSourceEditorMenuModel.java
=====================================
@@ -30,7 +30,7 @@ import fr.ird.observe.client.main.MainUIModel;
import fr.ird.observe.client.main.body.MainUIBodyContentManager;
import fr.ird.observe.client.main.body.NoBodyContentComponent;
import fr.ird.observe.client.util.UIHelper;
-import fr.ird.observe.client.util.busy.BusyModel;
+import fr.ird.observe.spi.ui.BusyModel;
import io.ultreia.java4all.bean.AbstractJavaBean;
import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition;
import org.apache.logging.log4j.LogManager;
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/NavigationTree.java
=====================================
@@ -93,7 +93,7 @@ public class NavigationTree extends JXTree implements WithClientUIContextApi {
@Override
public void updateUI() {
- setSelectionModel(new NavigationTreeSelectionModel());
+ setSelectionModel(new NavigationTreeSelectionModel(getBusyModel()));
super.updateUI();
}
=====================================
toolkit/api/src/main/i18n/getters/java.getter
=====================================
@@ -87,3 +87,4 @@ observe.ui.datasource.storage.error.rest.password.required
observe.ui.datasource.storage.error.rest.user.required
observe.ui.datasource.storage.error.rest.user.unknown
observe.ui.message.warning.will.be.delete
+observe.ui.tree.loading.node
=====================================
toolkit/api/src/main/i18n/translations/toolkit_en_GB.properties
=====================================
@@ -155,3 +155,4 @@ observe.ui.datasource.storage.error.rest.password.required=Password is mandatory
observe.ui.datasource.storage.error.rest.user.required=User login is mandatory
observe.ui.datasource.storage.error.rest.user.unknown=User "%s" is not defined on server
observe.ui.message.warning.will.be.delete=%1$s\n\nBe ware, export will replace existing data.
+observe.ui.tree.loading.node=Loading selected node
=====================================
toolkit/api/src/main/i18n/translations/toolkit_es_ES.properties
=====================================
@@ -155,3 +155,4 @@ observe.ui.datasource.storage.error.rest.password.required=Le contraseña es obl
observe.ui.datasource.storage.error.rest.user.required=El usuario es obligatorio
observe.ui.datasource.storage.error.rest.user.unknown=El usuario "%s" no es conocido del servidor
observe.ui.message.warning.will.be.delete=%1$s\n\nAtención, la exportación reemplazará la marea existente.
+observe.ui.tree.loading.node=Loading selected node
=====================================
toolkit/api/src/main/i18n/translations/toolkit_fr_FR.properties
=====================================
@@ -155,3 +155,4 @@ observe.ui.datasource.storage.error.rest.password.required=Le mot de passe est o
observe.ui.datasource.storage.error.rest.user.required=L'utilisateur est obligatoire
observe.ui.datasource.storage.error.rest.user.unknown=L'utilisateur "%s" est inconnu sur le serveur
observe.ui.message.warning.will.be.delete=%1$s\n\nAttention, l'export remplacera la marée existante.
+observe.ui.tree.loading.node=Chargement du nœud sélectionné
=====================================
toolkit/api/src/main/java/fr/ird/observe/navigation/tree/navigation/NavigationTreeSelectionModel.java
=====================================
@@ -25,9 +25,12 @@ package fr.ird.observe.navigation.tree.navigation;
import fr.ird.observe.navigation.tree.navigation.event.NavigationTreeSelectionEvent;
import fr.ird.observe.navigation.tree.navigation.event.NavigationTreeSelectionListener;
import fr.ird.observe.navigation.tree.navigation.event.NavigationTreeSelectionVetoException;
+import fr.ird.observe.spi.ui.BusyModel;
+import io.ultreia.java4all.i18n.I18n;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import javax.swing.SwingUtilities;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.ExpandVetoException;
@@ -47,8 +50,10 @@ public class NavigationTreeSelectionModel extends DefaultTreeSelectionModel {
private static final Logger log = LogManager.getLogger(NavigationTreeSelectionModel.class);
private boolean skipCheckPreviousContent;
+ private final BusyModel busyModel;
- public NavigationTreeSelectionModel() {
+ public NavigationTreeSelectionModel(BusyModel busyModel) {
+ this.busyModel = busyModel;
setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
}
@@ -84,29 +89,35 @@ public class NavigationTreeSelectionModel extends DefaultTreeSelectionModel {
return;
}
TreePath path = pPaths[0];
- boolean[] newness = new boolean[pPaths.length];
- Arrays.fill(newness, true);
- NavigationTreeSelectionEvent event = new NavigationTreeSelectionEvent(this, pPaths, newness, getLeadSelectionPath(), path, skipCheckPreviousContent);
boolean canChange = !Objects.equals(path, getSelectionPath());
if (canChange) {
+ boolean[] newness = new boolean[pPaths.length];
+ Arrays.fill(newness, true);
+ NavigationTreeSelectionEvent event = new NavigationTreeSelectionEvent(this, pPaths, newness, getLeadSelectionPath(), path, skipCheckPreviousContent);
try {
fireVetoValueChanged(event);
} catch (NavigationTreeSelectionVetoException e) {
canChange = false;
}
}
-
-// boolean canChange = skipCheckPreviousContent || (!Objects.equals(path, getSelectionPath()) && contentUIManager.closeSelectedContentUI());
if (!canChange) {
// cancel the change of node
log.warn(String.format("Do not change selection path: %s against: %s", path, getSelectionPath()));
return;
}
-// FIXME Move this in a listener
-// if (skipCheckPreviousContent) {
-// contentUIManager.closeSafeSelectedContentUI();
-// }
- super.setSelectionPaths(pPaths);
+ // can now safely select new path
+ if (busyModel == null) {
+ super.setSelectionPaths(pPaths);
+ } else {
+ busyModel.addTask(I18n.t("observe.ui.tree.loading.node"));
+ SwingUtilities.invokeLater(() -> {
+ try {
+ setSelectionPaths(pPaths);
+ } finally {
+ busyModel.popTask();
+ }
+ });
+ }
}
@Override
=====================================
toolkit/api/src/main/java/fr/ird/observe/navigation/tree/navigation/NavigationTreeSupport.java
=====================================
@@ -54,7 +54,7 @@ public class NavigationTreeSupport<R extends NavigationTreeNode, M extends Navig
@Override
public void updateUI() {
- setSelectionModel(new NavigationTreeSelectionModel());
+ setSelectionModel(new NavigationTreeSelectionModel(null));
super.updateUI();
}
=====================================
client/core/src/main/java/fr/ird/observe/client/util/busy/BusyLayerUI.java → toolkit/api/src/main/java/fr/ird/observe/spi/ui/BusyLayerUI.java
=====================================
@@ -1,8 +1,8 @@
-package fr.ird.observe.client.util.busy;
+package fr.ird.observe.spi.ui;
/*-
* #%L
- * ObServe Client :: Core
+ * ObServe Toolkit :: API
* %%
* Copyright (C) 2008 - 2022 IRD, Ultreia.io
* %%
=====================================
client/core/src/main/java/fr/ird/observe/client/util/busy/BusyModel.java → toolkit/api/src/main/java/fr/ird/observe/spi/ui/BusyModel.java
=====================================
@@ -1,8 +1,8 @@
-package fr.ird.observe.client.util.busy;
+package fr.ird.observe.spi.ui;
/*-
* #%L
- * ObServe Client :: Core
+ * ObServe Toolkit :: API
* %%
* Copyright (C) 2008 - 2022 IRD, Ultreia.io
* %%
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/cede2ae6468add47a13e0b1ee…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/cede2ae6468add47a13e0b1ee…
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe][develop] Dans l'assistant rapport, ajouter un export CSV - Closes #2259
by Tony CHEMIT (@tchemit) 03 Aug '22
by Tony CHEMIT (@tchemit) 03 Aug '22
03 Aug '22
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
512468e8 by Tony Chemit at 2022-08-03T09:49:49+02:00
Dans l'assistant rapport, ajouter un export CSV - Closes #2259
- - - - -
28 changed files:
- client/configuration/src/main/config/Client.ini
- client/configuration/src/main/i18n/getters/config.getter
- client/configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java
- client/core/src/main/java/fr/ird/observe/client/main/body/ClientConfigUI.java
- client/core/src/main/resources/observe-ui.properties
- client/datasource/actions/src/main/i18n/getters/java.getter
- client/datasource/actions/src/main/i18n/getters/jaxx.getter
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/ObserveKeyStrokesActions.java
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUI.jaxx
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUI.jcss
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUIHandler.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUI.jaxx
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUI.jcss
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUIHandler.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ResultTableModel.java
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ChooseExportCsvDirectory.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/CopyResultToClipboard.java → client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ExportToClipboard.java
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ExportToCsv.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ToggleConfigure.java
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ToggleExport.java
- + client/datasource/actions/src/main/resources/icons/action-export-csv.png
- + client/datasource/actions/src/main/resources/icons/action-format-csv.png
- client/runner/src/main/i18n/translations/client-runner_en_GB.properties
- client/runner/src/main/i18n/translations/client-runner_es_ES.properties
- client/runner/src/main/i18n/translations/client-runner_fr_FR.properties
- toolkit/api/src/main/java/fr/ird/observe/dto/ObserveUtil.java
- toolkit/api/src/main/java/fr/ird/observe/dto/report/DataMatrix.java
Changes:
=====================================
client/configuration/src/main/config/Client.ini
=====================================
@@ -409,6 +409,14 @@ defaultValue = ${instance.data.directory}/tmp
final = true
transient = true
+[option exportDirectory]
+description = observe.config.exportDirectory.description
+key = instance.export.directory
+type = file
+defaultValue = ${instance.data.directory}/export
+final = true
+transient = true
+
[option navigationEditModelFile]
description = observe.config.ui.tree.edit.nodes
key = instance.ui.file.tree.edit.nodes
=====================================
client/configuration/src/main/i18n/getters/config.getter
=====================================
@@ -38,6 +38,7 @@ observe.config.defaultReportDirectory.description
observe.config.defaultReportFile.description
observe.config.defaultResourcesDirectory.description
observe.config.defaultValidationReportDirectory.description
+observe.config.exportDirectory.description
observe.config.feedBackDirectory.description
observe.config.h2.can.editReferential.description
observe.config.h2.can.migrate.description
=====================================
client/configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java
=====================================
@@ -430,6 +430,9 @@ public class ClientConfig extends GeneratedClientConfig implements TripMapConfig
log.info(message);
ClientResources.ObserveSwingPreferences.copyResource(preferencesFile);
}
+
+ // 11 - export directory
+ createDirectory(ClientConfigOption.EXPORT_DIRECTORY);
}
public void detectLocalDataBase() {
=====================================
client/core/src/main/java/fr/ird/observe/client/main/body/ClientConfigUI.java
=====================================
@@ -415,6 +415,7 @@ public class ClientConfigUI extends JXTitledPanel implements WithClientUIContext
helper.addOption(ClientConfigOption.DATA_DIRECTORY);
helper.addOption(ClientConfigOption.DB_DIRECTORY);
helper.addOption(ClientConfigOption.BACKUP_DIRECTORY);
+ helper.addOption(ClientConfigOption.EXPORT_DIRECTORY);
helper.addOption(ClientConfigOption.LOG_DIRECTORY);
helper.addOption(ClientConfigOption.IMPORT_DIRECTORY);
helper.addOption(ClientConfigOption.TEMPORARY_DIRECTORY);
=====================================
client/core/src/main/resources/observe-ui.properties
=====================================
@@ -229,6 +229,7 @@ icon.action.wizard-pause=action-wizard-pause-16.png
icon.action.wizard-refresh=action-wizard-refresh-16.png
icon.action.wizard-config=action-wizard-config-16.png
icon.action.wizard-message=action-wizard-message-16.png
+icon.action.export-csv=action-export-csv.png
# couleurs au format (r,g,b)
icon.Table.removeIcon=action-delete.png
color.Table.lastRowColor=255,255,0
=====================================
client/datasource/actions/src/main/i18n/getters/java.getter
=====================================
@@ -9,6 +9,7 @@ observe.ui.action.admin.close
observe.ui.action.apply
observe.ui.action.cancel
observe.ui.action.choose.db.dump.directory
+observe.ui.action.choose.export.csv.directory
observe.ui.action.choose.reportFile
observe.ui.action.choose.reportFile.description
observe.ui.action.close
@@ -19,6 +20,7 @@ observe.ui.action.configuration.tip
observe.ui.action.continue
observe.ui.action.copy.to.clipBoard
observe.ui.action.do.backup.tip
+observe.ui.action.export.tip
observe.ui.action.goto.next.stage
observe.ui.action.goto.next.stage.tip
observe.ui.action.goto.previous.stage
@@ -69,6 +71,9 @@ observe.ui.datasource.editor.actions.pairing.tip
observe.ui.datasource.editor.actions.pairing.title
observe.ui.datasource.editor.actions.report
observe.ui.datasource.editor.actions.report.description
+observe.ui.datasource.editor.actions.report.exportToCsv
+observe.ui.datasource.editor.actions.report.exportToCsv.done
+observe.ui.datasource.editor.actions.report.exportToCsv.tip
observe.ui.datasource.editor.actions.report.no.report.found
observe.ui.datasource.editor.actions.report.report.count.found
observe.ui.datasource.editor.actions.report.title
@@ -175,6 +180,7 @@ observe.ui.menu.actions
observe.ui.message.no.report.selected
observe.ui.message.select.report
observe.ui.title.choose.db.dump.directory
+observe.ui.title.choose.export.csv.directory
observe.ui.title.choose.reportFile
observe.ui.title.storage.info
observe.ui.tree.action.collapseAll.tip
=====================================
client/datasource/actions/src/main/i18n/getters/jaxx.getter
=====================================
@@ -11,6 +11,7 @@ observe.info.selected.validators
observe.info.validation.credentials
observe.ui.action.show.properties
observe.ui.action.show.properties.tip
+observe.ui.choice.cancel.tip
observe.ui.datasource.editor.actions.operation.configuration
observe.ui.datasource.editor.actions.operations
observe.ui.datasource.editor.actions.report.auto.copy.to.clipboard
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/ObserveKeyStrokesActions.java
=====================================
@@ -39,6 +39,9 @@ public class ObserveKeyStrokesActions extends ObserveKeyStrokesEditorApi {
public static final KeyStroke KEY_STROKE_DATA_SYNCHRO_COPY_RIGHT = KeyStroke.getKeyStroke("pressed F9");
public static final KeyStroke KEY_STROKE_DATA_SYNCHRO_DELETE_RIGHT = KeyStroke.getKeyStroke("pressed F10");
+ public static final KeyStroke KEY_STROKE_EXPORT_POPUP = KeyStroke.getKeyStroke("pressed F10");
+ public static final KeyStroke KEY_STROKE_EXPORT_CLIPBOARD = KeyStroke.getKeyStroke("pressed F2");
+ public static final KeyStroke KEY_STROKE_EXPORT_CSV = KeyStroke.getKeyStroke("pressed F3");
public static final KeyStroke KEY_STROKE_EXIT = KeyStroke.getKeyStroke("alt pressed F");
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUI.jaxx
=====================================
@@ -0,0 +1,60 @@
+<!--
+ #%L
+ ObServe Client :: DataSource :: Actions
+ %%
+ Copyright (C) 2008 - 2022 IRD, Ultreia.io
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ You should have received a copy of the GNU General Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/gpl-3.0.html>.
+ #L%
+ -->
+<Table id="reportConfig">
+ <import>
+ java.io.File
+ javax.swing.Box
+ javax.swing.BoxLayout
+ java.awt.Dimension
+
+ static fr.ird.observe.client.util.UIHelper.getStringValue
+ </import>
+ <ReportModel id='stepModel' initializer='getContextValue(ReportModel.class)'/>
+ <row>
+ <cell anchor="west">
+ <JLabel id="directoryLabel"/>
+ </cell>
+ <cell weightx='1' fill="horizontal">
+ <JTextField id='directoryText' onKeyReleased='getHandler().changeDirectory(new File(((JTextField)event.getSource()).getText()))'/>
+ </cell>
+ <cell anchor="east">
+ <JButton id="chooseExportCsvDirectory"/>
+ </cell>
+ </row>
+ <row>
+ <cell anchor="west">
+ <JLabel id="fileLabel"/>
+ </cell>
+ <cell weightx='1' fill="horizontal" columns="2">
+ <JTextField id='filenameText' onKeyReleased='getHandler().changeFilename(((JTextField)event.getSource()).getText())'/>
+ </cell>
+ </row>
+ <row>
+ <cell columns="3" anchor="west" fill="both">
+ <JPanel id='actions' layout="{new BoxLayout(actions, BoxLayout.Y_AXIS)}">
+ <JPanel id="cancelMessagePanel" layout="{new GridLayout(0, 1)}">
+ <JSeparator constructorParams="JSeparator.HORIZONTAL"/>
+ <JLabel id="cancelMessage" styleClass="information italic"/>
+ <Component initializer="Box.createRigidArea(new Dimension(10, 5))"/>
+ </JPanel>
+ </JPanel>
+ </cell>
+ </row>
+</Table>
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUI.jcss
=====================================
@@ -0,0 +1,41 @@
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2022 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+#directoryLabel {
+ text:"observe.Common.directory";
+}
+
+#directoryText {
+ text:{stepModel.getExportCsvFile().getParent()};
+}
+
+#fileLabel {
+ text:"observe.Common.file";
+}
+
+#filenameText {
+ text:{stepModel.getExportCsvFileName()};
+}
+
+#cancelMessage {
+ text:"observe.ui.choice.cancel.tip";
+}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUIHandler.java
=====================================
@@ -0,0 +1,51 @@
+package fr.ird.observe.client.datasource.actions.report;
+
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2022 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import fr.ird.observe.dto.ObserveUtil;
+import org.nuiton.jaxx.runtime.spi.UIHandler;
+
+import java.io.File;
+
+/**
+ * Created on 02/08/2022.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.0.7
+ */
+public class CsvExportUIHandler implements UIHandler<CsvExportUI> {
+ private CsvExportUI ui;
+
+ @Override
+ public void beforeInit(CsvExportUI ui) {
+ this.ui = ui;
+ }
+
+ public void changeDirectory(File f) {
+ ui.getStepModel().setExportCsvFile(new File(f, ObserveUtil.addCsvExtension(ui.getStepModel().getExportCsvFileName())));
+ }
+
+ public void changeFilename(String filename) {
+ ui.getStepModel().setExportCsvFile(new File(ui.getDirectoryText().getText(), ObserveUtil.addCsvExtension(filename)));
+ }
+}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java
=====================================
@@ -27,6 +27,7 @@ import fr.ird.observe.client.datasource.actions.AdminStep;
import fr.ird.observe.client.datasource.actions.AdminUIModel;
import fr.ird.observe.client.datasource.actions.config.SelectDataModel;
import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
+import fr.ird.observe.dto.ObserveUtil;
import fr.ird.observe.dto.report.Report;
import fr.ird.observe.dto.report.ReportBuilder;
import fr.ird.observe.navigation.tree.selection.SelectionTreeConfig;
@@ -41,6 +42,7 @@ import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -57,6 +59,8 @@ import java.util.stream.Collectors;
@GenerateJavaBeanDefinition
public class ReportModel extends AdminActionModel {
+ public static final String EXPORT_CSV_FILE_PROPERTY_NAME = "exportCsvFile";
+ public static final String EXPORT_CSV_FILE_NAME_PROPERTY_NAME = "exportCsvFileName";
public static final String SELECTED_REPORT_PROPERTY_NAME = "selectedReport";
public static final String REPORTS_PROPERTY_NAME = "reports";
@@ -115,6 +119,10 @@ public class ReportModel extends AdminActionModel {
* Pour copier les entêtes de colonnes
*/
protected boolean copyColumnHeaders = true;
+ /**
+ * Where to do optional csv export.
+ */
+ protected File exportCsvFile = new File("");
private List<Report> allReports;
private SelectDataModel selectDataModel;
@@ -125,6 +133,22 @@ public class ReportModel extends AdminActionModel {
addPropertyChangeListener(REPORT_FILE_PROPERTY_NAME, evt -> updateReports());
}
+ public File getExportCsvFile() {
+ return exportCsvFile;
+ }
+
+ public void setExportCsvFile(File exportCsvFile) {
+ File oldValue = getExportCsvFile();
+ String oldBackupFileName = getExportCsvFileName();
+ this.exportCsvFile = exportCsvFile;
+ firePropertyChange(EXPORT_CSV_FILE_PROPERTY_NAME, oldValue, exportCsvFile);
+ firePropertyChange(EXPORT_CSV_FILE_NAME_PROPERTY_NAME, oldBackupFileName, getExportCsvFileName());
+ }
+
+ public String getExportCsvFileName() {
+ return ObserveUtil.removeCsvExtension(exportCsvFile.getName());
+ }
+
@Override
public void start(AdminUIModel uiModel) {
@@ -341,4 +365,7 @@ public class ReportModel extends AdminActionModel {
log.info(String.format("Detects %d report(s).", reports.size()));
}
+ public File newExportCsvFile() {
+ return new File(getClientConfig().getExportDirectory(), String.format("export-%1$s--%2$tF--%2$tk-%2$tM-%2$tS.csv", Objects.requireNonNull(getSelectedReport()).getId().replaceAll("\\.", "_"), new Date()));
+ }
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUI.jaxx
=====================================
@@ -50,31 +50,22 @@ public void destroy() {
]]>
</script>
<JPanel id='PENDING_content' layout='{new BorderLayout()}'>
-<!-- <JPanel id='northPanel' constraints='BorderLayout.NORTH' layout='{new GridLayout(1, 2)}'>-->
- <JXTitledPanel id="configurationPane" contentContainer="{configurationPanel}" constraints='BorderLayout.NORTH'>
- <JPanel id="configurationPanel" layout='{new BorderLayout()}'>
- <JPanel id='requestSelectorPane' constraints='BorderLayout.NORTH' layout='{new BorderLayout()}'>
- <JToolBar id='toolbar' constraints='BorderLayout.WEST'>
- <JButton id="resetSelectedReport" onActionPerformed="getHandler().updateSelectedReport(null)"/>
- </JToolBar>
- <JComboBox id='reportSelector' constraints='BorderLayout.CENTER' onItemStateChanged='getHandler().updateSelectedReportFromEvent(event)'/>
- </JPanel>
- <JScrollPane id='reportVariableSelectorPane' constraints='BorderLayout.CENTER'>
- <JPanel id='reportVariableSelectorPanel' layout="{new GridLayout(0,1)}"/>
- </JScrollPane>
- <JScrollPane id='reportDescriptionPane' constraints='BorderLayout.SOUTH'>
- <JTextArea id='reportDescription'/>
- </JScrollPane>
+ <JXTitledPanel id="configurationPane" contentContainer="{configurationPanel}" constraints='BorderLayout.NORTH'>
+ <JPanel id="configurationPanel" layout='{new BorderLayout()}'>
+ <JPanel id='requestSelectorPane' constraints='BorderLayout.NORTH' layout='{new BorderLayout()}'>
+ <JToolBar id='toolbar' constraints='BorderLayout.WEST'>
+ <JButton id="resetSelectedReport" onActionPerformed="getHandler().updateSelectedReport(null)" styleClass="enabledIfReportSelected"/>
+ </JToolBar>
+ <JComboBox id='reportSelector' constraints='BorderLayout.CENTER' onItemStateChanged='getHandler().updateSelectedReportFromEvent(event)'/>
</JPanel>
- </JXTitledPanel>
-<!-- <JPanel id="copyPane" layout='{new BorderLayout()}'>-->
-<!-- <JPanel id='copyOptions' constraints='BorderLayout.NORTH' beanScope="stepModel" layout="{new GridLayout(0,1)}">-->
-<!-- <BeanCheckBox id='autoCopyToClipboard'/>-->
-<!-- <BeanCheckBox id='copyRowHeaders'/>-->
-<!-- <BeanCheckBox id='copyColumnHeaders'/>-->
-<!-- </JPanel>-->
-<!-- </JPanel>-->
-<!-- </JPanel>-->
+ <JScrollPane id='reportVariableSelectorPane' constraints='BorderLayout.CENTER'>
+ <JPanel id='reportVariableSelectorPanel' layout="{new GridLayout(0,1)}"/>
+ </JScrollPane>
+ <JScrollPane id='reportDescriptionPane' constraints='BorderLayout.SOUTH'>
+ <JTextArea id='reportDescription'/>
+ </JScrollPane>
+ </JPanel>
+ </JXTitledPanel>
<JXTitledPanel id="resultPanel" constraints='BorderLayout.CENTER' contentContainer="{resultPane}" rightDecoration='{titleRightToolBar}'>
<JScrollPane id='resultPane'>
<JXTable id='resultTable'/>
@@ -84,8 +75,12 @@ public void destroy() {
<BeanCheckBox id='copyRowHeaders'/>
<BeanCheckBox id='copyColumnHeaders'/>
</JPopupMenu>
+ <JPopupMenu id='exportPopup'>
+ <JMenuItem id='exportToClipboard' styleClass="enabledIfReportSelected"/>
+ <JMenuItem id='exportToCsv' styleClass="enabledIfReportSelected"/>
+ </JPopupMenu>
<JToolBar id='titleRightToolBar'>
- <JButton id="copyResultToClipboard"/>
+ <JToggleButton id='toggleExport'/>
<JToggleButton id='toggleConfigure'/>
</JToolBar>
</JXTitledPanel>
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUI.jcss
=====================================
@@ -30,6 +30,10 @@ BeanCheckBox {
bean:{stepModel};
}
+.enabledIfReportSelected {
+ enabled:{stepModel.getSelectedReport() != null};
+}
+
#reportVariableSelectorPanel {
border:{new TitledBorder(t("observe.ui.datasource.editor.actions.report.variables") + " ")};
}
@@ -76,7 +80,6 @@ BeanCheckBox {
#resetSelectedReport {
actionIcon:"combobox-reset";
toolTipText:"observe.ui.datasource.editor.actions.synchro.report.reset.tip";
- enabled:{stepModel.getSelectedReport() != null};
mnemonic:R;
}
@@ -94,7 +97,3 @@ BeanCheckBox {
text:"observe.ui.datasource.editor.actions.report.copy.column.headers";
toolTipText:"observe.ui.datasource.editor.actions.report.copy.column.headers.tip";
}
-
-#copyResultToClipboard {
- enabled:{stepModel.isValid()};
-}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUIHandler.java
=====================================
@@ -24,7 +24,7 @@ package fr.ird.observe.client.datasource.actions.report;
import fr.ird.observe.client.datasource.actions.AdminTabUIHandler;
import fr.ird.observe.client.datasource.actions.AdminUIModel;
import fr.ird.observe.client.datasource.actions.config.ConfigUI;
-import fr.ird.observe.client.datasource.actions.report.actions.CopyResultToClipboard;
+import fr.ird.observe.client.datasource.actions.report.actions.ExportToClipboard;
import fr.ird.observe.client.datasource.api.ObserveSwingDataSource;
import fr.ird.observe.client.util.ObserveSwingTechnicalException;
import fr.ird.observe.client.util.UIHelper;
@@ -319,7 +319,7 @@ public class ReportUIHandler extends AdminTabUIHandler<ReportUI> implements UIHa
// mise a jour du clipboard automatique si requis
if (stepModel.isAutoCopyToClipboard()) {
- CopyResultToClipboard.copyReportToClipBoard(report, stepModel);
+ ExportToClipboard.copyReportToClipBoard(report, stepModel);
}
} catch (Exception e) {
stepModel.getResultModel().clear();
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ResultTableModel.java
=====================================
@@ -220,6 +220,14 @@ public class ResultTableModel extends AbstractTableModel {
}
public String getClipboardContent(boolean copyRowHeaders, boolean copyColumnHeaders) {
+ return getDataContent(copyRowHeaders, copyColumnHeaders, true,'\t');
+ }
+
+ public String getCsvContent() {
+ return getDataContent(true, true, true, ';');
+ }
+
+ public String getDataContent(boolean copyRowHeaders, boolean copyColumnHeaders, boolean escapeCell, char separator) {
if (data == null) {
return "";
}
@@ -234,9 +242,9 @@ public class ResultTableModel extends AbstractTableModel {
String rowName = getColumnName(i);
columns.setValue(i, 0, rowName);
});
- result = columns.getClipboardContent(true, true, false, '\t');
+ result = columns.getClipboardContent(true, true, escapeCell, separator);
}
- result += data.getClipboardContent(copyRowHeaders || !withRowHeader, true, false, '\t');
+ result += data.getClipboardContent(copyRowHeaders || !withRowHeader, true, escapeCell, separator);
return result;
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ChooseExportCsvDirectory.java
=====================================
@@ -0,0 +1,59 @@
+package fr.ird.observe.client.datasource.actions.report.actions;
+
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2022 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import fr.ird.observe.client.datasource.actions.ObserveKeyStrokesActions;
+import fr.ird.observe.client.datasource.actions.report.CsvExportUI;
+import fr.ird.observe.client.util.UIFileHelper;
+import org.nuiton.jaxx.runtime.swing.action.JComponentActionSupport;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+
+import static io.ultreia.java4all.i18n.I18n.t;
+
+/**
+ * Created on 02/08/2022.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.0.7
+ */
+public class ChooseExportCsvDirectory extends JComponentActionSupport<CsvExportUI> {
+
+ public ChooseExportCsvDirectory() {
+ super("", t("observe.ui.action.choose.export.csv.directory"), "fileChooser", ObserveKeyStrokesActions.KEY_STROKE_STORAGE_DO_CHOOSE_FILE);
+ }
+
+ @Override
+ protected void doActionPerformed(ActionEvent e, CsvExportUI ui) {
+ File f = UIFileHelper.chooseDirectory(
+ ui,
+ t("observe.ui.title.choose.export.csv.directory"),
+ t("observe.ui.action.choose.export.csv.directory"),
+ new File(ui.getDirectoryText().getText())
+ );
+ if (f != null) {
+ ui.getHandler().changeDirectory(f);
+ }
+ }
+}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/CopyResultToClipboard.java → client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ExportToClipboard.java
=====================================
@@ -22,6 +22,7 @@ package fr.ird.observe.client.datasource.actions.report.actions;
* #L%
*/
+import fr.ird.observe.client.datasource.actions.ObserveKeyStrokesActions;
import fr.ird.observe.client.datasource.actions.actions.AdminTabUIActionSupport;
import fr.ird.observe.client.datasource.actions.report.ReportModel;
import fr.ird.observe.client.datasource.actions.report.ReportUI;
@@ -35,12 +36,16 @@ import java.awt.event.ActionEvent;
import static io.ultreia.java4all.i18n.I18n.t;
-public class CopyResultToClipboard extends AdminTabUIActionSupport<ReportUI> {
+public class ExportToClipboard extends AdminTabUIActionSupport<ReportUI> {
- private static final Logger log = LogManager.getLogger(CopyResultToClipboard.class);
+ private static final Logger log = LogManager.getLogger(ExportToClipboard.class);
- public CopyResultToClipboard() {
- super(""/*t("observe.ui.action.copy")*/, t("observe.ui.datasource.editor.actions.synchro.copy.tip"), "report-copy", 'C');
+ public ExportToClipboard() {
+ super("observe.ui.datasource.editor.actions.report.exportToClipboard",
+ t("observe.ui.datasource.editor.actions.synchro.copy.tip"),
+ "report-copy",
+ ObserveKeyStrokesActions.KEY_STROKE_EXPORT_CLIPBOARD);
+ setCheckMenuItemIsArmed(false);
}
public static void copyReportToClipBoard(Report report, ReportModel stepModel) {
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ExportToCsv.java
=====================================
@@ -0,0 +1,147 @@
+package fr.ird.observe.client.datasource.actions.report.actions;
+
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2022 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import fr.ird.observe.client.datasource.actions.ObserveKeyStrokesActions;
+import fr.ird.observe.client.datasource.actions.actions.AdminTabUIActionSupport;
+import fr.ird.observe.client.datasource.actions.report.CsvExportUI;
+import fr.ird.observe.client.datasource.actions.report.ReportModel;
+import fr.ird.observe.client.datasource.actions.report.ReportUI;
+import fr.ird.observe.client.datasource.actions.report.ResultTableModel;
+import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi;
+import fr.ird.observe.client.datasource.usage.UsageUIHandlerSupport;
+import fr.ird.observe.client.util.UIHelper;
+import fr.ird.observe.dto.ObserveUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.nuiton.jaxx.runtime.context.JAXXInitialContext;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.KeyStroke;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Objects;
+
+import static io.ultreia.java4all.i18n.I18n.t;
+
+/**
+ * Created on 02/08/2022.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.0.7
+ */
+public class ExportToCsv extends AdminTabUIActionSupport<ReportUI> implements PropertyChangeListener {
+
+ private static final Logger log = LogManager.getLogger(ExportToClipboard.class);
+ private JButton applyButton;
+
+ public ExportToCsv() {
+ super(t("observe.ui.datasource.editor.actions.report.exportToCsv"),
+ t("observe.ui.datasource.editor.actions.report.exportToCsv.tip"),
+ "export-csv",
+ ObserveKeyStrokesActions.KEY_STROKE_EXPORT_CSV);
+ setCheckMenuItemIsArmed(false);
+ }
+
+ @Override
+ protected void doActionPerformed(ActionEvent e, ReportUI ui) {
+ ReportModel stepModel = ui.getStepModel();
+ JAXXInitialContext context = new JAXXInitialContext().add(stepModel);
+ CsvExportUI exportUi = new CsvExportUI(context);
+ KeyStroke keyStroke = ObserveKeyStrokesActions.KEY_STROKE_ALT_ENTER;
+
+ String applyText = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.action.apply"), keyStroke);
+
+
+ Object[] options = {applyText};
+
+
+ JOptionPane optionPane = new JOptionPane(exportUi, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]);
+
+ applyButton = UsageUIHandlerSupport.findButton(optionPane, applyText);
+ Objects.requireNonNull(applyButton).setEnabled(false);
+
+ stepModel.addPropertyChangeListener(ReportModel.EXPORT_CSV_FILE_PROPERTY_NAME, this);
+
+ try {
+ AbstractAction applyAction = new AbstractAction() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ applyButton.doClick();
+ }
+ };
+
+ applyAction.putValue(Action.ACCELERATOR_KEY, keyStroke);
+ applyAction.putValue(Action.NAME, applyText);
+ applyAction.putValue(Action.SMALL_ICON, UIHelper.getContentActionIcon("save"));
+
+ applyButton.setIcon(UIHelper.getContentActionIcon("save"));
+
+ InputMap inputMap = optionPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+ inputMap.put((KeyStroke) applyAction.getValue(Action.ACCELERATOR_KEY), "apply");
+
+ ActionMap actionMap = optionPane.getActionMap();
+ actionMap.put("apply", applyAction);
+
+ File exportFile = stepModel.newExportCsvFile();
+ ui.getStepModel().setExportCsvFile(exportFile);
+
+ int response = UIHelper.askUser(getMainUI(), optionPane, new Dimension(600, 220), t("observe.ui.datasource.editor.actions.report.exportToCsv.tip"), options);
+
+ boolean accept = response == 0;
+ if (accept) {
+ Path exportCsvFile = stepModel.getExportCsvFile().toPath();
+ ResultTableModel model = stepModel.getResultModel();
+ String content = model.getCsvContent();
+ log.info("Export csv to: " + exportCsvFile);
+ try {
+ Files.write(exportCsvFile, content.getBytes(StandardCharsets.UTF_8));
+ } catch (IOException ex) {
+ throw new RuntimeException("Can't export csv to file: " + exportCsvFile, ex);
+ }
+ setUiStatus(t("observe.ui.datasource.editor.actions.report.exportToCsv.done", exportCsvFile));
+ }
+ } finally {
+ stepModel.removePropertyChangeListener(ReportModel.EXPORT_CSV_FILE_PROPERTY_NAME, this);
+ }
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ File exportFile = (File) evt.getNewValue();
+ applyButton.setEnabled(exportFile != null && !exportFile.exists() && ObserveUtil.withCsvExtension(exportFile.getName()));
+ }
+}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ToggleConfigure.java
=====================================
@@ -45,7 +45,6 @@ public class ToggleConfigure extends AdminTabUIActionSupport<ReportUI> {
public ToggleConfigure() {
super("", n("observe.ui.action.configuration.tip"), "generate", ObserveKeyStrokesEditorApi.KEY_STROKE_NAVIGATION_CONFIGURE);
-// setIcon(getContentScaledImage("configure"));
}
@Override
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ToggleExport.java
=====================================
@@ -0,0 +1,82 @@
+package fr.ird.observe.client.datasource.actions.report.actions;
+
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2022 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import fr.ird.observe.client.datasource.actions.ObserveKeyStrokesActions;
+import fr.ird.observe.client.datasource.actions.actions.AdminTabUIActionSupport;
+import fr.ird.observe.client.datasource.actions.report.ReportUI;
+import org.nuiton.jaxx.runtime.swing.action.MenuAction;
+
+import javax.swing.JComponent;
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import java.awt.event.ActionEvent;
+
+import static io.ultreia.java4all.i18n.I18n.n;
+
+/**
+ * Created on 02/08/2022.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.0.7
+ */
+public class ToggleExport extends AdminTabUIActionSupport<ReportUI> {
+
+ public ToggleExport() {
+ super("", n("observe.ui.action.export.tip"), "data-export", ObserveKeyStrokesActions.KEY_STROKE_EXPORT_POPUP);
+ }
+
+ @Override
+ public void init() {
+ super.init();
+ ui.getExportPopup().addPopupMenuListener(new PopupMenuListener() {
+ @Override
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ }
+
+ @Override
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+ ui.getToggleExport().setSelected(false);
+ }
+
+ @Override
+ public void popupMenuCanceled(PopupMenuEvent e) {
+ ui.getToggleExport().setSelected(false);
+ }
+ });
+ }
+
+ @Override
+ protected void doActionPerformed(ActionEvent e, ReportUI ui) {
+ ui.getToggleExport().setSelected(true);
+ SwingUtilities.invokeLater(() -> {
+ JComponent c = ui.getToggleExport();
+ JPopupMenu p = ui.getExportPopup();
+ MenuAction.preparePopup(p, c, false);
+ });
+ }
+
+}
+
=====================================
client/datasource/actions/src/main/resources/icons/action-export-csv.png
=====================================
Binary files /dev/null and b/client/datasource/actions/src/main/resources/icons/action-export-csv.png differ
=====================================
client/datasource/actions/src/main/resources/icons/action-format-csv.png
=====================================
Binary files /dev/null and b/client/datasource/actions/src/main/resources/icons/action-format-csv.png differ
=====================================
client/runner/src/main/i18n/translations/client-runner_en_GB.properties
=====================================
@@ -55,6 +55,7 @@ observe.config.defaultReportDirectory.description=Default directory where to sto
observe.config.defaultReportFile.description=Default report file to use
observe.config.defaultResourcesDirectory.description=Default user resources directory
observe.config.defaultValidationReportDirectory.description=Default validation report directory
+observe.config.exportDirectory.description=Default export directory for user export.
observe.config.feedBackDirectory.description=FeedBack directory
observe.config.h2.can.editReferential.description=Local database can edit referential
observe.config.h2.can.migrate.description=Flag to know if you can migrate h2 data sources
@@ -315,6 +316,7 @@ observe.ui.action.choose.avdth.file.description=AVDTH Database (*.mdb)
observe.ui.action.choose.db.dump=Choose the backup
observe.ui.action.choose.db.dump.description=Database backup (*.sql.gz)
observe.ui.action.choose.db.dump.directory=Choose the backup directory
+observe.ui.action.choose.export.csv.directory=Choose csv export directory
observe.ui.action.choose.reportFile=Choose the reports file
observe.ui.action.choose.reportFile.description=Report's file (*.properties)
observe.ui.action.close=Close
@@ -360,6 +362,7 @@ observe.ui.action.duplicate.remote.tip=Duplicate remote
observe.ui.action.duplicate.server.tip=Duplicate server
observe.ui.action.exit=Quit
observe.ui.action.exit.tip=quit Observe
+observe.ui.action.export.tip=Export
observe.ui.action.goDown.tip=Go down in navigation tree
observe.ui.action.goUp.tip=Go up in navigation tree
observe.ui.action.goto.next.stage=Next step
@@ -531,6 +534,10 @@ observe.ui.datasource.editor.actions.report.copy.column.headers.tip=Add in resul
observe.ui.datasource.editor.actions.report.copy.row.headers=Copy row header
observe.ui.datasource.editor.actions.report.copy.row.headers.tip=Add in result row headers
observe.ui.datasource.editor.actions.report.description=Generate reports
+observe.ui.datasource.editor.actions.report.exportToClipboard=Clipboard
+observe.ui.datasource.editor.actions.report.exportToCsv=CSV
+observe.ui.datasource.editor.actions.report.exportToCsv.done=Csv export done at %s
+observe.ui.datasource.editor.actions.report.exportToCsv.tip=Export to csv
observe.ui.datasource.editor.actions.report.no.report.found=No report found.
observe.ui.datasource.editor.actions.report.report.count.found=Found %s reports.
observe.ui.datasource.editor.actions.report.report.description=Description of selected report
@@ -827,6 +834,7 @@ observe.ui.title.can.not.export.obstuna=Could not export data...
observe.ui.title.choose.avdth.file=Select avdth file
observe.ui.title.choose.db.dump=Choose a database backup
observe.ui.title.choose.db.dump.directory=Choose directory of backup
+observe.ui.title.choose.export.csv.directory=Choose directory of csv export
observe.ui.title.choose.reportFile=Choose report definition file
observe.ui.title.confirmReplace=Confirm to replace
observe.ui.title.connect.existingDB=Connect to existing database
=====================================
client/runner/src/main/i18n/translations/client-runner_es_ES.properties
=====================================
@@ -55,6 +55,7 @@ observe.config.defaultReportDirectory.description=Directorio por defecto de los
observe.config.defaultReportFile.description=Default report file to use
observe.config.defaultResourcesDirectory.description=Directorio de almacenamiento de los recursos de usuario como las traducciones o la consultas de informes
observe.config.defaultValidationReportDirectory.description=Directorio por defecto de almacenamiento de los informes de validación
+observe.config.exportDirectory.description=Default export directory for user export.
observe.config.feedBackDirectory.description=FeedBack directory \#TODO
observe.config.h2.can.editReferential.description=Para poder editar el referencial de una base local
observe.config.h2.can.migrate.description=Autorizar la actualización de las bases locales (h2)
@@ -315,6 +316,7 @@ observe.ui.action.choose.avdth.file.description=AVDTH Database (*.mdb) \#TODO
observe.ui.action.choose.db.dump=Elegir la copia de seguridad
observe.ui.action.choose.db.dump.description=Copia de seguridad de la base (*.sql.gz)
observe.ui.action.choose.db.dump.directory=Elegir el directorio de la copia de seguridad
+observe.ui.action.choose.export.csv.directory=Choisir le répertoire de l'export csv
observe.ui.action.choose.reportFile=Elegir el archivo de definición de informe
observe.ui.action.choose.reportFile.description=Archivo de definición (*.properties)
observe.ui.action.close=Cerrar
@@ -360,6 +362,7 @@ observe.ui.action.duplicate.remote.tip=Duplicate remote \#TODO
observe.ui.action.duplicate.server.tip=Duplicate server \#TODO
observe.ui.action.exit=Salir
observe.ui.action.exit.tip=Salir de ObServe
+observe.ui.action.export.tip=Export
observe.ui.action.goDown.tip=Descender hacia etapas porteriores
observe.ui.action.goUp.tip=Ascender hacia etapas anteriores
observe.ui.action.goto.next.stage=Siguiente
@@ -531,6 +534,10 @@ observe.ui.datasource.editor.actions.report.copy.column.headers.tip=Añadir al r
observe.ui.datasource.editor.actions.report.copy.row.headers=Copiar las cabeceras de linea
observe.ui.datasource.editor.actions.report.copy.row.headers.tip=Añadir al resultado las cabeceras de linea (ej. la primera columna)
observe.ui.datasource.editor.actions.report.description=Generar los cuadros de síntesis del informe de fin del embarque
+observe.ui.datasource.editor.actions.report.exportToClipboard=Clipboard
+observe.ui.datasource.editor.actions.report.exportToCsv=CSV
+observe.ui.datasource.editor.actions.report.exportToCsv.done=Csv export done at %s
+observe.ui.datasource.editor.actions.report.exportToCsv.tip=Export to csv
observe.ui.datasource.editor.actions.report.no.report.found=No report found. \#TODO
observe.ui.datasource.editor.actions.report.report.count.found=Found %s reports. \#TODO
observe.ui.datasource.editor.actions.report.report.description=Descripción del informe seleccionado
@@ -827,6 +834,7 @@ observe.ui.title.can.not.export.obstuna=Impossible exportar los datos...
observe.ui.title.choose.avdth.file=Select avdth file \#TODO
observe.ui.title.choose.db.dump=Seleccionar una copia de seguridad de base local
observe.ui.title.choose.db.dump.directory=Seleccionar e directorio de destinación de la copia de seguridad
+observe.ui.title.choose.export.csv.directory=Choose directory of csv export
observe.ui.title.choose.reportFile=Seleccionar el archivo de definición de los informes
observe.ui.title.confirmReplace=Confirmar para reemplazar
observe.ui.title.connect.existingDB=Conexión a una fuente de datos que ya existe
=====================================
client/runner/src/main/i18n/translations/client-runner_fr_FR.properties
=====================================
@@ -55,6 +55,7 @@ observe.config.defaultReportDirectory.description=Répertoire par défaut des ra
observe.config.defaultReportFile.description=Fichier par défaut des rapports de l'application
observe.config.defaultResourcesDirectory.description=Répertoire où sont stockées les ressources.
observe.config.defaultValidationReportDirectory.description=Répertoire où sont stockés les rapports de validation
+observe.config.exportDirectory.description=Le répertoire par défaut pour les exports.
observe.config.feedBackDirectory.description=Répertoire où sont consigner les feedback
observe.config.h2.can.editReferential.description=Pour pouvoir éditer le référentiel d'une base locale
observe.config.h2.can.migrate.description=Autoriser la mise à jour des bases locales (H2)
@@ -315,6 +316,7 @@ observe.ui.action.choose.avdth.file.description=Base AVDTH (*.mdb)
observe.ui.action.choose.db.dump=Choisir la sauvegarde
observe.ui.action.choose.db.dump.description=Sauvegarde de base (*.sql.gz)
observe.ui.action.choose.db.dump.directory=Choisir le répertoire de sauvegarde
+observe.ui.action.choose.export.csv.directory=Choisir le répertoire de l'export csv
observe.ui.action.choose.reportFile=Choisir le fichier de définition de report
observe.ui.action.choose.reportFile.description=Fichier de définition (*.properties)
observe.ui.action.close=Fermer
@@ -360,6 +362,7 @@ observe.ui.action.duplicate.remote.tip=Duplicate la connexion distante
observe.ui.action.duplicate.server.tip=Duplicate la connexion server
observe.ui.action.exit=Quitter
observe.ui.action.exit.tip=Quitter ObServe
+observe.ui.action.export.tip=Exporter
observe.ui.action.goDown.tip=Descendre dans la navigation
observe.ui.action.goUp.tip=Remonter dans la navigation
observe.ui.action.goto.next.stage=Suivant
@@ -531,6 +534,10 @@ observe.ui.datasource.editor.actions.report.copy.column.headers.tip=Ajoute dans
observe.ui.datasource.editor.actions.report.copy.row.headers=Copier les entêtes de ligne
observe.ui.datasource.editor.actions.report.copy.row.headers.tip=Ajoute dans le résultat les entêtes de ligne (i.e la première colonne)
observe.ui.datasource.editor.actions.report.description=Générer les tableaux de synthèse du rapport de fin d'embarquement
+observe.ui.datasource.editor.actions.report.exportToClipboard=Presse papier
+observe.ui.datasource.editor.actions.report.exportToCsv=Csv
+observe.ui.datasource.editor.actions.report.exportToCsv.done=Export csv sauvegardé dans le fichier %s
+observe.ui.datasource.editor.actions.report.exportToCsv.tip=Exporter au format Csv
observe.ui.datasource.editor.actions.report.no.report.found=Aucun rapport trouvé.
observe.ui.datasource.editor.actions.report.report.count.found=%s rapports détectés.
observe.ui.datasource.editor.actions.report.report.description=Description du rapport sélectionné
@@ -827,6 +834,7 @@ observe.ui.title.can.not.export.obstuna=Impossible d'exporter des données...
observe.ui.title.choose.avdth.file=Choisir une base AVDTH
observe.ui.title.choose.db.dump=Choisir une sauvegarder de base locale
observe.ui.title.choose.db.dump.directory=Choisir le répertoire de destination de la sauvegarde
+observe.ui.title.choose.export.csv.directory=Choisir le répertoire de destination de l'export csc
observe.ui.title.choose.reportFile=Choisir le fichier de définition des reports
observe.ui.title.confirmReplace=Confirmation de remplacement
observe.ui.title.connect.existingDB=Connexion à une source de données existante
=====================================
toolkit/api/src/main/java/fr/ird/observe/dto/ObserveUtil.java
=====================================
@@ -62,7 +62,9 @@ import java.util.function.Supplier;
public class ObserveUtil {
public static final String SQL_GZ_EXTENSION_PATTERN = "^.+\\.sql\\.gz|.+\\.SQL\\.GZ$";
+ public static final String CSV_EXTENSION_PATTERN = "^.+\\.csv|.+\\.CSV$";
public static final String SQL_GZ_EXTENSION = ".sql.gz";
+ public static final String CSV_EXTENSION = ".csv";
public static final String PROPERTIES_EXTENSION_PATTERN = "^.+\\.properties|.+\\.PROPERTIES$";
public static final String PROPERTIES_EXTENSION = ".properties";
public static final String PNG_EXTENSION_PATTERN = "^.+\\.png|.+\\.PNG$";
@@ -150,6 +152,24 @@ public class ObserveUtil {
return filePath.endsWith(SQL_GZ_EXTENSION);
}
+ public static String addCsvExtension(String filePath) {
+ if (!filePath.endsWith(CSV_EXTENSION)) {
+ filePath += CSV_EXTENSION;
+ }
+ return filePath;
+ }
+
+ public static String removeCsvExtension(String filePath) {
+ if (filePath.endsWith(CSV_EXTENSION)) {
+ filePath = Strings.removeEnd(filePath, CSV_EXTENSION);
+ }
+ return filePath;
+ }
+
+ public static boolean withCsvExtension(String filePath) {
+ return filePath.endsWith(CSV_EXTENSION);
+ }
+
public static ScriptEngine getScriptEngine() {
ScriptEngineManager factory = new ScriptEngineManager();
return factory.getEngineByName(JS_ENGINE_NAME);
=====================================
toolkit/api/src/main/java/fr/ird/observe/dto/report/DataMatrix.java
=====================================
@@ -223,44 +223,38 @@ public class DataMatrix implements JsonAware {
public String getClipboardContent(boolean copyRowHeaders,
boolean copyColumnHeaders,
- boolean escapeCells, char sep) {
-
+ boolean escapeCells,
+ char sep) {
if (getWidth() <= 0 || getHeight() <= 0) {
return "";
}
-
StringBuilder buffer = new StringBuilder();
-
char eol = '\n';
-
for (int y = copyColumnHeaders ? 0 : 1, rows = getHeight(); y < rows; y++) {
-
Serializable value;
-
- // nouvell ligne
-
+ // new line
int x = copyRowHeaders ? 0 : 1;
-
for (int columns = getWidth() - 1; x < columns; x++) {
-
- // sur chaque cellule (sauf la dernière)
+ // all cells except the last one
value = getValue(x, y);
if (escapeCells) {
- value = "\"" + value + "\"";
+ value = escapeCell(value);
}
buffer.append(value).append(sep);
}
-
- // dernière cellule
+ // last cell
value = getValue(x, y);
if (escapeCells) {
- value = "\"" + value + "\"";
+ value = escapeCell(value);
}
buffer.append(value);
-
- // fin de ligne
+ // end of line
buffer.append(eol);
}
return buffer.toString();
}
+
+ private String escapeCell(Object value) {
+ return String.format("\"%s\"", value == null ? "" : value.toString().replaceAll("\"", "\"\""));
+ }
}
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/512468e882d1ae9f08c90eab6…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/512468e882d1ae9f08c90eab6…
You're receiving this email because of your account on gitlab.com.
1
0