You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2020/05/01 22:59:44 UTC

[sis] 03/04: Add a tab showing the image in the main window.

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

commit b4191c7ea217259fef67b2b8a8484c6419e74c12
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Fri May 1 22:10:22 2020 +0200

    Add a tab showing the image in the main window.
---
 .../apache/sis/gui/dataset/ResourceExplorer.java   | 72 ++++++++++++----------
 .../java/org/apache/sis/gui/map/MapCanvas.java     |  6 +-
 .../org/apache/sis/gui/referencing/MenuSync.java   |  5 +-
 .../org/apache/sis/internal/gui/Resources.java     |  5 ++
 .../apache/sis/internal/gui/Resources.properties   |  1 +
 .../sis/internal/gui/Resources_fr.properties       |  1 +
 6 files changed, 57 insertions(+), 33 deletions(-)

diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceExplorer.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceExplorer.java
index f0dd4bf..3eaf800 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceExplorer.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ResourceExplorer.java
@@ -20,7 +20,6 @@ import java.util.Objects;
 import java.util.Collection;
 import javafx.beans.property.ReadOnlyProperty;
 import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.value.ObservableValue;
 import javafx.collections.ListChangeListener;
 import javafx.scene.layout.Region;
 import javafx.scene.control.ContextMenu;
