a9963ed1954f7a268b636e5f83cd1c6e76ff82f5bd81736cd509bc0fa69cf67a51e955ecb000e97861c1f128c6de9eb6e9580d44d48212c3747de7f0f0bf04 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import { Disposable } from '../../../base/common/lifecycle.js';
  6. import { Emitter } from '../../../base/common/event.js';
  7. export class ElementSizeObserver extends Disposable {
  8. constructor(referenceDomElement, dimension) {
  9. super();
  10. this._onDidChange = this._register(new Emitter());
  11. this.onDidChange = this._onDidChange.event;
  12. this._referenceDomElement = referenceDomElement;
  13. this._width = -1;
  14. this._height = -1;
  15. this._resizeObserver = null;
  16. this.measureReferenceDomElement(false, dimension);
  17. }
  18. dispose() {
  19. this.stopObserving();
  20. super.dispose();
  21. }
  22. getWidth() {
  23. return this._width;
  24. }
  25. getHeight() {
  26. return this._height;
  27. }
  28. startObserving() {
  29. if (!this._resizeObserver && this._referenceDomElement) {
  30. this._resizeObserver = new ResizeObserver((entries) => {
  31. if (entries && entries[0] && entries[0].contentRect) {
  32. this.observe({ width: entries[0].contentRect.width, height: entries[0].contentRect.height });
  33. }
  34. else {
  35. this.observe();
  36. }
  37. });
  38. this._resizeObserver.observe(this._referenceDomElement);
  39. }
  40. }
  41. stopObserving() {
  42. if (this._resizeObserver) {
  43. this._resizeObserver.disconnect();
  44. this._resizeObserver = null;
  45. }
  46. }
  47. observe(dimension) {
  48. this.measureReferenceDomElement(true, dimension);
  49. }
  50. measureReferenceDomElement(emitEvent, dimension) {
  51. let observedWidth = 0;
  52. let observedHeight = 0;
  53. if (dimension) {
  54. observedWidth = dimension.width;
  55. observedHeight = dimension.height;
  56. }
  57. else if (this._referenceDomElement) {
  58. observedWidth = this._referenceDomElement.clientWidth;
  59. observedHeight = this._referenceDomElement.clientHeight;
  60. }
  61. observedWidth = Math.max(5, observedWidth);
  62. observedHeight = Math.max(5, observedHeight);
  63. if (this._width !== observedWidth || this._height !== observedHeight) {
  64. this._width = observedWidth;
  65. this._height = observedHeight;
  66. if (emitEvent) {
  67. this._onDidChange.fire();
  68. }
  69. }
  70. }
  71. }