提交 0447f82d 编写于 作者: A Alex Dima

Improvements in Find Widget: Ctrl+H always focuses replace, Ctrl+DownArrow focuses the editor

上级 0b90eb2c
......@@ -34,7 +34,7 @@ export class FindController implements EditorCommon.IEditorContribution, FindWid
private editor:EditorBrowser.ICodeEditor;
private _findWidgetVisible: IKeybindingContextKey<boolean>;
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 {
......
......@@ -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) {
......
......@@ -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);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册