123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- define([
- '../../Core/defaultValue',
- '../../Core/defined',
- '../../Core/defineProperties',
- '../../Core/DeveloperError',
- '../../Core/Event',
- '../../Core/wrapFunction',
- '../../DataSources/CzmlDataSource',
- '../../DataSources/GeoJsonDataSource',
- '../getElement'
- ], function(
- defaultValue,
- defined,
- defineProperties,
- DeveloperError,
- Event,
- wrapFunction,
- CzmlDataSource,
- GeoJsonDataSource,
- getElement) {
- "use strict";
-
- var viewerDragDropMixin = function(viewer, options) {
-
- if (!defined(viewer)) {
- throw new DeveloperError('viewer is required.');
- }
- if (viewer.hasOwnProperty('dropTarget')) {
- throw new DeveloperError('dropTarget is already defined by another mixin.');
- }
- if (viewer.hasOwnProperty('dropEnabled')) {
- throw new DeveloperError('dropEnabled is already defined by another mixin.');
- }
- if (viewer.hasOwnProperty('dropError')) {
- throw new DeveloperError('dropError is already defined by another mixin.');
- }
- if (viewer.hasOwnProperty('clearOnDrop')) {
- throw new DeveloperError('clearOnDrop is already defined by another mixin.');
- }
-
- options = defaultValue(options, defaultValue.EMPTY_OBJECT);
-
- var dropEnabled = true;
- var dropError = new Event();
- var clearOnDrop = defaultValue(options.clearOnDrop, true);
- var dropTarget = defaultValue(options.dropTarget, viewer.container);
- dropTarget = getElement(dropTarget);
- defineProperties(viewer, {
-
- dropTarget : {
-
- get : function() {
- return dropTarget;
- },
- set : function(value) {
-
- if (!defined(value)) {
- throw new DeveloperError('value is required.');
- }
-
- unsubscribe(dropTarget, handleDrop);
- dropTarget = value;
- subscribe(dropTarget, handleDrop);
- }
- },
-
- dropEnabled : {
- get : function() {
- return dropEnabled;
- },
- set : function(value) {
- if (value !== dropEnabled) {
- if (value) {
- subscribe(dropTarget, handleDrop);
- } else {
- unsubscribe(dropTarget, handleDrop);
- }
- dropEnabled = value;
- }
- }
- },
-
- dropError : {
- get : function() {
- return dropError;
- }
- },
-
- clearOnDrop : {
- get : function() {
- return clearOnDrop;
- },
- set : function(value) {
- clearOnDrop = value;
- }
- }
- });
- function handleDrop(event) {
- stop(event);
- if (clearOnDrop) {
- viewer.dataSources.removeAll();
- }
- var files = event.dataTransfer.files;
- var length = files.length;
- for (var i = 0; i < length; i++) {
- var file = files[i];
- var reader = new FileReader();
- reader.onload = createOnLoadCallback(viewer, file);
- reader.onerror = createDropErrorCallback(viewer, file);
- reader.readAsText(file);
- }
- }
-
- subscribe(dropTarget, handleDrop);
-
- viewer.destroy = wrapFunction(viewer, viewer.destroy, function() {
- viewer.dropEnabled = false;
- });
-
- viewer._handleDrop = handleDrop;
- };
- function stop(event) {
- event.stopPropagation();
- event.preventDefault();
- }
- function unsubscribe(dropTarget, handleDrop) {
- var currentTarget = dropTarget;
- if (defined(currentTarget)) {
- currentTarget.removeEventListener('drop', handleDrop, false);
- currentTarget.removeEventListener('dragenter', stop, false);
- currentTarget.removeEventListener('dragover', stop, false);
- currentTarget.removeEventListener('dragexit', stop, false);
- }
- }
- function subscribe(dropTarget, handleDrop) {
- dropTarget.addEventListener('drop', handleDrop, false);
- dropTarget.addEventListener('dragenter', stop, false);
- dropTarget.addEventListener('dragover', stop, false);
- dropTarget.addEventListener('dragexit', stop, false);
- }
- function createOnLoadCallback(viewer, file) {
- return function(evt) {
- var fileName = file.name;
- try {
- var dataSource;
- var loadPromise;
- if (/\.czml$/i.test(fileName)) {
- dataSource = new CzmlDataSource(fileName);
- dataSource.load(JSON.parse(evt.target.result), fileName);
- } else if (/\.geojson$/i.test(fileName) || /\.json$/i.test(fileName) || /\.topojson$/i.test(fileName)) {
- dataSource = new GeoJsonDataSource(fileName);
- loadPromise = dataSource.load(JSON.parse(evt.target.result), {
- sourceUri : fileName
- });
- } else {
- viewer.dropError.raiseEvent(viewer, fileName, 'Unrecognized file: ' + fileName);
- return;
- }
- viewer.dataSources.add(dataSource);
- if (defined(loadPromise)) {
- loadPromise.otherwise(function(error) {
- viewer.dropError.raiseEvent(viewer, fileName, error);
- });
- }
- } catch (error) {
- viewer.dropError.raiseEvent(viewer, fileName, error);
- }
- };
- }
- function createDropErrorCallback(viewer, file) {
- return function(evt) {
- viewer.dropError.raiseEvent(viewer, file.name, evt.target.error);
- };
- }
- return viewerDragDropMixin;
- });
|