From c288d0c4e4b3769926968bf636f6fdbe21cfb2f1 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 22 Feb 2016 15:50:09 +0100 Subject: [PATCH] editorStatus: show encoding --- .../contrib/indentation/common/indentation.ts | 6 +- .../browser/parts/editor/editorStatus.ts | 77 ++++++++++++++++++- .../parts/editor/media/editorstatus.css | 3 +- 3 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/contrib/indentation/common/indentation.ts b/src/vs/editor/contrib/indentation/common/indentation.ts index 06fbd12a54b..a81f4b15682 100644 --- a/src/vs/editor/contrib/indentation/common/indentation.ts +++ b/src/vs/editor/contrib/indentation/common/indentation.ts @@ -11,7 +11,7 @@ import {ICommonCodeEditor, IEditorActionDescriptorData} from 'vs/editor/common/e import {CommonEditorRegistry, EditorActionDescriptor} from 'vs/editor/common/editorCommonExtensions'; import {IndentationToSpacesCommand, IndentationToTabsCommand} from 'vs/editor/contrib/indentation/common/indentationCommands'; -class IndentationToSpacesAction extends EditorAction { +export class IndentationToSpacesAction extends EditorAction { static ID = 'editor.action.indentationToSpaces'; constructor(descriptor: IEditorActionDescriptorData, editor: ICommonCodeEditor, @INullService ns) { @@ -22,12 +22,12 @@ class IndentationToSpacesAction extends EditorAction { const command = new IndentationToSpacesCommand(this.editor.getSelection(), this.editor.getIndentationOptions().tabSize); this.editor.executeCommands(this.id, [command]); - + return TPromise.as(true); } } -class IndentationToTabsAction extends EditorAction { +export class IndentationToTabsAction extends EditorAction { static ID = 'editor.action.indentationToTabs'; constructor(descriptor: IEditorActionDescriptorData, editor: ICommonCodeEditor, @INullService ns) { diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 91cdf6d0a88..a2478acdedb 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -79,6 +79,7 @@ interface IEditorSelectionStatus { } interface IStateChange { + indentation: boolean; selectionStatus: boolean; mode: boolean; encoding: boolean; @@ -91,6 +92,7 @@ interface StateDelta { mode?: string; encoding?: string; EOL?: string; + indentation?: string; tabFocusMode?: boolean; } @@ -107,6 +109,9 @@ class State { private _EOL: string; public get EOL(): string { return this._EOL; } + private _indentation: string; + public get indentation(): string { return this._indentation; } + private _tabFocusMode: boolean; public get tabFocusMode(): boolean { return this._tabFocusMode; } @@ -124,7 +129,8 @@ class State { mode: false, encoding: false, EOL: false, - tabFocusMode: false + tabFocusMode: false, + indentation: false }; let somethingChanged = false; @@ -135,6 +141,13 @@ class State { e.selectionStatus = true; } } + if (typeof update.indentation !== 'undefined') { + if (this._indentation !== update.indentation) { + this._indentation = update.indentation; + somethingChanged = true; + e.indentation = true; + } + } if (typeof update.mode !== 'undefined') { if (this._mode !== update.mode) { this._mode = update.mode; @@ -191,6 +204,7 @@ export class EditorStatus implements IStatusbarItem { private state: State; private element: HTMLElement; private tabFocusModeElement: HTMLElement; + private indentationElement: HTMLElement; private selectionElement: HTMLElement; private encodingElement: HTMLElement; private eolElement: HTMLElement; @@ -217,6 +231,11 @@ export class EditorStatus implements IStatusbarItem { this.tabFocusModeElement.textContent = nlsTabFocusMode; hide(this.tabFocusModeElement); + this.indentationElement = append(this.element, $('a.editor-status-indentation')); + this.indentationElement.title = nls.localize('indentation', "Indentation"); + this.indentationElement.onclick = () => this.onIndentationClick(); + hide(this.indentationElement); + this.selectionElement = append(this.element, $('a.editor-status-selection')); this.selectionElement.title = nls.localize('gotoLine', "Go to Line"); this.selectionElement.onclick = () => this.onSelectionClick(); @@ -243,7 +262,8 @@ export class EditorStatus implements IStatusbarItem { this.eventService.addListener2(EventType.TEXT_EDITOR_SELECTION_CHANGED, (e: TextEditorSelectionEvent) => this.onSelectionChange(e.editor)), this.eventService.addListener2(EventType.TEXT_EDITOR_MODE_CHANGED, (e: EditorEvent) => this.onModeChange(e.editor)), this.eventService.addListener2(EventType.TEXT_EDITOR_CONTENT_CHANGED, (e: EditorEvent) => this.onEOLChange(e.editor)), - this.eventService.addListener2(EventType.TEXT_EDITOR_CONFIGURATION_CHANGED, (e: EditorEvent) => this.onTabFocusModeChange(e.editor)) + this.eventService.addListener2(EventType.TEXT_EDITOR_CONFIGURATION_CHANGED, (e: EditorEvent) => this.onTabFocusModeChange(e.editor)), + this.eventService.addListener2(EventType.TEXT_EDITOR_CONFIGURATION_CHANGED, (e: EditorEvent) => this.onIndentationChange(e.editor)) ); return combinedDispose(...this.toDispose); @@ -264,6 +284,15 @@ export class EditorStatus implements IStatusbarItem { } } + if (changed.indentation) { + if (this.state.indentation) { + this.indentationElement.textContent = this.state.indentation; + show(this.indentationElement); + } else { + hide(this.indentationElement); + } + } + if (changed.selectionStatus) { if (this.state.selectionStatus) { this.selectionElement.textContent = this.state.selectionStatus; @@ -328,6 +357,12 @@ export class EditorStatus implements IStatusbarItem { action.dispose(); } + private onIndentationClick(): void { + const action = this.instantiationService.createInstance(ChangeIndentationAction, ChangeIndentationAction.ID, ChangeIndentationAction.LABEL); + action.run().done(null, errors.onUnexpectedError); + action.dispose(); + } + private onSelectionClick(): void { this.quickOpenService.show(':'); // "Go to line" } @@ -359,6 +394,7 @@ export class EditorStatus implements IStatusbarItem { this.onEOLChange(e); this.onEncodingChange(e); this.onTabFocusModeChange(e); + this.onIndentationChange(e); } private onModeChange(e: IBaseEditor): void { @@ -386,6 +422,16 @@ export class EditorStatus implements IStatusbarItem { this.updateState(info); } + private onIndentationChange(e: IBaseEditor): void { + let update: StateDelta = { indentation: null }; + if (e instanceof BaseTextEditor) { + const options = (e.getControl()).getIndentationOptions(); + update.indentation = options.insertSpaces ? nls.localize('spacesSize', "Spaces: {0}", options.tabSize) : + nls.localize('tabSize', "Tab Size: {0}", options.tabSize); + } + this.updateState(update); + } + private onSelectionChange(e: IBaseEditor): void { if (e && !this.isActiveEditor(e)) { return; @@ -603,6 +649,33 @@ export interface IChangeEOLEntry extends IPickOpenEntry { eol: EndOfLineSequence; } +export class ChangeIndentationAction extends Action { + + public static ID = 'workbench.action.editor.changeIndentation'; + public static LABEL = nls.localize('changeIndentation', "Change Indentation"); + + constructor( + actionId: string, + actionLabel: string, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IQuickOpenService private quickOpenService: IQuickOpenService + ) { + super(actionId, actionLabel); + } + + public run(): TPromise { + const activeEditor = this.editorService.getActiveEditor(); + if (!(activeEditor instanceof BaseTextEditor)) { + return this.quickOpenService.pick([{ label: nls.localize('noEditor', "No text editor active at this time") }]); + } + if (!isWritableCodeEditor(activeEditor)) { + return this.quickOpenService.pick([{ label: nls.localize('noWritableCodeEditor', "The active code editor is read-only.") }]); + } + + return this.quickOpenService.show('>indentation'); + } +} + export class ChangeEOLAction extends Action { public static ID = 'workbench.action.editor.changeEOL'; diff --git a/src/vs/workbench/browser/parts/editor/media/editorstatus.css b/src/vs/workbench/browser/parts/editor/media/editorstatus.css index e8edeb18ffc..a82742d7746 100644 --- a/src/vs/workbench/browser/parts/editor/media/editorstatus.css +++ b/src/vs/workbench/browser/parts/editor/media/editorstatus.css @@ -10,7 +10,8 @@ .monaco-workbench .editor-statusbar-item > .editor-status-mode, .monaco-workbench .editor-statusbar-item > .editor-status-encoding, .monaco-workbench .editor-statusbar-item > .editor-status-eol, -.monaco-workbench .editor-statusbar-item > .editor-status-selection { +.monaco-workbench .editor-statusbar-item > .editor-status-selection, +.monaco-workbench .editor-statusbar-item > .editor-status-indentation { padding: 0 5px 0 5px; }