diff --git a/src/vs/editor/contrib/find/browser/find.ts b/src/vs/editor/contrib/find/browser/find.ts index b83395b7ee3083c76ba67c0dbcb95f31fb722e8a..95064023afeecfc0ce1a4b8b46ccb451545381fc 100644 --- a/src/vs/editor/contrib/find/browser/find.ts +++ b/src/vs/editor/contrib/find/browser/find.ts @@ -34,7 +34,7 @@ export class FindController implements EditorCommon.IEditorContribution, FindWid private editor:EditorBrowser.ICodeEditor; private _findWidgetVisible: IKeybindingContextKey; - private model:FindModel.IFindModel; + private model:FindModel.FindModelBoundToEditorModel; private widget:FindWidget.FindWidget; private widgetIsVisible:boolean; private widgetListeners:Lifecycle.IDisposable[]; @@ -84,10 +84,7 @@ export class FindController implements EditorCommon.IEditorContribution, FindWid public dispose(): void { this.widgetListeners = Lifecycle.disposeAll(this.widgetListeners); - if (this.widget) { - this.widget.dispose(); - this.widget = null; - } + this.widget.dispose(); this.disposeBindingAndModel(); this._eventEmitter.dispose(); } @@ -98,9 +95,7 @@ export class FindController implements EditorCommon.IEditorContribution, FindWid private disposeBindingAndModel(): void { this._findWidgetVisible.reset(); - if (this.widget) { - this.widget.setModel(null); - } + this.widget.setModel(null); if (this.model) { this.model.dispose(); this.model = null; @@ -113,49 +108,16 @@ export class FindController implements EditorCommon.IEditorContribution, FindWid this.editor.focus(); } - private _ensureHasState(): void { - if (!this.lastState) { - this.lastState = { - isReplaceRevealed: false, - properties: { - isRegex: false, - matchCase: false, - wholeWord: false - }, - replaceString: '', - searchString: '' - }; - } - } - public toggleCaseSensitive(): void { - if (this.widget) { - this.widget.toggleCaseSensitive(); - } else { - this._ensureHasState(); - this.lastState.properties.matchCase = !this.lastState.properties.matchCase; - this._eventEmitter.emit(FindController._STATE_CHANGED_EVENT); - } + this.widget.toggleCaseSensitive(); } public toggleWholeWords(): void { - if (this.widget) { - this.widget.toggleWholeWords(); - } else { - this._ensureHasState(); - this.lastState.properties.wholeWord = !this.lastState.properties.wholeWord; - this._eventEmitter.emit(FindController._STATE_CHANGED_EVENT); - } + this.widget.toggleWholeWords(); } public toggleRegex(): void { - if (this.widget) { - this.widget.toggleRegex(); - } else { - this._ensureHasState(); - this.lastState.properties.isRegex = !this.lastState.properties.isRegex; - this._eventEmitter.emit(FindController._STATE_CHANGED_EVENT); - } + this.widget.toggleRegex(); } private onWidgetClosed(): void { @@ -225,6 +187,14 @@ export class FindController implements EditorCommon.IEditorContribution, FindWid // Start searching this.model.start(this.lastState, searchScope, shouldFocus); this.widgetIsVisible = true; + + if (shouldFocus) { + if (forceRevealReplace) { + this.widget.focusReplaceInput(); + } else { + this.widget.focusFindInput(); + } + } } public startFromAction(withReplace:boolean): void { diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 2840244a8d66263ccacf9b26676849eeae68ce98..e8b6422971cf08c6eb1d93f8feef3f11fc7a1bc5 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -78,7 +78,7 @@ export class FindWidget extends EventEmitter.EventEmitter implements EditorBrows private _toDispose:Lifecycle.IDisposable[]; - private _model:FindModel.IFindModel; + private _model:FindModel.FindModelBoundToEditorModel; private _modelListenersToDispose:Lifecycle.IDisposable[]; private focusTracker:DomUtils.IFocusTracker; @@ -186,19 +186,14 @@ export class FindWidget extends EventEmitter.EventEmitter implements EditorBrows return result; } - public setModel(newFindModel:FindModel.IFindModel): void { + public setModel(newFindModel:FindModel.FindModelBoundToEditorModel): void { this._removeModel(); if (newFindModel) { // We have a new model! :) this._model = newFindModel; this._modelListenersToDispose.push(this._model.addStartEventListener((e:FindModel.IFindStartEvent) => { - this._reveal(e.shouldFocus); + this._reveal(e.shouldAnimate); this._setState(e.state, e.selectionFindEnabled); - if (e.shouldFocus) { - this._findInput.select(); - // Edge browser requires focus() in addition to select() - this._findInput.focus(); - } })); this._modelListenersToDispose.push(this._model.addMatchesUpdatedEventListener((e:FindModel.IFindMatchesEvent) => { DomUtils.toggleClass(this._domNode, 'no-results', this._findInput.getValue() !== '' && e.count === 0); @@ -209,6 +204,18 @@ export class FindWidget extends EventEmitter.EventEmitter implements EditorBrows } } + public focusFindInput(): void { + this._findInput.select(); + // Edge browser requires focus() in addition to select() + this._findInput.focus(); + } + + public focusReplaceInput(): void { + this._replaceInputBox.select(); + // Edge browser requires focus() in addition to select() + this._replaceInputBox.focus(); + } + private _removeModel(): void { if (this._model !== null) { this._modelListenersToDispose = Lifecycle.disposeAll(this._modelListenersToDispose); @@ -265,6 +272,9 @@ export class FindWidget extends EventEmitter.EventEmitter implements EditorBrows this._findInput.focusOnCaseSensitive(); } handled = true; + } else if (e.equals(CommonKeybindings.CTRLCMD_DOWN_ARROW)) { + this._codeEditor.focus(); + handled = true; } if (handled) { @@ -290,6 +300,9 @@ export class FindWidget extends EventEmitter.EventEmitter implements EditorBrows } else if (e.equals(CommonKeybindings.TAB)) { this._findInput.focusOnCaseSensitive(); handled = true; + } else if (e.equals(CommonKeybindings.CTRLCMD_DOWN_ARROW)) { + this._codeEditor.focus(); + handled = true; } if (handled) { diff --git a/src/vs/editor/contrib/find/common/findModel.ts b/src/vs/editor/contrib/find/common/findModel.ts index 7f771cee3ecbdcea4b8fb74cde1aa538de668db1..27d105759b25b677c4b423966d3285ebbdccffd2 100644 --- a/src/vs/editor/contrib/find/common/findModel.ts +++ b/src/vs/editor/contrib/find/common/findModel.ts @@ -43,26 +43,10 @@ export interface IFindState { export interface IFindStartEvent { state: IFindState; selectionFindEnabled: boolean; - shouldFocus: boolean; + shouldAnimate: boolean; } -export interface IFindModel { - dispose(): void; - - start(newFindData:IFindState, findScope:EditorCommon.IEditorRange, shouldFocus:boolean): void; - recomputeMatches(newFindData:IFindState, jumpToNextMatch:boolean): void; - setFindScope(findScope:EditorCommon.IEditorRange): void; - - next(): void; - prev(): void; - replace(): void; - replaceAll(): void; - - addStartEventListener(callback:(e:IFindStartEvent)=>void): Lifecycle.IDisposable; - addMatchesUpdatedEventListener(callback:(e:IFindMatchesEvent)=>void): Lifecycle.IDisposable; -} - -export class FindModelBoundToEditorModel extends Events.EventEmitter implements IFindModel { +export class FindModelBoundToEditorModel extends Events.EventEmitter { private static _START_EVENT = 'start'; private static _MATCHES_UPDATED_EVENT = 'matches'; @@ -282,7 +266,7 @@ export class FindModelBoundToEditorModel extends Events.EventEmitter implements } } - public start(newFindData:IFindState, findScope:EditorCommon.IEditorRange, shouldFocus:boolean): void { + public start(newFindData:IFindState, findScope:EditorCommon.IEditorRange, shouldAnimate:boolean): void { this.startPosition = this.editor.getPosition(); this.isRegex = newFindData.properties.isRegex; @@ -297,7 +281,7 @@ export class FindModelBoundToEditorModel extends Events.EventEmitter implements var e:IFindStartEvent = { state: newFindData, selectionFindEnabled: this.hasFindScope(), - shouldFocus: shouldFocus + shouldAnimate: shouldAnimate }; this._emitStartEvent(e); }