d4f98a36b2bb699a617610eeffad0ac8adef51503a9f8d039dc89a42a17af902d93cd4382870b18ef12d216ea202a288b145a186825068d1f3a718b7e342ee 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 { $ } from '../../dom.js';
  6. function removeFromParent(element) {
  7. var _a;
  8. try {
  9. (_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(element);
  10. }
  11. catch (e) {
  12. // this will throw if this happens due to a blur event, nasty business
  13. }
  14. }
  15. export class RowCache {
  16. constructor(renderers) {
  17. this.renderers = renderers;
  18. this.cache = new Map();
  19. }
  20. /**
  21. * Returns a row either by creating a new one or reusing
  22. * a previously released row which shares the same templateId.
  23. */
  24. alloc(templateId) {
  25. let result = this.getTemplateCache(templateId).pop();
  26. if (!result) {
  27. const domNode = $('.monaco-list-row');
  28. const renderer = this.getRenderer(templateId);
  29. const templateData = renderer.renderTemplate(domNode);
  30. result = { domNode, templateId, templateData };
  31. }
  32. return result;
  33. }
  34. /**
  35. * Releases the row for eventual reuse.
  36. */
  37. release(row) {
  38. if (!row) {
  39. return;
  40. }
  41. this.releaseRow(row);
  42. }
  43. releaseRow(row) {
  44. const { domNode, templateId } = row;
  45. if (domNode) {
  46. domNode.classList.remove('scrolling');
  47. removeFromParent(domNode);
  48. }
  49. const cache = this.getTemplateCache(templateId);
  50. cache.push(row);
  51. }
  52. getTemplateCache(templateId) {
  53. let result = this.cache.get(templateId);
  54. if (!result) {
  55. result = [];
  56. this.cache.set(templateId, result);
  57. }
  58. return result;
  59. }
  60. dispose() {
  61. this.cache.forEach((cachedRows, templateId) => {
  62. for (const cachedRow of cachedRows) {
  63. const renderer = this.getRenderer(templateId);
  64. renderer.disposeTemplate(cachedRow.templateData);
  65. cachedRow.templateData = null;
  66. }
  67. });
  68. this.cache.clear();
  69. }
  70. getRenderer(templateId) {
  71. const renderer = this.renderers.get(templateId);
  72. if (!renderer) {
  73. throw new Error(`No renderer found for ${templateId}`);
  74. }
  75. return renderer;
  76. }
  77. }