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 2026/10/10 22:01:43 UTC

(sis) branch geoapi-4.0 updated (165ac35cd7 -> 8b22f4d62e)

This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a change to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git


    from 165ac35cd7 Add missing signature for GeoHEIF deployment.
     new 6289d4278c Post-release cleanup: remove some deprecated methods.
     new 8b22f4d62e Remove the deprecated `OptionKey` class.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org.apache.sis.feature/main/module-info.java   |   2 +-
 .../apache/sis/coverage/grid/GridCRSBuilder.java   |  10 +-
 .../org/apache/sis/coverage/grid/GridGeometry.java |  45 +-
 .../org/apache/sis/coverage/grid/package-info.java |   2 +-
 .../org.apache.sis.metadata/main/module-info.java  |   2 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  |  11 -
 .../org/apache/sis/metadata/MetadataStandard.java  |  22 -
 .../main/org/apache/sis/metadata/package-info.java |   2 +-
 .../main/module-info.java                          |   2 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |  12 -
 .../operation/AbstractCoordinateOperation.java     |   5 +-
 .../referencing/operation/DefaultConversion.java   |  29 +-
 .../sis/referencing/operation/package-info.java    |   2 +-
 .../org/apache/sis/referencing/package-info.java   |   2 +-
 .../org.apache.sis.storage/main/module-info.java   |   2 +-
 .../main/org/apache/sis/storage/DataOptionKey.java |  42 --
 .../apache/sis/storage/GridCoverageResource.java   |  20 +-
 .../main/org/apache/sis/storage/OptionKey.java     | 148 ++++++-
 .../org/apache/sis/storage/StorageConnector.java   |   8 +-
 .../main/org/apache/sis/storage/package-info.java  |   2 +-
 .../test/org/apache/sis/storage/OptionKeyTest.java |   3 +-
 .../main/org/apache/sis/setup/OptionKey.java       | 349 ---------------
 .../src/org.apache.sis.gui/main/module-info.java   |   2 +-
 .../apache/sis/gui/controls/SyncWindowList.java    | 250 -----------
 .../apache/sis/gui/coverage/CoverageExplorer.java  | 102 -----
 .../org/apache/sis/gui/dataset/WindowHandler.java  | 474 ---------------------
 .../org/apache/sis/gui/dataset/WindowManager.java  | 141 ------
 .../org/apache/sis/gui/dataset/package-info.java   |   2 +-
 .../org/apache/sis/gui/internal/PrivateAccess.java |  52 ---
 .../org/apache/sis/gui/internal/ToolbarButton.java | 115 -----
 .../main/org/apache/sis/gui/map/StatusBar.java     |  16 +-
 .../main/org/apache/sis/gui/map/package-info.java  |   2 +-
 32 files changed, 152 insertions(+), 1726 deletions(-)
 delete mode 100644 endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/DataOptionKey.java
 delete mode 100644 endorsed/src/org.apache.sis.util/main/org/apache/sis/setup/OptionKey.java
 delete mode 100644 optional/src/org.apache.sis.gui/main/org/apache/sis/gui/controls/SyncWindowList.java
 delete mode 100644 optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/WindowHandler.java
 delete mode 100644 optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/WindowManager.java
 delete mode 100644 optional/src/org.apache.sis.gui/main/org/apache/sis/gui/internal/PrivateAccess.java
 delete mode 100644 optional/src/org.apache.sis.gui/main/org/apache/sis/gui/internal/ToolbarButton.java


(sis) 02/02: Remove the deprecated `OptionKey` class.

Posted by de...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 8b22f4d62ebee81580d374fe0f3f7555e0c41d63
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sun Oct 11 00:01:18 2026 +0200

    Remove the deprecated `OptionKey` class.
---
 .../main/org/apache/sis/storage/OptionKey.java     | 148 +++++++--
 .../org/apache/sis/storage/StorageConnector.java   |   8 +-
 .../test/org/apache/sis/storage/OptionKeyTest.java |   3 +-
 .../main/org/apache/sis/setup/OptionKey.java       | 349 ---------------------
 4 files changed, 134 insertions(+), 374 deletions(-)

diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/OptionKey.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/OptionKey.java
index 41950789e8..b31a6965c2 100644
--- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/OptionKey.java
+++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/OptionKey.java
@@ -16,13 +16,17 @@
  */
 package org.apache.sis.storage;
 
+import java.util.Map;
+import java.util.HashMap;
 import java.util.Locale;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.logging.Logger;
 import java.util.function.Supplier;
 import java.time.ZoneId;
-import java.nio.ByteBuffer;
+import java.io.Serializable;
 import java.io.ObjectStreamException;
+import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.nio.file.Path;
 import java.nio.file.OpenOption;
@@ -71,13 +75,18 @@ import org.apache.sis.system.Modules;
  *     }
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
+ * @version 1.8
  *
  * @param <T>  the type of option values.
  *
  * @since 1.7
  */
