From 450db0b33b38bcdf1f22eea6cab568d24a14e2c6 Mon Sep 17 00:00:00 2001 From: arno Date: Wed, 25 Aug 2010 15:06:07 +0200 Subject: [PATCH] ability to drag and drop a route file --- application/controllers/IdxController.php | 1 + public/js/syj.js | 62 ++++++++++++++++++++++- public/openlayers | 2 +- 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/application/controllers/IdxController.php b/application/controllers/IdxController.php index 10506da..29e142d 100644 --- a/application/controllers/IdxController.php +++ b/application/controllers/IdxController.php @@ -149,6 +149,7 @@ class IdxController extends Zend_Controller_Action 'unsavedConfirmExit' => __("You have an unsaved route"), 'notEmptyField' => __("Value is required"), 'noResult' => __("no result"), + 'dragFileError' => __("could not read content of file"), ); } diff --git a/public/js/syj.js b/public/js/syj.js index e33ea4e..565d0e1 100644 --- a/public/js/syj.js +++ b/public/js/syj.js @@ -352,6 +352,66 @@ var SYJView = { this.map.zoomToExtent(extent); document.observe('simplebox:shown', this.observer.bindAsEventListener(this)); SYJPathLength.update(); + + if (FileList && FileReader) { + $("map").observe("dragenter", function(evt) { evt.stop();}); + $("map").observe("dragover", function(evt) { evt.stop();}); + $("map").observe("drop", function(evt) { + evt.stop(); + if (this.mode !== "view" || this.viewLayer.features.length) { + return; + } + if (!evt.dataTransfer.files.length) { + return; + } + var file = evt.dataTransfer.files[0]; + var reader = new FileReader(); + var readerror = function() { + this.messenger.setMessage(SyjStrings.dragFileError, "warn"); + }.bind(this); + reader.onload = function(evt) { + if (evt.error) { + readerror(); + return; + } + + var results = null; + var content = evt.target.result; + + var engine; + var formats = ['KML', 'GPX']; + + for (var i = 0; i < formats.length; i++) { + engine = new OpenLayers.Format[formats[i]]({ internalProjection: Mercator, externalProjection: WGS84 }); + try { + results = engine.read(content); + } catch(e) { + } + if (results || results.length) { + break; + } + } + if (!results || !results.length) { + readerror(); + return; + } + + + var vector = results[0]; + if (vector.geometry.CLASS_NAME !== "OpenLayers.Geometry.LineString") { + readerror(); + return; + } + this.viewLayer.addFeatures([vector]); + this.map.zoomToExtent(this.viewLayer.getDataExtent()); + this.editMode(); + if (vector.data && vector.data.name) { + $("geom_title").value = vector.data.name; + } + }.bind(this); + reader.readAsText(file); + }.bind(this)); + } }, observer: function(evt) { @@ -1046,7 +1106,7 @@ var Nominatim = (function() { center = bounds.getCenterLonLat().wrapDateLine(maxExtent); } this.setCenter(center, this.getZoomForExtent(bounds), false, true); - } + }; var success = function(transport) { $("nominatim-throbber").hide(); diff --git a/public/openlayers b/public/openlayers index f2a457c..477e4c8 160000 --- a/public/openlayers +++ b/public/openlayers @@ -1 +1 @@ -Subproject commit f2a457cae0c516e35a7c4c3c32c3b4af040415da +Subproject commit 477e4c8b4919e4650694a05eaeb022c7eedad303 -- 2.39.2