@@ -33,6 +33,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
3333import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet' ;
3434import { IEditorOptions } from 'vs/editor/common/config/editorOptions' ;
3535import { IAccessibilityService , AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility' ;
36+ import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox' ;
3637
3738export interface ISearchWidgetOptions {
3839 value ?: string ;
@@ -42,6 +43,7 @@ export interface ISearchWidgetOptions {
4243 isWholeWords ?: boolean ;
4344 searchHistory ?: string [ ] ;
4445 replaceHistory ?: string [ ] ;
46+ preserveCase ?: boolean ;
4547}
4648
4749class ReplaceAllAction extends Action {
@@ -97,6 +99,7 @@ export class SearchWidget extends Widget {
9799 replaceInputFocusTracker : dom . IFocusTracker ;
98100 private replaceInputBoxFocused : IContextKey < boolean > ;
99101 private _replaceHistoryDelayer : Delayer < void > ;
102+ private _preserveCase : Checkbox ;
100103
101104 private ignoreGlobalFindBufferOnNextFocus = false ;
102105 private previousGlobalFindBufferValue : string ;
@@ -113,6 +116,9 @@ export class SearchWidget extends Widget {
113116 private _onReplaceStateChange = this . _register ( new Emitter < boolean > ( ) ) ;
114117 readonly onReplaceStateChange : Event < boolean > = this . _onReplaceStateChange . event ;
115118
119+ private _onPreserveCaseChange = this . _register ( new Emitter < boolean > ( ) ) ;
120+ readonly onPreserveCaseChange : Event < boolean > = this . _onPreserveCaseChange . event ;
121+
116122 private _onReplaceValueChanged = this . _register ( new Emitter < void > ( ) ) ;
117123 readonly onReplaceValueChanged : Event < void > = this . _onReplaceValueChanged . event ;
118124
@@ -333,13 +339,34 @@ export class SearchWidget extends Widget {
333339
334340 private renderReplaceInput ( parent : HTMLElement , options : ISearchWidgetOptions ) : void {
335341 this . replaceContainer = dom . append ( parent , dom . $ ( '.replace-container.disabled' ) ) ;
336- const replaceBox = dom . append ( this . replaceContainer , dom . $ ( '.input-box' ) ) ;
342+ const replaceBox = dom . append ( this . replaceContainer , dom . $ ( '.replace-input' ) ) ;
343+
337344 this . replaceInput = this . _register ( new ContextScopedHistoryInputBox ( replaceBox , this . contextViewService , {
338345 ariaLabel : nls . localize ( 'label.Replace' , 'Replace: Type replace term and press Enter to preview or Escape to cancel' ) ,
339346 placeholder : nls . localize ( 'search.replace.placeHolder' , "Replace" ) ,
340347 history : options . replaceHistory || [ ] ,
341348 flexibleHeight : true
342349 } , this . contextKeyService ) ) ;
350+
351+ this . _preserveCase = this . _register ( new Checkbox ( {
352+ actionClassName : 'monaco-preserve-case' ,
353+ title : nls . localize ( 'label.preserveCaseCheckbox' , "Preserve Case" ) ,
354+ isChecked : ! ! options . preserveCase ,
355+ } ) ) ;
356+
357+ this . _register ( this . _preserveCase . onChange ( viaKeyboard => {
358+ if ( ! viaKeyboard ) {
359+ this . replaceInput . focus ( ) ;
360+ this . _onPreserveCaseChange . fire ( this . _preserveCase . checked ) ;
361+ }
362+ } ) ) ;
363+
364+ let controls = document . createElement ( 'div' ) ;
365+ controls . className = 'controls' ;
366+ controls . style . display = 'block' ;
367+ controls . appendChild ( this . _preserveCase . domNode ) ;
368+ replaceBox . appendChild ( controls ) ;
369+
343370 this . _register ( attachInputBoxStyler ( this . replaceInput , this . themeService ) ) ;
344371 this . onkeydown ( this . replaceInput . inputElement , ( keyboardEvent ) => this . onReplaceInputKeyDown ( keyboardEvent ) ) ;
345372 this . replaceInput . value = options . replaceValue || '' ;
0 commit comments