2467f57318a50ee2f44df6d60bab994ba6c79c35a6599fdd340a00b2ea4ecc781396b6a0384aa35298c44a4655f4803dc42e70adf8ce4608dfeb5ba46fc2e2 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 './rulers.css';
  6. import { createFastDomNode } from '../../../../base/browser/fastDomNode.js';
  7. import { ViewPart } from '../../view/viewPart.js';
  8. import { editorRuler } from '../../../common/core/editorColorRegistry.js';
  9. import { registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';
  10. export class Rulers extends ViewPart {
  11. constructor(context) {
  12. super(context);
  13. this.domNode = createFastDomNode(document.createElement('div'));
  14. this.domNode.setAttribute('role', 'presentation');
  15. this.domNode.setAttribute('aria-hidden', 'true');
  16. this.domNode.setClassName('view-rulers');
  17. this._renderedRulers = [];
  18. const options = this._context.configuration.options;
  19. this._rulers = options.get(93 /* EditorOption.rulers */);
  20. this._typicalHalfwidthCharacterWidth = options.get(46 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;
  21. }
  22. dispose() {
  23. super.dispose();
  24. }
  25. // --- begin event handlers
  26. onConfigurationChanged(e) {
  27. const options = this._context.configuration.options;
  28. this._rulers = options.get(93 /* EditorOption.rulers */);
  29. this._typicalHalfwidthCharacterWidth = options.get(46 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;
  30. return true;
  31. }
  32. onScrollChanged(e) {
  33. return e.scrollHeightChanged;
  34. }
  35. // --- end event handlers
  36. prepareRender(ctx) {
  37. // Nothing to read
  38. }
  39. _ensureRulersCount() {
  40. const currentCount = this._renderedRulers.length;
  41. const desiredCount = this._rulers.length;
  42. if (currentCount === desiredCount) {
  43. // Nothing to do
  44. return;
  45. }
  46. if (currentCount < desiredCount) {
  47. const { tabSize } = this._context.viewModel.model.getOptions();
  48. const rulerWidth = tabSize;
  49. let addCount = desiredCount - currentCount;
  50. while (addCount > 0) {
  51. const node = createFastDomNode(document.createElement('div'));
  52. node.setClassName('view-ruler');
  53. node.setWidth(rulerWidth);
  54. this.domNode.appendChild(node);
  55. this._renderedRulers.push(node);
  56. addCount--;
  57. }
  58. return;
  59. }
  60. let removeCount = currentCount - desiredCount;
  61. while (removeCount > 0) {
  62. const node = this._renderedRulers.pop();
  63. this.domNode.removeChild(node);
  64. removeCount--;
  65. }
  66. }
  67. render(ctx) {
  68. this._ensureRulersCount();
  69. for (let i = 0, len = this._rulers.length; i < len; i++) {
  70. const node = this._renderedRulers[i];
  71. const ruler = this._rulers[i];
  72. node.setBoxShadow(ruler.color ? `1px 0 0 0 ${ruler.color} inset` : ``);
  73. node.setHeight(Math.min(ctx.scrollHeight, 1000000));
  74. node.setLeft(ruler.column * this._typicalHalfwidthCharacterWidth);
  75. }
  76. }
  77. }
  78. registerThemingParticipant((theme, collector) => {
  79. const rulerColor = theme.getColor(editorRuler);
  80. if (rulerColor) {
  81. collector.addRule(`.monaco-editor .view-ruler { box-shadow: 1px 0 0 0 ${rulerColor} inset; }`);
  82. }
  83. });