6a5ec21cadba7fead0b28c66537da55ec30c68d60e90083c2e397399716244b90c41e1d2141aab77599e4d14a509a0e3acc1886fa841dd62b331ad20a2fc61 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 { Codicon } from '../../../../base/common/codicons.js';
  6. import { ModelDecorationOptions } from '../../../common/model/textModel.js';
  7. import { localize } from '../../../../nls.js';
  8. import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';
  9. import { ThemeIcon } from '../../../../platform/theme/common/themeService.js';
  10. export const foldingExpandedIcon = registerIcon('folding-expanded', Codicon.chevronDown, localize('foldingExpandedIcon', 'Icon for expanded ranges in the editor glyph margin.'));
  11. export const foldingCollapsedIcon = registerIcon('folding-collapsed', Codicon.chevronRight, localize('foldingCollapsedIcon', 'Icon for collapsed ranges in the editor glyph margin.'));
  12. export const foldingManualCollapsedIcon = registerIcon('folding-manual-collapsed', foldingCollapsedIcon, localize('foldingManualCollapedIcon', 'Icon for manually collapsed ranges in the editor glyph margin.'));
  13. export const foldingManualExpandedIcon = registerIcon('folding-manual-expanded', foldingExpandedIcon, localize('foldingManualExpandedIcon', 'Icon for manually expanded ranges in the editor glyph margin.'));
  14. export class FoldingDecorationProvider {
  15. constructor(editor) {
  16. this.editor = editor;
  17. this.showFoldingControls = 'mouseover';
  18. this.showFoldingHighlights = true;
  19. }
  20. getDecorationOption(isCollapsed, isHidden, isManual) {
  21. if (isHidden // is inside another collapsed region
  22. || this.showFoldingControls === 'never') {
  23. return FoldingDecorationProvider.HIDDEN_RANGE_DECORATION;
  24. }
  25. if (isCollapsed) {
  26. return isManual ?
  27. (this.showFoldingHighlights ? FoldingDecorationProvider.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : FoldingDecorationProvider.MANUALLY_COLLAPSED_VISUAL_DECORATION)
  28. : (this.showFoldingHighlights ? FoldingDecorationProvider.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : FoldingDecorationProvider.COLLAPSED_VISUAL_DECORATION);
  29. }
  30. else if (this.showFoldingControls === 'mouseover') {
  31. return isManual ? FoldingDecorationProvider.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION : FoldingDecorationProvider.EXPANDED_AUTO_HIDE_VISUAL_DECORATION;
  32. }
  33. else {
  34. return isManual ? FoldingDecorationProvider.MANUALLY_EXPANDED_VISUAL_DECORATION : FoldingDecorationProvider.EXPANDED_VISUAL_DECORATION;
  35. }
  36. }
  37. changeDecorations(callback) {
  38. return this.editor.changeDecorations(callback);
  39. }
  40. removeDecorations(decorationIds) {
  41. this.editor.removeDecorations(decorationIds);
  42. }
  43. }
  44. FoldingDecorationProvider.COLLAPSED_VISUAL_DECORATION = ModelDecorationOptions.register({
  45. description: 'folding-collapsed-visual-decoration',
  46. stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,
  47. afterContentClassName: 'inline-folded',
  48. isWholeLine: true,
  49. firstLineDecorationClassName: ThemeIcon.asClassName(foldingCollapsedIcon)
  50. });
  51. FoldingDecorationProvider.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = ModelDecorationOptions.register({
  52. description: 'folding-collapsed-highlighted-visual-decoration',
  53. stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,
  54. afterContentClassName: 'inline-folded',
  55. className: 'folded-background',
  56. isWholeLine: true,
  57. firstLineDecorationClassName: ThemeIcon.asClassName(foldingCollapsedIcon)
  58. });
  59. FoldingDecorationProvider.MANUALLY_COLLAPSED_VISUAL_DECORATION = ModelDecorationOptions.register({
  60. description: 'folding-manually-collapsed-visual-decoration',
  61. stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,
  62. afterContentClassName: 'inline-folded',
  63. isWholeLine: true,
  64. firstLineDecorationClassName: 'alwaysShowFoldIcons ' + ThemeIcon.asClassName(foldingExpandedIcon)
  65. });
  66. FoldingDecorationProvider.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = ModelDecorationOptions.register({
  67. description: 'folding-manually-collapsed-highlighted-visual-decoration',
  68. stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,
  69. afterContentClassName: 'inline-folded',
  70. className: 'folded-background',
  71. isWholeLine: true,
  72. firstLineDecorationClassName: ThemeIcon.asClassName(foldingManualCollapsedIcon)
  73. });
  74. FoldingDecorationProvider.EXPANDED_AUTO_HIDE_VISUAL_DECORATION = ModelDecorationOptions.register({
  75. description: 'folding-expanded-auto-hide-visual-decoration',
  76. stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,
  77. isWholeLine: true,
  78. firstLineDecorationClassName: ThemeIcon.asClassName(foldingExpandedIcon)
  79. });
  80. FoldingDecorationProvider.EXPANDED_VISUAL_DECORATION = ModelDecorationOptions.register({
  81. description: 'folding-expanded-visual-decoration',
  82. stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */,
  83. isWholeLine: true,
  84. firstLineDecorationClassName: 'alwaysShowFoldIcons ' + ThemeIcon.asClassName(foldingExpandedIcon)
  85. });
  86. FoldingDecorationProvider.MANUALLY_EXPANDED_VISUAL_DECORATION = ModelDecorationOptions.register({
  87. description: 'folding-manually-expanded-visual-decoration',
  88. stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,
  89. isWholeLine: true,
  90. firstLineDecorationClassName: 'alwaysShowFoldIcons ' + ThemeIcon.asClassName(foldingManualExpandedIcon)
  91. });
  92. FoldingDecorationProvider.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION = ModelDecorationOptions.register({
  93. description: 'folding-manually-expanded-visual-decoration',
  94. stickiness: 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */,
  95. isWholeLine: true,
  96. firstLineDecorationClassName: ThemeIcon.asClassName(foldingManualExpandedIcon)
  97. });
  98. FoldingDecorationProvider.HIDDEN_RANGE_DECORATION = ModelDecorationOptions.register({
  99. description: 'folding-hidden-range-decoration',
  100. stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */
  101. });