diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 5ba0f617220c06a23621747c45df029919865150..41110b32938f6a8cef8ede90a0c33ab7c93d886c 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -841,13 +841,19 @@ export class Cursor extends EventEmitter { } private emitCursorSelectionChanged(source:string, reason:string): void { - var selections = this.cursors.getSelections(); - var primarySelection = selections[0]; - var secondarySelections = selections.slice(1); + let selections = this.cursors.getSelections(); + let primarySelection = selections[0]; + let secondarySelections = selections.slice(1); + + let viewSelections = this.cursors.getViewSelections(); + let primaryViewSelection = viewSelections[0]; + let secondaryViewSelections = viewSelections.slice(1); - var e:EditorCommon.ICursorSelectionChangedEvent = { + let e:EditorCommon.ICursorSelectionChangedEvent = { selection: primarySelection, + viewSelection: primaryViewSelection, secondarySelections: secondarySelections, + secondaryViewSelections: secondaryViewSelections, source: source, reason: reason }; diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index d5dd1f6660261de2300e801871f3e81ce5ef8c90..c0301683a919d07faa1fe240bb3b9707dd8a05b7 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -2022,10 +2022,18 @@ export interface ICursorSelectionChangedEvent { * The primary selection. */ selection:IEditorSelection; + /** + * The primary selection in view coordinates. + */ + viewSelection:IEditorSelection; /** * The secondary selections. */ secondarySelections:IEditorSelection[]; + /** + * The secondary selections in view coordinates. + */ + secondaryViewSelections:IEditorSelection[]; /** * Source of the call that caused the event. */ diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index 2851eae9e3591e47875b0161a342a8d6015d90e2..0b9825a0df000d93a019c0cea1fb14f396a8df8b 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -334,6 +334,17 @@ export class ViewModel extends EventEmitter implements EditorCommon.IViewModel { } return this.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column); } + + public validateViewSelection(viewSelection:EditorCommon.IEditorSelection, modelSelection:EditorCommon.IEditorSelection): EditorCommon.IEditorSelection { + let modelSelectionStart = new Position(modelSelection.selectionStartLineNumber, modelSelection.selectionStartColumn); + let modelPosition = new Position(modelSelection.positionLineNumber, modelSelection.positionColumn); + + let viewSelectionStart = this.validateViewPosition(viewSelection.selectionStartLineNumber, viewSelection.selectionStartColumn, modelSelectionStart); + let viewPosition = this.validateViewPosition(viewSelection.positionLineNumber, viewSelection.positionColumn, modelPosition); + + return new Selection(viewSelectionStart.lineNumber, viewSelectionStart.column, viewPosition.lineNumber, viewPosition.column); + } + private onCursorPositionChanged(e:EditorCommon.ICursorPositionChangedEvent): void { this.cursors.onCursorPositionChanged(e, (eventType:string, payload:any) => this.emit(eventType, payload)); } diff --git a/src/vs/editor/common/viewModel/viewModelCursors.ts b/src/vs/editor/common/viewModel/viewModelCursors.ts index 2c74e941d1ad6642edfdd93ae639289d9f3e2f97..e7e8e249ec12d33cacad8e32f8fc1e758f6cd8af 100644 --- a/src/vs/editor/common/viewModel/viewModelCursors.ts +++ b/src/vs/editor/common/viewModel/viewModelCursors.ts @@ -10,6 +10,7 @@ import EditorCommon = require('vs/editor/common/editorCommon'); export interface IConverter { validateViewPosition(viewLineNumber:number, viewColumn:number, modelPosition:EditorCommon.IEditorPosition): EditorCommon.IEditorPosition; + validateViewSelection(viewSelection:EditorCommon.IEditorSelection, modelSelection:EditorCommon.IEditorSelection): EditorCommon.IEditorSelection; convertModelSelectionToViewSelection(modelSelection:EditorCommon.IEditorSelection): EditorCommon.IEditorSelection; convertModelRangeToViewRange(modelRange:EditorCommon.IRange): EditorCommon.IEditorRange; } @@ -74,13 +75,13 @@ export class ViewModelCursors { public onCursorSelectionChanged(e:EditorCommon.ICursorSelectionChangedEvent, emit:(eventType:string, payload:any)=>void): void { this.lastCursorSelectionChangedEvent = e; - var selection = this.converter.convertModelSelectionToViewSelection(e.selection); - var secondarySelections: EditorCommon.IEditorSelection[] = []; - for (var i = 0, len = e.secondarySelections.length; i < len; i++) { - secondarySelections[i] = this.converter.convertModelSelectionToViewSelection(e.secondarySelections[i]); + let selection = this.converter.validateViewSelection(e.viewSelection, e.selection); + let secondarySelections: EditorCommon.IEditorSelection[] = []; + for (let i = 0, len = e.secondarySelections.length; i < len; i++) { + secondarySelections[i] = this.converter.validateViewSelection(e.secondaryViewSelections[i], e.secondarySelections[i]); } - var newEvent:EditorCommon.IViewCursorSelectionChangedEvent = { + let newEvent:EditorCommon.IViewCursorSelectionChangedEvent = { selection: selection, secondarySelections: secondarySelections };