@@ -80,10 +79,15 @@ public class ResourceExplorer extends WindowManager {
     private final SplitPane content;
 
     /**
-     * The tab where to show {@link #features} or {@link #coverage} numerical data, depending on the kind of resource.
-     * The data will be set only if this tab is visible, because their loading may be costly.
+     * The tab where to show {@link #features} or {@link #coverage}, depending on the kind of resource.
+     * The {@code viewTab} and {@code tableTab} are collectively identified in this class as "data tab".
+     * The {@link #features} and {@link #coverage} data will be set only if a data tab is visible,
+     * because the data loading may be costly.
+     *
+     * @see #isDataTabSet
+     * @see #updateDataTab(Resource)
      */
-    private final Tab dataTab;
+    private final Tab viewTab, tableTab;
 
     /**
      * The currently selected resource.
@@ -91,9 +95,11 @@ public class ResourceExplorer extends WindowManager {
     public final ReadOnlyProperty<Resource> selectedResourceProperty;
 
     /**
-     * Whether the setting of new values in {@link #dataTab} has been done.
-     * The new values are set only if the tab is visible, and otherwise are
-     * delayed until the tab become visible.
+     * Whether the setting of new values in {@link #viewTab} or {@link #tableTab} has been done.
+     * The new values are set only if a data tab is visible, and otherwise are delayed until one
+     * of data tab become visible.
+     *
+     * @see #updateDataTab(Resource)
      */
     private boolean isDataTabSet;
 
@@ -106,8 +112,11 @@ public class ResourceExplorer extends WindowManager {
         content   = new SplitPane();
 
         final Resources localized = localized();
-        dataTab = new Tab(localized.getString(Resources.Keys.Data));
-        dataTab.setContextMenu(new ContextMenu(SelectedData.setTabularView(createNewWindowMenu())));
+        viewTab = new Tab(localized.getString(Resources.Keys.Visual));
+        // TODO: add contextual menu for window showing directly the visual.
+
+        tableTab = new Tab(localized.getString(Resources.Keys.Data));
+        tableTab.setContextMenu(new ContextMenu(SelectedData.setTabularView(createNewWindowMenu())));
 
         final String nativeTabText = Vocabulary.getResources(localized.getLocale()).getString(Vocabulary.Keys.Format);
         final MetadataTree nativeMetadata = new MetadataTree(metadata);
@@ -120,7 +129,7 @@ public class ResourceExplorer extends WindowManager {
         });
 
         final TabPane tabs = new TabPane(
-            new Tab(localized.getString(Resources.Keys.Summary),  metadata.getView()), dataTab,
+            new Tab(localized.getString(Resources.Keys.Summary),  metadata.getView()), viewTab, tableTab,
             new Tab(localized.getString(Resources.Keys.Metadata), new StandardMetadataTree(metadata)),
             nativeTab);
 
@@ -134,7 +143,8 @@ public class ResourceExplorer extends WindowManager {
         resources.setPrefWidth(400);
 
         selectedResourceProperty = new SimpleObjectProperty<>(this, "selectedResource");
-        dataTab.selectedProperty().addListener(this::dataTabShown);
+        viewTab .selectedProperty().addListener((p,o,n) -> dataTabShown(n));
+        tableTab.selectedProperty().addListener((p,o,n) -> dataTabShown(n));
     }
 
     /**
@@ -192,7 +202,7 @@ public class ResourceExplorer extends WindowManager {
         }
         ((SimpleObjectProperty<Resource>) selectedResourceProperty).set(resource);
         metadata.setMetadata(resource);
-        isDataTabSet = dataTab.isSelected();
+        isDataTabSet = viewTab.isSelected() || tableTab.isSelected();
         updateDataTab(isDataTabSet ? resource : null);
         if (!isDataTabSet) {
             setNewWindowDisabled(!(resource instanceof GridCoverageResource || resource instanceof FeatureSet));
@@ -200,9 +210,9 @@ public class ResourceExplorer extends WindowManager {
     }
 
     /**
-     * Sets the given resource to the {@link #dataTab}. Should be invoked only if the tab is visible, since data
-     * loading may be costly. It is caller responsibility to invoke {@link #setNewWindowDisabled(boolean)} after
-     * this method.
+     * Sets the given resource to the {@link #viewTab} or {@link #tableTab}. Should be invoked only if
+     * a data tab is visible because data loading may be costly. It is caller responsibility to invoke
+     * {@link #setNewWindowDisabled(boolean)} after this method.
      *
      * <p>The {@link #isDataTabSet} flag should be set before to invoke this method. If {@code true}, then
      * the given resource is the final content and window menus will be updated accordingly by this method.
@@ -212,45 +222,45 @@ public class ResourceExplorer extends WindowManager {
      * @param  resource  the resource to set, or {@code null} if none.
      */
     private void updateDataTab(final Resource resource) {
-        Region       view  = null;
-        FeatureSet   table = null;
+        Region       image = null;
+        Region       table = null;
+        FeatureSet   data  = null;
         ImageRequest grid  = null;
         if (resource instanceof GridCoverageResource) {
             grid = new ImageRequest((GridCoverageResource) resource, null, 0);
             if (coverage == null) {
                 coverage = new CoverageExplorer();
             }
-            view = coverage.getDataView(CoverageExplorer.View.TABLE);
+            image = coverage.getDataView(CoverageExplorer.View.IMAGE);
+            table = coverage.getDataView(CoverageExplorer.View.TABLE);
         } else if (resource instanceof FeatureSet) {
-            table = (FeatureSet) resource;
+            data = (FeatureSet) resource;
             if (features == null) {
                 features = new FeatureTable();
             }
-            view = features;
+            table = features;
         }
         /*
-         * At least one of `grid` or `table` will be null. Invoking the following
+         * At least one of `grid` or `data` will be null. Invoking the following
          * setter methods with a null argument will release memory.
          */
         if (coverage != null) coverage.setCoverage(grid);
-        if (features != null) features.setFeatures(table);
-        if (view     != null) dataTab .setContent(view);
+        if (features != null) features.setFeatures(data);
+        if (image    != null) viewTab .setContent(image);
+        if (table    != null) tableTab.setContent(table);
         if (isDataTabSet) {
-            setNewWindowDisabled(view == null);
+            setNewWindowDisabled(image == null && table == null);
         }
     }
 
     /**
-     * Invoked when the data tab become selected or unselected.
-     * This method sets the current resource in the {@link #dataTab} if it has not been already set.
+     * Invoked when a data tab become selected or unselected.
+     * This method sets the current resource in the {@link #viewTab}
+     * or {@link #tableTab} if it has not been already set.
      *
-     * @param  property  ignored.
-     * @param  previous  ignored.
      * @param  selected  whether the tab became the selected one.
      */
-    private void dataTabShown(final ObservableValue<? extends Boolean> property,
-                              final Boolean previous, final Boolean selected)
-    {
+    private void dataTabShown(final Boolean selected) {
         if (selected && !isDataTabSet) {
             isDataTabSet = true;                // Must be set before to invoke `updateDataTab(…)`.
             updateDataTab(selectedResourceProperty.getValue());
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvas.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvas.java
index fec92f2..9d83ecb 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvas.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvas.java
@@ -663,7 +663,7 @@ public abstract class MapCanvas extends PlanarCanvas {
             if (invalidObjectiveToDisplay) {
                 invalidObjectiveToDisplay = false;
                 LinearTransform tr;
-                final CoordinateReferenceSystem crs;
+                CoordinateReferenceSystem crs;
                 if (objectiveBounds != null) {
                     crs = objectiveBounds.getCoordinateReferenceSystem();
                     final Envelope2D target = getDisplayBounds();
@@ -674,6 +674,10 @@ public abstract class MapCanvas extends PlanarCanvas {
                     tr = MathTransforms.identity(BIDIMENSIONAL);
                     crs = null;
                 }
+                if (crs == null) {
+                    // TODO: build an EngineeringCRS reflecting better the data.
+                    crs = getDisplayCRS();
+                }
                 setObjectiveCRS(crs);
                 setObjectiveToDisplay(tr);
                 transform.setToIdentity();
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/MenuSync.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/MenuSync.java
index e6130da..61c5313 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/MenuSync.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/MenuSync.java
@@ -241,7 +241,10 @@ final class MenuSync extends SimpleObjectProperty<ReferenceSystem> implements Ev
                 }
             }
             group.selectToggle(null);
-            action.changed(this, old, null);
+            /*
+             * Do not invoke action.changed(…) since we have no non-null value to provide.
+             * Invoking that method with a null value would cause the CRSChooser to popup.
+             */
         }
     }
 }
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 ec356e9..27dd8f2 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
@@ -336,6 +336,11 @@ public final class Resources extends IndexedResourceBundle {
         public static final short TypeOfResource = 26;
 
         /**
+         * Visual
+         */
+        public static final short Visual = 59;
+
+        /**
          * Visualize
          */
         public static final short Visualize = 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 9761bf2..bd02914 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
@@ -76,5 +76,6 @@ Summary                = Summary
 TabularData            = Tabular data
 TopicCategory          = Topic category
 TypeOfResource         = Type of resource
+Visual                 = Visual
 Visualize              = Visualize
 Windows                = Windows
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 f73612f..0088dc3 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
@@ -81,5 +81,6 @@ Summary                = R\u00e9sum\u00e9
 TabularData            = Tableau de valeurs
 TopicCategory          = Cat\u00e9gorie th\u00e9matique
 TypeOfResource         = Type de ressource
+Visual                 = Visuel
 Visualize              = Visualiser
 Windows                = Fen\u00eatres