package org.openstreetmap.josm.plugins.routes;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.SwingUtilities;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.plugins.Plugin;
import org.openstreetmap.josm.plugins.PluginInformation;
import org.openstreetmap.josm.plugins.routes.xml.Routes;
import org.openstreetmap.josm.plugins.routes.xml.RoutesXMLLayer;
public class RoutesPlugin extends Plugin implements LayerChangeListener {
private final List<RouteLayer> routeLayers = new ArrayList<>();
public RoutesPlugin(PluginInformation info) {
super(info);
Main.getLayerManager().addLayerChangeListener(this);
File routesFile = new File(getPluginDir() + File.separator + "routes.xml");
if (!routesFile.exists()) {
Main.info("File with route definitions doesn't exist, using default");
try {
routesFile.getParentFile().mkdir();
try (
OutputStream outputStream = new FileOutputStream(routesFile);
InputStream inputStream = Routes.class.getResourceAsStream("routes.xml");
) {
byte[] b = new byte[512];
int read;
while ((read = inputStream.read(b)) != -1) {
outputStream.write(b, 0, read);
}
}
} catch (IOException e) {
Main.error(e);
}
}
try {
JAXBContext context = JAXBContext.newInstance(
Routes.class.getPackage().getName(), Routes.class.getClassLoader());
Unmarshaller unmarshaller = context.createUnmarshaller();
Routes routes = (Routes)unmarshaller.unmarshal(
new FileInputStream(getPluginDir() + File.separator + "routes.xml"));
for (RoutesXMLLayer layer:routes.getLayer()) {
if (layer.isEnabled()) {
routeLayers.add(new RouteLayer(layer));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void activeLayerChange(Layer oldLayer, Layer newLayer) {
// Do nothing
}
@Override
public void layerAdded(LayerAddEvent e) {
Layer layer = e.getAddedLayer();
if (layer instanceof OsmDataLayer) {
for (RouteLayer routeLayer : routeLayers) {
if (!e.getSource().containsLayer(routeLayer)) {
SwingUtilities.invokeLater(() -> {
e.getSource().addLayer(routeLayer);
});
}
}
}
}
@Override
public void layerRemoving(LayerRemoveEvent e) {
for (Layer layer : e.getSource().getLayers()) {
if (layer instanceof OsmDataLayer) {
return; /* at least one OSM layer left, do nothing */
}
}
if(!e.isLastLayer()) {
SwingUtilities.invokeLater(() -> {
for (RouteLayer routeLayer : routeLayers) {
if (e.getSource().containsLayer(routeLayer)) {
e.getSource().removeLayer(routeLayer);
}
}
});
}
}
@Override
public void layerOrderChanged(LayerOrderChangeEvent e) {
// Do nothing
}
}