/* * Copyright (C) 2014 Alec Dhuse * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package co.foldingmap.actions; import co.foldingmap.mapImportExport.OsmImporter; import co.foldingmap.mapImportExport.FmXmlImporter; import co.foldingmap.mapImportExport.GpxImporter; import co.foldingmap.mapImportExport.KmlImport; import co.foldingmap.mapImportExport.JsonImporter; import co.foldingmap.mapImportExport.CsvImporter; import co.foldingmap.GUISupport.FileExtensionFilter; import co.foldingmap.GUISupport.ProgressBarPanel; import co.foldingmap.Logger; import co.foldingmap.MainWindow; import co.foldingmap.UserConfig; import co.foldingmap.map.DigitalMap; import co.foldingmap.map.Layer; import co.foldingmap.map.themes.ColorStyle; import co.foldingmap.map.tile.MbTileSource; import co.foldingmap.map.tile.TileLayer; import co.foldingmap.map.vector.Coordinate; import co.foldingmap.map.vector.NodeMap; import java.awt.FileDialog; import java.io.File; import java.util.ArrayList; /** * * @author Alec */ public class ImportMap extends Action { private ArrayList<Layer> newLayers; private DigitalMap mapData; private MainWindow mainWindow; public ImportMap(MainWindow mainWindow, DigitalMap mapData) { this.mainWindow = mainWindow; this.mapData = mapData; } /** * Returns if this Action can be undone. * * @return */ @Override public boolean canUndo() { return false; } @Override public void execute() { DigitalMap importedMap; FileDialog fileDialog; FileExtensionFilter fileExtensionFilter; ProgressBarPanel progressPanel; String fileExtension, fileName; UserConfig userConfig; try { userConfig = mainWindow.getUserConfig(); progressPanel = mainWindow.getProgressBarPanel(); fileDialog = new FileDialog(mainWindow); fileDialog.setDirectory(userConfig.getImportDIR()); fileExtensionFilter = new FileExtensionFilter(); fileExtensionFilter.addExtension("csv"); fileExtensionFilter.addExtension("kml"); fileExtensionFilter.addExtension("kmz"); fileExtensionFilter.addExtension("fmxml"); fileExtensionFilter.addExtension("geojson"); fileExtensionFilter.addExtension("gpx"); fileExtensionFilter.addExtension("mbtiles"); fileExtensionFilter.addExtension("osm"); //fileExtensionFilter.addExtension("shp"); fileDialog.setFilenameFilter(fileExtensionFilter); fileDialog.setVisible(true); fileName = fileDialog.getDirectory() + fileDialog.getFile(); if (!fileName.endsWith("null")) { progressPanel.setVisible(true); fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1); if (fileExtension.equalsIgnoreCase("fmxml")) { DigitalMap openedMap ; openedMap = FmXmlImporter.openFile(new File(fileName), progressPanel); NodeMap currentNodeMap = mapData.getCoordinateSet(); long currentNodeId = currentNodeMap.getKeyFromIndex(currentNodeMap.size() - 1); for (Coordinate c: openedMap.getCoordinateSet().getAllCoordinates()) { if (c != null) { currentNodeId++; c.setId(currentNodeId); currentNodeMap.put(currentNodeId, c); } } for (Layer l: openedMap.getLayers()) mapData.addLayer(l, 0); } else if (fileExtension.equalsIgnoreCase("csv")) { CsvImporter csvImporter; csvImporter = new CsvImporter(new File(fileName), mapData, progressPanel); csvImporter.start(); } else if (fileExtension.equalsIgnoreCase("geojson")) { JsonImporter.importGeoJSON(new File(fileName), mapData); } else if (fileExtension.equalsIgnoreCase("gpx")) { GpxImporter gpxImporter; gpxImporter = new GpxImporter(mapData, new File(fileName), progressPanel); gpxImporter.start(); } else if (fileExtension.equalsIgnoreCase("kml")) { importedMap = KmlImport.openKML(progressPanel, new File(fileName), mapData.getCoordinateSet()); newLayers = importedMap.getLayers(); for (Layer l: newLayers) mapData.addLayer(l, 0); //Transfer Styles ArrayList<ColorStyle> styles = importedMap.getTheme().getAllStyles(); for (ColorStyle cs: styles) mapData.getTheme().addStyleElement(cs); progressPanel.finish(); } else if (fileExtension.equalsIgnoreCase("kmz")) { importedMap = KmlImport.openKMZ(progressPanel, new File(fileName)); newLayers = importedMap.getLayers(); for (Layer l: newLayers) mapData.addLayer(l, 0); //Transfer Styles ArrayList<ColorStyle> styles = importedMap.getTheme().getAllStyles(); for (ColorStyle cs: styles) mapData.getTheme().addStyleElement(cs); progressPanel.finish(); } else if (fileExtension.equalsIgnoreCase("mbtiles")) { MbTileSource mbTiles = new MbTileSource(fileName); TileLayer tileLayer = new TileLayer(mbTiles); mapData.addLayer(tileLayer, 0); } else if (fileExtension.equalsIgnoreCase("osm")) { OsmImporter osmImporter = new OsmImporter(mapData, new File(fileName), mainWindow, progressPanel); osmImporter.start(); } else if (fileExtension.equalsIgnoreCase("shp")) { //TODO: Link to Shapefile Importer Logger.log(Logger.ERR, "Error in ImportMap.execute() - Shapefile Import not supported at this time."); } userConfig.setImportDIR(fileDialog.getDirectory()); mainWindow.updateLayersTree(); } //end file dialog ok check } catch (Exception e) { Logger.log(Logger.ERR, "Error in ImportMap.execute() - " + e); } mainWindow.update(); } @Override public void undo() { for (Layer l: newLayers) mapData.removeLayer(l); } }