Ticket #24600: pmtiles-session-support.patch

File pmtiles-session-support.patch, 8.3 KB (added by AmyWorrall, 3 months ago)
  • src/main/java/org/openstreetmap/josm/plugins/pmtiles/PMTilesPlugin.java

     
    33
    44import org.openstreetmap.josm.actions.ExtensionFileFilter;
    55import org.openstreetmap.josm.gui.MainApplication;
     6import org.openstreetmap.josm.io.session.SessionReader;
     7import org.openstreetmap.josm.io.session.SessionWriter;
    68import org.openstreetmap.josm.plugins.Plugin;
    79import org.openstreetmap.josm.plugins.PluginInformation;
    810import org.openstreetmap.josm.plugins.pmtiles.actions.downloadtasks.DownloadPMTilesTask;
    911import org.openstreetmap.josm.plugins.pmtiles.gui.io.importexport.PMTilesFileImporter;
     12import org.openstreetmap.josm.plugins.pmtiles.gui.io.session.PMTilesImageSessionExporter;
     13import org.openstreetmap.josm.plugins.pmtiles.gui.io.session.PMTilesImageSessionImporter;
     14import org.openstreetmap.josm.plugins.pmtiles.gui.layers.PMTilesImageLayer;
    1015
    1116/**
    1217 * This is the plugin entrypoint
     
    2227        ExtensionFileFilter.addImporter(new PMTilesFileImporter());
    2328        ExtensionFileFilter.updateAllFormatsImporter();
    2429        MainApplication.getMenu().openLocation.addDownloadTaskClass(DownloadPMTilesTask.class);
     30
     31        // Register session exporter and importer for PMTiles image layers
     32        SessionWriter.registerSessionLayerExporter(PMTilesImageLayer.class, PMTilesImageSessionExporter.class);
     33        SessionReader.registerSessionLayerImporter("pmtiles-image", PMTilesImageSessionImporter.class);
    2534    }
    2635}
  • src/main/java/org/openstreetmap/josm/plugins/pmtiles/gui/io/session/PMTilesImageSessionExporter.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.plugins.pmtiles.gui.io.session;
     3
     4import java.awt.Component;
     5import java.awt.GridBagLayout;
     6import java.io.IOException;
     7
     8import javax.swing.JLabel;
     9import javax.swing.JPanel;
     10import javax.swing.SwingConstants;
     11
     12import org.openstreetmap.josm.io.session.AbstractSessionExporter;
     13import org.openstreetmap.josm.io.session.SessionWriter.ExportSupport;
     14import org.openstreetmap.josm.plugins.pmtiles.gui.layers.PMTilesImageLayer;
     15import org.openstreetmap.josm.tools.GBC;
     16import org.w3c.dom.Element;
     17
     18/**
     19 * Session exporter for {@link PMTilesImageLayer}.
     20 * @since 1.0
     21 */
     22public class PMTilesImageSessionExporter extends AbstractSessionExporter<PMTilesImageLayer> {
     23
     24    /**
     25     * Constructs a new {@code PMTilesImageSessionExporter}.
     26     * @param layer PMTiles image layer to export
     27     */
     28    public PMTilesImageSessionExporter(PMTilesImageLayer layer) {
     29        super(layer);
     30    }
     31
     32    @Override
     33    public Component getExportPanel() {
     34        final JPanel p = new JPanel(new GridBagLayout());
     35        export.setSelected(true);
     36        final JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEADING);
     37        lbl.setToolTipText(layer.getToolTipText());
     38        lbl.setLabelFor(export);
     39        p.add(export, GBC.std());
     40        p.add(lbl, GBC.std());
     41        p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
     42        return p;
     43    }
     44
     45    @Override
     46    public Element export(ExportSupport support) throws IOException {
     47        Element layerElem = support.createElement("layer");
     48        layerElem.setAttribute("type", "pmtiles-image");
     49        layerElem.setAttribute("version", "0.1");
     50
     51        // Store the URI to the PMTiles file
     52        Element fileElem = support.createElement("file");
     53        String uri = layer.getInfo().header().location().toString();
     54        fileElem.appendChild(support.createTextNode(uri));
     55        layerElem.appendChild(fileElem);
     56
     57        // Store the layer name if different from default
     58        String name = layer.getName();
     59        if (name != null && !name.isEmpty()) {
     60            Element nameElem = support.createElement("name");
     61            nameElem.appendChild(support.createTextNode(name));
     62            layerElem.appendChild(nameElem);
     63        }
     64
     65        return layerElem;
     66    }
     67}
  • src/main/java/org/openstreetmap/josm/plugins/pmtiles/gui/io/session/PMTilesImageSessionImporter.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.plugins.pmtiles.gui.io.session;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.io.IOException;
     7import java.net.URI;
     8import java.net.URISyntaxException;
     9
     10import org.openstreetmap.josm.gui.layer.Layer;
     11import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     12import org.openstreetmap.josm.io.IllegalDataException;
     13import org.openstreetmap.josm.io.session.SessionLayerImporter;
     14import org.openstreetmap.josm.io.session.SessionReader.ImportSupport;
     15import org.openstreetmap.josm.plugins.pmtiles.data.imagery.PMTilesImageryInfo;
     16import org.openstreetmap.josm.plugins.pmtiles.gui.layers.PMTilesImageLayer;
     17import org.openstreetmap.josm.plugins.pmtiles.lib.Header;
     18import org.openstreetmap.josm.plugins.pmtiles.lib.PMTiles;
     19import org.w3c.dom.Element;
     20import org.w3c.dom.NodeList;
     21
     22/**
     23 * Session importer for {@link PMTilesImageLayer}.
     24 * @since 1.0
     25 */
     26public class PMTilesImageSessionImporter implements SessionLayerImporter {
     27
     28    @Override
     29    public Layer load(Element elem, ImportSupport support, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
     30        // Check against session file XML schema version
     31        String version = elem.getAttribute("version");
     32        if (!"0.1".equals(version)) {
     33            throw new IllegalDataException(tr("Version ''{0}'' of meta data for PMTiles layer is not supported. Expected: 0.1", version));
     34        }
     35
     36        // Read the file URI
     37        String fileUri = getChildText(elem, "file");
     38        if (fileUri == null || fileUri.isEmpty()) {
     39            throw new IllegalDataException(tr("Missing file URI in PMTiles session data"));
     40        }
     41
     42        // Read optional name
     43        String name = getChildText(elem, "name");
     44
     45        try {
     46            URI uri = new URI(fileUri);
     47            Header header = PMTiles.readHeader(uri);
     48            PMTilesImageryInfo info = new PMTilesImageryInfo(header);
     49            PMTilesImageLayer layer = new PMTilesImageLayer(info);
     50
     51            // Set custom name if provided
     52            if (name != null && !name.isEmpty()) {
     53                layer.setName(name);
     54            }
     55
     56            return layer;
     57        } catch (URISyntaxException e) {
     58            throw new IllegalDataException(tr("Invalid PMTiles file URI: {0}", fileUri), e);
     59        }
     60    }
     61
     62    /**
     63     * Get the text content of a child element with the given tag name.
     64     * @param parent the parent element
     65     * @param tagName the tag name to search for
     66     * @return the text content, or null if not found
     67     */
     68    private static String getChildText(Element parent, String tagName) {
     69        NodeList nodes = parent.getElementsByTagName(tagName);
     70        if (nodes.getLength() > 0) {
     71            return nodes.item(0).getTextContent();
     72        }
     73        return null;
     74    }
     75}
  • src/main/java/org/openstreetmap/josm/plugins/pmtiles/gui/io/session/package-info.java

     
     1// License: GPL. For details, see LICENSE file.
     2/**
     3 * Provides session support for PMTiles layers, allowing them to be saved and restored
     4 * as part of JOSM session files (.jos/.joz).
     5 */
     6package org.openstreetmap.josm.plugins.pmtiles.gui.io.session;