EditToolbar.Delete.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /**
  2. * @class L.EditToolbar.Delete
  3. * @aka EditToolbar.Delete
  4. */
  5. L.EditToolbar.Delete = L.Handler.extend({
  6. statics: {
  7. TYPE: 'remove' // not delete as delete is reserved in js
  8. },
  9. includes: L.Mixin.Events,
  10. // @method intialize(): void
  11. initialize: function (map, options) {
  12. L.Handler.prototype.initialize.call(this, map);
  13. L.Util.setOptions(this, options);
  14. // Store the selectable layer group for ease of access
  15. this._deletableLayers = this.options.featureGroup;
  16. if (!(this._deletableLayers instanceof L.FeatureGroup)) {
  17. throw new Error('options.featureGroup must be a L.FeatureGroup');
  18. }
  19. // Save the type so super can fire, need to do this as cannot do this.TYPE :(
  20. this.type = L.EditToolbar.Delete.TYPE;
  21. },
  22. // @method enable(): void
  23. // Enable the delete toolbar
  24. enable: function () {
  25. if (this._enabled || !this._hasAvailableLayers()) {
  26. return;
  27. }
  28. this.fire('enabled', { handler: this.type });
  29. this._map.fire(L.Draw.Event.DELETESTART, { handler: this.type });
  30. L.Handler.prototype.enable.call(this);
  31. this._deletableLayers
  32. .on('layeradd', this._enableLayerDelete, this)
  33. .on('layerremove', this._disableLayerDelete, this);
  34. },
  35. // @method disable(): void
  36. // Disable the delete toolbar
  37. disable: function () {
  38. if (!this._enabled) {
  39. return;
  40. }
  41. this._deletableLayers
  42. .off('layeradd', this._enableLayerDelete, this)
  43. .off('layerremove', this._disableLayerDelete, this);
  44. L.Handler.prototype.disable.call(this);
  45. this._map.fire(L.Draw.Event.DELETESTOP, { handler: this.type });
  46. this.fire('disabled', { handler: this.type });
  47. },
  48. // @method addHooks(): void
  49. // Add listener hooks to this handler
  50. addHooks: function () {
  51. var map = this._map;
  52. if (map) {
  53. map.getContainer().focus();
  54. this._deletableLayers.eachLayer(this._enableLayerDelete, this);
  55. this._deletedLayers = new L.LayerGroup();
  56. this._tooltip = new L.Draw.Tooltip(this._map);
  57. this._tooltip.updateContent({ text: L.drawLocal.edit.handlers.remove.tooltip.text });
  58. this._map.on('mousemove', this._onMouseMove, this);
  59. }
  60. },
  61. // @method removeHooks(): void
  62. // Remove listener hooks from this handler
  63. removeHooks: function () {
  64. if (this._map) {
  65. this._deletableLayers.eachLayer(this._disableLayerDelete, this);
  66. this._deletedLayers = null;
  67. this._tooltip.dispose();
  68. this._tooltip = null;
  69. this._map.off('mousemove', this._onMouseMove, this);
  70. }
  71. },
  72. // @method revertLayers(): void
  73. // Revert the deleted layers back to their prior state.
  74. revertLayers: function () {
  75. // Iterate of the deleted layers and add them back into the featureGroup
  76. this._deletedLayers.eachLayer(function (layer) {
  77. this._deletableLayers.addLayer(layer);
  78. layer.fire('revert-deleted', { layer: layer });
  79. }, this);
  80. },
  81. // @method save(): void
  82. // Save deleted layers
  83. save: function () {
  84. this._map.fire(L.Draw.Event.DELETED, { layers: this._deletedLayers });
  85. },
  86. // @method removeAllLayers(): void
  87. // Remove all delateable layers
  88. removeAllLayers: function(){
  89. // Iterate of the delateable layers and add remove them
  90. this._deletableLayers.eachLayer(function (layer) {
  91. this._removeLayer({layer:layer});
  92. }, this);
  93. this.save();
  94. },
  95. _enableLayerDelete: function (e) {
  96. var layer = e.layer || e.target || e;
  97. layer.on('click', this._removeLayer, this);
  98. },
  99. _disableLayerDelete: function (e) {
  100. var layer = e.layer || e.target || e;
  101. layer.off('click', this._removeLayer, this);
  102. // Remove from the deleted layers so we can't accidentally revert if the user presses cancel
  103. this._deletedLayers.removeLayer(layer);
  104. },
  105. _removeLayer: function (e) {
  106. var layer = e.layer || e.target || e;
  107. this._deletableLayers.removeLayer(layer);
  108. this._deletedLayers.addLayer(layer);
  109. layer.fire('deleted');
  110. },
  111. _onMouseMove: function (e) {
  112. this._tooltip.updatePosition(e.latlng);
  113. },
  114. _hasAvailableLayers: function () {
  115. return this._deletableLayers.getLayers().length !== 0;
  116. }
  117. });