diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/keyboardHandler.ts index 77ab8271ab5d68b78fd6a634a7aaa1078098d19f..89ceea1c90a55e8c8bb5db802a7d11d25341170e 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/keyboardHandler.ts @@ -56,7 +56,7 @@ export class KeyboardHandler extends ViewEventHandler implements IDisposable { this.contentWidth = 0; this.scrollLeft = 0; - this.textAreaHandler = new TextAreaHandler(browser, this._getStrategy(), this.textArea, this._context.model, this._context.configuration.editor, () => this.viewHelper.flushAnyAccumulatedEvents()); + this.textAreaHandler = new TextAreaHandler(browser, this._getStrategy(), this.textArea, this._context.model, () => this.viewHelper.flushAnyAccumulatedEvents()); this._toDispose = []; this._toDispose.push(this.textAreaHandler.onKeyDown((e) => this.viewController.emitKeyDown(e._actual))); diff --git a/src/vs/editor/common/controller/textAreaHandler.ts b/src/vs/editor/common/controller/textAreaHandler.ts index 8fdb0e319e65c78f7a6fd17ecd375b09095ca64c..70835df946b3155c3c4df89a0fbafaada802566e 100644 --- a/src/vs/editor/common/controller/textAreaHandler.ts +++ b/src/vs/editor/common/controller/textAreaHandler.ts @@ -11,10 +11,6 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; import { IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ISimpleModel, ITextAreaWrapper, ITypeData, TextAreaState, TextAreaStrategy, createTextAreaState } from 'vs/editor/common/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; -import { Position } from 'vs/editor/common/core/position'; -import { EndOfLinePreference, InternalEditorOptions } from 'vs/editor/common/editorCommon'; -import { TokenizationRegistry } from 'vs/editor/common/modes'; -import { renderViewLine, RenderLineInput } from 'vs/editor/common/viewLayout/viewLineRenderer'; const enum ReadFromTextArea { Type, @@ -75,7 +71,6 @@ export class TextAreaHandler extends Disposable { private Browser: IBrowser; private textArea: ITextAreaWrapper; private model: ISimpleModel; - private config: InternalEditorOptions; private flushAnyAccumulatedEvents: () => void; private selection: Range; @@ -94,12 +89,11 @@ export class TextAreaHandler extends Disposable { private _nextCommand: ReadFromTextArea; - constructor(Browser: IBrowser, strategy: TextAreaStrategy, textArea: ITextAreaWrapper, model: ISimpleModel, config: InternalEditorOptions, flushAnyAccumulatedEvents: () => void) { + constructor(Browser: IBrowser, strategy: TextAreaStrategy, textArea: ITextAreaWrapper, model: ISimpleModel, flushAnyAccumulatedEvents: () => void) { super(); this.Browser = Browser; this.textArea = textArea; this.model = model; - this.config = config; this.flushAnyAccumulatedEvents = flushAnyAccumulatedEvents; this.selection = new Range(1, 1, 1, 1); this.selections = [new Range(1, 1, 1, 1)]; @@ -328,14 +322,10 @@ export class TextAreaHandler extends Disposable { // ------------- Clipboard operations private _ensureClipboardGetsEditorSelection(e: IClipboardEvent): void { - let whatToCopy = this._getPlainTextToCopy(); + let whatToCopy = this.model.getPlainTextToCopy(this.selections, this.Browser.enableEmptySelectionClipboard); if (e.canUseTextData()) { - if (this.config.contribInfo.richTextClipboard) { - let whatRichTextToCopy = this._getHTMLToCopy(); - e.setTextData(whatToCopy, whatRichTextToCopy === undefined ? whatToCopy : whatRichTextToCopy); - } else { - e.setTextData(whatToCopy); - } + let whatHTMLToCopy = this.model.getHTMLToCopy(this.selections, this.Browser.enableEmptySelectionClipboard); + e.setTextData(whatToCopy, whatHTMLToCopy); } else { this.setTextAreaState('copy or cut', this.textAreaState.fromText(whatToCopy), false); } @@ -353,86 +343,4 @@ export class TextAreaHandler extends Disposable { this.lastCopiedValueIsFromEmptySelection = (selections.length === 1 && selections[0].isEmpty()); } } - - private _getPlainTextToCopy(): string { - let newLineCharacter = this.model.getEOL(); - let selections = this.selections; - - if (selections.length === 1) { - let range: Range = selections[0]; - if (range.isEmpty()) { - if (this.Browser.enableEmptySelectionClipboard) { - let modelLineNumber = this.model.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber; - return this.model.getModelLineContent(modelLineNumber) + newLineCharacter; - } else { - return ''; - } - } - - return this.model.getValueInRange(range, EndOfLinePreference.TextDefined); - } else { - selections = selections.slice(0).sort(Range.compareRangesUsingStarts); - let result: string[] = []; - for (let i = 0; i < selections.length; i++) { - result.push(this.model.getValueInRange(selections[i], EndOfLinePreference.TextDefined)); - } - - return result.join(newLineCharacter); - } - } - - private _getHTMLToCopy(): string | undefined { - if (!this.config) { - return undefined; - } - - let selections = this.selections; - - let rules: string[] = []; - let colorMap = TokenizationRegistry.getColorMap(); - for (let i = 1, len = colorMap.length; i < len; i++) { - let color = colorMap[i]; - if (/^(?:[0-9a-fA-F]{3}){1,2}$/.test(color)) { - color = '#' + color; - } - rules[i] = `.mtk${i} { color: ${color}; }`; - } - rules.push('.mtki { font-style: italic; }'); - rules.push('.mtkb { font-weight: bold; }'); - rules.push('.mtku { text-decoration: underline; }'); - - let output = ``; - output += '
'; - - if (selections.length === 1) { - let range: Range = selections[0]; - for (let i = 0, lineCount = range.endLineNumber - range.startLineNumber; i <= lineCount; i++) { - let viewLineRenderingData = this.model.getViewLineRenderingData(range, range.startLineNumber + i); - let lineContent = viewLineRenderingData.content; - let startOffset = i === 0 ? range.startColumn - 1 : 0; - let endOffset = i === lineCount ? range.endColumn - 1 : lineContent.length; - lineContent = viewLineRenderingData.content.substring(startOffset, endOffset); - - let r = renderViewLine(new RenderLineInput( - (this.config.fontInfo.isMonospace && !this.config.viewInfo.disableMonospaceOptimizations), - lineContent, - viewLineRenderingData.mightContainRTL, - 0, - viewLineRenderingData.tokens, - [], - viewLineRenderingData.tabSize, - this.config.fontInfo.spaceWidth, - endOffset, - 'none', - false - )); - - output += `
${r.html}
`; - } - } - - output += '
'; - - return output; - } -} +} \ No newline at end of file diff --git a/src/vs/editor/common/controller/textAreaState.ts b/src/vs/editor/common/controller/textAreaState.ts index e85c5af694e29412ebee54b096aa2e43db6dacb7..568ba1e959cb48a7c3b8b6019a30dbb5c8260ce3 100644 --- a/src/vs/editor/common/controller/textAreaState.ts +++ b/src/vs/editor/common/controller/textAreaState.ts @@ -10,7 +10,6 @@ import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Position } from 'vs/editor/common/core/position'; import { Constants } from 'vs/editor/common/core/uint'; -import { ViewLineRenderingData } from 'vs/editor/common/viewModel/viewModel'; export interface IClipboardEvent { canUseTextData(): boolean; @@ -57,7 +56,8 @@ export interface ISimpleModel { getValueInRange(range: Range, eol: EndOfLinePreference): string; getModelLineContent(lineNumber: number): string; getLineCount(): number; - getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData; + getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string; + getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string; coordinatesConverter: { convertViewPositionToModelPosition(viewPosition: Position): Position; diff --git a/src/vs/editor/common/modes/textToHtmlTokenizer.ts b/src/vs/editor/common/modes/textToHtmlTokenizer.ts index e81acfc98027f18b44656d719a096d77eb9bdce7..312da79fe4b43adecfad83ced69384bf0a828757 100644 --- a/src/vs/editor/common/modes/textToHtmlTokenizer.ts +++ b/src/vs/editor/common/modes/textToHtmlTokenizer.ts @@ -8,11 +8,115 @@ import * as strings from 'vs/base/common/strings'; import { IState, ITokenizationSupport, TokenizationRegistry, LanguageId } from 'vs/editor/common/modes'; import { NULL_STATE, nullTokenize2 } from 'vs/editor/common/modes/nullMode'; import { LineTokens } from 'vs/editor/common/core/lineTokens'; +import { CharacterMapping } from 'vs/editor/common/viewLayout/viewLineRenderer'; +import { CharCode } from 'vs/base/common/charCode'; +import { ViewLineToken } from 'vs/editor/common/core/viewLineToken'; export function tokenizeToString(text: string, languageId: string): string { return _tokenizeToString(text, _getSafeTokenizationSupport(languageId)); } +export function tokenizeLineToHTML(text: string, viewLineTokens: ViewLineToken[], rules: { [key: string]: string }, options: { startOffset: number, endOffset: number, tabSize: number, containsRTL: boolean }): string { + let tabSize = options.tabSize; + let containsRTL = options.containsRTL; + + let result = `
`; + const characterMapping = new CharacterMapping(text.length + 1, viewLineTokens.length); + + let charIndex = options.startOffset; + let tabsCharDelta = 0; + let charOffsetInPart = 0; + + for (let tokenIndex = 0, lenJ = viewLineTokens.length; tokenIndex < lenJ; tokenIndex++) { + const token = viewLineTokens[tokenIndex]; + const tokenEndIndex = token.endIndex; + + if (token.endIndex < options.startOffset) { + continue; + } + + const tokenType = token.type; + let partContentCnt = 0; + let partContent = ''; + + for (; charIndex < tokenEndIndex && charIndex < options.endOffset; charIndex++) { + characterMapping.setPartData(charIndex, tokenIndex, charOffsetInPart); + const charCode = text.charCodeAt(charIndex); + + switch (charCode) { + case CharCode.Tab: + let insertSpacesCount = tabSize - (charIndex + tabsCharDelta) % tabSize; + tabsCharDelta += insertSpacesCount - 1; + charOffsetInPart += insertSpacesCount - 1; + while (insertSpacesCount > 0) { + partContent += ' '; + partContentCnt++; + insertSpacesCount--; + } + break; + + case CharCode.Space: + partContent += ' '; + partContentCnt++; + break; + + case CharCode.LessThan: + partContent += '<'; + partContentCnt++; + break; + + case CharCode.GreaterThan: + partContent += '>'; + partContentCnt++; + break; + + case CharCode.Ampersand: + partContent += '&'; + partContentCnt++; + break; + + case CharCode.Null: + partContent += '�'; + partContentCnt++; + break; + + case CharCode.UTF8_BOM: + case CharCode.LINE_SEPARATOR_2028: + partContent += '\ufffd'; + partContentCnt++; + break; + + case CharCode.CarriageReturn: + // zero width space, because carriage return would introduce a line break + partContent += '​'; + partContentCnt++; + break; + + default: + partContent += String.fromCharCode(charCode); + partContentCnt++; + } + + charOffsetInPart++; + } + + characterMapping.setPartLength(tokenIndex, partContentCnt); + let style = tokenType.split(' ').map(type => rules[type]).join(''); + if (containsRTL) { + result += `${partContent}`; + } else { + result += `${partContent}`; + } + + if (token.endIndex > options.endOffset) { + break; + } + } + + result += `
`; + return result; +} + function _getSafeTokenizationSupport(languageId: string): ITokenizationSupport { let tokenizationSupport = TokenizationRegistry.get(languageId); if (tokenizationSupport) { diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index cdff538797a85fcb015006a2bf4ffa92a7275fc2..e1e6f8f531756750be723d8b94c4d8f4f3423346 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -87,6 +87,9 @@ export interface IViewModel extends IEventEmitter { getModelLineContent(modelLineNumber: number): string; getModelLineMaxColumn(modelLineNumber: number): number; validateModelPosition(modelPosition: IPosition): Position; + + getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string; + getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string; } export class ViewLineRenderingData { diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 4087ebf89ef95993582cf336952e61146f549a9a..24c55b3269f0249b4e1c92877df34c4acdddddd9 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -11,6 +11,8 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; +import { TokenizationRegistry } from 'vs/editor/common/modes'; +import { tokenizeLineToHTML } from 'vs/editor/common/modes/textToHtmlTokenizer'; import { ViewModelCursors } from 'vs/editor/common/viewModel/viewModelCursors'; import { ViewModelDecorations } from 'vs/editor/common/viewModel/viewModelDecorations'; import { ViewLineRenderingData, ViewModelDecoration, IViewModel, ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel'; @@ -558,4 +560,97 @@ export class ViewModel extends EventEmitter implements IViewModel { public validateModelPosition(position: editorCommon.IPosition): Position { return this.model.validatePosition(position); } + + public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { + let newLineCharacter = this.getEOL(); + + if (ranges.length === 1) { + let range: Range = ranges[0]; + if (range.isEmpty()) { + if (enableEmptySelectionClipboard) { + let modelLineNumber = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber; + return this.getModelLineContent(modelLineNumber) + newLineCharacter; + } else { + return ''; + } + } + + return this.getValueInRange(range, editorCommon.EndOfLinePreference.TextDefined); + } else { + ranges = ranges.slice(0).sort(Range.compareRangesUsingStarts); + let result: string[] = []; + for (let i = 0; i < ranges.length; i++) { + result.push(this.getValueInRange(ranges[i], editorCommon.EndOfLinePreference.TextDefined)); + } + + return result.join(newLineCharacter); + } + } + + public getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { + let rules: { [key: string]: string } = {}; + let colorMap = TokenizationRegistry.getColorMap(); + for (let i = 1, len = colorMap.length; i < len; i++) { + let color = colorMap[i]; + if (/^(?:[0-9a-fA-F]{3}){1,2}$/.test(color)) { + color = '#' + color; + } + rules[`mtk${i}`] = `color: ${color};`; + } + rules['mtki'] = 'font-style: italic;'; + rules['mtkb'] = 'font-weight: bold;'; + rules['mtku'] = 'text-decoration: underline;'; + + let defaultForegroundColor = /^(?:[0-9a-fA-F]{3}){1,2}$/.test(colorMap[1]) ? '#' + colorMap[1] : colorMap[1]; + let defaultBackgroundColor = /^(?:[0-9a-fA-F]{3}){1,2}$/.test(colorMap[2]) ? '#' + colorMap[2] : colorMap[2]; + + let output = `
`; + + if (ranges.length === 1) { + let range: Range = ranges[0]; + + if (range.isEmpty()) { + if (enableEmptySelectionClipboard) { + let modelLineNumber = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber; + let viewLineStart = new Position(range.startLineNumber, 1); + let viewLineEnd = new Position(range.startLineNumber, this.getLineMaxColumn(range.startLineNumber)); + let startOffset = this.coordinatesConverter.convertViewPositionToModelPosition(viewLineStart).column - 1; + let endOffset = this.coordinatesConverter.convertViewPositionToModelPosition(viewLineEnd).column - 1; + let viewLineRenderingData = this.getViewLineRenderingData(new Range(viewLineStart.lineNumber, viewLineStart.column, viewLineEnd.lineNumber, viewLineEnd.column), modelLineNumber); + let html = tokenizeLineToHTML(this.getModelLineContent(modelLineNumber), + viewLineRenderingData.tokens, + rules, + { + startOffset: startOffset, + endOffset: endOffset, + tabSize: this.getTabSize(), + containsRTL: this.model.mightContainRTL() + }); + output += `${html}`; + } else { + return ''; + } + } else { + for (let i = 0, lineCount = range.endLineNumber - range.startLineNumber; i <= lineCount; i++) { + let viewLineRenderingData = this.getViewLineRenderingData(range, range.startLineNumber + i); + let lineContent = viewLineRenderingData.content; + let startOffset = i === 0 ? range.startColumn - 1 : 0; + let endOffset = i === lineCount ? range.endColumn - 1 : lineContent.length; + + let html = tokenizeLineToHTML(lineContent, viewLineRenderingData.tokens, rules, + { + startOffset: startOffset, + endOffset: endOffset, + tabSize: this.getTabSize(), + containsRTL: this.model.mightContainRTL() + }); + output += `${html}`; + } + } + } + + output += '
'; + + return output; + } } diff --git a/src/vs/editor/contrib/clipboard/browser/standaloneRichClipboard.ts b/src/vs/editor/contrib/clipboard/browser/standaloneRichClipboard.ts deleted file mode 100644 index 9703d94d8ee9c61b22bafd6f63987b786e9c19fb..0000000000000000000000000000000000000000 --- a/src/vs/editor/contrib/clipboard/browser/standaloneRichClipboard.ts +++ /dev/null @@ -1,65 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as editorCommon from 'vs/editor/common/editorCommon'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; -import { IModeService } from 'vs/editor/common/services/modeService'; - -@editorContribution -class CopyRichTextController extends Disposable implements editorCommon.IEditorContribution { - - private static ID = 'editor.contrib.copyRichText'; - - public static get(editor: editorCommon.ICommonCodeEditor): CopyRichTextController { - return editor.getContribution(CopyRichTextController.ID); - } - - private _editor: ICodeEditor; - private _modeService: IModeService; - private _handler: (event: any) => void; - - constructor( - editor: ICodeEditor, - @IModeService modeService: IModeService, - ) { - super(); - this._editor = editor; - this._modeService = modeService; - this._handler = (e: ClipboardEvent) => { - if (e.target instanceof HTMLElement) { - const target = e.target; - if (target.nodeName && (target.nodeName.toLowerCase() === 'input' || target.nodeName.toLowerCase() === 'textarea')) { - let richText = e.clipboardData.getData('text/html'); - if (richText) { - let themeId = this._editor.getConfiguration().viewInfo.theme; - let color: string; - if (/vs-dark($| )/.test(themeId)) { - color = 'color: #BBB;background: #1E1E1E;'; - } if (/vs($| )/.test(themeId)) { - color = 'color: #333;background: #fffffe;'; - } else { - color = 'color: #fff;background: #000;'; - } - - e.clipboardData.setData('text/html', `\n${richText}`); - } - } - } - }; - - document.addEventListener('copy', this._handler); - } - - public getId(): string { - return CopyRichTextController.ID; - } - - public dispose(): void { - document.removeEventListener('copy', this._handler); - super.dispose(); - } -} \ No newline at end of file diff --git a/src/vs/editor/contrib/clipboard/electron-browser/richClipboard.ts b/src/vs/editor/contrib/clipboard/electron-browser/richClipboard.ts deleted file mode 100644 index 84371943c21404056a9d251d52aa3dd00ca25c63..0000000000000000000000000000000000000000 --- a/src/vs/editor/contrib/clipboard/electron-browser/richClipboard.ts +++ /dev/null @@ -1,64 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as editorCommon from 'vs/editor/common/editorCommon'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; -import { IModeService } from 'vs/editor/common/services/modeService'; -import { IThemeService } from 'vs/workbench/services/themes/common/themeService'; - -@editorContribution -class CopyRichTextController extends Disposable implements editorCommon.IEditorContribution { - - private static ID = 'editor.contrib.copyRichText'; - - public static get(editor: editorCommon.ICommonCodeEditor): CopyRichTextController { - return editor.getContribution(CopyRichTextController.ID); - } - - private _editor: ICodeEditor; - private _themeService: IThemeService; - private _modeService: IModeService; - private _handler: (event: any) => void; - - constructor( - editor: ICodeEditor, - @IModeService modeService: IModeService, - @IThemeService themeService: IThemeService - ) { - super(); - this._editor = editor; - this._themeService = themeService; - this._modeService = modeService; - this._handler = (e: ClipboardEvent) => { - if (e.target instanceof HTMLElement) { - const target = e.target; - if (target.nodeName && (target.nodeName.toLowerCase() === 'input' || target.nodeName.toLowerCase() === 'textarea')) { - let richText = e.clipboardData.getData('text/html'); - if (richText) { - let theme = this._themeService.getColorTheme(); - let globalSettings = theme.settings.filter(s => !s.scope); - if (globalSettings.length > 0) { - let backgroundColor = globalSettings[0].settings.background; - e.clipboardData.setData('text/html', `\n${richText}`); - } - } - } - } - }; - - window.document.addEventListener('copy', this._handler); - } - - public getId(): string { - return CopyRichTextController.ID; - } - - public dispose(): void { - window.document.removeEventListener('copy', this._handler); - super.dispose(); - } -} \ No newline at end of file diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index 2016a6effb3c1f2a2df541f8cc0bf9e710cac0a5..a0cf669373aa3a11922cc5412487b764af7eea6c 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -10,7 +10,6 @@ import 'vs/editor/contrib/quickOpen/browser/quickOutline'; import 'vs/editor/contrib/quickOpen/browser/gotoLine'; import 'vs/editor/contrib/quickOpen/browser/quickCommand'; import 'vs/editor/contrib/inspectTokens/browser/inspectTokens'; -import 'vs/editor/contrib/clipboard/browser/standaloneRichClipboard'; import { createMonacoBaseAPI } from 'vs/editor/common/standalone/standaloneBase'; import { createMonacoEditorAPI } from 'vs/editor/browser/standalone/standaloneEditor'; diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index a3efd6f5254eb39fb18b761523af2f1072f8dd5c..02ee516811b4422bf0af51e8f429184d9922c015 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -11,7 +11,6 @@ import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { TextAreaWrapper } from 'vs/editor/browser/controller/input/textAreaWrapper'; import { Position } from 'vs/editor/common/core/position'; -import { ViewLineRenderingData } from 'vs/editor/common/viewModel/viewModel'; // To run this test, open imeTester.html @@ -55,8 +54,12 @@ class SingleLineTestModel implements ISimpleModel { return 1; } - public getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData { - return null; + public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { + return ''; + } + + public getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { + return ''; } } @@ -101,7 +104,7 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: let model = new SingleLineTestModel('some text'); - let handler = new TextAreaHandler(browser, strategy, textAreaWrapper, model, null, () => { }); + let handler = new TextAreaHandler(browser, strategy, textAreaWrapper, model, () => { }); input.onfocus = () => { handler.setHasFocus(true); @@ -185,4 +188,4 @@ const TESTS = [ TESTS.forEach((t) => { document.body.appendChild(doCreateTest(TextAreaStrategy.NVDA, t.description, t.in, t.out)); document.body.appendChild(doCreateTest(TextAreaStrategy.IENarrator, t.description, t.in, t.out)); -}); +}); \ No newline at end of file diff --git a/src/vs/editor/test/common/controller/textAreaState.test.ts b/src/vs/editor/test/common/controller/textAreaState.test.ts index 8064bd94b456e0274f13eeb30673d340ac0e91ac..6da10786e1f45954d22872d705e12054df6a91b5 100644 --- a/src/vs/editor/test/common/controller/textAreaState.test.ts +++ b/src/vs/editor/test/common/controller/textAreaState.test.ts @@ -10,7 +10,6 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { MockTextAreaWrapper } from 'vs/editor/test/common/mocks/mockTextAreaWrapper'; -import { ViewLineRenderingData } from 'vs/editor/common/viewModel/viewModel'; suite('TextAreaState', () => { @@ -474,7 +473,11 @@ class SimpleModel implements ISimpleModel { return this._lines.length; } - public getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData { - return null; + public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { + return ''; + } + + public getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { + return ''; } } diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index e7f009ba196322c8ea7e70f4beb9353990c9aa7f..891f770bbdb8ccd172c87787d435aa67762d5a7d 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -12,7 +12,6 @@ import 'vs/base/common/errors'; // Editor import 'vs/editor/contrib/accessibility/browser/accessibility'; import 'vs/editor/contrib/defineKeybinding/browser/defineKeybinding'; -import 'vs/editor/contrib/clipboard/electron-browser/richClipboard'; import 'vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes'; import 'vs/editor/contrib/selectionClipboard/electron-browser/selectionClipboard'; import 'vs/editor/browser/editor.all';