-public class OptionKey<T> extends org.apache.sis.setup.OptionKey<T> {
+public class OptionKey<T> implements Serializable {
+    /**
+     * For cross-version compatibility.
+     */
+    private static final long serialVersionUID = 4656629698200082120L;
+
     /**
      * The locale to use for locale-sensitive data. This option determines the language to use for writing
      * {@link org.opengis.util.InternationalString international strings} when the target storage supports
@@ -255,23 +264,22 @@ public class OptionKey<T> extends org.apache.sis.setup.OptionKey<T> {
     public static final OptionKey<StoreListeners> PARENT_LISTENERS =
             new OptionKey<>("PARENT_LISTENERS", StoreListeners.class);
 
-    // Temporary hack for transition from deprecated class.
-    static {
-        org.apache.sis.setup.OptionKey.LOCALE       = LOCALE;
-        org.apache.sis.setup.OptionKey.TIMEZONE     = TIMEZONE;
-        org.apache.sis.setup.OptionKey.ENCODING     = ENCODING;
-        org.apache.sis.setup.OptionKey.URL_ENCODING = URL_ENCODING;
-        org.apache.sis.setup.OptionKey.OPEN_OPTIONS = OPEN_OPTIONS;
-        org.apache.sis.setup.OptionKey.DEFAULT_CRS  = DEFAULT_CRS;
-        org.apache.sis.setup.OptionKey.INDENTATION  = INDENTATION;
-        org.apache.sis.setup.OptionKey.GEOMETRY_LIBRARY = GEOMETRY_LIBRARY;
-    }
-
     /*
      * Note: we do not provide a LINE_SEPARATOR option for now because we cannot control the line separator
      * in JDK's JAXB implementation, and Apache SIS provides an org.apache.sis.io.LineAppender alternative.
      */
 
+    /**
+     * The name of this key. For {@code OptionKey} instances, it shall be the name of the static constants.
+     * For subclasses of {@code OptionKey}, there is no restriction.
+     */
+    private final String name;
+
+    /**
+     * The type of values.
+     */
+    private final Class<T> type;
+
     /**
      * Creates a new key of the given name for values of the given type.
      *
@@ -279,7 +287,26 @@ public class OptionKey<T> extends org.apache.sis.setup.OptionKey<T> {
      * @param type  the type of values.
      */
     protected OptionKey(final String name, final Class<T> type) {
-        super(name, type);
+        this.name = Objects.requireNonNull(name);
+        this.type = Objects.requireNonNull(type);
+    }
+
+    /**
+     * Returns the name of this option key.
+     *
+     * @return the name of this option key.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Returns the type of values associated with this option key.
+     *
+     * @return the type of values.
+     */
+    public final Class<T> getElementType() {
+        return type;
     }
 
     /**
@@ -289,9 +316,9 @@ public class OptionKey<T> extends org.apache.sis.setup.OptionKey<T> {
      * @return the unique {@code OptionKey} instance.
      * @throws ObjectStreamException required by specification but should never be thrown.
      */
-    final Object readResolve() throws ObjectStreamException {
+    private Object readResolve() throws ObjectStreamException {
         try {
-            return OptionKey.class.getField(super.getName()).get(null);
+            return OptionKey.class.getField(name).get(null);
         } catch (ReflectiveOperationException e) {
             /*
              * This may happen if we are deserializing a stream produced by a more recent SIS library
@@ -299,7 +326,7 @@ public class OptionKey<T> extends org.apache.sis.setup.OptionKey<T> {
              * we override the `equals` and `hashCode` methods. This option is likely to be ignored,
              * but options are expected to be optional.
              */
-            Logging.recoverableException(Logger.getLogger(Modules.STORAGE), OptionKey.class, "readResolve", e);
+            Logging.recoverableException(Logger.getLogger(Modules.UTILITIES), OptionKey.class, "readResolve", e);
             return this;
         }
     }
@@ -330,6 +357,11 @@ public class OptionKey<T> extends org.apache.sis.setup.OptionKey<T> {
      * @param <T>  the type of option values.
      */
     private static final class Parameter<T> extends OptionKey<T> {
+        /**
+         * For cross-version compatibility.
+         */
+        private static final long serialVersionUID = -3010310759401437668L;
+
         /**
          * The parameter name. This is similar but not identical to the option name.
          */
@@ -379,4 +411,82 @@ public class OptionKey<T> extends org.apache.sis.setup.OptionKey<T> {
             return Optional.of(p);
         }
     }
+
+    /**
+     * Returns the option value in the given map for this key, or {@code null} if none.
+     * This is a convenience method for implementers which can be used as below:
+     *
+     * {@snippet lang="java" :
+     *     public <T> T getOption(OptionKey<T> key) {
+     *         return key.getValueFrom(options);
+     *     }
+     *     }
+     *
+     * @param  options  the map where to search for the value, or {@code null} if not yet created.
+     * @return the current value in the map for the this option, or {@code null} if none.
+     */
+    public T getValueFrom(final Map<? extends OptionKey<?>, ?> options) {
+        return (options != null) ? type.cast(options.get(this)) : null;
+    }
+
+    /**
+     * Sets a value for this option key in the given map, or in a new map if the given map is {@code null}.
+     * This is a convenience method for implementers, which can be used as below:
+     *
+     * {@snippet lang="java" :
+     *     public <T> void setOption(final OptionKey<T> key, final T value) {
+     *         options = key.setValueInto(options, value);
+     *     }
+     *     }
+     *
+     * @param  options  the map where to set the value, or {@code null} if not yet created.
+     * @param  value    the new value for the given option, or {@code null} for removing the value.
+     * @return the given map of options, or a new map if the given map was null. The returned value
+     *         may be null if the given map and the given value are both null.
+     */
+    public Map<OptionKey<?>, Object> setValueInto(Map<OptionKey<?>, Object> options, final T value) {
+        if (value != null) {
+            if (options == null) {
+                options = new HashMap<>();
+            }
+            options.put(this, value);
+        } else if (options != null) {
+            options.remove(this);
+        }
+        return options;
+    }
+
+    /**
+     * Returns {@code true} if the given object is an instance of the same class having the same name and type.
+     *
+     * @param object  the object to compare with this {@code OptionKey} for equality.
+     */
+    @Override
+    public boolean equals(final Object object) {
+        if (object == this) {
+            return true;
+        }
+        if (object != null && object.getClass() == getClass()) {
+            final OptionKey<?> that = (OptionKey<?>) object;
+            return name.equals(that.name) && type == that.type;
+        }
+        return false;
+    }
+
+    /**
+     * Returns a hash code value for this object.
+     */
+    @Override
+    public int hashCode() {
+        return name.hashCode() ^ (int) serialVersionUID;
+    }
+
+    /**
+     * Returns a string representation of this option key.
+     * The default implementation returns the value of {@link #getName()}.
+     */
+    @Override
+    public String toString() {
+        return getName();
+    }
 }
diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java
index 9d59c3398b..28489837ed 100644
--- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java
+++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java
@@ -112,7 +112,7 @@ import org.apache.sis.system.Configuration;
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Alexis Manin (Geomatys)
  * @author  Johann Sorel (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   0.3
  */
 public class StorageConnector implements Serializable {
@@ -294,7 +294,7 @@ public class StorageConnector implements Serializable {
      * @see #setOption(OptionKey, Object)
      */
     @SuppressWarnings("serial")         // Not statically typed as Serializable.
-    private Map<org.apache.sis.setup.OptionKey<?>, Object> options;
+    private Map<OptionKey<?>, Object> options;
 
     /**
      * If a probing operation is ongoing, the provider doing the operation. Otherwise {@code null}.
@@ -671,7 +671,7 @@ public class StorageConnector implements Serializable {
      * @param key    the option for which to set the value.
      * @param value  the new value for the given option, or {@code null} for removing the value.
      */
-    public <T> void setOption(final org.apache.sis.setup.OptionKey<T> key, final T value) {
+    public <T> void setOption(final OptionKey<T> key, final T value) {
         options = key.setValueInto(options, value);
     }
 
@@ -683,7 +683,7 @@ public class StorageConnector implements Serializable {
      * @param  key  the option for which to get the value.
      * @return the current value for the given option, or {@code null} if none.
      */
-    public <T> T getOption(final org.apache.sis.setup.OptionKey<T> key) {
+    public <T> T getOption(final OptionKey<T> key) {
         return key.getValueFrom(options);
     }
 
diff --git a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/OptionKeyTest.java b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/OptionKeyTest.java
index f353536109..bfe7c93348 100644
--- a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/OptionKeyTest.java
+++ b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/OptionKeyTest.java
@@ -17,9 +17,8 @@
 package org.apache.sis.storage;
 
 import java.util.Map;
-import org.apache.sis.setup.OptionKey;
 import org.apache.sis.util.collection.CheckedContainer;
-import static org.apache.sis.setup.OptionKey.*;
+import static org.apache.sis.storage.OptionKey.*;
 
 // Test dependencies
 import org.junit.jupiter.api.Test;
diff --git a/endorsed/src/org.apache.sis.util/main/org/apache/sis/setup/OptionKey.java b/endorsed/src/org.apache.sis.util/main/org/apache/sis/setup/OptionKey.java
deleted file mode 100644
index ee9183f1c0..0000000000
--- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/setup/OptionKey.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.setup;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Objects;
-import java.time.ZoneId;
-import java.io.Serializable;
-import java.io.ObjectStreamException;
-import java.nio.charset.Charset;
-import java.nio.file.OpenOption;
-import java.nio.file.StandardOpenOption;
-import static java.util.logging.Logger.getLogger;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.apache.sis.util.logging.Logging;
-import org.apache.sis.system.Modules;
-
-
-/**
- * Keys in a map of options for configuring various services
- * ({@link org.apache.sis.storage.DataStore}, <i>etc</i>).
- * {@code OptionKey}s are used for aspects that usually do not need to be configured, except in a few specialized cases.
- * For example, most data file formats read by SIS do not require the user to specify the character encoding, because
- * the encoding is often given in the file header or in the format specification. However if SIS needs to read plain
- * text files <em>and</em> the default platform encoding is not suitable, then the user can specify the desired encoding
- * explicitly using the {@link #ENCODING} option.
- *
- * <p>All options are <em>hints</em> and may be silently ignored. For example, most {@code DataStore}s will ignore the
- * {@code ENCODING} option if irrelevant to their format, or if the encoding is specified in the data file header.</p>
- *
- * <p>Options are <em>transitive</em>: if a service uses others services for its internal working, the given options
- * may also be given to those dependencies, at implementation choice.</p>
- *
- * <h2>Defining new options</h2>
- * Developers who wish to define their own options can define static constants in a subclass,
- * as in the following example:
- *
- * {@snippet lang="java" :
- *     public final class MyOptionKey<T> extends OptionKey<T> {
- *         public static final OptionKey<String> MY_OPTION = new MyOptionKey<>("MY_OPTION", String.class);
- *
- *         private MyOptionKey(final String name, final Class<T> type) {
- *             super(name, type);
- *         }
- *     }
- *     }
- *
- * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
- *
- * @param <T>  the type of option values.
- *
- * @since 0.3
- *
- * @deprecated Moved to the {@link org.apache.sis.storage} because these options appear to be used only by data stores.
- */
-@Deprecated(since = "1.7", forRemoval = true)
-public class OptionKey<T> implements Serializable {
-    /**
-     * For cross-version compatibility.
-     */
-    private static final long serialVersionUID = -7580514229639750246L;
-
-    /**
-     * The locale to use for locale-sensitive data. This option determines the language to use for writing
-     * {@link org.apache.sis.util.AbstractInternationalString international strings} when the target
-     * storage support only one language. It may also control number and date patterns in some file formats
-     * like Comma Separated Values (CSV). However, most data formats will ignore this locale.
-     *
-     * <p>This option is <strong>not</strong> for the locale of logging or warning messages. Messages
-     * locale is rather controlled by {@link org.apache.sis.storage.DataStore#setLocale(Locale)}.</p>
-     *
-     * @see org.apache.sis.xml.XML#LOCALE
-     *
-     * @since 0.8
-     */
-    public static OptionKey<Locale> LOCALE = new OptionKey<>("LOCALE", Locale.class);
-
-    /**
-     * The timezone to use when parsing or formatting dates and times without explicit timezone.
-     * If this option is not provided, then the default value is format specific.
-     * That default is often, but not necessarily, the {@linkplain ZoneId#systemDefault() platform default}.
-     *
-     * @see org.apache.sis.xml.XML#TIMEZONE
-     *
-     * @since 0.8
-     */
-    public static OptionKey<ZoneId> TIMEZONE = new OptionKey<>("TIMEZONE", ZoneId.class);
-
-    /**
-     * The character encoding of document content.
-     * This option can be used when the file to read or write does not describe itself its encoding.
-     * For example, this option can be used when reading plain text files, but is ignored when
-     * reading XML files having a {@code <?xml version="1.0" encoding="…"?>} declaration.
-     *
-     * <p>If this option is not provided, then the default value is format specific.
-     * That default is often, but not necessarily, the {@linkplain Charset#defaultCharset() platform default}.</p>
-     *
-     * @see jakarta.xml.bind.Marshaller#JAXB_ENCODING
-     *
-     * @since 0.4
-     */
-    public static OptionKey<Charset> ENCODING = new OptionKey<>("ENCODING", Charset.class);
-
-    /**
-     * The encoding of a URL (<strong>not</strong> the encoding of the document content).
-     * This option may be used when converting a {@link String} or a {@link java.net.URL}
-     * to a {@link java.net.URI} or a {@link java.io.File}. The following rules apply:
-     *
-     * <ul>
-     *   <li>URI are always encoded in UTF-8. Consequently, this option is ignored for URI.</li>
-     *   <li>URL are often encoded in UTF-8, but not necessarily. Other encodings are possible
-     *       (while not recommended), or some URL may not be encoded at all.</li>
-     * </ul>
-     *
-     * If this option is not provided, then the URL is assumed <strong>not</strong> encoded.
-     *
-     * <p><b>Example:</b> Given the {@code "file:Map%20with%20spaces.png"} URL, then:</p>
-     * <ul>
-     *   <li>If the URL encoding option is set to {@code "UTF-8"} or {@code "ISO-8859-1"}, then:<ul>
-     *     <li>the encoded URI will be {@code "file:Map%20with%20spaces.png"};</li>
-     *     <li>the decoded URI or the file will be {@code "file:Map with spaces.png"}.</li>
-     *   </ul></li>
-     *   <li>If the URL encoding option is set to {@code null} or is not provided, then:<ul>
-     *     <li>the encoded URI will be {@code "file:Map%2520with%2520spaces.png"},
-     *         i.e. the percent sign will be encoded as {@code "%25"};</li>
-     *     <li>the decoded URI or the file will be {@code "file:Map%20with%20spaces.png"}.</li>
-     *   </ul></li>
-     * </ul>
-     *
-     * This option has not effect on URI encoding, which is always UTF-8.
-     *
-     * @see java.net.URLDecoder
-     */
-    public static OptionKey<String> URL_ENCODING = new OptionKey<>("URL_ENCODING", String.class);
-
-    /**
-     * Whether a storage object shall be opened in read, write, append or other modes.
-     * The main options that can be provided are:
-     *
-     * <table class="sis">
-     *   <caption>Supported open options</caption>
-     *   <tr><th>Value</th>                             <th>Meaning</th></tr>
-     *   <tr><td>{@link StandardOpenOption#READ}</td>   <td>Open for reading data from the storage object.</td></tr>
-     *   <tr><td>{@link StandardOpenOption#WRITE}</td>  <td>Open for modifying existing data in the storage object.</td></tr>
-     *   <tr><td>{@link StandardOpenOption#APPEND}</td> <td>Open for appending new data in the storage object.</td></tr>
-     *   <tr><td>{@link StandardOpenOption#CREATE}</td> <td>Creates a new storage object (file or database) if it does not exist.</td></tr>
-     * </table>
-     */
-    public static OptionKey<OpenOption[]> OPEN_OPTIONS = new OptionKey<>("OPEN_OPTIONS", OpenOption[].class);
-
-    /**
-     * The coordinate reference system (CRS) of data to use if not explicitly defined.
-     * This option can be used when the file to read does not describe itself the data CRS.
-     * For example, this option can be used when reading ASCII Grid without CRS information,
-     * but is ignored if the ASCII Grid file is accompanied by a {@code *.prj} file giving the CRS.
-     *
-     * @since 1.5
-     */
-    public static OptionKey<CoordinateReferenceSystem> DEFAULT_CRS =
-            new OptionKey<>("DEFAULT_CRS", CoordinateReferenceSystem.class);
-
-    /**
-     * The library to use for creating geometric objects at reading time.
-     * Some libraries are the Java Topology Suite (JTS), ESRI geometry API and Java2D.
-     * If this option is not specified, then a default library will be selected among
-     * the libraries available in the runtime environment.
-     *
-     * @since 0.8
-     */
-    public static OptionKey<GeometryLibrary> GEOMETRY_LIBRARY = new OptionKey<>("GEOMETRY_LIBRARY", GeometryLibrary.class);
-
-    /**
-     * The number of spaces to use for indentation when formatting text files in WKT or XML formats.
-     * A value of {@value org.apache.sis.io.wkt.WKTFormat#SINGLE_LINE} means to format the whole WKT
-     * or XML document on a single line without line feeds or indentation.
-     *
-     * <p>If this option is not provided, then the most typical default value used in Apache SIS is 2.
-     * Such small indentation value is used because XML documents defined by OGC standards tend to be
-     * verbose.</p>
-     *
-     * @see org.apache.sis.io.wkt.WKTFormat#SINGLE_LINE
-     * @see jakarta.xml.bind.Marshaller#JAXB_FORMATTED_OUTPUT
-     *
-     * @since 0.8
-     */
-    public static OptionKey<Integer> INDENTATION = new OptionKey<>("INDENTATION", Integer.class);
-
-    /*
-     * Note: we do not provide a LINE_SEPARATOR option for now because we cannot control the line separator
-     * in JDK's JAXB implementation, and Apache SIS provides an org.apache.sis.io.LineAppender alternative.
-     */
-
-    /**
-     * The name of this key. For {@code OptionKey} instances, it shall be the name of the static constants.
-     * For subclasses of {@code OptionKey}, there is no restriction.
-     */
-    private final String name;
-
-    /**
-     * The type of values.
-     */
-    private final Class<T> type;
-
-    /**
-     * Creates a new key of the given name for values of the given type.
-     *
-     * @param name  the key name.
-     * @param type  the type of values.
-     */
-    protected OptionKey(final String name, final Class<T> type) {
-        this.name = Objects.requireNonNull(name);
-        this.type = Objects.requireNonNull(type);
-    }
-
-    /**
-     * Returns the name of this option key.
-     *
-     * @return the name of this option key.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Returns the type of values associated with this option key.
-     *
-     * @return the type of values.
-     */
-    public final Class<T> getElementType() {
-        return type;
-    }
-
-    /**
-     * Returns the option value in the given map for this key, or {@code null} if none.
-     * This is a convenience method for implementers, which can be used as below:
-     *
-     * {@snippet lang="java" :
-     *     public <T> T getOption(final OptionKey<T> key) {
-     *         return key.getValueFrom(options);
-     *     }
-     *     }
-     *
-     * @param  options  the map where to search for the value, or {@code null} if not yet created.
-     * @return the current value in the map for the this option, or {@code null} if none.
-     */
-    public T getValueFrom(final Map<? extends OptionKey<?>, ?> options) {
-        return (options != null) ? type.cast(options.get(this)) : null;
-    }
-
-    /**
-     * Sets a value for this option key in the given map, or in a new map if the given map is {@code null}.
-     * This is a convenience method for implementers, which can be used as below:
-     *
-     * {@snippet lang="java" :
-     *     public <T> void setOption(final OptionKey<T> key, final T value) {
-     *         options = key.setValueInto(options, value);
-     *     }
-     *     }
-     *
-     * @param  options  the map where to set the value, or {@code null} if not yet created.
-     * @param  value    the new value for the given option, or {@code null} for removing the value.
-     * @return the given map of options, or a new map if the given map was null. The returned value
-     *         may be null if the given map and the given value are both null.
-     */
-    public Map<OptionKey<?>, Object> setValueInto(Map<OptionKey<?>, Object> options, final T value) {
-        if (value != null) {
-            if (options == null) {
-                options = new HashMap<>();
-            }
-            options.put(this, value);
-        } else if (options != null) {
-            options.remove(this);
-        }
-        return options;
-    }
-
-    /**
-     * Returns {@code true} if the given object is an instance of the same class having the same name and type.
-     *
-     * @param object  the object to compare with this {@code OptionKey} for equality.
-     */
-    @Override
-    public boolean equals(final Object object) {
-        if (object == this) {
-            return true;
-        }
-        if (object != null && object.getClass() == getClass()) {
-            final OptionKey<?> that = (OptionKey<?>) object;
-            return name.equals(that.name) && type == that.type;
-        }
-        return false;
-    }
-
-    /**
-     * Returns a hash code value for this object.
-     */
-    @Override
-    public int hashCode() {
-        return name.hashCode() ^ (int) serialVersionUID;
-    }
-
-    /**
-     * Returns a string representation of this option key.
-     * The default implementation returns the value of {@link #getName()}.
-     */
-    @Override
-    public String toString() {
-        return getName();
-    }
-
-    /**
-     * Resolves this option key on deserialization. This method is invoked
-     * only for instance of the exact {@code OptionKey} class, not subclasses.
-     *
-     * @return the unique {@code OptionKey} instance.
-     * @throws ObjectStreamException required by specification but should never be thrown.
-     */
-    private Object readResolve() throws ObjectStreamException {
-        try {
-            return OptionKey.class.getField(name).get(null);
-        } catch (ReflectiveOperationException e) {
-            /*
-             * This may happen if we are deserializing a stream produced by a more recent SIS library
-             * than the one running in this JVM. This class should be robust to this situation, since
-             * we override the `equals` and `hashCode` methods. This option is likely to be ignored,
-             * but options are expected to be optional.
-             */
-            Logging.recoverableException(getLogger(Modules.UTILITIES), OptionKey.class, "readResolve", e);
-            return this;
-        }
-    }
-}


(sis) 01/02: Post-release cleanup: remove some deprecated methods.

Posted by de...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 6289d4278ca731eb96d82d190181c7e74cb5291f
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sat Oct 10 23:46:05 2026 +0200

    Post-release cleanup: remove some deprecated methods.
---
 .../org.apache.sis.feature/main/module-info.java   |   2 +-
 .../apache/sis/coverage/grid/GridCRSBuilder.java   |  10 +-
 .../org/apache/sis/coverage/grid/GridGeometry.java |  45 +-
 .../org/apache/sis/coverage/grid/package-info.java |   2 +-
 .../org.apache.sis.metadata/main/module-info.java  |   2 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  |  11 -
 .../org/apache/sis/metadata/MetadataStandard.java  |  22 -
 .../main/org/apache/sis/metadata/package-info.java |   2 +-
 .../main/module-info.java                          |   2 +-
 .../sis/referencing/AbstractIdentifiedObject.java  |  12 -
 .../operation/AbstractCoordinateOperation.java     |   5 +-
 .../referencing/operation/DefaultConversion.java   |  29 +-
 .../sis/referencing/operation/package-info.java    |   2 +-
 .../org/apache/sis/referencing/package-info.java   |   2 +-
 .../org.apache.sis.storage/main/module-info.java   |   2 +-
 .../main/org/apache/sis/storage/DataOptionKey.java |  42 --
 .../apache/sis/storage/GridCoverageResource.java   |  20 +-
 .../main/org/apache/sis/storage/package-info.java  |   2 +-
 .../src/org.apache.sis.gui/main/module-info.java   |   2 +-
 .../apache/sis/gui/controls/SyncWindowList.java    | 250 -----------
 .../apache/sis/gui/coverage/CoverageExplorer.java  | 102 -----
 .../org/apache/sis/gui/dataset/WindowHandler.java  | 474 ---------------------
 .../org/apache/sis/gui/dataset/WindowManager.java  | 141 ------
 .../org/apache/sis/gui/dataset/package-info.java   |   2 +-
 .../org/apache/sis/gui/internal/PrivateAccess.java |  52 ---
 .../org/apache/sis/gui/internal/ToolbarButton.java | 115 -----
 .../main/org/apache/sis/gui/map/StatusBar.java     |  16 +-
 .../main/org/apache/sis/gui/map/package-info.java  |   2 +-
 28 files changed, 18 insertions(+), 1352 deletions(-)

diff --git a/endorsed/src/org.apache.sis.feature/main/module-info.java b/endorsed/src/org.apache.sis.feature/main/module-info.java
index 2a7d9ef18f..9ef598684a 100644
--- a/endorsed/src/org.apache.sis.feature/main/module-info.java
+++ b/endorsed/src/org.apache.sis.feature/main/module-info.java
@@ -20,7 +20,7 @@
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   0.5
  */
 module org.apache.sis.feature {
diff --git a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridCRSBuilder.java b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridCRSBuilder.java
index b123fcbb71..abbe468b42 100644
--- a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridCRSBuilder.java
+++ b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridCRSBuilder.java
@@ -213,14 +213,6 @@ final class GridCRSBuilder extends ReferencingFactoryContainer {
      */
     private static final Locale LOCALE = null;
 
-    /**
-     * Whether to force {@link DerivedCRS} instances.
-     *
-     * @deprecated to be removed after {@link GridGeometry#createImageCRS} has been removed.
-     */
-    @Deprecated(forRemoval = true)
-    boolean derived;
-
     /**
      * Creates a new helper class for building a grid coordinate reference system.
      */
@@ -260,7 +252,7 @@ final class GridCRSBuilder extends ReferencingFactoryContainer {
             properties.put(ObjectDomain.DOMAIN_OF_VALIDITY_KEY, new DefaultExtent(null, domain, null, null));
         });
         fullGrid = grid;
-        if (derived || grid.isDefined(GridGeometry.CRS | GridGeometry.GRID_TO_CRS)) try {
+        if (grid.isDefined(GridGeometry.CRS | GridGeometry.GRID_TO_CRS)) try {
             separator = new TransformSeparator(grid.getGridToCRS(anchor).inverse());
             return forComponent(name, grid.getCoordinateReferenceSystem(), 0, 0);
         } catch (NoninvertibleTransformException e) {
diff --git a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridGeometry.java b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridGeometry.java
index fc71c92cba..047f91b300 100644
--- a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridGeometry.java
+++ b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridGeometry.java
@@ -144,7 +144,7 @@ import org.opengis.coordinate.MismatchedDimensionException;
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Johann Sorel (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   1.0
  */
 public class GridGeometry implements LenientComparable, Serializable {
@@ -1899,49 +1899,6 @@ public class GridGeometry implements LenientComparable, Serializable {
         return new GridGeometry(extent, tr, tr, env, newResolution, 0);
     }
 
-    /**
-     * Creates a one-, two- or three-dimensional coordinate reference system for cell indices in the grid.
-     * This method returns a CRS which is derived from the "real world" CRS or a subset of it.
-     * If the "real world" CRS is an instance of {@link org.opengis.referencing.crs.SingleCRS},
-     * then the derived CRS has the following properties:
-     *
-     * <ul>
-     *   <li>{@link DerivedCRS#getBaseCRS()} is {@link #getCoordinateReferenceSystem()}.</li>
-     *   <li>{@link DerivedCRS#getConversionFromBase()} is the inverse of {@link #getGridToCRS(PixelInCell)}.</li>
-     * </ul>
-     *
-     * Otherwise if the "real world" CRS is an instance of {@link org.opengis.referencing.crs.CompoundCRS},
-     * then only the first {@link org.opengis.referencing.crs.SingleCRS} (the head) is used.
-     * This is usually (but not necessarily) the horizontal component of the spatial CRS.
-     * The result is usually two-dimensional, but 1 and 3 dimensions are also possible.
-     *
-     * <p>Because of above relationship, it is possible to use the derived CRS in a chain of operations
-     * with (for example) {@link org.apache.sis.referencing.CRS#findOperation CRS.findOperation(…)}.</p>
-     *
-     * @param  name    name of the CRS to create.
-     * @param  anchor  the cell part to map (center or corner).
-     * @return a derived CRS for coordinates (cell indices) associated with the grid extent.
-     * @throws IncompleteGridGeometryException if the CRS or "grid to CRS" transform is missing.
-     *
-     * @since 1.3
-     *
-     * @deprecated Replaced by the more generic {@link #createGridCRS(Identifier, PixelInCell)} method.
-     */
-    @Deprecated(since = "1.7", forRemoval = true)
-    public DerivedCRS createImageCRS(final String name, final PixelInCell anchor) {
-        ArgumentChecks.ensureNonEmpty("name", name);
-        final var id = new org.apache.sis.referencing.ImmutableIdentifier(null, null, name);
-        try {
-            // Note: the `true` boolean argument can be removed after the removal of this method.
-            var builder = new GridCRSBuilder();
-            builder.derived = true;
-            final CoordinateReferenceSystem crs = builder.forCoverage(this, anchor, id);
-            return (DerivedCRS) org.apache.sis.referencing.CRS.getSingleComponents(crs).get(0);
-        } catch (FactoryException e) {
-            throw new BackingStoreException(e);
-        }
-    }
-
     /**
      * Creates a coordinate reference system for cell indices in the grid.
      * If the cell indices can be related to the real world <abbr>CRS</abbr>
diff --git a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/package-info.java b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/package-info.java
index 0c0702f0f8..2338e6cf36 100644
--- a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/package-info.java
+++ b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/package-info.java
@@ -41,7 +41,7 @@
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Johann Sorel (Geomatys)
  * @author  Alexis Manin (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   1.0
  */
 package org.apache.sis.coverage.grid;
diff --git a/endorsed/src/org.apache.sis.metadata/main/module-info.java b/endorsed/src/org.apache.sis.metadata/main/module-info.java
index 202fb514de..2a061a2078 100644
--- a/endorsed/src/org.apache.sis.metadata/main/module-info.java
+++ b/endorsed/src/org.apache.sis.metadata/main/module-info.java
@@ -23,7 +23,7 @@
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Cédric Briançon (Geomatys)
  * @author  Cullen Rombach (Image Matters)
- * @version 1.6
+ * @version 1.8
  * @since   0.3
  */
 module org.apache.sis.metadata {
diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/AbstractMetadata.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/AbstractMetadata.java
index c0a2b806f1..d5108ecf4a 100644
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/AbstractMetadata.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/AbstractMetadata.java
@@ -154,17 +154,6 @@ public abstract class AbstractMetadata implements LenientComparable, Emptiable {
         return getStandard().getInterface(getClass());
     }
 
-    /**
-     * Returns the metadata interface implemented by this class.
-     *
-     * @return the standard interface implemented by this class.
-     * @deprecated Renamed {@link #getStandardType()} for integration with {@link LenientComparable}.
-     */
-    @Deprecated(since="1.7", forRemoval=true)
-    public final Class<?> getInterface() {
-        return org.apache.sis.util.Classes.getRawClass(getStandardType());
-    }
-
     /**
      * Returns {@code true} if this metadata contains only {@code null},
      * {@linkplain org.apache.sis.xml.NilObject nil} or empty properties.
diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/MetadataStandard.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/MetadataStandard.java
index ceb412f4a3..0ce978e491 100644
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/MetadataStandard.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/MetadataStandard.java
@@ -1214,28 +1214,6 @@ public class MetadataStandard implements Serializable {
         return new TreeTableView(this, metadata, baseType, valuePolicy);
     }
 
-    /**
-     * Compares the two specified metadata objects for equality.
-     * The two metadata arguments shall be implementations of a metadata interface defined by
-     * this {@code MetadataStandard}, otherwise an exception will be thrown. However, the two
-     * arguments do not need to be instances of the same implementation class
-     * except for {@link ComparisonMode#STRICT}.
-     *
-     * @param  metadata1  the first metadata object to compare, or {@code null}.
-     * @param  metadata2  the second metadata object to compare, or {@code null}.
-     * @param  mode       the strictness level of the comparison.
-     * @return {@code true} if the given metadata objects are equal or if the two arguments are {@code null}.
-     *
-     * @deprecated Replaced by {@link #equals(Object, Object, Class, ComparisonMode)} because this method
-     * is ambiguous when one of the given metadata instances implements more than one metadata interface.
-     */
-    @Deprecated(since="1.7", forRemoval=true)
-    public boolean equals(final Object metadata1, final Object metadata2, final ComparisonMode mode) {
-        final Boolean equals = equals(metadata1, metadata2, null, mode);
-        if (equals == null) throw new ClassCastException();
-        return equals;
-    }
-
     /**
      * Compares the two specified metadata instances for equality.
      * The two metadata arguments should be implementations of a
diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/package-info.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/package-info.java
index fc8b17f304..af69e11a8f 100644
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/package-info.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/package-info.java
@@ -120,7 +120,7 @@
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Adrian Custer (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   0.3
  */
 @XmlAccessorType(XmlAccessType.NONE)
diff --git a/endorsed/src/org.apache.sis.referencing/main/module-info.java b/endorsed/src/org.apache.sis.referencing/main/module-info.java
index 537532e294..3ea3d52884 100644
--- a/endorsed/src/org.apache.sis.referencing/main/module-info.java
+++ b/endorsed/src/org.apache.sis.referencing/main/module-info.java
@@ -21,7 +21,7 @@
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Rémi Maréchal (Geomatys)
  * @author  Maxime Gavens (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   0.3
  */
 module org.apache.sis.referencing {
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/AbstractIdentifiedObject.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/AbstractIdentifiedObject.java
index e2e6111cbe..e04c584471 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/AbstractIdentifiedObject.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/AbstractIdentifiedObject.java
@@ -531,18 +531,6 @@ public class AbstractIdentifiedObject extends FormattableObject implements Ident
         return IdentifiedObject.class;
     }
 
-    /**
-     * Returns the GeoAPI interface implemented by this class.
-     *
-     * @return the GeoAPI interface implemented by this class.
-     * @deprecated Renamed {@link #getStandardType()} for integration with {@link LenientComparable}.
-     */
-    @Deprecated(since="1.7", forRemoval=true)
-    // TODO: make package private.
-    public final Class<? extends IdentifiedObject> getInterface() {
-        return Classes.getRawClass(getStandardType()).asSubclass(IdentifiedObject.class);
-    }
-
     /**
      * Returns the primary name by which this object is identified.
      *
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
index d8968ec4d5..5b2c3a7256 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
@@ -493,11 +493,8 @@ check:      for (int isTarget=0; ; isTarget++) {        // 0 == source check; 1
      * When this method returns {@code true}, the source and target CRS are not marshalled in XML documents.
      *
      * @return {@code true} if this coordinate operation is for the definition of a derived or projected CRS.
-     *
-     * @deprecated Replaced by the {@link DefiningConversion} class.
      */
-    @Deprecated(since = "1.7", forRemoval = true)
-    public boolean isDefiningConversion() {
+    private boolean isDefiningConversion() {
         /*
          * Trick: we do not need to verify if (this instanceof Conversion) because:
          *   - Only DefaultConversion constructor accepts null source and target CRS.
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
index 48bf31894b..3c9ad8e121 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
@@ -68,7 +68,7 @@ import org.opengis.referencing.crs.DerivedCRS;
  * by many objects and passed between threads without synchronization.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.7
+ * @version 1.8
  *
  * @see DefaultTransformation
  *
@@ -151,33 +151,6 @@ public class DefaultConversion extends AbstractSingleOperation implements Conver
         ArgumentChecks.ensureNonNull("targetCRS", targetCRS);
     }
 
-    /**
-     * Creates a defining conversion from the given transform and/or parameters.
-     *
-     * @param properties  the properties to be given to the identified object.
-     * @param method      the operation method.
-     * @param transform   transform from positions in the source CRS to positions in the target CRS, or {@code null}.
-     * @param parameters  the {@code transform} parameter values, or {@code null}.
-     *
-     * @deprecated Moved to the {@link DefiningConversion} subclass.
-     */
-    @Deprecated(since = "1.7", forRemoval = true)
-    @SuppressWarnings("this-escape")    // False positive.
-    public DefaultConversion(final Map<String,?>       properties,
-                             final OperationMethod     method,
-                             final MathTransform       transform,
-                             final ParameterValueGroup parameters)
-    {
-        super(properties, method);
-        this.transform = transform;
-        if (transform == null && parameters == null) {
-            throw new IllegalArgumentException(Resources.forProperties(properties)
-                    .getString(Resources.Keys.UnspecifiedParameterValues));
-        }
-        setParameterValues(parameters, null);
-        checkDimensions(properties);
-    }
-
     /**
      * Creates a new coordinate operation initialized from the given properties.
      * It is caller's responsibility to set the following fields:
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/package-info.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/package-info.java
index ef22720164..c2a9993182 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/package-info.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/package-info.java
@@ -72,7 +72,7 @@
  * for example by specifying the area of interest.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   0.6
  */
 @XmlSchema(location = "http://schemas.opengis.net/gml/3.2.1/coordinateOperations.xsd",
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/package-info.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/package-info.java
index 151abcdc17..e64ead2434 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/package-info.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/package-info.java
@@ -94,7 +94,7 @@
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Guilhem Legal (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   0.4
  */
 @XmlSchema(location = "http://schemas.opengis.net/gml/3.2.1/referenceSystems.xsd",
diff --git a/endorsed/src/org.apache.sis.storage/main/module-info.java b/endorsed/src/org.apache.sis.storage/main/module-info.java
index 024b42f67a..df8b64c70d 100644
--- a/endorsed/src/org.apache.sis.storage/main/module-info.java
+++ b/endorsed/src/org.apache.sis.storage/main/module-info.java
@@ -20,7 +20,7 @@
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   0.3
  */
 module org.apache.sis.storage {
diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/DataOptionKey.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/DataOptionKey.java
deleted file mode 100644
index d995be101b..0000000000
--- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/DataOptionKey.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.storage;
-
-
-/**
- * Keys in a map of options for configuring the way data are read or written to a storage.
- * {@code DataOptionKey} extends {@link OptionKey} with options about features, coverages
- * or other kinds of structure that are specific to some data formats.
- *
- * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
- *
- * @param <T>  the type of option values.
- *
- * @since 1.0
- *
- * @deprecated Merged with {@link OptionKey}×
- */
-@Deprecated(since = "1.7", forRemoval = true)
-public final class DataOptionKey<T> extends OptionKey<T> {
-    /**
-     * Creates a new key of the given name.
-     */
-    private DataOptionKey(final String name, final Class<T> type) {
-        super(name, type);
-    }
-}
diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/GridCoverageResource.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/GridCoverageResource.java
index f2eec96621..fd8692de0a 100644
--- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/GridCoverageResource.java
+++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/GridCoverageResource.java
@@ -42,7 +42,7 @@ import org.apache.sis.util.ArraysExt;
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Johann Sorel (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   1.0
  */
 public interface GridCoverageResource extends DataSet {
@@ -167,24 +167,6 @@ public interface GridCoverageResource extends DataSet {
         return List.of();
     }
 
-    /**
-     * Returns the preferred resolutions ordered from finest to coarsest resolution.
-     *
-     * @return preferred resolutions for read operations in this data store, or an empty list if none.
-     * @throws DataStoreException if an error occurred while reading definitions from the underlying data store.
-     *
-     * @since 1.2
-     *
-     * @deprecated Replaced by {@link #getAvailableResolutions()} but with opposite order.
-     *             The new order is more conform to <abbr>OGC</abbr> specifications.
-     */
-    @Deprecated(since = "1.7", forRemoval = true)
-    default List<double[]> getResolutions() throws DataStoreException {
-        final var resolutions = new java.util.ArrayList<>(getAvailableResolutions());
-        java.util.Collections.reverse(resolutions);
-        return resolutions;
-    }
-
     /**
      * Requests a subset of the coverage.
      * The filtering can be applied in two aspects:
diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/package-info.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/package-info.java
index 2a65abf786..1316d39a0d 100644
--- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/package-info.java
+++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/package-info.java
@@ -24,7 +24,7 @@
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   0.3
  */
 package org.apache.sis.storage;
diff --git a/optional/src/org.apache.sis.gui/main/module-info.java b/optional/src/org.apache.sis.gui/main/module-info.java
index 576d9f230b..74562d9791 100644
--- a/optional/src/org.apache.sis.gui/main/module-info.java
+++ b/optional/src/org.apache.sis.gui/main/module-info.java
@@ -21,7 +21,7 @@
  * @author  Smaniotto Enzo (GSoC)
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   1.1
  */
 module org.apache.sis.gui {
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/controls/SyncWindowList.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/controls/SyncWindowList.java
deleted file mode 100644
index 124efa801f..0000000000
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/controls/SyncWindowList.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.gui.controls;
-
-import java.util.List;
-import javafx.collections.ListChangeListener;
-import javafx.collections.ObservableList;
-import javafx.scene.control.Button;
-import javafx.scene.control.TableRow;
-import javafx.scene.control.TableView;
-import javafx.scene.input.MouseEvent;
-import javafx.scene.layout.Priority;
-import javafx.scene.layout.Region;
-import javafx.scene.layout.VBox;
-import javafx.application.Platform;
-import org.apache.sis.util.resources.Vocabulary;
-import org.apache.sis.util.collection.Containers;
-import org.apache.sis.gui.dataset.WindowHandler;
-import org.apache.sis.gui.map.MapCanvas;
-import org.apache.sis.gui.map.GestureFollower;
-import org.apache.sis.gui.internal.Resources;
-
-
-/**
- * Provides a widget for listing all available windows and selecting the ones
- * on which to replicate gesture events (zoom, pans, <i>etc</i>).
- *
- * @author  Martin Desruisseaux (Geomatys)
- */
-@Deprecated(since = "1.7", forRemoval = true)
-public final class SyncWindowList extends TabularWidget implements ListChangeListener<WindowHandler> {
-    /**
-     * Window containing a {@link MapCanvas} on which to replicate gesture events.
-     * Gestures are replicated only if {@link #transformEnabled} is {@code true}.
-     */
-    private static final class Link extends GestureFollower {
-        /**
-         * The "foreigner" view on which to replicate the gestures.
-         */
-        public final WindowHandler view;
-
-        /**
-         * Creates a new row for a window on which to replicate gestures.
-         *
-         * @param  view    the "foreigner" view on which to replicate the gesture events.
-         * @param  source  the canvas which is the source of zoom, pan or rotation events.
-         * @param  target  the canvas on which to apply the changes of zoom, pan or rotation.
-         */
-        private Link(final WindowHandler view, final MapCanvas source, final MapCanvas target) {
-            super(source, target);
-            this.view = view;
-        }
-
-        /**
-         * Converts the given list of handlers to a list of table rows.
-         *
-         * @param  added   list of new items to put in the table.
-         * @param  addTo   where to add the converted items.
-         * @param  owner   item to exclude (because the referenced window is itself).
-         * @param  source  the canvas for which to replicate the changes of zoom, pan or rotation.
-         */
-        static void wrap(final List<? extends WindowHandler> added, final List<Link> addTo,
-                         final WindowHandler owner, final MapCanvas source)
-        {
-            final Link[] items = new Link[added.size()];
-            int count = 0;
-            try {
-                for (final WindowHandler view : added) {
-                    if (view != owner) {
-                        final MapCanvas target = view.getCanvas().orElse(null);
-                        if (target != null) {
-                            final Link item = new Link(view, source, target);;
-                            items[count++] = item;          // Add now for disposing if an exception is thrown.
-                            item.initialize();              // Invoked outside constructor for allowing disposal.
-                            item.cursorEnabled.set(true);
-                        }
-                    }
-                }
-                addTo.addAll(Containers.viewAsUnmodifiableList(items, 0, count));
-            } catch (Throwable e) {
-                while (--count >= 0) {
-                    items[--count].dispose();               // Remove listeners for avoiding memory leak.
-                }
-                throw e;
-            }
-        }
-    }
-
-    /**
-     * The table showing values associated with colors.
-     */
-    private final TableView<Link> table;
-
-    /**
-     * The button for creating a new window.
-     */
-    private final Button newWindow;
-
-    /**
-     * The view for which to create a list of synchronized windows.
-     */
-    private final WindowHandler owner;
-
-    /**
-     * The canvas for which to replicate the changes of zoom, pan or rotation.
-     * Needs to be fetched only when first needed (not at construction time)
-     * for avoiding a stack overflow.
-     */
-    private MapCanvas source;
-
-    /**
-     * The component to be returned by {@link #getView()}.
-     */
-    private final VBox content;
-
-    /**
-     * Creates a new "synchronized windows" widget.
-     *
-     * @param  owner       the view for which to create a list of synchronized windows.
-     * @param  resources   localized resources, given because already known by the caller.
-     * @param  vocabulary  localized resources, given because already known by the caller
-     *                     (those arguments would be removed if this constructor was public API).
-     */
-    @SuppressWarnings({"this-escape", "unchecked"})
-    public SyncWindowList(final WindowHandler owner, final Resources resources, final Vocabulary vocabulary) {
-        this.owner = owner;
-        table = newTable();
-        newWindow = new Button(resources.getString(Resources.Keys.NewWindow));
-        newWindow.setMaxWidth(Double.MAX_VALUE);
-        /*
-         * The first column contains a checkbox for choosing whether the window should be followed or not.
-         */
-        table.getColumns().setAll(
-                newBooleanColumn(/* 🔗 (link symbol) */  "\uD83D\uDD17",      (cell) -> cell.getValue().transformEnabled),
-                newStringColumn (vocabulary.getString(Vocabulary.Keys.Title), (cell) -> cell.getValue().view.title));
-        table.setRowFactory(SyncWindowList::newRow);
-        /*
-         * Build all other widget controls.
-         */
-        newWindow.setOnAction((e) -> owner.duplicate().show());
-        VBox.setVgrow(table, Priority.ALWAYS);
-        VBox.setVgrow(newWindow, Priority.NEVER);
-        content = new VBox(9, table, newWindow);
-        /*
-         * Add listener last when the everything else is successful (because the `this` reference escapes).
-         * The creation of table item list needs to be done after the caller finished its initialization,
-         * not now, because invoking`owner.getCanvas()` here create an infinite loop.
-         */
-        Platform.runLater(() -> addAll(owner.manager.windows));
-        owner.manager.windows.addListener(this);
-    }
-
-    /**
-     * Invoked when `TableView` needs to create a new row for rendering purpose.
-     * This is the place where to configure each {@code TableRow} instances.
-     *
-     * @param  table  the table which needs a new row.
-     * @return the new row.
-     */
-    private static TableRow<Link> newRow(final TableView<Link> table) {
-        final var row = new TableRow<Link>();
-        row.addEventFilter(MouseEvent.MOUSE_CLICKED, SyncWindowList::onMouseClicked);
-        return row;
-    }
-
-    /**
-     * Invoked when the user clicked on a cell of the row. We register this listener as a filter,
-     * e.g. this is invoked before the table row see the event, so we can prevent the event to be
-     * forwarded to the cell if desired.
-     */
-    private static void onMouseClicked(final MouseEvent event) {
-        if (event.getClickCount() == 2) {
-            final TableRow<?> row = (TableRow<?>) event.getSource();
-            final Link item = (Link) row.getItem();
-            item.view.show();
-            event.consume();
-            /*
-             * If the cell was already selected, the first click caused the cell to enter in editing mode
-             * before the second click is detected. We want to cancel the edition since we moved focus to
-             * another window. The javadoc for the following method said: "Note: This method will cancel
-             * editing if the given row value is less than zero and the given column is null."
-             */
-            row.getTableView().edit(-1, null);
-        }
-    }
-
-    /**
-     * Returns the encapsulated JavaFX component to add in a scene graph for making the widget visible.
-     * The {@code Region} subclass is implementation dependent and may change in any future SIS version.
-     *
-     * @return the JavaFX component to insert in a scene graph.
-     */
-    @Override
-    public Region getView() {
-        return content;
-    }
-
-    /**
-     * Invoked when new items are added or removed in the list of windows.
-     *
-     * @param  change  a description of changes in the list of windows.
-     */
-    @Override
-    public void onChanged(final Change<? extends WindowHandler> change) {
-        while (change.next()) {
-            // Ignore permutations; each table can have its own order.
-            if (change.wasRemoved()) {
-                // List of removed items usually has a single element.
-                final ObservableList<Link> items = table.getItems();
-                for (final WindowHandler view : change.getRemoved()) {
-                    for (int i = items.size(); --i >= 0;) {
-                        final Link item = items.get(i);
-                        if (item.view == view) {
-                            items.remove(i);
-                            item.dispose();
-                            break;
-                        }
-                    }
-                }
-            }
-            if (change.wasAdded()) {
-                addAll(change.getAddedSubList());
-            }
-        }
-    }
-
-    /**
-     * Adds the given window handlers and items in {@link #table}.
-     */
-    private void addAll(final List<? extends WindowHandler> windows) {
-        if (source == null) {
-            source = owner.getCanvas().get();
-        }
-        Link.wrap(windows, table.getItems(), owner, source);
-    }
-}
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/coverage/CoverageExplorer.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/coverage/CoverageExplorer.java
index c4a8bd1bf7..0934d4d37a 100644
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/coverage/CoverageExplorer.java
+++ b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/coverage/CoverageExplorer.java
@@ -23,14 +23,10 @@ import java.util.Optional;
 import java.awt.image.RenderedImage;
 import javafx.application.Platform;
 import javafx.beans.DefaultProperty;
-import javafx.scene.control.Control;
 import javafx.scene.control.SplitPane;
-import javafx.scene.control.Separator;
-import javafx.scene.control.ToggleGroup;
 import javafx.scene.control.Toggle;
 import javafx.scene.control.TitledPane;
 import javafx.scene.layout.Region;
-import javafx.event.ActionEvent;
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.property.SimpleObjectProperty;
 import org.opengis.metadata.Identifier;
@@ -45,13 +41,10 @@ import org.apache.sis.gui.Widget;
 import org.apache.sis.gui.map.StatusBar;
 import org.apache.sis.gui.internal.FontGIS;
 import org.apache.sis.gui.internal.Resources;
-import org.apache.sis.gui.internal.ToolbarButton;
 import org.apache.sis.gui.internal.NonNullObjectProperty;
-import org.apache.sis.gui.internal.PrivateAccess;
 import org.apache.sis.gui.internal.BackgroundThreads;
 import org.apache.sis.gui.referencing.RecentReferenceSystems;
 import static org.apache.sis.gui.internal.LogHandler.LOGGER;
-import org.apache.sis.gui.dataset.WindowHandler;
 
 
 /**
@@ -224,15 +217,6 @@ public class CoverageExplorer extends Widget {
      */
     private SplitPane content;
 
-    /**
-     * Handler of the window showing this coverage view. This is used for creating new windows.
-     * Created when first needed for giving to subclasses a chance to complete initialization.
-     *
-     * @see #getWindowHandler()
-     */
-    @Deprecated(since = "1.7", forRemoval = true)
-    private WindowHandler window;
-
     /**
      * Creates an initially empty explorer with the specified view type.
      *
@@ -256,50 +240,6 @@ public class CoverageExplorer extends Widget {
         coverageProperty.addListener((p,o,n) -> onPropertySet(null, n, resourceProperty));
     }
 
-    /**
-     * Creates an explorer initialized with the same coverage or resource than the given explorer.
-     *
-     * @param  source  the source explorer from which to take the initial coverage or resource.
-     *
-     * @since 1.2
-     */
-    @SuppressWarnings("this-escape")
-    public CoverageExplorer(final CoverageExplorer source) {
-        this(source.getViewType());
-        window = PrivateAccess.newWindowHandler.apply(source.window, this);
-        source.getImageRequest().ifPresent(this::setCoverage);
-        PrivateAccess.finishWindowHandler.accept(window);
-        if (getViewType() == View.IMAGE) {
-            getCoverageControls().copyStyling(source.getCoverageControls());
-        }
-    }
-
-    /**
-     * Returns the handler of the window showing this coverage view.
-     * Those windows are created when the user clicks on the "New window" button.
-     * Each window provides the area where data are shown and where the user interacts.
-     * The window can be a JavaFX top-level window ({@link javafx.stage.Stage}), but not necessarily.
-     * It may also be a tile in a mosaic of windows.
-     *
-     * @return the handler of the window showing this coverage view.
-     *
-     * @since 1.3
-     *
-     * @deprecated Replaced by {@link org.apache.sis.gui.map.MapWindows}.
-     */
-    @Deprecated(since = "1.7", forRemoval = true)
-    public final WindowHandler getWindowHandler() {
-        assert Platform.isFxApplicationThread();
-        /*
-         * Created when first needed for giving to subclass constructors a chance to complete
-         * their initialization before `this` reference is passed to `WindowHandler` constructor.
-         */
-        if (window == null) {
-            window = WindowHandler.create(this);
-        }
-        return window;
-    }
-
     /**
      * Returns the canvas where the image is shown.
      *
@@ -366,23 +306,6 @@ public class CoverageExplorer extends Widget {
          * Instead, it will invoke `getDataView(View)` or `getControls(View)` and layout those regions itself.
          */
         if (content == null) {
-            /*
-             * Prepare buttons to add on the toolbar. Those buttons are not managed by this class;
-             * they are managed by org.apache.sis.gui.dataset.WindowHandler. We only declare here
-             * the text and action for each button.
-             */
-            final ToggleGroup group   = new ToggleGroup();
-            final Control[]   buttons = new Control[View.COUNT + 1];
-            final Resources localized = Resources.forLocale(getLocale());
-            buttons[0] = new Separator();
-            for (final View type : View.values()) {
-                buttons[1 + type.ordinal()] = new Selector(type).createButton(group, type.icon, type.fallback, localized, type.tooltip);
-            }
-            final View type = getViewType();
-            final ViewAndControls c = getViewAndControls(type, false);
-            group.selectToggle(group.getToggles().get(type.ordinal()));
-            content = new SplitPane(c.controls(), c.viewAndNavigation);
-            ToolbarButton.insert(content, buttons);
             /*
              * The divider position is supposed to be a fraction between 0 and 1. A value of 1 would mean
              * to give all the space to controls and no space to data, which is not what we want. However
@@ -422,31 +345,6 @@ public class CoverageExplorer extends Widget {
         return getViewAndControls(Objects.requireNonNull(type), false).controlPanes.clone();
     }
 
-    /**
-     * The action to execute when the user selects a view.
-     * This is used by the toolbar buttons in the widget created by {@link #getView()}.
-     */
-    private final class Selector extends ToolbarButton {
-        /** The view to select when the button is pressed. */
-        private final View type;
-
-        /** Creates a new action which will show the view at the given index. */
-        Selector(final View type) {
-            this.type = type;
-        }
-
-        /** Invoked when the user selects another view to show (tabular data or the image). */
-        @Override public void handle(final ActionEvent event) {
-            final Toggle button = (Toggle) event.getSource();
-            if (button.isSelected()) {
-                setViewType(type);
-                views.get(type).selector = button;          // Should never be null.
-            } else {
-                button.setSelected(true);       // Prevent situation where all buttons are unselected.
-            }
-        }
-    }
-
     /**
      * Returns the type of view (image or tabular data) shown in this explorer.
      * The default value is {@link View#TABLE}.
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/WindowHandler.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/WindowHandler.java
deleted file mode 100644
index 040e3ba925..0000000000
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/WindowHandler.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.gui.dataset;
-
-import java.util.Locale;
-import java.util.Optional;
-import javafx.application.Platform;
-import javafx.stage.Stage;
-import javafx.stage.Window;
-import javafx.stage.WindowEvent;
-import javafx.event.EventHandler;
-import javafx.scene.layout.Region;
-import javafx.beans.value.ChangeListener;
-import javafx.beans.property.StringProperty;
-import javafx.beans.property.SimpleStringProperty;
-import javafx.collections.ObservableList;
-import org.apache.sis.util.resources.Errors;
-import org.apache.sis.storage.Resource;
-import org.apache.sis.storage.DataStoreException;
-import org.apache.sis.storage.event.CloseEvent;
-import org.apache.sis.storage.event.StoreListener;
-import org.apache.sis.gui.coverage.CoverageExplorer;
-import org.apache.sis.gui.map.MapCanvas;
-import org.apache.sis.gui.internal.BackgroundThreads;
-import org.apache.sis.gui.internal.DataStoreOpener;
-import org.apache.sis.gui.internal.GUIUtilities;
-import org.apache.sis.gui.internal.PrivateAccess;
-import org.apache.sis.gui.internal.Resources;
-import org.apache.sis.util.logging.Logging;
-import static org.apache.sis.gui.internal.LogHandler.LOGGER;
-
-
-/**
- * A separated window for visualizing a resource managed by {@link ResourceExplorer}.
- * A window provides the area where the data are shown and where the user interacts.
- * The window can be a JavaFX top-level window ({@link Stage}), but not necessarily.
- * It may also be a tile in a mosaic of windows.
- *
- * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
- * @since   1.3
- *
- * @deprecated Replaced by {@link org.apache.sis.gui.map.MapWindows}.
- */
-@Deprecated(since = "1.7", forRemoval = true)
-public abstract class WindowHandler {
-    /**
-     * The window manager which contains this handler.
-     * The manager contains the list of all windows created for the same widget.
-     */
-    public final WindowManager manager;
-
-    /**
-     * The window where the resource is visualized. This is created when first needed.
-     * We assume that resource views do not change their window during their lifetime.
-     *
-     * @see #show()
-     */
-    private Stage window;
-
-    /**
-     * The property for a label that identify the view. If the resource is shown
-     * in a top-level window, then this is typically the title of that window.
-     */
-    public final StringProperty title;
-
-    /**
-     * The listener to add and remove to/from the {@link #title} property. We use a static reference for avoiding
-     * to retain a direct reference to {@link #window} in listeners, which would increase the risk of memory leak.
-     */
-    private static final ChangeListener<String> TITLE_CHANGED = (p,o,n) -> {
-        final var handler = (WindowHandler) ((StringProperty) p).getBean();
-        handler.window.setTitle(n + " — Apache SIS");
-    };
-
-    /**
-     * Creates a new handler for a window showing a resource.
-     * Exactly one of {@code creator} or {@code locale} arguments should be non-null.
-     *
-     * @param creator  the handler which is duplicated, or {@code null} if none.
-     * @param locale   language of texts. Used only if {@code creator} is null.
-     */
-    WindowHandler(final WindowHandler creator, final Locale locale) {
-        manager = (creator != null) ? creator.manager : new WindowManager(this, locale);
-        title = new SimpleStringProperty(this, "title");
-    }
-
-    /**
-     * Methods to be invoked last by constructors, after everything else succeeded.
-     * Construction must be completed before invoking this method because this call will notify listeners.
-     *
-     * @return {@code this} for method call chaining.
-     */
-    final WindowHandler finish() {
-        BackgroundThreads.execute(() -> {
-            String text;
-            final Locale locale = manager.locale;
-            if (manager.main == this) {
-                text = Resources.forLocale(locale).getString(Resources.Keys.MainWindow);
-            } else try {
-                text = DataStoreOpener.findLabel(getResource(), locale, true);
-            } catch (DataStoreException | RuntimeException e) {
-                text = DataStoreOpener.fallbackLabel(getResource(), locale);
-                Logging.recoverableException(LOGGER, WindowHandler.class, "<init>", e);
-            }
-            final String label = text;      // Because lambda functions want final variable.
-            Platform.runLater(() -> title.set(label));
-        });
-        manager.modifiableWindowList.add(this);
-        return this;
-    }
-
-    /**
-     * Creates a new handler for the window which is showing the given coverage viewer.
-     *
-     * @param  widget the widget for which to create a handler.
-     * @return a handler for the window of the given widget.
-     */
-    public static WindowHandler create(final CoverageExplorer widget) {
-        return new ForCoverage(null, widget.getLocale(), widget).finish();
-    }
-
-    /**
-     * Creates a new handler for the window which is showing the given table of features.
-     *
-     * @param  widget the widget for which to create a handler.
-     * @return a handler for the window of the given widget.
-     */
-    public static WindowHandler create(final FeatureTable widget) {
-        return new ForFeatures(null, widget.textLocale, widget).finish();
-    }
-
-    /**
-     * Prepares a new window with the same content as the window managed by this handler.
-     * This method can be used for creating many windows over the same data.
-     * Each window can do pans, zooms and rotations independently of other windows,
-     * or be synchronized with other windows, at user's choice.
-     *
-     * <p>The new view is added to the {@link WindowManager#windows} list and will be removed
-     * from that list if the window is closed. If the resource is closed in the window manager,
-     * then all windows showing that resource will be closed.</p>
-     *
-     * <p>The new window is not initially visible.
-     * To show the window, invoke {@link #show()} on the returned handler.</p>
-     *
-     * @return information about the new window.
-     */
-    public abstract WindowHandler duplicate();
-
-    /**
-     * The resource shown in the {@linkplain #window}, or {@code null} if unspecified.
-     * This is used for identifying which handlers to remove when a resource is closed.
-     * This method is not yet public because a future version may need to return a full
-     * map context instead of a single resource.
-     *
-     * @return the resource shown in the window.
-     *
-     * @see CoverageExplorer#getResource()
-     * @see FeatureTable#getFeatures()
-     */
-    abstract Resource getResource();
-
-    /**
-     * Returns the canvas (if any) where the resource is shown.
-     * Canvas exists for some kinds of view such as {@link CoverageExplorer}, but not for every kinds.
-     * For example, tabular data such as {@link FeatureTable} have no canvas.
-     *
-     * @return the canvas where the resource is shown.
-     *
-     * @see CoverageExplorer#getCanvas()
-     */
-    public abstract Optional<MapCanvas> getCanvas();
-
-    /**
-     * Returns the JavaFX region where the resource is shown.
-     * This value shall be stable.
-     */
-    abstract Region getView();
-
-    /**
-     * Returns the window which is showing the resource.
-     * This is used for fetching the main window.
-     */
-    Window getWindow() {
-        return GUIUtilities.getWindow(getView());
-    }
-
-    /**
-     * Shows the window and brings it to the front.
-     * For handlers created by a {@code create(…)} method, this {@code show()} method can be invoked at any time.
-     * For handlers created by {@link #duplicate()}, this {@code show()} method can be invoked as long as the window
-     * has not been closed. After a duplicated window has been closed, it is not possible to show it again.
-     *
-     * @throws IllegalStateException if this handler is a {@linkplain #duplicate() duplicate}
-     *         and the window has been closed.
-     */
-    public void show() {
-        if (window == null) {
-            if (manager.main == this) {
-                if (getWindow() instanceof Stage w) {
-                    window = w;
-                } else {
-                    return;
-                }
-            } else {
-                final Resource resource = getResource();
-                if (resource == null) {
-                    throw new IllegalStateException(Errors.format(Errors.Keys.DisposedInstanceOf_1, getClass()));
-                }
-                final OnClose listener = new OnClose();
-                resource.addListener(CloseEvent.class, listener);
-                window = manager.newWindow(getView());
-                window.setOnHidden(listener);
-                title.addListener(TITLE_CHANGED);
-                TITLE_CHANGED.changed(title, null, title.get());
-            }
-        }
-        window.show();
-        window.toFront();
-    }
-
-    /**
-     * The action to execute when a window is closed or when the resource shown in windows is closed.
-     * When the event is a window closing, it impacts only that window. When the event is a resource
-     * closing, it impacts all windows showing that resource.
-     */
-    private final class OnClose implements StoreListener<CloseEvent>, EventHandler<WindowEvent> {
-        /**
-         * Creates a new listener to be notified when a window or a resource is closed.
-         */
-        OnClose() {
-        }
-
-        /**
-         * Invoked in JavaFX thread when the window is closing.
-         */
-        @Override public void handle(final WindowEvent event) {
-            manager.modifiableWindowList.remove(WindowHandler.this);
-            final Resource resource = getResource();
-            if (resource != null) {
-                resource.removeListener(CloseEvent.class, this);
-            }
-            dispose();
-        }
-
-        /**
-         * Invoked when a resource is closing. This method can be invoked from any thread, but the actual work
-         * will done in the JavaFX thread. If the {@link CloseEvent} is fired from a background thread, then
-         * this method will block until the JavaFX thread finished to close all windows, for avoiding that
-         * the background thread closes the resource before we removed all usages in JavaFX thread.
-         */
-        @Override public void eventOccurred(final CloseEvent event) {
-            final Resource resource = event.getSource();
-            if (Platform.isFxApplicationThread()) {
-                close(resource);
-            } else BackgroundThreads.runAndWaitDialog(() -> {
-                close(resource);
-                return null;
-            });
-            // No need to invoke `resource.removeListener(…)`, that work is done by `StoreListeners.close()`.
-        }
-    }
-
-    /**
-     * Closes all windows (except the main window) which are showing the given resource.
-     * This is invoked when the resource has been closed in the {@link ResourceTree}.
-     * The handler managed by {@code this} is closed unconditionally regardless its resource.
-     *
-     * @param  resource  the resource which has been closed.
-     */
-    private void close(final Resource resource) {
-        final WindowHandler ignore = manager.main;
-        final ObservableList<WindowHandler> windows = manager.modifiableWindowList;
-        for (int i = windows.size(); --i >= 0;) {
-            final WindowHandler handler = windows.get(i);
-            if (handler != ignore && (handler == this || handler.getResource() == resource)) {
-                windows.remove(i);
-                if (handler.window != null) {
-                    handler.window.setOnHidden(null);       // Because we will invoke `dispose()` ourselves.
-                    handler.window.close();
-                }
-                handler.dispose();
-            }
-        }
-    }
-
-    /**
-     * Makes a "best effort" for helping the garbage-collector to release memory.
-     * This method is for internal usage by {@code WindowHandler} and subclasses only.
-     * Caller shall remove this handler from the windows list before invoking this method.
-     */
-    void dispose() {
-        assert manager.main != this;                // Because listener is not registered for main window.
-        title.removeListener(TITLE_CHANGED);
-        if (window != null) {
-            window.setScene(null);
-            window = null;
-        }
-    }
-
-
-
-    /**
-     * A visualization managed by a {@link CoverageExplorer} instance.
-     * The initial {@code CoverageExplorer} instance (before duplication)
-     * is itself produced by a {@link ResourceExplorer}.
-     */
-    private static final class ForCoverage extends WindowHandler {
-        /**
-         * The widget providing the view.
-         */
-        private final CoverageExplorer widget;
-
-        /**
-         * Creates a new handler for a window showing a resource.
-         *
-         * @param creator  the handler which is duplicated, or {@code null} if none.
-         * @param locale   language of texts. Used only if {@code creator} is null.
-         * @param widget   the widget providing the view of the resource.
-         */
-        ForCoverage(final WindowHandler creator, final Locale locale, final CoverageExplorer widget) {
-            super(creator, locale);
-            this.widget = widget;
-        }
-
-        /**
-         * Creates a new handler for duplicating an existing window.
-         * For indirect usage by {@link #duplicate()}.
-         *
-         * @param creator  the handler which is duplicated.
-         * @param widget   the widget providing the new view of the resource.
-         */
-        private ForCoverage(final WindowHandler creator, final CoverageExplorer widget) {
-            this(creator, null, widget);
-        }
-        static {
-            PrivateAccess.newWindowHandler = ForCoverage::new;
-            PrivateAccess.finishWindowHandler = WindowHandler::finish;
-        }
-
-        /**
-         * The resource shown in the {@linkplain #window window}, or {@code null} if unspecified.
-         */
-        @Override
-        Resource getResource() {
-            return widget.getResource();
-        }
-
-        /**
-         * Returns the canvas where the map is shown.
-         */
-        @Override
-        public Optional<MapCanvas> getCanvas() {
-            return Optional.of(widget.getCanvas());
-        }
-
-        /**
-         * Returns the JavaFX region where the resource is shown.
-         */
-        @Override
-        Region getView() {
-            return widget.getView();
-        }
-
-        /**
-         * Returns the window which is showing the resource. We avoid the call to {@link #getView()}
-         * because in the particular case of {@link CoverageExplorer}, it causes the initialization
-         * of a split pane which is not the one used by the main window.
-         */
-        @Override
-        Window getWindow() {
-            return GUIUtilities.getWindow(widget.getDataView(widget.getViewType()));
-        }
-
-        /**
-         * Prepares (without showing) a new window with the same content as the window managed by this handler.
-         */
-        @Override
-        public WindowHandler duplicate() {
-            return new CoverageExplorer(widget).getWindowHandler();
-        }
-
-        /**
-         * Makes a "best effort" for helping the garbage-collector to release resources.
-         */
-        @Override
-        void dispose() {
-            super.dispose();
-            widget.setResource(null);
-        }
-    }
-
-
-
-
-    /**
-     * A visualization managed by a {@link FeatureTable} instance.
-     * The initial {@code FeatureTable} instance (before duplication)
-     * is itself produced by a {@link ResourceExplorer}.
-     */
-    private static final class ForFeatures extends WindowHandler {
-        /**
-         * The widget providing the view.
-         */
-        private final FeatureTable widget;
-
-        /**
-         * Creates a new handler for a window showing a resource.
-         *
-         * @param creator  the handler which is duplicated, or {@code null} if none.
-         * @param locale   language of texts. Used only if {@code creator} is null.
-         * @param widget   the widget providing the view of the resource.
-         */
-        ForFeatures(final WindowHandler creator, final Locale locale, final FeatureTable widget) {
-            super(creator, locale);
-            this.widget = widget;
-        }
-
-        /**
-         * The resource shown in the {@linkplain #window window}, or {@code null} if unspecified.
-         */
-        @Override
-        Resource getResource() {
-            return widget.getFeatures();
-        }
-
-        /**
-         * Returns an empty value since this window does not show map.
-         */
-        @Override
-        public Optional<MapCanvas> getCanvas() {
-            return Optional.empty();
-        }
-
-        /**
-         * Returns the JavaFX region where the resource is shown.
-         */
-        @Override
-        Region getView() {
-            return widget;
-        }
-
-        /**
-         * Prepares (without showing) a new window with the same content as the window managed by this handler.
-         */
-        @Override
-        public WindowHandler duplicate() {
-            return new ForFeatures(this, null, new FeatureTable(widget)).finish();
-        }
-
-        /**
-         * Makes a "best effort" for helping the garbage-collector to release resources.
-         */
-        @Override
-        void dispose() {
-            super.dispose();
-            widget.setFeatures(null);
-        }
-    }
-}
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/WindowManager.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/WindowManager.java
deleted file mode 100644
index 7159d7b818..0000000000
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/WindowManager.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.gui.dataset;
-
-import java.util.Locale;
-import javafx.stage.Stage;
-import javafx.stage.Screen;
-import javafx.scene.Scene;
-import javafx.scene.Node;
-import javafx.scene.control.Button;
-import javafx.scene.control.Labeled;
-import javafx.scene.control.ToolBar;
-import javafx.scene.control.Tooltip;
-import javafx.scene.layout.BorderPane;
-import javafx.scene.layout.Region;
-import javafx.scene.text.Font;
-import javafx.geometry.Rectangle2D;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import org.apache.sis.gui.internal.FontGIS;
-import org.apache.sis.gui.internal.Resources;
-import org.apache.sis.gui.internal.ToolbarButton;
-
-
-/**
- * A list of windows showing resources managed by {@link ResourceExplorer}.
- * Windows are created when user clicks on the "New window" button.
- * Many windows can be created for the same resource.
- * Each window can apply different styles or map projections.
- * Gestures such as zooms, pans and rotations can be applied independently
- * or synchronized between windows, at user's choice.
- *
- * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
- * @since   1.3
- *
- * @deprecated Replaced by {@link org.apache.sis.gui.map.MapWindows}.
- */
-@Deprecated(since = "1.7", forRemoval = true)
-public final class WindowManager {          // Not designed for subclassing.
-    /**
-     * The handler of the main window. This handler shall never be disposed.
-     */
-    final WindowHandler main;
-
-    /**
-     * The language of texts to show to the user.
-     */
-    final Locale locale;
-
-    /**
-     * Read-only list of windows showing resources managed by {@link ResourceExplorer}.
-     * Items are added in this list when the user clicks on "New window" button and are
-     * removed from this list when the user closes the window.
-     */
-    public final ObservableList<WindowHandler> windows;
-
-    /**
-     * Modifiable list where to append new windows when they are created.
-     * This is the source of {@link #windows} list.
-     */
-    final ObservableList<WindowHandler> modifiableWindowList;
-
-    /**
-     * Creates a new window manager.
-     *
-     * @param  main    handler of the main window. This handler shall never be disposed.
-     * @param  locale  the language of texts to show to the user.
-     */
-    WindowManager(final WindowHandler main, final Locale locale) {
-        this.main   = main;
-        this.locale = locale;
-        modifiableWindowList = FXCollections.observableArrayList();
-        windows = FXCollections.unmodifiableObservableList(modifiableWindowList);
-    }
-
-    /**
-     * Creates a new window for the specified widget together with its toolbar.
-     * The new window will be positioned in the screen center but not yet shown.
-     * The window will have initially no title (title should be set by caller).
-     *
-     * @param  content  control that contains the data to show in a new window.
-     * @return window for showing the resource. Untitled and not yet visible.
-     */
-    @Deprecated(since = "1.7", forRemoval = true)
-    final Stage newWindow(final Region content) {
-        final Stage     stage      = new Stage();
-        final Button    mainWindow = FontGIS.button((char) 0,                 "\uD83D\uDDD4");   // 🗔 — Desktop Window
-        final Button    fullScreen = FontGIS.button(FontGIS.Code.FULL_SCREEN, "\u21F1\uFE0F");   // ⇱ — North West Arrow to Corner
-        final Resources localized  = Resources.forLocale(locale);
-        mainWindow.setTooltip(new Tooltip(localized.getString(Resources.Keys.MainWindow)));
-        fullScreen.setTooltip(new Tooltip(localized.getString(Resources.Keys.FullScreen)));
-        mainWindow.setOnAction((e) -> main.show());
-        fullScreen.setOnAction((e) -> stage.setFullScreen(true));
-        /*
-         * Add content-specific buttons. We use the "org.apache.sis.gui.ToolbarButton" property
-         * as a way to transfer ToolbarButton accross packages without making this class public.
-         */
-        final ToolBar tools = new ToolBar(mainWindow, fullScreen);
-        tools.getItems().addAll(ToolbarButton.remove(content));
-        /*
-         * After we finished adding all buttons, set the font of all of them to a larger size.
-         */
-        final Font font = Font.font(20);
-        for (final Node node : tools.getItems()) {
-            if (node instanceof Labeled) {
-                ((Labeled) node).setFont(font);
-            }
-        }
-        /*
-         * Main content. The tools bar will be hidden in full screen mode.
-         */
-        final BorderPane pane = new BorderPane();
-        stage.fullScreenProperty().addListener((p,o,entering) -> pane.setTop(entering ? null : tools));
-        pane.setTop(tools);
-        pane.setCenter(content);
-        stage.setScene(new Scene(pane));
-        /*
-         * We use an initial size covering a large fraction of the screen because
-         * this window is typically used for showing image or large tabular data.
-         */
-        final Rectangle2D bounds = Screen.getPrimary().getVisualBounds();
-        stage.setWidth (0.8 * bounds.getWidth());
-        stage.setHeight(0.8 * bounds.getHeight());
-        return stage;
-    }
-}
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/package-info.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/package-info.java
index 132ef13ed2..2e3c6dcdd9 100644
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/package-info.java
+++ b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/dataset/package-info.java
@@ -24,7 +24,7 @@
  * @author  Smaniotto Enzo (GSoC)
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   1.1
  */
 package org.apache.sis.gui.dataset;
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/internal/PrivateAccess.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/internal/PrivateAccess.java
deleted file mode 100644
index 505f87fd3c..0000000000
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/internal/PrivateAccess.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.gui.internal;
-
-import java.util.function.Consumer;
-import java.util.function.BiFunction;
-import org.apache.sis.gui.coverage.CoverageExplorer;
-import org.apache.sis.gui.dataset.WindowHandler;
-
-
-/**
- * Accessor for fields that we want to keep private for now.
- * This is a way to simulate the behavior of {@code friend} keyword in C++.
- * Each field shall be set only once in a static block initializer and shall
- * not be modified after initialization.
- *
- * @author  Martin Desruisseaux (Geomatys)
- */
-@Deprecated(since = "1.7", forRemoval = true)
-public final class PrivateAccess {
-    /**
-     * Do not allow instantiation of this class.
-     */
-    private PrivateAccess() {
-    }
-
-    /**
-     * Accessor for {@link org.apache.sis.gui.dataset.WindowHandler.ForCoverage} constructor.
-     * Used for assigning {@link CoverageExplorer#window} when duplicating an existing window.
-     * Shall be invoked in JavaFX thread.
-     */
-    public static volatile BiFunction<WindowHandler, CoverageExplorer, WindowHandler> newWindowHandler;
-
-    /**
-     * Accessor for {@link WindowHandler#finish()} method. Shall be invoked in JavaFX thread.
-     */
-    public static volatile Consumer<WindowHandler> finishWindowHandler;
-}
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/internal/ToolbarButton.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/internal/ToolbarButton.java
deleted file mode 100644
index 795a2c7fcf..0000000000
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/internal/ToolbarButton.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sis.gui.internal;
-
-import javafx.scene.Node;
-import javafx.scene.control.Control;
-import javafx.scene.control.ToggleButton;
-import javafx.scene.control.ToggleGroup;
-import javafx.scene.control.Tooltip;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
-import org.apache.sis.util.ArraysExt;
-
-
-/**
- * Builder for a button to add in a the toolbar of a {@link org.apache.sis.gui.dataset} window.
- * This class is used only for content-specific buttons; it is not used for all buttons created
- * by the {@code dataset} package. A {@code ToolbarButton} can create and configure a button with its icon,
- * tooltip text and action to execute when the button is pushed.
- *
- * <p>This class is defined in this internal package for allowing interactions between classes
- * in different packages without making toolbar API public.</p>
- *
- * @author  Martin Desruisseaux (Geomatys)
- */
-public abstract class ToolbarButton implements EventHandler<ActionEvent> {
-    /**
-     * The property to use in {@link Node#getProperties()} for storing instances of this class.
-     * Values associated with this key shall be arrays of {@code Control[]} type.
-     */
-    private static final String PROPERTY_KEY = "org.apache.sis.gui.ToolbarButtons";
-
-    /**
-     * Gets and removes the toolbar buttons associated with the given content pane. Those buttons
-     * should have been specified by a previous call to {@link #insert(Node, Control...)}.
-     * They will be requested by {@link org.apache.sis.gui.dataset.WindowHandler} only once,
-     * which is why we remove them afterward.
-     *
-     * @param  content  the pane for which to get the toolbar buttons.
-     * @return the toolbar buttons (never null, but may be empty).
-     *
-     * @deprecated following deprecation of {@code WindowHandler}.
-     */
-    @Deprecated(since = "1.7", forRemoval = true)
-    public static Control[] remove(final Node content) {
-        final Control[] buttons = (Control[]) content.getProperties().remove(PROPERTY_KEY);
-        return (buttons != null) ? buttons : new Control[0];
-    }
-
-    /**
-     * Sets the toolbar buttons that the given pane wants to have in the data window.
-     * If the pane already has buttons, the new ones will be inserted before existing ones.
-     *
-     * @param  content  the pane for which to set the toolbar buttons.
-     * @param  buttons  the toolbar buttons to add.
-     */
-    public static void insert(final Node content, final Control... buttons) {
-        content.getProperties().merge(PROPERTY_KEY, buttons, ToolbarButton::prepend);
-    }
-
-    /**
-     * Invoked if toolbar buttons already exist for a pane, in which case the new ones
-     * are inserted before the existing ones.
-     */
-    private static Object prepend(final Object oldValue, final Object newValue) {
-        return ArraysExt.append((ToolbarButton[]) newValue, (ToolbarButton[]) oldValue);
-    }
-
-    /**
-     * For subclass constructors.
-     */
-    protected ToolbarButton() {
-    }
-
-    /**
-     * Convenience method for creating a button.
-     * The action handler will be {@code this}.
-     *
-     * @param  group      the group of the toggle button.
-     * @param  icon       the character to put in the button, as a {@link FontGIS} code.
-     * @param  fallback   the text to put in the button as a Unicode emoji if Font-GIS is not available.
-     * @param  localized  an instance of {@link Resources} for current locale.
-     * @param  tooltip    the {@link Resources.Keys} value for the tooltip.
-     * @return the button configured with text or icon, tooltip and action.
-     */
-    public final ToggleButton createButton(final ToggleGroup group, final char icon, final String fallback, final Resources localized, final short tooltip) {
-        final ToggleButton tb = FontGIS.toggle(icon, fallback);
-        tb.setToggleGroup(group);
-        tb.setTooltip(new Tooltip(localized.getString(tooltip)));
-        tb.setOnAction(this);
-        return tb;
-    }
-
-    /**
-     * Invoked when the user pushed the button.
-     *
-     * @param  event  the pushed button event.
-     */
-    @Override
-    public abstract void handle(ActionEvent event);
-}
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/map/StatusBar.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/map/StatusBar.java
index 514183ca10..95b7da62e6 100644
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/map/StatusBar.java
+++ b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/map/StatusBar.java
@@ -126,7 +126,7 @@ import org.opengis.coordinate.MismatchedDimensionException;
  * {@link #setLocalCoordinates(double, double)} explicitly instead.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   1.1
  */
 public class StatusBar extends Widget implements EventHandler<MouseEvent> {
@@ -1694,20 +1694,6 @@ public class StatusBar extends Widget implements EventHandler<MouseEvent> {
         }
     }
 
-    /**
-     * Shows or hides an informative message on the status bar.
-     * The message should be temporary, for example for telling that a loading is in progress.
-     *
-     * @param  text  the message to show, or {@code null} if none.
-     *
-     * @since 1.3
-     * @deprecated Renamed {@link #setProgressMessage(String)}.
-     */
-    @Deprecated(since = "1.7", forRemoval = true)
-    public void setInfoMessage(String text) {
-        setProgressMessage(text);
-    }
-
     /**
      * Shows or hides a message for an operation in progress.
      * The given text should be a temporary message, for example for telling that a loading is in progress.
diff --git a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/map/package-info.java b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/map/package-info.java
index e76f704188..93a46534e5 100644
--- a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/map/package-info.java
+++ b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/map/package-info.java
@@ -22,7 +22,7 @@
  * {@link org.apache.sis.gui.map.MapCanvasAWT} is a specialization for painting the map using Java2D.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.7
+ * @version 1.8
  * @since   1.1
  */
 package org.apache.sis.gui.map;