domeventobserver.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /**
  2. * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. 'use strict';
  6. /**
  7. * Base class for DOM event observers. This class handles
  8. * {@link core.treeView.observer.Observer#observe adding} listeners to DOM elements,
  9. * {@link core.treeView.observer.Observer#disable disabling} and
  10. * {@link core.treeView.observer.Observer#enable re-enabling} events.
  11. * Child class needs to define
  12. * {@link core.treeView.observer.DomEventObserver#domEventType DOM event type} and
  13. * {@link core.treeView.observer.DomEventObserver#onDomEvent callback}.
  14. *
  15. * For instance:
  16. *
  17. * class ClickObserver extends DomEventObserver {
  18. * // It can also be defined as a normal property in the constructor.
  19. * get domEventType() {
  20. * return 'click';
  21. * }
  22. *
  23. * onDomEvent( domEvt ) {
  24. * this.fire( 'click' );
  25. * }
  26. * }
  27. *
  28. * @memberOf core.treeView.observer
  29. * @extends core.treeView.observer.Observer
  30. */
  31. export default class DomEventObserver {
  32. constructor( treeView ) {
  33. /**
  34. * Reference to the {@link core.treeView.TreeView} object.
  35. *
  36. * @readonly
  37. * @member {core.treeView.TreeView} core.treeView.observer.DomEventObserver#treeView
  38. */
  39. this.treeView = treeView;
  40. /**
  41. * Type of the DOM event the observer should listen on. Array of types can be defined
  42. * if the obsever should listen to multiple DOM events.
  43. *
  44. * @readonly
  45. * @member {String|Array.<String>} core.treeView.observer.DomEventObserver#domEventType
  46. */
  47. }
  48. /**
  49. * Callback which should be called when the DOM event occurred. Note that the callback will not be called if
  50. * observer {@link core.treeView.observer.DomEventObserver#isEnabled is not enabled}.
  51. *
  52. * @see core.treeView.observer.DomEventObserver#domEventType
  53. * @abstract
  54. * @method core.treeView.observer.DomEventObserver#onDomEvent
  55. */
  56. /**
  57. * @inheritDoc
  58. */
  59. observe( domElement ) {
  60. const types = typeof this.domEventType == 'string' ? [ this.domEventType ] : this.domEventType;
  61. types.forEach( type => {
  62. domElement.addEventListener( type, domEvent => this.isEnabled && this.onDomEvent( domEvent ) );
  63. } );
  64. }
  65. /**
  66. * @inheritDoc
  67. */
  68. enable() {
  69. this.isEnabled = true;
  70. }
  71. /**
  72. * @inheritDoc
  73. */
  74. disable() {
  75. this.isEnabled = false;
  76. }
  77. /**
  78. * Calls {@link core.treeView.TreeView#fire} if observer
  79. * {@link core.treeView.observer.DomEventObserver#isEnabled is enabled}.
  80. *
  81. * @see core.treeView.TreeView#fire
  82. * @param {...*} args Fire arguments {@link core.treeView.TreeView#fire}.
  83. */
  84. fire( ...args ) {
  85. if ( this.isEnabled ) {
  86. this.treeView.fire.apply( this.treeView, args );
  87. }
  88. }
  89. }