544dad8c328fac0dc0df5b26511268497630ef958a1f0e915e87c29d582144dacdd456273b1e47d3cf1fc0cf3398e20e0933462ff990c4a20c282435293b4d 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 './marginDecorations.css';
  6. import { DecorationToRender, DedupOverlay } from '../glyphMargin/glyphMargin.js';
  7. export class MarginViewLineDecorationsOverlay extends DedupOverlay {
  8. constructor(context) {
  9. super();
  10. this._context = context;
  11. this._renderResult = null;
  12. this._context.addEventHandler(this);
  13. }
  14. dispose() {
  15. this._context.removeEventHandler(this);
  16. this._renderResult = null;
  17. super.dispose();
  18. }
  19. // --- begin event handlers
  20. onConfigurationChanged(e) {
  21. return true;
  22. }
  23. onDecorationsChanged(e) {
  24. return true;
  25. }
  26. onFlushed(e) {
  27. return true;
  28. }
  29. onLinesChanged(e) {
  30. return true;
  31. }
  32. onLinesDeleted(e) {
  33. return true;
  34. }
  35. onLinesInserted(e) {
  36. return true;
  37. }
  38. onScrollChanged(e) {
  39. return e.scrollTopChanged;
  40. }
  41. onZonesChanged(e) {
  42. return true;
  43. }
  44. // --- end event handlers
  45. _getDecorations(ctx) {
  46. const decorations = ctx.getDecorationsInViewport();
  47. const r = [];
  48. let rLen = 0;
  49. for (let i = 0, len = decorations.length; i < len; i++) {
  50. const d = decorations[i];
  51. const marginClassName = d.options.marginClassName;
  52. if (marginClassName) {
  53. r[rLen++] = new DecorationToRender(d.range.startLineNumber, d.range.endLineNumber, marginClassName);
  54. }
  55. }
  56. return r;
  57. }
  58. prepareRender(ctx) {
  59. const visibleStartLineNumber = ctx.visibleRange.startLineNumber;
  60. const visibleEndLineNumber = ctx.visibleRange.endLineNumber;
  61. const toRender = this._render(visibleStartLineNumber, visibleEndLineNumber, this._getDecorations(ctx));
  62. const output = [];
  63. for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {
  64. const lineIndex = lineNumber - visibleStartLineNumber;
  65. const classNames = toRender[lineIndex];
  66. let lineOutput = '';
  67. for (let i = 0, len = classNames.length; i < len; i++) {
  68. lineOutput += '<div class="cmdr ' + classNames[i] + '" style=""></div>';
  69. }
  70. output[lineIndex] = lineOutput;
  71. }
  72. this._renderResult = output;
  73. }
  74. render(startLineNumber, lineNumber) {
  75. if (!this._renderResult) {
  76. return '';
  77. }
  78. return this._renderResult[lineNumber - startLineNumber];
  79. }
  80. }