diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts index 418e8ebee98ea4211bcc43e04cdbeed2b5821364..ccd54250d894486e21d6dcaa7df1ff41f6377b97 100644 --- a/src/vs/editor/browser/controller/mouseHandler.ts +++ b/src/vs/editor/browser/controller/mouseHandler.ts @@ -21,6 +21,7 @@ import { HorizontalRange } from 'vs/editor/common/view/renderingContext'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; +import { EditorOptionId, EditorOption } from 'vs/editor/common/config/editorOptions'; /** * Merges mouse events when mouse move events are throttled @@ -216,7 +217,7 @@ export class MouseHandler extends ViewEventHandler { const targetIsContent = (t.type === editorBrowser.MouseTargetType.CONTENT_TEXT || t.type === editorBrowser.MouseTargetType.CONTENT_EMPTY); const targetIsGutter = (t.type === editorBrowser.MouseTargetType.GUTTER_GLYPH_MARGIN || t.type === editorBrowser.MouseTargetType.GUTTER_LINE_NUMBERS || t.type === editorBrowser.MouseTargetType.GUTTER_LINE_DECORATIONS); const targetIsLineNumbers = (t.type === editorBrowser.MouseTargetType.GUTTER_LINE_NUMBERS); - const selectOnLineNumbers = this._context.configuration.editor.viewInfo.selectOnLineNumbers; + const selectOnLineNumbers = this._context.configuration.getOption(EditorOptionId.selectOnLineNumbers); const targetIsViewZone = (t.type === editorBrowser.MouseTargetType.CONTENT_VIEW_ZONE || t.type === editorBrowser.MouseTargetType.GUTTER_VIEW_ZONE); const targetIsWidget = (t.type === editorBrowser.MouseTargetType.CONTENT_WIDGET); diff --git a/src/vs/editor/browser/editorBrowser.ts b/src/vs/editor/browser/editorBrowser.ts index a5e31344d3c2d0013ddc7f6cb230b6f902467e53..d1efe4ddd5278ec636b72d48135c6d6b755129f0 100644 --- a/src/vs/editor/browser/editorBrowser.ts +++ b/src/vs/editor/browser/editorBrowser.ts @@ -536,6 +536,8 @@ export interface ICodeEditor extends editorCommon.IEditor { */ getConfiguration(): editorOptions.InternalEditorOptions; + getOption>(id: editorOptions.EditorOptionId): editorOptions.ComputedEditorOptionValue; + /** * Returns the 'raw' editor's configuration (without any validation or defaults). * @internal diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts index c80286daf0dc6a56b5082c17a59a4645faab22e8..2067c4d38787ce8d6e57619d106d949a98e80d9f 100644 --- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts @@ -45,7 +45,7 @@ export class LineNumbersOverlay extends DynamicViewOverlay { this._lineHeight = config.lineHeight; this._renderLineNumbers = config.viewInfo.renderLineNumbers; this._renderCustomLineNumbers = config.viewInfo.renderCustomLineNumbers; - this._renderFinalNewline = this._context.configuration.options.get(EditorOptionId.RenderFinalNewline, EditorOption.RenderFinalNewline); + this._renderFinalNewline = this._context.configuration.getOption(EditorOptionId.renderFinalNewline); this._lineNumbersLeft = config.layoutInfo.lineNumbersLeft; this._lineNumbersWidth = config.layoutInfo.lineNumbersWidth; } diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 0ac879ee78a5979f4a8997a1d06a1b5262b1b1b4..3860def914f4b5771dacea61aef790536037c8da 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -370,6 +370,10 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE return this._configuration.editor; } + public getOption>(id: editorOptions.EditorOptionId): editorOptions.ComputedEditorOptionValue { + return this._configuration.getOption(id); + } + public getRawConfiguration(): editorOptions.IEditorOptions { return this._configuration.getRawOptions(); } diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 6ae96a3430c3c5ae31232ca4d76058b7b40ac939..10fff3009955669453c0100578d56b6aa08c15b7 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -156,6 +156,10 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed this._register(TabFocus.onDidChangeTabFocus(_ => this._recomputeOptions())); } + public getOption>(id: editorOptions.EditorOptionId): editorOptions.ComputedEditorOptionValue { + return this.options._read(id); + } + public observeReferenceElement(dimension?: editorCommon.IDimension): void { } @@ -345,7 +349,7 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.renderFinalNewline': { 'type': 'boolean', - 'default': editorOptions.EditorOption.RenderFinalNewline.defaultValue, + 'default': editorOptions.EditorOption.renderFinalNewline.defaultValue, 'description': nls.localize('renderFinalNewline', "Render last line number when the file ends with a newline.") }, 'editor.rulers': { @@ -1137,7 +1141,7 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.selectionClipboard': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.contribInfo.selectionClipboard, + 'default': editorOptions.EditorOption.selectionClipboard.defaultValue, 'description': nls.localize('selectionClipboard', "Controls whether the Linux primary clipboard should be supported."), 'included': platform.isLinux }, diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 6c0c01f4524c16ed6c4ad3cd4b2e02bd7560b18c..45bef3115da8e7887f146fe4d007acfda951a4b9 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -997,7 +997,6 @@ export interface InternalEditorViewOptions { readonly renderLineNumbers: RenderLineNumbersType; readonly renderCustomLineNumbers: ((lineNumber: number) => string) | null; readonly cursorSurroundingLines: number; - readonly selectOnLineNumbers: boolean; readonly glyphMargin: boolean; readonly revealHorizontalRightPadding: number; readonly roundedSelection: boolean; @@ -1025,7 +1024,6 @@ export interface InternalEditorViewOptions { } export interface EditorContribOptions { - readonly selectionClipboard: boolean; readonly hover: InternalEditorHoverOptions; readonly links: boolean; readonly contextmenu: boolean; @@ -1317,7 +1315,6 @@ export class InternalEditorOptions { && a.renderLineNumbers === b.renderLineNumbers && a.renderCustomLineNumbers === b.renderCustomLineNumbers && a.cursorSurroundingLines === b.cursorSurroundingLines - && a.selectOnLineNumbers === b.selectOnLineNumbers && a.glyphMargin === b.glyphMargin && a.revealHorizontalRightPadding === b.revealHorizontalRightPadding && a.roundedSelection === b.roundedSelection @@ -1464,8 +1461,7 @@ export class InternalEditorOptions { */ private static _equalsContribOptions(a: EditorContribOptions, b: EditorContribOptions): boolean { return ( - a.selectionClipboard === b.selectionClipboard - && this._equalsHoverOptions(a.hover, b.hover) + this._equalsHoverOptions(a.hover, b.hover) && a.links === b.links && a.contextmenu === b.contextmenu && InternalEditorOptions._equalsQuickSuggestions(a.quickSuggestions, b.quickSuggestions) @@ -2081,7 +2077,6 @@ export class EditorOptionsValidator { cursorSurroundingLines: _clampedInt(opts.cursorSurroundingLines, defaults.cursorWidth, 0, Number.MAX_VALUE), renderLineNumbers: renderLineNumbers, renderCustomLineNumbers: renderCustomLineNumbers, - selectOnLineNumbers: _boolean(opts.selectOnLineNumbers, defaults.selectOnLineNumbers), glyphMargin: _boolean(opts.glyphMargin, defaults.glyphMargin), revealHorizontalRightPadding: _clampedInt(opts.revealHorizontalRightPadding, defaults.revealHorizontalRightPadding, 0, 1000), roundedSelection: _boolean(opts.roundedSelection, defaults.roundedSelection), @@ -2122,7 +2117,6 @@ export class EditorOptionsValidator { } const find = this._sanitizeFindOpts(opts.find, defaults.find); return { - selectionClipboard: _boolean(opts.selectionClipboard, defaults.selectionClipboard), hover: this._sanitizeHoverOpts(opts.hover, defaults.hover), links: _boolean(opts.links, defaults.links), contextmenu: _boolean(opts.contextmenu, defaults.contextmenu), @@ -2202,7 +2196,6 @@ export class InternalEditorOptionsFactory { renderLineNumbers: opts.viewInfo.renderLineNumbers, renderCustomLineNumbers: opts.viewInfo.renderCustomLineNumbers, cursorSurroundingLines: opts.viewInfo.cursorSurroundingLines, - selectOnLineNumbers: opts.viewInfo.selectOnLineNumbers, glyphMargin: opts.viewInfo.glyphMargin, revealHorizontalRightPadding: opts.viewInfo.revealHorizontalRightPadding, roundedSelection: opts.viewInfo.roundedSelection, @@ -2236,7 +2229,6 @@ export class InternalEditorOptionsFactory { }, contribInfo: { - selectionClipboard: opts.contribInfo.selectionClipboard, hover: opts.contribInfo.hover, links: opts.contribInfo.links, contextmenu: opts.contribInfo.contextmenu, @@ -2668,7 +2660,6 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { renderLineNumbers: RenderLineNumbersType.On, renderCustomLineNumbers: null, cursorSurroundingLines: 0, - selectOnLineNumbers: true, glyphMargin: true, revealHorizontalRightPadding: 30, roundedSelection: true, @@ -2716,7 +2707,6 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { }, contribInfo: { - selectionClipboard: true, hover: { enabled: true, delay: 300, @@ -2803,10 +2793,6 @@ export class ValidatedEditorOptions { } } -export interface IComputedEditorOptions { - get(id: EditorOptionId, option: IEditorOption): T3; -} - /** * @internal */ @@ -2815,9 +2801,6 @@ export class ComputedEditorOptions { public _read(id: EditorOptionId): T { return this._values[id]; } - public get(id: EditorOptionId, option: IEditorOption): T3 { - return this._values[id]; - } public _write(id: EditorOptionId, value: T): void { this._values[id] = value; } @@ -2836,7 +2819,7 @@ export class ChangedEditorOptions { } } -interface IEditorOption { +export interface IEditorOption { readonly id: EditorOptionId; readonly name: string; readonly defaultValue: T1; @@ -2890,9 +2873,15 @@ function registerEditorOption(option: IEditorOption): IE } export const enum EditorOptionId { - RenderFinalNewline, + renderFinalNewline, + selectionClipboard, + selectOnLineNumbers, } export const EditorOption = { - RenderFinalNewline: registerEditorOption(new BooleanEditorOption(EditorOptionId.RenderFinalNewline, 'renderFinalNewline', true)) + renderFinalNewline: registerEditorOption(new BooleanEditorOption(EditorOptionId.renderFinalNewline, 'renderFinalNewline', true)), + selectionClipboard: registerEditorOption(new BooleanEditorOption(EditorOptionId.selectionClipboard, 'selectionClipboard', true)), + selectOnLineNumbers: registerEditorOption(new BooleanEditorOption(EditorOptionId.selectOnLineNumbers, 'selectOnLineNumbers', true)), }; + +export type ComputedEditorOptionValue> = T extends IEditorOption ? R : never; diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 6c9541592342f83015e12a7a13c0fd2ef413b78f..f070525b99bc728ea6200f6f9072d9b40f3e1d3c 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -152,7 +152,8 @@ export interface IConfiguration extends IDisposable { onDidChange(listener: (e: editorOptions.IConfigurationChangedEvent) => void): IDisposable; readonly editor: editorOptions.InternalEditorOptions; - readonly options: editorOptions.IComputedEditorOptions; + + getOption>(id: editorOptions.EditorOptionId): editorOptions.ComputedEditorOptionValue; setMaxLineNumber(maxLineNumber: number): void; updateOptions(newOptions: editorOptions.IEditorOptions): void; diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index ef807a300680ba7421bd1b987ae0a3c223a7823d..1af333dd0a41f4f1fe8fef62bde7008e84f4b02e 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -431,7 +431,9 @@ export enum RenderLineNumbersType { } export enum EditorOptionId { - RenderFinalNewline = 0 + renderFinalNewline = 0, + selectionClipboard = 1, + selectOnLineNumbers = 2 } /** diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 970d6f079d6015d263e468e65b1bba9f98c74bfa..87d8500889508f978523bff8c549cda408707878 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3312,7 +3312,6 @@ declare namespace monaco.editor { readonly renderLineNumbers: RenderLineNumbersType; readonly renderCustomLineNumbers: ((lineNumber: number) => string) | null; readonly cursorSurroundingLines: number; - readonly selectOnLineNumbers: boolean; readonly glyphMargin: boolean; readonly revealHorizontalRightPadding: number; readonly roundedSelection: boolean; @@ -3340,7 +3339,6 @@ declare namespace monaco.editor { } export interface EditorContribOptions { - readonly selectionClipboard: boolean; readonly hover: InternalEditorHoverOptions; readonly links: boolean; readonly contextmenu: boolean; @@ -3555,11 +3553,7 @@ declare namespace monaco.editor { [key: string]: any; } - export interface IComputedEditorOptions { - get(id: EditorOptionId, option: IEditorOption): T3; - } - - interface IEditorOption { + export interface IEditorOption { readonly id: EditorOptionId; readonly name: string; readonly defaultValue: T1; @@ -3571,13 +3565,19 @@ declare namespace monaco.editor { } export enum EditorOptionId { - RenderFinalNewline = 0 + renderFinalNewline = 0, + selectionClipboard = 1, + selectOnLineNumbers = 2 } export const EditorOption: { - RenderFinalNewline: IEditorOption; + renderFinalNewline: IEditorOption; + selectionClipboard: IEditorOption; + selectOnLineNumbers: IEditorOption; }; + export type ComputedEditorOptionValue> = T extends IEditorOption ? R : never; + /** * A view zone is a full horizontal rectangle that 'pushes' text down. * The editor reserves space for view zones when rendering. @@ -4027,6 +4027,7 @@ declare namespace monaco.editor { * Returns the current editor's configuration */ getConfiguration(): InternalEditorOptions; + getOption>(id: EditorOptionId): ComputedEditorOptionValue; /** * Get value of the current model attached to this editor. * @see `ITextModel.getValue` diff --git a/src/vs/workbench/contrib/codeEditor/browser/selectionClipboard.ts b/src/vs/workbench/contrib/codeEditor/browser/selectionClipboard.ts index 4c3a8ba75ff57f675408deefa1ea3c81ace83073..18aa8e4965e01bd8e113dc311cf60976d29cdce9 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/selectionClipboard.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/selectionClipboard.ts @@ -9,7 +9,7 @@ import * as process from 'vs/base/common/process'; import * as platform from 'vs/base/common/platform'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; +import { IConfigurationChangedEvent, EditorOption, EditorOptionId } from 'vs/editor/common/config/editorOptions'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; @@ -24,11 +24,11 @@ export class SelectionClipboard extends Disposable implements IEditorContributio super(); if (platform.isLinux) { - let isEnabled = editor.getConfiguration().contribInfo.selectionClipboard; + let isEnabled = editor.getOption(EditorOptionId.selectionClipboard); this._register(editor.onDidChangeConfiguration((e: IConfigurationChangedEvent) => { - if (e.contribInfo) { - isEnabled = editor.getConfiguration().contribInfo.selectionClipboard; + if (e.hasChanged(EditorOptionId.selectionClipboard)) { + isEnabled = editor.getOption(EditorOptionId.selectionClipboard); } }));