treeview.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /**
  2. * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. 'use strict';
  6. import EmitterMixin from '../emittermixin.js';
  7. import Renderer from './renderer.js';
  8. import Converter from './converter.js';
  9. import objectUtils from '../lib/lodash/object.js';
  10. export default class TreeView {
  11. constructor( domRoot ) {
  12. /**
  13. * Root of the DOM.
  14. */
  15. this.domRoot = domRoot;
  16. this.observers = new Set();
  17. this.converter = new Converter();
  18. /**
  19. * Root of the view
  20. */
  21. this.viewRoot = this.converter.domToView( domRoot , { bind: true, withChildren: false } );
  22. this.viewRoot.setTreeView( this );
  23. this.renderer = new Renderer( this.converter );
  24. this.renderer.markToSync( 'CHILDREN', this.viewRoot );
  25. this.viewRoot.on( 'change', ( evt, type, node ) => {
  26. this.renderer.markToSync( type, node );
  27. } );
  28. }
  29. addObserver( observer ) {
  30. this.observers.add( observer );
  31. observer.init( this );
  32. observer.attach();
  33. }
  34. render() {
  35. for ( let observer of this.observers ) {
  36. observer.detach();
  37. }
  38. this.renderer.render();
  39. for ( let observer of this.observers ) {
  40. observer.attach();
  41. }
  42. }
  43. }
  44. objectUtils.extend( TreeView.prototype, EmitterMixin );
  45. /**
  46. * Enum representing type of the change.
  47. * Possible values:
  48. *
  49. * * `CHILDREN` - for child list changes,
  50. * * `ATTRIBUTES` - for element attributes changes,
  51. * * `TEXT` - for text nodes changes.
  52. *
  53. * @typedef {String} treeView.ChangeType
  54. */