Ticket #24600: pmtiles-session-support.patch
| File pmtiles-session-support.patch, 8.3 KB (added by , 3 months ago) |
|---|
-
src/main/java/org/openstreetmap/josm/plugins/pmtiles/PMTilesPlugin.java
3 3 4 4 import org.openstreetmap.josm.actions.ExtensionFileFilter; 5 5 import org.openstreetmap.josm.gui.MainApplication; 6 import org.openstreetmap.josm.io.session.SessionReader; 7 import org.openstreetmap.josm.io.session.SessionWriter; 6 8 import org.openstreetmap.josm.plugins.Plugin; 7 9 import org.openstreetmap.josm.plugins.PluginInformation; 8 10 import org.openstreetmap.josm.plugins.pmtiles.actions.downloadtasks.DownloadPMTilesTask; 9 11 import org.openstreetmap.josm.plugins.pmtiles.gui.io.importexport.PMTilesFileImporter; 12 import org.openstreetmap.josm.plugins.pmtiles.gui.io.session.PMTilesImageSessionExporter; 13 import org.openstreetmap.josm.plugins.pmtiles.gui.io.session.PMTilesImageSessionImporter; 14 import org.openstreetmap.josm.plugins.pmtiles.gui.layers.PMTilesImageLayer; 10 15 11 16 /** 12 17 * This is the plugin entrypoint … … 22 27 ExtensionFileFilter.addImporter(new PMTilesFileImporter()); 23 28 ExtensionFileFilter.updateAllFormatsImporter(); 24 29 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); 25 34 } 26 35 } -
src/main/java/org/openstreetmap/josm/plugins/pmtiles/gui/io/session/PMTilesImageSessionExporter.java
1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.plugins.pmtiles.gui.io.session; 3 4 import java.awt.Component; 5 import java.awt.GridBagLayout; 6 import java.io.IOException; 7 8 import javax.swing.JLabel; 9 import javax.swing.JPanel; 10 import javax.swing.SwingConstants; 11 12 import org.openstreetmap.josm.io.session.AbstractSessionExporter; 13 import org.openstreetmap.josm.io.session.SessionWriter.ExportSupport; 14 import org.openstreetmap.josm.plugins.pmtiles.gui.layers.PMTilesImageLayer; 15 import org.openstreetmap.josm.tools.GBC; 16 import org.w3c.dom.Element; 17 18 /** 19 * Session exporter for {@link PMTilesImageLayer}. 20 * @since 1.0 21 */ 22 public 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. 2 package org.openstreetmap.josm.plugins.pmtiles.gui.io.session; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 import java.io.IOException; 7 import java.net.URI; 8 import java.net.URISyntaxException; 9 10 import org.openstreetmap.josm.gui.layer.Layer; 11 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 12 import org.openstreetmap.josm.io.IllegalDataException; 13 import org.openstreetmap.josm.io.session.SessionLayerImporter; 14 import org.openstreetmap.josm.io.session.SessionReader.ImportSupport; 15 import org.openstreetmap.josm.plugins.pmtiles.data.imagery.PMTilesImageryInfo; 16 import org.openstreetmap.josm.plugins.pmtiles.gui.layers.PMTilesImageLayer; 17 import org.openstreetmap.josm.plugins.pmtiles.lib.Header; 18 import org.openstreetmap.josm.plugins.pmtiles.lib.PMTiles; 19 import org.w3c.dom.Element; 20 import org.w3c.dom.NodeList; 21 22 /** 23 * Session importer for {@link PMTilesImageLayer}. 24 * @since 1.0 25 */ 26 public 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 */ 6 package org.openstreetmap.josm.plugins.pmtiles.gui.io.session;
