This is an automated email from the ASF dual-hosted git repository.
desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git
The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
new fe09604 Add an "Open URL" menu item.
fe09604 is described below
commit fe09604bbe7701d8e51d3df02518dc919a426b91
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Tue Mar 22 11:08:10 2022 +0100
Add an "Open URL" menu item.
---
.../main/java/org/apache/sis/gui/DataViewer.java | 48 ++++++++++++++++++++--
.../main/java/org/apache/sis/gui/RecentFiles.java | 2 +-
.../org/apache/sis/internal/gui/RecentChoices.java | 30 +++++++++++++-
.../org/apache/sis/internal/gui/Resources.java | 10 +++++
.../apache/sis/internal/gui/Resources.properties | 2 +
.../sis/internal/gui/Resources_fr.properties | 2 +
6 files changed, 88 insertions(+), 6 deletions(-)
diff --git
a/application/sis-javafx/src/main/java/org/apache/sis/gui/DataViewer.java
b/application/sis-javafx/src/main/java/org/apache/sis/gui/DataViewer.java
index e868d6c..bc70d32 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/DataViewer.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/DataViewer.java
@@ -17,7 +17,10 @@
package org.apache.sis.gui;
import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -31,6 +34,9 @@ import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
+import javafx.scene.control.TextInputDialog;
+import javafx.scene.control.DialogPane;
+import javafx.scene.control.ListView;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.BorderPane;
import javafx.stage.FileChooser;
@@ -39,6 +45,7 @@ import javafx.stage.Screen;
import javafx.stage.Stage;
import org.apache.sis.gui.dataset.ResourceExplorer;
import org.apache.sis.internal.gui.BackgroundThreads;
+import org.apache.sis.internal.gui.ExceptionReporter;
import org.apache.sis.internal.gui.LogHandler;
import org.apache.sis.internal.gui.Resources;
import org.apache.sis.internal.gui.RecentChoices;
@@ -148,15 +155,17 @@ public class DataViewer extends Application {
final MenuBar menus = new MenuBar();
final Menu file = new Menu(vocabulary.getString(Vocabulary.Keys.File));
{ // For keeping variables locale.
- final MenuItem open, close;
+ final MenuItem open, oUrl, close;
final Menu recentFiles = RecentFiles.create(content, localized);
file.getItems().addAll(
- open = localized.menu(Resources.Keys.Open, (e) ->
showOpenFileDialog()), recentFiles,
- close = localized.menu(Resources.Keys.Close, (e) ->
closeSelectedFile()),
+ open = localized.menu(Resources.Keys.Open, (e) ->
showOpenFileDialog()),
+ oUrl = localized.menu(Resources.Keys.OpenURL, (e) ->
showOpenURLDialog()), recentFiles,
+ close = localized.menu(Resources.Keys.Close, (e) ->
closeSelectedFile()),
new SeparatorMenuItem(),
localized.menu(Resources.Keys.Exit, (e) ->
Platform.exit()));
open.setAccelerator(KeyCombination.keyCombination("Shortcut+O"));
+ oUrl.setAccelerator(KeyCombination.keyCombination("Shortcut+U"));
close.setDisable(true);
content.selectedResourceProperty().addListener((e,o,n) -> {
close.setDisable(!(n instanceof DataStore));
@@ -284,6 +293,39 @@ public class DataViewer extends Application {
}
/**
+ * Invoked when the user selects "File" ▶ "Open URL" menu.
+ */
+ private void showOpenURLDialog() {
+ final TextInputDialog chooser = new TextInputDialog();
+ final ListView<String> recents = new ListView<>();
+ RecentChoices.getURLs(recents.getItems());
+ recents.setPrefWidth (500);
+ recents.setPrefHeight(200);
+ recents.getSelectionModel().selectedItemProperty().addListener((p,o,n)
-> chooser.getEditor().setText(n));
+ final DialogPane pane = chooser.getDialogPane();
+ pane.setHeaderText(Resources.format(Resources.Keys.EnterURL));
+ pane.setExpandableContent(recents);
+ pane.setExpanded(true);
+ chooser.setTitle(Resources.format(Resources.Keys.OpenDataFile));
+ chooser.initOwner(window);
+ chooser.showAndWait().ifPresent((choice) -> {
+ try {
+ final URI url = new URI(choice);
+ final Set<String> save = new LinkedHashSet<>(16);
+ save.add(url.toString());
+ for (final String old : recents.getItems()) {
+ save.add(old);
+ if (save.size() >= RecentFiles.MAX_COUNT) break;
+ }
+ RecentChoices.setURLs(save);
+ content.loadResources(Collections.singleton(url));
+ } catch (URISyntaxException e) {
+ ExceptionReporter.canNotReadFile(content.getView(), choice, e);
+ }
+ });
+ }
+
+ /**
* Shows system logs in a separated window.
*/
private void showSystemLogsWindow() {
diff --git
a/application/sis-javafx/src/main/java/org/apache/sis/gui/RecentFiles.java
b/application/sis-javafx/src/main/java/org/apache/sis/gui/RecentFiles.java
index 7f5b16c..2893c45 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/RecentFiles.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/RecentFiles.java
@@ -43,7 +43,7 @@ final class RecentFiles implements EventHandler<ActionEvent> {
/**
* Maximum number of items to show.
*/
- private static final int MAX_COUNT = 10;
+ static final int MAX_COUNT = 10;
/**
* Menu items for each recently opened file.
diff --git
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/RecentChoices.java
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/RecentChoices.java
index b151a7d..9e37d18 100644
---
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/RecentChoices.java
+++
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/RecentChoices.java
@@ -19,6 +19,7 @@ package org.apache.sis.internal.gui;
import java.io.File;
import java.util.List;
import java.util.Arrays;
+import java.util.Collection;
import java.util.prefs.Preferences;
import javafx.scene.control.ComboBox;
import javafx.collections.ObservableList;
@@ -30,7 +31,7 @@ import org.apache.sis.util.collection.FrequencySortedSet;
* Stores recent user choices, for example the last directory opened.
*
* @author Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.2
* @since 1.1
* @module
*/
@@ -61,6 +62,11 @@ public final class RecentChoices {
private static final String FILES = "RecentFiles";
/**
+ * The node where to store recently opened URLs.
+ */
+ private static final String URLS = "RecentURLs";
+
+ /**
* The node where to store authority (usually EPSG) codes of most recently
used coordinate reference systems.
*/
private static final String CRS = "ReferenceSystems";
@@ -108,7 +114,7 @@ public final class RecentChoices {
/**
* Returns recently opened files.
*
- * @return recently opened files.
+ * @return recently opened files, or an empty array if none.
*/
public static CharSequence[] getFiles() {
return CharSequences.splitOnEOL(NODE.get(FILES, null));
@@ -125,6 +131,26 @@ public final class RecentChoices {
}
/**
+ * Returns recently opened URLs.
+ *
+ * @param addTo the list where to add recent URLs.
+ */
+ public static void getURLs(final Collection<String> addTo) {
+ for (CharSequence url : CharSequences.splitOnEOL(NODE.get(URLS,
null))) {
+ addTo.add(url.toString());
+ }
+ }
+
+ /**
+ * Sets the list of recently opened URLs.
+ *
+ * @param files recently opened URLs.
+ */
+ public static void setURLs(final Collection<String> files) {
+ NODE.put(URLS, String.join(System.lineSeparator(), files));
+ }
+
+ /**
* Returns the authority codes of most recently used reference systems.
*
* @return authority codes, or an empty array if none.
diff --git
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
index 4bacb51..61dbcf4 100644
---
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
+++
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
@@ -187,6 +187,11 @@ public final class Resources extends IndexedResourceBundle
{
public static final short DownloadDetails_3 = 59;
/**
+ * Enter the URL of the file to open.
+ */
+ public static final short EnterURL = 71;
+
+ /**
* An error occurred at the following location:
*/
public static final short ErrorAt = 53;
@@ -318,6 +323,11 @@ public final class Resources extends IndexedResourceBundle
{
public static final short OpenRecentFile = 54;
/**
+ * Open URL…
+ */
+ public static final short OpenURL = 70;
+
+ /**
* Orthographic
*/
public static final short Orthographic = 52;
diff --git
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
index 23f0bce..fb4077b 100644
---
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
+++
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
@@ -46,6 +46,7 @@ DisplayStart = Display start
DoesNotCoverAOI = Does not cover the area of interest.
DownloadAndInstall_1 = Download and install {0} database?
DownloadDetails_3 = This geodetic dataset is required for the support of
Coordinate Reference Systems defined by {0} codes. The database will use {1} Mb
in the \u201c{2}\u201d directory.
+EnterURL = Enter the URL of the file to open.
ErrorDetails = Details about error
ErrorExportingData = Error exporting data
ErrorOpeningFile = Error opening file
@@ -69,6 +70,7 @@ MainWindow = Main window
NewWindow = New window
NoFeatureTypeInfo = No feature type information.
Open = Open\u2026
+OpenURL = Open URL\u2026
OpenContainingFolder = Open containing folder
OpenDataFile = Open data file
OpenRecentFile = Open recent file
diff --git
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
index a31f6bc..678d1a2 100644
---
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
+++
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
@@ -51,6 +51,7 @@ DisplayStart = D\u00e9but de l\u2019affichage
DoesNotCoverAOI = Ne couvre pas la r\u00e9gion d\u2019int\u00e9r\u00eat.
DownloadAndInstall_1 = T\u00e9l\u00e9charger et installer la base de
donn\u00e9es {0}?
DownloadDetails_3 = Cette base de donn\u00e9es est n\u00e9cessaire pour
le support des syst\u00e8mes de r\u00e9f\u00e9rences d\u00e9finis par des codes
{0}. La base occupera {1} Mo dans le r\u00e9pertoire
\u00ab\u202f{2}\u202f\u00bb.
+EnterURL = Entrez l\u2019URL du fichier \u00e0 ouvrir.
ErrorDetails = D\u00e9tails \u00e0 propos de l\u2019erreur
ErrorExportingData = Erreur \u00e0 l\u2019exportation de donn\u00e9es
ErrorOpeningFile = Erreur \u00e0 l\u2019ouverture du fichier
@@ -74,6 +75,7 @@ MainWindow = Fen\u00eatre principale
NewWindow = Nouvelle fen\u00eatre
NoFeatureTypeInfo = Pas d\u2019information sur le type d\u2019entit\u00e9.
Open = Ouvrir\u2026
+OpenURL = Ouvrir un URL\u2026
OpenContainingFolder = Ouvrir le dossier contenant
OpenDataFile = Ouvrir un fichier de donn\u00e9es
OpenRecentFile = Ouvrir un fichier r\u00e9cent