codeEditorWidget.ts 16.9 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5 6 7 8
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

import 'vs/css!./media/editor';
import 'vs/css!./media/tokens';
9 10
import {onUnexpectedError} from 'vs/base/common/errors';
import {IEventEmitter} from 'vs/base/common/eventEmitter';
A
Alex Dima 已提交
11 12
import * as browser from 'vs/base/browser/browser';
import * as dom from 'vs/base/browser/dom';
E
Erich Gamma 已提交
13
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
14
import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService';
A
Alex Dima 已提交
15
import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry';
16
import {CommonCodeEditor} from 'vs/editor/common/commonCodeEditor';
17
import {CommonEditorConfiguration} from 'vs/editor/common/config/commonEditorConfig';
A
Alex Dima 已提交
18 19 20 21 22 23 24 25 26 27
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 {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions';
import {ICodeEditorService} from 'vs/editor/common/services/codeEditorService';
import {Configuration} from 'vs/editor/browser/config/configuration';
import * as editorBrowser from 'vs/editor/browser/editorBrowser';
import {EditorBrowserRegistry} from 'vs/editor/browser/editorBrowserExtensions';
import {Colorizer} from 'vs/editor/browser/standalone/colorizer';
import {View} from 'vs/editor/browser/view/viewImpl';
E
Erich Gamma 已提交
28

A
Alex Dima 已提交
29
export class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.ICodeEditor {
E
Erich Gamma 已提交
30

31
	protected domElement:HTMLElement;
A
Alex Dima 已提交
32
	private focusTracker:dom.IFocusTracker;
33
	private _hasWidgetFocus: boolean;
E
Erich Gamma 已提交
34

35 36
	_configuration:Configuration;

A
Alex Dima 已提交
37 38
	private contentWidgets:{ [key:string]:editorBrowser.IContentWidgetData; };
	private overlayWidgets:{ [key:string]:editorBrowser.IOverlayWidgetData; };
E
Erich Gamma 已提交
39

A
Alex Dima 已提交
40
	_view:editorBrowser.IView;
E
Erich Gamma 已提交
41 42 43

	constructor(
		domElement:HTMLElement,
44
		options:editorCommon.IEditorOptions,
E
Erich Gamma 已提交
45 46 47 48 49
		@IInstantiationService instantiationService: IInstantiationService,
		@ICodeEditorService codeEditorService: ICodeEditorService,
		@IKeybindingService keybindingService: IKeybindingService,
		@ITelemetryService telemetryService: ITelemetryService
	) {
50
		super(domElement, options, instantiationService, codeEditorService, keybindingService, telemetryService);
E
Erich Gamma 已提交
51

52 53
		this._hasWidgetFocus = false;

E
Erich Gamma 已提交
54
		// track focus of the domElement and all its anchestors
A
Alex Dima 已提交
55
		this.focusTracker = dom.trackFocus(this.domElement);
E
Erich Gamma 已提交
56 57 58
		this.focusTracker.addFocusListener(() => {
			if (this.forcedWidgetFocusCount === 0) {
				this._editorFocusContextKey.set(true);
59
				this._hasWidgetFocus = true;
A
Alex Dima 已提交
60
				this.emit(editorCommon.EventType.EditorFocus, {});
E
Erich Gamma 已提交
61 62 63 64 65
			}
		});
		this.focusTracker.addBlurListener(() => {
			if (this.forcedWidgetFocusCount === 0) {
				this._editorFocusContextKey.reset();
66
				this._hasWidgetFocus = false;
A
Alex Dima 已提交
67
				this.emit(editorCommon.EventType.EditorBlur, {});
E
Erich Gamma 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80
			}
		});

		this.contentWidgets = {};
		this.overlayWidgets = {};

		var contributionDescriptors = [].concat(EditorBrowserRegistry.getEditorContributions()).concat(CommonEditorRegistry.getEditorContributions());
		for (var i = 0, len = contributionDescriptors.length; i < len; i++) {
			try {
				var contribution = contributionDescriptors[i].createInstance(this._instantiationService, this);
				this.contributions[contribution.getId()] = contribution;
			} catch (err) {
				console.error('Could not instantiate contribution ' + contribution.getId());
81
				onUnexpectedError(err);
E
Erich Gamma 已提交
82 83 84 85
			}
		}
	}

86 87
	protected _createConfiguration(options:editorCommon.ICodeEditorWidgetCreationOptions): CommonEditorConfiguration {
		return new Configuration(options, this.domElement);
E
Erich Gamma 已提交
88 89 90 91 92 93 94 95 96 97
	}

	public dispose(): void {
		this.contentWidgets = {};
		this.overlayWidgets = {};

		this.focusTracker.dispose();
		super.dispose();
	}

98 99 100 101 102 103 104 105 106 107
	public updateOptions(newOptions:editorCommon.IEditorOptions): void {
		let oldTheme = this._configuration.editor.theme;
		super.updateOptions(newOptions);
		let newTheme = this._configuration.editor.theme;

		if (oldTheme !== newTheme) {
			this.render();
		}
	}

A
Alex Dima 已提交
108
	public colorizeModelLine(lineNumber:number, model:editorCommon.IModel = this.model): string {
E
Erich Gamma 已提交
109 110 111 112 113
		if (!model) {
			return '';
		}
		var content = model.getLineContent(lineNumber);
		var tokens = model.getLineTokens(lineNumber, false);
A
Alex Dima 已提交
114
		var inflatedTokens = tokens.inflate();
115 116
		var tabSize = model.getOptions().tabSize;
		return Colorizer.colorizeLine(content, inflatedTokens, tabSize);
E
Erich Gamma 已提交
117
	}
A
Alex Dima 已提交
118
	public getView(): editorBrowser.IView {
E
Erich Gamma 已提交
119 120 121 122 123 124 125 126 127 128
		return this._view;
	}

	public getDomNode(): HTMLElement {
		if (!this.hasView) {
			return null;
		}
		return this._view.domNode;
	}

A
Alex Dima 已提交
129
	public getCenteredRangeInViewport(): editorCommon.IEditorRange {
E
Erich Gamma 已提交
130 131 132 133 134 135
		if (!this.hasView) {
			return null;
		}
		return this._view.getCenteredRangeInViewport();
	}

136
	public getScrollWidth(): number {
E
Erich Gamma 已提交
137
		if (!this.hasView) {
138
			return -1;
E
Erich Gamma 已提交
139
		}
140 141 142 143 144
		return this._view.getCodeEditorHelper().getScrollWidth();
	}
	public getScrollLeft(): number {
		if (!this.hasView) {
			return -1;
E
Erich Gamma 已提交
145
		}
146
		return this._view.getCodeEditorHelper().getScrollLeft();
E
Erich Gamma 已提交
147 148
	}

149
	public getScrollHeight(): number {
E
Erich Gamma 已提交
150 151 152
		if (!this.hasView) {
			return -1;
		}
153
		return this._view.getCodeEditorHelper().getScrollHeight();
E
Erich Gamma 已提交
154
	}
155
	public getScrollTop(): number {
E
Erich Gamma 已提交
156
		if (!this.hasView) {
157
			return -1;
E
Erich Gamma 已提交
158
		}
159
		return this._view.getCodeEditorHelper().getScrollTop();
E
Erich Gamma 已提交
160 161 162 163 164 165 166 167 168
	}

	public setScrollLeft(newScrollLeft:number): void {
		if (!this.hasView) {
			return;
		}
		if (typeof newScrollLeft !== 'number') {
			throw new Error('Invalid arguments');
		}
169 170 171
		this._view.getCodeEditorHelper().setScrollPosition({
			scrollLeft: newScrollLeft
		});
E
Erich Gamma 已提交
172
	}
173
	public setScrollTop(newScrollTop:number): void {
E
Erich Gamma 已提交
174
		if (!this.hasView) {
175
			return;
E
Erich Gamma 已提交
176
		}
177 178 179 180 181 182
		if (typeof newScrollTop !== 'number') {
			throw new Error('Invalid arguments');
		}
		this._view.getCodeEditorHelper().setScrollPosition({
			scrollTop: newScrollTop
		});
E
Erich Gamma 已提交
183
	}
184
	public setScrollPosition(position: editorCommon.INewScrollPosition): void {
E
Erich Gamma 已提交
185
		if (!this.hasView) {
186
			return;
E
Erich Gamma 已提交
187
		}
188
		this._view.getCodeEditorHelper().setScrollPosition(position);
E
Erich Gamma 已提交
189 190
	}

191
	public delegateVerticalScrollbarMouseDown(browserEvent:MouseEvent): void {
E
Erich Gamma 已提交
192
		if (!this.hasView) {
193
			return;
E
Erich Gamma 已提交
194
		}
195
		this._view.getCodeEditorHelper().delegateVerticalScrollbarMouseDown(browserEvent);
E
Erich Gamma 已提交
196 197
	}

A
Alex Dima 已提交
198
	public saveViewState(): editorCommon.ICodeEditorViewState {
E
Erich Gamma 已提交
199 200 201
		if (!this.cursor || !this.hasView) {
			return null;
		}
202 203 204 205 206 207 208 209
		let contributionsState: {[key:string]:any} = {};
		for (let id in this.contributions) {
			let contribution = this.contributions[id];
			if (typeof contribution.saveViewState === 'function') {
				contributionsState[id] = contribution.saveViewState();
			}
		}

E
Erich Gamma 已提交
210 211 212 213
		var cursorState = this.cursor.saveState();
		var viewState = this._view.saveState();
		return {
			cursorState: cursorState,
214 215
			viewState: viewState,
			contributionsState: contributionsState
E
Erich Gamma 已提交
216 217 218
		};
	}

A
Alex Dima 已提交
219
	public restoreViewState(state:editorCommon.IEditorViewState): void {
E
Erich Gamma 已提交
220 221 222 223 224
		if (!this.cursor || !this.hasView) {
			return;
		}
		var s = <any>state;
		if (s && s.cursorState && s.viewState) {
A
Alex Dima 已提交
225
			var codeEditorState = <editorCommon.ICodeEditorViewState>s;
E
Erich Gamma 已提交
226 227
			var cursorState = <any>codeEditorState.cursorState;
			if (Array.isArray(cursorState)) {
A
Alex Dima 已提交
228
				this.cursor.restoreState(<editorCommon.ICursorState[]>cursorState);
E
Erich Gamma 已提交
229 230
			} else {
				// Backwards compatibility
A
Alex Dima 已提交
231
				this.cursor.restoreState([<editorCommon.ICursorState>cursorState]);
E
Erich Gamma 已提交
232 233
			}
			this._view.restoreState(codeEditorState.viewState);
234 235 236 237 238 239 240 241

			let contributionsState = s.contributionsState || {};
			for (let id in this.contributions) {
				let contribution = this.contributions[id];
				if (typeof contribution.restoreViewState === 'function') {
					contribution.restoreViewState(contributionsState[id]);
				}
			}
E
Erich Gamma 已提交
242 243 244
		}
	}

A
Alex Dima 已提交
245
	public layout(dimension?:editorCommon.IDimension): void {
E
Erich Gamma 已提交
246
		this._configuration.observeReferenceElement(dimension);
247
		this.render();
E
Erich Gamma 已提交
248 249 250 251 252 253 254 255 256 257 258 259 260
	}

	public focus(): void {
		if (!this.hasView) {
			return;
		}
		this._view.focus();
	}

	public isFocused(): boolean {
		return this.hasView && this._view.isFocused();
	}

261 262 263 264
	public hasWidgetFocus(): boolean {
		return this._hasWidgetFocus;
	}

A
Alex Dima 已提交
265 266
	public addContentWidget(widget: editorBrowser.IContentWidget): void {
		var widgetData: editorBrowser.IContentWidgetData = {
E
Erich Gamma 已提交
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
			widget: widget,
			position: widget.getPosition()
		};

		if (this.contentWidgets.hasOwnProperty(widget.getId())) {
			console.warn('Overwriting a content widget with the same id.');
		}

		this.contentWidgets[widget.getId()] = widgetData;

		if (this.hasView) {
			this._view.addContentWidget(widgetData);
		}
	}

A
Alex Dima 已提交
282
	public layoutContentWidget(widget: editorBrowser.IContentWidget): void {
E
Erich Gamma 已提交
283 284 285 286 287 288 289 290 291 292
		var widgetId = widget.getId();
		if (this.contentWidgets.hasOwnProperty(widgetId)) {
			var widgetData = this.contentWidgets[widgetId];
			widgetData.position = widget.getPosition();
			if (this.hasView) {
				this._view.layoutContentWidget(widgetData);
			}
		}
	}

A
Alex Dima 已提交
293
	public removeContentWidget(widget: editorBrowser.IContentWidget): void {
E
Erich Gamma 已提交
294 295 296 297 298 299 300 301 302 303
		var widgetId = widget.getId();
		if (this.contentWidgets.hasOwnProperty(widgetId)) {
			var widgetData = this.contentWidgets[widgetId];
			delete this.contentWidgets[widgetId];
			if (this.hasView) {
				this._view.removeContentWidget(widgetData);
			}
		}
	}

A
Alex Dima 已提交
304 305
	public addOverlayWidget(widget: editorBrowser.IOverlayWidget): void {
		var widgetData: editorBrowser.IOverlayWidgetData = {
E
Erich Gamma 已提交
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
			widget: widget,
			position: widget.getPosition()
		};

		if (this.overlayWidgets.hasOwnProperty(widget.getId())) {
			console.warn('Overwriting an overlay widget with the same id.');
		}

		this.overlayWidgets[widget.getId()] = widgetData;

		if (this.hasView) {
			this._view.addOverlayWidget(widgetData);
		}
	}

A
Alex Dima 已提交
321
	public layoutOverlayWidget(widget: editorBrowser.IOverlayWidget): void {
E
Erich Gamma 已提交
322 323 324 325 326 327 328 329 330 331
		var widgetId = widget.getId();
		if (this.overlayWidgets.hasOwnProperty(widgetId)) {
			var widgetData = this.overlayWidgets[widgetId];
			widgetData.position = widget.getPosition();
			if (this.hasView) {
				this._view.layoutOverlayWidget(widgetData);
			}
		}
	}

A
Alex Dima 已提交
332
	public removeOverlayWidget(widget: editorBrowser.IOverlayWidget): void {
E
Erich Gamma 已提交
333 334 335 336 337 338 339 340 341 342
		var widgetId = widget.getId();
		if (this.overlayWidgets.hasOwnProperty(widgetId)) {
			var widgetData = this.overlayWidgets[widgetId];
			delete this.overlayWidgets[widgetId];
			if (this.hasView) {
				this._view.removeOverlayWidget(widgetData);
			}
		}
	}

A
Alex Dima 已提交
343
	public changeViewZones(callback:(accessor:editorBrowser.IViewZoneChangeAccessor)=>void): void {
E
Erich Gamma 已提交
344 345 346 347 348 349
		if (!this.hasView) {
//			console.warn('Cannot change view zones on editor that is not attached to a model, since there is no view.');
			return;
		}
		var hasChanges = this._view.change(callback);
		if (hasChanges) {
A
Alex Dima 已提交
350
			this.emit(editorCommon.EventType.ViewZonesChanged);
E
Erich Gamma 已提交
351 352 353
		}
	}

A
Alex Dima 已提交
354
	public getWhitespaces(): editorCommon.IEditorWhitespace[] {
E
Erich Gamma 已提交
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
		if (!this.hasView) {
			return [];
		}
		return this._view.getWhitespaces();
	}

	public getTopForLineNumber(lineNumber: number): number {
		if (!this.hasView) {
			return -1;
		}
		return this._view.getCodeEditorHelper().getVerticalOffsetForPosition(lineNumber, 1);
	}

	public getTopForPosition(lineNumber: number, column: number): number {
		if (!this.hasView) {
			return -1;
		}
		return this._view.getCodeEditorHelper().getVerticalOffsetForPosition(lineNumber, column);
	}

A
Alex Dima 已提交
375
	public getScrolledVisiblePosition(rawPosition:editorCommon.IPosition): { top:number; left:number; height:number; } {
E
Erich Gamma 已提交
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
		if (!this.hasView) {
			return null;
		}

		var position = this.model.validatePosition(rawPosition);
		var helper = this._view.getCodeEditorHelper();
		var layoutInfo = this._configuration.editor.layoutInfo;

		var top = helper.getVerticalOffsetForPosition(position.lineNumber, position.column) - helper.getScrollTop();
		var left = helper.getOffsetForColumn(position.lineNumber, position.column) + layoutInfo.glyphMarginWidth + layoutInfo.lineNumbersWidth + layoutInfo.decorationsWidth - helper.getScrollLeft();

		return {
			top: top,
			left: left,
			height: this._configuration.editor.lineHeight
		};
	}

	public getOffsetForColumn(lineNumber:number, column:number): number {
		if (!this.hasView) {
			return -1;
		}
		return this._view.getCodeEditorHelper().getOffsetForColumn(lineNumber, column);
	}

401 402 403 404
	public render(): void {
		if (!this.hasView) {
			return;
		}
405
		this._view.render(true, false);
406 407
	}

A
Alex Dima 已提交
408
	public setHiddenAreas(ranges:editorCommon.IRange[]): void {
M
Martin Aeschlimann 已提交
409 410 411 412 413
		if (this.viewModel) {
			this.viewModel.setHiddenAreas(ranges);
		}
	}

A
Alex Dima 已提交
414 415 416 417 418 419 420
	public setAriaActiveDescendant(id:string): void {
		if (!this.hasView) {
			return;
		}
		this._view.setAriaActiveDescendant(id);
	}

421 422 423 424
	public applyFontInfo(target:HTMLElement): void {
		Configuration.applyFontInfoSlow(target, this._configuration.editor.fontInfo);
	}

A
Alex Dima 已提交
425
	_attachModel(model:editorCommon.IModel): void {
E
Erich Gamma 已提交
426 427
		this._view = null;

428
		super._attachModel(model);
E
Erich Gamma 已提交
429

430
		if (this._view) {
E
Erich Gamma 已提交
431 432 433 434
			this.domElement.appendChild(this._view.domNode);

			this._view.renderOnce(() => {

A
Alex Dima 已提交
435 436 437 438
				let keys = Object.keys(this.contentWidgets);
				for (let i = 0, len = keys.length; i < len; i++) {
					let widgetId = keys[i];
					this._view.addContentWidget(this.contentWidgets[widgetId]);
E
Erich Gamma 已提交
439 440
				}

A
Alex Dima 已提交
441 442 443 444
				keys = Object.keys(this.overlayWidgets);
				for (let i = 0, len = keys.length; i < len; i++) {
					let widgetId = keys[i];
					this._view.addOverlayWidget(this.overlayWidgets[widgetId]);
E
Erich Gamma 已提交
445 446
				}

447
				this._view.render(false, true);
E
Erich Gamma 已提交
448 449 450 451 452
				this.hasView = true;
			});
		}
	}

453
	protected _enableEmptySelectionClipboard(): boolean {
A
Alex Dima 已提交
454
		return browser.enableEmptySelectionClipboard;
E
Erich Gamma 已提交
455 456
	}

457 458 459 460 461 462 463
	protected _createView(): void {
		this._view = new View(
			this._configuration,
			this.viewModel,
			this._keybindingService
		);
	}
E
Erich Gamma 已提交
464

465 466 467
	protected _getViewInternalEventBus(): IEventEmitter {
		return this._view.getInternalEventBus();
	}
E
Erich Gamma 已提交
468

A
Alex Dima 已提交
469
	protected _detachModel(): editorCommon.IModel {
E
Erich Gamma 已提交
470 471 472 473 474 475 476 477
		var removeDomNode:HTMLElement = null;

		if (this._view) {
			this._view.dispose();
			removeDomNode = this._view.domNode;
			this._view = null;
		}

478
		let result = super._detachModel();
E
Erich Gamma 已提交
479 480 481 482 483 484 485 486 487

		if (removeDomNode) {
			this.domElement.removeChild(removeDomNode);
		}

		return result;
	}
}

A
Alex Dima 已提交
488
class OverlayWidget2 implements editorBrowser.IOverlayWidget {
E
Erich Gamma 已提交
489 490

	private _id: string;
A
Alex Dima 已提交
491
	private _position: editorBrowser.IOverlayWidgetPosition;
E
Erich Gamma 已提交
492 493
	private _domNode: HTMLElement;

A
Alex Dima 已提交
494
	constructor(id:string, position:editorBrowser.IOverlayWidgetPosition) {
E
Erich Gamma 已提交
495 496 497 498 499 500 501 502 503 504 505 506 507 508
		this._id = id;
		this._position = position;
		this._domNode = document.createElement('div');
		this._domNode.className = this._id.replace(/\./g, '-').replace(/[^a-z0-9\-]/,'');
	}

	public getId(): string {
		return this._id;
	}

	public getDomNode(): HTMLElement {
		return this._domNode;
	}

A
Alex Dima 已提交
509
	public getPosition(): editorBrowser.IOverlayWidgetPosition {
E
Erich Gamma 已提交
510 511 512 513 514 515 516 517
		return this._position;
	}
}

export enum EditCursorState {
	EndOfLastEditOperation = 0
}

A
Alex Dima 已提交
518 519 520 521 522 523 524 525 526 527 528 529 530 531
class SingleEditOperation {

	range: editorCommon.IEditorRange;
	text: string;
	forceMoveMarkers: boolean;

	constructor(source:editorCommon.ISingleEditOperation) {
		this.range = new Range(source.range.startLineNumber, source.range.startColumn, source.range.endLineNumber, source.range.endColumn);
		this.text = source.text;
		this.forceMoveMarkers = source.forceMoveMarkers || false;
	}

}

A
Alex Dima 已提交
532
export class CommandRunner implements editorCommon.ICommand {
E
Erich Gamma 已提交
533

A
Alex Dima 已提交
534
	private _ops: SingleEditOperation[];
E
Erich Gamma 已提交
535 536
	private _editCursorState: EditCursorState;

A
Alex Dima 已提交
537
	constructor(ops: editorCommon.ISingleEditOperation[], editCursorState: EditCursorState) {
A
Alex Dima 已提交
538
		this._ops = ops.map(op => new SingleEditOperation(op));
E
Erich Gamma 已提交
539 540 541
		this._editCursorState = editCursorState;
	}

A
Alex Dima 已提交
542
	public getEditOperations(model: editorCommon.ITokenizedModel, builder: editorCommon.IEditOperationBuilder): void {
E
Erich Gamma 已提交
543 544 545 546 547 548 549 550 551 552
		if (this._ops.length === 0) {
			return;
		}

		// Sort them in ascending order by range starts
		this._ops.sort((o1, o2) => {
			return Range.compareRangesUsingStarts(o1.range, o2.range);
		});

		// Merge operations that touch each other
A
Alex Dima 已提交
553
		var resultOps:editorCommon.ISingleEditOperation[] = [];
E
Erich Gamma 已提交
554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
		var previousOp = this._ops[0];
		for (var i = 1; i < this._ops.length; i++) {
			if (previousOp.range.endLineNumber === this._ops[i].range.startLineNumber && previousOp.range.endColumn === this._ops[i].range.startColumn) {
				// These operations are one after another and can be merged
				previousOp.range = Range.plusRange(previousOp.range, this._ops[i].range);
				previousOp.text = previousOp.text + this._ops[i].text;
			} else {
				resultOps.push(previousOp);
				previousOp = this._ops[i];
			}
		}
		resultOps.push(previousOp);

		for (var i = 0; i < resultOps.length; i++) {
			builder.addEditOperation(Range.lift(resultOps[i].range), resultOps[i].text);
		}
	}

A
Alex Dima 已提交
572
	public computeCursorState(model: editorCommon.ITokenizedModel, helper: editorCommon.ICursorStateComputerData): editorCommon.IEditorSelection {
E
Erich Gamma 已提交
573 574 575 576 577 578 579 580 581 582
		var inverseEditOperations = helper.getInverseEditOperations();
		var srcRange = inverseEditOperations[inverseEditOperations.length - 1].range;
		return Selection.createSelection(
			srcRange.endLineNumber,
			srcRange.endColumn,
			srcRange.endLineNumber,
			srcRange.endColumn
		);
	}
}