From 45fbd00dd5027c58b61c13a2e6eb84f61635fde0 Mon Sep 17 00:00:00 2001 From: Eklavya Mirani Date: Sat, 27 Aug 2016 13:55:51 +0530 Subject: [PATCH 001/433] Moved TM Markdown seperator rule below the Paragraph rule to fix the alt heading 2 syntax highlighting. --- extensions/markdown/syntaxes/markdown.tmLanguage | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/extensions/markdown/syntaxes/markdown.tmLanguage b/extensions/markdown/syntaxes/markdown.tmLanguage index 9a41ee6464e..955baa07133 100644 --- a/extensions/markdown/syntaxes/markdown.tmLanguage +++ b/extensions/markdown/syntaxes/markdown.tmLanguage @@ -26,10 +26,6 @@ patterns - - include - #separator - include #heading @@ -206,6 +202,11 @@ include #paragraph + + include + #separator + + repository From 9aff1d0f749e5ed14f26257257f01a8c88cc5b28 Mon Sep 17 00:00:00 2001 From: Eklavya Mirani Date: Sun, 28 Aug 2016 16:31:02 +0530 Subject: [PATCH 002/433] Added the --- seperator to the paragraph rule to allow heading-setext.2 rule to be recognized --- .../markdown/syntaxes/markdown.tmLanguage | 17 ++++++----------- .../markdown/test/colorize-fixtures/test.md | 6 ++++++ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/extensions/markdown/syntaxes/markdown.tmLanguage b/extensions/markdown/syntaxes/markdown.tmLanguage index 955baa07133..a40dffd3baf 100644 --- a/extensions/markdown/syntaxes/markdown.tmLanguage +++ b/extensions/markdown/syntaxes/markdown.tmLanguage @@ -26,6 +26,10 @@ patterns + + include + #separator + include #heading @@ -202,11 +206,6 @@ include #paragraph - - include - #separator - - repository @@ -413,10 +412,6 @@ include text.html.basic - - include - #heading-setext - while (^|\G)(?!\s*$|#|[ ]{0,3}([-*_][ ]{2,}){3,}[ \t]*$\n?|>|[ ]{0,3}[*+-]|[ ]{0,3}[0-9]+\.) @@ -508,7 +503,7 @@ - (^|\G)(?!\s*$|#|[ ]{0,3}((([-*_][ ]{0,2}\2){2,}[ \t]*$\n?)|([*+-]([ ]{1,3}|\t)))|\s*\[.+?\]:|>) + (^|\G)(?!\s*$|#|[ ]{0,3}((([*_][ ]{0,2}\2){2,}[ \t]*$\n?)|([*+-]([ ]{1,3}|\t)))|\s*\[.+?\]:|>) raw_block @@ -1114,7 +1109,7 @@ separator match - (^|\G)[ ]{0,3}([-*_])([ ]{0,2}\2){2,}[ \t]*$\n? + (^|\G)[ ]{0,3}([*-_])([ ]{0,2}\2){2,}[ \t]*$\n? name meta.separator.markdown diff --git a/extensions/markdown/test/colorize-fixtures/test.md b/extensions/markdown/test/colorize-fixtures/test.md index ee7b78e670b..dd4eb788b46 100644 --- a/extensions/markdown/test/colorize-fixtures/test.md +++ b/extensions/markdown/test/colorize-fixtures/test.md @@ -4,6 +4,12 @@ ## Markdown plus h2 with a custom ID ## {#id-goes-here} [Link back to H2](#id-goes-here) +### Alternate heading styles: +Alternate Header 1 +========================== +Alternate Header 2 +-------------------------- +
From 2e886c0708483c27876294fba24d50e216dc81af Mon Sep 17 00:00:00 2001 From: Eklavya Mirani Date: Sun, 28 Aug 2016 23:20:58 +0530 Subject: [PATCH 003/433] fixed broken markdown tests. --- .../markdown/syntaxes/markdown.tmLanguage | 4 + .../markdown/test/colorize-fixtures/test.md | 4 +- .../test/colorize-results/test_md.json | 77 +++++++++++++++++++ 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/extensions/markdown/syntaxes/markdown.tmLanguage b/extensions/markdown/syntaxes/markdown.tmLanguage index a40dffd3baf..e9bbc06c1d3 100644 --- a/extensions/markdown/syntaxes/markdown.tmLanguage +++ b/extensions/markdown/syntaxes/markdown.tmLanguage @@ -412,6 +412,10 @@ include text.html.basic + + include + #heading-setext + while (^|\G)(?!\s*$|#|[ ]{0,3}([-*_][ ]{2,}){3,}[ \t]*$\n?|>|[ ]{0,3}[*+-]|[ ]{0,3}[0-9]+\.) diff --git a/extensions/markdown/test/colorize-fixtures/test.md b/extensions/markdown/test/colorize-fixtures/test.md index dd4eb788b46..4458036582a 100644 --- a/extensions/markdown/test/colorize-fixtures/test.md +++ b/extensions/markdown/test/colorize-fixtures/test.md @@ -6,9 +6,9 @@ ### Alternate heading styles: Alternate Header 1 -========================== +================== Alternate Header 2 --------------------------- +------------------
diff --git a/extensions/markdown/test/colorize-results/test_md.json b/extensions/markdown/test/colorize-results/test_md.json index 4f40023d335..c402182aa59 100644 --- a/extensions/markdown/test/colorize-results/test_md.json +++ b/extensions/markdown/test/colorize-results/test_md.json @@ -241,6 +241,83 @@ "hc_black": ".hc-black .token rgb(255, 255, 255)" } }, + { + "c": "###", + "t": "${1/(#)(#)?(#)?(#)?(#)?(#)?/${6:?6:${5:?5:${4:?4:${3:?3:${2:?2:1}}}}}/}.definition.heading.markdown.markup.punctuation", + "r": { + "dark_plus": ".vs-dark.vscode-theme-defaults-themes-dark_plus-json .token.markup.heading rgb(86, 156, 214)", + "light_plus": ".vs.vscode-theme-defaults-themes-light_plus-json .token.markup.heading rgb(128, 0, 0)", + "dark_vs": ".vs-dark.vscode-theme-defaults-themes-dark_vs-json .token.markup.heading rgb(86, 156, 214)", + "light_vs": ".vs.vscode-theme-defaults-themes-light_vs-json .token.markup.heading rgb(128, 0, 0)", + "hc_black": ".hc-black.vscode-theme-defaults-themes-hc_black-json .token.markup.heading rgb(103, 150, 230)" + } + }, + { + "c": " ", + "t": "${1/(#)(#)?(#)?(#)?(#)?(#)?/${6:?6:${5:?5:${4:?4:${3:?3:${2:?2:1}}}}}/}.heading.markdown.markup", + "r": { + "dark_plus": ".vs-dark.vscode-theme-defaults-themes-dark_plus-json .token.markup.heading rgb(86, 156, 214)", + "light_plus": ".vs.vscode-theme-defaults-themes-light_plus-json .token.markup.heading rgb(128, 0, 0)", + "dark_vs": ".vs-dark.vscode-theme-defaults-themes-dark_vs-json .token.markup.heading rgb(86, 156, 214)", + "light_vs": ".vs.vscode-theme-defaults-themes-light_vs-json .token.markup.heading rgb(128, 0, 0)", + "hc_black": ".hc-black.vscode-theme-defaults-themes-hc_black-json .token.markup.heading rgb(103, 150, 230)" + } + }, + { + "c": "Alternate heading styles:", + "t": "${1/(#)(#)?(#)?(#)?(#)?(#)?/${6:?6:${5:?5:${4:?4:${3:?3:${2:?2:1}}}}}/}.entity.heading.markdown.markup.name.section", + "r": { + "dark_plus": ".vs-dark.vscode-theme-defaults-themes-dark_plus-json .token.markup.heading rgb(86, 156, 214)", + "light_plus": ".vs.vscode-theme-defaults-themes-light_plus-json .token.markup.heading rgb(128, 0, 0)", + "dark_vs": ".vs-dark.vscode-theme-defaults-themes-dark_vs-json .token.markup.heading rgb(86, 156, 214)", + "light_vs": ".vs.vscode-theme-defaults-themes-light_vs-json .token.markup.heading rgb(128, 0, 0)", + "hc_black": ".hc-black.vscode-theme-defaults-themes-hc_black-json .token.markup.heading rgb(103, 150, 230)" + } + }, + { + "c": "Alternate Header 1", + "t": "markdown.meta.paragraph", + "r": { + "dark_plus": ".vs-dark .token rgb(212, 212, 212)", + "light_plus": ".vs .token rgb(0, 0, 0)", + "dark_vs": ".vs-dark .token rgb(212, 212, 212)", + "light_vs": ".vs .token rgb(0, 0, 0)", + "hc_black": ".hc-black .token rgb(255, 255, 255)" + } + }, + { + "c": "==================", + "t": "1.heading.markdown.markup.meta.paragraph.setext", + "r": { + "dark_plus": ".vs-dark.vscode-theme-defaults-themes-dark_plus-json .token.markup.heading rgb(86, 156, 214)", + "light_plus": ".vs.vscode-theme-defaults-themes-light_plus-json .token.markup.heading rgb(128, 0, 0)", + "dark_vs": ".vs-dark.vscode-theme-defaults-themes-dark_vs-json .token.markup.heading rgb(86, 156, 214)", + "light_vs": ".vs.vscode-theme-defaults-themes-light_vs-json .token.markup.heading rgb(128, 0, 0)", + "hc_black": ".hc-black.vscode-theme-defaults-themes-hc_black-json .token.markup.heading rgb(103, 150, 230)" + } + }, + { + "c": "Alternate Header 2", + "t": "markdown.meta.paragraph", + "r": { + "dark_plus": ".vs-dark .token rgb(212, 212, 212)", + "light_plus": ".vs .token rgb(0, 0, 0)", + "dark_vs": ".vs-dark .token rgb(212, 212, 212)", + "light_vs": ".vs .token rgb(0, 0, 0)", + "hc_black": ".hc-black .token rgb(255, 255, 255)" + } + }, + { + "c": "------------------", + "t": "2.heading.markdown.markup.meta.paragraph.setext", + "r": { + "dark_plus": ".vs-dark.vscode-theme-defaults-themes-dark_plus-json .token.markup.heading rgb(86, 156, 214)", + "light_plus": ".vs.vscode-theme-defaults-themes-light_plus-json .token.markup.heading rgb(128, 0, 0)", + "dark_vs": ".vs-dark.vscode-theme-defaults-themes-dark_vs-json .token.markup.heading rgb(86, 156, 214)", + "light_vs": ".vs.vscode-theme-defaults-themes-light_vs-json .token.markup.heading rgb(128, 0, 0)", + "hc_black": ".hc-black.vscode-theme-defaults-themes-hc_black-json .token.markup.heading rgb(103, 150, 230)" + } + }, { "c": ""], ["<", ">"], - ["{{", "}}"] + ["{{", "}}"], + ["{", "}"], + ["(", ")"] ], "autoClosingPairs": [ { "open": "{", "close": "}"}, diff --git a/extensions/html/language-configuration.json b/extensions/html/language-configuration.json index 3c8204c2187..ac43f355121 100644 --- a/extensions/html/language-configuration.json +++ b/extensions/html/language-configuration.json @@ -4,7 +4,9 @@ }, "brackets": [ [""], - ["<", ">"] + ["<", ">"], + ["{", "}"], + ["(", ")"] ], "autoClosingPairs": [ { "open": "{", "close": "}"}, From cd2e9da5f7bfadae32dd4b271d18c6b95cbb334d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 10:55:34 +0200 Subject: [PATCH 216/433] make sure to timeout format on save, #12725 --- .../api/node/mainThreadSaveParticipant.ts | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts b/src/vs/workbench/api/node/mainThreadSaveParticipant.ts index f894fa5daed..174ca0e84ce 100644 --- a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/node/mainThreadSaveParticipant.ts @@ -5,21 +5,21 @@ 'use strict'; -import {TPromise} from 'vs/base/common/winjs.base'; -import {sequence} from 'vs/base/common/async'; -import {ICodeEditorService} from 'vs/editor/common/services/codeEditorService'; -import {IThreadService} from 'vs/workbench/services/thread/common/threadService'; -import {ISaveParticipant, ITextFileEditorModel} from 'vs/workbench/parts/files/common/files'; -import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; -import {IPosition, IModel, ICommonCodeEditor, ISingleEditOperation} from 'vs/editor/common/editorCommon'; -import {Range} from 'vs/editor/common/core/range'; -import {Selection} from 'vs/editor/common/core/selection'; -import {trimTrailingWhitespace} from 'vs/editor/common/commands/trimTrailingWhitespaceCommand'; -import {getDocumentRangeFormattingEdits} from 'vs/editor/contrib/format/common/format'; -import {EditOperationsCommand} from 'vs/editor/contrib/format/common/formatCommand'; -import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; -import {TextFileEditorModel} from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; -import {ExtHostContext, ExtHostDocumentSaveParticipantShape} from './extHost.protocol'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { sequence } from 'vs/base/common/async'; +import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; +import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; +import { ISaveParticipant, ITextFileEditorModel } from 'vs/workbench/parts/files/common/files'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IPosition, IModel, ICommonCodeEditor, ISingleEditOperation } from 'vs/editor/common/editorCommon'; +import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; +import { trimTrailingWhitespace } from 'vs/editor/common/commands/trimTrailingWhitespaceCommand'; +import { getDocumentRangeFormattingEdits } from 'vs/editor/contrib/format/common/format'; +import { EditOperationsCommand } from 'vs/editor/contrib/format/common/formatCommand'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TextFileEditorModel } from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; +import { ExtHostContext, ExtHostDocumentSaveParticipantShape } from './extHost.protocol'; import { SaveReason } from 'vs/workbench/parts/files/common/files'; class TrimWhitespaceParticipant implements ISaveParticipant { @@ -94,11 +94,15 @@ class FormatOnSaveParticipant implements ISaveParticipant { } const model: IModel = editorModel.textEditorModel; - const editor = this._findEditor(model); const {tabSize, insertSpaces} = model.getOptions(); - return getDocumentRangeFormattingEdits(model, model.getFullModelRange(), { tabSize, insertSpaces }).then(edits => { + return new TPromise((resolve, reject) => { + setTimeout(resolve, 750); + getDocumentRangeFormattingEdits(model, model.getFullModelRange(), { tabSize, insertSpaces }).then(resolve, reject); + + }).then(edits => { if (edits) { + const editor = this._findEditor(model); if (editor) { this._editsWithEditor(editor, edits); } else { From 21bddb436eae9ed3302f31dc8935142d120616af Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 10:53:33 +0200 Subject: [PATCH 217/433] :lipstick: --- .../node/extensionGalleryService.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 3242ff256f9..46d64cc3f90 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -192,20 +192,18 @@ function getAssetSource(files: IRawGalleryExtensionFile[], type: string): string const result = files.filter(f => f.assetType === type)[0]; return result && result.source; } + function getDependencies(version: IRawGalleryExtensionVersion): string[] { const values = version.properties ? version.properties.filter(p => p.key === PropertyType.Dependency) : []; - if (values.length && values[0].value) { - return values[0].value.split(','); - } - return []; + const value = values.length > 0 && values[0].value; + return value ? value.split(',') : []; } + function getEngine(version: IRawGalleryExtensionVersion): string { const values = version.properties ? version.properties.filter(p => p.key === PropertyType.Engine) : []; - if (values.length && values[0].value) { - return values[0].value; - } - return ''; + return (values.length > 0 && values[0].value) || ''; } + function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUrl: string, downloadHeaders: { [key: string]: string; }): IGalleryExtension { const [version] = galleryExtension.versions; From 16e72fa2dab57c6640df93e895dbb1f2649abde6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 10:58:13 +0200 Subject: [PATCH 218/433] fixes #10694 --- build/win32/code.iss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/win32/code.iss b/build/win32/code.iss index 0f52f9660f6..31a4eed9cf7 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -296,18 +296,21 @@ Root: HKCR; Subkey: "{#RegValueName}.gemspec\shell\open\command"; ValueType: str Root: HKCR; Subkey: ".gitattributes\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles Root: HKCR; Subkey: ".gitattributes\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gitattributes"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitattributes"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Attributes}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCR; Subkey: "{#RegValueName}.gitattributes"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitattributes\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\code_file.ico"; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitattributes\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1"""; Tasks: associatewithfiles Root: HKCR; Subkey: ".gitconfig\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles Root: HKCR; Subkey: ".gitconfig\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gitconfig"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitconfig"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Config}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCR; Subkey: "{#RegValueName}.gitconfig"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitconfig\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\code_file.ico"; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitconfig\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1"""; Tasks: associatewithfiles Root: HKCR; Subkey: ".gitignore\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles Root: HKCR; Subkey: ".gitignore\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gitignore"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitignore"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Ignore}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCR; Subkey: "{#RegValueName}.gitignore"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitignore\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\code_file.ico"; Tasks: associatewithfiles Root: HKCR; Subkey: "{#RegValueName}.gitignore\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1"""; Tasks: associatewithfiles From 503c01b93e1a580690a347f0ce6e8c484fa62b7c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 11:22:56 +0200 Subject: [PATCH 219/433] use `pushEditOperation` instead of dangerous `applyEdits`, fixes #12832 --- .../api/node/mainThreadSaveParticipant.ts | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts b/src/vs/workbench/api/node/mainThreadSaveParticipant.ts index 174ca0e84ce..ca01d746290 100644 --- a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/node/mainThreadSaveParticipant.ts @@ -11,7 +11,7 @@ import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService' import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { ISaveParticipant, ITextFileEditorModel } from 'vs/workbench/parts/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IPosition, IModel, ICommonCodeEditor, ISingleEditOperation } from 'vs/editor/common/editorCommon'; +import { IPosition, IModel, ICommonCodeEditor, ISingleEditOperation, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { trimTrailingWhitespace } from 'vs/editor/common/commands/trimTrailingWhitespaceCommand'; @@ -117,12 +117,26 @@ class FormatOnSaveParticipant implements ISaveParticipant { } private _editWithModel(model: IModel, edits: ISingleEditOperation[]): void { - model.applyEdits(edits.map(({text, range}) => ({ + + const [{range}] = edits; + const initialSelection = new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn); + + model.pushEditOperations([initialSelection], edits.map(FormatOnSaveParticipant._asIdentEdit), undoEdits => { + for (const {range} of undoEdits) { + if (Range.areIntersectingOrTouching(range, initialSelection)) { + return [new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)]; + } + } + }); + } + + private static _asIdentEdit({text, range}: ISingleEditOperation): IIdentifiedSingleEditOperation { + return { text, range: Range.lift(range), identifier: undefined, forceMoveMarkers: true - }))); + }; } private _findEditor(model: IModel) { From 1730ac63210cbc9d99acece8757f5cb80dd7a584 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 11:24:48 +0200 Subject: [PATCH 220/433] :lipstick: --- .../extensions/electron-browser/extensionsActions.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index 7cdf39d987c..fcaa33ea9d7 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -324,10 +324,11 @@ export class UpdateAllAction extends Action { } private getOutdatedExtensions(): TPromise { - let extensions = this.extensionsWorkbenchService.local - .filter(e => this.extensionsWorkbenchService.canInstall(e) - && e.type === LocalExtensionType.User - && (e.state === ExtensionState.Installed || e.state === ExtensionState.NeedsRestart)); + let extensions = this.extensionsWorkbenchService.local.filter( + e => this.extensionsWorkbenchService.canInstall(e) + && e.type === LocalExtensionType.User + && (e.state === ExtensionState.Installed || e.state === ExtensionState.NeedsRestart) + ); return filterOutdatedExtensions(extensions); } From 50fad85b6303363ac4f6294150119b1b43053b71 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 11:25:08 +0200 Subject: [PATCH 221/433] fixes #11174 --- .../extensionsWorkbenchService.ts | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index b3c5485a751..96dc87844e6 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -273,6 +273,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { private uninstalling: IActiveExtension[] = []; private installed: Extension[] = []; private syncDelayer: ThrottledDelayer; + private autoUpdateDelayer: ThrottledDelayer; private disposables: IDisposable[] = []; private _onChange: Emitter = new Emitter(); @@ -296,6 +297,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { extensionService.onDidUninstallExtension(this.onDidUninstallExtension, this, this.disposables); this.syncDelayer = new ThrottledDelayer(ExtensionsWorkbenchService.SyncPeriod); + this.autoUpdateDelayer = new ThrottledDelayer(1000); chain(urlService.onOpenURL) .filter(uri => /^extension/.test(uri.path)) @@ -347,6 +349,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { if (installed) { installed.gallery = gallery; this._onChange.fire(); + this.eventuallyAutoUpdateExtensions(); return installed; } @@ -371,16 +374,28 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { return TPromise.as(null); } - return this.queryGallery({ ids, pageSize: ids.length }).then(() => { - const config = this.configurationService.getConfiguration(ConfigurationKey); + return this.queryGallery({ ids, pageSize: ids.length }) as TPromise; + } - if (!config.autoUpdate) { - return; - } + private eventuallyAutoUpdateExtensions(): void { + this.autoUpdateDelayer.trigger(() => this.autoUpdateExtensions()) + .done(null, err => this.onError(err)); + } - const action = this.instantiationService.createInstance(UpdateAllAction, UpdateAllAction.ID, UpdateAllAction.LABEL); - return action.enabled && action.run(); - }); + private autoUpdateExtensions(): TPromise { + const config = this.configurationService.getConfiguration(ConfigurationKey); + + if (!config.autoUpdate) { + return TPromise.as(null); + } + + const action = this.instantiationService.createInstance(UpdateAllAction, UpdateAllAction.ID, UpdateAllAction.LABEL); + + if (!action.enabled) { + return TPromise.as(null); + } + + return action.run(); } canInstall(extension: IExtension): boolean { From 79bad51ed4d48b35da2cca568fb08c2ef9c04d3f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 11:26:08 +0200 Subject: [PATCH 222/433] fixes #12874 --- .../extensionManagement/node/extensionManagementService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 3860eb593dc..17a6681491c 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -405,7 +405,7 @@ export class ExtensionManagementService implements IExtensionManagementService { } private getOutdatedExtensionIds(): TPromise { - return this.scanUserExtensions() + return this.scanExtensions(this.extensionsPath, LocalExtensionType.User) .then(extensions => values(groupBy(extensions, p => `${ p.manifest.publisher }.${ p.manifest.name }`))) .then(versions => flatten(versions.map(p => p.sort((a, b) => semver.rcompare(a.manifest.version, b.manifest.version)).slice(1)))); } From 87a604b6f0afaf146186307280dc0694b8e1d987 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 28 Sep 2016 11:37:31 +0200 Subject: [PATCH 223/433] debug: bring back toggle repl action fixes #12864 --- src/vs/workbench/browser/panel.ts | 5 ++- .../parts/debug/browser/debugActions.ts | 43 +++++++++++++++++++ .../parts/debug/browser/debugViewlet.ts | 3 +- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/panel.ts b/src/vs/workbench/browser/panel.ts index be1f1fa33a0..5dbf58c5f7a 100644 --- a/src/vs/workbench/browser/panel.ts +++ b/src/vs/workbench/browser/panel.ts @@ -74,9 +74,10 @@ export abstract class TogglePanelAction extends Action { label: string, panelId: string, protected panelService: IPanelService, - private partService: IPartService + private partService: IPartService, + cssClass?: string ) { - super(id, name); + super(id, label, cssClass); this.panelId = panelId; } diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index f8640c7cf3f..883f76b3918 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -19,8 +19,10 @@ import {IInstantiationService} from 'vs/platform/instantiation/common/instantiat import debug = require('vs/workbench/parts/debug/common/debug'); import model = require('vs/workbench/parts/debug/common/debugModel'); import {BreakpointWidget} from 'vs/workbench/parts/debug/browser/breakpointWidget'; +import {IPartService} from 'vs/workbench/services/part/common/partService'; import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; import {IViewletService} from 'vs/workbench/services/viewlet/common/viewletService'; +import {TogglePanelAction} from 'vs/workbench/browser/panel'; import IDebugService = debug.IDebugService; import EditorContextKeys = editorCommon.EditorContextKeys; @@ -826,6 +828,47 @@ export class ClearReplAction extends AbstractDebugAction { } } +export class ToggleReplAction extends TogglePanelAction { + static ID = 'workbench.debug.action.toggleRepl'; + static LABEL = nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'debugConsoleAction' }, 'Debug Console'); + private toDispose: lifecycle.IDisposable[]; + + constructor(id: string, label: string, + @IDebugService private debugService: IDebugService, + @IPartService partService: IPartService, + @IPanelService panelService: IPanelService + ) { + super(id, label, debug.REPL_ID, panelService, partService, 'debug-action toggle-repl'); + this.toDispose = []; + this.registerListeners(); + } + + private registerListeners(): void { + this.toDispose.push(this.debugService.getModel().onDidChangeReplElements(() => { + if (!this.isReplVisible()) { + this.class = 'debug-action toggle-repl notification'; + this.tooltip = nls.localize('unreadOutput', "New Output in Debug Console"); + } + })); + this.toDispose.push(this.panelService.onDidPanelOpen(panel => { + if (panel.getId() === debug.REPL_ID) { + this.class = 'debug-action toggle-repl'; + this.tooltip = ToggleReplAction.LABEL; + } + })); + } + + private isReplVisible(): boolean { + const panel = this.panelService.getActivePanel(); + return panel && panel.getId() === debug.REPL_ID; + } + + public dispose(): void { + super.dispose(); + this.toDispose = lifecycle.dispose(this.toDispose); + } +} + export class FocusReplAction extends Action { static ID = 'workbench.debug.action.focusRepl'; diff --git a/src/vs/workbench/parts/debug/browser/debugViewlet.ts b/src/vs/workbench/parts/debug/browser/debugViewlet.ts index ee24e4100a6..50e3595eb4e 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/parts/debug/browser/debugViewlet.ts @@ -126,7 +126,8 @@ export class DebugViewlet extends Viewlet { this.actions = [ this.instantiationService.createInstance(debugactions.StartAction, debugactions.StartAction.ID, debugactions.StartAction.LABEL), this.instantiationService.createInstance(debugactions.SelectConfigAction, debugactions.SelectConfigAction.ID, debugactions.SelectConfigAction.LABEL), - this.instantiationService.createInstance(debugactions.ConfigureAction, debugactions.ConfigureAction.ID, debugactions.ConfigureAction.LABEL) + this.instantiationService.createInstance(debugactions.ConfigureAction, debugactions.ConfigureAction.ID, debugactions.ConfigureAction.LABEL), + this.instantiationService.createInstance(debugactions.ToggleReplAction, debugactions.ToggleReplAction.ID, debugactions.ToggleReplAction.LABEL) ]; this.actions.forEach(a => { From dbb1b4942a76bae60b4fc8b40b690ae74469a230 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 28 Sep 2016 10:23:51 +0200 Subject: [PATCH 224/433] Improve extension pack installation message --- .../extensionManagement/node/extensionManagementService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 17a6681491c..5f142c9d94a 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -166,7 +166,7 @@ export class ExtensionManagementService implements IExtensionManagementService { return this.downloadAndInstall(compatibleVersion); } if (promptToInstallDependencies) { - const message = nls.localize('installDependeciesConfirmation', "Installing {0} also installs its dependencies. Would you like to continue?", extension.displayName); + const message = nls.localize('installDependeciesConfirmation', "Installing '{0}' also installs its dependencies. Would you like to continue?", extension.displayName); const options = [ nls.localize('install', "Yes"), nls.localize('doNotInstall', "No") From 524eb0884a3ba37c5d48414b0d2d2b12e925a551 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 28 Sep 2016 11:43:00 +0200 Subject: [PATCH 225/433] Problems: Delay applying filter. #11976 --- .../workbench/parts/markers/browser/markersPanel.ts | 12 ++++++------ .../parts/markers/browser/markersPanelActions.ts | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/markersPanel.ts b/src/vs/workbench/parts/markers/browser/markersPanel.ts index 3c5d74a331b..f70322a2893 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanel.ts @@ -258,13 +258,13 @@ export class MarkersPanel extends Panel { } private autoExpand(): void { - this.markersModel.filteredResources.forEach((resource) => { - if (this.autoExpanded.contains(resource.uri.toString())) { - return; + for (const resource of this.markersModel.filteredResources) { + const resourceUri = resource.uri.toString(); + if (!this.autoExpanded.contains(resourceUri)) { + this.tree.expand(resource).done(null, errors.onUnexpectedError); + this.autoExpanded.set(resourceUri); } - this.tree.expand(resource).done(null, errors.onUnexpectedError); - this.autoExpanded.set(resource.uri.toString()); - }); + } } private autoReveal(focus: boolean = false): void { diff --git a/src/vs/workbench/parts/markers/browser/markersPanelActions.ts b/src/vs/workbench/parts/markers/browser/markersPanelActions.ts index 620a39df7ef..14239b550d8 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanelActions.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanelActions.ts @@ -93,14 +93,14 @@ export class FilterInputBoxActionItem extends BaseActionItem { protected toDispose: lifecycle.IDisposable[]; - private delayer: Delayer; + private delayedFilterUpdate: Delayer; constructor(private markersPanel: MarkersPanel, action: IAction, @IContextViewService private contextViewService: IContextViewService, @ITelemetryService private telemetryService: ITelemetryService) { super(markersPanel, action); this.toDispose = []; - this.delayer= new Delayer(2000); + this.delayedFilterUpdate= new Delayer(500); } public render(container: HTMLElement): void { @@ -110,7 +110,7 @@ export class FilterInputBoxActionItem extends BaseActionItem { ariaLabel: Messages.MARKERS_PANEL_FILTER_PLACEHOLDER }); filterInputBox.value= this.markersPanel.markersModel.filterOptions.completeFilter; - this.toDispose.push(filterInputBox.onDidChange((filter: string) => this.updateFilter(filter))); + this.toDispose.push(filterInputBox.onDidChange(filter => this.delayedFilterUpdate.trigger(() => this.updateFilter(filter)))); this.toDispose.push(DOM.addStandardDisposableListener(filterInputBox.inputElement, 'keyup', (keyboardEvent) => this.onInputKeyUp(keyboardEvent, filterInputBox))); this.toDispose.push(DOM.addStandardDisposableListener(container, 'keydown', this.handleKeyboardEvent)); this.toDispose.push(DOM.addStandardDisposableListener(container, 'keyup', this.handleKeyboardEvent)); @@ -118,7 +118,7 @@ export class FilterInputBoxActionItem extends BaseActionItem { private updateFilter(filter: string) { this.markersPanel.updateFilter(filter); - this.delayer.trigger(this.reportFilteringUsed.bind(this)); + this.reportFilteringUsed(); } private reportFilteringUsed(): void { From 8f7d855bd4e995a227f8b6afb1b0cd02578fe0e5 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 28 Sep 2016 11:46:22 +0200 Subject: [PATCH 226/433] fixes #12777 --- .../parts/debug/electron-browser/debug.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 3fc62db16fd..8bf9d068e49 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -157,7 +157,7 @@ registerSingleton(IDebugService, service.DebugService); // Register Debug Error Editor #9062 (platform.Registry.as(EditorExtensions.Editors)).registerEditor(new EditorDescriptor(DebugErrorEditor.ID, - nls.localize('debugErrorEditor', "Debug Error"), + nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'debugErrorEditor' }, "Debug Error"), 'vs/workbench/parts/debug/browser/debugErrorEditor', 'DebugErrorEditor'), [new SyncDescriptor(DebugErrorEditorInput)] From a83eae280734ad712590447432f8254481850ee6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 11:55:35 +0200 Subject: [PATCH 227/433] doc on launch/tasks.json files, #12813 --- src/vs/vscode.d.ts | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index fb2b77f36b7..5a837b10819 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2649,9 +2649,24 @@ declare namespace vscode { } /** - * Represents the workspace configuration. The workspace configuration - * is always a merged view of the configuration of the current [workspace](#workspace.rootPath) - * and the installation-wide configuration. + * Represents the workspace configuration. + * + * The workspace configuration is a merged view: Configurations of the current [workspace](#workspace.rootPath) + * (if available), files like `launch.json`, and the installation-wide configuration. Workspace specific values + * shadow installation-wide values. + * + * *Note:* The merged configuration of the current [workspace](#workspace.rootPath) + * also contains settings from files like `launch.json` and `tasks.json`. Their basename will be + * part of the section identifier. The following snippets shows how to retrieve all configurations + * from `launch.json`: + * + * ``` + * // launch.json configuration + * const config = workspace.getConfiguration('launch'); + * + * // retrieve values + * cont values = config.get('configurations') + *``` */ export interface WorkspaceConfiguration { @@ -2674,9 +2689,13 @@ declare namespace vscode { /** * Update a configuration value. A value can be changed for the current - * [workspace](#workspace.rootPath) only or globally for all instances of the + * [workspace](#workspace.rootPath) only, or globally for all instances of the * editor. The updated configuration values are persisted. * + * *Note:* Setting an installation-wide value (`global: true`) in the presence of + * a more specific workspace value has no observable effect in that workspace, but + * in others. + * * @param section Configuration name, supports _dotted_ names. * @param value The new value. * @param global When `true` changes the configuration value for all instances of the editor. From 094e02c920f1a164ce15dc3cd1deffb0d53e75bf Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 12:15:31 +0200 Subject: [PATCH 228/433] match snippets strict when having a non empty selection, fixes #11912 --- .../contrib/suggest/browser/tabCompletion.ts | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/tabCompletion.ts b/src/vs/editor/contrib/suggest/browser/tabCompletion.ts index a399cb91ef5..8deb037559f 100644 --- a/src/vs/editor/contrib/suggest/browser/tabCompletion.ts +++ b/src/vs/editor/contrib/suggest/browser/tabCompletion.ts @@ -5,17 +5,17 @@ 'use strict'; -import {KeyCode} from 'vs/base/common/keyCodes'; -import {RawContextKey, IContextKeyService, ContextKeyExpr} from 'vs/platform/contextkey/common/contextkey'; -import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry'; -import {ISnippetsRegistry, Extensions, getNonWhitespacePrefix, ISnippet} from 'vs/editor/common/modes/snippetsRegistry'; -import {Registry} from 'vs/platform/platform'; -import {endsWith} from 'vs/base/common/strings'; -import {IDisposable} from 'vs/base/common/lifecycle'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { RawContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { ISnippetsRegistry, Extensions, getNonWhitespacePrefix, ISnippet } from 'vs/editor/common/modes/snippetsRegistry'; +import { Registry } from 'vs/platform/platform'; +import { endsWith } from 'vs/base/common/strings'; +import { IDisposable } from 'vs/base/common/lifecycle'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import {CommonEditorRegistry, commonEditorContribution, EditorCommand} from 'vs/editor/common/editorCommonExtensions'; -import {CodeSnippet} from 'vs/editor/contrib/snippet/common/snippet'; -import {SnippetController} from 'vs/editor/contrib/snippet/common/snippetController'; +import { CommonEditorRegistry, commonEditorContribution, EditorCommand } from 'vs/editor/common/editorCommonExtensions'; +import { CodeSnippet } from 'vs/editor/contrib/snippet/common/snippet'; +import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; import EditorContextKeys = editorCommon.EditorContextKeys; @@ -27,7 +27,7 @@ export class TabCompletionController implements editorCommon.IEditorContribution private static ID = 'editor.tabCompletionController'; static ContextKey = new RawContextKey('hasSnippetCompletions', undefined); - public static get(editor:editorCommon.ICommonCodeEditor): TabCompletionController { + public static get(editor: editorCommon.ICommonCodeEditor): TabCompletionController { return editor.getContribution(TabCompletionController.ID); } @@ -44,19 +44,28 @@ export class TabCompletionController implements editorCommon.IEditorContribution this._cursorChangeSubscription = editor.onDidChangeCursorSelection(e => { this._currentSnippets.length = 0; + let selectFn: (snippet: ISnippet) => boolean; - const prefix = e.selection.isEmpty() - ? getNonWhitespacePrefix(editor.getModel(), editor.getPosition()) - : editor.getModel().getValueInRange(e.selection); + if (e.selection.isEmpty()) { + // empty selection -> real text (no whitespace) left of cursor + const prefix = getNonWhitespacePrefix(editor.getModel(), editor.getPosition()); + selectFn = prefix && (snippet => endsWith(prefix, snippet.prefix)); - if (prefix) { + } else { + // actual selection -> snippet must be a full match + const selected = editor.getModel().getValueInRange(e.selection); + selectFn = snippet => selected === snippet.prefix; + } + + if (selectFn) { snippetsRegistry.visitSnippets(editor.getModel().getModeId(), s => { - if (endsWith(prefix, s.prefix)) { + if (selectFn(s)) { this._currentSnippets.push(s); } return true; }); } + hasSnippets.set(this._currentSnippets.length === 1); //todo@joh make it work with N }); } @@ -70,7 +79,7 @@ export class TabCompletionController implements editorCommon.IEditorContribution const snippet = this._currentSnippets[0]; const codeSnippet = CodeSnippet.fromTextmate(snippet.codeSnippet); this._snippetController.run(codeSnippet, snippet.prefix.length, 0); - // } else { + // } else { // todo@joh - show suggest widget with proposals } } From eb4b50649821d61df0e6d6823b20c94927ab2996 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 28 Sep 2016 12:17:13 +0200 Subject: [PATCH 229/433] fix #11655 --- src/vs/workbench/electron-browser/actions.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index c02bc17d477..97a39d43114 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -21,6 +21,7 @@ import {IMessageService, Severity} from 'vs/platform/message/common/message'; import {IWindowConfiguration} from 'vs/workbench/electron-browser/common'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IEnvironmentService} from 'vs/platform/environment/common/environment'; +import {IExtensionManagementService, LocalExtensionType, ILocalExtension} from 'vs/platform/extensionManagement/common/extensionManagement'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {CommandsRegistry} from 'vs/platform/commands/common/commands'; import paths = require('vs/base/common/paths'); @@ -501,6 +502,7 @@ export class ReportIssueAction extends Action { label: string, @IMessageService private messageService: IMessageService, @IIntegrityService private integrityService: IIntegrityService, + @IExtensionManagementService private extensionManagementService: IExtensionManagementService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService ) { super(id, label); @@ -508,20 +510,23 @@ export class ReportIssueAction extends Action { public run(): TPromise { return this.integrityService.isPure().then(res => { - const issueUrl = this.generateNewIssueUrl(product.reportIssueUrl, pkg.name, pkg.version, product.commit, product.date, res.isPure); + return this.extensionManagementService.getInstalled(LocalExtensionType.User).then(extensions => { + const issueUrl = this.generateNewIssueUrl(product.reportIssueUrl, pkg.name, pkg.version, product.commit, product.date, res.isPure, extensions); - shell.openExternal(issueUrl); + shell.openExternal(issueUrl); - return TPromise.as(true); + return TPromise.as(true); + }); }); } - private generateNewIssueUrl(baseUrl: string, name: string, version: string, commit: string, date: string, isPure: boolean): string { + private generateNewIssueUrl(baseUrl: string, name: string, version: string, commit: string, date: string, isPure: boolean, extensions:ILocalExtension[]): string { const osVersion = `${os.type()} ${os.arch()} ${os.release()}`; const queryStringPrefix = baseUrl.indexOf('?') === -1 ? '?' : '&'; const body = encodeURIComponent( `- VSCode Version: ${name} ${version}${isPure ? '' : ' **[Unsupported]**'} (${product.commit || 'Commit unknown'}, ${product.date || 'Date unknown'}) - OS Version: ${osVersion} +- Extensions: ${extensions.map(e => '`' + e.id + '`').join(', ')} Steps to Reproduce: From 8609a0704cba8a06bb5f1b67c58e42512df75cf1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 12:17:22 +0200 Subject: [PATCH 230/433] implement open-url in windows related to #10340 --- src/vs/base/common/event.ts | 6 ++--- src/vs/code/electron-main/env.ts | 1 + src/vs/code/electron-main/launch.ts | 12 +++++++++- src/vs/code/electron-main/main.ts | 4 +++- src/vs/platform/environment/node/argv.ts | 4 +++- src/vs/platform/url/common/url.ts | 1 + src/vs/platform/url/common/urlIpc.ts | 4 ++++ .../platform/url/electron-main/urlService.ts | 23 ++++++++++++++----- 8 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index eb9bd1d3ce2..1e76db167f7 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -217,12 +217,12 @@ export function once(event: Event): Event { }; } -export function any(...events: Event[]): Event { +export function any(...events: Event[]): Event { let listeners = []; - const emitter = new Emitter({ + const emitter = new Emitter({ onFirstListenerAdd() { - listeners = events.map(e => e(() => emitter.fire(), null)); + listeners = events.map(e => e(r => emitter.fire(r))); }, onLastListenerRemove() { listeners = dispose(listeners); diff --git a/src/vs/code/electron-main/env.ts b/src/vs/code/electron-main/env.ts index 43bd79b713e..650f23f5246 100644 --- a/src/vs/code/electron-main/env.ts +++ b/src/vs/code/electron-main/env.ts @@ -121,6 +121,7 @@ export class EnvService implements IEnvService { extensionDevelopmentPath: normalizePath(argv.extensionDevelopmentPath), extensionTestsPath: normalizePath(argv.extensionTestsPath), 'disable-extensions': argv['disable-extensions'], + 'open-url': argv['open-url'], locale: argv.locale, wait: argv.wait }); diff --git a/src/vs/code/electron-main/launch.ts b/src/vs/code/electron-main/launch.ts index 99678232b30..ae604e7ab0c 100644 --- a/src/vs/code/electron-main/launch.ts +++ b/src/vs/code/electron-main/launch.ts @@ -11,6 +11,7 @@ import { VSCodeWindow } from 'vs/code/electron-main/window'; import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { ILogService } from 'vs/code/electron-main/log'; +import { IURLService } from 'vs/platform/url/common/url'; export interface IStartArguments { args: ICommandLineArguments; @@ -52,12 +53,21 @@ export class LaunchService implements ILaunchService { constructor( @ILogService private logService: ILogService, - @IWindowsService private windowsService: IWindowsService + @IWindowsService private windowsService: IWindowsService, + @IURLService private urlService: IURLService ) {} start(args: ICommandLineArguments, userEnv: IProcessEnvironment): TPromise { this.logService.log('Received data from other instance: ', args, userEnv); + const openUrlArg = args['open-url'] || []; + const openUrl = typeof openUrlArg === 'string' ? [openUrlArg] : openUrlArg; + + if (openUrl.length > 0) { + openUrl.forEach(url => this.urlService.open(url)); + return TPromise.as(null); + } + // Otherwise handle in windows service let usedWindows: VSCodeWindow[]; if (!!args.extensionDevelopmentPath) { diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 122121e8d6a..43a9452e3ae 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -40,6 +40,7 @@ import { IRequestService } from 'vs/platform/request/common/request'; import { RequestService } from 'vs/platform/request/node/requestService'; import { generateUuid } from 'vs/base/common/uuid'; import { getPathLabel } from 'vs/base/common/labels'; +import { IURLService } from 'vs/platform/url/common/url'; import { URLChannel } from 'vs/platform/url/common/urlIpc'; import { URLService } from 'vs/platform/url/electron-main/urlService'; @@ -125,7 +126,7 @@ function main(accessor: ServicesAccessor, mainIpcServer: Server, userEnv: IProce const electronIpcServer = new ElectronIPCServer(ipc); // Register Electron IPC services - const urlService = instantiationService.createInstance(URLService); + const urlService = accessor.get(IURLService); const urlChannel = instantiationService.createInstance(URLChannel, urlService); electronIpcServer.registerChannel('url', urlChannel); @@ -455,6 +456,7 @@ function start(): void { services.set(IConfigurationService, new SyncDescriptor(ConfigurationService)); services.set(IRequestService, new SyncDescriptor(RequestService)); services.set(IUpdateService, new SyncDescriptor(UpdateManager)); + services.set(IURLService, new SyncDescriptor(URLService, args['open-url'])); const instantiationService = new InstantiationService(services); diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 166210c03a7..8cd9da04231 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -31,6 +31,7 @@ export interface ParsedArgs extends minimist.ParsedArgs { 'list-extensions'?: boolean; 'install-extension'?: string | string[]; 'uninstall-extension'?: string | string[]; + 'open-url'?: string | string[]; } const options: minimist.Opts = { @@ -43,7 +44,8 @@ const options: minimist.Opts = { 'install-extension', 'uninstall-extension', 'debugBrkPluginHost', - 'debugPluginHost' + 'debugPluginHost', + 'open-url' ], boolean: [ 'help', diff --git a/src/vs/platform/url/common/url.ts b/src/vs/platform/url/common/url.ts index 6e762cbceaf..13f7822b4b8 100644 --- a/src/vs/platform/url/common/url.ts +++ b/src/vs/platform/url/common/url.ts @@ -14,5 +14,6 @@ export const IURLService = createDecorator(ID); export interface IURLService { _serviceBrand: any; + open(url: string): void; onOpenURL: Event; } diff --git a/src/vs/platform/url/common/urlIpc.ts b/src/vs/platform/url/common/urlIpc.ts index b1c165c3eaa..26764eec43d 100644 --- a/src/vs/platform/url/common/urlIpc.ts +++ b/src/vs/platform/url/common/urlIpc.ts @@ -55,4 +55,8 @@ export class URLChannelClient implements IURLService { private _onOpenURL = eventFromCall(this.channel, 'event:onOpenURL', this.windowID, URIDeserializer); get onOpenURL(): Event { return this._onOpenURL; } + + open(url: string): void { + return; // not implemented + } } \ No newline at end of file diff --git a/src/vs/platform/url/electron-main/urlService.ts b/src/vs/platform/url/electron-main/urlService.ts index 993d0822571..c7930991a34 100644 --- a/src/vs/platform/url/electron-main/urlService.ts +++ b/src/vs/platform/url/electron-main/urlService.ts @@ -5,7 +5,7 @@ 'use strict'; -import Event, {chain, mapEvent, buffer} from 'vs/base/common/event'; +import Event, {mapEvent, chain, buffer, Emitter, any} from 'vs/base/common/event'; import {fromEventEmitter} from 'vs/base/node/event'; import {IURLService} from 'vs/platform/url/common/url'; import product from 'vs/platform/product'; @@ -16,23 +16,30 @@ export class URLService implements IURLService { _serviceBrand: any; + private openUrlEmitter: Emitter = new Emitter(); onOpenURL: Event; - constructor() { - app.setAsDefaultProtocolClient(product.urlProtocol); + constructor(initial: string | string[] = []) { + const globalBuffer = (global.getOpenUrls() || []) as string[]; + const initialBuffer = [ + ...(typeof initial === 'string' ? [initial] : initial), + ...globalBuffer + ]; + + app.setAsDefaultProtocolClient(product.urlProtocol, process.execPath, ['--open-url']); const rawOnOpenUrl = fromEventEmitter(app, 'open-url', (event: Electron.Event, url: string) => ({ event, url })); // always prevent default and return the url as string - const onOpenUrl = mapEvent(rawOnOpenUrl, ({ event, url }) => { + const preventedOnOpenUrl = mapEvent(rawOnOpenUrl, ({ event, url }) => { event.preventDefault(); return url; }); // buffer all `onOpenUrl` events until someone starts listening - const bufferedOnOpenUrl = buffer(onOpenUrl, true, global.getOpenUrls()); + const bufferedOnOpenUrl = buffer(preventedOnOpenUrl, true, initialBuffer); - this.onOpenURL = chain(bufferedOnOpenUrl) + this.onOpenURL = chain(any(bufferedOnOpenUrl, this.openUrlEmitter.event)) .map(url => { try { return URI.parse(url); @@ -43,4 +50,8 @@ export class URLService implements IURLService { .filter(uri => !!uri) .event; } + + open(url: string): void { + this.openUrlEmitter.fire(url); + } } \ No newline at end of file From 0f5c833c5cbd4e22a165717225c88468e7409e79 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 12:28:49 +0200 Subject: [PATCH 231/433] fixes #11756 --- src/vs/workbench/parts/git/node/git.lib.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/git/node/git.lib.ts b/src/vs/workbench/parts/git/node/git.lib.ts index c7795fb94e7..cd24f1062a7 100644 --- a/src/vs/workbench/parts/git/node/git.lib.ts +++ b/src/vs/workbench/parts/git/node/git.lib.ts @@ -728,7 +728,7 @@ export class Repository { templatePath = path.join(this.repository, templatePath); } - return pfs.readFile(templatePath, 'utf8').then(null, () => ''); + return pfs.readFile(templatePath, 'utf8').then(raw => raw.replace(/^\s*#.*$\n?/gm, '').trim()); }, () => ''); } From f85702522ed490e2a0721e66d2e582701b29199b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 12:36:32 +0200 Subject: [PATCH 232/433] fixes #11707 --- .../common/extensionManagement.ts | 1 + .../extensions/electron-browser/extensionEditor.ts | 12 ++++++++++-- .../electron-browser/media/extensionEditor.css | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index cf6fa31f2fd..67b8a0c230f 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -21,6 +21,7 @@ export interface ICommand { export interface IConfigurationProperty { description: string; type: string | string[]; + default?: any; } export interface IConfiguration { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index e17481b66f6..a2ceb4fe6aa 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -343,8 +343,16 @@ export class ExtensionEditor extends BaseEditor { const details = $('details', { open: true, ontoggle: onDetailsToggle }, $('summary', null, localize('settings', "Settings ({0})", contrib.length)), $('table', null, - $('tr', null, $('th', null, localize('setting name', "Name")), $('th', null, localize('description', "Description"))), - ...contrib.map(key => $('tr', null, $('td', null, $('code', null, key)), $('td', null, properties[key].description))) + $('tr', null, + $('th', null, localize('setting name', "Name")), + $('th', null, localize('description', "Description")), + $('th', null, localize('default', "Default")) + ), + ...contrib.map(key => $('tr', null, + $('td', null, $('code', null, key)), + $('td', null, properties[key].description), + $('td', null, $('code', null, properties[key].default)) + )) ) ); diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css index bbe9e8f565e..c6f26264a5a 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css @@ -194,7 +194,7 @@ text-align: left; } -.extension-editor > .body > .content table code { +.extension-editor > .body > .content table code:not(:empty) { font-family: Monaco, Menlo, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback"; font-size: 90%; background-color: rgba(128, 128, 128, 0.17); From b4eebbde2151a191aba2d7f4e6946352385eb2e2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 12:43:23 +0200 Subject: [PATCH 233/433] disable undo last commit action when dirty fixes #11477 --- src/vs/workbench/parts/git/browser/gitActions.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/vs/workbench/parts/git/browser/gitActions.ts b/src/vs/workbench/parts/git/browser/gitActions.ts index 72a2022f1f9..11f4b998eea 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.ts @@ -1150,6 +1150,21 @@ export class UndoLastCommitAction extends GitAction { super(UndoLastCommitAction.ID, UndoLastCommitAction.LABEL, 'git-action undo-last-commit', gitService); } + protected isEnabled():boolean { + if (!this.gitService) { + return false; + } + + if (!this.gitService.isIdle()) { + return false; + } + + var status = this.gitService.getModel().getStatus(); + + return status.getIndexStatus().all().length === 0 + && status.getWorkingTreeStatus().all().length === 0; + } + public run():Promise { return this.gitService.reset('HEAD~'); } From 74a745642cd0d57023b53e148bb7224ee217a472 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 12:57:01 +0200 Subject: [PATCH 234/433] update distro fixes #12007 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cdc18b9a178..520aaaa2d86 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.6.0", "electronVersion": "1.3.7", - "distro": "2418d052dc8b7fe3ce2b2d0d8488b7a2a299390b", + "distro": "40cf6a4fcea1774605af346b5c9ac5377facad94", "author": { "name": "Microsoft Corporation" }, From 01acb0eb2e7a8de56d6957e4d1fd105cd3ca06bd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 12:59:36 +0200 Subject: [PATCH 235/433] undefined !== null and JSON.stringify should know that, fix #12812 --- src/vs/vscode.d.ts | 4 +- src/vs/workbench/api/node/extHost.protocol.ts | 41 ++++++++++--------- .../api/node/extHostConfiguration.ts | 18 ++++---- .../api/node/mainThreadConfiguration.ts | 16 +++++--- 4 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 5a837b10819..b6147f0e559 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2692,10 +2692,12 @@ declare namespace vscode { * [workspace](#workspace.rootPath) only, or globally for all instances of the * editor. The updated configuration values are persisted. * - * *Note:* Setting an installation-wide value (`global: true`) in the presence of + * *Note 1:* Setting an installation-wide value (`global: true`) in the presence of * a more specific workspace value has no observable effect in that workspace, but * in others. * + * *Note 2:* To remove a configuration value use `undefined`, like so: `config.update('somekey', undefined)` + * * @param section Configuration name, supports _dotted_ names. * @param value The new value. * @param global When `true` changes the configuration value for all instances of the editor. diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 63118392664..e9dca2ef83d 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -14,52 +14,52 @@ import * as vscode from 'vscode'; import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; -import {TPromise} from 'vs/base/common/winjs.base'; +import { TPromise } from 'vs/base/common/winjs.base'; -import {IMarkerData} from 'vs/platform/markers/common/markers'; -import {Position as EditorPosition} from 'vs/platform/editor/common/editor'; -import {IMessage, IExtensionDescription} from 'vs/platform/extensions/common/extensions'; -import {StatusbarAlignment as MainThreadStatusBarAlignment} from 'vs/platform/statusbar/common/statusbar'; -import {ITelemetryInfo} from 'vs/platform/telemetry/common/telemetry'; +import { IMarkerData } from 'vs/platform/markers/common/markers'; +import { Position as EditorPosition } from 'vs/platform/editor/common/editor'; +import { IMessage, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; +import { ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import * as editorCommon from 'vs/editor/common/editorCommon'; import * as modes from 'vs/editor/common/modes'; -import {IResourceEdit} from 'vs/editor/common/services/bulkEdit'; +import { IResourceEdit } from 'vs/editor/common/services/bulkEdit'; -import {ConfigurationTarget} from 'vs/workbench/services/configuration/common/configurationEditing'; +import { ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; -import {IPickOpenEntry, IPickOptions} from 'vs/workbench/services/quickopen/common/quickOpenService'; +import { IPickOpenEntry, IPickOptions } from 'vs/workbench/services/quickopen/common/quickOpenService'; import { SaveReason } from 'vs/workbench/parts/files/common/files'; -import {IWorkspaceSymbol} from 'vs/workbench/parts/search/common/search'; -import {IApplyEditsOptions, TextEditorRevealType, ITextEditorConfigurationUpdate, IResolvedTextEditorConfiguration, ISelectionChangeEvent} from './mainThreadEditorsTracker'; +import { IWorkspaceSymbol } from 'vs/workbench/parts/search/common/search'; +import { IApplyEditsOptions, TextEditorRevealType, ITextEditorConfigurationUpdate, IResolvedTextEditorConfiguration, ISelectionChangeEvent } from './mainThreadEditorsTracker'; export interface InstanceSetter { - set(instance:T): R; + set(instance: T): R; } export class InstanceCollection { - private _items: {[id:string]:any;}; + private _items: { [id: string]: any; }; constructor() { this._items = Object.create(null); } - public define(id:ProxyIdentifier): InstanceSetter { + public define(id: ProxyIdentifier): InstanceSetter { let that = this; return new class { - set(value:T) { + set(value: T) { that._set(id, value); return value; } }; } - _set(id:ProxyIdentifier, value:T): void { + _set(id: ProxyIdentifier, value: T): void { this._items[id.id] = value; } - public finish(isMain:boolean, threadService:IThreadService): void { + public finish(isMain: boolean, threadService: IThreadService): void { let expected = (isMain ? MainContext : ExtHostContext); Object.keys(expected).forEach((key) => { let id = expected[key]; @@ -86,6 +86,7 @@ export abstract class MainThreadCommandsShape { export abstract class MainThreadConfigurationShape { $updateConfigurationOption(target: ConfigurationTarget, key: string, value: any): TPromise { throw ni(); } + $removeConfigurationOption(target: ConfigurationTarget, key: string): TPromise { throw ni(); } } export abstract class MainThreadDiagnosticsShape { @@ -95,7 +96,7 @@ export abstract class MainThreadDiagnosticsShape { export abstract class MainThreadDocumentsShape { $tryOpenDocument(uri: URI): TPromise { throw ni(); } - $registerTextContentProvider(handle:number, scheme: string): void { throw ni(); } + $registerTextContentProvider(handle: number, scheme: string): void { throw ni(); } $onVirtualDocumentChange(uri: URI, value: string): void { throw ni(); } $unregisterTextContentProvider(handle: number): void { throw ni(); } $trySaveDocument(uri: URI): TPromise { throw ni(); } @@ -111,7 +112,7 @@ export abstract class MainThreadEditorsShape { $trySetDecorations(id: string, key: string, ranges: editorCommon.IDecorationOptions[]): TPromise { throw ni(); } $tryRevealRange(id: string, range: editorCommon.IRange, revealType: TextEditorRevealType): TPromise { throw ni(); } $trySetSelections(id: string, selections: editorCommon.ISelection[]): TPromise { throw ni(); } - $tryApplyEdits(id: string, modelVersionId: number, edits: editorCommon.ISingleEditOperation[], opts:IApplyEditsOptions): TPromise { throw ni(); } + $tryApplyEdits(id: string, modelVersionId: number, edits: editorCommon.ISingleEditOperation[], opts: IApplyEditsOptions): TPromise { throw ni(); } } export abstract class MainThreadErrorsShape { @@ -135,7 +136,7 @@ export abstract class MainThreadLanguageFeaturesShape { $registerSuggestSupport(handle: number, selector: vscode.DocumentSelector, triggerCharacters: string[]): TPromise { throw ni(); } $registerSignatureHelpProvider(handle: number, selector: vscode.DocumentSelector, triggerCharacter: string[]): TPromise { throw ni(); } $registerDocumentLinkProvider(handle: number, selector: vscode.DocumentSelector): TPromise { throw ni(); } - $setLanguageConfiguration(handle: number, languageId:string, configuration: vscode.LanguageConfiguration): TPromise { throw ni(); } + $setLanguageConfiguration(handle: number, languageId: string, configuration: vscode.LanguageConfiguration): TPromise { throw ni(); } } export abstract class MainThreadLanguagesShape { diff --git a/src/vs/workbench/api/node/extHostConfiguration.ts b/src/vs/workbench/api/node/extHostConfiguration.ts index 760a4a7c9f7..3e623b1f5a0 100644 --- a/src/vs/workbench/api/node/extHostConfiguration.ts +++ b/src/vs/workbench/api/node/extHostConfiguration.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import {mixin} from 'vs/base/common/objects'; -import {illegalState} from 'vs/base/common/errors'; -import Event, {Emitter} from 'vs/base/common/event'; -import {WorkspaceConfiguration} from 'vscode'; -import {ExtHostConfigurationShape, MainThreadConfigurationShape} from './extHost.protocol'; -import {ConfigurationTarget} from 'vs/workbench/services/configuration/common/configurationEditing'; +import { mixin } from 'vs/base/common/objects'; +import { illegalState } from 'vs/base/common/errors'; +import Event, { Emitter } from 'vs/base/common/event'; +import { WorkspaceConfiguration } from 'vscode'; +import { ExtHostConfigurationShape, MainThreadConfigurationShape } from './extHost.protocol'; +import { ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; export class ExtHostConfiguration extends ExtHostConfigurationShape { @@ -56,7 +56,11 @@ export class ExtHostConfiguration extends ExtHostConfigurationShape { update: (key: string, value: any, global: boolean) => { key = section ? `${section}.${key}` : key; const target = global ? ConfigurationTarget.USER : ConfigurationTarget.WORKSPACE; - return this._proxy.$updateConfigurationOption(target, key, value); + if (value !== void 0) { + return this._proxy.$updateConfigurationOption(target, key, value); + } else { + return this._proxy.$removeConfigurationOption(target, key); + } } }; diff --git a/src/vs/workbench/api/node/mainThreadConfiguration.ts b/src/vs/workbench/api/node/mainThreadConfiguration.ts index f741e86707d..b707f4e6a47 100644 --- a/src/vs/workbench/api/node/mainThreadConfiguration.ts +++ b/src/vs/workbench/api/node/mainThreadConfiguration.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import {TPromise} from 'vs/base/common/winjs.base'; -import {IDisposable, dispose} from 'vs/base/common/lifecycle'; -import {IThreadService} from 'vs/workbench/services/thread/common/threadService'; -import {IWorkspaceConfigurationService} from 'vs/workbench/services/configuration/common/configuration'; -import {IConfigurationEditingService, ConfigurationTarget} from 'vs/workbench/services/configuration/common/configurationEditing'; -import {MainThreadConfigurationShape, ExtHostContext} from './extHost.protocol'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; +import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; +import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; +import { MainThreadConfigurationShape, ExtHostContext } from './extHost.protocol'; export class MainThreadConfiguration extends MainThreadConfigurationShape { @@ -35,4 +35,8 @@ export class MainThreadConfiguration extends MainThreadConfigurationShape { $updateConfigurationOption(target: ConfigurationTarget, key: string, value: any): TPromise { return this._configurationEditingService.writeConfiguration(target, { key, value }); } + + $removeConfigurationOption(target: ConfigurationTarget, key: string): TPromise { + return this._configurationEditingService.writeConfiguration(target, { key, value: undefined }); + } } From 2b27189749b9ef7a3559f5a61e093dd90d7cb2e3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 13:42:00 +0200 Subject: [PATCH 236/433] make global optional, fixes #12878 --- src/vs/vscode.d.ts | 2 +- src/vs/workbench/api/node/extHostConfiguration.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index b6147f0e559..f80a8ea9088 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2702,7 +2702,7 @@ declare namespace vscode { * @param value The new value. * @param global When `true` changes the configuration value for all instances of the editor. */ - update(section: string, value: any, global: boolean): Thenable; + update(section: string, value: any, global?: boolean): Thenable; /** * Readable dictionary that backs this configuration. diff --git a/src/vs/workbench/api/node/extHostConfiguration.ts b/src/vs/workbench/api/node/extHostConfiguration.ts index 3e623b1f5a0..e2426909469 100644 --- a/src/vs/workbench/api/node/extHostConfiguration.ts +++ b/src/vs/workbench/api/node/extHostConfiguration.ts @@ -53,7 +53,7 @@ export class ExtHostConfiguration extends ExtHostConfigurationShape { } return result; }, - update: (key: string, value: any, global: boolean) => { + update: (key: string, value: any, global: boolean = false) => { key = section ? `${section}.${key}` : key; const target = global ? ConfigurationTarget.USER : ConfigurationTarget.WORKSPACE; if (value !== void 0) { From 12a9daeb629cd7b1b124786b3738dbdb24d9a79e Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 28 Sep 2016 13:45:53 +0200 Subject: [PATCH 237/433] Fixes #12798: TS error stays around --- .../typescript/src/typescriptServiceClient.ts | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 3c535975103..fa72efe287a 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -440,11 +440,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient let options: electron.IForkOptions = { execArgv: [] // [`--debug-brk=5859`] }; - try { - if (workspace.rootPath) { - options.cwd = fs.realpathSync(workspace.rootPath); - } - } catch (error) { + if (workspace.rootPath) { options.cwd = workspace.rootPath; } let value = process.env.TSS_DEBUG; @@ -585,13 +581,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient return null; } // Both \ and / must be escaped in regular expressions - result = result.replace(new RegExp('\\' + this.pathSeparator, 'g'), '/'); - try { - result = fs.realpathSync(result); - } catch (error) { - // Do nothing. Keep original path. - } - return result; + return result.replace(new RegExp('\\' + this.pathSeparator, 'g'), '/'); } public asUrl(filepath: string): Uri { From 29889f712f9a728e1608bf61d3be18f77cd82203 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 14:19:59 +0200 Subject: [PATCH 238/433] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 520aaaa2d86..e66281ba134 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.6.0", "electronVersion": "1.3.7", - "distro": "40cf6a4fcea1774605af346b5c9ac5377facad94", + "distro": "7542725e6f4b1bb0cfe791f513e8819600edaefd", "author": { "name": "Microsoft Corporation" }, From 27a7c430edb267aaa834d99e5662de6c9e0ad33b Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 28 Sep 2016 14:26:25 +0200 Subject: [PATCH 239/433] fixes #12853 --- src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts index 864b9f2529b..3d9510afb95 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts @@ -292,7 +292,7 @@ export class DebugEditorModelManager implements IWorkbenchContribution { } if (!session || session.configuration.capabilities.supportsConditionalBreakpoints) { - const mode = modelData.model.getMode(); + const mode = modelData ? modelData.model.getMode() : null; const modeId = mode ? mode.getId() : ''; const glyphMarginHoverMessage = `\`\`\`${modeId}\n${ breakpoint.condition }\`\`\``; From 9e4d4ece414427b3f19777cd69cf17e9cd6a3b1a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 14:32:00 +0200 Subject: [PATCH 240/433] fixes #11673 --- src/vs/code/electron-main/main.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 43a9452e3ae..f7049962e69 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -6,7 +6,7 @@ 'use strict'; import * as nls from 'vs/nls'; -import { app, ipcMain as ipc } from 'electron'; +import { app, ipcMain as ipc, session } from 'electron'; import { assign } from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; import { parseMainProcessArgv, ParsedArgs } from 'vs/platform/environment/node/argv'; @@ -43,6 +43,7 @@ import { getPathLabel } from 'vs/base/common/labels'; import { IURLService } from 'vs/platform/url/common/url'; import { URLChannel } from 'vs/platform/url/common/urlIpc'; import { URLService } from 'vs/platform/url/electron-main/urlService'; +import pkg from 'vs/platform/package'; import * as fs from 'original-fs'; import * as cp from 'child_process'; @@ -80,6 +81,9 @@ function main(accessor: ServicesAccessor, mainIpcServer: Server, userEnv: IProce const configurationService = accessor.get(IConfigurationService) as ConfigurationService; const windowEventChannel = new WindowEventChannel(windowEventService); + // Set user agent + session.defaultSession.setUserAgent(`VSCode ${ pkg.version }`); + // We handle uncaught exceptions here to prevent electron from opening a dialog to the user process.on('uncaughtException', (err: any) => { if (err) { From 6afb0f477a766bf9d6781493f070ca86846afed9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 14:34:48 +0200 Subject: [PATCH 241/433] allow to define gutter and content icons paths as string OR uri, #12111 --- .../editor/browser/services/codeEditorServiceImpl.ts | 12 +++++++++--- src/vs/editor/common/editorCommon.ts | 4 ++-- src/vs/vscode.d.ts | 9 +++++---- src/vs/workbench/api/node/extHostTypeConverters.ts | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 9169bfce8f5..f4c295a4f09 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -301,8 +301,10 @@ class DecorationRenderHelper { if (typeof opts !== 'undefined') { DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); - if (typeof opts.contentIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.parse(opts.contentIconPath).toString())); + if (typeof opts.contentIconPath === 'string') { + cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.file(opts.contentIconPath).toString())); + } else if(opts.contentIconPath instanceof URI) { + cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, opts.contentIconPath.toString())); } if (typeof opts.contentText !== 'undefined') { let escaped = opts.contentText.replace(/\"/g, '\\\"'); @@ -324,7 +326,11 @@ class DecorationRenderHelper { let cssTextArr = []; if (typeof opts.gutterIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.parse(opts.gutterIconPath).toString())); + if (typeof opts.gutterIconPath === 'string') { + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.file(opts.gutterIconPath).toString())); + } else { + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconPath.toString())); + } if (typeof opts.gutterIconSize !== 'undefined') { cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); } diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 3dac506d42b..f64c674ec54 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -3788,7 +3788,7 @@ export interface IThemeDecorationRenderOptions { color?: string; letterSpacing?: string; - gutterIconPath?: string; + gutterIconPath?: string | URI; gutterIconSize?: string; overviewRulerColor?: string; @@ -3802,7 +3802,7 @@ export interface IThemeDecorationRenderOptions { */ export interface IContentDecorationRenderOptions { contentText?: string; - contentIconPath?: string; + contentIconPath?: string | URI; border?: string; textDecoration?: string; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index f80a8ea9088..6a310d6f2be 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -782,9 +782,10 @@ declare namespace vscode { letterSpacing?: string; /** - * An **absolute path** to an image to be rendered in the gutterIconPath. + * An **absolute path** to an image to be rendered in the gutterIconPath or + * an URI. */ - gutterIconPath?: string; + gutterIconPath?: string | Uri; /** * Specifies the size of the gutter icon. @@ -815,9 +816,9 @@ declare namespace vscode { */ contentText?: string; /** - * An **absolute path** to an image to be rendered in the attachment. Either an icon or a text can be shown, but not both. + * An **absolute path** to an image to be rendered in the attachment or an URI. Either an icon or a text can be shown, but not both. */ - contentIconPath?: string; + contentIconPath?: string | Uri; /** * CSS styling property that will be applied to the decoration attachment. */ diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 9aebafecfb2..b81f07900a3 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -143,7 +143,7 @@ export function fromRangeOrRangeWithMessage(ranges: vscode.Range[] | vscode.Deco return { range: fromRange(r.range), hoverMessage: r.hoverMessage, - renderOptions: r.renderOptions + renderOptions: /* URI vs Uri*/ r.renderOptions }; }); } else { From 75a03bdecf8fa92c819bcd74dae9c900ee03a045 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 14:37:51 +0200 Subject: [PATCH 242/433] fixes #11779 --- src/vs/base/common/errors.ts | 16 ++++++++++++++++ .../node/extensionGalleryService.ts | 13 ++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/vs/base/common/errors.ts b/src/vs/base/common/errors.ts index ee0a4c84e79..33f9a32b6e1 100644 --- a/src/vs/base/common/errors.ts +++ b/src/vs/base/common/errors.ts @@ -168,4 +168,20 @@ export function create(message: string, options: IErrorOptions = {}): Error { } return result; +} + +export function getErrorMessage(err: any): string { + if (!err) { + return 'Error'; + } + + if (err.message) { + return err.message; + } + + if (err.stack) { + return err.stack.split('\n')[0]; + } + + return String(err); } \ No newline at end of file diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 46d64cc3f90..17879689c42 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -8,6 +8,7 @@ import { tmpdir } from 'os'; import * as path from 'path'; import { TPromise } from 'vs/base/common/winjs.base'; import { distinct } from 'vs/base/common/arrays'; +import { getErrorMessage } from 'vs/base/common/errors'; import { ArraySet } from 'vs/base/common/set'; import { IGalleryExtension, IExtensionGalleryService, IQueryOptions, SortBy, SortOrder, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; import { getGalleryExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionTelemetry'; @@ -489,12 +490,18 @@ export class ExtensionGalleryService implements IExtensionGalleryService { parsedUrl.query['redirect'] = 'true'; const cdnUrl = url.format(parsedUrl); + const cdnOptions = assign({}, options, { url: cdnUrl }); - return this.requestService.request(assign({}, options, { url: cdnUrl })) + return this.requestService.request(cdnOptions) .then(context => context.res.statusCode === 200 ? context : TPromise.wrapError('expected 200')) - .then(null, () => { + .then(null, err => { + this.telemetryService.publicLog('galleryService:requestError', { cdn: true, message: getErrorMessage(err) }); this.telemetryService.publicLog('galleryService:cdnFallback', { url: cdnUrl }); - return this.requestService.request(options); + + return this.requestService.request(options).then(null, err => { + this.telemetryService.publicLog('galleryService:requestError', { cdn: false, message: getErrorMessage(err) }); + return TPromise.wrapError(err); + }); }); } From 492c1cc3e6e846ef1b7112aec78a8d8e2ab99685 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 28 Sep 2016 14:47:55 +0200 Subject: [PATCH 243/433] fix #12132 --- .../extensions/electron-browser/extensionEditor.ts | 3 +++ .../electron-browser/media/extensionEditor.css | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index a2ceb4fe6aa..54cae148af8 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -111,6 +111,7 @@ export class ExtensionEditor extends BaseEditor { private icon: HTMLImageElement; private name: HTMLElement; + private identifier: HTMLElement; private license: HTMLElement; private publisher: HTMLElement; private installCount: HTMLElement; @@ -164,6 +165,7 @@ export class ExtensionEditor extends BaseEditor { const details = append(header, $('.details')); const title = append(details, $('.title')); this.name = append(title, $('span.name.clickable')); + this.identifier = append(title, $('span.identifier')); const subtitle = append(details, $('.subtitle')); this.publisher = append(subtitle, $('span.publisher.clickable')); @@ -209,6 +211,7 @@ export class ExtensionEditor extends BaseEditor { this.icon.src = extension.iconUrl; this.name.textContent = extension.displayName; + this.identifier.textContent = `${extension.publisher}.${extension.name}`; this.publisher.textContent = extension.publisherDisplayName; this.description.textContent = extension.description; diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css index c6f26264a5a..fb68b3fe648 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css @@ -39,13 +39,24 @@ } .extension-editor > .header > .details > .title > .name { - flex: 1; + flex: 0; font-size: 26px; line-height: 30px; font-weight: 600; white-space: nowrap; } +.extension-editor > .header > .details > .title > .identifier { + margin-left: 10px; + font-size: 14px; + opacity: 0.6; + background: rgba(173, 173, 173, 0.51); + padding: 0px 4px; + border-radius: 4px; + user-select: text; + -webkit-user-select: text; +} + .extension-editor > .header > .details > .subtitle { padding-top: 10px; white-space: nowrap; From d15f6491a703d54de81fcb109e0d051ea4f9df7e Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 28 Sep 2016 14:49:23 +0200 Subject: [PATCH 244/433] Fixes #12803: Cannot read property 'then' of null --- .../typescript/src/typescriptServiceClient.ts | 263 +++++++++--------- 1 file changed, 133 insertions(+), 130 deletions(-) diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index fa72efe287a..65ca8ede43a 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -151,9 +151,9 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.trace = this.readTrace(); workspace.onDidChangeConfiguration(() => { this.trace = this.readTrace(); - let oldTask = this.tsdk; + let oldTsdk = this.tsdk; this.tsdk = workspace.getConfiguration().get('typescript.tsdk', null); - if (this.servicePromise === null && oldTask !== this.tsdk) { + if (this.servicePromise === null && oldTsdk !== this.tsdk) { this.startService(); } }); @@ -293,149 +293,152 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } const tsConfig = workspace.getConfiguration('typescript'); const checkWorkspaceVersionKey = 'check.workspaceVersion'; - let versionCheckPromise: Thenable = Promise.resolve(modulePath); - if (!workspace.rootPath) { - versionCheckPromise = this.informAboutTS20(modulePath); - } else { - if (!this.tsdk && tsConfig.get(checkWorkspaceVersionKey, true)) { - let localModulePath = path.join(workspace.rootPath, 'node_modules', 'typescript', 'lib', 'tsserver.js'); - if (fs.existsSync(localModulePath)) { - let localVersion = this.getTypeScriptVersion(localModulePath); - let shippedVersion = this.getTypeScriptVersion(modulePath); - if (localVersion && localVersion !== shippedVersion) { - checkGlobalVersion = false; - versionCheckPromise = window.showInformationMessage( - localize( - 'localTSFound', - 'The workspace folder contains TypeScript version {0}. Do you want to use this version instead of the bundled version {1}?', - localVersion, shippedVersion - ), + this.servicePromise = new Promise((resolve, reject) => { + let versionCheckPromise: Thenable = Promise.resolve(modulePath); + + if (!workspace.rootPath) { + versionCheckPromise = this.informAboutTS20(modulePath); + } else { + if (!this.tsdk && tsConfig.get(checkWorkspaceVersionKey, true)) { + let localModulePath = path.join(workspace.rootPath, 'node_modules', 'typescript', 'lib', 'tsserver.js'); + if (fs.existsSync(localModulePath)) { + let localVersion = this.getTypeScriptVersion(localModulePath); + let shippedVersion = this.getTypeScriptVersion(modulePath); + if (localVersion && localVersion !== shippedVersion) { + checkGlobalVersion = false; + versionCheckPromise = window.showInformationMessage( + localize( + 'localTSFound', + 'The workspace folder contains TypeScript version {0}. Do you want to use this version instead of the bundled version {1}?', + localVersion, shippedVersion + ), + { + title: localize('use', 'Use Workspace ({0})', localVersion), + id: MessageAction.useLocal + }, + { + title: localize({ + key: 'useBundled', + comment: ["Bundled has the meaning of packaged with VS Code itself."] + }, 'Use Bundled ({0})', shippedVersion), + id: MessageAction.useBundled, + }, + { + title: localize('neverCheckLocalVesion', 'Never Check for Workspace Version'), + id: MessageAction.neverCheckLocalVersion + }, + { + title: localize('close', 'Close'), + id: MessageAction.close, + isCloseAffordance: true + } + ).then((selected) => { + if (!selected || selected.id === MessageAction.close) { + return modulePath; + } + switch(selected.id) { + case MessageAction.useLocal: + let pathValue = './node_modules/typescript/lib'; + tsConfig.update('tsdk', pathValue, false); + window.showInformationMessage(localize('updatedtsdk', 'Updated workspace setting \'typescript.tsdk\' to {0}', pathValue)); + showVersionStatusItem = true; + return localModulePath; + case MessageAction.useBundled: + tsConfig.update(checkWorkspaceVersionKey, false, false); + window.showInformationMessage(localize('updateLocalWorkspaceCheck', 'Updated workspace setting \'typescript.check.workspaceVersion\' to false')); + return modulePath; + case MessageAction.neverCheckLocalVersion: + window.showInformationMessage(localize('updateGlobalWorkspaceCheck', 'Updated user setting \'typescript.check.workspaceVersion\' to false')); + tsConfig.update(checkWorkspaceVersionKey, false, true); + return modulePath; + default: + return modulePath; + } + }); + } + } else { + versionCheckPromise = this.informAboutTS20(modulePath); + } + } + } + + versionCheckPromise.then((modulePath) => { + this.info(`Using tsserver from location: ${modulePath}`); + if (!fs.existsSync(modulePath)) { + window.showErrorMessage(localize('noServerFound', 'The path {0} doesn\'t point to a valid tsserver install. TypeScript language features will be disabled.', path.dirname(modulePath))); + this.servicePromise = null; + reject(new Error('No TSServer found')); + return; + } + + let version = this.getTypeScriptVersion(modulePath); + if (!version) { + version = workspace.getConfiguration().get('typescript.tsdk_version', undefined); + } + if (version) { + this._apiVersion = APIVersion.fromString(version); + } + + + const label = version || localize('versionNumber.custom' ,'custom'); + const tooltip = modulePath; + VersionStatus.enable(!!this.tsdk || showVersionStatusItem); + VersionStatus.setInfo(label, tooltip); + + const doGlobalVersionCheckKey: string = 'doGlobalVersionCheck'; + const globalStateValue = this.globalState.get(doGlobalVersionCheckKey, true); + const checkTscVersion = 'check.tscVersion'; + if (!globalStateValue) { + tsConfig.update(checkTscVersion, false, true); + this.globalState.update(doGlobalVersionCheckKey, true); + } + if (checkGlobalVersion && tsConfig.get(checkTscVersion)) { + let tscVersion: string = undefined; + try { + let out = cp.execSync('tsc --version', { encoding: 'utf8' }); + if (out) { + let matches = out.trim().match(/Version\s*(.*)$/); + if (matches && matches.length === 2) { + tscVersion = matches[1]; + } + } + } catch (error) { + } + if (tscVersion && tscVersion !== version) { + window.showInformationMessage( + localize('versionMismatch', 'A version mismatch between the globally installed tsc compiler ({0}) and VS Code\'s language service ({1}) has been detected. This might result in inconsistent compile errors.', tscVersion, version), { - title: localize('use', 'Use Workspace ({0})', localVersion), - id: MessageAction.useLocal + title: localize('moreInformation', 'More Information'), + id: 1 }, { - title: localize({ - key: 'useBundled', - comment: ["Bundled has the meaning of packaged with VS Code itself."] - }, 'Use Bundled ({0})', shippedVersion), - id: MessageAction.useBundled, - }, - { - title: localize('neverCheckLocalVesion', 'Never Check for Workspace Version'), - id: MessageAction.neverCheckLocalVersion + title: localize('doNotCheckAgain', 'Don\'t Check Again'), + id: 2 }, { title: localize('close', 'Close'), - id: MessageAction.close, + id: 3, isCloseAffordance: true } ).then((selected) => { - if (!selected || selected.id === MessageAction.close) { - return modulePath; + if (!selected || selected.id === 3) { + return; } - switch(selected.id) { - case MessageAction.useLocal: - let pathValue = './node_modules/typescript/lib'; - tsConfig.update('tsdk', pathValue, false); - window.showInformationMessage(localize('updatedtsdk', 'Updated workspace setting \'typescript.tsdk\' to {0}', pathValue)); - showVersionStatusItem = true; - return localModulePath; - case MessageAction.useBundled: - tsConfig.update(checkWorkspaceVersionKey, false, false); - window.showInformationMessage(localize('updateLocalWorkspaceCheck', 'Updated workspace setting \'typescript.check.workspaceVersion\' to false')); - return modulePath; - case MessageAction.neverCheckLocalVersion: - window.showInformationMessage(localize('updateGlobalWorkspaceCheck', 'Updated user setting \'typescript.check.workspaceVersion\' to false')); - tsConfig.update(checkWorkspaceVersionKey, false, true); - return modulePath; - default: - return modulePath; + switch (selected.id) { + case 1: + openUrl('http://go.microsoft.com/fwlink/?LinkId=826239'); + break; + case 2: + tsConfig.update(checkTscVersion, false, true); + window.showInformationMessage(localize('updateTscCheck', 'Updated user setting \'typescript.check.tscVersion\' to false')); + this.globalState.update(doGlobalVersionCheckKey, false); + break; } }); } - } else { - versionCheckPromise = this.informAboutTS20(modulePath); } - } - } - versionCheckPromise.then((modulePath) => { - this.info(`Using tsserver from location: ${modulePath}`); - if (!fs.existsSync(modulePath)) { - window.showErrorMessage(localize('noServerFound', 'The path {0} doesn\'t point to a valid tsserver install. TypeScript language features will be disabled.', path.dirname(modulePath))); - return; - } - - let version = this.getTypeScriptVersion(modulePath); - if (!version) { - version = workspace.getConfiguration().get('typescript.tsdk_version', undefined); - } - if (version) { - this._apiVersion = APIVersion.fromString(version); - } - - - const label = version || localize('versionNumber.custom' ,'custom'); - const tooltip = modulePath; - VersionStatus.enable(!!this.tsdk || showVersionStatusItem); - VersionStatus.setInfo(label, tooltip); - - const doGlobalVersionCheckKey: string = 'doGlobalVersionCheck'; - const globalStateValue = this.globalState.get(doGlobalVersionCheckKey, true); - const checkTscVersion = 'check.tscVersion'; - if (!globalStateValue) { - tsConfig.update(checkTscVersion, false, true); - this.globalState.update(doGlobalVersionCheckKey, true); - } - if (checkGlobalVersion && tsConfig.get(checkTscVersion)) { - let tscVersion: string = undefined; - try { - let out = cp.execSync('tsc --version', { encoding: 'utf8' }); - if (out) { - let matches = out.trim().match(/Version\s*(.*)$/); - if (matches && matches.length === 2) { - tscVersion = matches[1]; - } - } - } catch (error) { - } - if (tscVersion && tscVersion !== version) { - window.showInformationMessage( - localize('versionMismatch', 'A version mismatch between the globally installed tsc compiler ({0}) and VS Code\'s language service ({1}) has been detected. This might result in inconsistent compile errors.', tscVersion, version), - { - title: localize('moreInformation', 'More Information'), - id: 1 - }, - { - title: localize('doNotCheckAgain', 'Don\'t Check Again'), - id: 2 - }, - { - title: localize('close', 'Close'), - id: 3, - isCloseAffordance: true - } - ).then((selected) => { - if (!selected || selected.id === 3) { - return; - } - switch (selected.id) { - case 1: - openUrl('http://go.microsoft.com/fwlink/?LinkId=826239'); - break; - case 2: - tsConfig.update(checkTscVersion, false, true); - window.showInformationMessage(localize('updateTscCheck', 'Updated user setting \'typescript.check.tscVersion\' to false')); - this.globalState.update(doGlobalVersionCheckKey, false); - break; - } - }); - } - } - - this.servicePromise = new Promise((resolve, reject) => { try { let options: electron.IForkOptions = { execArgv: [] // [`--debug-brk=5859`] @@ -474,12 +477,12 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient }); this._onReady.resolve(); resolve(childProcess); + this.serviceStarted(resendModels); }); } catch (error) { reject(error); } }); - this.serviceStarted(resendModels); }); } From 590a6dd70737c11ee667ae7685fb1543dc8f3120 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 14:51:00 +0200 Subject: [PATCH 245/433] fixes #11675 --- .../common/extensionManagement.ts | 1 - .../node/extensionGalleryService.ts | 84 +++++++++---------- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 67b8a0c230f..b5f62c98da6 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -134,7 +134,6 @@ export interface IGalleryExtension { ratingCount: number; assets: IGalleryExtensionAssets; properties: IGalleryExtensionProperties; - downloadHeaders: { [key: string]: string; }; /** We need this check until all extension in the market place contain engine property */ compatibilityChecked: boolean; isCompatible: boolean; diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 17879689c42..08cb336f9a6 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -9,6 +9,7 @@ import * as path from 'path'; import { TPromise } from 'vs/base/common/winjs.base'; import { distinct } from 'vs/base/common/arrays'; import { getErrorMessage } from 'vs/base/common/errors'; +import { memoize } from 'vs/base/common/decorators'; import { ArraySet } from 'vs/base/common/set'; import { IGalleryExtension, IExtensionGalleryService, IQueryOptions, SortBy, SortOrder, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; import { getGalleryExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionTelemetry'; @@ -205,7 +206,7 @@ function getEngine(version: IRawGalleryExtensionVersion): string { return (values.length > 0 && values[0].value) || ''; } -function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUrl: string, downloadHeaders: { [key: string]: string; }): IGalleryExtension { +function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUrl: string): IGalleryExtension { const [version] = galleryExtension.versions; let iconFallback = getAssetSource(version.files, AssetType.Icon); @@ -248,7 +249,6 @@ function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUr dependencies: getDependencies(version), engine: getEngine(version) }, - downloadHeaders, compatibilityChecked: false, isCompatible: false }); @@ -268,7 +268,8 @@ export class ExtensionGalleryService implements IExtensionGalleryService { private extensionsGalleryUrl: string; - private getCommonHeaders(): TPromise<{ [key: string]: string; }> { + @memoize + private get commonHeaders(): TPromise<{ [key: string]: string; }> { return this.telemetryService.getTelemetryInfo().then(({ machineId }) => { const result: { [key: string]: string; } = { 'X-Market-Client-Id': `VSCode ${ pkg.version }`, @@ -336,23 +337,21 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } return this.queryGallery(query).then(({ galleryExtensions, total }) => { - return this.getCommonHeaders().then(downloadHeaders => { - const extensions = galleryExtensions.map(e => toExtension(e, this.extensionsGalleryUrl, downloadHeaders)); - const pageSize = query.pageSize; - const getPage = pageIndex => this.queryGallery(query.withPage(pageIndex + 1)) - .then(({ galleryExtensions }) => galleryExtensions.map(e => toExtension(e, this.extensionsGalleryUrl, downloadHeaders))); + const extensions = galleryExtensions.map(e => toExtension(e, this.extensionsGalleryUrl)); + const pageSize = query.pageSize; + const getPage = pageIndex => this.queryGallery(query.withPage(pageIndex + 1)) + .then(({ galleryExtensions }) => galleryExtensions.map(e => toExtension(e, this.extensionsGalleryUrl))); - return { firstPage: extensions, total, pageSize, getPage }; - }); + return { firstPage: extensions, total, pageSize, getPage }; }); } private queryGallery(query: Query): TPromise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> { - return this.getCommonHeaders() + return this.commonHeaders .then(headers => { const data = JSON.stringify(query.raw); - headers = assign(headers, { + headers = assign({}, headers, { 'Content-Type': 'application/json', 'Accept': 'application/json;api-version=3.0-preview.1', 'Accept-Encoding': 'gzip', @@ -385,8 +384,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { const startTime = new Date().getTime(); const log = duration => this.telemetryService.publicLog('galleryService:downloadVSIX', assign(data, { duration })); - return this.getCommonHeaders() - .then(headers => this._getAsset({ url, headers })) + return this._getAsset({ url }) .then(context => download(zipPath, context)) .then(() => log(new Date().getTime() - startTime)) .then(() => zipPath); @@ -441,20 +439,18 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withAssetTypes(AssetType.Icon, AssetType.License, AssetType.Details, AssetType.Manifest, AssetType.VSIX); query = extensionNames.reduce((query, name) => query.withFilter(FilterType.ExtensionName, name), query); - return this.queryGallery(query) - .then(result => this.getCommonHeaders() - .then(downloadHeaders => { - const dependencies = []; - const ids = []; - for (const rawExtension of result.galleryExtensions) { - if (ids.indexOf(rawExtension.extensionId) === -1) { - dependencies.push(toExtension(rawExtension, this.extensionsGalleryUrl, downloadHeaders)); - ids.push(rawExtension.extensionId); - } - } - return dependencies; - }) - ); + return this.queryGallery(query).then(result => { + const dependencies = []; + const ids = []; + + for (const rawExtension of result.galleryExtensions) { + if (ids.indexOf(rawExtension.extensionId) === -1) { + dependencies.push(toExtension(rawExtension, this.extensionsGalleryUrl)); + ids.push(rawExtension.extensionId); + } + } + return dependencies; + }); } private getDependenciesReccursively(toGet: string[], result: IGalleryExtension[]): TPromise { @@ -489,20 +485,25 @@ export class ExtensionGalleryService implements IExtensionGalleryService { parsedUrl.search = undefined; parsedUrl.query['redirect'] = 'true'; - const cdnUrl = url.format(parsedUrl); - const cdnOptions = assign({}, options, { url: cdnUrl }); + return this.commonHeaders.then(headers => { + headers = assign({}, headers, options.headers || {}); + options = assign({}, options, { headers }); - return this.requestService.request(cdnOptions) - .then(context => context.res.statusCode === 200 ? context : TPromise.wrapError('expected 200')) - .then(null, err => { - this.telemetryService.publicLog('galleryService:requestError', { cdn: true, message: getErrorMessage(err) }); - this.telemetryService.publicLog('galleryService:cdnFallback', { url: cdnUrl }); + const cdnUrl = url.format(parsedUrl); + const cdnOptions = assign({}, options, { url: cdnUrl }); - return this.requestService.request(options).then(null, err => { - this.telemetryService.publicLog('galleryService:requestError', { cdn: false, message: getErrorMessage(err) }); - return TPromise.wrapError(err); + return this.requestService.request(cdnOptions) + .then(context => context.res.statusCode === 200 ? context : TPromise.wrapError('expected 200')) + .then(null, err => { + this.telemetryService.publicLog('galleryService:requestError', { cdn: true, message: getErrorMessage(err) }); + this.telemetryService.publicLog('galleryService:cdnFallback', { url: cdnUrl }); + + return this.requestService.request(options).then(null, err => { + this.telemetryService.publicLog('galleryService:requestError', { cdn: false, message: getErrorMessage(err) }); + return TPromise.wrapError(err); + }); }); - }); + }); } private getLastValidExtensionVersion(extension: IRawGalleryExtension, versions: IRawGalleryExtensionVersion[]): TPromise { @@ -533,10 +534,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService { const version = versions[0]; const url = getAssetSource(version.files, AssetType.Manifest); + const headers = { 'Accept-Encoding': 'gzip' }; - return this.getCommonHeaders() - .then(headers => assign(headers, { 'Accept-Encoding': 'gzip' })) - .then(headers => this._getAsset({ url, headers })) + return this._getAsset({ url, headers }) .then(context => asJson(context)) .then(manifest => { const desc = { From bdddc2bf4c5c561d5c59eb012fa4e888a7401659 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 14:53:11 +0200 Subject: [PATCH 246/433] remove out folder at installation time fixes #12010 --- build/win32/code.iss | 1 + 1 file changed, 1 insertion(+) diff --git a/build/win32/code.iss b/build/win32/code.iss index 31a4eed9cf7..5fb79892bde 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -44,6 +44,7 @@ Name: "simplifiedChinese"; MessagesFile: "{#RepoDir}\build\win32\i18n\Default.zh Name: "traditionalChinese"; MessagesFile: "{#RepoDir}\build\win32\i18n\Default.zh-tw.isl,{#RepoDir}\build\win32\i18n\messages.zh-tw.isl" {#LocalizedLanguageFile("cht")} [InstallDelete] +Type: filesandordirs; Name: {app}\resources\app\out Type: filesandordirs; Name: {app}\resources\app\plugins Type: filesandordirs; Name: {app}\resources\app\extensions Type: filesandordirs; Name: {app}\resources\app\node_modules From c008afd3b1a41c326129ccfa2934e398f1761b94 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 14:55:48 +0200 Subject: [PATCH 247/433] fixes #11896 --- .../parts/extensions/electron-browser/extensionEditor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 54cae148af8..8c1e419212e 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -373,8 +373,8 @@ export class ExtensionEditor extends BaseEditor { const details = $('details', { open: true, ontoggle: onDetailsToggle }, $('summary', null, localize('debuggers', "Debuggers ({0})", contrib.length)), $('table', null, - $('tr', null, $('th', null, localize('debugger name', "Name")), $('th', null, localize('runtime', "Runtime"))), - ...contrib.map(d => $('tr', null, $('td', null, d.label || d.type), $('td', null, d.runtime))) + $('tr', null, $('th', null, localize('debugger name', "Name"))), + ...contrib.map(d => $('tr', null, $('td', null, d.label || d.type))) ) ); From 481dababe021200f5e73d9f07a526db8c498971b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 14:56:39 +0200 Subject: [PATCH 248/433] fixes #11914 --- .../parts/extensions/electron-browser/extensionsActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index fcaa33ea9d7..890e09a6f52 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -307,7 +307,7 @@ export class EnableAction extends Action { export class UpdateAllAction extends Action { - static ID = 'extensions.update-all'; + static ID = 'workbench.extensions.action.updateAllExtensions'; static LABEL = localize('updateAll', "Update All Extensions"); private disposables: IDisposable[] = []; From c0b8dfd303305d698c9c4fbc1422c6b592485ce8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 14:58:41 +0200 Subject: [PATCH 249/433] fixes #11984 --- .../parts/extensions/electron-browser/extensionEditor.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 8c1e419212e..aeceb42d2c5 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -530,12 +530,14 @@ export class ExtensionEditor extends BaseEditor { $('summary', null, localize('languages', "Languages ({0})", languages.length)), $('table', null, $('tr', null, - $('th', null, localize('command name', "Name")), + $('th', null, localize('language id', "ID")), + $('th', null, localize('language name', "Name")), $('th', null, localize('file extensions', "File Extensions")), $('th', null, localize('grammar', "Grammar")), $('th', null, localize('snippets', "Snippets")) ), ...languages.map(l => $('tr', null, + $('td', null, l.id), $('td', null, l.name), $('td', null, ...join(l.extensions.map(ext => $('code', null, ext)), ' ')), $('td', null, document.createTextNode(l.hasGrammar ? '✔︎' : '—')), From ebc982083ec0720e4da744162db82e72ef952874 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 14:59:50 +0200 Subject: [PATCH 250/433] wire up dispose calls: controller -> model -> oracle, fixes #12882 --- src/vs/editor/contrib/quickFix/browser/quickFix.ts | 1 + src/vs/editor/contrib/quickFix/browser/quickFixModel.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/vs/editor/contrib/quickFix/browser/quickFix.ts b/src/vs/editor/contrib/quickFix/browser/quickFix.ts index 395fcba987b..79601f1523a 100644 --- a/src/vs/editor/contrib/quickFix/browser/quickFix.ts +++ b/src/vs/editor/contrib/quickFix/browser/quickFix.ts @@ -61,6 +61,7 @@ export class QuickFixController implements IEditorContribution { public dispose(): void { this._quickFixWidget.dispose(); + this._model.dispose(); dispose(this._disposables); } diff --git a/src/vs/editor/contrib/quickFix/browser/quickFixModel.ts b/src/vs/editor/contrib/quickFix/browser/quickFixModel.ts index 0168d0583d0..19bd1d66e3e 100644 --- a/src/vs/editor/contrib/quickFix/browser/quickFixModel.ts +++ b/src/vs/editor/contrib/quickFix/browser/quickFixModel.ts @@ -122,6 +122,7 @@ export class QuickFixModel { dispose(): void { this._disposables = dispose(this._disposables); + dispose(this._quickFixOracle); } get onDidChangeFixes(): Event { From b67b4b2ac292cdaaf77f760211df8a45889d10b2 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 28 Sep 2016 15:00:57 +0200 Subject: [PATCH 251/433] debug: send configuration done even if breakpoint request fails fixes #12439 --- .../workbench/parts/debug/electron-browser/debugService.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 7959a8f4614..d1d67e57b1a 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -239,7 +239,7 @@ export class DebugService implements debug.IDebugService { this.toDisposeOnSessionEnd.push(this.session); this.toDisposeOnSessionEnd.push(this.session.onDidInitialize(event => { aria.status(nls.localize('debuggingStarted', "Debugging started.")); - this.sendAllBreakpoints().then(() => { + const sendConfigurationDone = () => { if (this.session && this.session.configuration.capabilities.supportsConfigurationDoneRequest) { this.session.configurationDone().done(null, e => { // Disconnect the debug session on configuration done error #10596 @@ -249,7 +249,9 @@ export class DebugService implements debug.IDebugService { this.messageService.show(severity.Error, e.message); }); } - }); + }; + + this.sendAllBreakpoints().done(sendConfigurationDone, sendConfigurationDone); })); this.toDisposeOnSessionEnd.push(this.session.onDidStop(event => { From 309470a5d20bf12559a4f38be56cd6ddad8b142c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 28 Sep 2016 15:05:42 +0200 Subject: [PATCH 252/433] update background color for identifier --- .../parts/extensions/electron-browser/media/extensionEditor.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css index fb68b3fe648..eccd43183a6 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css @@ -50,7 +50,7 @@ margin-left: 10px; font-size: 14px; opacity: 0.6; - background: rgba(173, 173, 173, 0.51); + background: rgba(173, 173, 173, 0.31); padding: 0px 4px; border-radius: 4px; user-select: text; From f3bd9cdc19f71c20a41656b2cf879ed64a55b56c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 15:18:12 +0200 Subject: [PATCH 253/433] suggest broke white space pre wrap --- src/vs/editor/contrib/suggest/browser/suggest.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/editor/contrib/suggest/browser/suggest.css b/src/vs/editor/contrib/suggest/browser/suggest.css index 269efdccf80..7adeb5218d8 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/suggest.css @@ -201,6 +201,7 @@ box-sizing: border-box; height: 100%; width: 100%; + white-space: pre-wrap; } .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .type { From 82e929bd0fbba4f7749f936408294abe8fd6daa9 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 28 Sep 2016 15:36:14 +0200 Subject: [PATCH 254/433] Partial fix for #12798. --- extensions/typescript/src/features/bufferSyncSupport.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/typescript/src/features/bufferSyncSupport.ts b/extensions/typescript/src/features/bufferSyncSupport.ts index 8b3f6874325..68f492f3a10 100644 --- a/extensions/typescript/src/features/bufferSyncSupport.ts +++ b/extensions/typescript/src/features/bufferSyncSupport.ts @@ -5,6 +5,7 @@ 'use strict'; import * as path from 'path'; +import * as fs from 'fs'; import { workspace, TextDocument, TextDocumentChangeEvent, TextDocumentContentChangeEvent, Disposable } from 'vscode'; import * as Proto from '../protocol'; @@ -187,6 +188,9 @@ export default class BufferSyncSupport { this.diagnostics.delete(filepath); delete this.syncedBuffers[filepath]; syncedBuffer.close(); + if (!fs.existsSync(filepath)) { + this.requestAllDiagnostics(); + } } private onDidChangeTextDocument(e: TextDocumentChangeEvent): void { From 2bb86f8974e00885547cabf3a43b301ec7e68df8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 28 Sep 2016 15:37:35 +0200 Subject: [PATCH 255/433] model can be null (for #12884) --- .../workbench/parts/git/browser/gitActions.contribution.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts index 7ba115be9ed..cf0b5e3470f 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts @@ -74,7 +74,8 @@ class OpenInDiffAction extends baseeditor.EditorInputAction { return false; } - if (!(typeof this.gitService.getModel().getRepositoryRoot() === 'string')) { + const model = this.gitService.getModel(); + if (!model || !(typeof model.getRepositoryRoot() === 'string')) { return false; } @@ -165,7 +166,8 @@ class OpenInEditorAction extends baseeditor.EditorInputAction { return false; } - if (!(typeof this.gitService.getModel().getRepositoryRoot() === 'string')) { + const model = this.gitService.getModel(); + if (!model || !(typeof model.getRepositoryRoot() === 'string')) { return false; } From 13dd827396330ffbf6cbb3b4fbd2f8607c9f8ad4 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 15:42:33 +0200 Subject: [PATCH 256/433] Revert "allow to define gutter and content icons paths as string OR uri, #12111" This reverts commit 6afb0f477a766bf9d6781493f070ca86846afed9. --- .../editor/browser/services/codeEditorServiceImpl.ts | 12 +++--------- src/vs/editor/common/editorCommon.ts | 4 ++-- src/vs/vscode.d.ts | 9 ++++----- src/vs/workbench/api/node/extHostTypeConverters.ts | 2 +- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index f4c295a4f09..9169bfce8f5 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -301,10 +301,8 @@ class DecorationRenderHelper { if (typeof opts !== 'undefined') { DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); - if (typeof opts.contentIconPath === 'string') { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.file(opts.contentIconPath).toString())); - } else if(opts.contentIconPath instanceof URI) { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, opts.contentIconPath.toString())); + if (typeof opts.contentIconPath !== 'undefined') { + cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.parse(opts.contentIconPath).toString())); } if (typeof opts.contentText !== 'undefined') { let escaped = opts.contentText.replace(/\"/g, '\\\"'); @@ -326,11 +324,7 @@ class DecorationRenderHelper { let cssTextArr = []; if (typeof opts.gutterIconPath !== 'undefined') { - if (typeof opts.gutterIconPath === 'string') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.file(opts.gutterIconPath).toString())); - } else { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconPath.toString())); - } + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.parse(opts.gutterIconPath).toString())); if (typeof opts.gutterIconSize !== 'undefined') { cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); } diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index f64c674ec54..3dac506d42b 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -3788,7 +3788,7 @@ export interface IThemeDecorationRenderOptions { color?: string; letterSpacing?: string; - gutterIconPath?: string | URI; + gutterIconPath?: string; gutterIconSize?: string; overviewRulerColor?: string; @@ -3802,7 +3802,7 @@ export interface IThemeDecorationRenderOptions { */ export interface IContentDecorationRenderOptions { contentText?: string; - contentIconPath?: string | URI; + contentIconPath?: string; border?: string; textDecoration?: string; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 6a310d6f2be..f80a8ea9088 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -782,10 +782,9 @@ declare namespace vscode { letterSpacing?: string; /** - * An **absolute path** to an image to be rendered in the gutterIconPath or - * an URI. + * An **absolute path** to an image to be rendered in the gutterIconPath. */ - gutterIconPath?: string | Uri; + gutterIconPath?: string; /** * Specifies the size of the gutter icon. @@ -816,9 +815,9 @@ declare namespace vscode { */ contentText?: string; /** - * An **absolute path** to an image to be rendered in the attachment or an URI. Either an icon or a text can be shown, but not both. + * An **absolute path** to an image to be rendered in the attachment. Either an icon or a text can be shown, but not both. */ - contentIconPath?: string | Uri; + contentIconPath?: string; /** * CSS styling property that will be applied to the decoration attachment. */ diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index b81f07900a3..9aebafecfb2 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -143,7 +143,7 @@ export function fromRangeOrRangeWithMessage(ranges: vscode.Range[] | vscode.Deco return { range: fromRange(r.range), hoverMessage: r.hoverMessage, - renderOptions: /* URI vs Uri*/ r.renderOptions + renderOptions: r.renderOptions }; }); } else { From aa8530106c698d94f8a284cadf8f812eadf0c53b Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 28 Sep 2016 16:00:54 +0200 Subject: [PATCH 257/433] do not set variable value if it did not change fixes #12885 --- src/vs/workbench/parts/debug/electron-browser/debugViewer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 5ef9fac8635..6f43336463f 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -119,7 +119,7 @@ function renderRenameBox(debugService: debug.IDebugService, contextViewService: debugService.removeFunctionBreakpoints(element.getId()).done(null, errors.onUnexpectedError); } else if (element instanceof model.Variable) { (element).errorMessage = null; - if (renamed) { + if (renamed && element.value !== inputBox.value) { debugService.setVariable(element, inputBox.value) // if everything went fine we need to refresh that tree element since his value updated .done(() => tree.refresh(element, false), errors.onUnexpectedError); From 26f813a35e3fae48d8faa8f0ea4e1115556bedfb Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 28 Sep 2016 16:09:42 +0200 Subject: [PATCH 258/433] fix #12888 --- .../parts/extensions/electron-browser/media/extensionEditor.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css index eccd43183a6..ae447138055 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css @@ -55,6 +55,7 @@ border-radius: 4px; user-select: text; -webkit-user-select: text; + white-space: nowrap; } .extension-editor > .header > .details > .subtitle { From ab6357b397481734e40edab607700c6421e5ea2f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 16:25:22 +0200 Subject: [PATCH 259/433] take shortcut to fix #12111 --- src/vs/editor/browser/services/codeEditorServiceImpl.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 9169bfce8f5..800617c85d6 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -6,7 +6,6 @@ import * as objects from 'vs/base/common/objects'; import * as strings from 'vs/base/common/strings'; -import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import {IDecorationRenderOptions, IModelDecorationOptions, IModelDecorationOverviewRulerOptions, IThemeDecorationRenderOptions, IContentDecorationRenderOptions, OverviewRulerLane, TrackedRangeStickiness} from 'vs/editor/common/editorCommon'; @@ -302,7 +301,7 @@ class DecorationRenderHelper { if (typeof opts !== 'undefined') { DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); if (typeof opts.contentIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.parse(opts.contentIconPath).toString())); + cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, opts.contentIconPath)); } if (typeof opts.contentText !== 'undefined') { let escaped = opts.contentText.replace(/\"/g, '\\\"'); @@ -324,7 +323,7 @@ class DecorationRenderHelper { let cssTextArr = []; if (typeof opts.gutterIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.parse(opts.gutterIconPath).toString())); + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconPath)); if (typeof opts.gutterIconSize !== 'undefined') { cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); } From 96a643e63562e3467f824d8e683b138f7a0ffb29 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 15:54:22 +0200 Subject: [PATCH 260/433] fixes #12843 --- .../node/extensionGalleryService.ts | 15 +++++---------- .../extensions/node/extensionValidator.ts | 4 ++-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 08cb336f9a6..50527f7ab70 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -22,7 +22,7 @@ import { IRequestOptions, IRequestContext, download, asJson } from 'vs/base/node import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import pkg from 'vs/platform/package'; import product from 'vs/platform/product'; -import { isValidExtensionVersion, validateVersions } from 'vs/platform/extensions/node/extensionValidator'; +import { isVersionValid } from 'vs/platform/extensions/node/extensionValidator'; import * as url from 'url'; interface IRawGalleryExtensionFile { @@ -257,7 +257,7 @@ function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUr function setCompatibilityProperties(galleryExtension: IGalleryExtension): IGalleryExtension { if (!galleryExtension.compatibilityChecked) { galleryExtension.compatibilityChecked = !!galleryExtension.properties.engine; - galleryExtension.isCompatible = galleryExtension.properties.engine && validateVersions(pkg.version, galleryExtension.properties.engine, []); + galleryExtension.isCompatible = galleryExtension.properties.engine && isVersionValid(pkg.version, galleryExtension.properties.engine); } return galleryExtension; } @@ -520,7 +520,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { if (!engine) { return null; } - if (validateVersions(pkg.version, engine, [])) { + if (isVersionValid(pkg.version, engine, [])) { return TPromise.wrap(version); } } @@ -539,15 +539,10 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return this._getAsset({ url, headers }) .then(context => asJson(context)) .then(manifest => { - const desc = { - isBuiltin: false, - engines: { vscode: manifest.engines.vscode }, - main: manifest.main - }; - - if (!isValidExtensionVersion(pkg.version, desc, [])) { + if (!isVersionValid(pkg.version, manifest.engines.vscode)) { return this.getLastValidExtensionVersionReccursively(extension, versions.slice(1)); } + version.properties = version.properties || []; version.properties.push({ key: PropertyType.Engine, value: manifest.engines.vscode }); return version; diff --git a/src/vs/platform/extensions/node/extensionValidator.ts b/src/vs/platform/extensions/node/extensionValidator.ts index eca48219d31..e3103e2a224 100644 --- a/src/vs/platform/extensions/node/extensionValidator.ts +++ b/src/vs/platform/extensions/node/extensionValidator.ts @@ -194,10 +194,10 @@ export function isValidExtensionVersion(version: string, extensionDesc: IReduced return true; } - return validateVersions(version, extensionDesc.engines.vscode, notices); + return isVersionValid(version, extensionDesc.engines.vscode, notices); } -export function validateVersions(currentVersion: string, requestedVersion: string, notices: string[]): boolean { +export function isVersionValid(currentVersion: string, requestedVersion: string, notices: string[] = []): boolean { let desiredVersion = normalizeVersion(parseVersion(requestedVersion)); if (!desiredVersion) { From 14ea3c491d4029c19f1af2ff30e8dff3bf4ebb79 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 28 Sep 2016 07:53:34 -0700 Subject: [PATCH 261/433] Fix typo/spacing in API doc --- src/vs/vscode.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index f80a8ea9088..a737c7c87af 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2661,12 +2661,12 @@ declare namespace vscode { * from `launch.json`: * * ``` - * // launch.json configuration - * const config = workspace.getConfiguration('launch'); + * // launch.json configuration + * const config = workspace.getConfiguration('launch'); * * // retrieve values - * cont values = config.get('configurations') - *``` + * const values = config.get('configurations'); + * ``` */ export interface WorkspaceConfiguration { From 7c4ab7b51b23a5ff37cbc523086a8d2985441a14 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 16:57:39 +0200 Subject: [PATCH 262/433] Revert "take shortcut to fix #12111" This reverts commit ab6357b397481734e40edab607700c6421e5ea2f. --- src/vs/editor/browser/services/codeEditorServiceImpl.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 800617c85d6..9169bfce8f5 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -6,6 +6,7 @@ import * as objects from 'vs/base/common/objects'; import * as strings from 'vs/base/common/strings'; +import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import {IDecorationRenderOptions, IModelDecorationOptions, IModelDecorationOverviewRulerOptions, IThemeDecorationRenderOptions, IContentDecorationRenderOptions, OverviewRulerLane, TrackedRangeStickiness} from 'vs/editor/common/editorCommon'; @@ -301,7 +302,7 @@ class DecorationRenderHelper { if (typeof opts !== 'undefined') { DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); if (typeof opts.contentIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, opts.contentIconPath)); + cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.parse(opts.contentIconPath).toString())); } if (typeof opts.contentText !== 'undefined') { let escaped = opts.contentText.replace(/\"/g, '\\\"'); @@ -323,7 +324,7 @@ class DecorationRenderHelper { let cssTextArr = []; if (typeof opts.gutterIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconPath)); + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.parse(opts.gutterIconPath).toString())); if (typeof opts.gutterIconSize !== 'undefined') { cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); } From dbf130cde1828fba4516d43b7f45e59dc9c9691c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Sep 2016 16:58:13 +0200 Subject: [PATCH 263/433] fixes #12816 --- build/gulpfile.vscode.js | 2 +- .../electron-browser/releaseNotesEditor.ts | 32 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 035b9651085..5871f0551e4 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -70,7 +70,7 @@ const vscodeResources = [ 'out-build/vs/workbench/parts/git/**/*.html', 'out-build/vs/workbench/parts/git/**/*.sh', 'out-build/vs/workbench/parts/html/browser/webview.html', - 'out-build/vs/workbench/parts/extensions/electron-browser/media/markdown.css', + 'out-build/vs/**/markdown.css', 'out-build/vs/workbench/parts/tasks/**/*.json', 'out-build/vs/workbench/parts/terminal/electron-browser/terminalProcess.js', 'out-build/vs/workbench/services/files/**/*.exe', diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 703797ff75c..8fddc612332 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -21,7 +21,9 @@ import WebView from 'vs/workbench/parts/html/browser/webview'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { asText } from 'vs/base/node/request'; +import { Keybinding } from 'vs/base/common/keybinding'; import { IRequestService } from 'vs/platform/request/common/request'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import product from 'vs/platform/product'; function renderBody(body: string): string { @@ -49,7 +51,8 @@ export class ReleaseNotesEditor extends BaseEditor { @IThemeService private themeService: IThemeService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IRequestService private requestService: IRequestService, - @IOpenerService private openerService: IOpenerService + @IOpenerService private openerService: IOpenerService, + @IKeybindingService private keybindingService: IKeybindingService ) { super(ReleaseNotesEditor.ID, telemetryService); this.disposables = []; @@ -77,6 +80,7 @@ export class ReleaseNotesEditor extends BaseEditor { this.loadContents(() => this.requestService.request({ url }) .then(asText) + .then(text => this.patchKeybindings(text)) .then(marked.parse) .then(renderBody) .then(body => { @@ -114,6 +118,32 @@ export class ReleaseNotesEditor extends BaseEditor { this.contentDisposables.push(toDisposable(() => promise.cancel())); } + private patchKeybindings(text: string): string { + return text.replace(/kb\(([a-z.\d\-]+)\)/gi, (match, kb) => { + const keybinding = this.keybindingService.lookupKeybindings(kb)[0]; + + if (!keybinding) { + return match; + } + + return this.keybindingService.getLabelFor(keybinding); + }).replace(/kbstyle\(([^\)]+)\)/gi, (match, kb) => { + const code = Keybinding.fromUserSettingsLabel(kb); + + if (!code) { + return match; + } + + const keybinding = new Keybinding(code); + + if (!keybinding) { + return match; + } + + return this.keybindingService.getLabelFor(keybinding); + }); + } + layout(): void { // noop } From 48af04a01cd5a7c4b970404184af3d52c01d6625 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 28 Sep 2016 17:49:07 +0200 Subject: [PATCH 264/433] take out panel icons in activity bar --- .../parts/activitybar/activitybarPart.ts | 129 +----------------- .../activitybar/media/activitybarpart.css | 6 - .../browser/parts/activitybar/media/panel.svg | 1 - src/vs/workbench/common/editor.ts | 3 - .../electron-browser/main.contribution.ts | 5 - .../parts/debug/browser/media/repl-panel.svg | 1 - .../parts/debug/browser/media/repl.css | 7 - .../parts/markers/browser/media/markers.css | 7 - .../parts/markers/browser/media/markers.svg | 1 - .../browser/media/output.contribution.css | 8 -- .../parts/output/browser/media/output.svg | 1 - .../electron-browser/media/terminal.css | 53 ------- 12 files changed, 6 insertions(+), 216 deletions(-) delete mode 100755 src/vs/workbench/browser/parts/activitybar/media/panel.svg delete mode 100755 src/vs/workbench/parts/debug/browser/media/repl-panel.svg delete mode 100755 src/vs/workbench/parts/markers/browser/media/markers.svg delete mode 100755 src/vs/workbench/parts/output/browser/media/output.svg delete mode 100644 src/vs/workbench/parts/terminal/electron-browser/media/terminal.css diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index bf42f7a41c4..a9dbf479d3a 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -11,20 +11,13 @@ import {TPromise} from 'vs/base/common/winjs.base'; import {Builder, $} from 'vs/base/browser/builder'; import {Action} from 'vs/base/common/actions'; import errors = require('vs/base/common/errors'); -import {IWorkbenchEditorConfiguration} from 'vs/workbench/common/editor'; import {ActionsOrientation, ActionBar, IActionItem} from 'vs/base/browser/ui/actionbar/actionbar'; import {Registry} from 'vs/platform/platform'; import {IComposite} from 'vs/workbench/common/composite'; -import {IPanel} from 'vs/workbench/common/panel'; -import {ViewletDescriptor, ViewletRegistry, Extensions as ViewletExtensions, Viewlet} from 'vs/workbench/browser/viewlet'; -import {CompositeDescriptor} from 'vs/workbench/browser/composite'; -import {Panel, PanelRegistry, Extensions as PanelExtensions, PanelDescriptor} from 'vs/workbench/browser/panel'; +import {ViewletDescriptor, ViewletRegistry, Extensions as ViewletExtensions} from 'vs/workbench/browser/viewlet'; import {Part} from 'vs/workbench/browser/part'; -import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {ActivityAction, ActivityActionItem} from 'vs/workbench/browser/parts/activitybar/activityAction'; -import {TogglePanelAction} from 'vs/workbench/browser/parts/panel/panelPart'; import {IViewletService} from 'vs/workbench/services/viewlet/common/viewletService'; -import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; import {IActivityService, IBadge} from 'vs/workbench/services/activity/common/activityService'; import {IPartService} from 'vs/workbench/services/part/common/partService'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; @@ -33,20 +26,15 @@ import {IKeybindingService} from 'vs/platform/keybinding/common/keybinding'; export class ActivitybarPart extends Part implements IActivityService { public _serviceBrand: any; private viewletSwitcherBar: ActionBar; - private panelSwitcherBar: ActionBar; private activityActionItems: { [actionId: string]: IActionItem; }; private compositeIdToActions: { [compositeId: string]: ActivityAction; }; - private panelActions: ActivityAction[]; - private togglePanelAction: TogglePanelAction; constructor( id: string, @IViewletService private viewletService: IViewletService, - @IPanelService private panelService: IPanelService, @IKeybindingService private keybindingService: IKeybindingService, @IInstantiationService private instantiationService: IInstantiationService, - @IPartService private partService: IPartService, - @IConfigurationService protected configurationService: IConfigurationService + @IPartService private partService: IPartService ) { super(id); @@ -60,20 +48,9 @@ export class ActivitybarPart extends Part implements IActivityService { // Activate viewlet action on opening of a viewlet this.toUnbind.push(this.viewletService.onDidViewletOpen(viewlet => this.onActiveCompositeChanged(viewlet))); - this.toUnbind.push(this.panelService.onDidPanelOpen(panel => this.onActivePanelChanged(panel))); // Deactivate viewlet action on close this.toUnbind.push(this.viewletService.onDidViewletClose(viewlet => this.onCompositeClosed(viewlet))); - this.toUnbind.push(this.panelService.onDidPanelClose(panel => this.onPanelClosed(panel))); - - this.toUnbind.push(this.configurationService.onDidUpdateConfiguration(e => this.onConfigurationUpdated(e.config))); - - } - - private onConfigurationUpdated(config: IWorkbenchEditorConfiguration): void { - if (this.panelSwitcherBar) { - config.workbench.panels.showInSidebar ? this.panelSwitcherBar.getContainer().show() : this.panelSwitcherBar.getContainer().hide(); - } } private onActiveCompositeChanged(composite: IComposite): void { @@ -82,31 +59,15 @@ export class ActivitybarPart extends Part implements IActivityService { } } - private onActivePanelChanged(panel: IPanel): void { - this.updatePanelSwitcher(); - this.onActiveCompositeChanged(panel); - } - private onCompositeClosed(composite: IComposite): void { if (this.compositeIdToActions[composite.getId()]) { this.compositeIdToActions[composite.getId()].deactivate(); } } - private onPanelClosed(panel: IPanel): void { - this.updatePanelSwitcher(); - this.onCompositeClosed(panel); - } - public showActivity(compositeId: string, badge: IBadge, clazz?: string): void { const action = this.compositeIdToActions[compositeId]; if (action) { - if (action instanceof PanelActivityAction && this.partService.isPanelHidden()) { - // while the panel badges are hidden we show the badge on the parent action which is visible - this.togglePanelAction.setBadge(badge); - return; - } - action.setBadge(badge); if (clazz) { action.class = clazz; @@ -124,7 +85,6 @@ export class ActivitybarPart extends Part implements IActivityService { // Top Actionbar with action items for each viewlet action this.createViewletSwitcher($result.clone()); - this.createPanelSwitcher($result.clone()); return $result; } @@ -146,69 +106,15 @@ export class ActivitybarPart extends Part implements IActivityService { this.viewletSwitcherBar.push(viewletActions, { label: true, icon: true }); } - private createPanelSwitcher(div: Builder): void { - - // Composite switcher is on top - this.panelSwitcherBar = new ActionBar(div, { - actionItemProvider: (action: Action) => this.activityActionItems[action.id], - orientation: ActionsOrientation.VERTICAL, - ariaLabel: nls.localize('activityBarPanelAriaLabel', "Active Panel Switcher") - }); - this.panelSwitcherBar.getContainer().addClass('position-bottom'); - if (!this.configurationService.lookup('workbench.panels.showInSidebar').value) { - this.panelSwitcherBar.getContainer().hide(); - } - - // Build Viewlet Actions in correct order - - const allPanels = (Registry.as(PanelExtensions.Panels)).getPanels(); - - this.togglePanelAction = this.instantiationService.createInstance(TogglePanelAction, TogglePanelAction.ID, TogglePanelAction.LABEL); - this.activityActionItems[this.togglePanelAction.id] = new ActivityActionItem(this.togglePanelAction, TogglePanelAction.LABEL, this.getKeybindingLabel(TogglePanelAction.ID)); - this.panelActions = allPanels.sort((p1, p2) => p1.order - p2.order).map(panel => this.toAction(panel)); - - // Add both viewlet and panel actions to the switcher - this.updatePanelSwitcher(); - } - - private updatePanelSwitcher(): void { - this.panelSwitcherBar.clear(); - this.togglePanelAction.class = this.partService.isPanelHidden() ? 'panel' : 'panel expanded'; - const actions: ActivityAction[] = []; - if (!this.partService.isPanelHidden()) { - actions.push(...this.panelActions); - } - actions.push(this.togglePanelAction); - - this.panelSwitcherBar.push(actions, { label: true, icon: true }); - - // TODO@Isidor fix this aweful badge(r) hacks - if (!this.partService.isPanelHidden()) { - if (!this.panelActions[0].getBadge()) { - this.panelActions[0].setBadge(this.togglePanelAction.getBadge()); - } else { - this.panelActions[0].setBadge(this.panelActions[0].getBadge()); - } - this.togglePanelAction.setBadge(null); - } else { - this.togglePanelAction.setBadge(this.panelActions[0].getBadge()); - if (this.panelActions[0].getBadge()) { - this.panelActions[0].setBadge(null); - } - } - } - - private toAction(composite: CompositeDescriptor): ActivityAction { + private toAction(composite: ViewletDescriptor): ActivityAction { const activeViewlet = this.viewletService.getActiveViewlet(); - const activePanel = this.panelService.getActivePanel(); - const action = composite instanceof ViewletDescriptor ? this.instantiationService.createInstance(ViewletActivityAction, composite.id + '.activity-bar-action', composite) - : this.instantiationService.createInstance(PanelActivityAction, (composite).id + '.activity-bar-action', composite); + const action = this.instantiationService.createInstance(ViewletActivityAction, composite.id + '.activity-bar-action', composite); this.activityActionItems[action.id] = new ActivityActionItem(action, composite.name, this.getKeybindingLabel(composite.id)); this.compositeIdToActions[composite.id] = action; - // Mark active viewlet and panel action as active - if (activeViewlet && activeViewlet.getId() === composite.id || activePanel && activePanel.getId() === composite.id) { + // Mark active viewlet as active + if (activeViewlet && activeViewlet.getId() === composite.id) { action.activate(); } @@ -230,15 +136,6 @@ export class ActivitybarPart extends Part implements IActivityService { this.viewletSwitcherBar = null; } - if (this.panelSwitcherBar) { - this.panelSwitcherBar.dispose(); - this.panelSwitcherBar = null; - } - - if (this.togglePanelAction) { - this.togglePanelAction.dispose(); - } - super.dispose(); } } @@ -278,17 +175,3 @@ class ViewletActivityAction extends ActivityAction { return TPromise.as(true); } } - -class PanelActivityAction extends ActivityAction { - - constructor( - id: string, private panel: PanelDescriptor, - @IPanelService private panelService: IPanelService - ) { - super(id, panel.name, panel.cssClass); - } - - public run(): TPromise { - return this.panelService.openPanel(this.panel.id, true).then(() => this.activate()); - } -} diff --git a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css index f1481906e34..2b06c3d4a9c 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css @@ -3,12 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-workbench > .activitybar .monaco-action-bar .action-label.panel { - background: url('panel.svg') center center no-repeat; - background-position: 50% !important; - background-size: 32px; -} - .monaco-workbench > .activitybar .monaco-action-bar .action-label.panel.expanded { transform: rotate(180deg); } diff --git a/src/vs/workbench/browser/parts/activitybar/media/panel.svg b/src/vs/workbench/browser/parts/activitybar/media/panel.svg deleted file mode 100755 index 88c05455cb3..00000000000 --- a/src/vs/workbench/browser/parts/activitybar/media/panel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 47ea31aa5bb..b25dccd6e9d 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -884,9 +884,6 @@ export interface IWorkbenchEditorConfiguration { enablePreview: boolean; enablePreviewFromQuickOpen: boolean; openPositioning: string; - }, - panels: { - showInSidebar: boolean } }; } diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 285188bce6f..57379719433 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -109,11 +109,6 @@ configurationRegistry.registerConfiguration({ 'type': 'boolean', 'description': nls.localize('openDefaultSettings', "Controls if opening settings also opens an editor showing all default settings."), 'default': true - }, - 'workbench.panels.showInSidebar': { - 'type': 'boolean', - 'description': nls.localize('panelsShowInSidebar', "Controls if panel icons are shown in the sidebar below the viewlet icons."), - 'default': false } } }); diff --git a/src/vs/workbench/parts/debug/browser/media/repl-panel.svg b/src/vs/workbench/parts/debug/browser/media/repl-panel.svg deleted file mode 100755 index 2bbbdd6cde0..00000000000 --- a/src/vs/workbench/parts/debug/browser/media/repl-panel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/debug/browser/media/repl.css b/src/vs/workbench/parts/debug/browser/media/repl.css index 2f3a298a195..da25304d6af 100644 --- a/src/vs/workbench/parts/debug/browser/media/repl.css +++ b/src/vs/workbench/parts/debug/browser/media/repl.css @@ -5,13 +5,6 @@ /* Debug repl */ -/* Activity Bar */ -.monaco-workbench > .activitybar .monaco-action-bar .action-label.repl { - background: url('repl-panel.svg') center center no-repeat; - background-position: 50% !important; - background-size: 32px; -} - .monaco-workbench .repl { height: 100%; position: relative; diff --git a/src/vs/workbench/parts/markers/browser/media/markers.css b/src/vs/workbench/parts/markers/browser/media/markers.css index 3e46357bb35..491e4ac3590 100644 --- a/src/vs/workbench/parts/markers/browser/media/markers.css +++ b/src/vs/workbench/parts/markers/browser/media/markers.css @@ -3,13 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/* Activity Bar */ -.monaco-workbench > .activitybar .monaco-action-bar .action-label.markersPanel { - background: url('markers.svg') center center no-repeat; - background-position: 50% !important; - background-size: 32px; -} - .monaco-action-bar .action-item.markers-panel-action-filter { max-width: 400px; min-width: 100px; diff --git a/src/vs/workbench/parts/markers/browser/media/markers.svg b/src/vs/workbench/parts/markers/browser/media/markers.svg deleted file mode 100755 index 891a04fb389..00000000000 --- a/src/vs/workbench/parts/markers/browser/media/markers.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/output/browser/media/output.contribution.css b/src/vs/workbench/parts/output/browser/media/output.contribution.css index a1c1e78a40d..093845880a3 100644 --- a/src/vs/workbench/parts/output/browser/media/output.contribution.css +++ b/src/vs/workbench/parts/output/browser/media/output.contribution.css @@ -3,14 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/* Activity Bar */ -.monaco-workbench > .activitybar .monaco-action-bar .action-label.output { - background: url('output.svg') center center no-repeat; - background-position: 50% !important; - background-size: 32px; -} - - .monaco-workbench .output-action.clear-output { background: url('clear_output.svg') center center no-repeat; } diff --git a/src/vs/workbench/parts/output/browser/media/output.svg b/src/vs/workbench/parts/output/browser/media/output.svg deleted file mode 100755 index 64df3e65896..00000000000 --- a/src/vs/workbench/parts/output/browser/media/output.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css deleted file mode 100644 index e5df15640be..00000000000 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ /dev/null @@ -1,53 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/* Activity Bar */ -.monaco-workbench > .activitybar .monaco-action-bar .action-label.terminal { - background: url('terminal.svg') center center no-repeat; - background-position: 50% !important; - background-size: 32px; -} - -.monaco-workbench .panel.integrated-terminal { - align-content: flex-start; - align-items: baseline; - display: flex; - flex-direction: column; - background-color: transparent!important; - color: #333; - -webkit-user-select: initial; - overflow: hidden; /* prevents the terminal output being incorrectly placed over the title */ -} -.vs-dark .monaco-workbench .panel.integrated-terminal { color: #CCC; } -.hc-black .monaco-workbench .panel.integrated-terminal { color: #FFF; } - -.monaco-workbench .panel.integrated-terminal .terminal-outer-container { - height: 100%; - padding: 0 20px; - width: 100%; -} - -.monaco-workbench .panel.integrated-terminal .terminal-wrapper { - display: none; -} -.monaco-workbench .panel.integrated-terminal .terminal-wrapper.active { - display: block; - position: absolute; - bottom: 0; -} - -/* Terminal actions */ - -/* Light theme */ -.monaco-workbench .terminal-action.kill { background: url('kill.svg') center center no-repeat; } -.monaco-workbench .terminal-action.new { background: url('new.svg') center center no-repeat; } -/* Dark theme / HC theme */ -.vs-dark .monaco-workbench .terminal-action.kill, .hc-black .monaco-workbench .terminal-action.kill { background: url('kill-inverse.svg') center center no-repeat; } -.vs-dark .monaco-workbench .terminal-action.new, .hc-black .monaco-workbench .terminal-action.new { background: url('new-inverse.svg') center center no-repeat; } - -.vs-dark .monaco-workbench.mac .panel.integrated-terminal .xterm-rows, -.hc-black .monaco-workbench.mac .panel.integrated-terminal .xterm-rows { - cursor: -webkit-image-set(url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAL0lEQVQoz2NgCD3x//9/BhBYBWdhgFVAiVW4JBFKGIa4AqD0//9D3pt4I4tAdAMAHTQ/j5Zom30AAAAASUVORK5CYII=') 1x, url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVRIx2NgYGBY/R8I/vx5eelX3n82IJ9FxGf6tksvf/8FiTMQAcAGQMDvSwu09abffY8QYSAScNk45G198eX//yev73/4///701eh//kZSARckrNBRvz//+8+6ZohwCzjGNjdgQxkAg7B9WADeBjIBqtJCbhRA0YNoIkBSNmaPEMoNmA0FkYNoFKhapJ6FGyAH3nauaSmPfwI0v/3OukVi0CIZ+F25KrtYcx/CTIy0e+rC7R1Z4KMICVTQQ14feVXIbR695u14+Ir4gwAAD49E54wc1kWAAAAAElFTkSuQmCC') 2x) 5 8, text; -} \ No newline at end of file From 5ad1483b638a7de01b532ec6d04764bddeb2d581 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 28 Sep 2016 18:06:59 +0200 Subject: [PATCH 265/433] fix #12750 --- extensions/javascript/syntaxes/JavaScript.tmLanguage.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index dbc98e32af3..b9b3ded6389 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -498,7 +498,7 @@ "include": "#jsx-tag-invalid" }, { - "begin": "(?<=(?:'|\"|})>)", + "begin": "(?)(?<=(?:'|\"|})>)", "end": "(?= Date: Wed, 28 Sep 2016 18:26:51 +0200 Subject: [PATCH 266/433] handle unhandled promise error --- src/vs/editor/contrib/links/browser/links.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index 569f2f5c0b3..bcc74358c73 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -273,7 +273,7 @@ class LinkDetector implements editorCommon.IEditorContribution { } else { onUnexpectedError(err); } - }); + }).done(null, onUnexpectedError); } public getLinkOccurence(position: editorCommon.IPosition): LinkOccurence { From d7e7e35d73cdbd91f96fcc69ec5c64891963fd6b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 28 Sep 2016 18:36:43 +0200 Subject: [PATCH 267/433] fix #12896 --- .../platform/opener/browser/openerService.ts | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/src/vs/platform/opener/browser/openerService.ts b/src/vs/platform/opener/browser/openerService.ts index 7d08710899c..73fa56736b8 100644 --- a/src/vs/platform/opener/browser/openerService.ts +++ b/src/vs/platform/opener/browser/openerService.ts @@ -45,27 +45,22 @@ export class OpenerService implements IOpenerService { promise = this._commandService.executeCommand(path, ...args); } else { - promise = this._editorService.resolveEditorModel({ resource }).then(model => { - if (!model) { - return; - } - let selection: { - startLineNumber: number; - startColumn: number; + let selection: { + startLineNumber: number; + startColumn: number; + }; + const match = /^L?(\d+)(?:,(\d+))?/.exec(fragment); + if (match) { + // support file:///some/file.js#73,84 + // support file:///some/file.js#L73 + selection = { + startLineNumber: parseInt(match[1]), + startColumn: match[2] ? parseInt(match[2]) : 1 }; - const match = /^L?(\d+)(?:,(\d+))?/.exec(fragment); - if (match) { - // support file:///some/file.js#73,84 - // support file:///some/file.js#L73 - selection = { - startLineNumber: parseInt(match[1]), - startColumn: match[2] ? parseInt(match[2]) : 1 - }; - // remove fragment - resource = resource.with({ fragment: '' }); - } - return this._editorService.openEditor({ resource, options: { selection, } }, options && options.openToSide); - }); + // remove fragment + resource = resource.with({ fragment: '' }); + } + promise = this._editorService.openEditor({ resource, options: { selection, } }, options && options.openToSide); } return TPromise.as(promise); From 5b3afc132ef5d50670c1c43a2b9650da532f20e8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 28 Sep 2016 18:41:23 +0200 Subject: [PATCH 268/433] fix build issue --- .../parts/terminal/electron-browser/terminal.contribution.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 83eec986419..c273ba093fc 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/scrollbar'; -import 'vs/css!./media/terminal'; import 'vs/css!./media/xterm'; import * as panel from 'vs/workbench/browser/panel'; import * as platform from 'vs/base/common/platform'; From 180a5c6c2d75648c1066037736cf601146b4186b Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 28 Sep 2016 11:30:06 -0700 Subject: [PATCH 269/433] Show only first keybinding (fixes #12862) --- src/vs/workbench/parts/watermark/watermark.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/watermark/watermark.ts b/src/vs/workbench/parts/watermark/watermark.ts index 380ae70fe6e..b91a6dbaea2 100644 --- a/src/vs/workbench/parts/watermark/watermark.ts +++ b/src/vs/workbench/parts/watermark/watermark.ts @@ -48,9 +48,9 @@ export function create(container: Builder, keybindingService: IKeybindingService dl.element('dt', {}, dt => dt.text(entry.text)); dl.element('dd', {}, dd => dd.text( entry.ids - .map(id => keybindingService.lookupKeybindings(id) + .map(id => keybindingService.lookupKeybindings(id).slice(0, 1) .map(k => keybindingService.getLabelFor(k)) - .join(' or ') || UNBOUND) + .join('') || UNBOUND) .join(' or ') )); })); From f1568a90b9ebd212b3d45524ed982b4c208f8a3b Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 28 Sep 2016 11:34:48 -0700 Subject: [PATCH 270/433] Update QuickOpen label in watermark (#12716) --- src/vs/workbench/parts/watermark/watermark.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/watermark/watermark.ts b/src/vs/workbench/parts/watermark/watermark.ts index b91a6dbaea2..4598e5af7b5 100644 --- a/src/vs/workbench/parts/watermark/watermark.ts +++ b/src/vs/workbench/parts/watermark/watermark.ts @@ -16,7 +16,7 @@ const entries = [ ids: ['workbench.action.showCommands'] }, { - text: nls.localize('watermark.quickOpen', "Open File in Folder"), + text: nls.localize('watermark.quickOpen', "Go to File"), ids: ['workbench.action.quickOpen'] }, { @@ -51,7 +51,7 @@ export function create(container: Builder, keybindingService: IKeybindingService .map(id => keybindingService.lookupKeybindings(id).slice(0, 1) .map(k => keybindingService.getLabelFor(k)) .join('') || UNBOUND) - .join(' or ') + .join(' / ') )); })); } From 6bc8185b454d276c09b8b78eb59f163be15b266e Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 28 Sep 2016 12:56:39 -0700 Subject: [PATCH 271/433] Center watermark commands (#12779) --- .../workbench/parts/watermark/watermark.css | 22 +++++++++---------- src/vs/workbench/parts/watermark/watermark.ts | 20 +++++++++-------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/parts/watermark/watermark.css b/src/vs/workbench/parts/watermark/watermark.css index cbafeaad260..bb4845c900d 100644 --- a/src/vs/workbench/parts/watermark/watermark.css +++ b/src/vs/workbench/parts/watermark/watermark.css @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-workbench .part.editor.empty.watermark-tips { +.monaco-workbench .part.editor.empty.has-watermark { background-position-y: calc(50% - 100px); transition: background-position-y 1s; } @@ -12,6 +12,13 @@ position: absolute; width: 100%; top: calc(50% + 55px); + text-align: center; +} + +.monaco-workbench > .part.editor > .watermark > .watermark-box { + display: inline-table; + border-collapse: separate; + border-spacing: 13px 17px; } @keyframes watermarkfadein { @@ -38,36 +45,29 @@ .monaco-workbench > .part.editor > .watermark { opacity: 0; } - .monaco-workbench .part.editor.empty.watermark-tips { + .monaco-workbench .part.editor.empty.has-watermark { background-position-y: 50%; } } .monaco-workbench > .part.editor > .watermark dl { - width: 100%; + display: table-row; opacity: .8; cursor: default; } .monaco-workbench > .part.editor > .watermark dt { - clear: left; - float: left; - width: 49%; - margin: 0 1% 0 0; text-align: right; font-weight: bold; } .monaco-workbench > .part.editor > .watermark dd { - float: left; - width: 49%; - margin: 0 0 0 1%; text-align: left; } .monaco-workbench > .part.editor > .watermark dt, .monaco-workbench > .part.editor > .watermark dd { - margin-bottom: 17px; + display: table-cell; } .monaco-workbench > .part.editor > .watermark dt, diff --git a/src/vs/workbench/parts/watermark/watermark.ts b/src/vs/workbench/parts/watermark/watermark.ts index 4598e5af7b5..353f7a11184 100644 --- a/src/vs/workbench/parts/watermark/watermark.ts +++ b/src/vs/workbench/parts/watermark/watermark.ts @@ -36,15 +36,16 @@ const entries = [ const UNBOUND = nls.localize('watermark.unboundCommand', "unbound"); export function create(container: Builder, keybindingService: IKeybindingService): IDisposable { - const div = $(container) - .div({ - 'class': 'watermark', - }); + const watermark = $(container) + .addClass('has-watermark') + .div({ 'class': 'watermark' }); + const box = $(watermark) + .div({ 'class': 'watermark-box' }); function update() { - container.addClass('watermark-tips'); - $(div).clearChildren() - .element('dl', { - }, dl => entries.map(entry => { + const builder = $(box); + builder.clearChildren(); + entries.map(entry => { + builder.element('dl', {}, dl => { dl.element('dt', {}, dt => dt.text(entry.text)); dl.element('dd', {}, dd => dd.text( entry.ids @@ -53,7 +54,8 @@ export function create(container: Builder, keybindingService: IKeybindingService .join('') || UNBOUND) .join(' / ') )); - })); + }); + }); } update(); return keybindingService.onDidUpdateKeybindings(update); From 51b7ed3a217fabe9ce56101fdd819762701afab4 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 28 Sep 2016 14:21:28 -0700 Subject: [PATCH 272/433] Add Space After Default Extension Queries Issue #12924 Adds a space after the default extension search queries so that users can start typing a query term right away Closes #12924 --- .../extensions/electron-browser/extensionsActions.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index 890e09a6f52..abb507a7d21 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -436,7 +436,7 @@ export class ShowOutdatedExtensionsAction extends Action { return this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) .then(viewlet => { - viewlet.search('@outdated'); + viewlet.search('@outdated '); viewlet.focus(); }); } @@ -463,7 +463,7 @@ export class ShowPopularExtensionsAction extends Action { return this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) .then(viewlet => { - viewlet.search('@sort:installs'); + viewlet.search('@sort:installs '); viewlet.focus(); }); } @@ -490,7 +490,7 @@ export class ShowRecommendedExtensionsAction extends Action { return this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) .then(viewlet => { - viewlet.search('@recommended'); + viewlet.search('@recommended '); viewlet.focus(); }); } @@ -517,7 +517,7 @@ export class ShowWorkspaceRecommendedExtensionsAction extends Action { return this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) .then(viewlet => { - viewlet.search('@recommended:workspace'); + viewlet.search('@recommended:workspace '); viewlet.focus(); }); } From 411aa687f1a5bb35c6ec7a1a8ebbfef9c3b3ec9a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 28 Sep 2016 14:32:55 -0700 Subject: [PATCH 273/433] Revert "fix build issue" This reverts commit 5b3afc132ef5d50670c1c43a2b9650da532f20e8. --- .../parts/terminal/electron-browser/terminal.contribution.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index c273ba093fc..83eec986419 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/scrollbar'; +import 'vs/css!./media/terminal'; import 'vs/css!./media/xterm'; import * as panel from 'vs/workbench/browser/panel'; import * as platform from 'vs/base/common/platform'; From 6616c2d6eeb83c8f579ee88a5f0657c4a7520016 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 28 Sep 2016 14:34:57 -0700 Subject: [PATCH 274/433] Add terminal.css back --- .../electron-browser/media/terminal.css | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/vs/workbench/parts/terminal/electron-browser/media/terminal.css diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css new file mode 100644 index 00000000000..0c92426d71e --- /dev/null +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/* Activity Bar */ +.monaco-workbench > .activitybar .monaco-action-bar .action-label.terminal { + background: url('terminal.svg') center center no-repeat; + background-position: 50% !important; + background-size: 32px; +} + +.monaco-workbench .panel.integrated-terminal { + align-content: flex-start; + align-items: baseline; + display: flex; + flex-direction: column; + background-color: transparent!important; + color: #333; + -webkit-user-select: initial; + overflow: hidden; /* prevents the terminal output being incorrectly placed over the title */ +} +.vs-dark .monaco-workbench .panel.integrated-terminal { color: #CCC; } +.hc-black .monaco-workbench .panel.integrated-terminal { color: #FFF; } + +.monaco-workbench .panel.integrated-terminal .terminal-outer-container { + height: 100%; + padding: 0 20px; + width: 100%; +} + +.monaco-workbench .panel.integrated-terminal .terminal-wrapper { + display: none; +} +.monaco-workbench .panel.integrated-terminal .terminal-wrapper.active { + display: block; + position: absolute; + bottom: 0; +} + +/* Terminal actions */ + +/* Light theme */ +.monaco-workbench .terminal-action.kill { background: url('kill.svg') center center no-repeat; } +.monaco-workbench .terminal-action.new { background: url('new.svg') center center no-repeat; } +/* Dark theme / HC theme */ +.vs-dark .monaco-workbench .terminal-action.kill, .hc-black .monaco-workbench .terminal-action.kill { background: url('kill-inverse.svg') center center no-repeat; } +.vs-dark .monaco-workbench .terminal-action.new, .hc-black .monaco-workbench .terminal-action.new { background: url('new-inverse.svg') center center no-repeat; } + +.vs-dark .monaco-workbench.mac .panel.integrated-terminal .xterm-rows, +.hc-black .monaco-workbench.mac .panel.integrated-terminal .xterm-rows { + cursor: -webkit-image-set(url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAL0lEQVQoz2NgCD3x//9/BhBYBWdhgFVAiVW4JBFKGIa4AqD0//9D3pt4I4tAdAMAHTQ/j5Zom30AAAAASUVORK5CYII=') 1x, url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVRIx2NgYGBY/R8I/vx5eelX3n82IJ9FxGf6tksvf/8FiTMQAcAGQMDvSwu09abffY8QYSAScNk45G198eX//yev73/4///701eh//kZSARckrNBRvz//+8+6ZohwCzjGNjdgQxkAg7B9WADeBjIBqtJCbhRA0YNoIkBSNmaPEMoNmA0FkYNoFKhapJ6FGyAH3nauaSmPfwI0v/3OukVi0CIZ+F25KrtYcx/CTIy0e+rC7R1Z4KMICVTQQ14feVXIbR695u14+Ir4gwAAD49E54wc1kWAAAAAElFTkSuQmCC') 2x) 5 8, text; +} From 2056b3947ebee34afd2d283a928bd68f346fcd2a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 28 Sep 2016 14:40:08 -0700 Subject: [PATCH 275/433] Fix terminal layout issue when status bar is hidden Fixes #12920 --- .../workbench/parts/terminal/electron-browser/media/terminal.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css index 0c92426d71e..4436fa44304 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -19,6 +19,7 @@ color: #333; -webkit-user-select: initial; overflow: hidden; /* prevents the terminal output being incorrectly placed over the title */ + position: relative; } .vs-dark .monaco-workbench .panel.integrated-terminal { color: #CCC; } .hc-black .monaco-workbench .panel.integrated-terminal { color: #FFF; } From b549ec6c4b9a796844607f4fc7ef68c72371c545 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 28 Sep 2016 14:47:06 -0700 Subject: [PATCH 276/433] Include trailing slash in basename trivia (#12624) --- src/vs/base/common/glob.ts | 19 +++++++++---------- src/vs/base/test/common/glob.test.ts | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/vs/base/common/glob.ts b/src/vs/base/common/glob.ts index c6d01f0376a..433876df191 100644 --- a/src/vs/base/common/glob.ts +++ b/src/vs/base/common/glob.ts @@ -210,9 +210,9 @@ function parseRegExp(pattern: string): string { // regexes to check for trival glob patterns that just check for String#endsWith const T1 = /^\*\*\/\*\.[\w\.-]+$/; // **/*.something -const T2 = /^\*\*\/[\w\.-]+$/; // **/something -const T3 = /^{\*\*\/[\*\.]?[\w\.-]+(,\*\*\/[\*\.]?[\w\.-]+)*}$/; // {**/*.something,**/*.else} or {**/package.json,**/project.json} -const T3_2 = /^{\*\*\/[\*\.]?[\w\.-]+(\/\*\*)?(,\*\*\/[\*\.]?[\w\.-]+(\/\*\*)?)*}$/; // Like T3, with optional trailing /** +const T2 = /^\*\*\/([\w\.-]+)\/?$/; // **/something +const T3 = /^{\*\*\/[\*\.]?[\w\.-]+\/?(,\*\*\/[\*\.]?[\w\.-]+\/?)*}$/; // {**/*.something,**/*.else} or {**/package.json,**/project.json} +const T3_2 = /^{\*\*\/[\*\.]?[\w\.-]+(\/(\*\*)?)?(,\*\*\/[\*\.]?[\w\.-]+(\/(\*\*)?)?)*}$/; // Like T3, with optional trailing /** export type ParsedPattern = (path: string, basename?: string) => boolean; export type ParsedExpression = (path: string, basename?: string, siblingsFn?: () => string[]) => string /* the matching pattern */; @@ -260,16 +260,16 @@ function parsePattern(pattern: string, options: IGlobOptions): ParsedStringPatte } // Check for Trivias - let trimmedPattern; + let match: RegExpExecArray; if (T1.test(pattern)) { // common pattern: **/*.txt just need endsWith check const base = pattern.substr(4); // '**/*'.length === 4 parsedPattern = function (path, basename) { return path && strings.endsWith(path, base) ? pattern : null; }; - } else if (T2.test(pattern)) { // common pattern: **/some.txt just need basename check - parsedPattern = trivia2(pattern, pattern); - } else if (options.trimForExclusions && strings.endsWith(pattern, '/**') && T2.test(trimmedPattern = pattern.substr(0, pattern.length - 3))) { // common pattern: **/some/** for exclusions just need basename check - parsedPattern = trivia2(trimmedPattern, pattern); + } else if (match = T2.exec(pattern)) { // common pattern: **/some.txt just need basename check + parsedPattern = trivia2(match[1], pattern); + } else if (options.trimForExclusions && strings.endsWith(pattern, '/**') && (match = T2.exec(pattern.substr(0, pattern.length - 2)))) { // common pattern: **/some/** for exclusions just need basename check + parsedPattern = trivia2(match[1], pattern); } else if ((options.trimForExclusions ? T3_2 : T3).test(pattern)) { // repetition of common patterns (see above) {**/*.txt,**/*.png} const parsedPatterns = aggregateBasenameMatches(pattern.slice(1, -1).split(',') .map(pattern => parsePattern(pattern, options)) @@ -307,8 +307,7 @@ function parsePattern(pattern: string, options: IGlobOptions): ParsedStringPatte } // common pattern: **/some.txt just need basename check -function trivia2(pattern, originalPattern): ParsedStringPattern { - const base = pattern.substr(3); // '**/'.length === 3 +function trivia2(base: string, originalPattern: string): ParsedStringPattern { const slashBase = `/${base}`; const backslashBase = `\\${base}`; const parsedPattern: ParsedStringPattern = function (path, basename) { diff --git a/src/vs/base/test/common/glob.test.ts b/src/vs/base/test/common/glob.test.ts index e71b4ab1548..436e1f9c5a6 100644 --- a/src/vs/base/test/common/glob.test.ts +++ b/src/vs/base/test/common/glob.test.ts @@ -700,13 +700,16 @@ suite('Glob', () => { test('expression/pattern basename terms', function () { assert.deepStrictEqual(glob.getBasenameTerms(glob.parse('**/*.foo')), []); assert.deepStrictEqual(glob.getBasenameTerms(glob.parse('**/foo')), ['foo']); + assert.deepStrictEqual(glob.getBasenameTerms(glob.parse('**/foo/')), ['foo']); assert.deepStrictEqual(glob.getBasenameTerms(glob.parse('{**/baz,**/foo}')), ['baz', 'foo']); + assert.deepStrictEqual(glob.getBasenameTerms(glob.parse('{**/baz/,**/foo/}')), ['baz', 'foo']); assert.deepStrictEqual(glob.getBasenameTerms(glob.parse({ '**/foo': true, '{**/bar,**/baz}': true, + '{**/bar2/,**/baz2/}': true, '**/bulb': false - })), ['foo', 'bar', 'baz']); + })), ['foo', 'bar', 'baz', 'bar2', 'baz2']); assert.deepStrictEqual(glob.getBasenameTerms(glob.parse({ '**/foo': { when: '$(basename).zip' }, '**/bar': true @@ -754,4 +757,18 @@ suite('Glob', () => { assert.strictEqual(parsed(text, null, siblingsFns[i]), result); }); } + + test('trailing slash', function () { + // Testing existing (more or less intuitive) behavior + assert.strictEqual(glob.parse('**/foo/')('bar/baz', 'baz'), false); + assert.strictEqual(glob.parse('**/foo/')('bar/foo', 'foo'), true); + assert.strictEqual(glob.parse('**/*.foo/')('bar/file.baz', 'file.baz'), false); + assert.strictEqual(glob.parse('**/*.foo/')('bar/file.foo', 'file.foo'), true); + assert.strictEqual(glob.parse('{**/foo/,**/abc/}')('bar/baz', 'baz'), false); + assert.strictEqual(glob.parse('{**/foo/,**/abc/}')('bar/foo', 'foo'), true); + assert.strictEqual(glob.parse('{**/foo/,**/abc/}')('bar/abc', 'abc'), true); + assert.strictEqual(glob.parse('{**/foo/,**/abc/}', { trimForExclusions: true })('bar/baz', 'baz'), false); + assert.strictEqual(glob.parse('{**/foo/,**/abc/}', { trimForExclusions: true })('bar/foo', 'foo'), true); + assert.strictEqual(glob.parse('{**/foo/,**/abc/}', { trimForExclusions: true })('bar/abc', 'abc'), true); + }); }); \ No newline at end of file From a152d8e195ae5691e1d76989336c959e78b78408 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 28 Sep 2016 15:00:41 -0700 Subject: [PATCH 277/433] Change default terminal page keybindings to work without shift Fixes #12809 --- .../terminal/electron-browser/terminal.contribution.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 83eec986419..e89ef6e0def 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -160,13 +160,15 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownTermin linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Line)', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownPageTerminalAction, ScrollDownPageTerminalAction.ID, ScrollDownPageTerminalAction.LABEL, { - primary: KeyMod.Shift | KeyCode.PageDown + primary: KeyMod.Shift | KeyCode.PageDown, + mac: { primary: KeyCode.PageDown } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Page)', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpTerminalAction, ScrollUpTerminalAction.ID, ScrollUpTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.UpArrow, linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow }, }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Line)', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpPageTerminalAction, ScrollUpPageTerminalAction.ID, ScrollUpPageTerminalAction.LABEL, { - primary: KeyMod.Shift | KeyCode.PageUp + primary: KeyMod.Shift | KeyCode.PageUp, + mac: { primary: KeyCode.PageUp } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Page)', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ClearTerminalAction, ClearTerminalAction.ID, ClearTerminalAction.LABEL), 'Terminal: Clear', category); From 989905ee4726dee1aa2542b496d27ed392f31057 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 29 Sep 2016 01:05:03 +0200 Subject: [PATCH 278/433] fix #12931 --- .../common/extensionManagement.ts | 2 ++ .../test/common/extensionManagement.test.ts | 29 +++++++++++++++++++ .../electron-browser/extensionTipsService.ts | 6 +++- .../extensionsFileTemplate.ts | 5 +++- 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index b5f62c98da6..cf442e6c925 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -12,6 +12,8 @@ import { IPager } from 'vs/base/common/paging'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IRequestContext } from 'vs/base/node/request'; +export const EXTENSION_IDENTIFIER_PATTERN = '^[a-z0-9A-Z][a-z0-9\-A-Z]*\\.[a-z0-9A-Z][a-z0-9\-A-Z]*$'; + export interface ICommand { command: string; title: string; diff --git a/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts b/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts new file mode 100644 index 00000000000..75794b5171b --- /dev/null +++ b/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import {EXTENSION_IDENTIFIER_PATTERN} from 'vs/platform/extensionManagement/common/extensionManagement'; + +suite('Extension Identifier Pattern', () => { + + test('extension identifier pattern', () => { + var regEx = new RegExp(EXTENSION_IDENTIFIER_PATTERN); + assert.equal(true, regEx.test('publisher.name')); + assert.equal(true, regEx.test('publiSher.name')); + assert.equal(true, regEx.test('publisher.Name')); + assert.equal(true, regEx.test('PUBLISHER.NAME')); + assert.equal(true, regEx.test('PUBLISHEr.NAMe')); + assert.equal(true, regEx.test('PUBLISHEr.N-AMe')); + assert.equal(true, regEx.test('PUBLISH12Er90.N-A54Me123')); + assert.equal(true, regEx.test('111PUBLISH12Er90.N-1111A54Me123')); + assert.equal(false, regEx.test('publishername')); + assert.equal(false, regEx.test('-publisher.name')); + assert.equal(false, regEx.test('publisher.-name')); + assert.equal(false, regEx.test('-publisher.-name')); + assert.equal(false, regEx.test('publ_isher.name')); + assert.equal(false, regEx.test('publisher._name')); + }); +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 87d31a4e598..6dc6589d68e 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import {forEach} from 'vs/base/common/collections'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import {match} from 'vs/base/common/glob'; -import {IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, LocalExtensionType} from 'vs/platform/extensionManagement/common/extensionManagement'; +import {IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, LocalExtensionType, EXTENSION_IDENTIFIER_PATTERN} from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionsConfiguration, ConfigurationKey } from './extensions'; import {IModelService} from 'vs/editor/common/services/modelService'; import {IModel} from 'vs/editor/common/editorCommon'; @@ -49,6 +49,10 @@ export class ExtensionTipsService implements IExtensionTipsService { getWorkspaceRecommendations(): string[] { const configuration = this.configurationService.getConfiguration(ConfigurationKey); + if (configuration.recommendations) { + const regEx = new RegExp(EXTENSION_IDENTIFIER_PATTERN); + return configuration.recommendations.filter(recommendation => regEx.test(recommendation)); + } return configuration.recommendations || []; } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.ts index eb6520b8e69..6588bff30ca 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.ts @@ -5,6 +5,7 @@ import { localize } from 'vs/nls'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; +import { EXTENSION_IDENTIFIER_PATTERN } from 'vs/platform/extensionManagement/common/extensionManagement'; export const SchemaId = 'vscode://schemas/extensions'; export const Schema: IJSONSchema = { @@ -14,10 +15,12 @@ export const Schema: IJSONSchema = { properties: { recommendations: { type: 'array', - description: localize('app.extensions.json.recommendations', "List of extensions recommendations. The identifier of an extension is always ${publisher}.${name}. For example: vscode.csharp."), + description: localize('app.extensions.json.recommendations', "List of extensions recommendations. The identifier of an extension is always '${publisher}.${name}'. For example: 'vscode.csharp'."), items: { type: 'string', defaultSnippets: [{ label: 'Example', body: 'vscode.csharp' }], + pattern: EXTENSION_IDENTIFIER_PATTERN, + errorMessage: localize('app.extension.identifier.errorMessage', "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'.") }, }, } From a6d6ea86dbce9777720eb6da4d14bbcbbb57cc65 Mon Sep 17 00:00:00 2001 From: roblou Date: Wed, 28 Sep 2016 17:02:49 -0700 Subject: [PATCH 279/433] Take latest node-debug2 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 5871f0551e4..9caa046b780 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -40,7 +40,7 @@ const nodeModules = ['electron', 'original-fs'] const builtInExtensions = [ { name: 'ms-vscode.node-debug', version: '1.6.7' }, - { name: 'ms-vscode.node-debug2', version: '0.0.6' } + { name: 'ms-vscode.node-debug2', version: '0.0.7' } ]; const vscodeEntryPoints = _.flatten([ From 2b564896915073ae1311fab8df190f62526c6733 Mon Sep 17 00:00:00 2001 From: kieferrm Date: Wed, 28 Sep 2016 18:27:17 -0700 Subject: [PATCH 280/433] scrolling issue #12562 --- src/vs/workbench/parts/html/browser/htmlPreviewPart.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts b/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts index ae80329ef48..93aef5db654 100644 --- a/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts +++ b/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts @@ -149,7 +149,8 @@ export class HtmlPreviewPart extends BaseEditor { } return super.setInput(input, options).then(() => { - return this._editorService.resolveEditorModel({ resource: (input).getResource() }).then(model => { + let resourceUri = (input).getResource(); + return this._editorService.resolveEditorModel({ resource: resourceUri }).then(model => { if (model instanceof BaseTextEditorModel) { this._model = model.textEditorModel; } @@ -157,6 +158,7 @@ export class HtmlPreviewPart extends BaseEditor { return TPromise.wrapError(localize('html.voidInput', "Invalid editor input.")); } this._modelChangeSubscription = this._model.onDidChangeContent(() => this.webview.contents = this._model.getLinesContent()); + this.webview.baseUrl = resourceUri.toString(true); this.webview.contents = this._model.getLinesContent(); }); }); From 8763d8411fe12e9578869db961ff27d646a396e8 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 28 Sep 2016 19:10:34 -0700 Subject: [PATCH 281/433] Fix Terminal.processId when setProcessId has not yet been called Part of #12770 --- src/vs/workbench/api/node/extHostTerminalService.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index ad136521206..76c2ce61490 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -40,9 +40,11 @@ export class ExtHostTerminal implements vscode.Terminal { if (this._processId) { return Promise.resolve(this._processId); } - setTimeout(() => { - return this.processId; - }, 200); + return new Promise((resolve) => { + setTimeout(() => { + this.processId.then(resolve); + }, 200); + }); } public sendText(text: string, addNewLine: boolean = true): void { From 13a9949948846af415676449d28c1f0e79bf1c00 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 28 Sep 2016 19:16:39 -0700 Subject: [PATCH 282/433] Fix Terminal.processId when called before xterm.js is initialized Fixes #12770 --- .../parts/terminal/electron-browser/terminalInstance.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index f8ae910ce32..804de4749c4 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -99,9 +99,6 @@ export class TerminalInstance implements ITerminalInstance { this._process.on('message', (message) => { if (message.type === 'data') { this._xterm.write(message.content); - } else if (message.type === 'pid') { - this._processId = message.content; - this._onProcessIdReady.fire(this); } }); this._xterm.on('data', (data) => { @@ -267,6 +264,12 @@ export class TerminalInstance implements ITerminalInstance { } }); } + this._process.on('message', (message) => { + if (message.type === 'pid') { + this._processId = message.content; + this._onProcessIdReady.fire(this); + } + }); this._process.on('exit', (exitCode) => { // Prevent dispose functions being triggered multiple times if (!this._isExiting) { From 7849e4df16c4e67a348b3153ca699cbad834b707 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 28 Sep 2016 20:38:04 -0700 Subject: [PATCH 283/433] Fix IPC exception when killing terminal Fixes #12766 --- .../parts/terminal/electron-browser/terminalInstance.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 804de4749c4..c1ce716520c 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -169,6 +169,7 @@ export class TerminalInstance implements ITerminalInstance { } public dispose(): void { + this._isExiting = true; if (this._wrapperElement) { this._container.removeChild(this._wrapperElement); this._wrapperElement = null; @@ -179,7 +180,6 @@ export class TerminalInstance implements ITerminalInstance { } if (this._process) { if (this._process.connected) { - this._process.disconnect(); this._process.kill(); } this._process = null; @@ -273,7 +273,6 @@ export class TerminalInstance implements ITerminalInstance { this._process.on('exit', (exitCode) => { // Prevent dispose functions being triggered multiple times if (!this._isExiting) { - this._isExiting = true; this.dispose(); if (exitCode) { this._messageService.show(Severity.Error, nls.localize('terminal.integrated.exitedWithCode', 'The terminal process terminated with exit code: {0}', exitCode)); From 6746e53a611ecb3e0777fca6a4c8387dc392513f Mon Sep 17 00:00:00 2001 From: kieferrm Date: Wed, 28 Sep 2016 09:56:46 -0700 Subject: [PATCH 284/433] Improve layout and typography (fixes #12899) --- src/vs/workbench/parts/watermark/watermark.css | 8 +++++++- src/vs/workbench/parts/watermark/watermark.ts | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/watermark/watermark.css b/src/vs/workbench/parts/watermark/watermark.css index bb4845c900d..9bc78480d6e 100644 --- a/src/vs/workbench/parts/watermark/watermark.css +++ b/src/vs/workbench/parts/watermark/watermark.css @@ -58,13 +58,19 @@ .monaco-workbench > .part.editor > .watermark dt { text-align: right; - font-weight: bold; + letter-spacing: 0.04em } .monaco-workbench > .part.editor > .watermark dd { text-align: left; } +.monaco-workbench > .part.editor > .watermark dd > .shortcuts { + padding-left: 0.5em; + padding-right: 0.5em; + letter-spacing: 0.15em; +} + .monaco-workbench > .part.editor > .watermark dt, .monaco-workbench > .part.editor > .watermark dd { display: table-cell; diff --git a/src/vs/workbench/parts/watermark/watermark.ts b/src/vs/workbench/parts/watermark/watermark.ts index 353f7a11184..3edbb99419c 100644 --- a/src/vs/workbench/parts/watermark/watermark.ts +++ b/src/vs/workbench/parts/watermark/watermark.ts @@ -47,10 +47,10 @@ export function create(container: Builder, keybindingService: IKeybindingService entries.map(entry => { builder.element('dl', {}, dl => { dl.element('dt', {}, dt => dt.text(entry.text)); - dl.element('dd', {}, dd => dd.text( + dl.element('dd', {}, dd => dd.innerHtml( entry.ids .map(id => keybindingService.lookupKeybindings(id).slice(0, 1) - .map(k => keybindingService.getLabelFor(k)) + .map(k => `${keybindingService.getLabelFor(k)}`) .join('') || UNBOUND) .join(' / ') )); From 6f572ef6fccd8d2c3c8b14b72c0e3a3a6b69639d Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 29 Sep 2016 08:10:23 +0200 Subject: [PATCH 285/433] remove unused terminal activity icon --- .../parts/terminal/electron-browser/media/terminal.css | 7 ------- .../parts/terminal/electron-browser/media/terminal.svg | 1 - 2 files changed, 8 deletions(-) delete mode 100755 src/vs/workbench/parts/terminal/electron-browser/media/terminal.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css index 4436fa44304..38c5fbd64c6 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -3,13 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/* Activity Bar */ -.monaco-workbench > .activitybar .monaco-action-bar .action-label.terminal { - background: url('terminal.svg') center center no-repeat; - background-position: 50% !important; - background-size: 32px; -} - .monaco-workbench .panel.integrated-terminal { align-content: flex-start; align-items: baseline; diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.svg b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.svg deleted file mode 100755 index f0642795093..00000000000 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From a1f76c14dbae77ad18c0b887c2a639f5db109328 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 29 Sep 2016 08:16:27 +0200 Subject: [PATCH 286/433] "typescript.check.workspaceVersion": false --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 290bc0fff88..614054ee14e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,5 +24,6 @@ "windows": { "command": "${workspaceRoot}\\scripts\\test.bat --coverage --run ${file}" } - }] + }], + "typescript.check.workspaceVersion": false } \ No newline at end of file From 3b5e8d36db7a244a1781356b5bcc2f21a44d4b3e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 29 Sep 2016 08:20:30 +0200 Subject: [PATCH 287/433] fixes #12930 --- .../workbench/parts/files/electron-browser/textFileService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/electron-browser/textFileService.ts b/src/vs/workbench/parts/files/electron-browser/textFileService.ts index 76c1d01294b..7dce42fb035 100644 --- a/src/vs/workbench/parts/files/electron-browser/textFileService.ts +++ b/src/vs/workbench/parts/files/electron-browser/textFileService.ts @@ -169,7 +169,7 @@ export class TextFileService extends AbstractTextFileService { return null; } - const filter: IFilter = { name: languageName, extensions: extensions.map(e => strings.trim(e, '.')) }; + const filter: IFilter = { name: languageName, extensions: extensions.slice(0, 10).map(e => strings.trim(e, '.')) }; if (ext && extensions.indexOf(ext) >= 0) { matchingFilter = filter; From 208ae4c0621c72218876a711d49da50a9a1c5846 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 29 Sep 2016 08:23:15 +0200 Subject: [PATCH 288/433] fixes #12932 --- src/vs/code/electron-main/menus.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index feb955dbf6f..c3566e003ba 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -672,7 +672,7 @@ export class VSCodeMenu { }) : null, (this.envService.product.licenseUrl || this.envService.product.privacyStatementUrl) ? __separator__() : null, toggleDevToolsItem, - platform.isWindows ? showAccessibilityOptions : null + platform.isWindows && product.quality !== 'stable' ? showAccessibilityOptions : null ]).forEach((item) => helpMenu.append(item)); if (!platform.isMacintosh) { From 9677bba9cb76afb1fdb3bdfc281d8d95443d8756 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 29 Sep 2016 08:36:34 +0200 Subject: [PATCH 289/433] fixes #12911 --- .../parts/quickopen/browser/gotoSymbolHandler.ts | 2 +- .../workbench/parts/search/browser/search.contribution.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts b/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts index 9f03ea746d1..ca741e17cca 100644 --- a/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts @@ -31,7 +31,7 @@ export const SCOPE_PREFIX = ':'; export class GotoSymbolAction extends QuickOpenAction { public static ID = 'workbench.action.gotoSymbol'; - public static LABEL = nls.localize('gotoSymbol', "Go to Symbol..."); + public static LABEL = nls.localize('gotoSymbol', "Go to Symbol in File..."); constructor(actionId: string, actionLabel: string, @IQuickOpenService quickOpenService: IQuickOpenService) { super(actionId, actionLabel, GOTO_SYMBOL_PREFIX, quickOpenService); diff --git a/src/vs/workbench/parts/search/browser/search.contribution.ts b/src/vs/workbench/parts/search/browser/search.contribution.ts index 9819545ae25..1a9d178171a 100644 --- a/src/vs/workbench/parts/search/browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/browser/search.contribution.ts @@ -93,7 +93,7 @@ class ExplorerViewerActionContributor extends ActionBarContributor { } const ACTION_ID = 'workbench.action.showAllSymbols'; -const ACTION_LABEL = nls.localize('showTriggerActions', "Show All Symbols"); +const ACTION_LABEL = nls.localize('showTriggerActions', "Go to Symbol in Workspace..."); const ALL_SYMBOLS_PREFIX = '#'; class ShowAllSymbolsAction extends QuickOpenAction { @@ -141,7 +141,7 @@ actionBarRegistry.registerActionBarContributor(Scope.VIEWER, ExplorerViewerActio 'vs/workbench/parts/search/browser/openAnythingHandler', 'OpenAnythingHandler', '', - nls.localize('openAnythingHandlerDescription', "Open Files by Name") + nls.localize('openAnythingHandlerDescription', "Go to File") ) ); @@ -154,7 +154,7 @@ actionBarRegistry.registerActionBarContributor(Scope.VIEWER, ExplorerViewerActio { prefix: ALL_SYMBOLS_PREFIX, needsEditor: false, - description: nls.localize('openSymbolDescriptionNormal', "Open Any Symbol By Name") + description: nls.localize('openSymbolDescriptionNormal', "Go to Symbol in Workspace") } ] ) @@ -164,7 +164,7 @@ actionBarRegistry.registerActionBarContributor(Scope.VIEWER, ExplorerViewerActio const registry = Registry.as(ActionExtensions.WorkbenchActions); registry.registerWorkbenchAction(new SyncActionDescriptor(ShowAllSymbolsAction, ACTION_ID, ACTION_LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_T -}), 'Show All Symbols'); +}), 'Go to Symbol in Workspace...'); registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ShowNextSearchTermAction, searchActions.ShowNextSearchTermAction.ID, searchActions.ShowNextSearchTermAction.LABEL, ShowNextFindTermKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); From d85221b4272e8cedd53090b2a7d5893284a62a77 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 29 Sep 2016 08:40:47 +0200 Subject: [PATCH 290/433] fixes #12947 --- .../workbench/browser/parts/editor/media/notabstitle.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vs/workbench/browser/parts/editor/media/notabstitle.css b/src/vs/workbench/browser/parts/editor/media/notabstitle.css index ccc1d8d5143..a37de41706f 100644 --- a/src/vs/workbench/browser/parts/editor/media/notabstitle.css +++ b/src/vs/workbench/browser/parts/editor/media/notabstitle.css @@ -35,4 +35,13 @@ .vs-dark .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.dirty .title-actions .close-editor-action, .hc-black .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.dirty .title-actions .close-editor-action { background: url('close-dirty-inverse.svg') center center no-repeat; +} + +.vs .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.dirty .title-actions .close-editor-action:hover { + background: url('close.svg') center center no-repeat; +} + +.vs-dark .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.dirty .title-actions .close-editor-action:hover, +.hc-black .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title.dirty .title-actions .close-editor-action:hover { + background: url('close-inverse.svg') center center no-repeat; } \ No newline at end of file From 5682c8ffb1f8049ccbf7626fefc9ff961efb5367 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 29 Sep 2016 08:49:44 +0200 Subject: [PATCH 291/433] fix #12979 --- .../common/editor/untitledEditorModel.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/common/editor/untitledEditorModel.ts b/src/vs/workbench/common/editor/untitledEditorModel.ts index b0a573577bd..c3f5c3cb1d1 100644 --- a/src/vs/workbench/common/editor/untitledEditorModel.ts +++ b/src/vs/workbench/common/editor/untitledEditorModel.ts @@ -140,16 +140,18 @@ export class UntitledEditorModel extends StringEditorModel implements IEncodingS private onModelContentChanged(): void { - // turn dirty if we were not - if (!this.dirty) { - this.dirty = true; - this._onDidChangeDirty.fire(); + // mark the untitled editor as non-dirty once its content becomes empty and we do + // not have an associated path set. we never want dirty indicator in that case. + if (!this.hasAssociatedFilePath && this.textEditorModel.getLineCount() === 1 && this.textEditorModel.getLineContent(1) === '') { + if (this.dirty) { + this.dirty = false; + this._onDidChangeDirty.fire(); + } } - // mark the untitled editor as non-dirty once its content becomes empty and we do - // not have an associated path set - else if (!this.hasAssociatedFilePath && this.textEditorModel.getLineCount() === 1 && this.textEditorModel.getLineContent(1) === '') { - this.dirty = false; + // turn dirty if we were not + else if (!this.dirty) { + this.dirty = true; this._onDidChangeDirty.fire(); } } From 17d587c2582587c9fd7e42cdb40e628285a2e8f2 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 29 Sep 2016 09:42:28 +0200 Subject: [PATCH 292/433] repl: overflow: hidden to contain the character surveyor fixes #12876 --- src/vs/workbench/parts/debug/browser/media/repl.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/debug/browser/media/repl.css b/src/vs/workbench/parts/debug/browser/media/repl.css index da25304d6af..bf336af2f63 100644 --- a/src/vs/workbench/parts/debug/browser/media/repl.css +++ b/src/vs/workbench/parts/debug/browser/media/repl.css @@ -9,6 +9,7 @@ height: 100%; position: relative; box-sizing: border-box; + overflow: hidden; } .monaco-workbench .repl .surveyor { From bb516c784537822b1b81592b9260793290a02e81 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 29 Sep 2016 09:46:23 +0200 Subject: [PATCH 293/433] fixes #11653 --- src/vs/workbench/parts/debug/browser/debugActionItems.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index 7422dd3d291..29ca0ec1d1c 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -34,6 +34,7 @@ export class DebugSelectActionItem extends SelectActionItem { public render(container: HTMLElement): void { super.render(container); this.updateOptions(true).done(null, errors.onUnexpectedError); + this.enabled = this.debugService.state === State.Inactive; } private updateOptions(changeDebugConfiguration: boolean): TPromise { From c4f793759a5862d7ff33201e153a8ceef911e1bc Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 28 Sep 2016 17:00:59 +0200 Subject: [PATCH 294/433] baby steps, #12111 --- src/vs/workbench/api/node/extHostEditors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHostEditors.ts b/src/vs/workbench/api/node/extHostEditors.ts index 37591f36ae7..98e20ebfd63 100644 --- a/src/vs/workbench/api/node/extHostEditors.ts +++ b/src/vs/workbench/api/node/extHostEditors.ts @@ -163,7 +163,7 @@ class TextEditorDecorationType implements vscode.TextEditorDecorationType { constructor(proxy: MainThreadEditorsShape, options: vscode.DecorationRenderOptions) { this.key = TextEditorDecorationType._Keys.nextId(); this._proxy = proxy; - this._proxy.$registerTextEditorDecorationType(this.key, options); + this._proxy.$registerTextEditorDecorationType(this.key, options); } public dispose(): void { From 2d1c94ab08dfa05d3b29fbed971488e8f4ec984e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 29 Sep 2016 09:54:55 +0200 Subject: [PATCH 295/433] gutterIconPath is string or Uri, #12111 --- .../browser/services/codeEditorServiceImpl.ts | 5 ++- src/vs/editor/common/editorCommon.ts | 2 +- .../services/decorationRenderOptions.test.ts | 2 +- src/vs/vscode.d.ts | 4 +- src/vs/workbench/api/node/extHostEditors.ts | 2 +- .../api/node/extHostTypeConverters.ts | 39 ++++++++++++++++++- 6 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 9169bfce8f5..f5826bda6ed 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -323,8 +323,9 @@ class DecorationRenderHelper { public static getCSSTextForModelDecorationGlyphMarginClassName(opts:IThemeDecorationRenderOptions): string { let cssTextArr = []; - if (typeof opts.gutterIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.parse(opts.gutterIconPath).toString())); + if (typeof opts.gutterIconUrl !== 'undefined') { + // escape at least the single quote, see https://www.w3.org/TR/CSS1/#url + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconUrl.replace(/'/g, '\\\''))); if (typeof opts.gutterIconSize !== 'undefined') { cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); } diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 3dac506d42b..793c91b1c23 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -3788,7 +3788,7 @@ export interface IThemeDecorationRenderOptions { color?: string; letterSpacing?: string; - gutterIconPath?: string; + gutterIconUrl?: string; gutterIconSize?: string; overviewRulerColor?: string; diff --git a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts index 3d009c2647f..c67cb1d53c0 100644 --- a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +++ b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts @@ -11,7 +11,7 @@ import {IDecorationRenderOptions} from 'vs/editor/common/editorCommon'; suite('Browser Services - EditorLayoutProvider', () => { var options: IDecorationRenderOptions = { - gutterIconPath: 'https://github.com/Microsoft/vscode/blob/master/resources/linux/code.png', + gutterIconUrl: 'https://github.com/Microsoft/vscode/blob/master/resources/linux/code.png', gutterIconSize: 'contain', backgroundColor: 'red', borderColor: 'yellow' diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index a737c7c87af..b3b5164c49f 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -782,9 +782,9 @@ declare namespace vscode { letterSpacing?: string; /** - * An **absolute path** to an image to be rendered in the gutterIconPath. + * An **absolute path** to an image or an URI to be rendered in the gutter. */ - gutterIconPath?: string; + gutterIconPath?: string | Uri; /** * Specifies the size of the gutter icon. diff --git a/src/vs/workbench/api/node/extHostEditors.ts b/src/vs/workbench/api/node/extHostEditors.ts index 98e20ebfd63..500276ded61 100644 --- a/src/vs/workbench/api/node/extHostEditors.ts +++ b/src/vs/workbench/api/node/extHostEditors.ts @@ -163,7 +163,7 @@ class TextEditorDecorationType implements vscode.TextEditorDecorationType { constructor(proxy: MainThreadEditorsShape, options: vscode.DecorationRenderOptions) { this.key = TextEditorDecorationType._Keys.nextId(); this._proxy = proxy; - this._proxy.$registerTextEditorDecorationType(this.key, options); + this._proxy.$registerTextEditorDecorationType(this.key, TypeConverters.fromDecorationRenderOptions(options)); } public dispose(): void { diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 9aebafecfb2..7d2bc3ce463 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -12,7 +12,7 @@ import { stringDiff } from 'vs/base/common/diff/diff'; import * as modes from 'vs/editor/common/modes'; import * as types from './extHostTypes'; import { Position as EditorPosition } from 'vs/platform/editor/common/editor'; -import { IPosition, ISelection, IRange, IDecorationOptions, ISingleEditOperation } from 'vs/editor/common/editorCommon'; +import { IPosition, ISelection, IRange, IDecorationOptions, IDecorationRenderOptions, ISingleEditOperation } from 'vs/editor/common/editorCommon'; import { IWorkspaceSymbol } from 'vs/workbench/parts/search/common/search'; import * as vscode from 'vscode'; import URI from 'vs/base/common/uri'; @@ -155,6 +155,43 @@ export function fromRangeOrRangeWithMessage(ranges: vscode.Range[] | vscode.Deco } } +export function fromDecorationRenderOptions(options: vscode.DecorationRenderOptions): IDecorationRenderOptions { + + const { + after, + backgroundColor, before, border, borderColor, borderRadius, borderSpacing, borderStyle, borderWidth, + color, cursor, + dark, + gutterIconPath, gutterIconSize, + isWholeLine, + letterSpacing, light, + outline, outlineColor, outlineStyle, outlineWidth, overviewRulerColor, overviewRulerLane, + textDecoration + } = options; + + // properly convert the gutterIconPath to an url + let gutterIconUrl: string; + if (typeof gutterIconPath === 'string') { + gutterIconUrl = URI.file(gutterIconPath).toString(); + } else if (gutterIconPath) { + // don't escape scheme-sensitive and there better don't + // escape at all, it would break http/data/etc links + gutterIconUrl = gutterIconPath.toString(true); + } + + return { + after, + backgroundColor, before, border, borderColor, borderRadius, borderSpacing, borderStyle, borderWidth, + color, cursor, + dark, + gutterIconUrl, gutterIconSize, + isWholeLine, + letterSpacing, light, + outline, outlineColor, outlineStyle, outlineWidth, overviewRulerColor, overviewRulerLane, + textDecoration + }; +} + export const TextEdit = { minimalEditOperations(edits: vscode.TextEdit[], document: vscode.TextDocument, beforeDocumentVersion: number): ISingleEditOperation[] { From ec6b7a75417bc700973411919677dceaee459777 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 29 Sep 2016 09:57:06 +0200 Subject: [PATCH 296/433] React on terminal disposed and check if that is the debug terminal fixes #12956 --- .../parts/debug/electron-browser/terminalSupport.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts b/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts index 1826013f7de..7e674e4b08a 100644 --- a/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts +++ b/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts @@ -5,6 +5,7 @@ import nls = require('vs/nls'); import platform = require('vs/base/common/platform'); +import {IDisposable} from 'vs/base/common/lifecycle'; import {TPromise} from 'vs/base/common/winjs.base'; import {ITerminalService, ITerminalInstance} from 'vs/workbench/parts/terminal/electron-browser/terminal'; import {ITerminalService as IExternalTerminalService} from 'vs/workbench/parts/execution/common/execution'; @@ -26,6 +27,7 @@ export interface IIntegratedTerminalConfiguration { export class TerminalSupport { private static integratedTerminalInstance: ITerminalInstance; + private static terminalDisposedListener: IDisposable; public static runInTerminal(terminalService: ITerminalService, nativeTerminalService: IExternalTerminalService, configurationService: IConfigurationService, args: DebugProtocol.RunInTerminalRequestArguments, response: DebugProtocol.RunInTerminalResponse): TPromise { @@ -38,6 +40,14 @@ export class TerminalSupport { TerminalSupport.integratedTerminalInstance = terminalService.createInstance(args.title || nls.localize('debuggee', "debuggee")); delay = 2000; // delay sendText so that the newly created terminal is ready. } + if (!TerminalSupport.terminalDisposedListener) { + // React on terminal disposed and check if that is the debug terminal #12956 + TerminalSupport.terminalDisposedListener = terminalService.onInstanceDisposed(terminal => { + if (TerminalSupport.integratedTerminalInstance && TerminalSupport.integratedTerminalInstance.id === terminal.id) { + TerminalSupport.integratedTerminalInstance = null; + } + }); + } terminalService.setActiveInstance(TerminalSupport.integratedTerminalInstance); terminalService.showPanel(true); From 3933d115ec66f0bac93712b9083521dbd8e6fb81 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 29 Sep 2016 10:46:56 +0200 Subject: [PATCH 297/433] update node-debug --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 9caa046b780..dabac01f5ab 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -39,7 +39,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.6.7' }, + { name: 'ms-vscode.node-debug', version: '1.6.8' }, { name: 'ms-vscode.node-debug2', version: '0.0.7' } ]; From 37d1d32a7ac77a1cbbbc2c28da21466f19a7c8d8 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 29 Sep 2016 11:34:11 +0200 Subject: [PATCH 298/433] editor: showLineNumbers only if lineNumbers 'on' or 'relative' fixes #12879 --- .../common/config/commonEditorConfig.ts | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 140643e8f70..efcc0815166 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -170,12 +170,41 @@ class InternalEditorOptionsHelper { if (opts.folding) { lineDecorationsWidth += 16; } + let renderLineNumbers: boolean; + let renderCustomLineNumbers: (lineNumber:number)=>string; + let renderRelativeLineNumbers: boolean; + + // Compatibility with old true or false values + if (lineNumbers === true) { + lineNumbers = 'on'; + } else if (lineNumbers === false) { + lineNumbers = 'off'; + } + + if (typeof lineNumbers === 'function') { + renderLineNumbers = true; + renderCustomLineNumbers = lineNumbers; + renderRelativeLineNumbers = false; + } else if (lineNumbers === 'relative') { + renderLineNumbers = true; + renderCustomLineNumbers = null; + renderRelativeLineNumbers = true; + } else if (lineNumbers === 'on') { + renderLineNumbers = true; + renderCustomLineNumbers = null; + renderRelativeLineNumbers = false; + } else { + renderLineNumbers = false; + renderCustomLineNumbers = null; + renderRelativeLineNumbers = false; + } + let layoutInfo = EditorLayoutProvider.compute({ outerWidth: outerWidth, outerHeight: outerHeight, showGlyphMargin: glyphMargin, lineHeight: fontInfo.lineHeight, - showLineNumbers: !!lineNumbers, + showLineNumbers: renderLineNumbers, lineNumbersMinChars: lineNumbersMinChars, lineDecorationsWidth: lineDecorationsWidth, maxDigitWidth: fontInfo.maxDigitWidth, @@ -232,34 +261,6 @@ class InternalEditorOptionsHelper { tabFocusMode = true; } - let renderLineNumbers: boolean; - let renderCustomLineNumbers: (lineNumber:number)=>string; - let renderRelativeLineNumbers: boolean; - - // Compatibility with old true or false values - if (lineNumbers === true) { - lineNumbers = 'on'; - } else if (lineNumbers === false) { - lineNumbers = 'off'; - } - - if (typeof lineNumbers === 'function') { - renderLineNumbers = true; - renderCustomLineNumbers = lineNumbers; - renderRelativeLineNumbers = false; - } else if (lineNumbers === 'relative') { - renderLineNumbers = true; - renderCustomLineNumbers = null; - renderRelativeLineNumbers = true; - } else if (lineNumbers === 'on') { - renderLineNumbers = true; - renderCustomLineNumbers = null; - renderRelativeLineNumbers = false; - } else { - renderLineNumbers = false; - renderCustomLineNumbers = null; - renderRelativeLineNumbers = false; - } let renderWhitespace = opts.renderWhitespace; // Compatibility with old true or false values From f0f5102e0bc2711e0351f66994cafe95785465e6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 29 Sep 2016 11:41:08 +0200 Subject: [PATCH 299/433] fix #12960 --- .../extensionsWorkbenchService.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index 96dc87844e6..c62205c7994 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -157,6 +157,7 @@ class Extension implements IExtension { return this.gallery ? this.gallery.ratingCount : null; } + // TODO: Clean it up. Make it sync isOutdated(): TPromise { if (this.type === LocalExtensionType.User) { if (this.gallery && this.gallery.properties.engine) { @@ -347,15 +348,25 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { const installed = installedByGalleryId[id]; if (installed) { - installed.gallery = gallery; - this._onChange.fire(); - this.eventuallyAutoUpdateExtensions(); + // Loading the compatible version only there is an engine property + // Otherwise falling back to old way so that we will not make many roundtrips + if (gallery.properties.engine) { + this.galleryService.loadCompatibleVersion(gallery).then(compatible => this.syncLocalWithGalleryExtension(installed, compatible)); + } else { + this.syncLocalWithGalleryExtension(installed, gallery); + } return installed; } return new Extension(this.galleryService, this.stateProvider, null, gallery); } + private syncLocalWithGalleryExtension(local: Extension, gallery: IGalleryExtension) { + local.gallery = gallery; + this._onChange.fire(); + this.eventuallyAutoUpdateExtensions(); + } + private eventuallySyncWithGallery(immediate = false): void { const loop = () => this.syncWithGallery().then(() => this.eventuallySyncWithGallery()); const delay = immediate ? 0 : ExtensionsWorkbenchService.SyncPeriod; From dcf6d32a6e4b278eab28adc45c60ae766467838d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 29 Sep 2016 12:13:43 +0200 Subject: [PATCH 300/433] workaround #12954 --- src/vs/platform/opener/browser/openerService.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/opener/browser/openerService.ts b/src/vs/platform/opener/browser/openerService.ts index 73fa56736b8..6d5dc1011fe 100644 --- a/src/vs/platform/opener/browser/openerService.ts +++ b/src/vs/platform/opener/browser/openerService.ts @@ -9,8 +9,9 @@ import {parse} from 'vs/base/common/marshalling'; import {Schemas} from 'vs/base/common/network'; import {TPromise} from 'vs/base/common/winjs.base'; import {IEditorService} from 'vs/platform/editor/common/editor'; +import {normalize} from 'vs/base/common/paths'; import {ICommandService, CommandsRegistry} from 'vs/platform/commands/common/commands'; -import {IOpenerService} from '../common/opener'; +import {IOpenerService} from 'vs/platform/opener/common/opener'; export class OpenerService implements IOpenerService { @@ -59,6 +60,8 @@ export class OpenerService implements IOpenerService { }; // remove fragment resource = resource.with({ fragment: '' }); + } else if (resource.scheme === Schemas.file) { + resource = URI.file(normalize(resource.fsPath)); // TODO@Ben workaround for non-normalized paths (https://github.com/Microsoft/vscode/issues/12954) } promise = this._editorService.openEditor({ resource, options: { selection, } }, options && options.openToSide); } From 54097e0171afb6524860e7f77d4064ebe1dbe61a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 29 Sep 2016 12:41:10 +0200 Subject: [PATCH 301/433] fix #12917 --- .../extensionManagement/common/extensionManagement.ts | 2 +- .../common/extensionManagementIpc.ts | 6 +++--- .../node/extensionManagementService.ts | 11 ++--------- .../parts/extensions/electron-browser/extensions.ts | 2 +- .../extensions/electron-browser/extensionsActions.ts | 4 ++-- .../electron-browser/extensionsWorkbenchService.ts | 6 +++--- 6 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index cf442e6c925..88e78ae2d55 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -223,7 +223,7 @@ export interface IExtensionManagementService { onDidUninstallExtension: Event; install(zipPath: string): TPromise; - installFromGallery(extension: IGalleryExtension): TPromise; + installFromGallery(extension: IGalleryExtension, promptToInstallDependencies?: boolean): TPromise; uninstall(extension: ILocalExtension): TPromise; getInstalled(type?: LocalExtensionType): TPromise; } diff --git a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts index f0c69ff375c..967cf5d96d8 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts @@ -43,7 +43,7 @@ export class ExtensionManagementChannel implements IExtensionManagementChannel { case 'event:onUninstallExtension': return eventToCall(this.onUninstallExtension); case 'event:onDidUninstallExtension': return eventToCall(this.onDidUninstallExtension); case 'install': return this.service.install(arg); - case 'installFromGallery': return this.service.installFromGallery(arg); + case 'installFromGallery': return this.service.installFromGallery(arg[0], arg[1]); case 'uninstall': return this.service.uninstall(arg); case 'getInstalled': return this.service.getInstalled(arg); } @@ -72,8 +72,8 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer return this.channel.call('install', zipPath); } - installFromGallery(extension: IGalleryExtension): TPromise { - return this.channel.call('installFromGallery', extension); + installFromGallery(extension: IGalleryExtension, promptToInstallDependencies: boolean = true): TPromise { + return this.channel.call('installFromGallery', [extension, promptToInstallDependencies]); } uninstall(extension: ILocalExtension): TPromise { diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 5f142c9d94a..daac9847e3b 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -138,7 +138,7 @@ export class ExtensionManagementService implements IExtensionManagementService { }); } - installFromGallery(extension: IGalleryExtension): TPromise { + installFromGallery(extension: IGalleryExtension, promptToInstallDependencies: boolean = true): TPromise { const id = getExtensionId(extension, extension.version); return this.isObsolete(id).then(isObsolete => { @@ -146,8 +146,7 @@ export class ExtensionManagementService implements IExtensionManagementService { return TPromise.wrapError(new Error(nls.localize('restartCode', "Please restart Code before reinstalling {0}.", extension.displayName || extension.name))); } this._onInstallExtension.fire({ id, gallery: extension }); - return this.getLocalExtension(extension) - .then(local => this.installCompatibleVersion(extension, true, !local)) + return this.installCompatibleVersion(extension, true, promptToInstallDependencies) .then( local => this._onDidInstallExtension.fire({ id, local, gallery: extension }), error => { @@ -185,12 +184,6 @@ export class ExtensionManagementService implements IExtensionManagementService { ); } - private getLocalExtension(extension: IGalleryExtension): TPromise { - const extensionName = `${extension.publisher}.${extension.name}`; - return this.getInstalled().then(installed => installed.filter(local => `${local.manifest.publisher}.${local.manifest.name}` === extensionName)) - .then(local => local.length ? local[0] : null); - } - private getDependenciesToInstall(extension: IGalleryExtension, checkDependecies: boolean): TPromise { if (!checkDependecies) { return TPromise.wrap([]); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts index 111a105a4c3..120018a0a94 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts @@ -59,7 +59,7 @@ export interface IExtensionsWorkbenchService { queryGallery(options?: IQueryOptions): TPromise>; canInstall(extension: IExtension): boolean; install(vsix: string): TPromise; - install(extension: IExtension): TPromise; + install(extension: IExtension, promptToInstallDependencies?: boolean): TPromise; uninstall(extension: IExtension): TPromise; } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index 890e09a6f52..27f3384d4be 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -337,8 +337,8 @@ export class UpdateAllAction extends Action { this.getOutdatedExtensions().done(outDated => this.enabled = outDated.length > 0); } - run(): TPromise { - return this.getOutdatedExtensions().then(outdated => TPromise.join(outdated.map(e => this.extensionsWorkbenchService.install(e)))); + run(promptToInstallDependencies: boolean = true,): TPromise { + return this.getOutdatedExtensions().then(outdated => TPromise.join(outdated.map(e => this.extensionsWorkbenchService.install(e, promptToInstallDependencies)))); } dispose(): void { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index c62205c7994..97feb656962 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -406,7 +406,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { return TPromise.as(null); } - return action.run(); + return action.run(false); } canInstall(extension: IExtension): boolean { @@ -417,7 +417,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { return !!(extension as Extension).gallery; } - install(extension: string | IExtension): TPromise { + install(extension: string | IExtension, promptToInstallDependencies: boolean = true): TPromise { if (typeof extension === 'string') { return this.extensionService.install(extension); } @@ -433,7 +433,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { return TPromise.wrapError(new Error('Missing gallery')); } - return this.extensionService.installFromGallery(gallery); + return this.extensionService.installFromGallery(gallery, promptToInstallDependencies); } uninstall(extension: IExtension): TPromise { From 7067b5927cb6973fa499a485868114cc5ae6e556 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Thu, 29 Sep 2016 14:04:45 +0200 Subject: [PATCH 302/433] Fixes #12721: Info message about `typescript.tsdk` is a bit too much --- .../typescript/src/typescriptServiceClient.ts | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 65ca8ede43a..7602a1bac94 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -487,27 +487,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } private informAboutTS20(modulePath: string): Thenable { - const informAboutTS20: string = 'informAboutTS20'; - if (!this.globalState.get(informAboutTS20, false)) { - return window.showInformationMessage( - localize( - 'tsversion20', - 'VS Code 1.6 ships with TypeScript version 2.0.3. If you want to use a previous version of TypeScript set the \'typescript.tsdk\' option.' - ), - { - title: localize('moreInformation', 'More Information'), - id: 1 - } - ).then((selected) => { - this.globalState.update(informAboutTS20, true); - if (selected && selected.id === 1) { - openUrl('https://go.microsoft.com/fwlink/?LinkID=533483#vscode'); - } - return modulePath; - }); - } else { - return Promise.resolve(modulePath); - } + return Promise.resolve(modulePath); } private serviceStarted(resendModels: boolean): void { From 8a6ba3b28b70052b18c4d96806eea4f93663f344 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Thu, 29 Sep 2016 14:34:12 +0200 Subject: [PATCH 303/433] Fix for @12195 Adding a div causes an extra stray bracket in Razor --- extensions/handlebars/language-configuration.json | 3 +-- extensions/html/language-configuration.json | 3 +-- extensions/razor/language-configuration.json | 3 +-- src/vs/workbench/parts/emmet/node/editorAccessor.ts | 11 ++++++++++- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/extensions/handlebars/language-configuration.json b/extensions/handlebars/language-configuration.json index 055b361a333..c71a5655d5e 100644 --- a/extensions/handlebars/language-configuration.json +++ b/extensions/handlebars/language-configuration.json @@ -14,8 +14,7 @@ { "open": "[", "close": "]"}, { "open": "(", "close": ")" }, { "open": "'", "close": "'" }, - { "open": "\"", "close": "\"" }, - { "open": "<", "close": ">" } + { "open": "\"", "close": "\"" } ], "surroundingPairs": [ { "open": "'", "close": "'" }, diff --git a/extensions/html/language-configuration.json b/extensions/html/language-configuration.json index ac43f355121..060646fc820 100644 --- a/extensions/html/language-configuration.json +++ b/extensions/html/language-configuration.json @@ -13,8 +13,7 @@ { "open": "[", "close": "]"}, { "open": "(", "close": ")" }, { "open": "'", "close": "'" }, - { "open": "\"", "close": "\"" }, - { "open": "<", "close": ">" } + { "open": "\"", "close": "\"" } ], "surroundingPairs": [ { "open": "'", "close": "'" }, diff --git a/extensions/razor/language-configuration.json b/extensions/razor/language-configuration.json index a4ae1367781..e2a49bcbd8e 100644 --- a/extensions/razor/language-configuration.json +++ b/extensions/razor/language-configuration.json @@ -13,8 +13,7 @@ { "open": "[", "close": "]"}, { "open": "(", "close": ")" }, { "open": "'", "close": "'" }, - { "open": "\"", "close": "\"" }, - { "open": "<", "close": ">" } + { "open": "\"", "close": "\"" } ], "surroundingPairs": [ { "open": "'", "close": "'" }, diff --git a/src/vs/workbench/parts/emmet/node/editorAccessor.ts b/src/vs/workbench/parts/emmet/node/editorAccessor.ts index 67f8649bec0..3d4ffb25c7a 100644 --- a/src/vs/workbench/parts/emmet/node/editorAccessor.ts +++ b/src/vs/workbench/parts/emmet/node/editorAccessor.ts @@ -80,7 +80,7 @@ export class EditorAccessor implements emmet.Editor { let startPosition = this.getPositionFromOffset(start); let endPosition = this.getPositionFromOffset(end); - // test if < or after the replace range. Either replace these too, or block the expansion var currentLine = this._editor.getModel().getLineContent(startPosition.lineNumber).substr(0, startPosition.column - 1); // content before the replaced range var match = currentLine.match(/<[/]?$/); if (match) { @@ -91,6 +91,15 @@ export class EditorAccessor implements emmet.Editor { } } + // test if > is located after the replace range. Either replace these too, or block the expansion + if (this._editor.getModel().getLineContent(endPosition.lineNumber).substr(endPosition.column-1, endPosition.column) ==='>') { + if (strings.endsWith(value, '>')) { + endPosition = { lineNumber: endPosition.lineNumber, column: endPosition.column + 1 }; + } else { + return; // ignore + } + } + // If this is the first edit in this "transaction", push an undo stop before them if (!this._hasMadeEdits) { this._hasMadeEdits = true; From 5019b2f77b6592c910b3880ee48608afb87d7b0a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 29 Sep 2016 14:37:11 +0200 Subject: [PATCH 304/433] fix #12935 --- .../node/extensionGalleryService.ts | 21 +++++++++++-------- .../electron-browser/extensionsViewlet.ts | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 50527f7ab70..e287ed2068b 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -150,15 +150,18 @@ class Query { return new Query(assign({}, this.state, { pageNumber, pageSize })); } - withFilter(filterType: FilterType, value?: string): Query { - const criterium: ICriterium = { filterType }; + withFilter(filterType: FilterType, values?: string | string[]): Query { + const criteria = this.state.criteria.slice(); - if (!isUndefined(value)) { - criterium.value = value; + if (!isUndefined(values)) { + values = Array.isArray(values) ? values : [values]; + for (const value of values) { + criteria.push({ filterType, value }); + } + } else { + criteria.push({ filterType }); } - const criteria = this.state.criteria.slice(); - criteria.push(criterium); return new Query(assign({}, this.state, { criteria })); } @@ -321,9 +324,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService { if (text) { query = query.withFilter(FilterType.SearchText, text).withSortBy(SortBy.NoneOrRelevance); } else if (options.ids) { - query = options.ids.reduce((query, id) => query.withFilter(FilterType.ExtensionId, id), query); + query = query.withFilter(FilterType.ExtensionId, options.ids); } else if (options.names) { - query = options.names.reduce((query, name) => query.withFilter(FilterType.ExtensionName, name), query); + query = query.withFilter(FilterType.ExtensionName, options.names); } else { query = query.withSortBy(SortBy.InstallCount); } @@ -437,7 +440,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withPage(1, extensionNames.length) .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') .withAssetTypes(AssetType.Icon, AssetType.License, AssetType.Details, AssetType.Manifest, AssetType.VSIX); - query = extensionNames.reduce((query, name) => query.withFilter(FilterType.ExtensionName, name), query); + query = query.withFilter(FilterType.ExtensionName, extensionNames); return this.queryGallery(query).then(result => { const dependencies = []; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 46a9ed27a81..561cab25b82 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -271,7 +271,7 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { if (!names.length) { return TPromise.as(new PagedModel([])); } - return this.extensionsWorkbenchService.queryGallery({ names, pageSize: names.length }) + return this.extensionsWorkbenchService.queryGallery({ names }) .then(result => new PagedModel(result)); } From 9d6f099be81ae668d009cb067843f8021991cb38 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Thu, 29 Sep 2016 14:52:49 +0200 Subject: [PATCH 305/433] Merge in translations --- .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 3 +-- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 2 +- .../parts/editor/editorActions.i18n.json | 4 ---- .../workbench/electron-browser/main.i18n.json | 6 +++++ .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionTipsService.i18n.json | 1 + .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../browser/views/openEditorsView.i18n.json | 6 ++--- .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminalInstance.i18n.json | 1 + .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 3 +-- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 2 +- .../parts/editor/editorActions.i18n.json | 4 ---- .../workbench/electron-browser/main.i18n.json | 6 +++++ .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionTipsService.i18n.json | 1 + .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../browser/views/openEditorsView.i18n.json | 6 ++--- .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminalInstance.i18n.json | 1 + .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 13 +++++++---- .../extensions/typescript/package.i18n.json | 2 ++ .../resourceviewer/resourceViewer.i18n.json | 11 +++++---- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../src/vs/code/electron-main/main.i18n.json | 4 +++- .../src/vs/code/electron-main/menus.i18n.json | 6 +++-- .../vs/code/electron-main/windows.i18n.json | 1 + .../config/commonEditorConfig.i18n.json | 3 +-- .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../services/modelServiceImpl.i18n.json | 4 ++-- .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 4 +++- .../parts/editor/binaryDiffEditor.i18n.json | 3 ++- .../parts/editor/editorActions.i18n.json | 5 +--- .../parts/editor/editorStatus.i18n.json | 10 ++++---- .../quickopen/quickOpenController.i18n.json | 2 +- .../electron-browser/actions.i18n.json | 2 ++ .../main.contribution.i18n.json | 1 + .../workbench/electron-browser/main.i18n.json | 6 +++++ .../debug.contribution.i18n.json | 1 + .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionEditor.i18n.json | 2 ++ .../extensionTipsService.i18n.json | 4 +++- .../extensionsActions.i18n.json | 7 ++++++ .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../browser/views/openEditorsView.i18n.json | 4 ++-- .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../search/browser/searchActions.i18n.json | 4 ++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminal.contribution.i18n.json | 3 ++- .../terminalActions.i18n.json | 23 ++++++++++--------- .../terminalInstance.i18n.json | 1 + .../configurationEditingService.i18n.json | 11 +++++---- .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 3 +-- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 2 +- .../parts/editor/editorActions.i18n.json | 4 ---- .../quickopen/quickOpenController.i18n.json | 2 +- .../main.contribution.i18n.json | 4 ++-- .../workbench/electron-browser/main.i18n.json | 6 +++++ .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionTipsService.i18n.json | 1 + .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../browser/views/openEditorsView.i18n.json | 4 ++-- .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminal.contribution.i18n.json | 2 +- .../terminalInstance.i18n.json | 1 + .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 3 +-- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 2 +- .../parts/editor/editorActions.i18n.json | 4 ---- .../quickopen/quickOpenController.i18n.json | 2 +- .../workbench/electron-browser/main.i18n.json | 6 +++++ .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionTipsService.i18n.json | 1 + .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../browser/views/openEditorsView.i18n.json | 4 ++-- .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminal.contribution.i18n.json | 2 +- .../terminalInstance.i18n.json | 1 + .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 11 ++++++--- .../extensions/typescript/package.i18n.json | 2 ++ .../resourceviewer/resourceViewer.i18n.json | 11 +++++---- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../src/vs/code/electron-main/main.i18n.json | 4 +++- .../src/vs/code/electron-main/menus.i18n.json | 6 +++-- .../vs/code/electron-main/windows.i18n.json | 1 + .../config/commonEditorConfig.i18n.json | 3 +-- .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../services/modelServiceImpl.i18n.json | 4 ++-- .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 5 +++- .../parts/editor/binaryDiffEditor.i18n.json | 3 ++- .../parts/editor/editorActions.i18n.json | 5 +--- .../parts/editor/editorStatus.i18n.json | 10 ++++---- .../quickopen/quickOpenController.i18n.json | 2 +- .../electron-browser/actions.i18n.json | 2 ++ .../main.contribution.i18n.json | 1 + .../workbench/electron-browser/main.i18n.json | 6 +++++ .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionEditor.i18n.json | 2 ++ .../extensionTipsService.i18n.json | 4 +++- .../extensionsActions.i18n.json | 6 +++++ .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../browser/views/openEditorsView.i18n.json | 4 ++-- .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../search/browser/searchActions.i18n.json | 4 ++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminal.contribution.i18n.json | 3 ++- .../terminalActions.i18n.json | 23 ++++++++++--------- .../terminalInstance.i18n.json | 1 + .../configurationEditingService.i18n.json | 11 +++++---- .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 3 +-- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 2 +- .../parts/editor/editorActions.i18n.json | 4 ---- .../quickopen/quickOpenController.i18n.json | 2 +- .../workbench/electron-browser/main.i18n.json | 6 +++++ .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionTipsService.i18n.json | 1 + .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminal.contribution.i18n.json | 2 +- .../terminalInstance.i18n.json | 1 + .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 3 +-- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../indentation/common/indentation.i18n.json | 4 ++-- .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 2 +- .../parts/editor/editorActions.i18n.json | 4 ---- .../workbench/electron-browser/main.i18n.json | 6 +++++ .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionTipsService.i18n.json | 1 + .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../browser/views/openEditorsView.i18n.json | 4 ++-- .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminalInstance.i18n.json | 1 + .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ .../html/client/out/htmlMain.i18n.json | 6 +++++ .../out/typescriptServiceClient.i18n.json | 3 +-- .../src/vs/base/common/errorMessage.i18n.json | 6 +++++ .../src/vs/base/common/keybinding.i18n.json | 6 +++++ .../common/modes/snippetsRegistry.i18n.json | 6 +++++ .../platform/environment/node/argv.i18n.json | 6 +++++ .../node/extensionManagementService.i18n.json | 2 +- .../parts/editor/editorActions.i18n.json | 4 ---- .../workbench/electron-browser/main.i18n.json | 6 +++++ .../terminalSupport.i18n.json | 6 +++++ .../terminalService.i18n.json | 6 +++++ .../extensionTipsService.i18n.json | 1 + .../extensionsFileTemplate.i18n.json | 6 +++++ .../extensionsViewlet.i18n.json | 2 ++ .../extensionsWorkbenchService.i18n.json | 6 +++++ .../browser/views/openEditorsView.i18n.json | 4 ++-- .../dirtyFilesTracker.i18n.json | 6 +++++ .../textFileService.i18n.json | 6 +++++ .../snippetsTracker.i18n.json | 6 +++++ .../terminalInstance.i18n.json | 1 + .../configurationResolverService.i18n.json | 6 +++++ .../browser/messagelist/messageList.i18n.json | 6 +++++ 242 files changed, 1050 insertions(+), 162 deletions(-) create mode 100644 i18n/chs/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/chs/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/chs/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/chs/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/chs/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/chs/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/chs/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/chs/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json create mode 100644 i18n/cht/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/cht/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/cht/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/cht/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/cht/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/cht/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/cht/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/cht/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json create mode 100644 i18n/deu/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/deu/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/deu/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/deu/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/deu/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/deu/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/deu/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/deu/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json create mode 100644 i18n/esn/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/esn/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/esn/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/esn/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/esn/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/esn/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/esn/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/esn/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json create mode 100644 i18n/fra/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/fra/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/fra/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/fra/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/fra/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/fra/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/fra/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/fra/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json create mode 100644 i18n/ita/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/ita/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/ita/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/ita/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/ita/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/ita/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/ita/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/ita/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json create mode 100644 i18n/jpn/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/jpn/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/jpn/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/jpn/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/jpn/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json create mode 100644 i18n/kor/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/kor/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/kor/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/kor/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/kor/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/kor/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/kor/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/kor/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json create mode 100644 i18n/rus/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/rus/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/rus/src/vs/base/common/keybinding.i18n.json create mode 100644 i18n/rus/src/vs/editor/common/modes/snippetsRegistry.i18n.json create mode 100644 i18n/rus/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/rus/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json create mode 100644 i18n/rus/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json create mode 100644 i18n/rus/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json diff --git a/i18n/chs/extensions/html/client/out/htmlMain.i18n.json b/i18n/chs/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/chs/extensions/typescript/out/typescriptServiceClient.i18n.json index fa94af1c5f9..14d9499ed4e 100644 --- a/i18n/chs/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/chs/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "继续使用版本 {0}", + "close": "关闭", "doNotCheckAgain": "不要再次检查", "localTSFound": "工作区文件夹包含 TypeScript 版本 {0}。是否要使用此版本而不是捆绑的版本 {1}?", "moreInformation": "详细信息", @@ -14,7 +14,6 @@ "serverDied": "在过去 5 分钟内,TypeScript 语言服务意外中止了 5 次。请考虑启用 bug 报告。", "serverDiedAfterStart": "TypeScript 语言服务在其启动后已中止 5 次。将不会重启该服务。请启用 bug 报告。", "use": "使用 {0}", - "useAlways": "详细信息", "useBundled": "使用 {0}", "versionMismatch": "检测到全局安装的 tsc 编译器({0})与 VS 代码语言服务({1})版本不匹配。这可能导致不一致的编译错误。", "versionNumber.custom": "自定义" diff --git a/i18n/chs/src/vs/base/common/errorMessage.i18n.json b/i18n/chs/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/base/common/keybinding.i18n.json b/i18n/chs/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/chs/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index a8968869413..a019613cb3a 100644 --- a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "关闭", "invalidManifest": "扩展无效: package.json 不是 JSON 文件。", "invalidName": "扩展无效: 清单名不匹配。", "invalidPublisher": "扩展无效: 清单发布服务器不匹配。", "invalidVersion": "扩展无效: 清单版本不匹配。", - "noCompatible": "找不到可与此代码版本兼容的 {0} 版本。", "notExists": "找不到扩展", "restartCode": "请先重启 Code 再重新安装 {0}。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 31b3553e7a2..44bca660157 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,7 +12,6 @@ "closeEditorsToTheLeft": "关闭左侧编辑器", "closeEditorsToTheRight": "关闭右侧编辑器", "closeOtherEditorsInGroup": "关闭其他编辑器", - "closeQuickOpen": "关闭速启", "evenEditorGroups": "编辑器组平均宽度", "focusFirstEditorGroup": "聚焦于左侧编辑器组", "focusLastEditorInStack": "打开组中上一个编辑器", @@ -38,9 +37,6 @@ "openPreviousEditor": "打开上一个编辑器", "openPreviousEditorInGroup": "打开组中上一个最近使用的编辑器", "openToSide": "打开到侧边", - "quickNavigateNext": "在速启中导航到下一个", - "quickNavigatePrevious": "在速启中导航到上一个", - "quickOpen": "转到文件...", "removeFromEditorHistory": "从编辑器历史记录中删除", "reopenClosedEditor": "重新打开已关闭的编辑器", "showAllEditors": "显示所有编辑器", diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/chs/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 770876f502e..eeff2209707 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "关闭", "neverShowAgain": "不再显示", "reallyRecommended": "建议安装“{0}”扩展。", "showRecommendations": "显示建议" diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 742b962ec7e..eedaf81c41f 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "排序顺序: ↑", "descending": "排序顺序: ↓", + "extensions": "扩展", + "outdatedExtensions": "{0} 个过时的扩展", "searchExtensions": "在应用商店中搜索扩展", "sort by installs": "排序依据: 安装计数", "sort by rating": "排序依据: 分级", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json index 0ef3b0039dd..6166800b1d6 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "dirtyCounter": "{0} 个未保存", - "openEditors": "打开编辑器", - "openEditosrSection": "打开编辑器部分", - "treeAriaLabel": "打开编辑器" + "openEditors": "打开的编辑器", + "openEditosrSection": "打开的编辑器部分", + "treeAriaLabel": "打开的编辑器" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 2a3a74d4d36..271a00862d2 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "当终端没有位于焦点时无法复制终端选定内容", "terminal.integrated.exitedWithCode": "通过退出代码 {0} 终止的终端进程" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/chs/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/chs/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/html/client/out/htmlMain.i18n.json b/i18n/cht/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json index a2992e3d607..1fb5a3656b7 100644 --- a/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "繼續使用版本 {0}", + "close": "關閉", "doNotCheckAgain": "不要再檢查", "localTSFound": "工作區資料夾包含 TypeScript 版本 {0}。要使用此版本,而非配套版本 {1} 嗎?", "moreInformation": "詳細資訊", @@ -14,7 +14,6 @@ "serverDied": "TypeScript 語言服務在過去 5 分鐘內意外中止 5 次。請考慮開啟問題報告。", "serverDiedAfterStart": "TypeScript 語言服務在啟動後立即中止 5 次。服務將不會重新啟動。請開啟問題報告。", "use": "使用 {0}", - "useAlways": "詳細資訊", "useBundled": "使用 {0}", "versionMismatch": "偵測到全域安裝的 TSC 編譯器 ({0}) 和 VS Code 的語言服務 ({1}) 之間版本不符。這可能會導致編譯不一致的錯誤。", "versionNumber.custom": "自訂" diff --git a/i18n/cht/src/vs/base/common/errorMessage.i18n.json b/i18n/cht/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/base/common/keybinding.i18n.json b/i18n/cht/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/cht/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index a4bd65596ed..ee2d50a0160 100644 --- a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "關閉", "invalidManifest": "擴充功能無效: package.json 不是 JSON 檔案。", "invalidName": "擴充功能無效: 資訊清單名稱不相符。", "invalidPublisher": "擴充功能無效: 資訊清單發行者不相符。", "invalidVersion": "擴充功能無效: 資訊清單版本不相符。", - "noCompatible": "找不到與此 Code 版本相容的 {0} 版本。", "notExists": "找不到擴充功能", "restartCode": "請先重新啟動 Code,再重新安裝 {0}。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index d6e1ad06c0f..97c628a9b9a 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,7 +12,6 @@ "closeEditorsToTheLeft": "將編輯器關到左側", "closeEditorsToTheRight": "將編輯器關到右側", "closeOtherEditorsInGroup": "關閉其他編輯器", - "closeQuickOpen": "關閉快速開啟", "evenEditorGroups": "均分編輯器群組寬度", "focusFirstEditorGroup": "聚焦左側編輯器群組", "focusLastEditorInStack": "開啟群組中最後一個編輯器", @@ -38,9 +37,6 @@ "openPreviousEditor": "開啟上一個編輯器", "openPreviousEditorInGroup": "開啟群組中上一個最近使用的編輯器", "openToSide": "開至側邊", - "quickNavigateNext": "快速開啟時導覽至下一個項目", - "quickNavigatePrevious": "快速開啟時導覽至上一個項目", - "quickOpen": "移至檔案...", "removeFromEditorHistory": "從編輯器記錄中移除", "reopenClosedEditor": "重新開啟已關閉的編輯器", "showAllEditors": "顯示所有編輯器", diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/cht/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 4c2bab2fd15..0f59e9665bc 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "關閉", "neverShowAgain": "不要再顯示", "reallyRecommended": "建議您安裝 '{0}' 擴充功能。", "showRecommendations": "顯示建議" diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 1f16243a094..9169add056b 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "排序依據: ↑", "descending": "排序依據: ↓", + "extensions": "延伸模組", + "outdatedExtensions": "{0} 過期的擴充功能", "searchExtensions": "在 Marketplace 中搜尋擴充功能", "sort by installs": "排序依據: 安裝計數", "sort by rating": "排序依據: 評等", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/cht/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json index 5c91e735c17..b137a0cb793 100644 --- a/i18n/cht/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "dirtyCounter": "{0} 未儲存", - "openEditors": "開啟編輯器", - "openEditosrSection": "開啟編輯器區段", - "treeAriaLabel": "開啟編輯器" + "openEditors": "已開啟的編輯器", + "openEditosrSection": "開放式編輯器區段", + "treeAriaLabel": "已開啟的編輯器" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 555ed2db645..4fe4f190811 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "無法在終端機沒有焦點時複製終端機選取範圍", "terminal.integrated.exitedWithCode": "終端機處理序已終止,結束代碼為: {0}" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/cht/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/cht/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/html/client/out/htmlMain.i18n.json b/i18n/deu/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/deu/extensions/typescript/out/typescriptServiceClient.i18n.json index c99ff4d1350..cade9a81e8d 100644 --- a/i18n/deu/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/deu/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,17 +5,22 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "Version {0} wird verwendet.", + "close": "Schließen", "doNotCheckAgain": "Nicht erneut überprüfen", "localTSFound": "Der Arbeitsbereichsordner enthält die TypeScript-Version {0}. Möchten Sie diese Version anstelle der Paketversion {1} verwenden?", "moreInformation": "Weitere Informationen", + "neverCheckLocalVesion": "Arbeitsbereichsversion nie überprüfen", "noServerFound": "Der Pfad \"{0}\" verweist nicht auf eine gültige Tsserver-Installation. TypeScript-Sprachfeatures werden deaktiviert.", "serverCouldNotBeStarted": "Der TypeScript-Sprachserver konnte nicht gestartet werden. Fehlermeldung: {0}", "serverDied": "Der TypeScript-Sprachdienst wurde während der letzten 5 Minuten 5 Mal unerwartet beendet. Öffnen Sie ggf. einen Fehlerbericht.", "serverDiedAfterStart": "Der TypeScript-Sprachdienst wurde 5 Mal direkt nach seinem Start beendet. Der Dienst wird nicht neu gestartet. Bitte öffnen Sie einen Fehlerbericht.", - "use": "{0} verwenden", - "useAlways": "Weitere Informationen", - "useBundled": "{0} verwenden", + "tsversion20": "VS Code 1.6 ist im Lieferumfang von TypeScript Version 2.0.3 enthalten. Wenn Sie eine frühere Version von TypeScript verwenden möchten, legen Sie die Option \"typescript.tsdk\" fest.", + "updateGlobalWorkspaceCheck": "Die Benutzereinstellung \"typescript.check.workspaceVersion\" wurde in FALSE aktualisiert.", + "updateLocalWorkspaceCheck": "Die Arbeitsbereicheinstellung \"typescript.check.workspaceVersion\" wurde in FALSE aktualisiert.", + "updateTscCheck": "Die Benutzereinstellung \"typescript.check.tscVersion\" wurde in FALSE aktualisiert.", + "updatedtsdk": "Die Arbeitsbereicheinstellung \"typescript.tsdk\" wurde in {0} aktualisiert.", + "use": "Arbeitsbereich verwenden ({0})", + "useBundled": "Paket verwenden ({0})", "versionMismatch": "Ein Versionskonflikt zwischen dem global installierten TSC-Compiler ({0}) und dem Sprachdienst von VS Code ({1}) wurde erkannt. Dies kann ggf. zu inkonsistenten Kompilierungsfehlern führen.", "versionNumber.custom": "benutzerdefiniert" } \ No newline at end of file diff --git a/i18n/deu/extensions/typescript/package.i18n.json b/i18n/deu/extensions/typescript/package.i18n.json index 3b9c6b46f97..62cba7ba325 100644 --- a/i18n/deu/extensions/typescript/package.i18n.json +++ b/i18n/deu/extensions/typescript/package.i18n.json @@ -16,6 +16,8 @@ "format.placeOpenBraceOnNewLineForFunctions": "Definiert, ob eine öffnende geschweifte Klammer in eine neue Zeile für Funktionen eingefügt wird.", "javascript.reloadProjects.title": "JavaScript-Projekt erneut laden", "javascript.validate.enable": "JavaScript-Überprüfung aktivieren/deaktivieren", + "typescript.check.tscVersion": "Überprüfen, ob sich ein global installierter TypeScript-Compiler (z. B. tsc) vom verwendeten TypeScript-Sprachdienst unterscheidet.", + "typescript.check.workspaceVersion": "Überprüfen, ob eine TypeScript-Version im Arbeitsbereich verfügbar ist", "typescript.reloadProjects.title": "TypeScript-Projekt erneut laden", "typescript.tsdk.desc": "Gibt den Ordnerpfad mit den zu verwendenden tsserver- und lib*.d.ts-Dateien an.", "typescript.tsdk_version.desc": "Gibt die Version von tsserver an. Nur erforderlich, wenn der tsserver nicht mithilfe von npm installiert wird.", diff --git a/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index ec48067cdc3..64ec39533a7 100644 --- a/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "imgTitle": "{0} ({1}x{2})", - "missingAudioSupport": "Wiedergabe von Audiodateien wird nicht unterstützt.", - "missingVideoSupport": "Wiedergabe von Audiodateien wird nicht unterstützt.", - "nativeBinaryError": "Die Datei wird nicht im Editor angezeigt, weil sie binär oder sehr groß ist oder eine nicht unterstützte Textcodierung verwendet." + "imgMeta": "{0}x{1} {2}", + "nativeBinaryError": "Die Datei wird nicht im Editor angezeigt, weil sie binär oder sehr groß ist oder eine nicht unterstützte Textcodierung verwendet.", + "sizeB": "{0} B", + "sizeGB": "{0} GB", + "sizeKB": "{0} KB", + "sizeMB": "{0} MB", + "sizeTB": "{0} TB" } \ No newline at end of file diff --git a/i18n/deu/src/vs/base/common/errorMessage.i18n.json b/i18n/deu/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/base/common/keybinding.i18n.json b/i18n/deu/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/main.i18n.json b/i18n/deu/src/vs/code/electron-main/main.i18n.json index 01638af00f2..784ecc7f0a9 100644 --- a/i18n/deu/src/vs/code/electron-main/main.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/main.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "newWindow": "Neues Fenster" + "folderDesc": "{0} {1}", + "newWindow": "Neues Fenster", + "newWindowDesc": "Öffnet ein neues Fenster." } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/menus.i18n.json b/i18n/deu/src/vs/code/electron-main/menus.i18n.json index 35ecf355726..9be8fbaf8d6 100644 --- a/i18n/deu/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/menus.i18n.json @@ -19,6 +19,8 @@ "mView": "&&Anzeigen", "mWindow": "Fenster", "miAbout": "&&Info", + "miAccessibilityOptions": "&&Optionen für erleichterte Bedienung", + "miAutoSave": "Automatisch speichern", "miBack": "&&Zurück", "miCheckForUpdates": "Auf Updates überprüfen...", "miCheckingForUpdates": "Überprüfen auf Updates...", @@ -42,7 +44,8 @@ "miGotoDefinition": "Gehe &&zu Definition", "miGotoFile": "Gehe zu &&Datei...", "miGotoLine": "Gehe zu Zei&&le...", - "miGotoSymbol": "Gehe zu &&Symbol...", + "miGotoSymbolInFile": "Gehe zu &&Symbol in Datei...", + "miGotoSymbolInWorkspace": "Zu Symbol im &&Arbeitsbereich wechseln...", "miInstallingUpdate": "Update wird installiert...", "miLicense": "&&Lizenz anzeigen", "miMarker": "&&Probleme", @@ -92,7 +95,6 @@ "miToggleOutput": "&&Ausgabe", "miTogglePanel": "&&Bereich umschalten", "miToggleRenderControlCharacters": "&&Steuerzeichen umschalten", - "miToggleRenderWhitespace": "&&Rendern von Leerzeichen umschalten", "miToggleSidebar": "&&Randleiste umschalten", "miToggleStatusbar": "&&Statusleiste umschalten", "miToggleWordWrap": "&&Zeilenumbruch umschalten", diff --git a/i18n/deu/src/vs/code/electron-main/windows.i18n.json b/i18n/deu/src/vs/code/electron-main/windows.i18n.json index 64be20eb029..81f229b4502 100644 --- a/i18n/deu/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/windows.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "accessibilityOptionsWindowTitle": "Optionen für erleichterte Bedienung", "appCrashed": "Das Fenster ist abgestürzt.", "appCrashedDetail": "Bitte entschuldigen Sie die Unannehmlichkeiten. Sie können das Fenster erneut öffnen und dort weitermachen, wo Sie aufgehört haben.", "appStalled": "Das Fenster reagiert nicht mehr.", diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index f6effbe31c1..1f2d3da8f88 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -17,7 +17,6 @@ "fontSize": "Steuert den Schriftgrad in Pixeln.", "fontWeight": "Steuert die Schriftbreite.", "formatOnType": "Steuert, ob der Editor Zeilen automatisch nach der Eingabe formatiert.", - "glyphMargin": "Steuert die Sichtbarkeit des Glyphenrands.", "hideCursorInOverviewRuler": "Steuert die Sichtbarkeit des Cursors im Übersichtslineal.", "ignoreTrimWhitespace": "Steuert, ob der Diff-Editor Änderungen in führenden oder nachgestellten Leerzeichen als Diffs anzeigt.", "insertSpaces": "Fügt beim Drücken der TAB-TASTE Leerzeichen ein. Diese Einstellung wird basierend auf dem Inhalt der Datei überschrieben, wenn \"editor.detectIndentation\" aktiviert ist.", @@ -33,7 +32,7 @@ "renderControlCharacters": "Steuert, ob der Editor Steuerzeichen rendern soll.", "renderIndentGuides": "Steuert, ob der Editor Einzugsführungslinien rendern soll.", "renderLineHighlight": "Steuert, ob der Editor die aktuelle Zeilenhervorhebung rendern soll.", - "renderWhitespace": "Steuert, ob der Editor Leerzeichen rendert.", + "renderWhitespace": "Steuert, wie der Editor Leerzeichen rendert. Mögliche Optionen: \"none\", \"boundary\" und \"all\". Die Option \"boundary\" rendert keine einzelnen Leerzeichen zwischen Wörtern.", "roundedSelection": "Steuert, ob die Auswahl runde Ecken aufweist.", "rulers": "Spalten, an denen vertikale Lineale angezeigt werden sollen", "scrollBeyondLastLine": "Legt fest, ob der Editor Bildläufe über die letzte Zeile hinaus ausführt.", diff --git a/i18n/deu/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/deu/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/services/modelServiceImpl.i18n.json b/i18n/deu/src/vs/editor/common/services/modelServiceImpl.i18n.json index da8500b1afd..ed2bf1936fb 100644 --- a/i18n/deu/src/vs/editor/common/services/modelServiceImpl.i18n.json +++ b/i18n/deu/src/vs/editor/common/services/modelServiceImpl.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "indentAutoMigrate": "Bitte aktualisieren Sie Ihre Einstellungen: \"editor.detectIndentation\" ersetzt \"editor.tabSize\": \"auto\" oder \"editor.insertSpaces\": \"auto\"", - "sourceAndDiagMessage": "[{0}] {1}" + "diagAndSource": "[{0}] {1}", + "indentAutoMigrate": "Bitte aktualisieren Sie Ihre Einstellungen: \"editor.detectIndentation\" ersetzt \"editor.tabSize\": \"auto\" oder \"editor.insertSpaces\": \"auto\"" } \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 36b0f9813d6..b9c60aec61a 100644 --- a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,13 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Schließen", + "installDependecies": "Diese Extension besitzt Abhängigkeiten. Sollen diese ebenfalls installiert werden?", + "installWithDependenices": "Mit Abhängigkeiten installieren", "invalidManifest": "Die Erweiterung ist ungültig: \"package.json\" ist keine JSON-Datei.", "invalidName": "Die Erweiterung ist ungültig: Manifestnamenkonflikt.", "invalidPublisher": "Die Erweiterung ist ungültig: Manifestherausgeberkonflikt.", "invalidVersion": "Die Erweiterung ist ungültig: Manifestversionskonflikt.", - "noCompatible": "Eine kompatible Version von {0} mit dieser Version des Codes wurde nicht gefunden.", "notExists": "Die Erweiterung wurde nicht gefunden.", "restartCode": "Bitte starten Sie Code vor der Neuinstallation von {0} neu." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json index 50a115a472e..d00cabf0ffb 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json @@ -5,5 +5,6 @@ // Do not edit this file. It is machine generated. { "binaryDiffEditor": "Binärdiff-Viewer", - "cannotDiffTextToBinary": "Das Vergleichen von Binärdateien mit Nicht-Binärdateien wird zurzeit nicht unterstützt." + "cannotDiffTextToBinary": "Das Vergleichen von Binärdateien mit Nicht-Binärdateien wird zurzeit nicht unterstützt.", + "metadataDiff": "{0} ↔ {1}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 07b48410d49..1034cb9cdfc 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,8 +12,8 @@ "closeEditorsToTheLeft": "Editoren links schließen", "closeEditorsToTheRight": "Editoren rechts schließen", "closeOtherEditorsInGroup": "Andere Editoren schließen", - "closeQuickOpen": "Quick Open schließen", "evenEditorGroups": "Gleichmäßige Breite der Editor-Gruppe", + "focusActiveEditorGroup": "Fokus in aktiver Editor-Gruppe", "focusFirstEditorGroup": "Fokus in linker Editor-Gruppe", "focusLastEditorInStack": "Letzten Editor in der Gruppe öffnen", "focusNextGroup": "Fokus in nächster Gruppe", @@ -38,9 +38,6 @@ "openPreviousEditor": "Vorherigen Editor öffnen", "openPreviousEditorInGroup": "Vorherigen zuletzt verwendeten Editor in der Gruppe öffnen", "openToSide": "An der Seite öffnen", - "quickNavigateNext": "Zum nächsten Element in Quick Open navigieren", - "quickNavigatePrevious": "Zum vorherigen Element in Quick Open navigieren", - "quickOpen": "Gehe zu Datei...", "removeFromEditorHistory": "Aus Editor-Verlauf entfernen", "reopenClosedEditor": "Geschlossenen Editor erneut öffnen", "showAllEditors": "Alle Editoren anzeigen", diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 93c4fdbae3c..967978e44b3 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -9,28 +9,30 @@ "changeEndOfLine": "Zeilenendesequenz ändern", "changeIndentation": "Einzug ändern", "changeMode": "Sprachmodus ändern", - "configureAssociations": "Dateizuordnungen konfigurieren...", "configureAssociationsExt": "Dateizuordnung für \"{0}\" konfigurieren...", - "configuredLanguage": "Konfigurierte Sprache", + "currentAssociation": "Aktuelle Zuordnung", "disableTabMode": "Barrierefreiheitsmodus deaktivieren", "endOfLineCarriageReturnLineFeed": "CRLF", "endOfLineLineFeed": "LF", + "fileInfo": "Dateiinformationen", "gotoLine": "Gehe zu Zeile", "indentConvert": "Datei konvertieren", "indentView": "Ansicht wechseln", "indentation": "Einzug", - "languagesPicks": "Sprachen", + "languageDescription": "({0}): konfigurierte Sprache", + "languageDescriptionConfigured": "({0})", + "languagesPicks": "Sprachen (Bezeichner)", "multiSelection": "{0} Auswahlen", "multiSelectionRange": "{0} Auswahlen ({1} Zeichen ausgewählt)", "noEditor": "Zurzeit ist kein Text-Editor aktiv.", "noFileEditor": "Zurzeit ist keine Datei aktiv.", "noWritableCodeEditor": "Der aktive Code-Editor ist schreibgeschützt.", - "persistFileAssociations": "Sie können Zuordnungen zwischen dem Dateinamen und der Sprache im Abschnitt **files.associations** konfigurieren. Für die Änderungen ist ggf. ein Neustart erforderlich, damit sie für bereits geöffnete Dateien wirksam werden.", "pickAction": "Aktion auswählen", "pickEncodingForReopen": "Dateicodierung zum erneuten Öffnen der Datei auswählen", "pickEncodingForSave": "Dateicodierung auswählen, mit der gespeichert werden soll", "pickEndOfLine": "Zeilenendesequenz auswählen", "pickLanguage": "Sprachmodus auswählen", + "pickLanguageToConfigure": "Sprachmodus auswählen, der \"{0}\" zugeordnet werden soll", "reopenWithEncoding": "Mit Codierung erneut öffnen", "saveWithEncoding": "Mit Codierung speichern", "selectEOL": "Zeilenendesequenz auswählen", diff --git a/i18n/deu/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 50fcbeb5e51..8943ebdc7ff 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "canNotRunPlaceholder": "Dieser Handler zum schnellen Öffnen kann im aktuellen Kontext nicht verwendet werden.", + "canNotRunPlaceholder": "Dieser Quick Open-Handler kann im aktuellen Kontext nicht verwendet werden.", "emptyPicks": "Es sind keine Einträge zur Auswahl verfügbar.", "entryAriaLabel": "{0}, zuletzt geöffnet", "historyMatches": "zuletzt geöffnet", diff --git a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json index 00201a51d18..c0c24c67bdb 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json @@ -18,6 +18,8 @@ "openRecentPlaceHolder": "Wählen Sie einen zu öffnenden Pfad aus (halten Sie STRG gedrückt, um ein neues Fenster zu öffnen).", "openRecentPlaceHolderMac": "Wählen Sie einen Pfad aus (halten Sie die BEFEHLSTASTE gedrückt, um ein neues Fenster zu öffnen).", "reloadWindow": "Fenster erneut laden", + "switchWindow": "Fenster wechseln", + "switchWindowPlaceHolder": "Fenster auswählen", "toggleDevTools": "Entwicklertools umschalten", "toggleFullScreen": "Vollbild umschalten", "toggleMenuBar": "Menüleiste umschalten", diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json index dca1699a94f..8dc78be3494 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -15,6 +15,7 @@ "reopenFolders": "Steuert, wie Ordner nach einem Neustart erneut geöffnet werden. Wählen Sie \"none\" aus, um Ordner nie erneut zu öffnen, \"one\", um den zuletzt bearbeiteten Ordner erneut zu öffnen, oder \"all\", um alle Ordner der letzten Sitzung erneut zu öffnen.", "restoreFullscreen": "Steuert, ob ein Fenster im Vollbildmodus wiederhergestellt wird, wenn es im Vollbildmodus beendet wurde.", "showEditorTabs": "Steuert, ob geöffnete Editoren auf Registerkarten angezeigt werden sollen.", + "showIcons": "Steuert, ob geöffnete Editoren mit einem Symbol angezeigt werden sollen.", "updateChannel": "Konfiguriert, ob automatische Updates aus einem Updatekanal empfangen werden sollen. Erfordert einen Neustart nach der Änderung.", "updateConfigurationTitle": "Update", "view": "Anzeigen", diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 717fe79519d..e16f81ea71b 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -6,6 +6,7 @@ { "debug": "Debuggen", "debugCategory": "Debuggen", + "debugErrorEditor": "Fehler debuggen", "debugPanel": "Debugkonsole", "launchConfigDoesNotExist": "Die Startkonfiguration \"{0}\" ist nicht vorhanden.", "toggleDebugViewlet": "Debuggen anzeigen", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/deu/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 77359929d47..985d3b43295 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "JSON Validation": "JSON-Validierung ({0})", + "changelog": "ChangeLog", "command name": "Name", "commands": "Befehle ({0})", "contributions": "Beiträge", @@ -18,6 +19,7 @@ "languages": "Sprachen ({0})", "license": "Lizenz", "menuContexts": "Menükontexte", + "noChangelog": "Es ist kein CHANGELOG verfügbar.", "noReadme": "Keine INFODATEI verfügbar.", "runtime": "Laufzeit", "setting name": "Name", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 2cf09e1cce3..8d4e4592085 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,7 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Schließen", "neverShowAgain": "Nicht mehr anzeigen", "reallyRecommended": "Es wird empfohlen, die Extension'{0}' zu installieren.", - "showRecommendations": "Empfehlungen anzeigen" + "showRecommendations": "Empfehlungen anzeigen", + "workspaceRecommended": "Für diesen Arbeitsbereich sind Extensionempfehlungen verfügbar." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json index b09088ea082..84ad7655fa6 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json @@ -4,12 +4,18 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "ConfigureWorkspaceRecommendations.noWorkspace": "Empfehlungen sind nur für einen Arbeitsbereichsordner verfügbar.", + "OpenExtensionsFile.failed": "Die Datei \"extensions.json\" kann nicht im Ordner \".vscode\" erstellt werden ({0}).", + "builtin": "Integriert", "clearExtensionsInput": "Extensioneingabe löschen", + "configureWorkspaceRecommendedExtensions": "Für den Arbeitsbereich empfohlene Extensions konfigurieren", "deleteSure": "Möchten Sie \"{0}\" deinstallieren?", "enableAction": "Aktivieren", "installAction": "Installieren", "installExtensions": "Extensions installieren", + "installVSIX": "Aus VSIX installieren...", "installing": "Wird installiert.", + "openExtensionsFolder": "Extensionordner öffnen", "postUninstallMessage": "{0} wurde erfolgreich deinstalliert. Führen Sie zur Deaktivierung einen Neustart aus.", "restart": "Damit diese Extension aktiviert wird, muss dieses Fenster von VS Code neu gestartet werden.\n\nMöchten Sie fortfahren?", "restartNow": "Jetzt neu starten", @@ -17,6 +23,7 @@ "showOutdatedExtensions": "Veraltete Extensions anzeigen", "showPopularExtensions": "Beliebte Extensions anzeigen", "showRecommendedExtensions": "Empfohlene Extensions anzeigen", + "showWorkspaceRecommendedExtensions": "Für den Arbeitsbereich empfohlene Extensions anzeigen", "toggleExtensionsViewlet": "Extensions anzeigen", "uninstall": "Deinstallieren", "updateAction": "Aktualisieren", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 9a6ada72963..c2e7b9fbbb1 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "Sortierreihenfolge: ↑", "descending": "Sortierreihenfolge: ↓", + "extensions": "Extensions", + "outdatedExtensions": "{0} veraltete Extensions", "searchExtensions": "Nach Extensions in Marketplace suchen", "sort by installs": "Sortieren nach: Installationsanzahl", "sort by rating": "Sortieren nach: Bewertung", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/deu/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json index 27329fadd93..05814da6d6b 100644 --- a/i18n/deu/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "dirtyCounter": "{0} nicht gespeichert", - "openEditors": "Editoren öffnen", - "openEditosrSection": "Abschnitt \"Editoren\" öffnen", + "openEditors": "Geöffnete Editoren", + "openEditosrSection": "Abschnitt \"Geöffnete Editoren\"", "treeAriaLabel": "Geöffnete Editoren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 49701036b19..82444ba4e1b 100644 --- a/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,7 +10,11 @@ "RemoveAction.label": "Entfernen", "file.replaceAll.label": "Alle ersetzen", "findInFolder": "In Ordner suchen", + "focusNextInputbox": "Fokus im nächsten Eingabefeld", + "focusPreviousInputbox": "Fokus im vorherigen Eingabefeld", "match.replace.label": "Ersetzen", + "nextSearchTerm": "Nächsten Suchbegriff anzeigen", + "previousSearchTerm": "Vorherigen Suchbegriff anzeigen", "replaceInFiles": "In Dateien ersetzen", "showSearchViewlet": "Suche anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 0db1a7500c2..8613a833589 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "terminal": "Terminal", - "terminal.integrated.commandsToSkipShell": "Eine Sammlung von Befehls-IDs, deren Tastenbindungen nicht an die Shell gesendet und die stattdessen immer durch Code verarbeitet werden. Dies ermöglicht die Verwendung von Tastenbindungen, die normalerweise von der Shell verwendet würden, um das gleiche Verhalten wie bei einem Terminal ohne Fokus zu erzielen, z. B. STRG+P zum Starten von Quick Open.", + "terminal.integrated.commandsToSkipShell": "Eine Sammlung von Befehls-IDs, deren Tastenzuordnungen nicht an die Shell gesendet und die stattdessen immer durch Code verarbeitet werden. Dies ermöglicht die Verwendung von Tastenzuordnungen, die normalerweise von der Shell verwendet würden, um das gleiche Verhalten wie bei einem Terminal ohne Fokus zu erzielen, z. B. STRG+P zum Starten von Quick Open.", "terminal.integrated.cursorBlinking": "Steuert, ob der Terminalcursor blinkt.", "terminal.integrated.fontFamily": "Steuert die Schriftartfamilie des Terminals. Der Standardwert ist \"editor.fontFamily\".", "terminal.integrated.fontLigatures": "Steuert, ob Schriftartligaturen im Terminal aktiviert sind.", @@ -17,6 +17,7 @@ "terminal.integrated.shell.windows": "Der Pfad der Shell, den das Terminal unter Windows verwendet. Wenn Shells aus dem Lieferumfang von Windows (cmd, PowerShell oder Bash für Ubuntu) verwendet werden, sollten Sie \"C:Windowssysnative\" dem Pfad \"C:WindowsSystem32\" vorziehen, um die 64-Bit-Versionen zu verwenden.", "terminal.integrated.shellArgs.linux": "Die Befehlszeilenargumente, die für das Linux-Terminal verwendet werden sollen.", "terminal.integrated.shellArgs.osx": "Die Befehlszeilenargumente, die für das OS X-Terminal verwendet werden sollen.", + "terminalCategory": "Terminal", "terminalIntegratedConfigurationTitle": "Integriertes Terminal", "viewCategory": "Anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index bec47e76072..441d2eec303 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -4,18 +4,19 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "workbench.action.terminal.copySelection": "Terminal: Auswahl kopieren", - "workbench.action.terminal.focus": "Terminal: Fokus im Terminal", - "workbench.action.terminal.focusNext": "Terminal: Fokus im nächsten Terminal", - "workbench.action.terminal.focusPrevious": "Terminal: Fokus im vorherigen Terminal", - "workbench.action.terminal.kill": "Terminal: Aktive Terminalinstanz beenden", + "workbench.action.terminal.clear": "Löschen", + "workbench.action.terminal.copySelection": "Auswahl kopieren", + "workbench.action.terminal.focus": "Fokus im Terminal", + "workbench.action.terminal.focusNext": "Fokus im nächsten Terminal", + "workbench.action.terminal.focusPrevious": "Fokus im vorherigen Terminal", + "workbench.action.terminal.kill": "Aktive Terminalinstanz beenden", "workbench.action.terminal.kill.short": "Terminal beenden", - "workbench.action.terminal.new": "Terminal: Neues integriertes Terminal erstellen", + "workbench.action.terminal.new": "Neues integriertes Terminal erstellen", "workbench.action.terminal.new.short": "Neues Terminal", - "workbench.action.terminal.paste": "Terminal: in aktives Terminal einfügen", - "workbench.action.terminal.runSelectedText": "Terminal: Ausgewählten Text im aktiven Terminal ausführen", - "workbench.action.terminal.scrollDown": "Terminal: Nach unten scrollen", - "workbench.action.terminal.scrollUp": "Terminal: Nach oben scrollen", - "workbench.action.terminal.switchTerminalInstance": "Terminal: Terminalinstanz umschalten", + "workbench.action.terminal.paste": "In aktives Terminal einfügen", + "workbench.action.terminal.runSelectedText": "Ausgewählten Text im aktiven Terminal ausführen", + "workbench.action.terminal.scrollDown": "Nach unten scrollen", + "workbench.action.terminal.scrollUp": "Nach oben scrollen", + "workbench.action.terminal.switchTerminalInstance": "Terminalinstanz umschalten", "workbench.action.terminal.toggleTerminal": "Integriertes Terminal umschalten" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index d6a709a803f..1139a350827 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "Die Terminalauswahl kann nicht kopiert werden, wenn das Terminal nicht den Fokus besitzt.", "terminal.integrated.exitedWithCode": "Der Terminalprozess wurde mit folgendem Exitcode beendet: {0}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index dab33154dfe..ac35a0bc259 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "errorConfigurationFileDirty": "Die Konfigurationsdatei kann nicht geschrieben werden (Konfigurationsdatei wurde geändert).", - "errorInvalidConfiguration": "Die Konfigurationsdatei kann nicht geschrieben werden (ungültige Konfiguration gefunden).", - "errorUnknownKey": "Die Konfigurationsdatei kann nicht geschrieben werden (unbekannter Schlüssel).", - "errorWorkspaceOpened": "Die Konfigurationsdatei kann nicht geschrieben werden (kein Arbeitsbereich geöffnet)." + "errorConfigurationFileDirty": "Einstellungen können nicht geschrieben werden, weil die Datei geändert wurde. Speichern Sie die Datei **Benutzereinstellungen\", und versuchen Sie es erneut.", + "errorConfigurationFileDirtyWorkspace": "Einstellungen können nicht geschrieben werden, weil die Datei geändert wurde. Speichern Sie die Datei **Arbeitsbereichseinstellungen\", und versuchen Sie es erneut.", + "errorInvalidConfiguration": "Einstellungen können nicht geschrieben werden. Öffnen Sie **Benutzereinstellungen**, um Fehler/Warnungen in der Datei zu korrigieren, und versuchen Sie es erneut.", + "errorInvalidConfigurationWorkspace": "Einstellungen können nicht geschrieben werden. Öffnen Sie **Arbeitsbereichseinstellungen**, um Fehler/Warnungen in der Datei zu korrigieren, und versuchen Sie es erneut.", + "errorInvalidTarget": "In die Konfigurationsdatei kann nicht geschrieben werden (ungültiges Ziel).", + "errorNoWorkspaceOpened": "Einstellungen können nicht geschrieben werden, weil kein Ordner geöffnet ist. Öffnen Sie zuerst einen Ordner, und versuchen Sie es erneut.", + "errorUnknownKey": "Die Konfigurationsdatei kann nicht geschrieben werden (unbekannter Schlüssel)." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/deu/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/deu/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/html/client/out/htmlMain.i18n.json b/i18n/esn/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/esn/extensions/typescript/out/typescriptServiceClient.i18n.json index 539a55da5dc..4d37c1ee944 100644 --- a/i18n/esn/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/esn/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "Continuando con la versión {0}", + "close": "Cerrar", "doNotCheckAgain": "No volver a comprobar", "localTSFound": "La carpeta del área de trabajo contiene la versión {0} de TypeScript. ¿Quiere usar esta versión en lugar de la versión {1} del lote?", "moreInformation": "Más información", @@ -14,7 +14,6 @@ "serverDied": "El servicio de lenguaje Typescript finalizó de forma inesperada cinco veces en los últimos cinco minutos. Considere la posibilidad de abrir un informe de errores.", "serverDiedAfterStart": "El servicio de lenguaje TypeScript finalizó de forma inesperada cinco veces después de haberse iniciado y no se reiniciará. Abra un informe de errores.", "use": "Usar {0}", - "useAlways": "Más información", "useBundled": "Usar {0}", "versionMismatch": "Se ha detectado una incoherencia de versión entre el compilador TSC instalado globalmente ({0}) y el servicio de lenguaje de VS Code ({1}). Esto puede dar lugar a errores de compilación incoherente.", "versionNumber.custom": "personalizada" diff --git a/i18n/esn/src/vs/base/common/errorMessage.i18n.json b/i18n/esn/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/base/common/keybinding.i18n.json b/i18n/esn/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/esn/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index ea3707c9e7d..fcd5e1e0bde 100644 --- a/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Cerrar", "invalidManifest": "Extensión no válida: package.json no es un archivo JSON.", "invalidName": "Extensión no válida: el nombre del manifiesto no coincide.", "invalidPublisher": "Extensión no válida: el publicador del manifiesto no coincide.", "invalidVersion": "Extensión no válida: la versión del manifiesto no coincide.", - "noCompatible": "No se encontró una versión de {0} compatible con esta versión de Code.", "notExists": "No se encontró la extensión.", "restartCode": "Reinicie Code antes de volver a instalar {0}." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 78c88f1163c..750494bf0e2 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,7 +12,6 @@ "closeEditorsToTheLeft": "Cerrar los editores a la izquierda", "closeEditorsToTheRight": "Cerrar los editores a la derecha", "closeOtherEditorsInGroup": "Cerrar otros editores", - "closeQuickOpen": "Cerrar apertura rápida", "evenEditorGroups": "Uniformar anchos del grupo de editores", "focusFirstEditorGroup": "Enfocar grupo de editores a la izquierda", "focusLastEditorInStack": "Abrir el último editor del grupo", @@ -38,9 +37,6 @@ "openPreviousEditor": "Abrir el editor anterior", "openPreviousEditorInGroup": "Abrir el editor recientemente usado anterior en el grupo", "openToSide": "Abrir en el lateral", - "quickNavigateNext": "Navegar a siguiente en Quick Open", - "quickNavigatePrevious": "Navegar a anterior en Quick Open", - "quickOpen": "Ir al archivo...", "removeFromEditorHistory": "Quitar del historial de editores", "reopenClosedEditor": "Volver a abrir el editor cerrado", "showAllEditors": "Mostrar todos los editores", diff --git a/i18n/esn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index b339f9e3897..9c89dca6470 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "canNotRunPlaceholder": "Este controlador de apertura rápida no se puede usar en el contexto actual", + "canNotRunPlaceholder": "Este controlador de Quick Open no se puede usar en el contexto actual", "emptyPicks": "No hay entradas para seleccionar", "entryAriaLabel": "{0}, abiertos recientemente", "historyMatches": "abiertos recientemente", diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 1c1917730c2..23a44fb899a 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "closeOnFocusLost": "Controla si la apertura rápida se debe cerrar automáticamente cuando se pierde el foco.", + "closeOnFocusLost": "Controla si Quick Open debe cerrarse automáticamente cuando pierde el foco.", "developer": "Desarrollador", "editorOpenPositioning": "Controla dónde se abren los editores. Seleccione 'izquierda' o 'derecha' para abrir los editores situados a la izquierda o la derecha del que está actualmente activo. Seleccione 'primero' o 'último' para abrir los editores con independencia del que esté actualmente activo.", "enablePreview": "Controla si los editores abiertos se muestran en vista previa. Los editores en vista previa se reutilizan hasta que se guardan (por ejemplo, mediante doble clic o editándolos).", - "enablePreviewFromQuickOpen": "Controla si los editores abiertos mediante apertura rápida se muestran en vista previa. Los editores en vista previa se reutilizan hasta que se guardan (por ejemplo, mediante doble clic o editándolos).", + "enablePreviewFromQuickOpen": "Controla si los editores abiertos mediante Quick Open se muestran en modo de vista previa. Los editores en modo de vista previa se reutilizan hasta que se mantienen (por ejemplo, mediante doble clic o editándolos).", "file": "Archivo", "openDefaultSettings": "Controla si la configuración de apertura también abre un editor que muestra todos los valores predeterminados.", "openFilesInNewWindow": "Si está habilitado, los archivos se abrirán en una nueva ventana en lugar de volver a usar una instancia existente.", diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/esn/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index b12f01f582d..9dc5590ed8e 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Cerrar", "neverShowAgain": "No volver a mostrar", "reallyRecommended": "Se recomienda instalar la extensión '{0}'.", "showRecommendations": "Mostrar recomendaciones" diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 3b9d7ee4e17..1304c3aa9b9 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "Criterio de ordenación: ↑", "descending": "Criterio de ordenación: ↓", + "extensions": "Extensiones", + "outdatedExtensions": "{0} extensiones obsoletas", "searchExtensions": "Buscar extensiones en Marketplace", "sort by installs": "Criterio de ordenación: Número de instalaciones", "sort by rating": "Criterio de ordenación: Clasificación", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json index 446670e45f9..4e449dceef2 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "dirtyCounter": "{0} sin guardar", - "openEditors": "Abrir editores", + "openEditors": "Editores abiertos", "openEditosrSection": "Abrir sección de editores", - "treeAriaLabel": "Abrir editores" + "treeAriaLabel": "Editores abiertos" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/esn/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index d0c7157ef30..ac6fdfd1378 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "terminal": "Terminal", - "terminal.integrated.commandsToSkipShell": "Conjunto de identificadores de comando cuyos enlaces de teclado no se enviarán al shell, sino que siempre se controlarán con Code. Esto permite el uso de enlaces de teclado que normalmente consumiría el shell para funcionar igual que cuando el terminal no tiene el foco; por ejemplo, Ctrl+P para iniciar Ir a archivo.", + "terminal.integrated.commandsToSkipShell": "Conjunto de identificadores de comando cuyos enlaces de teclado no se enviarán al shell, sino que siempre se controlarán con Code. Esto permite el uso de enlaces de teclado que normalmente consumiría el shell para funcionar igual que cuando el terminal no tiene el foco; por ejemplo, Ctrl+P para iniciar Quick Open.", "terminal.integrated.cursorBlinking": "Controla si el cursor del terminal parpadea.", "terminal.integrated.fontFamily": "Controla la familia de fuentes del terminal, que está establecida de manera predeterminada en el valor de editor.fontFamily.", "terminal.integrated.fontLigatures": "Controla si las ligaduras tipográficas están habilitadas en el terminal.", diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 2611a5eaa5c..fa01474b561 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "No se puede copiar la selección del terminal cuando el terminal no tiene el foco", "terminal.integrated.exitedWithCode": "El proceso del terminal finalizó con el código de salida: {0}" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/esn/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/esn/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/html/client/out/htmlMain.i18n.json b/i18n/fra/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/fra/extensions/typescript/out/typescriptServiceClient.i18n.json index 219634cb4f6..e3e7f7e36de 100644 --- a/i18n/fra/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/fra/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "Poursuite avec la version {0}", + "close": "Fermer", "doNotCheckAgain": "Ne plus vérifier", "localTSFound": "Le dossier d'espace de travail contient TypeScript version {0}. Voulez-vous utiliser cette version à la place de la version d'ensemble {1} ?", "moreInformation": "Informations", @@ -14,7 +14,6 @@ "serverDied": "Le service de langage TypeScript s'est subitement arrêté 5 fois au cours des 5 dernières minutes. Pensez à ouvrir un rapport de bogues.", "serverDiedAfterStart": "Le service de langage TypeScript s'est subitement arrêté 5 fois juste après le démarrage et ne sera pas redémarré. Ouvrez un rapport de bogues.", "use": "Utiliser {0}", - "useAlways": "Informations", "useBundled": "Utiliser {0}", "versionMismatch": "Une incompatibilité de version entre le compilateur tsc installé globalement ({0}) et le service de langage de VS Code ({1}) a été détecté. Cela peut entraîner des erreurs de compilation incohérentes.", "versionNumber.custom": "personnalisé" diff --git a/i18n/fra/src/vs/base/common/errorMessage.i18n.json b/i18n/fra/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/base/common/keybinding.i18n.json b/i18n/fra/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/fra/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 2aa5e8b5634..9c0fced11b2 100644 --- a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Fermer", "invalidManifest": "Extension non valide : package.json n'est pas un fichier JSON.", "invalidName": "Extension non valide : non-correspondance du nom du manifeste.", "invalidPublisher": "Extension non valide : non-correspondance de l'éditeur du manifeste.", "invalidVersion": "Extension non valide : non-correspondance de la version du manifeste.", - "noCompatible": "Version compatible de {0} introuvable avec cette version de Code.", "notExists": "Extension introuvable", "restartCode": "Redémarrez Code avant de réinstaller {0}." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 023aa10ad88..44adc1bfa51 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,7 +12,6 @@ "closeEditorsToTheLeft": "Fermer les éditeurs situés à gauche", "closeEditorsToTheRight": "Fermer les éditeurs situés à droite", "closeOtherEditorsInGroup": "Fermer les autres éditeurs", - "closeQuickOpen": "Fermer l'ouverture rapide", "evenEditorGroups": "Même largeur pour le groupe d'éditeurs", "focusFirstEditorGroup": "Focus sur le groupe d'éditeurs de gauche", "focusLastEditorInStack": "Ouvrir le dernier éditeur du groupe", @@ -38,9 +37,6 @@ "openPreviousEditor": "Ouvrir l'éditeur précédent", "openPreviousEditorInGroup": "Ouvrir l'éditeur précédent du groupe", "openToSide": "Ouvrir sur le côté", - "quickNavigateNext": "Naviguer vers l'élément suivant dans l'ouverture rapide", - "quickNavigatePrevious": "Naviguer vers l'élément précédent dans l'ouverture rapide", - "quickOpen": "Atteindre le fichier...", "removeFromEditorHistory": "Supprimer de l'historique des éditeurs", "reopenClosedEditor": "Rouvrir l'éditeur fermé", "showAllEditors": "Afficher tous les éditeurs", diff --git a/i18n/fra/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index a190680f9d5..79ad4b125e0 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "canNotRunPlaceholder": "Ce gestionnaire d'ouverture rapide ne peut pas être utilisé dans le contexte actuel.", + "canNotRunPlaceholder": "Ce gestionnaire Quick Open ne peut pas être utilisé dans le contexte actuel", "emptyPicks": "Aucune entrée à sélectionner", "entryAriaLabel": "{0}, ouvert récemment", "historyMatches": "récemment ouvert", diff --git a/i18n/fra/src/vs/workbench/electron-browser/main.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/fra/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index c1aae9c75a3..3001680a7e6 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Fermer", "neverShowAgain": "Ne plus afficher", "reallyRecommended": "Il est recommandé d'installer l'extension '{0}'.", "showRecommendations": "Afficher les recommandations" diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 90dd2c40390..73967cb36aa 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "Ordre de tri : ↑", "descending": "Ordre de tri : ↓", + "extensions": "Extensions", + "outdatedExtensions": "{0} extensions obsolètes", "searchExtensions": "Rechercher des extensions dans Marketplace", "sort by installs": "Trier par : nombre d'installations", "sort by rating": "Trier par : évaluation", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/fra/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json index 71a836a513e..69ac13e8632 100644 --- a/i18n/fra/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "dirtyCounter": "{0} non enregistré(s)", - "openEditors": "Ouvrir les éditeurs", + "openEditors": "Éditeurs ouverts", "openEditosrSection": "Ouvrir la section des éditeurs", - "treeAriaLabel": "Ouvrir les éditeurs" + "treeAriaLabel": "Éditeurs ouverts" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/fra/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index cc9511dcce9..38e84b22d64 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "terminal": "Terminal", - "terminal.integrated.commandsToSkipShell": "Ensemble d'ID de commandes dont les combinaisons de touches sont gérées par Code au lieu d'être envoyées à l'interpréteur de commandes. Cela permet d'utiliser des combinaisons de touches qui sont normalement consommées par l'interpréteur de commandes et d'obtenir le même résultat quand le terminal n'a pas le focus, par exemple Ctrl+P pour lancer l'ouverture rapide.", + "terminal.integrated.commandsToSkipShell": "Ensemble d'ID de commandes dont les combinaisons de touches sont gérées par Code au lieu d'être envoyées à l'interpréteur de commandes. Cela permet d'utiliser des combinaisons de touches qui sont normalement consommées par l'interpréteur de commandes et d'obtenir le même résultat quand le terminal n'a pas le focus, par exemple Ctrl+P pour lancer Quick Open.", "terminal.integrated.cursorBlinking": "Contrôle si le curseur du terminal clignote.", "terminal.integrated.fontFamily": "Contrôle la famille de polices du terminal. La valeur par défaut est la valeur associée à editor.fontFamily.", "terminal.integrated.fontLigatures": "Contrôle si les ligatures de police sont activées sur le terminal.", diff --git a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 762dbce653f..fe860416b9e 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "Impossible de copier la sélection du terminal quand il n'a pas le focus", "terminal.integrated.exitedWithCode": "Le processus du terminal s'est achevé avec le code de sortie {0}" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/fra/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/fra/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/html/client/out/htmlMain.i18n.json b/i18n/ita/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/ita/extensions/typescript/out/typescriptServiceClient.i18n.json index 6ede2a09556..fce8a61d426 100644 --- a/i18n/ita/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/ita/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,16 +5,21 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "Si continuerà con la versione {0}", + "close": "Chiudi", "doNotCheckAgain": "Non eseguire più la verifica", "localTSFound": "La cartella dell'area di lavoro contiene TypeScript versione {0}. Usare questa versione invece della {1} in bundle?", "moreInformation": "Altre informazioni", + "neverCheckLocalVesion": "Non controllare mai la versione dell'area di lavoro", "noServerFound": "Il percorso {0} non punta a un'installazione valida di tsserver. Le funzionalità del linguaggio TypeScript verranno disabilitate.", "serverCouldNotBeStarted": "Non è stato possibile avviare il server di linguaggio TypeScript. Messaggio di errore: {0}", "serverDied": "Il servizio di linguaggio Typescript è stato arrestato in modo imprevisto per cinque volte negli ultimi cinque minuti. Provare ad aprire una segnalazione bug.", "serverDiedAfterStart": "Il servizio di linguaggio TypeScript è stato arrestato in modo imprevisto per cinque volte dopo che è stato avviato e non verrà riavviato. Aprire una segnalazione bug.", - "use": "Usa {0}", - "useAlways": "Altre informazioni", + "tsversion20": "Visual Studio Code 1.6 include TypeScript versione 2.0.3. Per usare una versione precedente di TypeScript, impostare l'opzione 'typescript.tsdk'.", + "updateGlobalWorkspaceCheck": "L'impostazione utente 'typescript.check.workspaceVersion' è stata aggiornata ed è ora false", + "updateLocalWorkspaceCheck": "L'impostazione dell'area di lavoro 'typescript.check.workspaceVersion' è stata aggiornata ed è ora false", + "updateTscCheck": "L'impostazione utente 'typescript.check.tscVersion' è stata aggiornata ed è ora false", + "updatedtsdk": "L'impostazione dell'area di lavoro 'typescript.tsdk' è stata aggiornata ed è ora {0}", + "use": "Usa l'area di lavoro ({0})", "useBundled": "Usa {0}", "versionMismatch": "È stata rilevato un errore di corrispondenza tra la versione del compilatore tsc installato globalmente ({0}) e quella del servizio di linguaggio di VS Code ({1}). Questo potrebbe causare errori di compilazione incoerente.", "versionNumber.custom": "personalizzato" diff --git a/i18n/ita/extensions/typescript/package.i18n.json b/i18n/ita/extensions/typescript/package.i18n.json index a6e5ca45e22..3f86bb8fcf9 100644 --- a/i18n/ita/extensions/typescript/package.i18n.json +++ b/i18n/ita/extensions/typescript/package.i18n.json @@ -16,6 +16,8 @@ "format.placeOpenBraceOnNewLineForFunctions": "Consente di definire se una parentesi graffa di apertura viene o meno inserita su una riga per le funzioni", "javascript.reloadProjects.title": "Ricarica progetto JavaScript", "javascript.validate.enable": "Abilita/Disabilita la convalida JavaScript", + "typescript.check.tscVersion": "Verifica se un compilatore TypeScript di installazione globale, ad esempio tsc, è diverso dal servizio di linguaggio TypeScript usato.", + "typescript.check.workspaceVersion": "Verifica se nell'area di lavoro è disponibile una versione di TypeScript", "typescript.reloadProjects.title": "Ricarica progetto TypeScript", "typescript.tsdk.desc": "Specifica il percorso della cartella che contiene i file tsserver e lib*.d.ts da usare.", "typescript.tsdk_version.desc": "Specifica la versione di tsserver. È necessario solo se tsserver non viene installato con npm.", diff --git a/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index bdfe9e46813..78eaf953580 100644 --- a/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "imgTitle": "{0} ({1}x{2})", - "missingAudioSupport": "La riproduzione di file audio non è supportata.", - "missingVideoSupport": "La riproduzione di file video non è supportata.", - "nativeBinaryError": "Il file non verrà visualizzato nell'editor perché è binario, è molto grande o usa una codifica testo non supportata." + "imgMeta": "{0}x{1} {2}", + "nativeBinaryError": "Il file non verrà visualizzato nell'editor perché è binario, è molto grande o usa una codifica testo non supportata.", + "sizeB": "{0} B", + "sizeGB": "{0} GB", + "sizeKB": "{0} KB", + "sizeMB": "{0} MB", + "sizeTB": "{0} TB" } \ No newline at end of file diff --git a/i18n/ita/src/vs/base/common/errorMessage.i18n.json b/i18n/ita/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/base/common/keybinding.i18n.json b/i18n/ita/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-main/main.i18n.json b/i18n/ita/src/vs/code/electron-main/main.i18n.json index 958a049ade7..77eef1b9e08 100644 --- a/i18n/ita/src/vs/code/electron-main/main.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/main.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "newWindow": "Nuova finestra" + "folderDesc": "{0} {1}", + "newWindow": "Nuova finestra", + "newWindowDesc": "Apre una nuova finestra" } \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-main/menus.i18n.json b/i18n/ita/src/vs/code/electron-main/menus.i18n.json index abf406180cd..dff506279b9 100644 --- a/i18n/ita/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/menus.i18n.json @@ -19,6 +19,8 @@ "mView": "&&Visualizza", "mWindow": "Finestra", "miAbout": "&&Informazioni su", + "miAccessibilityOptions": "&&Opzioni accessibilità", + "miAutoSave": "Salvataggio automatico", "miBack": "&&Indietro", "miCheckForUpdates": "Verifica disponibilità aggiornamenti...", "miCheckingForUpdates": "Verifica della disponibilità di aggiornamenti...", @@ -42,7 +44,8 @@ "miGotoDefinition": "Vai alla &&definizione", "miGotoFile": "Vai al &&file...", "miGotoLine": "Vai alla &&riga...", - "miGotoSymbol": "Vai al &&simbolo...", + "miGotoSymbolInFile": "Vai al &&simbolo nel file...", + "miGotoSymbolInWorkspace": "Vai al &&simbolo nell'area di lavoro...", "miInstallingUpdate": "Installazione dell'aggiornamento...", "miLicense": "&&Visualizza licenza", "miMarker": "&&Problemi", @@ -92,7 +95,6 @@ "miToggleOutput": "&&Output", "miTogglePanel": "Attiva/Disattiva &&pannello", "miToggleRenderControlCharacters": "Attiva/Disattiva &&caratteri di controllo", - "miToggleRenderWhitespace": "Attiva/Disattiva rendering &&spazi vuoti", "miToggleSidebar": "Attiva/Disattiva &&barra laterale", "miToggleStatusbar": "Attiva/Disattiva &&barra di stato", "miToggleWordWrap": "Attiva/Disattiva &&ritorno a capo automatico", diff --git a/i18n/ita/src/vs/code/electron-main/windows.i18n.json b/i18n/ita/src/vs/code/electron-main/windows.i18n.json index c4955ee6b08..0ce3269b7e2 100644 --- a/i18n/ita/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/windows.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "accessibilityOptionsWindowTitle": "Opzioni accessibilità", "appCrashed": "Si è verificato un arresto anomalo della finestra", "appCrashedDetail": "Ci scusiamo per l'inconveniente. Per riprendere dal punto in cui si è verificata l'interruzione, riaprire la finestra.", "appStalled": "La finestra non risponde", diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index b6b20f382e2..ea1a469b393 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -17,7 +17,6 @@ "fontSize": "Controlla le dimensioni del carattere in pixel.", "fontWeight": "Controlla lo spessore del carattere.", "formatOnType": "Controlla se l'editor deve formattare automaticamente la riga dopo la digitazione", - "glyphMargin": "Controlla la visibilità del margine del glifo", "hideCursorInOverviewRuler": "Controlla se il cursore deve essere nascosto nel righello delle annotazioni.", "ignoreTrimWhitespace": "Controlla se l'editor diff mostra come differenze le modifiche relative a spazi vuoti iniziali e finali", "insertSpaces": "Inserisce spazi quando viene premuto TAB. Quando `editor.detectIndentation` è attivo, questa impostazione viene sostituita in base al contenuto del file.", @@ -33,7 +32,7 @@ "renderControlCharacters": "Controlla se l'editor deve eseguire il rendering dei caratteri di controllo", "renderIndentGuides": "Controlla se l'editor deve eseguire il rendering delle guide con rientro", "renderLineHighlight": "Controlla se l'editor deve eseguire il rendering dell'evidenziazione riga corrente", - "renderWhitespace": "Controlla se l'editor deve eseguire il rendering dei spazi vuoti", + "renderWhitespace": "Consente di controllare in che modo l'editor deve eseguire il rendering dei caratteri di spazio vuoto. Le opzioni possibili sono: 'none', 'boundary' e 'all'. Con l'opzione 'boundary' non viene eseguito il rendering di singoli spazi tra le parole.", "roundedSelection": "Controlla se gli angoli delle selezioni sono arrotondati", "rulers": "Colonne in corrispondenza delle quali visualizzare i righelli verticali", "scrollBeyondLastLine": "Controlla se l'editor scorrerà oltre l'ultima riga", diff --git a/i18n/ita/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/ita/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/common/services/modelServiceImpl.i18n.json b/i18n/ita/src/vs/editor/common/services/modelServiceImpl.i18n.json index d44cf96f046..35a8f29280e 100644 --- a/i18n/ita/src/vs/editor/common/services/modelServiceImpl.i18n.json +++ b/i18n/ita/src/vs/editor/common/services/modelServiceImpl.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "indentAutoMigrate": "Aggiornare le impostazioni: `editor.detectIndentation` sostituisce `editor.tabSize`: \"auto\" o `editor.insertSpaces`: \"auto\"", - "sourceAndDiagMessage": "[{0}] {1}" + "diagAndSource": "[{0}] {1}", + "indentAutoMigrate": "Aggiornare le impostazioni: `editor.detectIndentation` sostituisce `editor.tabSize`: \"auto\" o `editor.insertSpaces`: \"auto\"" } \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index e0a7e198dc9..49136197eee 100644 --- a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Chiudi", + "installDependecies": "Per questa estensione sono disponibili dipendenze. Installarle con l'estensione?", + "installWithDependenices": "Installa con dipendenze", + "installWithoutDependenices": "Installa solo estensione", "invalidManifest": "Estensione non valida: package.json non è un file JSON.", "invalidName": "Estensione non valida: il nome del manifesto non corrisponde.", "invalidPublisher": "Estensione non valida: l'editore del manifesto non corrisponde.", "invalidVersion": "Estensione non valida: la versione del manifesto non corrisponde.", - "noCompatible": "Non è stata trovata una versione di {0} compatibile con questa versione di Visual Studio Code.", "notExists": "L'estensione non è stata trovata", "restartCode": "Riavviare Code prima di reinstallare {0}." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json index bd93c5a42f8..8a80f9a6b0b 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json @@ -5,5 +5,6 @@ // Do not edit this file. It is machine generated. { "binaryDiffEditor": "Visualizzatore differenze file binari", - "cannotDiffTextToBinary": "Il confronto tra file binari e non binari non è attualmente supportato" + "cannotDiffTextToBinary": "Il confronto tra file binari e non binari non è attualmente supportato", + "metadataDiff": "{0} ↔ {1}" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index cde1dca9577..e263cb5039a 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,8 +12,8 @@ "closeEditorsToTheLeft": "Chiudi editor a sinistra", "closeEditorsToTheRight": "Chiudi editor a destra", "closeOtherEditorsInGroup": "Chiudi gli altri editor", - "closeQuickOpen": "Chiudi Apertura rapida", "evenEditorGroups": "Imposta stessa larghezza per gruppo di editor", + "focusActiveEditorGroup": "Sposta stato attivo sul gruppo di editor attivo", "focusFirstEditorGroup": "Sposta stato attivo su gruppo di editor a sinistra", "focusLastEditorInStack": "Apri ultimo editor del gruppo", "focusNextGroup": "Sposta stato attivo sul gruppo successivo", @@ -38,9 +38,6 @@ "openPreviousEditor": "Apri editor precedente", "openPreviousEditorInGroup": "Apri editor precedente usato di recente nel gruppo", "openToSide": "Apri lateralmente", - "quickNavigateNext": "Passa a successiva in Apertura rapida", - "quickNavigatePrevious": "Passa a precedente in Apertura rapida", - "quickOpen": "Vai al file...", "removeFromEditorHistory": "Rimuovi dalla cronologia dell'editor", "reopenClosedEditor": "Riapri editor chiuso", "showAllEditors": "Mostra tutti gli editor", diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index b1f821ebb80..f5a68f6dc41 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -9,28 +9,30 @@ "changeEndOfLine": "Cambia sequenza di fine riga", "changeIndentation": "Cambia rientro", "changeMode": "Cambia modalità linguaggio", - "configureAssociations": "Configura associazioni file...", "configureAssociationsExt": "Configura associazione file per '{0}'...", - "configuredLanguage": "Linguaggio configurato", + "currentAssociation": "Associazione corrente", "disableTabMode": "Disabilita modalità accessibilità", "endOfLineCarriageReturnLineFeed": "CRLF", "endOfLineLineFeed": "LF", + "fileInfo": "Informazioni sul file", "gotoLine": "Vai alla riga", "indentConvert": "converti file", "indentView": "cambia visualizzazione", "indentation": "Rientro", - "languagesPicks": "linguaggi", + "languageDescription": "({0}) - Linguaggio configurato", + "languageDescriptionConfigured": "({0})", + "languagesPicks": "linguaggi (identificatore)", "multiSelection": "{0} selezioni", "multiSelectionRange": "{0} selezioni ({1} caratteri selezionati)", "noEditor": "Al momento non ci sono editor di testo attivi", "noFileEditor": "Al momento non ci sono file attivi", "noWritableCodeEditor": "L'editor di testo attivo è di sola lettura.", - "persistFileAssociations": "È possibile configurare le associazioni tra nome file e lingua nella sezione **files.associations**. Per rendere effettive le modifiche su file già aperti, potrebbe essere necessario riavviare.", "pickAction": "Seleziona azione", "pickEncodingForReopen": "Seleziona codifica per la riapertura del file", "pickEncodingForSave": "Seleziona codifica per il salvataggio del file", "pickEndOfLine": "Seleziona sequenza di fine riga", "pickLanguage": "Seleziona modalità linguaggio", + "pickLanguageToConfigure": "Seleziona la modalità linguaggio da associare a '{0}'", "reopenWithEncoding": "Riapri con codifica", "saveWithEncoding": "Salva con codifica", "selectEOL": "Seleziona sequenza di fine riga", diff --git a/i18n/ita/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index ffe0720bf56..e84871f8527 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "canNotRunPlaceholder": "Questo gestore per l'apertura rapida non può essere usato nel contesto corrente", + "canNotRunPlaceholder": "Questo gestore per Quick Open non può essere usato nel contesto corrente", "emptyPicks": "Non ci sono voci selezionabili", "entryAriaLabel": "{0}, aperti di recente", "historyMatches": "aperti di recente", diff --git a/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json index b42f833492b..e30e8ce0fba 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json @@ -18,6 +18,8 @@ "openRecentPlaceHolder": "Selezionare un percorso da aprire (tenere premuto CTRL per aprirlo in una nuova finestra)", "openRecentPlaceHolderMac": "Selezionare un percorso (tenere premuto CMD per aprirlo in una nuova finestra)", "reloadWindow": "Ricarica finestra", + "switchWindow": "Cambia finestra", + "switchWindowPlaceHolder": "Selezionare una finestra", "toggleDevTools": "Attiva/Disattiva strumenti di sviluppo", "toggleFullScreen": "Attiva/Disattiva schermo intero", "toggleMenuBar": "Attiva/Disattiva barra dei menu", diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json index 44242412f81..4c697e4bcb4 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -15,6 +15,7 @@ "reopenFolders": "Controlla la modalità di riapertura delle cartelle dopo un riavvio. Selezionare 'none' per non riaprire mai una cartella, 'one' per riaprire l'ultima cartella usata oppure 'all' per riaprire tutte le cartelle dell'ultima sessione.", "restoreFullscreen": "Controlla se una finestra deve essere ripristinata a schermo intero se è stata chiusa in questa modalità.", "showEditorTabs": "Controlla se visualizzare o meno gli editor aperti in schede.", + "showIcons": "Controlla se visualizzare o meno un'icona per gli editor aperti.", "updateChannel": "Consente di configurare la ricezione degli aggiornamenti automatici da un canale di aggiornamento. Richiede un riavvio dopo la modifica.", "updateConfigurationTitle": "Aggiorna", "view": "Visualizza", diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/ita/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index c090db55f3f..2f369926f39 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "JSON Validation": "Convalida JSON ({0})", + "changelog": "Log delle modifiche", "command name": "Nome", "commands": "Comandi ({0})", "contributions": "Contributi", @@ -18,6 +19,7 @@ "languages": "Linguaggi ({0})", "license": "Licenza", "menuContexts": "Contesti menu", + "noChangelog": "LOG DELLE MODIFICHE non disponibile.", "noReadme": "File LEGGIMI non disponibile.", "runtime": "Runtime", "setting name": "Nome", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 9603990dd44..23b849ad73c 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,7 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Chiudi", "neverShowAgain": "Non visualizzare più questo messaggio", "reallyRecommended": "È consigliabile installare l'estensione '{0}'.", - "showRecommendations": "Mostra gli elementi consigliati" + "showRecommendations": "Mostra gli elementi consigliati", + "workspaceRecommended": "Per questa area di lavoro sono disponibili estensioni consigliate." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json index eca615315b9..7abf4f3c5f9 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json @@ -4,12 +4,17 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "ConfigureWorkspaceRecommendations.noWorkspace": "Gli elementi consigliati sono disponibili solo per una cartella dell'area di lavoro.", + "OpenExtensionsFile.failed": "Non è possibile creare il file 'extensions.json' all'interno della cartella '.vscode' ({0}).", "clearExtensionsInput": "Cancella input estensioni", + "configureWorkspaceRecommendedExtensions": "Configura estensioni consigliate per l'area di lavoro", "deleteSure": "Disinstallare '{0}'?", "enableAction": "Abilita", "installAction": "Installa", "installExtensions": "Installa estensioni", + "installVSIX": "Installa da VSIX...", "installing": "Installazione", + "openExtensionsFolder": "Apri cartella estensioni", "postUninstallMessage": "{0} è stato disinstallato. Riavviare per disattivarlo.", "restart": "Per abilitare questa estensione, è necessario riavviare questa finestra di Visual Studio Code.\n\nContinuare?", "restartNow": "Riavvia ora", @@ -17,6 +22,7 @@ "showOutdatedExtensions": "Mostra estensioni obsolete", "showPopularExtensions": "Mostra estensioni più richieste", "showRecommendedExtensions": "Mostra estensioni consigliate", + "showWorkspaceRecommendedExtensions": "Mostra estensioni consigliate per l'area di lavoro", "toggleExtensionsViewlet": "Mostra estensioni", "uninstall": "Disinstalla", "updateAction": "Aggiorna", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 4beb94ef786..168d874d081 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "Ordinamento: ↑", "descending": "Ordinamento: ↓", + "extensions": "Estensioni", + "outdatedExtensions": "{0} estensioni obsolete", "searchExtensions": "Cerca le estensioni nel Marketplace", "sort by installs": "Ordina per: conteggio installazioni", "sort by rating": "Ordina per: classificazione", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/ita/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json index 68b1c665b3e..66eabd8d285 100644 --- a/i18n/ita/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "dirtyCounter": "{0} non salvati", - "openEditors": "Apri editor", + "openEditors": "Editor aperti", "openEditosrSection": "Sezione Apri editor", - "treeAriaLabel": "Apri editor" + "treeAriaLabel": "Editor aperti" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json index c3fe3e3a86e..8fad716a7ed 100644 --- a/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,7 +10,11 @@ "RemoveAction.label": "Rimuovi", "file.replaceAll.label": "Sostituisci tutto", "findInFolder": "Trova nella cartella", + "focusNextInputbox": "Sposta lo stato attivo sulla casella di input successiva", + "focusPreviousInputbox": "Sposta lo stato attivo sulla casella di input precedente", "match.replace.label": "Sostituisci", + "nextSearchTerm": "Mostra il termine di ricerca successivo", + "previousSearchTerm": "Mostra il termine di ricerca precedente", "replaceInFiles": "Sostituisci nei file", "showSearchViewlet": "Mostra Cerca" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index e89c8f66d19..11ebe179b54 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "terminal": "Terminale", - "terminal.integrated.commandsToSkipShell": "Set di ID comando i cui tasti di scelta rapida non verranno inviati alla shell e verranno sempre gestiti da Code. In tal modo i tasti di scelta rapida normalmente utilizzati dalla shell avranno lo stesso effetto di quando il terminale non ha lo stato attivo, ad esempio CTRL+P per avviare Apertura rapida.", + "terminal.integrated.commandsToSkipShell": "Set di ID comando i cui tasti di scelta rapida non verranno inviati alla shell e verranno sempre gestiti da Code. In tal modo i tasti di scelta rapida normalmente utilizzati dalla shell avranno lo stesso effetto di quando il terminale non ha lo stato attivo, ad esempio CTRL+P per avviare Quick Open.", "terminal.integrated.cursorBlinking": "Controlla se il cursore del terminale è intermittente o meno.", "terminal.integrated.fontFamily": "Controlla la famiglia di caratteri del terminale. L'impostazione predefinita è il valore di editor.fontFamily.", "terminal.integrated.fontLigatures": "Controlla se i caratteri legatura sono abilitati nel terminale.", @@ -17,6 +17,7 @@ "terminal.integrated.shell.windows": "Percorso della shell usata dal terminale in Windows. Quando si usano le shell incluse in Windows (cmd, PowerShell o Bash in Ubuntu), preferire C:Windowssysnative rispetto a C:WindowsSystem32 per usare le versioni a 64 bit.", "terminal.integrated.shellArgs.linux": "Argomenti della riga di comando da usare nel terminale Linux.", "terminal.integrated.shellArgs.osx": "Argomenti della riga di comando da usare nel terminale OS X.", + "terminalCategory": "Terminale", "terminalIntegratedConfigurationTitle": "Terminale integrato", "viewCategory": "Visualizza" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 0a1fbc5a66f..f4474380bc0 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -4,18 +4,19 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "workbench.action.terminal.copySelection": "Terminale: Copia selezione", - "workbench.action.terminal.focus": "Terminale: Sposta stato attivo su terminale", - "workbench.action.terminal.focusNext": "Terminale: Sposta stato attivo su terminale successivo", - "workbench.action.terminal.focusPrevious": "Terminale: Sposta stato attivo su terminale precedente", - "workbench.action.terminal.kill": "Terminale: Termina istanza attiva del terminale", + "workbench.action.terminal.clear": "Cancella", + "workbench.action.terminal.copySelection": "Copia selezione", + "workbench.action.terminal.focus": "Sposta stato attivo su terminale", + "workbench.action.terminal.focusNext": "Sposta stato attivo su terminale successivo", + "workbench.action.terminal.focusPrevious": "Sposta stato attivo su terminale precedente", + "workbench.action.terminal.kill": "Termina istanza attiva del terminale", "workbench.action.terminal.kill.short": "Termina il terminale", - "workbench.action.terminal.new": "Terminale: Crea nuovo terminale integrato", + "workbench.action.terminal.new": "Crea nuovo terminale integrato", "workbench.action.terminal.new.short": "Nuovo terminale", - "workbench.action.terminal.paste": "Terminale: Incolla nel terminale attivo", - "workbench.action.terminal.runSelectedText": "Terminale: Esegui testo selezionato nel terminale attivo", - "workbench.action.terminal.scrollDown": "Terminale: Scorri verso il basso", - "workbench.action.terminal.scrollUp": "Terminale: Scorri verso l'alto", - "workbench.action.terminal.switchTerminalInstance": "Terminale: Cambia istanza del terminale", + "workbench.action.terminal.paste": "Incolla nel terminale attivo", + "workbench.action.terminal.runSelectedText": "Esegui testo selezionato nel terminale attivo", + "workbench.action.terminal.scrollDown": "Scorri verso il basso", + "workbench.action.terminal.scrollUp": "Scorri verso l'alto", + "workbench.action.terminal.switchTerminalInstance": "Cambia istanza del terminale", "workbench.action.terminal.toggleTerminal": "Attiva/Disattiva terminale integrato" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index dbff67cd4cb..ca45d647942 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "Non è possibile copiare la selezione del terminale quando questo non ha lo stato attivo", "terminal.integrated.exitedWithCode": "Il processo del terminale è stato terminato. Codice di uscita: {0}" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 955c1b6433e..556aff6dba8 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "errorConfigurationFileDirty": "Non è possibile scrivere nel file di configurazione. Il file di configurazione è modificato ma non salvato", - "errorInvalidConfiguration": "Non è possibile scrivere nel file di configurazione. Il file di configurazione trovato non è valido", - "errorUnknownKey": "Non è possibile scrivere nel file di configurazione. La chiave è sconosciuta", - "errorWorkspaceOpened": "Non è possibile scrivere nel file di configurazione. Non è stata aperta alcuna area di lavoro" + "errorConfigurationFileDirty": "Non è possibile scrivere le impostazioni perché il file stato modificato ma non salvato. Salvare il file delle **Impostazioni utente** e riprovare.", + "errorConfigurationFileDirtyWorkspace": "Non è possibile scrivere le impostazioni perché il file stato modificato ma non salvato. Salvare il file delle **Impostazioni area di lavoro** e riprovare.", + "errorInvalidConfiguration": "Non è possibile scrivere le impostazioni. Aprire **Impostazioni utente** per correggere errori/avvisi nel file e riprovare.", + "errorInvalidConfigurationWorkspace": "Non è possibile scrivere le impostazioni. Aprire **Impostazioni area di lavoro** per correggere errori/avvisi nel file e riprovare.", + "errorInvalidTarget": "Non è possibile scrivere nel file di configurazione (destinazione non valida)", + "errorNoWorkspaceOpened": "Non è possibile scrivere le impostazioni perché non è stata aperta alcuna cartella. Aprire prima una cartella e riprovare.", + "errorUnknownKey": "Non è possibile scrivere nel file di configurazione. La chiave è sconosciuta" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/ita/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/ita/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/html/client/out/htmlMain.i18n.json b/i18n/jpn/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/jpn/extensions/typescript/out/typescriptServiceClient.i18n.json index f1a1bc72734..c940aadfb00 100644 --- a/i18n/jpn/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/jpn/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "バージョン {0} で続行しています", + "close": "閉じる", "doNotCheckAgain": "今後確認しない", "localTSFound": "ワークスペース フォルダーには TypeScript バージョン {0} があります。バンドルされたバージョン {1} ではなく、このバージョンを使用しますか?", "moreInformation": "詳細情報", @@ -14,7 +14,6 @@ "serverDied": "TypeScript 言語サービスは、直前の 5 分間に 5 回、予期せずに停止しました。バグ報告を開くことをご検討ください。", "serverDiedAfterStart": "TypeScript 言語サービスは、開始直後に 5 回停止しました。サービスは再開されません。バグ報告を開いてください。", "use": "{0} を使用します", - "useAlways": "詳細情報", "useBundled": "{0} を使用します", "versionMismatch": "グローバルにインストールされている tsc コンパイラ ({0}) と VS Code の言語サービス ({1}) の間にバージョンの不一致が検出されました。これは、非整合のコンパイル エラーを引き起こす可能性があります。", "versionNumber.custom": "カスタム" diff --git a/i18n/jpn/src/vs/base/common/errorMessage.i18n.json b/i18n/jpn/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/common/keybinding.i18n.json b/i18n/jpn/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/jpn/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 972b2f1b6fb..f0f43e8e56c 100644 --- a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "閉じる", "invalidManifest": "正しくない拡張機能: package.json は JSON ファイルではありません。", "invalidName": "正しくない拡張機能: マニフェスト名が一致しません。", "invalidPublisher": "正しくない拡張機能: マニフェストのパブリッシャーが一致しません。", "invalidVersion": "正しくない拡張機能: マニフェストのバージョンが一致しません。", - "noCompatible": "Code のこのバージョンと互換性のある {0} のバージョンが見つかりませんでした。", "notExists": "拡張機能を見つけられませんでした", "restartCode": "{0} を再インストールする前に、Code を再起動してください。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 6943ae8259b..b307c4871d6 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,7 +12,6 @@ "closeEditorsToTheLeft": "左側のエディターを閉じる", "closeEditorsToTheRight": "右側のエディターを閉じる", "closeOtherEditorsInGroup": "その他のエディターを閉じる", - "closeQuickOpen": "クイック オープンを閉じる", "evenEditorGroups": "エディター グループの幅を等間隔に設定する", "focusFirstEditorGroup": "左側のエディター グループにフォーカス", "focusLastEditorInStack": "グループ内の最後のエディターを開く", @@ -38,9 +37,6 @@ "openPreviousEditor": "以前のエディターを開く", "openPreviousEditorInGroup": "グループ内の最近使用したエディターのうち前のエディターを開く", "openToSide": "横に並べて開く", - "quickNavigateNext": "クイック オープンで次に移動", - "quickNavigatePrevious": "クイック オープンで前に移動", - "quickOpen": "ファイルに移動...", "removeFromEditorHistory": "エディター履歴から削除する", "reopenClosedEditor": "閉じたエディターを再度開く", "showAllEditors": "すべてのエディターを表示する", diff --git a/i18n/jpn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index e4f8d8dd9a8..32286ec9e8d 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "canNotRunPlaceholder": "このクイック オープン ハンドラーは現在のコンテキストでは使用できません", + "canNotRunPlaceholder": "この Quick Open ハンドラーは現在のコンテキストでは使用できません", "emptyPicks": "選べるエントリがありません", "entryAriaLabel": "{0}、最近開いたもの", "historyMatches": "最近開いたもの", diff --git a/i18n/jpn/src/vs/workbench/electron-browser/main.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/jpn/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index e407f7b6492..38f3b2ad2b6 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "閉じる", "neverShowAgain": "今後は表示しない", "reallyRecommended": "'{0}' 拡張機能のインストールをお勧めします。", "showRecommendations": "推奨事項を表示" diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index a1995195bc4..abb7047ea7f 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "並べ替え順序: ↑", "descending": "並べ替え順序: ↓", + "extensions": "拡張機能", + "outdatedExtensions": "{0} 古くなった拡張機能", "searchExtensions": "Marketplace で拡張機能を検索する", "sort by installs": "並べ替え: インストール数", "sort by rating": "並べ替え: 評価", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index d0728044935..c73e59d0000 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "terminal": "端末", - "terminal.integrated.commandsToSkipShell": "キーバインドがシェルに送信されず、代わりに常に Code で処理されるコマンド ID のセット。これにより、ターミナルがフォーカスされていない場合と同じ動作をするシェルによって通常使用されるキーバインドを使用できるようになります。例: Ctrl+p でクイック オープンを起動します。", + "terminal.integrated.commandsToSkipShell": "キーバインドがシェルに送信されず、代わりに常に Code で処理されるコマンド ID のセット。これにより、ターミナルがフォーカスされていない場合と同じ動作をするシェルによって通常使用されるキーバインドを使用できるようになります。例: Ctrl+p で Quick Open を起動します。", "terminal.integrated.cursorBlinking": "端末のカーソルを点滅させるかどうかを制御します。", "terminal.integrated.fontFamily": "端末のフォント ファミリを制御します。既定値は editor.fontFamily になります。", "terminal.integrated.fontLigatures": "端末でフォントの合字が有効かどうかを制御します。", diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index a4c1754b03d..78dc7d1a2d1 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "ターミナルにフォーカスがない場合は、ターミナルの選択をコピーできません", "terminal.integrated.exitedWithCode": "端末処理が終了しました (終了コード: {0})" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/jpn/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/jpn/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/html/client/out/htmlMain.i18n.json b/i18n/kor/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/kor/extensions/typescript/out/typescriptServiceClient.i18n.json index f8fdd2c60d9..83384ae06ef 100644 --- a/i18n/kor/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/kor/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "{0} 버전으로 계속", + "close": "닫기", "doNotCheckAgain": "다시 확인 안 함", "localTSFound": "작업 영역 폴더에 TypeScript 버전 {0}이(가) 포함되어 있습니다. 번들 버전 {1} 대신 이 버전을 사용할까요?", "moreInformation": "추가 정보", @@ -14,7 +14,6 @@ "serverDied": "TypeScript 언어 서비스가 지난 5분 동안 예기치 않게 5번 종료되었습니다. 버그 보고서를 열어 보세요.", "serverDiedAfterStart": "TypeScript 언어 서비스가 시작된 직후 5번 종료되었습니다. 서비스가 다시 시작되지 않습니다. 버그 보고서를 열어 보세요.", "use": "{0} 사용", - "useAlways": "추가 정보", "useBundled": "{0} 사용", "versionMismatch": "전역으로 설치된 tsc 컴파일러({0})와 VS Code의 언어 서비스({1}) 간 버전 불일치가 발견되었습니다. 따라서 일관되지 않은 컴파일 오류가 발생할 수 있습니다.", "versionNumber.custom": "사용자 지정" diff --git a/i18n/kor/src/vs/base/common/errorMessage.i18n.json b/i18n/kor/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/base/common/keybinding.i18n.json b/i18n/kor/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/kor/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/indentation/common/indentation.i18n.json b/i18n/kor/src/vs/editor/contrib/indentation/common/indentation.i18n.json index 960950c67e5..49ec9283f80 100644 --- a/i18n/kor/src/vs/editor/contrib/indentation/common/indentation.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/indentation/common/indentation.i18n.json @@ -8,8 +8,8 @@ "detectIndentation": "콘텐츠에서 들여쓰기 감지", "indentUsingSpaces": "공백을 사용한 들여쓰기", "indentUsingTabs": "탭을 사용한 들여쓰기", - "indentationToSpaces": "ID를 공백으로 변환", - "indentationToTabs": "ID를 탭으로 변환", + "indentationToSpaces": "들여쓰기를 공백으로 변환", + "indentationToTabs": "들여쓰기를 탭으로 변환", "selectTabWidth": "현재 파일의 탭 크기 선택", "toggleRenderControlCharacters": "제어 문자 설정/해제", "toggleRenderWhitespace": "공백 토글 및 렌더링" diff --git a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 04fc1f2f4fb..07d619c07bf 100644 --- a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "닫기", "invalidManifest": "잘못된 확장: package.json이 JSON 파일이 아닙니다.", "invalidName": "잘못된 확장: 매니페스트 이름이 일치하지 않습니다.", "invalidPublisher": "잘못된 확장: 매니페스트 게시자가 일치하지 않습니다.", "invalidVersion": "잘못된 확장: 매니페스트 버전이 일치하지 않습니다.", - "noCompatible": "이 버전의 코드에서 {0}의 호환 버전을 찾을 수 없습니다.", "notExists": "확장을 찾을 수 없음", "restartCode": "{0}을(를) 다시 설치하기 전에 Code를 다시 시작하세요." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 18b17686ee1..27f49e2c5b7 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,7 +12,6 @@ "closeEditorsToTheLeft": "왼쪽에 있는 편집기 닫기", "closeEditorsToTheRight": "오른쪽에 있는 편집기 닫기", "closeOtherEditorsInGroup": "다른 편집기 닫기", - "closeQuickOpen": "빠른 열기 닫기", "evenEditorGroups": "균등한 편집기 그룹 너비", "focusFirstEditorGroup": "왼쪽 편집기 그룹으로 포커스 이동", "focusLastEditorInStack": "그룹의 마지막 편집기 열기", @@ -38,9 +37,6 @@ "openPreviousEditor": "이전 편집기 열기", "openPreviousEditorInGroup": "그룹에서 최근에 사용한 이전 편집기 열기", "openToSide": "측면에서 열기", - "quickNavigateNext": "빠른 열기에서 다음 탐색", - "quickNavigatePrevious": "빠른 열기에서 이전 탐색", - "quickOpen": "파일로 이동...", "removeFromEditorHistory": "편집기 기록에서 제거", "reopenClosedEditor": "닫힌 편집기 다시 열기", "showAllEditors": "모든 편집기 표시", diff --git a/i18n/kor/src/vs/workbench/electron-browser/main.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/kor/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 0bb02088d7e..30df2f60f2e 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "닫기", "neverShowAgain": "다시 표시 안 함", "reallyRecommended": "'{0}' 확장을 설치하는 것이 좋습니다.", "showRecommendations": "권장 사항 표시" diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 68ad6f4e615..69c4e337b87 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "정렬 순서: ↑", "descending": "정렬 순서: ↓", + "extensions": "확장", + "outdatedExtensions": "{0}개의 만료된 확장", "searchExtensions": "마켓플레이스에서 확장 검색", "sort by installs": "정렬 기준: 설치 수", "sort by rating": "정렬 기준: 등급", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/kor/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json index 37b83d09595..d8c8e890b5b 100644 --- a/i18n/kor/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "dirtyCounter": "{0}이(가) 저장되지 않음", - "openEditors": "편집기 열기", + "openEditors": "열려 있는 편집기", "openEditosrSection": "편집기 섹션 열기", - "treeAriaLabel": "편집기 열기" + "treeAriaLabel": "열려 있는 편집기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index c0581fb4dc7..110b80c4311 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "터미널에 포커스가 없는 경우 터미널 선택을 복사할 수 없습니다.", "terminal.integrated.exitedWithCode": "터미널 프로세스가 종료 코드 {0}(으)로 종료되었습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/kor/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/kor/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/html/client/out/htmlMain.i18n.json b/i18n/rus/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/rus/extensions/typescript/out/typescriptServiceClient.i18n.json index c6dab682933..38a831665b0 100644 --- a/i18n/rus/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/rus/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "channelName": "TypeScript", - "continueWithVersion": "Продолжение с версией {0}", + "close": "Закрыть", "doNotCheckAgain": "Не проверять еще раз", "localTSFound": "Папка рабочей области содержит версию TypeScript {0}. Использовать эту версию вместо версии в пакете {1}?", "moreInformation": "Дополнительные сведения", @@ -14,7 +14,6 @@ "serverDied": "Служба языка Typescript пять раз непредвиденно завершила работу за последние пять минут. Отправьте отчет об ошибке.", "serverDiedAfterStart": "Языковая служба TypeScript пять раз завершила работу сразу после запуска. Служба не будет перезапущена. Отправьте отчет об ошибке.", "use": "Использовать {0}", - "useAlways": "Дополнительные сведения", "useBundled": "Использовать {0}", "versionMismatch": "Обнаружено несоответствие версий глобально установленного компилятора tsc ({0}) и службы языка VS Code ({1}). Это может привести к ошибкам согласованности компиляции.", "versionNumber.custom": "пользовательский" diff --git a/i18n/rus/src/vs/base/common/errorMessage.i18n.json b/i18n/rus/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/base/common/keybinding.i18n.json b/i18n/rus/src/vs/base/common/keybinding.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/base/common/keybinding.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/common/modes/snippetsRegistry.i18n.json b/i18n/rus/src/vs/editor/common/modes/snippetsRegistry.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/editor/common/modes/snippetsRegistry.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/environment/node/argv.i18n.json b/i18n/rus/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 7a7c0202b84..2ff542bfac8 100644 --- a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Закрыть", "invalidManifest": "Недопустимое расширение: package.json не является файлом JSON.", "invalidName": "Недопустимое расширение: несоответствие имени манифеста.", "invalidPublisher": "Недопустимое расширение: несоответствие издателя манифеста.", "invalidVersion": "Недопустимое расширение: несоответствие версии манифеста.", - "noCompatible": "Не удалось найти версию {0}, совместимую с этой версией кода.", "notExists": "Не удалось найти расширение", "restartCode": "Перезапустите код перед переустановкой {0}." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 359231f57ee..482c007d686 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -12,7 +12,6 @@ "closeEditorsToTheLeft": "Закрыть редакторы слева", "closeEditorsToTheRight": "Закрыть редакторы справа", "closeOtherEditorsInGroup": "Закрыть другие редакторы", - "closeQuickOpen": "Закрыть быстрое открытие", "evenEditorGroups": "Уравнять ширину групп редакторов", "focusFirstEditorGroup": "Фокус на группу редакторов слева", "focusLastEditorInStack": "Открыть последний редактор в группе", @@ -38,9 +37,6 @@ "openPreviousEditor": "Открыть предыдущий редактор", "openPreviousEditorInGroup": "Открыть предыдущий недавно использованный редактор в группе", "openToSide": "Открыть сбоку", - "quickNavigateNext": "Перейти к следующему элементу в окне быстрого открытия", - "quickNavigatePrevious": "Перейти к предыдущему элементу в окне быстрого открытия", - "quickOpen": "Перейти к файлу...", "removeFromEditorHistory": "Удалить из журнала редакторов", "reopenClosedEditor": "Открыть закрытый редактор", "showAllEditors": "Показать все редакторы", diff --git a/i18n/rus/src/vs/workbench/electron-browser/main.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/rus/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index b5fc0293632..466be842cce 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "close": "Закрыть", "neverShowAgain": "Больше не показывать", "reallyRecommended": "Рекомендуется установить расширение \"{0}\".", "showRecommendations": "Показать рекомендации" diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 5d9f90df8f1..f0a6342e535 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -6,6 +6,8 @@ { "ascending": "Порядок сортировки: ↑", "descending": "Порядок сортировки: ↓", + "extensions": "Расширения", + "outdatedExtensions": "Устаревшие расширения: {0}", "searchExtensions": "Поиск расширений в Marketplace", "sort by installs": "Сортировать по: числу установок", "sort by rating": "Сортировать по: рейтинг", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/rus/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json index c965c069e95..d203a2196ec 100644 --- a/i18n/rus/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "dirtyCounter": "Не сохранено: {0}", - "openEditors": "Открыть редакторы", + "openEditors": "Открытые редакторы", "openEditosrSection": "Раздел открытых редакторов", - "treeAriaLabel": "Открыть редакторы" + "treeAriaLabel": "Открытые редакторы" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/textFileService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json b/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index e66260726dc..ad6a7e9f40d 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.copySelection.noSelection": "Невозможно скопировать выделение в терминале, когда терминал не имеет фокуса", "terminal.integrated.exitedWithCode": "Процесс терминала завершен с кодом выхода: {0}" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json b/i18n/rus/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/services/configurationResolver/node/configurationResolverService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json b/i18n/rus/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/services/message/browser/messagelist/messageList.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file From 4b8669822c307970a407a86b3059167198d845ad Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 29 Sep 2016 14:54:34 +0200 Subject: [PATCH 306/433] store and restore scrollTop when updating webview, #12865 --- src/vs/workbench/parts/html/browser/webview.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/vs/workbench/parts/html/browser/webview.html b/src/vs/workbench/parts/html/browser/webview.html index 47df70f6f77..5e16b18eb4c 100644 --- a/src/vs/workbench/parts/html/browser/webview.html +++ b/src/vs/workbench/parts/html/browser/webview.html @@ -108,6 +108,9 @@ newDocument.body.appendChild(defaultScripts); styleBody(newDocument.body); + // keep current scrollTop around and use later + const {scrollTop} = target.contentDocument.body; + // write new content onto iframe target.contentDocument.open('text/html', 'replace'); // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off @@ -116,6 +119,14 @@ target.contentDocument.write(newDocument.documentElement.innerHTML); target.contentDocument.close(); + // workaround for https://github.com/Microsoft/vscode/issues/12865 + // check new scrollTop and reset if neccessary + setTimeout(() => { + if(scrollTop !== target.contentDocument.body.scrollTop) { + target.contentDocument.body.scrollTop = scrollTop; + } + }, 0); + ipcRenderer.sendToHost('did-set-content', stats); }); From 6d68468fe83f1de570713afabcbba5c45b82a3b5 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Thu, 29 Sep 2016 14:55:50 +0200 Subject: [PATCH 307/433] Merge in more translations --- .../node/extensionManagementService.i18n.json | 1 + .../node/extensionManagementService.i18n.json | 1 + 2 files changed, 2 insertions(+) diff --git a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index ee2d50a0160..6254daf36c9 100644 --- a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "close": "關閉", + "installWithoutDependenices": "只安裝這項", "invalidManifest": "擴充功能無效: package.json 不是 JSON 檔案。", "invalidName": "擴充功能無效: 資訊清單名稱不相符。", "invalidPublisher": "擴充功能無效: 資訊清單發行者不相符。", diff --git a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 9c0fced11b2..8bd4b56e41b 100644 --- a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "close": "Fermer", + "installWithoutDependenices": "Installer ceci uniquement", "invalidManifest": "Extension non valide : package.json n'est pas un fichier JSON.", "invalidName": "Extension non valide : non-correspondance du nom du manifeste.", "invalidPublisher": "Extension non valide : non-correspondance de l'éditeur du manifeste.", From 15c4cbf9da5d3a26ab5053038342db50060d5006 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 29 Sep 2016 15:10:23 +0200 Subject: [PATCH 308/433] debug: distinct names for named and indexed variables combined #12989 --- src/vs/workbench/parts/debug/common/debugModel.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 5d3f2a19d5c..b4cac7501a4 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -276,7 +276,8 @@ export abstract class ExpressionContainer implements debug.IExpressionContainer const start = this.getChildrenInChunks ? this.startOfVariables : undefined; const count = this.getChildrenInChunks ? this.indexedVariables : undefined; - return this.fetchVariables(session, start, count, 'indexed').then(variables => childrenArray.concat(variables)); + return this.fetchVariables(session, start, count, 'indexed') + .then(variables => arrays.distinct(childrenArray.concat(variables), child => child.name)); }); } } From a51aa786ba611a40525a959ea1c14084362ec20d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 29 Sep 2016 15:13:41 +0200 Subject: [PATCH 309/433] fixes #12943 --- src/vs/code/electron-main/menus.ts | 2 +- src/vs/workbench/electron-browser/update.ts | 34 +++++++++++++++++-- .../electron-browser/update.contribution.ts | 9 +++-- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index c3566e003ba..68c626fc167 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -644,7 +644,7 @@ export class VSCodeMenu { arrays.coalesce([ this.envService.product.documentationUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miDocumentation', comment: ['&& denotes a mnemonic'] }, "&&Documentation")), click: () => this.openUrl(this.envService.product.documentationUrl, 'openDocumentationUrl') }) : null, - this.envService.product.releaseNotesUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miReleaseNotes', comment: ['&& denotes a mnemonic'] }, "&&Release Notes")), click: () => this.openUrl(this.envService.product.releaseNotesUrl, 'openReleaseNotesUrl') }) : null, + this.envService.product.releaseNotesUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miReleaseNotes', comment: ['&& denotes a mnemonic'] }, "&&Release Notes")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'update.showCurrentReleaseNotes') }) : null, (this.envService.product.documentationUrl || this.envService.product.releaseNotesUrl) ? __separator__() : null, this.envService.product.twitterUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miTwitter', comment: ['&& denotes a mnemonic'] }, "&&Join us on Twitter")), click: () => this.openUrl(this.envService.product.twitterUrl, 'openTwitterUrl') }) : null, this.envService.product.requestFeatureUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miUserVoice', comment: ['&& denotes a mnemonic'] }, "&&Search Feature Requests")), click: () => this.openUrl(this.envService.product.requestFeatureUrl, 'openUserVoiceUrl') }) : null, diff --git a/src/vs/workbench/electron-browser/update.ts b/src/vs/workbench/electron-browser/update.ts index f9795938ba6..23c323ef0a7 100644 --- a/src/vs/workbench/electron-browser/update.ts +++ b/src/vs/workbench/electron-browser/update.ts @@ -11,6 +11,7 @@ import {TPromise} from 'vs/base/common/winjs.base'; import {Action} from 'vs/base/common/actions'; import {ipcRenderer as ipc, shell} from 'electron'; import {IMessageService} from 'vs/platform/message/common/message'; +import pkg from 'vs/platform/package'; import product from 'vs/platform/product'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -38,15 +39,17 @@ const NotNowAction = new Action( () => TPromise.as(true) ); -export class ShowReleaseNotesAction extends Action { +export abstract class AbstractShowReleaseNotesAction extends Action { constructor( + id, + label, private returnValue: boolean, private version: string, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IInstantiationService private instantiationService: IInstantiationService ) { - super('update.showReleaseNotes', nls.localize('releaseNotes', "Release Notes"), null, true); + super(id, label, null, true); } run(): TPromise { @@ -55,6 +58,33 @@ export class ShowReleaseNotesAction extends Action { } } +export class ShowReleaseNotesAction extends AbstractShowReleaseNotesAction { + + constructor( + returnValue: boolean, + version: string, + @IWorkbenchEditorService editorService: IWorkbenchEditorService, + @IInstantiationService instantiationService: IInstantiationService + ) { + super('update.showReleaseNotes', nls.localize('releaseNotes', "Release Notes"), returnValue, version, editorService, instantiationService); + } +} + +export class ShowCurrentReleaseNotesAction extends AbstractShowReleaseNotesAction { + + static ID = 'update.showCurrentReleaseNotes'; + static LABEL = nls.localize('showReleaseNotes', "Show Release Notes"); + + constructor( + id = ShowCurrentReleaseNotesAction.ID, + label = ShowCurrentReleaseNotesAction.LABEL, + @IWorkbenchEditorService editorService: IWorkbenchEditorService, + @IInstantiationService instantiationService: IInstantiationService + ) { + super(id, label, true, pkg.version, editorService, instantiationService); + } +} + export const DownloadAction = (url: string) => new Action( 'update.download', nls.localize('downloadNow', "Download Now"), diff --git a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts index 2c2c2dc267a..a31d45117ab 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts @@ -15,7 +15,7 @@ import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } f import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IMessageService } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; -import { ShowReleaseNotesAction } from 'vs/workbench/electron-browser/update'; +import { ShowReleaseNotesAction, ShowCurrentReleaseNotesAction } from 'vs/workbench/electron-browser/update'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Action } from 'vs/base/common/actions'; import { shell } from 'electron'; @@ -25,6 +25,8 @@ import * as semver from 'semver'; import { EditorDescriptor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/common/editor'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; +import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; +import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; const CloseAction = new Action('close', nls.localize('close', "Close"), '', true, () => null); @@ -113,4 +115,7 @@ const editorDescriptor = new EditorDescriptor( ); Registry.as(EditorExtensions.Editors) - .registerEditor(editorDescriptor, [new SyncDescriptor(ReleaseNotesInput)]); \ No newline at end of file + .registerEditor(editorDescriptor, [new SyncDescriptor(ReleaseNotesInput)]); + +Registry.as(ActionExtensions.WorkbenchActions) + .registerWorkbenchAction(new SyncActionDescriptor(ShowCurrentReleaseNotesAction, ShowCurrentReleaseNotesAction.ID, ShowCurrentReleaseNotesAction.LABEL), 'Open Release Notes'); \ No newline at end of file From 48321a8c794d066d6fcb46bd71e6ab21fdee48e6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 29 Sep 2016 15:17:13 +0200 Subject: [PATCH 310/433] don't namespace-qualify inside vscode.d.ts --- src/vs/vscode.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index b3b5164c49f..f6f1348ff77 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3637,7 +3637,7 @@ declare namespace vscode { /** * The document that will be saved. */ - document: vscode.TextDocument; + document: TextDocument; /** * The reason why save was triggered. @@ -3664,7 +3664,7 @@ declare namespace vscode { * * @param thenable A thenable that resolves to [pre-save-edits](#TextEdit). */ - waitUntil(thenable: Thenable): void; + waitUntil(thenable: Thenable): void; /** * Allows to pause the event loop until the provided thenable resolved. From fe99e442214be578a51453afcb5e2380de47465d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 29 Sep 2016 15:34:46 +0200 Subject: [PATCH 311/433] Revert "fixes #11673" This reverts commit 9e4d4ece414427b3f19777cd69cf17e9cd6a3b1a. --- src/vs/code/electron-main/main.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index f7049962e69..43a9452e3ae 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -6,7 +6,7 @@ 'use strict'; import * as nls from 'vs/nls'; -import { app, ipcMain as ipc, session } from 'electron'; +import { app, ipcMain as ipc } from 'electron'; import { assign } from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; import { parseMainProcessArgv, ParsedArgs } from 'vs/platform/environment/node/argv'; @@ -43,7 +43,6 @@ import { getPathLabel } from 'vs/base/common/labels'; import { IURLService } from 'vs/platform/url/common/url'; import { URLChannel } from 'vs/platform/url/common/urlIpc'; import { URLService } from 'vs/platform/url/electron-main/urlService'; -import pkg from 'vs/platform/package'; import * as fs from 'original-fs'; import * as cp from 'child_process'; @@ -81,9 +80,6 @@ function main(accessor: ServicesAccessor, mainIpcServer: Server, userEnv: IProce const configurationService = accessor.get(IConfigurationService) as ConfigurationService; const windowEventChannel = new WindowEventChannel(windowEventService); - // Set user agent - session.defaultSession.setUserAgent(`VSCode ${ pkg.version }`); - // We handle uncaught exceptions here to prevent electron from opening a dialog to the user process.on('uncaughtException', (err: any) => { if (err) { From adb9c231677a914df9338475950832a9f1f7ffc5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 29 Sep 2016 15:34:41 +0200 Subject: [PATCH 312/433] fixes #12985 --- .../extensionManagement/node/extensionGalleryService.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index e287ed2068b..bf6c399909c 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -542,7 +542,10 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return this._getAsset({ url, headers }) .then(context => asJson(context)) .then(manifest => { - if (!isVersionValid(pkg.version, manifest.engines.vscode)) { + const engine = manifest.engines.vscode; + + // TODO@joao: discuss with alex '*' doesn't seem to be a valid engine version + if (engine !== '*' && !isVersionValid(pkg.version, engine)) { return this.getLastValidExtensionVersionReccursively(extension, versions.slice(1)); } From 0f7880d7a490ba9aee2b053f3f2e46c19423e7e4 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 29 Sep 2016 15:38:53 +0200 Subject: [PATCH 313/433] fixes #12729 --- src/vs/editor/contrib/suggest/browser/suggest.css | 6 ++---- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggest.css b/src/vs/editor/contrib/suggest/browser/suggest.css index 7adeb5218d8..ceb91b4db3c 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/suggest.css @@ -6,8 +6,6 @@ /* Suggest */ .monaco-editor .suggest-widget { background-color: #F3F3F3; - background-position: center center; - background-repeat: no-repeat; border: 1px solid rgb(200, 200, 200); z-index: 40; width: 438px; @@ -20,8 +18,8 @@ transition: left .05s ease-in-out; } -.monaco-editor .suggest-widget.loading { - background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjU3NSIgaGVpZ2h0PSI2cHgiPg0KICA8c3R5bGU+DQogICAgY2lyY2xlIHsNCiAgICAgIGFuaW1hdGlvbjogYmFsbCAyLjVzIGN1YmljLWJlemllcigwLjAwMCwgMS4wMDAsIDEuMDAwLCAwLjAwMCkgaW5maW5pdGU7DQogICAgICBmaWxsOiAjYmJiOw0KICAgIH0NCg0KICAgICNiYWxscyB7DQogICAgICBhbmltYXRpb246IGJhbGxzIDIuNXMgbGluZWFyIGluZmluaXRlOw0KICAgIH0NCg0KICAgICNjaXJjbGUyIHsgYW5pbWF0aW9uLWRlbGF5OiAwLjFzOyB9DQogICAgI2NpcmNsZTMgeyBhbmltYXRpb24tZGVsYXk6IDAuMnM7IH0NCiAgICAjY2lyY2xlNCB7IGFuaW1hdGlvbi1kZWxheTogMC4zczsgfQ0KICAgICNjaXJjbGU1IHsgYW5pbWF0aW9uLWRlbGF5OiAwLjRzOyB9DQoNCiAgICBAa2V5ZnJhbWVzIGJhbGwgew0KICAgICAgZnJvbSB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KICAgICAgMjAlIHsgdHJhbnNmb3JtOiBub25lOyB9DQogICAgICA4MCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoODY0cHgpOyB9DQogICAgICB0byB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCg4NjRweCk7IH0NCiAgICB9DQoNCiAgICBAa2V5ZnJhbWVzIGJhbGxzIHsNCiAgICAgIGZyb20geyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTQwcHgpOyB9DQogICAgICB0byB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgzMHB4KTsgfQ0KICAgIH0NCiAgPC9zdHlsZT4NCiAgPGcgaWQ9ImJhbGxzIj4NCiAgICA8Y2lyY2xlIGNsYXNzPSJjaXJjbGUiIGlkPSJjaXJjbGUxIiBjeD0iLTExNSIgY3k9IjMiIHI9IjMiLz4NCiAgICA8Y2lyY2xlIGNsYXNzPSJjaXJjbGUiIGlkPSJjaXJjbGUyIiBjeD0iLTEzMCIgY3k9IjMiIHI9IjMiIC8+DQogICAgPGNpcmNsZSBjbGFzcz0iY2lyY2xlIiBpZD0iY2lyY2xlMyIgY3g9Ii0xNDUiIGN5PSIzIiByPSIzIiAvPg0KICAgIDxjaXJjbGUgY2xhc3M9ImNpcmNsZSIgaWQ9ImNpcmNsZTQiIGN4PSItMTYwIiBjeT0iMyIgcj0iMyIgLz4NCiAgICA8Y2lyY2xlIGNsYXNzPSJjaXJjbGUiIGlkPSJjaXJjbGU1IiBjeD0iLTE3NSIgY3k9IjMiIHI9IjMiIC8+DQogIDwvZz4NCjwvc3ZnPg=='); +.monaco-editor.mac .suggest-widget .text { + line-height: 1.3em; } .monaco-editor .suggest-widget > .message { diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 840b94e0830..7ae3ec84f2b 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -465,7 +465,6 @@ export class SuggestWidget implements IContentWidget, IDelegate this.state = state; toggleClass(this.element, 'frozen', state === State.Frozen); - toggleClass(this.element, 'loading', state === State.Loading); switch (state) { case State.Hidden: @@ -479,6 +478,7 @@ export class SuggestWidget implements IContentWidget, IDelegate case State.Loading: this.messageElement.textContent = SuggestWidget.LOADING_MESSAGE; hide(this.listElement, this.details.element); + show(this.messageElement); this.show(); break; case State.Empty: From 0f712b7e240efc6c71ea0ef1230144ca027e6c9d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 29 Sep 2016 15:42:45 +0200 Subject: [PATCH 314/433] filter duplicates from recommendations --- .../extensions/electron-browser/extensionTipsService.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 6dc6589d68e..4c741a2d871 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import {forEach} from 'vs/base/common/collections'; +import { forEach } from 'vs/base/common/collections'; +import {distinct} from 'vs/base/common/arrays'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import {match} from 'vs/base/common/glob'; import {IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, LocalExtensionType, EXTENSION_IDENTIFIER_PATTERN} from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -51,7 +52,7 @@ export class ExtensionTipsService implements IExtensionTipsService { const configuration = this.configurationService.getConfiguration(ConfigurationKey); if (configuration.recommendations) { const regEx = new RegExp(EXTENSION_IDENTIFIER_PATTERN); - return configuration.recommendations.filter(recommendation => regEx.test(recommendation)); + return distinct(configuration.recommendations).filter(recommendation => regEx.test(recommendation)); } return configuration.recommendations || []; } From 08d80cc9bc4028966a6676fee542d5a99f7515e6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 29 Sep 2016 15:47:35 +0200 Subject: [PATCH 315/433] filter duplicates and valid recommendations in single loop --- .../extensions/electron-browser/extensionTipsService.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 4c741a2d871..7964a415ffa 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -5,7 +5,6 @@ import { localize } from 'vs/nls'; import { forEach } from 'vs/base/common/collections'; -import {distinct} from 'vs/base/common/arrays'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import {match} from 'vs/base/common/glob'; import {IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, LocalExtensionType, EXTENSION_IDENTIFIER_PATTERN} from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -52,7 +51,9 @@ export class ExtensionTipsService implements IExtensionTipsService { const configuration = this.configurationService.getConfiguration(ConfigurationKey); if (configuration.recommendations) { const regEx = new RegExp(EXTENSION_IDENTIFIER_PATTERN); - return distinct(configuration.recommendations).filter(recommendation => regEx.test(recommendation)); + return configuration.recommendations.filter((element, position) => { + return configuration.recommendations.indexOf(element) === position && regEx.test(element); + }); } return configuration.recommendations || []; } From 176db8aea7a30b329cdc612e213dc86e1d4cc7d5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 29 Sep 2016 15:52:32 +0200 Subject: [PATCH 316/433] fixes #12428 --- src/vs/editor/contrib/hover/browser/hover.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/hover/browser/hover.css b/src/vs/editor/contrib/hover/browser/hover.css index d5f3e081592..8d636c25f46 100644 --- a/src/vs/editor/contrib/hover/browser/hover.css +++ b/src/vs/editor/contrib/hover/browser/hover.css @@ -26,7 +26,7 @@ } .monaco-editor-hover .monaco-editor-hover-content { - max-width: 438px; + max-width: 500px; } .monaco-editor-hover .hover-row { @@ -65,6 +65,7 @@ .monaco-editor-hover .monaco-tokenized-source { white-space: pre-wrap; + word-break: break-all; } .monaco-editor .hoverHighlight { From 2a388da352e64dbd31882c45eb241d5833e58e50 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 29 Sep 2016 15:39:10 +0200 Subject: [PATCH 317/433] Revert "gutterIconPath is string or Uri, #12111" This reverts commit 2d1c94ab08dfa05d3b29fbed971488e8f4ec984e. --- .../browser/services/codeEditorServiceImpl.ts | 5 +-- src/vs/editor/common/editorCommon.ts | 2 +- .../services/decorationRenderOptions.test.ts | 2 +- src/vs/vscode.d.ts | 4 +- src/vs/workbench/api/node/extHostEditors.ts | 2 +- .../api/node/extHostTypeConverters.ts | 39 +------------------ 6 files changed, 8 insertions(+), 46 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index f5826bda6ed..9169bfce8f5 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -323,9 +323,8 @@ class DecorationRenderHelper { public static getCSSTextForModelDecorationGlyphMarginClassName(opts:IThemeDecorationRenderOptions): string { let cssTextArr = []; - if (typeof opts.gutterIconUrl !== 'undefined') { - // escape at least the single quote, see https://www.w3.org/TR/CSS1/#url - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconUrl.replace(/'/g, '\\\''))); + if (typeof opts.gutterIconPath !== 'undefined') { + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.parse(opts.gutterIconPath).toString())); if (typeof opts.gutterIconSize !== 'undefined') { cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); } diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 793c91b1c23..3dac506d42b 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -3788,7 +3788,7 @@ export interface IThemeDecorationRenderOptions { color?: string; letterSpacing?: string; - gutterIconUrl?: string; + gutterIconPath?: string; gutterIconSize?: string; overviewRulerColor?: string; diff --git a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts index c67cb1d53c0..3d009c2647f 100644 --- a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +++ b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts @@ -11,7 +11,7 @@ import {IDecorationRenderOptions} from 'vs/editor/common/editorCommon'; suite('Browser Services - EditorLayoutProvider', () => { var options: IDecorationRenderOptions = { - gutterIconUrl: 'https://github.com/Microsoft/vscode/blob/master/resources/linux/code.png', + gutterIconPath: 'https://github.com/Microsoft/vscode/blob/master/resources/linux/code.png', gutterIconSize: 'contain', backgroundColor: 'red', borderColor: 'yellow' diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index f6f1348ff77..46eaa6f13da 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -782,9 +782,9 @@ declare namespace vscode { letterSpacing?: string; /** - * An **absolute path** to an image or an URI to be rendered in the gutter. + * An **absolute path** to an image to be rendered in the gutterIconPath. */ - gutterIconPath?: string | Uri; + gutterIconPath?: string; /** * Specifies the size of the gutter icon. diff --git a/src/vs/workbench/api/node/extHostEditors.ts b/src/vs/workbench/api/node/extHostEditors.ts index 500276ded61..98e20ebfd63 100644 --- a/src/vs/workbench/api/node/extHostEditors.ts +++ b/src/vs/workbench/api/node/extHostEditors.ts @@ -163,7 +163,7 @@ class TextEditorDecorationType implements vscode.TextEditorDecorationType { constructor(proxy: MainThreadEditorsShape, options: vscode.DecorationRenderOptions) { this.key = TextEditorDecorationType._Keys.nextId(); this._proxy = proxy; - this._proxy.$registerTextEditorDecorationType(this.key, TypeConverters.fromDecorationRenderOptions(options)); + this._proxy.$registerTextEditorDecorationType(this.key, options); } public dispose(): void { diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 7d2bc3ce463..9aebafecfb2 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -12,7 +12,7 @@ import { stringDiff } from 'vs/base/common/diff/diff'; import * as modes from 'vs/editor/common/modes'; import * as types from './extHostTypes'; import { Position as EditorPosition } from 'vs/platform/editor/common/editor'; -import { IPosition, ISelection, IRange, IDecorationOptions, IDecorationRenderOptions, ISingleEditOperation } from 'vs/editor/common/editorCommon'; +import { IPosition, ISelection, IRange, IDecorationOptions, ISingleEditOperation } from 'vs/editor/common/editorCommon'; import { IWorkspaceSymbol } from 'vs/workbench/parts/search/common/search'; import * as vscode from 'vscode'; import URI from 'vs/base/common/uri'; @@ -155,43 +155,6 @@ export function fromRangeOrRangeWithMessage(ranges: vscode.Range[] | vscode.Deco } } -export function fromDecorationRenderOptions(options: vscode.DecorationRenderOptions): IDecorationRenderOptions { - - const { - after, - backgroundColor, before, border, borderColor, borderRadius, borderSpacing, borderStyle, borderWidth, - color, cursor, - dark, - gutterIconPath, gutterIconSize, - isWholeLine, - letterSpacing, light, - outline, outlineColor, outlineStyle, outlineWidth, overviewRulerColor, overviewRulerLane, - textDecoration - } = options; - - // properly convert the gutterIconPath to an url - let gutterIconUrl: string; - if (typeof gutterIconPath === 'string') { - gutterIconUrl = URI.file(gutterIconPath).toString(); - } else if (gutterIconPath) { - // don't escape scheme-sensitive and there better don't - // escape at all, it would break http/data/etc links - gutterIconUrl = gutterIconPath.toString(true); - } - - return { - after, - backgroundColor, before, border, borderColor, borderRadius, borderSpacing, borderStyle, borderWidth, - color, cursor, - dark, - gutterIconUrl, gutterIconSize, - isWholeLine, - letterSpacing, light, - outline, outlineColor, outlineStyle, outlineWidth, overviewRulerColor, overviewRulerLane, - textDecoration - }; -} - export const TextEdit = { minimalEditOperations(edits: vscode.TextEdit[], document: vscode.TextDocument, beforeDocumentVersion: number): ISingleEditOperation[] { From 35540a82a4e865f11fb631906007a4c4f9f906f9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 29 Sep 2016 16:07:30 +0200 Subject: [PATCH 318/433] simpler, but less clean fix for #12111 --- .../browser/services/codeEditorServiceImpl.ts | 24 +++++++++---- src/vs/editor/common/editorCommon.ts | 4 +-- .../services/decorationRenderOptions.test.ts | 36 ++++++++++++++++++- src/vs/vscode.d.ts | 9 ++--- src/vs/workbench/api/node/extHostEditors.ts | 2 +- .../api/node/extHostTypeConverters.ts | 2 +- 6 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 9169bfce8f5..8de809ec758 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -5,6 +5,7 @@ 'use strict'; import * as objects from 'vs/base/common/objects'; +import { parse, stringify } from 'vs/base/common/marshalling'; import * as strings from 'vs/base/common/strings'; import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; @@ -301,8 +302,10 @@ class DecorationRenderHelper { if (typeof opts !== 'undefined') { DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); - if (typeof opts.contentIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.parse(opts.contentIconPath).toString())); + if (typeof opts.contentIconPath === 'string') { + cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.file(opts.contentIconPath).toString())); + } else if (opts.contentIconPath instanceof URI) { + cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, opts.contentIconPath.toString(true).replace(/'/g, '%27'))); } if (typeof opts.contentText !== 'undefined') { let escaped = opts.contentText.replace(/\"/g, '\\\"'); @@ -324,7 +327,11 @@ class DecorationRenderHelper { let cssTextArr = []; if (typeof opts.gutterIconPath !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.parse(opts.gutterIconPath).toString())); + if (typeof opts.gutterIconPath === 'string') { + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.file(opts.gutterIconPath).toString())); + } else { + cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconPath.toString(true).replace(/'/g, '%27'))); + } if (typeof opts.gutterIconSize !== 'undefined') { cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); } @@ -435,11 +442,16 @@ interface IResolvedDecorationRenderOptions { light: IThemeDecorationRenderOptions; dark: IThemeDecorationRenderOptions; } -function getThemedRenderOptions(opts:{light?:T, dark?:T}): {light?:T, dark?:T} { - var light = objects.deepClone(opts); +function getThemedRenderOptions(opts: { light?: T, dark?: T }): { light?: T, dark?: T } { + // TODO@alex,joh - not really how/what deep clone is being used + // for here but it will break the URI + + // var light = objects.deepClone(opts); + var light = parse(stringify(opts)); objects.mixin(light, opts.light); - var dark = objects.deepClone(opts); + // var dark = objects.deepClone(opts); + var dark = parse(stringify(opts)); objects.mixin(dark, opts.dark); return { diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 3dac506d42b..f64c674ec54 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -3788,7 +3788,7 @@ export interface IThemeDecorationRenderOptions { color?: string; letterSpacing?: string; - gutterIconPath?: string; + gutterIconPath?: string | URI; gutterIconSize?: string; overviewRulerColor?: string; @@ -3802,7 +3802,7 @@ export interface IThemeDecorationRenderOptions { */ export interface IContentDecorationRenderOptions { contentText?: string; - contentIconPath?: string; + contentIconPath?: string | URI; border?: string; textDecoration?: string; diff --git a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts index 3d009c2647f..1a6ec2aac0e 100644 --- a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +++ b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts @@ -5,13 +5,14 @@ 'use strict'; import * as assert from 'assert'; +import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import {CodeEditorServiceImpl} from 'vs/editor/browser/services/codeEditorServiceImpl'; import {IDecorationRenderOptions} from 'vs/editor/common/editorCommon'; suite('Browser Services - EditorLayoutProvider', () => { var options: IDecorationRenderOptions = { - gutterIconPath: 'https://github.com/Microsoft/vscode/blob/master/resources/linux/code.png', + gutterIconPath: URI.parse('https://github.com/Microsoft/vscode/blob/master/resources/linux/code.png'), gutterIconSize: 'contain', backgroundColor: 'red', borderColor: 'yellow' @@ -38,4 +39,37 @@ suite('Browser Services - EditorLayoutProvider', () => { assert(sheet.indexOf('border-color: yellow;') > 0); assert(sheet.indexOf('background-color: red;') > 0); }); + + test('css properties, gutterIconPaths', () => { + var styleSheet = dom.createStyleSheet(); + + // unix file path (used as string) + var s = new CodeEditorServiceImpl(styleSheet); + s.registerDecorationType('example', { gutterIconPath: '/Users/foo/bar.png' }); + var sheet = styleSheet.sheet.toString(); + assert(sheet.indexOf('background: url(\'file:///Users/foo/bar.png\') center center no-repeat;') > 0); + + // windows file path (used as string) + s = new CodeEditorServiceImpl(styleSheet); + s.registerDecorationType('example', { gutterIconPath: 'c:\\files\\miles\\more.png' }); + sheet = styleSheet.sheet.toString(); + assert(sheet.indexOf('background: url(\'file:///c%3A/files/miles/more.png\') center center no-repeat;') > 0); + + // URI, only minimal encoding + s = new CodeEditorServiceImpl(styleSheet); + s.registerDecorationType('example', { gutterIconPath: URI.parse('data:image/svg+xml;base64,PHN2ZyB4b+') }); + sheet = styleSheet.sheet.toString(); + assert(sheet.indexOf('background: url(\'data:image/svg+xml;base64,PHN2ZyB4b+\') center center no-repeat;') > 0); + + // single quote must always be escaped/encoded + s = new CodeEditorServiceImpl(styleSheet); + s.registerDecorationType('example', { gutterIconPath: '/Users/foo/b\'ar.png' }); + sheet = styleSheet.sheet.toString(); + assert(sheet.indexOf('background: url(\'file:///Users/foo/b%27ar.png\') center center no-repeat;') > 0, sheet); + + s = new CodeEditorServiceImpl(styleSheet); + s.registerDecorationType('example', { gutterIconPath: URI.parse('http://test/pa\'th') }); + sheet = styleSheet.sheet.toString(); + assert(sheet.indexOf('background: url(\'http://test/pa%27th\') center center no-repeat;') > 0, sheet); + }); }); diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 46eaa6f13da..b9d953a9f0c 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -782,9 +782,9 @@ declare namespace vscode { letterSpacing?: string; /** - * An **absolute path** to an image to be rendered in the gutterIconPath. + * An **absolute path** or an URI to an image to be rendered in the gutter. */ - gutterIconPath?: string; + gutterIconPath?: string | Uri; /** * Specifies the size of the gutter icon. @@ -815,9 +815,10 @@ declare namespace vscode { */ contentText?: string; /** - * An **absolute path** to an image to be rendered in the attachment. Either an icon or a text can be shown, but not both. + * An **absolute path** or an URI to an image to be rendered in the attachment. Either an icon + * or a text can be shown, but not both. */ - contentIconPath?: string; + contentIconPath?: string | Uri; /** * CSS styling property that will be applied to the decoration attachment. */ diff --git a/src/vs/workbench/api/node/extHostEditors.ts b/src/vs/workbench/api/node/extHostEditors.ts index 98e20ebfd63..4ed59e04ff3 100644 --- a/src/vs/workbench/api/node/extHostEditors.ts +++ b/src/vs/workbench/api/node/extHostEditors.ts @@ -163,7 +163,7 @@ class TextEditorDecorationType implements vscode.TextEditorDecorationType { constructor(proxy: MainThreadEditorsShape, options: vscode.DecorationRenderOptions) { this.key = TextEditorDecorationType._Keys.nextId(); this._proxy = proxy; - this._proxy.$registerTextEditorDecorationType(this.key, options); + this._proxy.$registerTextEditorDecorationType(this.key, /* URI vs Uri */ options); } public dispose(): void { diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 9aebafecfb2..62006ea9bbd 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -143,7 +143,7 @@ export function fromRangeOrRangeWithMessage(ranges: vscode.Range[] | vscode.Deco return { range: fromRange(r.range), hoverMessage: r.hoverMessage, - renderOptions: r.renderOptions + renderOptions: /* URI vs Uri */r.renderOptions }; }); } else { From 623e0176c701ab18f114b855026c23f492df4088 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Thu, 29 Sep 2016 16:49:20 +0200 Subject: [PATCH 319/433] Update typescript extension OSSReadme --- extensions/typescript/OSSREADME.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/typescript/OSSREADME.json b/extensions/typescript/OSSREADME.json index a62224cfd5c..9bd93a0ab30 100644 --- a/extensions/typescript/OSSREADME.json +++ b/extensions/typescript/OSSREADME.json @@ -192,9 +192,9 @@ ] }, { - "isLicense": true, // We override the license since we need a coorect Copyright + "isLicense": true, // We override the license since we need a coorect Copyright "name": "typescript", - "version": "1.8.10", + "version": "2.0.3", "license": "Apache2", "repositoryURL": "https://github.com/Microsoft/TypeScript", "description": "The contents of the folder lib is from the TypeScript project https://github.com/Microsoft/TypeScript.", From d18c791e84f74c831741099df3c80cdb432cf230 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 29 Sep 2016 09:40:21 -0700 Subject: [PATCH 320/433] Extra letter-spacing only on OSX (fixes #13017) --- src/vs/workbench/parts/watermark/watermark.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/parts/watermark/watermark.css b/src/vs/workbench/parts/watermark/watermark.css index 9bc78480d6e..3ec0f57f460 100644 --- a/src/vs/workbench/parts/watermark/watermark.css +++ b/src/vs/workbench/parts/watermark/watermark.css @@ -68,6 +68,9 @@ .monaco-workbench > .part.editor > .watermark dd > .shortcuts { padding-left: 0.5em; padding-right: 0.5em; +} + +.monaco-workbench.mac > .part.editor > .watermark dd > .shortcuts { letter-spacing: 0.15em; } From 26135c9a308b4d3e77c92f545ac2cd92d36be71c Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 29 Sep 2016 09:57:00 -0700 Subject: [PATCH 321/433] Do not wrap in watermark (fixes #12980) --- src/vs/workbench/parts/watermark/watermark.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/watermark/watermark.css b/src/vs/workbench/parts/watermark/watermark.css index 3ec0f57f460..3a9b9094c1f 100644 --- a/src/vs/workbench/parts/watermark/watermark.css +++ b/src/vs/workbench/parts/watermark/watermark.css @@ -13,6 +13,7 @@ width: 100%; top: calc(50% + 55px); text-align: center; + white-space: nowrap; } .monaco-workbench > .part.editor > .watermark > .watermark-box { From c1af35126d3075fa57d2dd587c4fdf583d2eafde Mon Sep 17 00:00:00 2001 From: Wade Anderson Date: Thu, 29 Sep 2016 11:11:15 -0700 Subject: [PATCH 322/433] Changed Insider Builds messaging --- .../parts/update/electron-browser/update.contribution.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts index a31d45117ab..b0725c3de72 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts @@ -82,7 +82,7 @@ export class UpdateContribution implements IWorkbenchContribution { if (shouldShowInsiderDisclaimer && /-alpha$|-insider$/.test(pkg.version)) { setTimeout(() => { messageService.show(Severity.Info, { - message: nls.localize('insiderBuilds', "Insider builds are becoming daily builds!", product.nameLong, pkg.version), + message: nls.localize('insiderBuilds', "Insider builds and releases everyday!", product.nameLong, pkg.version), actions: [ new Action('update.insiderBuilds', nls.localize('readmore', "Read More"), '', true, () => { shell.openExternal('http://go.microsoft.com/fwlink/?LinkID=798816'); @@ -118,4 +118,4 @@ Registry.as(EditorExtensions.Editors) .registerEditor(editorDescriptor, [new SyncDescriptor(ReleaseNotesInput)]); Registry.as(ActionExtensions.WorkbenchActions) - .registerWorkbenchAction(new SyncActionDescriptor(ShowCurrentReleaseNotesAction, ShowCurrentReleaseNotesAction.ID, ShowCurrentReleaseNotesAction.LABEL), 'Open Release Notes'); \ No newline at end of file + .registerWorkbenchAction(new SyncActionDescriptor(ShowCurrentReleaseNotesAction, ShowCurrentReleaseNotesAction.ID, ShowCurrentReleaseNotesAction.LABEL), 'Open Release Notes'); From cc3e8bb02912697bf9f152616297a703d5775ccc Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Thu, 29 Sep 2016 21:21:05 +0200 Subject: [PATCH 323/433] Fix for #12977 --- extensions/html/client/src/htmlMain.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/extensions/html/client/src/htmlMain.ts b/extensions/html/client/src/htmlMain.ts index 51c995f2e50..2273bc99c8d 100644 --- a/extensions/html/client/src/htmlMain.ts +++ b/extensions/html/client/src/htmlMain.ts @@ -77,4 +77,19 @@ export function activate(context: ExtensionContext) { } ], }); + + languages.setLanguageConfiguration('razor', { + wordPattern: /("(?:[^\\\"]*(?:\\.)?)*"?)|('(?:[^\\\']*(?:\\.)?)*'?)|[^\s<>={}\[\],]+/, + onEnterRules:[ + { + beforeText: new RegExp(`<(?!(?:${EMPTY_ELEMENTS.join('|')}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i'), + afterText: /^<\/([_:\w][_:\w-.\d]*)\s*>$/i, + action: { indentAction: IndentAction.IndentOutdent } + }, + { + beforeText: new RegExp(`<(?!(?:${EMPTY_ELEMENTS.join('|')}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i'), + action: { indentAction: IndentAction.Indent } + } + ], + }); } \ No newline at end of file From 2e5b5f1750af905d5f3b2cee7a097beb9c2647b7 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Thu, 29 Sep 2016 21:56:01 +0200 Subject: [PATCH 324/433] Fixes #13035: Disable experimental auto build setting --- extensions/typescript/package.json | 5 ----- extensions/typescript/src/typescriptServiceClient.ts | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index ed1d8493bc1..d0249a1917d 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -91,11 +91,6 @@ "default": "off", "description": "%typescript.tsserver.trace%" }, - "typescript.tsserver.experimentalAutoBuild": { - "type": "boolean", - "default": false, - "description": "%typescript.tsserver.experimentalAutoBuild%" - }, "typescript.useCodeSnippetsOnMethodSuggest": { "type": "boolean", "default": false, diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 7602a1bac94..0d2d4d8ca33 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -146,7 +146,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.callbacks = Object.create(null); const configuration = workspace.getConfiguration(); this.tsdk = configuration.get('typescript.tsdk', null); - this._experimentalAutoBuild = configuration.get('typescript.tsserver.experimentalAutoBuild', false); + this._experimentalAutoBuild = false; // configuration.get('typescript.tsserver.experimentalAutoBuild', false); this._apiVersion = APIVersion.v1_x; this.trace = this.readTrace(); workspace.onDidChangeConfiguration(() => { From 70bd724e4e83817447ed28222216324e9edc319b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 29 Sep 2016 22:34:57 +0200 Subject: [PATCH 325/433] fixes #12773 --- extensions/css/server/npm-shrinkwrap.json | 4 ++-- extensions/css/server/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/css/server/npm-shrinkwrap.json b/extensions/css/server/npm-shrinkwrap.json index 5a3feef73f3..3de9c5957ee 100644 --- a/extensions/css/server/npm-shrinkwrap.json +++ b/extensions/css/server/npm-shrinkwrap.json @@ -3,9 +3,9 @@ "version": "1.0.0", "dependencies": { "vscode-css-languageservice": { - "version": "1.0.9-next.1", + "version": "1.1.0", "from": "vscode-css-languageservice@next", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-1.0.9-next.1.tgz" + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-1.1.0.tgz" }, "vscode-jsonrpc": { "version": "2.3.2-next.5", diff --git a/extensions/css/server/package.json b/extensions/css/server/package.json index a5a90bb7138..6c562f095da 100644 --- a/extensions/css/server/package.json +++ b/extensions/css/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^1.0.9-next.1", + "vscode-css-languageservice": "^1.1.0", "vscode-languageserver": "^2.4.0-next.12" }, "scripts": { From 0bd444927df913815e9dbf03c6be52532e53d840 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 29 Sep 2016 20:15:39 -0700 Subject: [PATCH 326/433] Consistently access config values in launch.config (fixes #13051) --- npm-shrinkwrap.json | 5 +++ package.json | 3 +- src/typings/objectpath.d.ts | 8 ++++ .../node/configurationResolverService.ts | 23 +++++++++-- .../node/configurationResolverService.test.ts | 40 +++++++++++++++++++ 5 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/typings/objectpath.d.ts diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c9f5485d0b8..672e82239fe 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -302,6 +302,11 @@ "from": "object.omit@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz" }, + "objectpath": { + "version": "1.2.1", + "from": "objectpath@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/objectpath/-/objectpath-1.2.1.tgz" + }, "oniguruma": { "version": "6.1.1", "from": "oniguruma@>=6.0.1 <7.0.0", diff --git a/package.json b/package.json index e66281ba134..6dfdee210ee 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "applicationinsights": "0.15.6", "chokidar": "bpasero/chokidar#vscode", "emmet": "1.3.1", + "fast-plist": "0.1.2", "gc-signals": "^0.0.1", "getmac": "1.0.7", "graceful-fs": "4.1.2", @@ -26,8 +27,8 @@ "iconv-lite": "0.4.13", "minimist": "1.2.0", "native-keymap": "0.2.0", + "objectpath": "^1.2.1", "pty.js": "https://github.com/Tyriar/pty.js/tarball/fffbf86eb9e8051b5b2be4ba9c7b07faa018ce8d", - "fast-plist": "0.1.2", "semver": "4.3.6", "vscode-debugprotocol": "1.13.0", "vscode-textmate": "2.2.0", diff --git a/src/typings/objectpath.d.ts b/src/typings/objectpath.d.ts new file mode 100644 index 00000000000..128b9bafe53 --- /dev/null +++ b/src/typings/objectpath.d.ts @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module "objectpath" { + export function parse(path: string): string[]; +} diff --git a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts index 51cb1b5e265..c236c89233e 100644 --- a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as ObjectPath from 'objectpath'; import nls = require('vs/nls'); import * as paths from 'vs/base/common/paths'; import * as types from 'vs/base/common/types'; @@ -130,10 +131,26 @@ export class ConfigurationResolverService implements IConfigurationResolverServi } private resolveConfigVariable(value: string, originalValue: string): string { - let regexp = /\$\{config\.(.*?)\}/g; - return value.replace(regexp, (match: string, name: string) => { + let regexp = /\$\{config(\.|(?=\[))(.+?)\}/g; + return value.replace(regexp, (match: string, lead: string, name: string) => { let config = this.configurationService.getConfiguration(); - let newValue = new Function('_', 'try {return _.' + name + ';} catch (ex) { return "";}')(config); + let newValue: any; + try { + const keys: string[] = ObjectPath.parse(name); + if (!keys || keys.length <= 0) { + return ''; + } + while (keys.length > 1) { + const key = keys.shift(); + if (!config || !config.hasOwnProperty(key)) { + return ''; + } + config = config[key]; + } + newValue = config ? config[keys[0]] : ''; + } catch (e) { + return ''; + } if (types.isString(newValue)) { // Prevent infinite recursion and also support nested references (or tokens) return newValue === originalValue ? '' : this.resolveString(newValue); diff --git a/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts index c6a9d539975..09de8c8f3e8 100644 --- a/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts @@ -212,6 +212,46 @@ suite('Configuration Resolver Service', () => { assert.strictEqual(service.resolve('abc ${config.editor.fontFamily} ${config.editor.lineNumbers} ${config.editor.insertSpaces} ${config.json.schemas[0].fileMatch[1]} xyz'), 'abc foo 123 false {{/myOtherfile}} xyz'); }); + test('configuration variables using bracket accessor', () => { + let configurationService: IConfigurationService; + configurationService = new MockConfigurationService({ + editor: { + fontFamily: 'foo' + } + }); + + let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); + assert.strictEqual(service.resolve("abc ${config.editor['fontFamily']} xyz"), 'abc foo xyz'); + assert.strictEqual(service.resolve('abc ${config["editor"].fontFamily} xyz'), 'abc foo xyz'); + assert.strictEqual(service.resolve('abc ${config["editor"]["fontFamily"]} xyz'), 'abc foo xyz'); + }); + + test('configuration variables with invalid accessor', () => { + let configurationService: IConfigurationService; + configurationService = new MockConfigurationService({ + editor: { + fontFamily: 'foo' + } + }); + + let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); + assert.strictEqual(service.resolve("abc ${config.} xyz"), 'abc ${config.} xyz'); + assert.strictEqual(service.resolve("abc ${config.editor..fontFamily} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.editor.none.none2} xyz"), 'abc xyz'); + }); + + test('configuration should not evaluate Javascript', () => { + let configurationService: IConfigurationService; + configurationService = new MockConfigurationService({ + editor: { + a: 'foo' + } + }); + + let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); + assert.strictEqual(service.resolve("abc ${config.editor['abc'.substr(0)]} xyz"), 'abc undefined xyz'); + }); + test('interactive variable simple', () => { const configuration = { 'name': 'Attach to Process', From 17b0c8d028d3b7ceaf3b7c2c226cd0ad6b1feb51 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 29 Sep 2016 21:42:45 -0700 Subject: [PATCH 327/433] Additional tests (#13051) --- .../node/configurationResolverService.ts | 2 +- .../node/configurationResolverService.test.ts | 28 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts index c236c89233e..5ecb4450e89 100644 --- a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts @@ -147,7 +147,7 @@ export class ConfigurationResolverService implements IConfigurationResolverServi } config = config[key]; } - newValue = config ? config[keys[0]] : ''; + newValue = config && config.hasOwnProperty(keys[0]) ? config[keys[0]] : ''; } catch (e) { return ''; } diff --git a/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts index 09de8c8f3e8..c3cb269d392 100644 --- a/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts @@ -244,12 +244,36 @@ suite('Configuration Resolver Service', () => { let configurationService: IConfigurationService; configurationService = new MockConfigurationService({ editor: { - a: 'foo' + abc: 'foo' } }); let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); - assert.strictEqual(service.resolve("abc ${config.editor['abc'.substr(0)]} xyz"), 'abc undefined xyz'); + assert.strictEqual(service.resolve("abc ${config.editor['abc'.substr(0)]} xyz"), 'abc xyz'); + }); + + test('uses empty string as fallback', () => { + let configurationService: IConfigurationService; + configurationService = new MockConfigurationService({ + editor: {} + }); + + let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); + assert.strictEqual(service.resolve("abc ${config.editor.abc} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.editor.abc.def} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.panel} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.panel.abc} xyz"), 'abc xyz'); + }); + + test('is restricted to own properties', () => { + let configurationService: IConfigurationService; + configurationService = new MockConfigurationService({ + editor: {} + }); + + let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); + assert.strictEqual(service.resolve("abc ${config.editor.__proto__} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.editor.toString} xyz"), 'abc xyz'); }); test('interactive variable simple', () => { From e48c5cee50eb31fbfe805858a3d5489c25c4d5b2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 30 Sep 2016 09:00:47 +0200 Subject: [PATCH 328/433] :lipstick: --- .../node/extensionGalleryService.ts | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index bf6c399909c..ed3c269a971 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -13,7 +13,6 @@ import { memoize } from 'vs/base/common/decorators'; import { ArraySet } from 'vs/base/common/set'; import { IGalleryExtension, IExtensionGalleryService, IQueryOptions, SortBy, SortOrder, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; import { getGalleryExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionTelemetry'; -import { isUndefined } from 'vs/base/common/types'; import { assign, getOrDefault } from 'vs/base/common/objects'; import { IRequestService } from 'vs/platform/request/common/request'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -150,17 +149,11 @@ class Query { return new Query(assign({}, this.state, { pageNumber, pageSize })); } - withFilter(filterType: FilterType, values?: string | string[]): Query { - const criteria = this.state.criteria.slice(); - - if (!isUndefined(values)) { - values = Array.isArray(values) ? values : [values]; - for (const value of values) { - criteria.push({ filterType, value }); - } - } else { - criteria.push({ filterType }); - } + withFilter(filterType: FilterType, ...values: string[]): Query { + const criteria = [ + ...this.state.criteria, + ...values.map(value => ({ filterType, value })) + ]; return new Query(assign({}, this.state, { criteria })); } @@ -324,9 +317,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService { if (text) { query = query.withFilter(FilterType.SearchText, text).withSortBy(SortBy.NoneOrRelevance); } else if (options.ids) { - query = query.withFilter(FilterType.ExtensionId, options.ids); + query = query.withFilter(FilterType.ExtensionId, ...options.ids); } else if (options.names) { - query = query.withFilter(FilterType.ExtensionName, options.names); + query = query.withFilter(FilterType.ExtensionName, ...options.names); } else { query = query.withSortBy(SortBy.InstallCount); } @@ -439,8 +432,8 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withFlags(Flags.IncludeLatestVersionOnly, Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, extensionNames.length) .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') - .withAssetTypes(AssetType.Icon, AssetType.License, AssetType.Details, AssetType.Manifest, AssetType.VSIX); - query = query.withFilter(FilterType.ExtensionName, extensionNames); + .withAssetTypes(AssetType.Icon, AssetType.License, AssetType.Details, AssetType.Manifest, AssetType.VSIX) + .withFilter(FilterType.ExtensionName, ...extensionNames); return this.queryGallery(query).then(result => { const dependencies = []; From 07297bdab34bf22a15ba4758f8cb9e5e976f220c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 30 Sep 2016 09:10:06 +0200 Subject: [PATCH 329/433] filter out unpublished extensions fixes #10551 --- .../node/extensionGalleryService.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index ed3c269a971..59f4d380611 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -81,7 +81,12 @@ enum Flags { IncludeInstallationTargets = 0x40, IncludeAssetUri = 0x80, IncludeStatistics = 0x100, - IncludeLatestVersionOnly = 0x200 + IncludeLatestVersionOnly = 0x200, + Unpublished = 0x1000 +} + +function flagsToString(...flags: Flags[]): string { + return String(flags.reduce((r, f) => r | f, 0)); } enum FilterType { @@ -91,7 +96,8 @@ enum FilterType { ExtensionName = 7, Target = 8, Featured = 9, - SearchText = 10 + SearchText = 10, + ExcludeWithFlags = 12 } const AssetType = { @@ -312,6 +318,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withFlags(Flags.IncludeLatestVersionOnly, Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, pageSize) .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') + .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)) .withAssetTypes(AssetType.Icon, AssetType.License, AssetType.Details, AssetType.Manifest, AssetType.VSIX); if (text) { @@ -406,6 +413,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withFlags(Flags.IncludeVersions, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, 1) .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') + .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)) .withAssetTypes(AssetType.Manifest, AssetType.VSIX) .withFilter(FilterType.ExtensionId, extension.id); @@ -432,6 +440,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withFlags(Flags.IncludeLatestVersionOnly, Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, extensionNames.length) .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') + .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)) .withAssetTypes(AssetType.Icon, AssetType.License, AssetType.Details, AssetType.Manifest, AssetType.VSIX) .withFilter(FilterType.ExtensionName, ...extensionNames); From fc21ef35bbd6eff937e27702e67b704cd25fd79e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 30 Sep 2016 09:36:07 +0200 Subject: [PATCH 330/433] fixes #13054 --- src/vs/code/electron-main/launch.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/code/electron-main/launch.ts b/src/vs/code/electron-main/launch.ts index ae604e7ab0c..b036a272fa6 100644 --- a/src/vs/code/electron-main/launch.ts +++ b/src/vs/code/electron-main/launch.ts @@ -12,6 +12,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { ILogService } from 'vs/code/electron-main/log'; import { IURLService } from 'vs/platform/url/common/url'; +import { app } from 'electron'; export interface IStartArguments { args: ICommandLineArguments; @@ -64,6 +65,7 @@ export class LaunchService implements ILaunchService { const openUrl = typeof openUrlArg === 'string' ? [openUrlArg] : openUrlArg; if (openUrl.length > 0) { + app.focus(); openUrl.forEach(url => this.urlService.open(url)); return TPromise.as(null); } From 7ad5ce41a19a0f82b80478693d802d2537a40c60 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 30 Sep 2016 09:57:43 +0200 Subject: [PATCH 331/433] Revert "fixes #13054" This reverts commit fc21ef35bbd6eff937e27702e67b704cd25fd79e. --- src/vs/code/electron-main/launch.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/code/electron-main/launch.ts b/src/vs/code/electron-main/launch.ts index b036a272fa6..ae604e7ab0c 100644 --- a/src/vs/code/electron-main/launch.ts +++ b/src/vs/code/electron-main/launch.ts @@ -12,7 +12,6 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { ILogService } from 'vs/code/electron-main/log'; import { IURLService } from 'vs/platform/url/common/url'; -import { app } from 'electron'; export interface IStartArguments { args: ICommandLineArguments; @@ -65,7 +64,6 @@ export class LaunchService implements ILaunchService { const openUrl = typeof openUrlArg === 'string' ? [openUrlArg] : openUrlArg; if (openUrl.length > 0) { - app.focus(); openUrl.forEach(url => this.urlService.open(url)); return TPromise.as(null); } From 570585199d7ae4743c42ed6545aebcfc723db0f1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 30 Sep 2016 10:11:10 +0200 Subject: [PATCH 332/433] fix #13041 --- src/vs/workbench/parts/search/browser/searchActions.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index 00c1d95ae3a..d8106725267 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -114,7 +114,7 @@ export class ShowPreviousSearchTermAction extends Action { export class FocusNextInputAction extends Action { public static ID = 'search.focus.nextInputBox'; - public static LABEL = nls.localize('focusNextInputbox', "Focus next input box"); + public static LABEL = nls.localize('focusNextInputBox', "Focus next input box"); constructor(id: string, label: string, @IViewletService private viewletService: IViewletService) { super(id, label); @@ -128,8 +128,8 @@ export class FocusNextInputAction extends Action { export class FocusPreviousInputAction extends Action { - public static ID = 'search.focus.previousInputbox'; - public static LABEL = nls.localize('focusPreviousInputbox', "Focus previous input box"); + public static ID = 'search.focus.previousInputBox'; + public static LABEL = nls.localize('focusPreviousInputBox', "Focus previous input box"); constructor(id: string, label: string, @IViewletService private viewletService: IViewletService) { super(id, label); From dcce4939ae0f676afdf15224379384e0f32c66d0 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 30 Sep 2016 10:41:16 +0200 Subject: [PATCH 333/433] #13041 - Down arrow on Search is not navigating to results --- .../parts/search/browser/searchViewlet.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 08b1038cde1..636aee1bc68 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -488,16 +488,16 @@ export class SearchViewlet extends Viewlet { public focusNextInputBox(): void { if (this.searchWidget.searchInputHasFocus()) { - this.searchWidget.focus(true, true); + if (this.searchWidget.isReplaceShown()) { + this.searchWidget.focus(true, true); + } else { + this.moveFocusFromSearchOrReplace(); + } return; } if (this.searchWidget.replaceInputHasFocus()) { - if (this.showsFileTypes()) { - this.toggleFileTypes(true, this.showsFileTypes()); - } else { - this.selectTreeIfNotSelected(); - } + this.moveFocusFromSearchOrReplace(); return; } @@ -513,6 +513,14 @@ export class SearchViewlet extends Viewlet { } } + private moveFocusFromSearchOrReplace() { + if (this.showsFileTypes()) { + this.toggleFileTypes(true, this.showsFileTypes()); + } else { + this.selectTreeIfNotSelected(); + } + } + public focusPreviousInputBox(): void { if (this.searchWidget.searchInputHasFocus()) { return; From ea194582d6c2011d12ba0219a596f7f611c9de88 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 30 Sep 2016 10:34:11 +0200 Subject: [PATCH 334/433] fixes #13050 --- src/vs/workbench/parts/html/browser/webview.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/html/browser/webview.ts b/src/vs/workbench/parts/html/browser/webview.ts index 00617927f0c..43d4a6563d8 100644 --- a/src/vs/workbench/parts/html/browser/webview.ts +++ b/src/vs/workbench/parts/html/browser/webview.ts @@ -103,7 +103,10 @@ export default class Webview { this._onDidClickLink.dispose(); this._onDidLoadContent.dispose(); this._disposables = dispose(this._disposables); - this._webview.parentElement.removeChild(this._webview); + + if (this._webview.parentElement) { + this._webview.parentElement.removeChild(this._webview); + } } get onDidClickLink(): Event { From 1459824cade4ac4cc80d51621ebfc0015cbcbcbe Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 30 Sep 2016 11:06:43 +0200 Subject: [PATCH 335/433] tokenize source in release notes editor related to #13049 --- .../electron-browser/media/markdown.css | 4 +++ .../electron-browser/releaseNotesEditor.ts | 29 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/media/markdown.css b/src/vs/workbench/parts/update/electron-browser/media/markdown.css index 1e792945828..7f28f4be536 100644 --- a/src/vs/workbench/parts/update/electron-browser/media/markdown.css +++ b/src/vs/workbench/parts/update/electron-browser/media/markdown.css @@ -91,6 +91,10 @@ code > div { overflow: auto; } +.monaco-tokenized-source { + white-space: pre; +} + /** Theming */ .vscode-light { diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 8fddc612332..4f324536962 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -25,6 +25,8 @@ import { Keybinding } from 'vs/base/common/keybinding'; import { IRequestService } from 'vs/platform/request/common/request'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import product from 'vs/platform/product'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import {tokenizeToString} from 'vs/editor/common/modes/textToHtmlTokenizer'; function renderBody(body: string): string { return ` @@ -52,7 +54,8 @@ export class ReleaseNotesEditor extends BaseEditor { @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IRequestService private requestService: IRequestService, @IOpenerService private openerService: IOpenerService, - @IKeybindingService private keybindingService: IKeybindingService + @IKeybindingService private keybindingService: IKeybindingService, + @IModeService private modeService: IModeService ) { super(ReleaseNotesEditor.ID, telemetryService); this.disposables = []; @@ -81,7 +84,29 @@ export class ReleaseNotesEditor extends BaseEditor { this.loadContents(() => this.requestService.request({ url }) .then(asText) .then(text => this.patchKeybindings(text)) - .then(marked.parse) + .then(text => { + // we first need to load the modes... + const result = []; + const renderer = new marked.Renderer(); + renderer.code = (code, lang) => { + const modeId = this.modeService.getModeIdForLanguageName(lang); + result.push(this.modeService.getOrCreateMode(modeId)); + return ''; + }; + + marked(text, { renderer }); + return TPromise.join(result).then(() => text); + }) + .then(text => { + // then we can render + const renderer = new marked.Renderer(); + renderer.code = (code, lang) => { + const modeId = this.modeService.getModeIdForLanguageName(lang); + return `${ tokenizeToString(code, modeId) }`; + }; + + return marked(text, { renderer }); + }) .then(renderBody) .then(body => { const webview = new WebView( From 5010ee2df271cb2363427bd8e59a36d490a5c605 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 30 Sep 2016 18:29:04 +0200 Subject: [PATCH 336/433] Simplify configuration resolver (#13051) --- npm-shrinkwrap.json | 5 -- package.json | 1 - src/typings/objectpath.d.ts | 8 --- .../node/configurationResolverService.ts | 3 +- .../node/configurationResolverService.test.ts | 58 +++++++------------ 5 files changed, 23 insertions(+), 52 deletions(-) delete mode 100644 src/typings/objectpath.d.ts diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 672e82239fe..c9f5485d0b8 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -302,11 +302,6 @@ "from": "object.omit@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz" }, - "objectpath": { - "version": "1.2.1", - "from": "objectpath@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/objectpath/-/objectpath-1.2.1.tgz" - }, "oniguruma": { "version": "6.1.1", "from": "oniguruma@>=6.0.1 <7.0.0", diff --git a/package.json b/package.json index 6dfdee210ee..2169f9baa15 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,6 @@ "iconv-lite": "0.4.13", "minimist": "1.2.0", "native-keymap": "0.2.0", - "objectpath": "^1.2.1", "pty.js": "https://github.com/Tyriar/pty.js/tarball/fffbf86eb9e8051b5b2be4ba9c7b07faa018ce8d", "semver": "4.3.6", "vscode-debugprotocol": "1.13.0", diff --git a/src/typings/objectpath.d.ts b/src/typings/objectpath.d.ts deleted file mode 100644 index 128b9bafe53..00000000000 --- a/src/typings/objectpath.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module "objectpath" { - export function parse(path: string): string[]; -} diff --git a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts index 5ecb4450e89..4ac59e9ad32 100644 --- a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as ObjectPath from 'objectpath'; import nls = require('vs/nls'); import * as paths from 'vs/base/common/paths'; import * as types from 'vs/base/common/types'; @@ -136,7 +135,7 @@ export class ConfigurationResolverService implements IConfigurationResolverServi let config = this.configurationService.getConfiguration(); let newValue: any; try { - const keys: string[] = ObjectPath.parse(name); + const keys: string[] = name.split('.'); if (!keys || keys.length <= 0) { return ''; } diff --git a/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts index c3cb269d392..943a7eb3ef5 100644 --- a/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts @@ -209,35 +209,7 @@ suite('Configuration Resolver Service', () => { }); let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); - assert.strictEqual(service.resolve('abc ${config.editor.fontFamily} ${config.editor.lineNumbers} ${config.editor.insertSpaces} ${config.json.schemas[0].fileMatch[1]} xyz'), 'abc foo 123 false {{/myOtherfile}} xyz'); - }); - - test('configuration variables using bracket accessor', () => { - let configurationService: IConfigurationService; - configurationService = new MockConfigurationService({ - editor: { - fontFamily: 'foo' - } - }); - - let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); - assert.strictEqual(service.resolve("abc ${config.editor['fontFamily']} xyz"), 'abc foo xyz'); - assert.strictEqual(service.resolve('abc ${config["editor"].fontFamily} xyz'), 'abc foo xyz'); - assert.strictEqual(service.resolve('abc ${config["editor"]["fontFamily"]} xyz'), 'abc foo xyz'); - }); - - test('configuration variables with invalid accessor', () => { - let configurationService: IConfigurationService; - configurationService = new MockConfigurationService({ - editor: { - fontFamily: 'foo' - } - }); - - let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); - assert.strictEqual(service.resolve("abc ${config.} xyz"), 'abc ${config.} xyz'); - assert.strictEqual(service.resolve("abc ${config.editor..fontFamily} xyz"), 'abc xyz'); - assert.strictEqual(service.resolve("abc ${config.editor.none.none2} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.editor.fontFamily} ${config.editor.lineNumbers} ${config.editor.insertSpaces} xyz'), 'abc foo 123 false xyz'); }); test('configuration should not evaluate Javascript', () => { @@ -249,7 +221,7 @@ suite('Configuration Resolver Service', () => { }); let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); - assert.strictEqual(service.resolve("abc ${config.editor['abc'.substr(0)]} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.editor[\'abc\'.substr(0)]} xyz'), 'abc xyz'); }); test('uses empty string as fallback', () => { @@ -259,10 +231,10 @@ suite('Configuration Resolver Service', () => { }); let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); - assert.strictEqual(service.resolve("abc ${config.editor.abc} xyz"), 'abc xyz'); - assert.strictEqual(service.resolve("abc ${config.editor.abc.def} xyz"), 'abc xyz'); - assert.strictEqual(service.resolve("abc ${config.panel} xyz"), 'abc xyz'); - assert.strictEqual(service.resolve("abc ${config.panel.abc} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.editor.abc} xyz'), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.editor.abc.def} xyz'), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.panel} xyz'), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.panel.abc} xyz'), 'abc xyz'); }); test('is restricted to own properties', () => { @@ -272,8 +244,22 @@ suite('Configuration Resolver Service', () => { }); let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); - assert.strictEqual(service.resolve("abc ${config.editor.__proto__} xyz"), 'abc xyz'); - assert.strictEqual(service.resolve("abc ${config.editor.toString} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.editor.__proto__} xyz'), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.editor.toString} xyz'), 'abc xyz'); + }); + + test('configuration variables with invalid accessor', () => { + let configurationService: IConfigurationService; + configurationService = new MockConfigurationService({ + editor: { + fontFamily: 'foo' + } + }); + + let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); + assert.strictEqual(service.resolve('abc ${config.} xyz'), 'abc ${config.} xyz'); + assert.strictEqual(service.resolve('abc ${config.editor..fontFamily} xyz'), 'abc xyz'); + assert.strictEqual(service.resolve('abc ${config.editor.none.none2} xyz'), 'abc xyz'); }); test('interactive variable simple', () => { From c96822698cdbd47b8245fb5f9f45a0168bc9da33 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 30 Sep 2016 09:34:19 -0700 Subject: [PATCH 337/433] Clean up (#13051) --- .../node/configurationResolverService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts index 4ac59e9ad32..1a160545d66 100644 --- a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts @@ -130,8 +130,8 @@ export class ConfigurationResolverService implements IConfigurationResolverServi } private resolveConfigVariable(value: string, originalValue: string): string { - let regexp = /\$\{config(\.|(?=\[))(.+?)\}/g; - return value.replace(regexp, (match: string, lead: string, name: string) => { + let regexp = /\$\{config\.(.+?)\}/g; + return value.replace(regexp, (match: string, name: string) => { let config = this.configurationService.getConfiguration(); let newValue: any; try { From 602155bb781f509c7a4ddcd700b57cb9b9f5286d Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 30 Sep 2016 17:08:23 -0700 Subject: [PATCH 338/433] Avoid backticks (fixes #13098) --- src/vs/workbench/electron-browser/actions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 97a39d43114..c3793eaabc2 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -521,12 +521,13 @@ export class ReportIssueAction extends Action { } private generateNewIssueUrl(baseUrl: string, name: string, version: string, commit: string, date: string, isPure: boolean, extensions:ILocalExtension[]): string { + // Avoid backticks, these can trigger XSS detectors. (https://github.com/Microsoft/vscode/issues/13098) const osVersion = `${os.type()} ${os.arch()} ${os.release()}`; const queryStringPrefix = baseUrl.indexOf('?') === -1 ? '?' : '&'; const body = encodeURIComponent( `- VSCode Version: ${name} ${version}${isPure ? '' : ' **[Unsupported]**'} (${product.commit || 'Commit unknown'}, ${product.date || 'Date unknown'}) - OS Version: ${osVersion} -- Extensions: ${extensions.map(e => '`' + e.id + '`').join(', ')} +- Extensions: ${extensions.map(e => e.id).join(', ')} Steps to Reproduce: From bcfc5863036c5a1b119b1322e35ddf8b3409c0c3 Mon Sep 17 00:00:00 2001 From: heycalmdown Date: Sat, 1 Oct 2016 15:28:55 +0900 Subject: [PATCH 339/433] Add an indicator for the current window --- src/vs/workbench/electron-browser/actions.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index c3793eaabc2..cd65f17b22f 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -91,11 +91,12 @@ export class SwitchWindow extends Action { } public run(): TPromise { - ipc.send('vscode:switchWindow', this.windowService.getWindowId()); + const id = this.windowService.getWindowId(); + ipc.send('vscode:switchWindow', id); ipc.once('vscode:switchWindow', (event, workspaces) => { const picks: IPickOpenEntry[] = workspaces.map(w => { return { - label: w.title, + label: (id === w.id) && `${w.title} ✓` || w.title, run: () => { ipc.send('vscode:showWindow', w.id); } From bac98be706cbd309fd16b9adc00e48eace35eaf6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 3 Oct 2016 08:34:30 +0200 Subject: [PATCH 340/433] fix #13121 --- .vscode/extensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index beb2d6caa0a..6cb9439d5c7 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,5 @@ { - // See https://go.microsoft.com/fwlink/?LinkId=733558 + // See http://go.microsoft.com/fwlink/?LinkId=827846 // for the documentation about the extensions.json format "recommendations": [ "eg2.tslint", From 93740200915985de2c0357874995a35298cf5039 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 3 Oct 2016 09:50:53 +0200 Subject: [PATCH 341/433] fixes #13083 --- src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css index 8c9f24fba7b..2def2a1fd11 100644 --- a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css +++ b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css @@ -12,6 +12,7 @@ color: white; font-size: 12px; padding: 0 10px; + overflow: hidden; } .monaco-workbench.no-workspace > .part.statusbar { From e8c84077e26021bfd050283e1a1a6c8c725c18d4 Mon Sep 17 00:00:00 2001 From: heycalmdown Date: Mon, 3 Oct 2016 16:57:30 +0900 Subject: [PATCH 342/433] Use description to indicate current window --- src/vs/workbench/electron-browser/actions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index cd65f17b22f..b0c2c27c7fa 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -96,7 +96,8 @@ export class SwitchWindow extends Action { ipc.once('vscode:switchWindow', (event, workspaces) => { const picks: IPickOpenEntry[] = workspaces.map(w => { return { - label: (id === w.id) && `${w.title} ✓` || w.title, + label: w.title, + description: (id === w.id) ? nls.localize('current', "Current Window") : void 0, run: () => { ipc.send('vscode:showWindow', w.id); } From faba41c72a1ddf96f67a17c31c50c892c7e47571 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Oct 2016 10:20:07 +0200 Subject: [PATCH 343/433] Recent folders list changes when opening folder in extension debug window (fixes #11164) --- src/vs/code/electron-main/windows.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 9c0ff14e3ca..8a9a050ed07 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -715,7 +715,7 @@ export class WindowsManager implements IWindowsService { // Remember in recent document list (unless this opens for extension development) // Also do not add paths when files are opened for diffing, only if opened individually - if (!openConfig.cli.extensionDevelopmentPath && !openConfig.cli.diff) { + if (!usedWindows.some(w => w.isPluginDevelopmentHost) && !openConfig.cli.diff) { iPathsToOpen.forEach(iPath => { if (iPath.filePath || iPath.workspacePath) { app.addRecentDocument(iPath.filePath || iPath.workspacePath); From 82a8beab62d8f812f2d9dce77bcc5fd5e5819af4 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 3 Oct 2016 10:27:19 +0200 Subject: [PATCH 344/433] Console output - maintain scroll position fixes #12937 --- src/vs/workbench/parts/debug/electron-browser/repl.ts | 8 -------- .../workbench/parts/output/browser/outputEditorInput.ts | 4 ++++ src/vs/workbench/parts/output/browser/outputPanel.ts | 5 ----- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/repl.ts b/src/vs/workbench/parts/debug/electron-browser/repl.ts index 3e2cc13e19d..ac8c36a6801 100644 --- a/src/vs/workbench/parts/debug/electron-browser/repl.ts +++ b/src/vs/workbench/parts/debug/electron-browser/repl.ts @@ -99,14 +99,6 @@ export class Repl extends Panel implements IPrivateReplService { this.toDispose.push(this.debugService.getModel().onDidChangeReplElements(() => { this.onReplElementsUpdated(); })); - this.toDispose.push(this.panelService.onDidPanelOpen(panel => { - if (panel.getId() === debug.REPL_ID) { - const elements = this.debugService.getModel().getReplElements(); - if (elements.length > 0) { - return this.tree.reveal(elements[elements.length - 1]); - } - } - })); this.toDispose.push(this.themeService.onDidColorThemeChange(e => this.replInput.updateOptions(this.getReplInputOptions()))); } diff --git a/src/vs/workbench/parts/output/browser/outputEditorInput.ts b/src/vs/workbench/parts/output/browser/outputEditorInput.ts index df7d94726a5..1f78496046b 100644 --- a/src/vs/workbench/parts/output/browser/outputEditorInput.ts +++ b/src/vs/workbench/parts/output/browser/outputEditorInput.ts @@ -69,6 +69,10 @@ export class OutputEditorInput extends StringEditorInput { } private appendOutput(): void { + if (this.bufferedOutput.length === 0) { + return; + } + if (this.value.length + this.bufferedOutput.length > MAX_OUTPUT_LENGTH) { this.setValue(this.outputChannel.output); } else { diff --git a/src/vs/workbench/parts/output/browser/outputPanel.ts b/src/vs/workbench/parts/output/browser/outputPanel.ts index 78072e6c0ee..5ca3c025132 100644 --- a/src/vs/workbench/parts/output/browser/outputPanel.ts +++ b/src/vs/workbench/parts/output/browser/outputPanel.ts @@ -107,11 +107,6 @@ export class OutputPanel extends StringEditor { this.setInput(OutputEditorInput.getInstance(this.instantiationService, this.outputService.getActiveChannel()), null); } - public focus(): void { - super.focus(); - this.revealLastLine(); - } - public dispose(): void { this.toDispose = lifecycle.dispose(this.toDispose); super.dispose(); From 6c6f520eb1c166ffaf359c2a114f70b284bd7cbc Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Oct 2016 10:40:48 +0200 Subject: [PATCH 345/433] explorer: keep focused item even when editors close --- src/vs/workbench/parts/files/browser/views/explorerView.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index 636f151490c..87b3ceea993 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -159,7 +159,6 @@ export class ExplorerView extends CollapsibleViewletView { private onEditorsChanged(): void { const activeInput = this.editorService.getActiveEditorInput(); let clearSelection = true; - let clearFocus = false; // Handle File Input if (activeInput instanceof FileEditorInput) { @@ -182,17 +181,12 @@ export class ExplorerView extends CollapsibleViewletView { // Handle closed or untitled file (convince explorer to not reopen any file when getting visible) if (activeInput instanceof UntitledEditorInput || !activeInput) { this.settings[ExplorerView.MEMENTO_LAST_ACTIVE_FILE_RESOURCE] = void 0; - clearFocus = true; } // Otherwise clear if (clearSelection) { this.explorerViewer.clearSelection(); } - - if (clearFocus) { - this.explorerViewer.clearFocus(); - } } private onConfigurationUpdated(configuration: IFilesConfiguration, refresh?: boolean): void { From 713e0597e500d331f5be725649ba2f4e044c95e9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Oct 2016 10:47:10 +0200 Subject: [PATCH 346/433] better icon for folders in task jump list --- src/vs/code/electron-main/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 43a9452e3ae..ed962e2cee3 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -229,7 +229,7 @@ function main(accessor: ServicesAccessor, mainIpcServer: Server, userEnv: IProce description: nls.localize('folderDesc', "{0} {1}", path.basename(folder), getPathLabel(path.dirname(folder))), program: process.execPath, args: folder, // open folder, - iconPath: process.execPath, + iconPath: 'explorer.exe', // simulate folder icon iconIndex: 0 }; }) From b0c67e9fc8fe4dfa8424849e0447bdd3c8483534 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 3 Oct 2016 10:49:03 +0200 Subject: [PATCH 347/433] debug: conditional breakpoint labels polish --- src/vs/workbench/parts/debug/browser/breakpointWidget.ts | 2 +- src/vs/workbench/parts/debug/browser/debugActions.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/breakpointWidget.ts b/src/vs/workbench/parts/debug/browser/breakpointWidget.ts index 9aa57c5576f..dc13999eeea 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/parts/debug/browser/breakpointWidget.ts @@ -65,7 +65,7 @@ export class BreakpointWidget extends ZoneWidget { const inputBoxContainer = dom.append(container, $('.inputBoxContainer')); this.inputBox = new InputBox(inputBoxContainer, this.contextViewService, { - placeholder: nls.localize('breakpointWidgetPlaceholder', "Breakpoint on line {0} will only stop if this condition is true. 'Enter' to accept, 'esc' to cancel.", this.lineNumber), + placeholder: nls.localize('breakpointWidgetPlaceholder', "Breakpoint on line {0} will only stop if this condition is true.", this.lineNumber), ariaLabel: nls.localize('breakpointWidgetAriaLabel', "Type the breakpoint condition for line {0}. The program will only stop here if this condition is true. Press Enter to accept or Escape to cancel.") }); this.toDispose.push(this.inputBox); diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index 883f76b3918..279f73d6ddd 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -494,7 +494,7 @@ export class RenameFunctionBreakpointAction extends AbstractDebugAction { export class AddConditionalBreakpointAction extends AbstractDebugAction { static ID = 'workbench.debug.viewlet.action.addConditionalBreakpointAction'; - static LABEL = nls.localize('addConditionalBreakpoint', "Add Conditional Breakpoint"); + static LABEL = nls.localize('addConditionalBreakpoint', "Add Conditional Breakpoint..."); constructor(id: string, label: string, private editor: editorbrowser.ICodeEditor, @@ -514,7 +514,7 @@ export class AddConditionalBreakpointAction extends AbstractDebugAction { export class EditConditionalBreakpointAction extends AbstractDebugAction { static ID = 'workbench.debug.viewlet.action.editConditionalBreakpointAction'; - static LABEL = nls.localize('editConditionalBreakpoint', "Edit Breakpoint"); + static LABEL = nls.localize('editConditionalBreakpoint', "Edit Breakpoint..."); constructor(id: string, label: string, private editor: editorbrowser.ICodeEditor, @@ -568,8 +568,8 @@ class EditorConditionalBreakpointAction extends EditorAction { constructor() { super({ id: 'editor.debug.action.conditionalBreakpoint', - label: nls.localize('conditionalBreakpointEditorAction', "Debug: Conditional Breakpoint"), - alias: 'Debug: Conditional Breakpoint', + label: nls.localize('conditionalBreakpointEditorAction', "Debug: Add Conditional Breakpoint..."), + alias: 'Debug: Add Conditional Breakpoint...', precondition: null }); } From d289a253cab4a0929e2244e48614d42d965826ca Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 3 Oct 2016 11:06:28 +0200 Subject: [PATCH 348/433] remove compatibility properties - no longer needed --- .../common/extensionManagement.ts | 3 -- .../node/extensionGalleryService.ts | 31 +++++++------------ 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 88e78ae2d55..f4f7320de84 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -136,9 +136,6 @@ export interface IGalleryExtension { ratingCount: number; assets: IGalleryExtensionAssets; properties: IGalleryExtensionProperties; - /** We need this check until all extension in the market place contain engine property */ - compatibilityChecked: boolean; - isCompatible: boolean; } export interface IGalleryMetadata { diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 59f4d380611..ce726731b9f 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -233,7 +233,7 @@ function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUr license: getAssetSource(version.files, AssetType.License) }; - return setCompatibilityProperties({ + return { id: galleryExtension.extensionId, name: galleryExtension.extensionName, version: version.version, @@ -250,18 +250,8 @@ function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUr properties: { dependencies: getDependencies(version), engine: getEngine(version) - }, - compatibilityChecked: false, - isCompatible: false - }); -} - -function setCompatibilityProperties(galleryExtension: IGalleryExtension): IGalleryExtension { - if (!galleryExtension.compatibilityChecked) { - galleryExtension.compatibilityChecked = !!galleryExtension.properties.engine; - galleryExtension.isCompatible = galleryExtension.properties.engine && isVersionValid(pkg.version, galleryExtension.properties.engine); - } - return galleryExtension; + } + }; } export class ExtensionGalleryService implements IExtensionGalleryService { @@ -405,8 +395,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } loadCompatibleVersion(extension: IGalleryExtension): TPromise { - extension = setCompatibilityProperties(extension); - if (extension.compatibilityChecked && extension.isCompatible) { + if (extension.properties.engine && this.isEngineValid(extension.properties.engine)) { return TPromise.wrap(extension); } const query = new Query() @@ -427,8 +416,6 @@ export class ExtensionGalleryService implements IExtensionGalleryService { extension.properties.dependencies = getDependencies(rawVersion); extension.properties.engine = getEngine(rawVersion); extension.assets.download = `${getAssetSource(rawVersion.files, AssetType.VSIX)}?install=true`; - extension.compatibilityChecked = true; - extension.isCompatible = true; extension.version = rawVersion.version; return extension; }); @@ -525,7 +512,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { if (!engine) { return null; } - if (isVersionValid(pkg.version, engine, [])) { + if (this.isEngineValid(engine)) { return TPromise.wrap(version); } } @@ -546,8 +533,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .then(manifest => { const engine = manifest.engines.vscode; - // TODO@joao: discuss with alex '*' doesn't seem to be a valid engine version - if (engine !== '*' && !isVersionValid(pkg.version, engine)) { + if (!this.isEngineValid(engine)) { return this.getLastValidExtensionVersionReccursively(extension, versions.slice(1)); } @@ -557,6 +543,11 @@ export class ExtensionGalleryService implements IExtensionGalleryService { }); } + private isEngineValid(engine: string): boolean { + // TODO@joao: discuss with alex '*' doesn't seem to be a valid engine version + return engine === '*' || isVersionValid(pkg.version, engine); + } + private static hasExtensionByName(extensions: IGalleryExtension[], name: string): boolean { for (const extension of extensions) { if (`${extension.publisher}.${extension.name}` === name) { From 43585bd3659b84112afcb4379a7ae7ccf61562b6 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Oct 2016 11:07:50 +0200 Subject: [PATCH 349/433] Reloading a window should restore the active viewlet (fixes #8269) --- src/vs/workbench/electron-browser/actions.ts | 9 +++++++- .../workbench/electron-browser/workbench.ts | 20 +++++++++++++++++- .../services/part/common/partService.ts | 5 +++++ .../thread/electron-browser/threadService.ts | 21 +++++++++++-------- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index b0c2c27c7fa..76e25d00308 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -20,6 +20,7 @@ import errors = require('vs/base/common/errors'); import {IMessageService, Severity} from 'vs/platform/message/common/message'; import {IWindowConfiguration} from 'vs/workbench/electron-browser/common'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; +import {IPartService} from 'vs/workbench/services/part/common/partService'; import {IEnvironmentService} from 'vs/platform/environment/common/environment'; import {IExtensionManagementService, LocalExtensionType, ILocalExtension} from 'vs/platform/extensionManagement/common/extensionManagement'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; @@ -396,11 +397,17 @@ export class ReloadWindowAction extends Action { public static ID = 'workbench.action.reloadWindow'; public static LABEL = nls.localize('reloadWindow', "Reload Window"); - constructor(id: string, label: string, @IWindowService private windowService: IWindowService) { + constructor( + id: string, + label: string, + @IWindowService private windowService: IWindowService, + @IPartService private partService: IPartService + ) { super(id, label); } public run(): TPromise { + this.partService.setRestoreSidebar(); // we want the same sidebar after a reload restored this.windowService.getWindow().reload(); return TPromise.as(true); diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 6ad65b18166..0f40393c703 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -106,6 +106,7 @@ export class Workbench implements IPartService { private static sidebarPositionSettingKey = 'workbench.sidebar.position'; private static statusbarHiddenSettingKey = 'workbench.statusbar.hidden'; private static sidebarHiddenSettingKey = 'workbench.sidebar.hidden'; + private static sidebarRestoreSettingKey = 'workbench.sidebar.restore'; private static panelHiddenSettingKey = 'workbench.panel.hidden'; public _serviceBrand: any; @@ -217,7 +218,7 @@ export class Workbench implements IPartService { // Load Viewlet const viewletRegistry = (Registry.as(ViewletExtensions.Viewlets)); let viewletId = viewletRegistry.getDefaultViewletId(); - if (!this.environmentService.isBuilt) { + if (this.shouldRestoreSidebar()) { viewletId = this.storageService.get(SidebarPart.activeViewletSettingsKey, StorageScope.WORKSPACE, viewletRegistry.getDefaultViewletId()); // help developers and restore last view } @@ -833,4 +834,21 @@ export class Workbench implements IPartService { public getWorkbenchElementId(): string { return Identifiers.WORKBENCH_CONTAINER; } + + public setRestoreSidebar(): void { + this.storageService.store(Workbench.sidebarRestoreSettingKey, 'true', StorageScope.WORKSPACE); + } + + private shouldRestoreSidebar(): boolean { + if (!this.environmentService.isBuilt) { + return true; // always restore sidebar when we are in development mode + } + + const restore = this.storageService.getBoolean(Workbench.sidebarRestoreSettingKey, StorageScope.WORKSPACE); + if (restore) { + this.storageService.remove(Workbench.sidebarRestoreSettingKey, StorageScope.WORKSPACE); // only support once + } + + return restore; + } } \ No newline at end of file diff --git a/src/vs/workbench/services/part/common/partService.ts b/src/vs/workbench/services/part/common/partService.ts index d87d8e14370..aacd8950c57 100644 --- a/src/vs/workbench/services/part/common/partService.ts +++ b/src/vs/workbench/services/part/common/partService.ts @@ -105,4 +105,9 @@ export interface IPartService { * Returns the identifier of the element that contains the workbench. */ getWorkbenchElementId(): string; + + /** + * Enables to restore the contents of the sidebar after a restart. + */ + setRestoreSidebar(): void; } \ No newline at end of file diff --git a/src/vs/workbench/services/thread/electron-browser/threadService.ts b/src/vs/workbench/services/thread/electron-browser/threadService.ts index 5dd01966785..1acc78c7aea 100644 --- a/src/vs/workbench/services/thread/electron-browser/threadService.ts +++ b/src/vs/workbench/services/thread/electron-browser/threadService.ts @@ -6,7 +6,6 @@ 'use strict'; import * as nls from 'vs/nls'; -import {Action} from 'vs/base/common/actions'; import {toErrorMessage} from 'vs/base/common/errorMessage'; import {stringify} from 'vs/base/common/marshalling'; import * as objects from 'vs/base/common/objects'; @@ -24,6 +23,8 @@ import {ChildProcess, fork} from 'child_process'; import {ipcRenderer as ipc} from 'electron'; import {IThreadService} from 'vs/workbench/services/thread/common/threadService'; import {IEnvironmentService} from 'vs/platform/environment/common/environment'; +import {ReloadWindowAction} from 'vs/workbench/electron-browser/actions'; +import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; export const EXTENSION_LOG_BROADCAST_CHANNEL = 'vscode:extensionLog'; export const EXTENSION_ATTACH_BROADCAST_CHANNEL = 'vscode:extensionAttach'; @@ -49,11 +50,12 @@ export class MainThreadService extends AbstractThreadService implements IThreadS @IMessageService messageService: IMessageService, @IWindowService windowService: IWindowService, @IEnvironmentService environmentService: IEnvironmentService, - @ILifecycleService lifecycleService: ILifecycleService + @ILifecycleService lifecycleService: ILifecycleService, + @IInstantiationService instantiationService: IInstantiationService ) { super(true); - this.extensionHostProcessManager = new ExtensionHostProcessManager(contextService, messageService, windowService, lifecycleService, environmentService); + this.extensionHostProcessManager = instantiationService.createInstance(ExtensionHostProcessManager); let logCommunication = logExtensionHostCommunication || environmentService.logExtensionHostCommunication; @@ -104,11 +106,12 @@ class ExtensionHostProcessManager { private isExtensionDevelopmentDebugging: boolean; constructor( - private contextService: IWorkspaceContextService, - private messageService: IMessageService, - private windowService: IWindowService, - lifecycleService: ILifecycleService, - private environmentService: IEnvironmentService + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IMessageService private messageService: IMessageService, + @IWindowService private windowService: IWindowService, + @ILifecycleService lifecycleService: ILifecycleService, + @IInstantiationService private instantiationService: IInstantiationService, + @IEnvironmentService private environmentService: IEnvironmentService ) { // handle extension host lifecycle a bit special when we know we are developing an extension that runs inside @@ -266,7 +269,7 @@ class ExtensionHostProcessManager { if (!this.isExtensionDevelopmentHost) { this.messageService.show(Severity.Error, { message: nls.localize('extensionHostProcess.crash', "Extension host terminated unexpectedly. Please reload the window to recover."), - actions: [new Action('reloadWindow', nls.localize('reloadWindow', "Reload Window"), null, true, () => { this.windowService.getWindow().reload(); return TPromise.as(null); })] + actions: [this.instantiationService.createInstance(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL)] }); console.error('Extension host terminated unexpectedly. Code: ', code, ' Signal: ', signal); } From 89d4ccb7972141ed8c24b3cc7f6d7bc7828e6547 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Oct 2016 11:28:23 +0200 Subject: [PATCH 350/433] allow to ignore .NET 4.5 warning per workspace (for #12504) --- .../nps/electron-browser/nps.contribution.ts | 2 +- .../electron-browser/update.contribution.ts | 8 +++---- .../files/electron-browser/fileService.ts | 23 +++++++++++++------ 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts b/src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts index a095697fa9b..54b539a594f 100644 --- a/src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts +++ b/src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts @@ -79,7 +79,7 @@ class NPSContribution implements IWorkbenchContribution { return TPromise.as(null); }); - const neverAgainAction = new Action('nps.never', nls.localize('neverAgain', "Never Show Again"), '', true, () => { + const neverAgainAction = new Action('nps.never', nls.localize('neverAgain', "Don't Show Again"), '', true, () => { storageService.store(IS_CANDIDATE_KEY, false, StorageScope.GLOBAL); storageService.store(SKIP_VERSION_KEY, pkg.version, StorageScope.GLOBAL); return TPromise.as(null); diff --git a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts index b0725c3de72..f90d6baf448 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts @@ -13,7 +13,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { IMessageService } from 'vs/platform/message/common/message'; +import { IMessageService, CloseAction } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; import { ShowReleaseNotesAction, ShowCurrentReleaseNotesAction } from 'vs/workbench/electron-browser/update'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -28,8 +28,6 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; -const CloseAction = new Action('close', nls.localize('close', "Close"), '', true, () => null); - const LinkAction = (id: string, message: string, licenseUrl: string) => new Action( id, message, null, true, () => { shell.openExternal(licenseUrl); return TPromise.as(null); } @@ -89,11 +87,11 @@ export class UpdateContribution implements IWorkbenchContribution { storageService.store(UpdateContribution.INSIDER_KEY, false, StorageScope.GLOBAL); return TPromise.as(null); }), - new Action('update.neverAgain', nls.localize('neverShowAgain', "Never Show Again"), '', true, () => { + new Action('update.neverAgain', nls.localize('neverShowAgain', "Don't Show Again"), '', true, () => { storageService.store(UpdateContribution.INSIDER_KEY, false, StorageScope.GLOBAL); return TPromise.as(null); }), - CloseAction, + CloseAction ] }); }, 0); diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index 93ea89fd44e..bc27105db27 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -21,20 +21,22 @@ import {IEventService} from 'vs/platform/event/common/event'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {Action} from 'vs/base/common/actions'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; -import {IMessageService, IMessageWithAction, Severity} from 'vs/platform/message/common/message'; +import {IMessageService, IMessageWithAction, Severity, CloseAction} from 'vs/platform/message/common/message'; import {IEnvironmentService} from 'vs/platform/environment/common/environment'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; import {ILifecycleService} from 'vs/platform/lifecycle/common/lifecycle'; +import {IStorageService, StorageScope} from 'vs/platform/storage/common/storage'; import {shell} from 'electron'; -// If we run with .NET framework < 4.5, we need to detect this error to inform the user -const NET_VERSION_ERROR = 'System.MissingMethodException'; - export class FileService implements IFileService { public _serviceBrand: any; + // If we run with .NET framework < 4.5, we need to detect this error to inform the user + private static NET_VERSION_ERROR = 'System.MissingMethodException'; + private static NET_VERSION_ERROR_IGNORE_KEY = 'ignoreNetVersionError'; + private raw: IFileService; private toUnbind: IDisposable[]; @@ -48,7 +50,8 @@ export class FileService implements IFileService { @IEnvironmentService environmentService: IEnvironmentService, @IEditorGroupService private editorGroupService: IEditorGroupService, @ILifecycleService private lifecycleService: ILifecycleService, - @IMessageService private messageService: IMessageService + @IMessageService private messageService: IMessageService, + @IStorageService private storageService: IStorageService ) { this.toUnbind = []; this.activeOutOfWorkspaceWatchers = Object.create(null); @@ -88,7 +91,7 @@ export class FileService implements IFileService { errors.onUnexpectedError(msg); // Detect if we run < .NET Framework 4.5 - if (msg && msg.indexOf(NET_VERSION_ERROR) >= 0) { + if (msg && msg.indexOf(FileService.NET_VERSION_ERROR) >= 0 && !this.storageService.getBoolean(FileService.NET_VERSION_ERROR_IGNORE_KEY, StorageScope.WORKSPACE)) { this.messageService.show(Severity.Warning, { message: nls.localize('netVersionError', "The Microsoft .NET Framework 4.5 is required. Please follow the link to install it."), actions: [ @@ -96,7 +99,13 @@ export class FileService implements IFileService { shell.openExternal('https://go.microsoft.com/fwlink/?LinkId=786533'); return TPromise.as(true); - }) + }), + new Action('net.error.ignore', nls.localize('neverShowAgain', "Don't Show Again"), '', true, () => { + this.storageService.store(FileService.NET_VERSION_ERROR_IGNORE_KEY, true, StorageScope.WORKSPACE); + + return TPromise.as(null); + }), + CloseAction ] }); } From 62937fd2e6709e6256bba805eb085ea3647ad66f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Oct 2016 11:30:43 +0200 Subject: [PATCH 351/433] fix compile error --- src/vs/test/utils/servicesTestUtils.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/test/utils/servicesTestUtils.ts b/src/vs/test/utils/servicesTestUtils.ts index 9c4b88924c8..483beed9908 100644 --- a/src/vs/test/utils/servicesTestUtils.ts +++ b/src/vs/test/utils/servicesTestUtils.ts @@ -253,6 +253,10 @@ export class TestPartService implements IPartService { public addClass(clazz: string): void { } public removeClass(clazz: string): void { } public getWorkbenchElementId(): string { return ''; } + + public setRestoreSidebar(): void { + + } } export class TestEventService extends EventEmitter implements IEventService { @@ -608,7 +612,7 @@ export class TestLifecycleService implements ILifecycleService { public _serviceBrand: any; public willShutdown: boolean; - + private _onWillShutdown = new Emitter(); private _onShutdown = new Emitter(); From 7ca6f5edfe77b481ddcd9532b4cc15d5fb3776bd Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 3 Oct 2016 11:34:34 +0200 Subject: [PATCH 352/433] Extensions: clean up outdated prop --- .../extensions/electron-browser/extensions.ts | 13 +------- .../electron-browser/extensionsActions.ts | 30 ++++++------------- .../electron-browser/extensionsViewlet.ts | 19 ++++++------ .../extensionsWorkbenchService.ts | 24 ++------------- 4 files changed, 21 insertions(+), 65 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts index 120018a0a94..b81ea2e821f 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts @@ -39,7 +39,7 @@ export interface IExtension { installCount: number; rating: number; ratingCount: number; - isOutdated(): TPromise; + outdated: boolean; telemetryData: any; getManifest(): TPromise; getReadme(): TPromise; @@ -68,15 +68,4 @@ export const ConfigurationKey = 'extensions'; export interface IExtensionsConfiguration { autoUpdate: boolean; recommendations: string[]; -} - -export function filterOutdatedExtensions(extensions: IExtension[]): TPromise { - const promises: TPromise[] = []; - for (const extension of extensions) { - if (extension.type === LocalExtensionType.User) { - promises.push(extension.isOutdated() - .then(outdated => outdated ? extension : null)); - } - } - return TPromise.join(promises).then(outDated => outDated.filter(e => !!e)); } \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index 5a4d05edfae..60cd8136d96 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -12,7 +12,7 @@ import paths = require('vs/base/common/paths'); import Event from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; -import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, ConfigurationKey, filterOutdatedExtensions } from './extensions'; +import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, ConfigurationKey } from './extensions'; import { LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IMessageService, LaterAction } from 'vs/platform/message/common/message'; @@ -234,18 +234,7 @@ export class UpdateAction extends Action { const isInstalled = this.extension.state === ExtensionState.Installed || this.extension.state === ExtensionState.NeedsRestart; - if (canInstall && isInstalled) { - this.extension.isOutdated().then(outDated => { - this.enabled = outDated; - this.updateClass(); - }); - } else { - this.enabled = false; - this.updateClass(); - } - } - - private updateClass(): void { + this.enabled = canInstall && isInstalled && this.extension.outdated; this.class = this.enabled ? UpdateAction.EnabledClass : UpdateAction.DisabledClass; } @@ -323,22 +312,21 @@ export class UpdateAllAction extends Action { this.update(); } - private getOutdatedExtensions(): TPromise { - let extensions = this.extensionsWorkbenchService.local.filter( + private get outdated(): IExtension[] { + return this.extensionsWorkbenchService.local.filter( e => this.extensionsWorkbenchService.canInstall(e) - && e.type === LocalExtensionType.User - && (e.state === ExtensionState.Installed || e.state === ExtensionState.NeedsRestart) + && e.type === LocalExtensionType.User + && (e.state === ExtensionState.Installed || e.state === ExtensionState.NeedsRestart) + && e.outdated ); - - return filterOutdatedExtensions(extensions); } private update(): void { - this.getOutdatedExtensions().done(outDated => this.enabled = outDated.length > 0); + this.enabled = this.outdated.length > 0; } run(promptToInstallDependencies: boolean = true,): TPromise { - return this.getOutdatedExtensions().then(outdated => TPromise.join(outdated.map(e => this.extensionsWorkbenchService.install(e, promptToInstallDependencies)))); + return TPromise.join(this.outdated.map(e => this.extensionsWorkbenchService.install(e, promptToInstallDependencies))); } dispose(): void { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 561cab25b82..9f6885a86a9 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -29,7 +29,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { PagedList } from 'vs/base/browser/ui/list/listPaging'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Delegate, Renderer } from './extensionsList'; -import { IExtensionsWorkbenchService, IExtension, IExtensionsViewlet, VIEWLET_ID, ExtensionState, filterOutdatedExtensions } from './extensions'; +import { IExtensionsWorkbenchService, IExtension, IExtensionsViewlet, VIEWLET_ID, ExtensionState } from './extensions'; import { ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, InstallVSIXAction, ConfigureWorkspaceRecommendedExtensionsAction } from './extensionsActions'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, SortBy, SortOrder, IQueryOptions, LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionsInput } from './extensionsInput'; @@ -213,7 +213,7 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { if (/@outdated/i.test(value)) { return this.extensionsWorkbenchService.queryLocal() - .then(extensions => filterOutdatedExtensions(extensions)) + .then(extensions => extensions.filter(extension => extension.outdated)) .then(result => new PagedModel(result)); } @@ -380,14 +380,13 @@ export class StatusUpdater implements IWorkbenchContribution { return; } - filterOutdatedExtensions(this.extensionsWorkbenchService.local).then(outdated => { - if (outdated.length > 0) { - const badge = new NumberBadge(outdated.length, n => localize('outdatedExtensions', '{0} Outdated Extensions', n)); - this.activityService.showActivity(VIEWLET_ID, badge, 'extensions-badge count-badge'); - } else { - this.activityService.showActivity(VIEWLET_ID, null, 'extensions-badge'); - } - }); + const outdated = this.extensionsWorkbenchService.local.reduce((r, e) => r + (e.outdated ? 1 : 0), 0); + if (outdated > 0) { + const badge = new NumberBadge(outdated, n => localize('outdatedExtensions', '{0} Outdated Extensions', n)); + this.activityService.showActivity(VIEWLET_ID, badge, 'extensions-badge count-badge'); + } else { + this.activityService.showActivity(VIEWLET_ID, null, 'extensions-badge'); + } } dispose(): void { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index 97feb656962..eefc3a990d1 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -11,7 +11,6 @@ import Event, { Emitter, chain } from 'vs/base/common/event'; import { index } from 'vs/base/common/arrays'; import { assign } from 'vs/base/common/objects'; import { isUUID } from 'vs/base/common/uuid'; -import { memoize } from 'vs/base/common/decorators'; import { ThrottledDelayer } from 'vs/base/common/async'; import { isPromiseCanceledError } from 'vs/base/common/errors'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -157,27 +156,8 @@ class Extension implements IExtension { return this.gallery ? this.gallery.ratingCount : null; } - // TODO: Clean it up. Make it sync - isOutdated(): TPromise { - if (this.type === LocalExtensionType.User) { - if (this.gallery && this.gallery.properties.engine) { - return this._loadCompatibleGalleryVersion().then(() => this.checkVersion(), () => this.checkVersion()); - } - return TPromise.wrap(this.checkVersion()); - } - return TPromise.wrap(false); - } - - @memoize - private _loadCompatibleGalleryVersion(): TPromise { - return this.galleryService.loadCompatibleVersion(this.gallery).then((compatible) => { - this.gallery = compatible; - return null; - }, error => this.checkVersion()); - } - - private checkVersion(): boolean { - return semver.gt(this.latestVersion, this.version); + get outdated(): boolean { + return this.type === LocalExtensionType.User && semver.gt(this.latestVersion, this.version); } get telemetryData(): any { From 3e9dc7849837c5190412685307d55307aeedbef7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Oct 2016 12:06:16 +0200 Subject: [PATCH 353/433] check for model lang id for icons too (part of #11806) --- src/vs/workbench/browser/labels.ts | 33 +++++++++++++------ .../browser/parts/editor/editorPicker.ts | 4 ++- .../browser/parts/editor/editorStatus.ts | 2 +- .../parts/quickopen/quickOpenController.ts | 9 +++-- .../parts/search/browser/openFileHandler.ts | 4 ++- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index fedacda0e3a..48ba4bfdb8c 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -13,9 +13,11 @@ import {IModeService} from 'vs/editor/common/services/modeService'; import {IEditorInput} from 'vs/platform/editor/common/editor'; import {getResource} from 'vs/workbench/common/editor'; import {getPathLabel} from 'vs/base/common/labels'; +import {PLAINTEXT_MODE_ID} from 'vs/editor/common/modes/modesRegistry'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; +import {IModelService} from 'vs/editor/common/services/modelService'; export interface IEditorLabel { name: string; @@ -38,7 +40,8 @@ export class ResourceLabel extends IconLabel { @IExtensionService private extensionService: IExtensionService, @IWorkspaceContextService protected contextService: IWorkspaceContextService, @IConfigurationService private configurationService: IConfigurationService, - @IModeService private modeService: IModeService + @IModeService private modeService: IModeService, + @IModelService private modelService: IModelService ) { super(container, options); @@ -80,7 +83,7 @@ export class ResourceLabel extends IconLabel { title = getPathLabel(resource.fsPath); } - const extraClasses = getIconClasses(this.modeService, resource, this.options && this.options.isFolder); + const extraClasses = getIconClasses(this.modelService, this.modeService, resource, this.options && this.options.isFolder); if (this.options && this.options.extraClasses) { extraClasses.push(...this.options.extraClasses); } @@ -127,12 +130,18 @@ export class FileLabel extends ResourceLabel { } } -export function getIconClasses(modeService: IModeService, arg1?: uri | string, isFolder?: boolean): string[] { +export function getIconClasses(modelService: IModelService, modeService: IModeService, resource: uri, isFolder?: boolean): string[] { let path: string; - if (typeof arg1 === 'string') { - path = arg1; - } else if (arg1) { - path = arg1.fsPath; + let configuredLangId: string; + if (resource) { + path = resource.fsPath; + const model = modelService.getModel(resource); + if (model) { + const modeId = model.getModeId(); + if (modeId && modeId !== PLAINTEXT_MODE_ID) { + configuredLangId = modeId; // only take if the mode is specific (aka no just plain text) + } + } } // we always set these base classes even if we do not have a path @@ -151,11 +160,14 @@ export function getIconClasses(modeService: IModeService, arg1?: uri | string, i // Files else { + + // Name const name = dotSegments[0]; // file.txt => "file", .dockerfile => "", file.some.txt => "file" if (name) { classes.push(`${cssEscape(name.toLowerCase())}-name-file-icon`); } + // Extension(s) const extensions = dotSegments.splice(1); if (extensions.length > 0) { for (let i = 0; i < extensions.length; i++) { @@ -163,9 +175,10 @@ export function getIconClasses(modeService: IModeService, arg1?: uri | string, i } } - const langId = modeService.getModeIdByFilenameOrFirstLine(path); - if (langId) { - classes.push(`${cssEscape(langId)}-lang-file-icon`); + // Configured Language + configuredLangId = configuredLangId || modeService.getModeIdByFilenameOrFirstLine(path); + if (configuredLangId) { + classes.push(`${cssEscape(configuredLangId)}-lang-file-icon`); } } } diff --git a/src/vs/workbench/browser/parts/editor/editorPicker.ts b/src/vs/workbench/browser/parts/editor/editorPicker.ts index 49805501e42..2f65018a3db 100644 --- a/src/vs/workbench/browser/parts/editor/editorPicker.ts +++ b/src/vs/workbench/browser/parts/editor/editorPicker.ts @@ -17,6 +17,7 @@ import {QuickOpenModel, QuickOpenEntry, QuickOpenEntryGroup} from 'vs/base/parts import scorer = require('vs/base/common/scorer'); import {IModeService} from 'vs/editor/common/services/modeService'; import {getIconClasses} from 'vs/workbench/browser/labels'; +import {IModelService} from 'vs/editor/common/services/modelService'; import {QuickOpenHandler} from 'vs/workbench/browser/quickopen'; import {Position} from 'vs/platform/editor/common/editor'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; @@ -33,6 +34,7 @@ export class EditorPickerEntry extends QuickOpenEntryGroup { private _group: IEditorGroup, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IModeService private modeService: IModeService, + @IModelService private modelService: IModelService, @IEditorGroupService editorGroupService: IEditorGroupService ) { super(); @@ -42,7 +44,7 @@ export class EditorPickerEntry extends QuickOpenEntryGroup { public getLabelOptions(): IIconLabelOptions { return { - extraClasses: getIconClasses(this.modeService, this.getResource()), + extraClasses: getIconClasses(this.modelService, this.modeService, this.getResource()), italic: this._group.isPreview(this.editor) }; } diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index ba2007c5ab5..0d10b3301ef 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -774,7 +774,7 @@ export class ChangeModeAction extends Action { } // Change mode - models.forEach((textModel) => { + models.forEach(textModel => { this.modelService.setMode(textModel, mode); }); } diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 9f018902c22..f1f8214d45b 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -27,6 +27,7 @@ import paths = require('vs/base/common/paths'); import {Registry} from 'vs/platform/platform'; import {IModeService} from 'vs/editor/common/services/modeService'; import {getIconClasses} from 'vs/workbench/browser/labels'; +import {IModelService} from 'vs/editor/common/services/modelService'; import {EditorInput, getUntitledOrFileResource, IWorkbenchEditorConfiguration} from 'vs/workbench/common/editor'; import {WorkbenchComponent} from 'vs/workbench/common/component'; import Event, {Emitter} from 'vs/base/common/event'; @@ -948,7 +949,8 @@ class PickOpenEntry extends PlaceholderQuickOpenEntry { constructor( item: IPickOpenEntry, private onPreview: () => void, - @IModeService private modeService: IModeService + @IModeService private modeService: IModeService, + @IModelService private modelService: IModelService ) { super(item.label); @@ -965,7 +967,7 @@ class PickOpenEntry extends PlaceholderQuickOpenEntry { public getLabelOptions(): IIconLabelOptions { return { - extraClasses: this.resource ? getIconClasses(this.modeService, this.resource, this.isFolder) : [] + extraClasses: this.resource ? getIconClasses(this.modelService, this.modeService, this.resource, this.isFolder) : [] }; } @@ -1020,6 +1022,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry { input: EditorInput, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IModeService private modeService: IModeService, + @IModelService private modelService: IModelService, @IConfigurationService private configurationService: IConfigurationService ) { super(editorService); @@ -1038,7 +1041,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry { public getLabelOptions(): IIconLabelOptions { return { - extraClasses: getIconClasses(this.modeService, this.resource) + extraClasses: getIconClasses(this.modelService, this.modeService, this.resource) }; } diff --git a/src/vs/workbench/parts/search/browser/openFileHandler.ts b/src/vs/workbench/parts/search/browser/openFileHandler.ts index 924def25c60..0eb81d36292 100644 --- a/src/vs/workbench/parts/search/browser/openFileHandler.ts +++ b/src/vs/workbench/parts/search/browser/openFileHandler.ts @@ -16,6 +16,7 @@ import {IIconLabelOptions} from 'vs/base/browser/ui/iconLabel/iconLabel'; import {IRange} from 'vs/editor/common/editorCommon'; import {IModeService} from 'vs/editor/common/services/modeService'; import {getIconClasses} from 'vs/workbench/browser/labels'; +import {IModelService} from 'vs/editor/common/services/modelService'; import {IThemeService} from 'vs/workbench/services/themes/common/themeService'; import {IAutoFocus} from 'vs/base/parts/quickopen/common/quickOpen'; import {QuickOpenEntry, QuickOpenModel} from 'vs/base/parts/quickopen/browser/quickOpenModel'; @@ -47,6 +48,7 @@ export class FileEntry extends EditorQuickOpenEntry { private icon: string, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IModeService private modeService: IModeService, + @IModelService private modelService: IModelService, @IConfigurationService private configurationService: IConfigurationService, @IWorkspaceContextService contextService: IWorkspaceContextService ) { @@ -59,7 +61,7 @@ export class FileEntry extends EditorQuickOpenEntry { public getLabelOptions(): IIconLabelOptions { return { - extraClasses: getIconClasses(this.modeService, this.resource) + extraClasses: getIconClasses(this.modelService, this.modeService, this.resource) }; } From 1bf8881549456b8bbb08b9be90efe6cdd5a4cf39 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 3 Oct 2016 12:17:01 +0200 Subject: [PATCH 354/433] fixes #12982 --- src/vs/workbench/electron-browser/update.ts | 99 +++++++++++++++++-- .../electron-browser/update.contribution.ts | 27 ++--- 2 files changed, 108 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/electron-browser/update.ts b/src/vs/workbench/electron-browser/update.ts index 23c323ef0a7..008c4a209c0 100644 --- a/src/vs/workbench/electron-browser/update.ts +++ b/src/vs/workbench/electron-browser/update.ts @@ -13,9 +13,16 @@ import {ipcRenderer as ipc, shell} from 'electron'; import {IMessageService} from 'vs/platform/message/common/message'; import pkg from 'vs/platform/package'; import product from 'vs/platform/product'; +import URI from 'vs/base/common/uri'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ReleaseNotesInput } from 'vs/workbench/parts/update/electron-browser/releaseNotesInput'; +import { IRequestService } from 'vs/platform/request/common/request'; +import { asText } from 'vs/base/node/request'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { Keybinding } from 'vs/base/common/keybinding'; +import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; interface IUpdate { releaseNotes: string; @@ -39,6 +46,70 @@ const NotNowAction = new Action( () => TPromise.as(true) ); +export function loadReleaseNotes(accessor: ServicesAccessor, version: string): TPromise { + const requestService = accessor.get(IRequestService); + const keybindingService = accessor.get(IKeybindingService); + const match = /^(\d+\.\d)\./.exec(version); + + if (!match) { + return TPromise.as(null); + } + + const versionLabel = match[1].replace(/\./g, '_'); + const baseUrl = 'https://code.visualstudio.com/raw'; + const url = `${ baseUrl }/v${ versionLabel }.md`; + + const patchKeybindings = (text: string): string => { + const kb = (match: string, kb: string) => { + const keybinding = keybindingService.lookupKeybindings(kb)[0]; + + if (!keybinding) { + return match; + } + + return keybindingService.getLabelFor(keybinding); + }; + + const kbstyle = (match: string, kb: string) => { + const code = Keybinding.fromUserSettingsLabel(kb); + + if (!code) { + return match; + } + + const keybinding = new Keybinding(code); + + if (!keybinding) { + return match; + } + + return keybindingService.getLabelFor(keybinding); + }; + + return text + .replace(/kb\(([a-z.\d\-]+)\)/gi, kb) + .replace(/kbstyle\(([^\)]+)\)/gi, kbstyle); + }; + + return requestService.request({ url }) + .then(asText) + .then(text => patchKeybindings(text)); +} + +export class OpenLatestReleaseNotesInBrowserAction extends Action { + + constructor( + @IOpenerService private openerService: IOpenerService + ) { + super('update.openLatestReleaseNotes', nls.localize('releaseNotes', "Release Notes"), null, true); + } + + run(): TPromise { + const uri = URI.parse(product.releaseNotesUrl); + return this.openerService.open(uri); + } +} + export abstract class AbstractShowReleaseNotesAction extends Action { constructor( @@ -47,14 +118,26 @@ export abstract class AbstractShowReleaseNotesAction extends Action { private returnValue: boolean, private version: string, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IInstantiationService private instantiationService: IInstantiationService + @IInstantiationService private instantiationService: IInstantiationService, + @IOpenerService private openerService: IOpenerService ) { super(id, label, null, true); } run(): TPromise { - return this.editorService.openEditor(this.instantiationService.createInstance(ReleaseNotesInput, this.version)) - .then(() => this.returnValue); + if (!this.enabled) { + return TPromise.as(false); + } + + this.enabled = false; + + return this.instantiationService.invokeFunction(loadReleaseNotes, this.version) + .then(text => this.editorService.openEditor(this.instantiationService.createInstance(ReleaseNotesInput, this.version, text))) + .then(() => true) + .then(null, () => { + const action = this.instantiationService.createInstance(OpenLatestReleaseNotesInBrowserAction); + return action.run().then(() => false); + }); } } @@ -64,9 +147,10 @@ export class ShowReleaseNotesAction extends AbstractShowReleaseNotesAction { returnValue: boolean, version: string, @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IInstantiationService instantiationService: IInstantiationService + @IInstantiationService instantiationService: IInstantiationService, + @IOpenerService openerService: IOpenerService ) { - super('update.showReleaseNotes', nls.localize('releaseNotes', "Release Notes"), returnValue, version, editorService, instantiationService); + super('update.showReleaseNotes', nls.localize('releaseNotes', "Release Notes"), returnValue, version, editorService, instantiationService, openerService); } } @@ -79,9 +163,10 @@ export class ShowCurrentReleaseNotesAction extends AbstractShowReleaseNotesActio id = ShowCurrentReleaseNotesAction.ID, label = ShowCurrentReleaseNotesAction.LABEL, @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IInstantiationService instantiationService: IInstantiationService + @IInstantiationService instantiationService: IInstantiationService, + @IOpenerService openerService: IOpenerService ) { - super(id, label, true, pkg.version, editorService, instantiationService); + super(id, label, true, pkg.version, editorService, instantiationService, openerService); } } diff --git a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts index f90d6baf448..9158c619b85 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts @@ -15,7 +15,8 @@ import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } f import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IMessageService, CloseAction } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; -import { ShowReleaseNotesAction, ShowCurrentReleaseNotesAction } from 'vs/workbench/electron-browser/update'; +import { loadReleaseNotes, OpenLatestReleaseNotesInBrowserAction, ShowCurrentReleaseNotesAction } from 'vs/workbench/electron-browser/update'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Action } from 'vs/base/common/actions'; import { shell } from 'electron'; @@ -42,22 +43,26 @@ export class UpdateContribution implements IWorkbenchContribution { constructor( @IStorageService storageService: IStorageService, @IInstantiationService private instantiationService: IInstantiationService, - @IMessageService messageService: IMessageService + @IMessageService messageService: IMessageService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService ) { const lastVersion = storageService.get(UpdateContribution.KEY, StorageScope.GLOBAL, ''); // was there an update? if (product.releaseNotesUrl && lastVersion && pkg.version !== lastVersion) { setTimeout(() => { - const releaseNotesAction = this.instantiationService.createInstance(ShowReleaseNotesAction, true, pkg.version); - - messageService.show(Severity.Info, { - message: nls.localize('read the release notes', "Welcome to {0} v{1}! Would you like to read the Release Notes?", product.nameLong, pkg.version), - actions: [ - releaseNotesAction, - CloseAction - ] - }); + this.instantiationService.invokeFunction(loadReleaseNotes, pkg.version) + .then( + text => this.editorService.openEditor(this.instantiationService.createInstance(ReleaseNotesInput, pkg.version, text)), + () => { + messageService.show(Severity.Info, { + message: nls.localize('read the release notes', "Welcome to {0} v{1}! Would you like to read the Release Notes?", product.nameLong, pkg.version), + actions: [ + this.instantiationService.createInstance(OpenLatestReleaseNotesInBrowserAction), + CloseAction + ] + }); + }); }, 0); } From a07e7a54a63c816227866f60989fb792cc1fb326 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Oct 2016 12:28:55 +0200 Subject: [PATCH 355/433] icons: show them in language picker too --- .../editor/common/services/languagesRegistry.ts | 12 ++++++++++++ src/vs/editor/common/services/modeService.ts | 1 + .../editor/common/services/modeServiceImpl.ts | 4 ++++ .../editor/test/common/mocks/mockModeService.ts | 3 +++ .../browser/parts/editor/editorStatus.ts | 17 +++++++++++++++-- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/services/languagesRegistry.ts b/src/vs/editor/common/services/languagesRegistry.ts index 99e6669ca58..d75938dc3a6 100644 --- a/src/vs/editor/common/services/languagesRegistry.ts +++ b/src/vs/editor/common/services/languagesRegistry.ts @@ -26,6 +26,7 @@ export class LanguagesRegistry { private name2LanguageId: { [name: string]: string; }; private id2Name: { [id: string]: string; }; private id2Extensions: { [id: string]: string[]; }; + private id2Filenames: { [id: string]: string[]; }; private compatModes: { [id: string]: ICompatModeDescriptor; }; private lowerName2Id: { [name: string]: string; }; private id2ConfigurationFiles: { [id:string]: string[]; }; @@ -39,6 +40,7 @@ export class LanguagesRegistry { this.name2LanguageId = {}; this.id2Name = {}; this.id2Extensions = {}; + this.id2Filenames = {}; this.compatModes = {}; this.lowerName2Id = {}; this.id2ConfigurationFiles = {}; @@ -127,8 +129,10 @@ export class LanguagesRegistry { } if (Array.isArray(lang.filenames)) { + this.id2Filenames[lang.id] = this.id2Filenames[lang.id] || []; for (let filename of lang.filenames) { mime.registerTextMime({ mime: primaryMime, filename: filename }); + this.id2Filenames[lang.id].push(filename); } } @@ -270,4 +274,12 @@ export class LanguagesRegistry { } return this.id2Extensions[languageId]; } + + public getFilenames(languageName: string): string[] { + let languageId = this.name2LanguageId[languageName]; + if (!languageId) { + return []; + } + return this.id2Filenames[languageId]; + } } diff --git a/src/vs/editor/common/services/modeService.ts b/src/vs/editor/common/services/modeService.ts index c9b0cbdb7a3..e9c8d9bddd2 100644 --- a/src/vs/editor/common/services/modeService.ts +++ b/src/vs/editor/common/services/modeService.ts @@ -50,6 +50,7 @@ export interface IModeService { getRegisteredModes(): string[]; getRegisteredLanguageNames(): string[]; getExtensions(alias: string): string[]; + getFilenames(alias: string): string[]; getMimeForMode(modeId: string): string; getLanguageName(modeId:string): string; getModeIdForLanguageName(alias: string): string; diff --git a/src/vs/editor/common/services/modeServiceImpl.ts b/src/vs/editor/common/services/modeServiceImpl.ts index 771b428b676..8818607fe08 100644 --- a/src/vs/editor/common/services/modeServiceImpl.ts +++ b/src/vs/editor/common/services/modeServiceImpl.ts @@ -183,6 +183,10 @@ export class ModeServiceImpl implements IModeService { return this._registry.getExtensions(alias); } + public getFilenames(alias: string): string[] { + return this._registry.getFilenames(alias); + } + public getMimeForMode(modeId: string): string { return this._registry.getMimeForMode(modeId); } diff --git a/src/vs/editor/test/common/mocks/mockModeService.ts b/src/vs/editor/test/common/mocks/mockModeService.ts index cf621b3472e..cd95c88a665 100644 --- a/src/vs/editor/test/common/mocks/mockModeService.ts +++ b/src/vs/editor/test/common/mocks/mockModeService.ts @@ -32,6 +32,9 @@ export class MockModeService implements IModeService { getExtensions(alias: string): string[] { throw new Error('Not implemented'); } + getFilenames(alias: string): string[] { + throw new Error('Not implemented'); + } getMimeForMode(modeId: string): string { throw new Error('Not implemented'); } diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 0d10b3301ef..bf4c3ed2389 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -34,7 +34,7 @@ import {BaseBinaryResourceEditor} from 'vs/workbench/browser/parts/editor/binary import {BinaryResourceDiffEditor} from 'vs/workbench/browser/parts/editor/binaryDiffEditor'; import {IEditor as IBaseEditor} from 'vs/platform/editor/common/editor'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; -import {IQuickOpenService, IPickOpenEntry} from 'vs/workbench/services/quickopen/common/quickOpenService'; +import {IQuickOpenService, IPickOpenEntry, IFilePickOpenEntry} from 'vs/workbench/services/quickopen/common/quickOpenService'; import {IWorkspaceConfigurationService} from 'vs/workbench/services/configuration/common/configuration'; import {IFilesConfiguration, SUPPORTED_ENCODINGS} from 'vs/platform/files/common/files'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; @@ -716,8 +716,21 @@ export class ChangeModeAction extends Action { description = nls.localize('languageDescriptionConfigured', "({0})", this.modeService.getModeIdForLanguageName(lang.toLowerCase())); } - return { + // construct a fake resource to be able to show nice icons if any + let fakeResource: uri; + const extensions = this.modeService.getExtensions(lang); + if (extensions && extensions.length) { + fakeResource = uri.file(extensions[0]); + } else { + const filenames = this.modeService.getFilenames(lang); + if (filenames && filenames.length) { + fakeResource = uri.file(filenames[0]); + } + } + + return { label: lang, + resource: fakeResource, description }; }); From 62fcfa262ef8000cfeb968575031fe087835a6f4 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 3 Oct 2016 12:35:20 +0200 Subject: [PATCH 356/433] query down on workspace recommendations --- .../electron-browser/extensionsViewlet.ts | 57 ++++++++++--------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 9f6885a86a9..97390b5fd35 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -231,28 +231,9 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { } if (/@recommended:workspace/i.test(query.value)) { - return this.queryWorkspaceRecommendedExtensions(); - } - - if (/@recommended/i.test(query.value)) { - const value = query.value.replace(/@recommended/g, '').trim().toLowerCase(); - - return this.extensionsWorkbenchService.queryLocal() - .then(result => result.filter(e => e.type === LocalExtensionType.User)) - .then(local => { - const names = this.tipsService.getRecommendations() - .filter(name => local.every(ext => `${ ext.publisher }.${ ext.name }` !== name)) - .filter(name => name.toLowerCase().indexOf(value) > -1); - - this.telemetryService.publicLog('extensionRecommendations:open', { count: names.length }); - - if (!names.length) { - return new PagedModel([]); - } - - return this.extensionsWorkbenchService.queryGallery(assign(options, { names, pageSize: names.length })) - .then(result => new PagedModel(result)); - }); + return this.getWorkspaceRecommendationsModel(query, options); + } else if (/@recommended/i.test(query.value)) { + return this.getRecommendationsModel(query, options); } if (query.value) { @@ -263,16 +244,40 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { .then(result => new PagedModel(result)); } - private queryWorkspaceRecommendedExtensions(): TPromise> { - let names = this.tipsService.getWorkspaceRecommendations(); + private getRecommendationsModel(query: Query, options: IQueryOptions): TPromise> { + const value = query.value.replace(/@recommended/g, '').trim().toLowerCase(); + + return this.extensionsWorkbenchService.queryLocal() + .then(result => result.filter(e => e.type === LocalExtensionType.User)) + .then(local => { + const names = this.tipsService.getRecommendations() + .filter(name => local.every(ext => `${ ext.publisher }.${ ext.name }` !== name)) + .filter(name => name.toLowerCase().indexOf(value) > -1); + + this.telemetryService.publicLog('extensionRecommendations:open', { count: names.length }); + + if (!names.length) { + return new PagedModel([]); + } + + return this.extensionsWorkbenchService.queryGallery(assign(options, { names, pageSize: names.length })) + .then(result => new PagedModel(result)); + }); + } + + private getWorkspaceRecommendationsModel(query: Query, options: IQueryOptions): TPromise> { + const value = query.value.replace(/@recommended:workspace/g, '').trim().toLowerCase(); + const names = this.tipsService.getWorkspaceRecommendations() + .filter(name => name.toLowerCase().indexOf(value) > -1); this.telemetryService.publicLog('extensionWorkspaceRecommendations:open', { count: names.length }); if (!names.length) { return TPromise.as(new PagedModel([])); } - return this.extensionsWorkbenchService.queryGallery({ names }) - .then(result => new PagedModel(result)); + + return this.extensionsWorkbenchService.queryGallery(assign(options, { names, pageSize: names.length })) + .then(result => new PagedModel(result)); } private openExtension(extension: IExtension): void { From a83818b715ab5f13454ed107fb063f5d385acc8c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 3 Oct 2016 12:52:45 +0200 Subject: [PATCH 357/433] fixes #12927 --- src/vs/base/browser/ui/list/listPaging.ts | 10 +++--- .../electron-browser/extensionsViewlet.ts | 32 ++++++++++++++----- .../media/extensionsViewlet.css | 5 +++ 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/vs/base/browser/ui/list/listPaging.ts b/src/vs/base/browser/ui/list/listPaging.ts index 9c93f18e307..54a9e2eed52 100644 --- a/src/vs/base/browser/ui/list/listPaging.ts +++ b/src/vs/base/browser/ui/list/listPaging.ts @@ -8,7 +8,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { range } from 'vs/base/common/arrays'; import { IDelegate, IRenderer, IFocusChangeEvent, ISelectionChangeEvent } from './list'; import { List } from './listWidget'; -import { PagedModel } from 'vs/base/common/paging'; +import { IPagedModel } from 'vs/base/common/paging'; import Event, { mapEvent } from 'vs/base/common/event'; export interface IPagedRenderer extends IRenderer { @@ -26,7 +26,7 @@ class PagedRenderer implements IRenderer, - private modelProvider: () => PagedModel + private modelProvider: () => IPagedModel ) {} renderTemplate(container: HTMLElement): ITemplateData { @@ -61,7 +61,7 @@ class PagedRenderer implements IRenderer { private list: List; - private _model: PagedModel; + private _model: IPagedModel; get onDOMFocus(): Event { return this.list.onDOMFocus; } constructor( @@ -81,11 +81,11 @@ export class PagedList { return mapEvent(this.list.onSelectionChange, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); } - get model(): PagedModel { + get model(): IPagedModel { return this._model; } - set model(model: PagedModel) { + set model(model: IPagedModel) { this._model = model; this.list.splice(0, this.list.length, ...range(model.length)); } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 97390b5fd35..563664eed0c 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -24,7 +24,7 @@ import { Viewlet } from 'vs/workbench/browser/viewlet'; import { IViewlet } from 'vs/workbench/common/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/common/viewletService'; import { append, $, addStandardDisposableListener, EventType, addClass, removeClass, toggleClass } from 'vs/base/browser/dom'; -import { PagedModel } from 'vs/base/common/paging'; +import { PagedModel, IPagedModel } from 'vs/base/common/paging'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { PagedList } from 'vs/base/browser/ui/list/listPaging'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -54,6 +54,7 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { private root: HTMLElement; private searchBox: HTMLInputElement; private extensionsBox: HTMLElement; + private messageBox: HTMLElement; private list: PagedList; private primaryActions: IAction[]; private secondaryActions: IAction[]; @@ -89,7 +90,9 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { this.searchBox.placeholder = localize('searchExtensions', "Search Extensions in Marketplace"); this.disposables.push(addStandardDisposableListener(this.searchBox, EventType.FOCUS, () => addClass(this.searchBox, 'synthetic-focus'))); this.disposables.push(addStandardDisposableListener(this.searchBox, EventType.BLUR, () => removeClass(this.searchBox, 'synthetic-focus'))); + this.extensionsBox = append(this.root, $('.extensions')); + this.messageBox = append(this.root, $('.message')); const delegate = new Delegate(); const renderer = this.instantiationService.createInstance(Renderer); @@ -125,7 +128,7 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { this.searchBox.setSelectionRange(0, this.searchBox.value.length); this.triggerSearch(this.searchBox.value, true, true); } else { - this.list.model = new PagedModel([]); + this.setModel(new PagedModel([])); } }); } @@ -178,6 +181,20 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { return this.secondaryActions; } + private setModel(model: IPagedModel) { + this.list.model = model; + this.list.scrollTop = 0; + + toggleClass(this.extensionsBox, 'hidden', model.length === 0); + toggleClass(this.messageBox, 'hidden', model.length > 0); + + if (model.length === 0 && this.isVisible()) { + this.messageBox.textContent = localize('no extensions found', "No extensions found."); + } else { + this.messageBox.textContent = ''; + } + } + search(value: string): void { const event = new Event('input', { bubbles: true }) as SearchInputEvent; event.immediate = true; @@ -198,12 +215,11 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { return this.search('@sort:installs'); } - this.list.model = model; - this.list.scrollTop = 0; + this.setModel(model); }); } - private query(value: string): TPromise> { + private query(value: string): TPromise> { if (!value) { // Show installed extensions return this.extensionsWorkbenchService.queryLocal() @@ -244,7 +260,7 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { .then(result => new PagedModel(result)); } - private getRecommendationsModel(query: Query, options: IQueryOptions): TPromise> { + private getRecommendationsModel(query: Query, options: IQueryOptions): TPromise> { const value = query.value.replace(/@recommended/g, '').trim().toLowerCase(); return this.extensionsWorkbenchService.queryLocal() @@ -257,7 +273,7 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { this.telemetryService.publicLog('extensionRecommendations:open', { count: names.length }); if (!names.length) { - return new PagedModel([]); + return TPromise.as(new PagedModel([])); } return this.extensionsWorkbenchService.queryGallery(assign(options, { names, pageSize: names.length })) @@ -265,7 +281,7 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { }); } - private getWorkspaceRecommendationsModel(query: Query, options: IQueryOptions): TPromise> { + private getWorkspaceRecommendationsModel(query: Query, options: IQueryOptions): TPromise> { const value = query.value.replace(/@recommended:workspace/g, '').trim().toLowerCase(); const names = this.tipsService.getWorkspaceRecommendations() .filter(name => name.toLowerCase().indexOf(value) > -1); diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css index bf596ce7a66..322839b9456 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css @@ -27,6 +27,11 @@ height: calc(100% - 38px); } +.extensions-viewlet > .message { + padding: 5px 9px 5px 16px; + cursor: default; +} + .extensions-viewlet > .extensions .extension { box-sizing: border-box; width: 100%; From 14d64571eee9539b047a9e015513db2811da01c0 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 3 Oct 2016 15:16:42 +0200 Subject: [PATCH 358/433] breakpoint widget - fix inner padding --- src/vs/workbench/parts/debug/browser/media/breakpointWidget.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css index c80b0a7f224..65c0f1f320e 100644 --- a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css +++ b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css @@ -20,6 +20,7 @@ .monaco-workbench.mac .monaco-editor .breakpoint-widget .input { font-size: 11px; + padding: 8px; } .monaco-workbench.windows .monaco-editor .breakpoint-widget .input, From 060e6537c86d93b63b8885804cda9b0b49375b22 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 3 Oct 2016 15:56:53 +0200 Subject: [PATCH 359/433] Fix #13158 --- src/vs/workbench/parts/markers/common/markersModel.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/markers/common/markersModel.ts b/src/vs/workbench/parts/markers/common/markersModel.ts index 39af05f77d8..52dc0b4edb4 100644 --- a/src/vs/workbench/parts/markers/common/markersModel.ts +++ b/src/vs/workbench/parts/markers/common/markersModel.ts @@ -344,8 +344,11 @@ export class MarkersModel { return a.path.localeCompare(b.path) || a.name.localeCompare(b.name); } - private static compareMarkers(a: Marker, b:Marker): number { - return Range.compareRangesUsingStarts(a.marker, b.marker); + private static compareMarkers(a: Marker, b: Marker): number { + if (a.marker.severity === b.marker.severity) { + return Range.compareRangesUsingStarts(a.marker, b.marker); + } + return a.marker.severity > b.marker.severity ? -1 : 1; } } From a0b0fd9ed39d814beea7312d734ce830f92e52c4 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 3 Oct 2016 15:57:01 +0200 Subject: [PATCH 360/433] Tests #13158 --- .../markers/test/common/markersModel.test.ts | 81 ++++++++++++++----- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/parts/markers/test/common/markersModel.test.ts b/src/vs/workbench/parts/markers/test/common/markersModel.test.ts index 74944159f7a..e4be9d7b25a 100644 --- a/src/vs/workbench/parts/markers/test/common/markersModel.test.ts +++ b/src/vs/workbench/parts/markers/test/common/markersModel.test.ts @@ -83,27 +83,41 @@ suite('MarkersModel Test', () => { assert.ok(compareResource(actuals[4], 'res4')); }); - test('sort markers by line and column', function() { - let marker1= aMarkerWithRange(8, 1, 9, 3); - let marker2= aMarkerWithRange(3); - let marker3= aMarkerWithRange(5); - let marker4= aMarkerWithRange(8, 1, 8, 4, 'ab'); - let marker5= aMarkerWithRange(10); - let marker6= aMarkerWithRange(8, 1, 8, 4, 'ba'); - let marker7= aMarkerWithRange(4); - let marker8= aMarkerWithRange(8, 2, 8, 4); - let testObject= new MarkersModel([marker1, marker2, marker3, marker4, marker5, marker6, marker7, marker8]); + test('sort markers by severity, line and column', function() { + let marker1= aWarningWithRange(8, 1, 9, 3); + let marker2= aWarningWithRange(3); + let marker3= anErrorWithRange(8, 1, 9, 3); + let marker4= anIgnoreWithRange(5); + let marker5= anInfoWithRange(8, 1, 8, 4, 'ab'); + let marker6= anErrorWithRange(3); + let marker7= anErrorWithRange(5); + let marker8= anInfoWithRange(5); + let marker9= anErrorWithRange(8, 1, 8, 4, 'ab'); + let marker10= anErrorWithRange(10); + let marker11= anErrorWithRange(8, 1, 8, 4, 'ba'); + let marker12= anIgnoreWithRange(3); + let marker13= aWarningWithRange(5); + let marker14= anErrorWithRange(4); + let marker15= anErrorWithRange(8, 2, 8, 4); + let testObject= new MarkersModel([marker1, marker2, marker3, marker4, marker5, marker6, marker7, marker8, marker9, marker10, marker11, marker12, marker13, marker14, marker15]); let actuals= testObject.filteredResources[0].markers.sort(MarkersModel.compare); - assert.equal(actuals[0].marker, marker2); - assert.equal(actuals[1].marker, marker7); - assert.equal(actuals[2].marker, marker3); - assert.equal(actuals[3].marker, marker4); - assert.equal(actuals[4].marker, marker6); - assert.equal(actuals[5].marker, marker1); - assert.equal(actuals[6].marker, marker8); - assert.equal(actuals[7].marker, marker5); + assert.equal(actuals[0].marker, marker6); + assert.equal(actuals[1].marker, marker14); + assert.equal(actuals[2].marker, marker7); + assert.equal(actuals[3].marker, marker9); + assert.equal(actuals[4].marker, marker11); + assert.equal(actuals[5].marker, marker3); + assert.equal(actuals[6].marker, marker15); + assert.equal(actuals[7].marker, marker10); + assert.equal(actuals[8].marker, marker2); + assert.equal(actuals[9].marker, marker13); + assert.equal(actuals[10].marker, marker1); + assert.equal(actuals[11].marker, marker8); + assert.equal(actuals[12].marker, marker5); + assert.equal(actuals[13].marker, marker12); + assert.equal(actuals[14].marker, marker4); }); function hasMarker(markers:Marker[], marker:IMarker):boolean { @@ -116,15 +130,42 @@ suite('MarkersModel Test', () => { return a.uri.toString() === URI.file(b).toString(); } - function aMarkerWithRange(startLineNumber:number=10, + function anErrorWithRange(startLineNumber:number=10, startColumn:number=5, endLineNumber:number= startLineNumber + 1, endColumn:number=startColumn + 5, - message: string= 'some message' + message: string = 'some message', ):IMarker { return aMarker('some resource', Severity.Error, startLineNumber, startColumn, endLineNumber, endColumn, message); } + function aWarningWithRange(startLineNumber:number=10, + startColumn:number=5, + endLineNumber:number= startLineNumber + 1, + endColumn:number=startColumn + 5, + message: string = 'some message', + ):IMarker { + return aMarker('some resource', Severity.Warning, startLineNumber, startColumn, endLineNumber, endColumn, message); + } + + function anInfoWithRange(startLineNumber:number=10, + startColumn:number=5, + endLineNumber:number= startLineNumber + 1, + endColumn:number=startColumn + 5, + message: string = 'some message', + ):IMarker { + return aMarker('some resource', Severity.Info, startLineNumber, startColumn, endLineNumber, endColumn, message); + } + + function anIgnoreWithRange(startLineNumber:number=10, + startColumn:number=5, + endLineNumber:number= startLineNumber + 1, + endColumn:number=startColumn + 5, + message: string = 'some message', + ):IMarker { + return aMarker('some resource', Severity.Ignore, startLineNumber, startColumn, endLineNumber, endColumn, message); + } + function aMarker(resource:string='some resource', severity:Severity=Severity.Error, startLineNumber:number=10, From 261c23d427dd9157787a1af2a6deb9908a807591 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 3 Oct 2016 16:02:02 +0200 Subject: [PATCH 361/433] fix typo in type definitiion --- .../typescript/server/typescript/lib/lib.es2015.core.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript/server/typescript/lib/lib.es2015.core.d.ts b/extensions/typescript/server/typescript/lib/lib.es2015.core.d.ts index 1ade52dd6ab..b386b3f9ae6 100644 --- a/extensions/typescript/server/typescript/lib/lib.es2015.core.d.ts +++ b/extensions/typescript/server/typescript/lib/lib.es2015.core.d.ts @@ -217,7 +217,7 @@ interface NumberConstructor { /** * Returns true if passed value is finite. - * Unlike the global isFininte, Number.isFinite doesn't forcibly convert the parameter to a + * Unlike the global isFinite, Number.isFinite doesn't forcibly convert the parameter to a * number. Only finite values of the type number, result in true. * @param number A numeric value. */ From 8c35e442ba404e5b4943f6b1ece76c878dd0eaea Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 3 Oct 2016 17:09:57 +0200 Subject: [PATCH 362/433] fix #12671 --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 636aee1bc68..ee2048bddec 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -670,11 +670,16 @@ export class SearchViewlet extends Viewlet { } public searchInFolder(resource: URI): void { + if (this.contextService.getWorkspace().resource.toString() === resource.toString()) { + this.inputPatternIncludes.setValue(''); + this.searchWidget.focus(); + return; + } + if (!this.showsFileTypes()) { this.toggleFileTypes(true, true); } - - let workspaceRelativePath = this.contextService.toWorkspaceRelativePath(resource); + const workspaceRelativePath = this.contextService.toWorkspaceRelativePath(resource); if (workspaceRelativePath) { this.inputPatternIncludes.setIsGlobPattern(false); this.inputPatternIncludes.setValue(workspaceRelativePath); From d1b7037bbf365ee53d6321005ae8d5cdf24b7021 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 3 Oct 2016 10:29:41 -0700 Subject: [PATCH 363/433] Fix resolveHandler() calls (fixes #11114) --- .../browser/parts/quickopen/quickOpenController.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index f1f8214d45b..bc81a6712e2 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -487,7 +487,8 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe this.telemetryService.publicLog('quickOpenWidgetShown', { mode: handlerDescriptor.getId(), quickNavigate: quickNavigateConfiguration }); // Trigger onOpen - this.resolveHandler(handlerDescriptor); + this.resolveHandler(handlerDescriptor) + .done(null, errors.onUnexpectedError); // Create upon first open if (!this.quickOpenWidget) { @@ -633,14 +634,16 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe // Reset Extra Class this.quickOpenWidget.setExtraClass(null); - // Trigger onOpen - this.resolveHandler(handlerDescriptor || defaultHandlerDescriptor); - // Remove leading and trailing whitespace const trimmedValue = strings.trim(value); // If no value provided, default to editor history if (!trimmedValue) { + + // Trigger onOpen + this.resolveHandler(handlerDescriptor || defaultHandlerDescriptor) + .done(null, errors.onUnexpectedError); + this.quickOpenWidget.setInput(this.getEditorHistoryWithGroupLabel(), { autoFocusFirstEntry: true }); return; } From 7a8e03c676a72c9516d8c39b6c0c9fa836194c72 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 3 Oct 2016 16:46:39 +0200 Subject: [PATCH 364/433] responsive suggest icons fixes #12029 related to #12859 --- .../contrib/suggest/browser/Class_16x.svg | 1 + .../suggest/browser/Class_inverse_16x.svg | 1 + .../suggest/browser/ColorPalette_16x.svg | 1 + .../browser/ColorPalette_inverse_16x.svg | 1 + .../contrib/suggest/browser/Document_16x.svg | 1 + .../suggest/browser/Document_inverse_16x.svg | 1 + .../contrib/suggest/browser/EnumItem_16x.svg | 1 + .../suggest/browser/EnumItem_inverse_16x.svg | 1 + .../suggest/browser/Enumerator_16x.svg | 1 + .../browser/Enumerator_inverse_16x.svg | 1 + .../contrib/suggest/browser/Field_16x.svg | 1 + .../suggest/browser/Field_inverse_16x.svg | 1 + .../contrib/suggest/browser/Indexer_16x.svg | 1 + .../suggest/browser/Indexer_inverse_16x.svg | 1 + .../browser/IntelliSenseKeyword_16x.svg | 1 + .../IntelliSenseKeyword_inverse_16x.svg | 1 + .../contrib/suggest/browser/Interface_16x.svg | 1 + .../suggest/browser/Interface_inverse_16x.svg | 1 + .../suggest/browser/LineIndent_16x.svg | 1 + .../browser/LineIndent_inverse_16x.svg | 1 + .../contrib/suggest/browser/Method_16x.svg | 1 + .../suggest/browser/Method_inverse_16x.svg | 1 + .../contrib/suggest/browser/Misc_16x.svg | 1 + .../suggest/browser/Misc_inverse_16x.svg | 1 + .../contrib/suggest/browser/Namespace_16x.svg | 1 + .../suggest/browser/Namespace_inverse_16x.svg | 1 + .../contrib/suggest/browser/Property_16x.svg | 1 + .../suggest/browser/Property_inverse_16x.svg | 1 + .../contrib/suggest/browser/Ruler_16x.svg | 1 + .../suggest/browser/Ruler_inverse_16x.svg | 1 + .../contrib/suggest/browser/Snippet_16x.svg | 47 +++++ .../suggest/browser/Snippet_inverse_16x.svg | 43 +++++ .../contrib/suggest/browser/String_16x.svg | 1 + .../suggest/browser/String_inverse_16x.svg | 1 + .../contrib/suggest/browser/Toggle_16x.svg | 1 + .../suggest/browser/Toggle_inverse_16x.svg | 1 + .../contrib/suggest/browser/suggest.css | 170 ++++++------------ .../contrib/suggest/browser/suggestWidget.ts | 4 + .../contrib/suggest/browser/symbol-sprite.svg | 1 - 39 files changed, 185 insertions(+), 114 deletions(-) create mode 100755 src/vs/editor/contrib/suggest/browser/Class_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Class_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/ColorPalette_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/ColorPalette_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Document_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Document_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/EnumItem_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/EnumItem_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Enumerator_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Enumerator_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Field_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Field_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Indexer_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Indexer_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/IntelliSenseKeyword_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/IntelliSenseKeyword_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Interface_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Interface_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/LineIndent_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/LineIndent_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Method_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Method_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Misc_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Misc_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Namespace_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Namespace_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Property_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Property_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Ruler_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Ruler_inverse_16x.svg create mode 100644 src/vs/editor/contrib/suggest/browser/Snippet_16x.svg create mode 100644 src/vs/editor/contrib/suggest/browser/Snippet_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/String_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/String_inverse_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Toggle_16x.svg create mode 100755 src/vs/editor/contrib/suggest/browser/Toggle_inverse_16x.svg delete mode 100644 src/vs/editor/contrib/suggest/browser/symbol-sprite.svg diff --git a/src/vs/editor/contrib/suggest/browser/Class_16x.svg b/src/vs/editor/contrib/suggest/browser/Class_16x.svg new file mode 100755 index 00000000000..5ef1c6f80bc --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Class_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Class_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Class_inverse_16x.svg new file mode 100755 index 00000000000..c43aad29efd --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Class_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/ColorPalette_16x.svg b/src/vs/editor/contrib/suggest/browser/ColorPalette_16x.svg new file mode 100755 index 00000000000..2af5cc6faef --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/ColorPalette_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/ColorPalette_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/ColorPalette_inverse_16x.svg new file mode 100755 index 00000000000..7afb32b895e --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/ColorPalette_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Document_16x.svg b/src/vs/editor/contrib/suggest/browser/Document_16x.svg new file mode 100755 index 00000000000..13ded2953eb --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Document_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Document_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Document_inverse_16x.svg new file mode 100755 index 00000000000..949a376216a --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Document_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/EnumItem_16x.svg b/src/vs/editor/contrib/suggest/browser/EnumItem_16x.svg new file mode 100755 index 00000000000..aa901ec1934 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/EnumItem_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/EnumItem_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/EnumItem_inverse_16x.svg new file mode 100755 index 00000000000..791759092fc --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/EnumItem_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Enumerator_16x.svg b/src/vs/editor/contrib/suggest/browser/Enumerator_16x.svg new file mode 100755 index 00000000000..e4a9551fd5a --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Enumerator_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Enumerator_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Enumerator_inverse_16x.svg new file mode 100755 index 00000000000..d8e9f4f107a --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Enumerator_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Field_16x.svg b/src/vs/editor/contrib/suggest/browser/Field_16x.svg new file mode 100755 index 00000000000..c6cb5362b3b --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Field_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Field_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Field_inverse_16x.svg new file mode 100755 index 00000000000..5fc48ceff0f --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Field_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Indexer_16x.svg b/src/vs/editor/contrib/suggest/browser/Indexer_16x.svg new file mode 100755 index 00000000000..028f55771cc --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Indexer_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Indexer_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Indexer_inverse_16x.svg new file mode 100755 index 00000000000..37a29ad4a88 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Indexer_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/IntelliSenseKeyword_16x.svg b/src/vs/editor/contrib/suggest/browser/IntelliSenseKeyword_16x.svg new file mode 100755 index 00000000000..4a69c4a038b --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/IntelliSenseKeyword_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/IntelliSenseKeyword_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/IntelliSenseKeyword_inverse_16x.svg new file mode 100755 index 00000000000..decbf2c403e --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/IntelliSenseKeyword_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Interface_16x.svg b/src/vs/editor/contrib/suggest/browser/Interface_16x.svg new file mode 100755 index 00000000000..958a792742a --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Interface_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Interface_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Interface_inverse_16x.svg new file mode 100755 index 00000000000..f7c2934a55c --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Interface_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/LineIndent_16x.svg b/src/vs/editor/contrib/suggest/browser/LineIndent_16x.svg new file mode 100755 index 00000000000..6c15351f14f --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/LineIndent_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/LineIndent_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/LineIndent_inverse_16x.svg new file mode 100755 index 00000000000..c1d45b45ebf --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/LineIndent_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Method_16x.svg b/src/vs/editor/contrib/suggest/browser/Method_16x.svg new file mode 100755 index 00000000000..2be9daa5f5d --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Method_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Method_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Method_inverse_16x.svg new file mode 100755 index 00000000000..d3c2c571d98 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Method_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Misc_16x.svg b/src/vs/editor/contrib/suggest/browser/Misc_16x.svg new file mode 100755 index 00000000000..13ff00b2347 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Misc_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Misc_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Misc_inverse_16x.svg new file mode 100755 index 00000000000..50a038657b2 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Misc_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Namespace_16x.svg b/src/vs/editor/contrib/suggest/browser/Namespace_16x.svg new file mode 100755 index 00000000000..dab07dd5ad9 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Namespace_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Namespace_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Namespace_inverse_16x.svg new file mode 100755 index 00000000000..9b9a44c52d2 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Namespace_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Property_16x.svg b/src/vs/editor/contrib/suggest/browser/Property_16x.svg new file mode 100755 index 00000000000..fb1c74cf773 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Property_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Property_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Property_inverse_16x.svg new file mode 100755 index 00000000000..f90781897a7 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Property_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Ruler_16x.svg b/src/vs/editor/contrib/suggest/browser/Ruler_16x.svg new file mode 100755 index 00000000000..2e8e88fef0d --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Ruler_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Ruler_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Ruler_inverse_16x.svg new file mode 100755 index 00000000000..373ab812f92 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Ruler_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Snippet_16x.svg b/src/vs/editor/contrib/suggest/browser/Snippet_16x.svg new file mode 100644 index 00000000000..8bf3b9f67d6 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Snippet_16x.svg @@ -0,0 +1,47 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/browser/Snippet_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Snippet_inverse_16x.svg new file mode 100644 index 00000000000..501ff9c6177 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Snippet_inverse_16x.svg @@ -0,0 +1,43 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/vs/editor/contrib/suggest/browser/String_16x.svg b/src/vs/editor/contrib/suggest/browser/String_16x.svg new file mode 100755 index 00000000000..35e744ce90d --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/String_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/String_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/String_inverse_16x.svg new file mode 100755 index 00000000000..1ac0cf99ac8 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/String_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Toggle_16x.svg b/src/vs/editor/contrib/suggest/browser/Toggle_16x.svg new file mode 100755 index 00000000000..7a1d3f1335e --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Toggle_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/Toggle_inverse_16x.svg b/src/vs/editor/contrib/suggest/browser/Toggle_inverse_16x.svg new file mode 100755 index 00000000000..fbc83f8879f --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/Toggle_inverse_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/suggest.css b/src/vs/editor/contrib/suggest/browser/suggest.css index ceb91b4db3c..b1a643799ed 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/suggest.css @@ -33,16 +33,20 @@ } .monaco-editor .suggest-widget .monaco-list .monaco-list-row { + display: flex; -mox-box-sizing: border-box; box-sizing: border-box; - padding: 0 10px 0 22px; + padding-right: 10px; background-repeat: no-repeat; background-position: 2px 2px; white-space: nowrap; } .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .text { + flex: 1; height: 100%; + overflow: hidden; + padding-left: 2px; } .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .text > .main { @@ -115,35 +119,33 @@ } .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon { - position: absolute; display: block; - left: 1px; - top: 2px; - background-image: url('symbol-sprite.svg'); - background-repeat: no-repeat; height: 16px; width: 16px; + background-repeat: no-repeat; + background-size: 80%; + background-position: center; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon { background-position: -361px -3px; } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon { background-image: url('Misc_16x.svg'); } .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.method, .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.function, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.constructor { background-position: 1px -3px; } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.constructor { background-image: url('Method_16x.svg'); } .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.field, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.variable { background-position: -19px -2px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.class { background-position: -41px -3px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.interface { background-position: -62px -2px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.module { background-position: -79px -4px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.property { background-position: -100px -3px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.unit { background-position: -120px -4px; } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.variable { background-image: url('Field_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.class { background-image: url('Class_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.interface { background-image: url('Interface_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.module { background-image: url('Namespace_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.property { background-image: url('Property_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.unit { background-image: url('Ruler_16x.svg'); } .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.value, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.enum { background-position: -140px -3px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.keyword { background-position: -162px -2px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.snippet { background-position: -181px -4px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.text { background-position: -201px -2px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.color { background-position: -221px -4px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.file { background-position: -260px -2px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.reference { background-position: -281px -4px; } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.enum { background-image: url('EnumItem_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.keyword { background-image: url('IntelliSenseKeyword_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.text { background-image: url('String_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.color { background-image: url('ColorPalette_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.file { background-image: url('Document_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.reference { background-image: url('Enumerator_16x.svg'); } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.snippet { background-image: url('Snippet_16x.svg'); } .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor { background-image: none; @@ -236,28 +238,25 @@ color: #4E94CE; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon { background-position: -361px -23px; } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon { background-image: url('Misc_inverse_16x.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.method, .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.function, -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.constructor { background-position: 2px -23px; } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.constructor { background-image: url('Method_inverse_16x.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.field, -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.variable { background-position: -18px -23px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.class { background-position: -41px -23px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.interface { background-position: -61px -24px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.module { background-position: -79px -24px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.property { background-position: -100px -23px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.unit { background-position: -120px -24px; } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.variable { background-image: url('Field_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.class { background-image: url('Class_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.interface { background-image: url('Interface_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.module { background-image: url('Namespace_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.property { background-image: url('Property_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.unit { background-image: url('Ruler_inverse_16x.svg'); } .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.value, -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.enum { background-position: -140px -23px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.keyword { background-position: -161px -22px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.snippet { background-position: -181px -23px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.text { background-position: -201px -22px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.color { background-position: -221px -24px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.file { background-position: -260px -22px; } -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.reference { background-position: -281px -24px; } - - - +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.enum { background-image: url('EnumItem_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.keyword { background-image: url('IntelliSenseKeyword_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.text { background-image: url('String_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.color { background-image: url('ColorPalette_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.file { background-image: url('Document_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.reference { background-image: url('Enumerator_inverse_16x.svg'); } +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon.snippet { background-image: url('Snippet_inverse_16x.svg'); } /* High Contrast Theming */ .monaco-editor.hc-black .suggest-widget { @@ -279,77 +278,22 @@ color: #4E94CE; } -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon { - background: none; - overflow: hidden; -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon:before { - height: 16px; - width: 16px; - display: inline-block; - content: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0xIDB2OC44bC0xIDEuNlYxMmg4di0xaDRWMEgxeiIgaWQ9IlNoYXBlIiBmaWxsPSIjMkQyRDMwIi8+PHBhdGggZD0iTTEgMTFsMy01IDMgNUgxem01LjA4Mi0zLjY3QzYuMzg4IDYgNy41NzcgNSA5IDVjLjc3IDAgMS40NjguMyAyIC43OFYxSDJ2Ni4yTDQgNGwyLjA4MiAzLjMzeiIgZmlsbD0iI0M1QzVDNSIvPjxjaXJjbGUgZmlsbD0iI0M1QzVDNSIgY3g9IjguOTM4IiBjeT0iOCIgcj0iMi4wNjMiLz48L2c+PC9zdmc+"); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.method:before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.function:before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.constructor:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iI0IxODBENyIgZD0iTTUuNSAzbC00LjUgMi44NTd2NC4yODVsNC41IDIuODU4IDQuNS0yLjg1N3YtNC4yODZsLTQuNS0yLjg1N3ptLS41IDguNDk4bC0zLTEuOTA1di0yLjgxNmwzIDEuOTA1djIuODE2em0tMi4zNTgtNS40OThsMi44NTgtMS44MTUgMi44NTggMS44MTUtMi44NTggMS44MTUtMi44NTgtMS44MTV6bTYuMzU4IDMuNTkzbC0zIDEuOTA1di0yLjgxNWwzLTEuOTA1djIuODE1eiIvPjwvc3ZnPg=="); - margin-left: 2px; -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.field:before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.variable:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iIzc1QkVGRiIgZD0iTTEgNnY0bDQgMiA2LTN2LTRsLTQtMi02IDN6bTQgMWwtMi0xIDQtMiAyIDEtNCAyeiIvPjwvc3ZnPg=="); - margin-left: 2px; -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.class:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBvbHlnb24gZmlsbD0iI0U4QUI1MyIgcG9pbnRzPSIxMS45OTgsMTEuMDAyIDksMTEgOSw3IDExLDcgMTAsOCAxMiwxMCAxNSw3IDEzLDUgMTIsNiA3LDYgOSw0IDYsMSAxLDYgNCw5IDYsNyA4LDcgOCwxMiAxMSwxMiAxMCwxMyAxMiwxNSAxNSwxMiAxMywxMCIvPjwvc3ZnPg=="); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.interface:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iIzc1QkVGRiIgZD0iTTExLjUgNGMtMS43NTkgMC0zLjIwNCAxLjMwOC0zLjQ0OSAzaC0zLjEyMmMtLjIyMy0uODYxLS45OTgtMS41LTEuOTI5LTEuNS0xLjEwNCAwLTIgLjg5NS0yIDIgMCAxLjEwNC44OTYgMiAyIDIgLjkzMSAwIDEuNzA2LS42MzkgMS45MjktMS41aDMuMTIyYy4yNDUgMS42OTEgMS42OSAzIDMuNDQ5IDMgMS45MyAwIDMuNS0xLjU3IDMuNS0zLjUgMC0xLjkzMS0xLjU3LTMuNS0zLjUtMy41em0wIDVjLS44MjcgMC0xLjUtLjY3NC0xLjUtMS41IDAtLjgyOC42NzMtMS41IDEuNS0xLjVzMS41LjY3MiAxLjUgMS41YzAgLjgyNi0uNjczIDEuNS0xLjUgMS41eiIvPjwvc3ZnPg=="); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.module:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iI0M1QzVDNSIgZD0iTTkgMTF2LTFjMC0uODM0LjQ5Ni0xLjczOCAxLTItLjUwNC0uMjctMS0xLjE2OC0xLTJ2LTFjMC0uODQtLjU4NC0xLTEtMXYtMWMyLjA4MyAwIDIgMS4xNjYgMiAydjFjMCAuOTY5LjcwMy45OCAxIDF2MmMtLjMyMi4wMi0xIC4wNTMtMSAxdjFjMCAuODM0LjA4MyAyLTIgMnYtMWMuODMzIDAgMS0xIDEtMXptLTYgMHYtMWMwLS44MzQtLjQ5Ni0xLjczOC0xLTIgLjUwNC0uMjcgMS0xLjE2OCAxLTJ2LTFjMC0uODQuNTg0LTEgMS0xdi0xYy0yLjA4MyAwLTIgMS4xNjYtMiAydjFjMCAuOTY5LS43MDMuOTgtMSAxdjJjLjMyMi4wMiAxIC4wNTMgMSAxdjFjMCAuODM0LS4wODMgMiAyIDJ2LTFjLS44MzMgMC0xLTEtMS0xeiIvPjwvc3ZnPg=="); - margin-left: 2px; -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.property:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iI0M1QzVDNSIgZD0iTTEyLjA5IDQuMzU5bC0yLjY0MSAyLjY0MS0yLTIgMi42NDEtMi42NDFjLS41MDItLjIyNi0xLjA1NS0uMzU5LTEuNjQxLS4zNTktMi4yMDkgMC00IDEuNzkxLTQgNCAwIC41ODYuMTMzIDEuMTM5LjM1OSAxLjY0bC0zLjM1OSAzLjM2cy0xIDEgMCAyaDJsMy4zNTktMy4zNmMuNTAzLjIyNiAxLjA1NS4zNiAxLjY0MS4zNiAyLjIwOSAwIDQtMS43OTEgNC00IDAtLjU4Ni0uMTMzLTEuMTM5LS4zNTktMS42NDF6Ii8+PC9zdmc+"); - margin-left: 1px; -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.value:before, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.enum:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PGcgZmlsbD0iIzc1QkVGRiI+PHBhdGggZD0iTTEyIDNoLTRsLTEgMXYyaDV2MWgtMnYxaDJsMS0xdi0zbC0xLTF6bTAgMmgtNHYtMWg0djF6TTMgMTJoNnYtNWgtNnY1em0xLTNoNHYxaC00di0xeiIvPjwvZz48L3N2Zz4="); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.snippet:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iI0M1QzVDNSIgZD0iTTEyIDExdi03aC03djdoLTF2LThoOXY4aC0xem0tNyAyaC0xdi0xaDF2MXptMi0xaC0xdjFoMXYtMXptMiAwaC0xdjFoMXYtMXptMiAxaC0xdi0xaDF2MXptMi0xaC0xdjFoMXYtMXoiLz48L3N2Zz4="); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.keyword:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iI0M1QzVDNSIgZD0iTTEzIDVoLTR2LTFoNHYxem0wIDNoLTJ2MWgydi0xem0tNCAwaC02djFoNnYtMXptLTIgM2gtNHYxaDR2LTF6bTYgMGgtNHYxaDR2LTF6bS01LTh2M2gtNXYtM2g1em0tMSAxaC0zdjFoM3YtMXoiLz48L3N2Zz4="); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.unit:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHJlY3QgeD0iNCIgeT0iNiIgZmlsbD0iI0M1QzVDNSIgd2lkdGg9IjkiIGhlaWdodD0iNCIvPjxnIGZpbGw9IiMyQjI4MkUiPjxyZWN0IHg9IjUiIHk9IjgiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiLz48cmVjdCB4PSI3IiB5PSI4IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIi8+PHJlY3QgeD0iOSIgeT0iOCIgd2lkdGg9IjEiIGhlaWdodD0iMSIvPjxyZWN0IHg9IjExIiB5PSI4IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIi8+PHJlY3QgeD0iNSIgeT0iNyIgd2lkdGg9IjMiIGhlaWdodD0iMSIvPjxyZWN0IHg9IjkiIHk9IjciIHdpZHRoPSIzIiBoZWlnaHQ9IjEiLz48L2c+PC9zdmc+"); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.text { - padding-left: 0; -} -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.text:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iI0M1QzVDNSIgZD0iTTEgMnYxMmgxNHYtMTJoLTE0em0xMyAxMWgtMTJ2LTEwaDEydjEwem0tNi03di0xaC0xdjVoM3YtNGgtMnptMSAzaC0xdi0yaDF2MnptMy0ydjJoMXYxaC0ydi00aDJ2MWgtMXptLTYtMXY0aC0zdi0yaDF2MWgxdi0xaC0xdi0xaC0xdi0xaDN6Ii8+PC9zdmc+"); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.color:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iI0M1QzVDNSIgZD0iTTEwLjY0OCA4LjUwOHMtMS45MTEuNDU4LS40NzgtLjkxNmMxLjIxNy0xLjE2NyAzLjM0NC0yLjc0NyAxLjkxLTQuMTItMS40MzMtMS4zNzUtOS4wNzkuNDU2LTkuMDc5IDUuMDM2IDAgNC41ODEgNS43MzUgNS4wMzggOC4xMjQgNC4xMjIgMi4zODktLjkxNSAyLjg2Ni00LjU3OC0uNDc3LTQuMTIyem0tNS4yNzIgMS45MDJjLS41NzQgMC0xLjA0MS0uNDY3LTEuMDQxLTEuMDQxIDAtLjU3NS40NjctMS4wNDIgMS4wNDEtMS4wNDJzMS4wNDEuNDY2IDEuMDQxIDEuMDQyYzAgLjU3NC0uNDY3IDEuMDQxLTEuMDQxIDEuMDQxem0xLjA0MS0zYy0uNTc0IDAtMS4wNDEtLjQ2Ni0xLjA0MS0xLjA0MXMuNDY3LTEuMDQxIDEuMDQxLTEuMDQxIDEuMDQxLjQ2NiAxLjA0MSAxLjA0MWMwIC41NzQtLjQ2NyAxLjA0MS0xLjA0MSAxLjA0MXptMS45NDUtMi4yNWMwLS41NzUuNDY3LTEuMDQxIDEuMDQxLTEuMDQxLjU3NCAwIDEuMDQxLjQ2NiAxLjA0MSAxLjA0MXMtLjQ2NyAxLjA0MS0xLjA0MSAxLjA0MWMtLjU3NCAwLTEuMDQxLS40NjYtMS4wNDEtMS4wNDF6Ii8+PC9zdmc+"); -} - -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.reference:before { - content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PGcgZmlsbD0iI0U4QUI1MyI+PHBhdGggZD0iTTYgN2gtNGwtMSAxdjNsMSAxaDRsMS0xdi0zbC0xLTF6bTAgNGgtNHYtMWg0djF6bTAtMmgtNHYtMWg0djF6TTEwIDNoLTRsLTEgMXYyaDV2MWgtMi41ODZsLjU4Ni41ODZ2LjQxNGgybDEtMXYtM2wtMS0xem0wIDJoLTR2LTFoNHYxeiIvPjwvZz48L3N2Zz4="); -} \ No newline at end of file +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon { background-image: url('Misc_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.method, +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.function, +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.constructor { background-image: url('Method_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.field, +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.variable { background-image: url('Field_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.class { background-image: url('Class_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.interface { background-image: url('Interface_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.module { background-image: url('Namespace_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.property { background-image: url('Property_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.unit { background-image: url('Ruler_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.value, +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.enum { background-image: url('EnumItem_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.keyword { background-image: url('IntelliSenseKeyword_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.text { background-image: url('String_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.color { background-image: url('ColorPalette_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.file { background-image: url('Document_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.reference { background-image: url('Enumerator_inverse_16x.svg'); } +.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon.snippet { background-image: url('Snippet_inverse_16x.svg'); } \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 7ae3ec84f2b..5485225ff18 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -83,8 +83,12 @@ class Renderer implements IRenderer { const configureFont = () => { const fontInfo = this.editor.getConfiguration().fontInfo; + data.root.style.fontSize = `${ fontInfo.fontSize }px`; main.style.fontFamily = fontInfo.fontFamily; + main.style.lineHeight = `${ fontInfo.lineHeight }px`; + data.icon.style.height = `${ fontInfo.lineHeight }px`; + data.icon.style.width = `${ fontInfo.lineHeight }px`; }; configureFont(); diff --git a/src/vs/editor/contrib/suggest/browser/symbol-sprite.svg b/src/vs/editor/contrib/suggest/browser/symbol-sprite.svg deleted file mode 100644 index b3ba27c70d2..00000000000 --- a/src/vs/editor/contrib/suggest/browser/symbol-sprite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 487696f8d6651345ab0e3da4f221d5441fd94daf Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 09:48:05 +0200 Subject: [PATCH 365/433] fixes #13105 --- .../electron-browser/releaseNotesEditor.ts | 87 +++---------------- .../electron-browser/releaseNotesInput.ts | 6 +- 2 files changed, 15 insertions(+), 78 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 4f324536962..21f41aadea2 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -7,11 +7,9 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { marked } from 'vs/base/common/marked/marked'; -import { always } from 'vs/base/common/async'; -import URI from 'vs/base/common/uri'; -import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Builder } from 'vs/base/browser/builder'; -import { append, $, addClass, removeClass } from 'vs/base/browser/dom'; +import { append, $ } from 'vs/base/browser/dom'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/workbench/services/themes/common/themeService'; @@ -20,13 +18,10 @@ import { EditorOptions } from 'vs/workbench/common/editor'; import WebView from 'vs/workbench/parts/html/browser/webview'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { asText } from 'vs/base/node/request'; -import { Keybinding } from 'vs/base/common/keybinding'; import { IRequestService } from 'vs/platform/request/common/request'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import product from 'vs/platform/product'; import { IModeService } from 'vs/editor/common/services/modeService'; -import {tokenizeToString} from 'vs/editor/common/modes/textToHtmlTokenizer'; +import { tokenizeToString } from 'vs/editor/common/modes/textToHtmlTokenizer'; function renderBody(body: string): string { return ` @@ -67,25 +62,12 @@ export class ReleaseNotesEditor extends BaseEditor { } setInput(input: ReleaseNotesInput, options: EditorOptions): TPromise { - const version = input.version; + const { text } = input; this.content.innerHTML = ''; - const match = /^(\d+\.\d)\./.exec(version); - - if (!match) { - return TPromise.as(null); - } - - const versionLabel = match[1].replace(/\./g, '_'); - const baseUrl = 'https://code.visualstudio.com/raw'; - const url = `${ baseUrl }/v${ versionLabel }.md`; - - this.loadContents(() => this.requestService.request({ url }) - .then(asText) - .then(text => this.patchKeybindings(text)) - .then(text => { - // we first need to load the modes... + return super.setInput(input, options) + .then(() => { const result = []; const renderer = new marked.Renderer(); renderer.code = (code, lang) => { @@ -95,14 +77,12 @@ export class ReleaseNotesEditor extends BaseEditor { }; marked(text, { renderer }); - return TPromise.join(result).then(() => text); - }) - .then(text => { - // then we can render + return TPromise.join(result); + }).then(() => { const renderer = new marked.Renderer(); renderer.code = (code, lang) => { const modeId = this.modeService.getModeIdForLanguageName(lang); - return `${ tokenizeToString(code, modeId) }`; + return `${tokenizeToString(code, modeId)}`; }; return marked(text, { renderer }); @@ -114,59 +94,14 @@ export class ReleaseNotesEditor extends BaseEditor { document.querySelector('.monaco-editor-background') ); - webview.baseUrl = `${ baseUrl }/`; + webview.baseUrl = `https://code.visualstudio.com/raw/`; webview.style(this.themeService.getColorTheme()); webview.contents = [body]; webview.onDidClickLink(link => this.openerService.open(link), null, this.contentDisposables); this.themeService.onDidColorThemeChange(themeId => webview.style(themeId), null, this.contentDisposables); this.contentDisposables.push(webview); - }) - .then(null, () => { - const uri = URI.parse(product.releaseNotesUrl); - this.openerService.open(uri); - this.editorService.closeEditor(this.position, this.input); - })); - - return super.setInput(input, options); - } - - private loadContents(loadingTask: ()=>TPromise): void { - this.contentDisposables = dispose(this.contentDisposables); - - this.content.innerHTML = ''; - addClass(this.content, 'loading'); - - let promise = loadingTask(); - promise = always(promise, () => removeClass(this.content, 'loading')); - - this.contentDisposables.push(toDisposable(() => promise.cancel())); - } - - private patchKeybindings(text: string): string { - return text.replace(/kb\(([a-z.\d\-]+)\)/gi, (match, kb) => { - const keybinding = this.keybindingService.lookupKeybindings(kb)[0]; - - if (!keybinding) { - return match; - } - - return this.keybindingService.getLabelFor(keybinding); - }).replace(/kbstyle\(([^\)]+)\)/gi, (match, kb) => { - const code = Keybinding.fromUserSettingsLabel(kb); - - if (!code) { - return match; - } - - const keybinding = new Keybinding(code); - - if (!keybinding) { - return match; - } - - return this.keybindingService.getLabelFor(keybinding); - }); + }); } layout(): void { diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts index 80a39e5c853..b447d81231f 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts @@ -12,9 +12,11 @@ import { EditorInput } from 'vs/workbench/common/editor'; export class ReleaseNotesInput extends EditorInput { static get ID() { return 'workbench.releaseNotes.input'; } - get version(): string { return this._version; } - constructor(private _version: string) { + get version(): string { return this._version; } + get text(): string { return this._text; } + + constructor(private _version: string, private _text: string) { super(); } From 3c63ca22c6ff8482b7ac28de1682105c617be4a3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 4 Oct 2016 10:03:29 +0200 Subject: [PATCH 366/433] use timeout > 10ms, #13148 --- .../test/node/api/extHostDocumentSaveParticipant.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/test/node/api/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/test/node/api/extHostDocumentSaveParticipant.test.ts index d8ddd22601e..eaa69d4fca9 100644 --- a/src/vs/workbench/test/node/api/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/test/node/api/extHostDocumentSaveParticipant.test.ts @@ -157,17 +157,17 @@ suite('ExtHostDocumentSaveParticipant', () => { }); test('event delivery, overall timeout', () => { - const participant = new ExtHostDocumentSaveParticipant(documents, workspace, { timeout: 10, errors: 5 }); + const participant = new ExtHostDocumentSaveParticipant(documents, workspace, { timeout: 20, errors: 5 }); let callCount = 0; let sub1 = participant.onWillSaveTextDocumentEvent(function (event) { callCount += 1; - event.waitUntil(TPromise.timeout(7)); + event.waitUntil(TPromise.timeout(17)); }); let sub2 = participant.onWillSaveTextDocumentEvent(function (event) { callCount += 1; - event.waitUntil(TPromise.timeout(7)); + event.waitUntil(TPromise.timeout(17)); }); let sub3 = participant.onWillSaveTextDocumentEvent(function (event) { From e7a496b881c1cb39a0a6e6fe420a1f1d59e56102 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 4 Oct 2016 10:11:24 +0200 Subject: [PATCH 367/433] use Object.create over {}, fixes #12890 --- src/vs/editor/common/services/editorSimpleWorker.ts | 2 +- src/vs/editor/test/common/model/compatMirrorModel.test.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/services/editorSimpleWorker.ts b/src/vs/editor/common/services/editorSimpleWorker.ts index 642fabd7dc0..b4e8ec5e988 100644 --- a/src/vs/editor/common/services/editorSimpleWorker.ts +++ b/src/vs/editor/common/services/editorSimpleWorker.ts @@ -124,7 +124,7 @@ export class MirrorModel extends MirrorModel2 implements ICommonModel { public getAllUniqueWords(wordDefinition:RegExp, skipWordOnce?:string) : string[] { var foundSkipWord = false; - var uniqueWords = {}; + var uniqueWords = Object.create(null); return this._getAllWords(wordDefinition).filter((word) => { if (skipWordOnce && !foundSkipWord && skipWordOnce === word) { foundSkipWord = true; diff --git a/src/vs/editor/test/common/model/compatMirrorModel.test.ts b/src/vs/editor/test/common/model/compatMirrorModel.test.ts index 8ec13ce4bcc..dc336c86862 100644 --- a/src/vs/editor/test/common/model/compatMirrorModel.test.ts +++ b/src/vs/editor/test/common/model/compatMirrorModel.test.ts @@ -138,6 +138,13 @@ suite('Editor Model - MirrorModel', () => { assert.equal(uniqueWords.length, 2); assert.equal(uniqueWords[0], 'foo'); assert.equal(uniqueWords[1], 'bar'); + + model = new SimpleMirrorModel(null, [ 'toString', 'hasOwnProperty', 'foo' ], '\n', 1); + uniqueWords = model.getAllUniqueWords(DEFAULT_WORD_REGEXP); + assert.equal(uniqueWords.length, 3); + assert.equal(uniqueWords[0], 'toString'); + assert.equal(uniqueWords[1], 'hasOwnProperty'); + assert.equal(uniqueWords[2], 'foo'); }); test('word at/until pos', () => { From 4dd54771fdee96691a2a00bfb92a91ca10b1d7a3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 10:15:58 +0200 Subject: [PATCH 368/433] fixes #13174 --- .../extensions/electron-browser/extensions.contribution.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index fbff0a295cd..14c83b3584c 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -20,7 +20,7 @@ import { IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/co import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { VIEWLET_ID, IExtensionsWorkbenchService } from './extensions'; import { ExtensionsWorkbenchService } from './extensionsWorkbenchService'; -import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, UpdateAllAction, OpenExtensionsFolderAction, ConfigureWorkspaceRecommendedExtensionsAction } from './extensionsActions'; +import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, UpdateAllAction, OpenExtensionsFolderAction, ConfigureWorkspaceRecommendedExtensionsAction, InstallVSIXAction } from './extensionsActions'; import { ExtensionsInput } from './extensionsInput'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { ExtensionEditor } from './extensionEditor'; @@ -119,6 +119,9 @@ actionRegistry.registerWorkbenchAction(openExtensionsFolderActionDescriptor, 'Ex const openExtensionsFileActionDescriptor = new SyncActionDescriptor(ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceRecommendedExtensionsAction.ID, ConfigureWorkspaceRecommendedExtensionsAction.LABEL); actionRegistry.registerWorkbenchAction(openExtensionsFileActionDescriptor, 'Extensions: Open Extensions File', ExtensionsLabel); +const installVSIXActionDescriptor = new SyncActionDescriptor(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL); +actionRegistry.registerWorkbenchAction(installVSIXActionDescriptor, 'Extensions: Install from VSIX...', ExtensionsLabel); + Registry.as(ConfigurationExtensions.Configuration) .registerConfiguration({ id: 'extensions', From ecaea72ef90f00095659a82dcf4c3d59357ddb39 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 4 Oct 2016 10:28:43 +0200 Subject: [PATCH 369/433] run formatter, #13057 --- .../browser/goToDeclaration.ts | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts index 151ac0a9880..205ee4a5e2d 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts @@ -7,30 +7,30 @@ import 'vs/css!./goToDeclaration'; import * as nls from 'vs/nls'; -import {Throttler} from 'vs/base/common/async'; -import {onUnexpectedError} from 'vs/base/common/errors'; -import {MarkedString, textToMarkedString} from 'vs/base/common/htmlContent'; -import {KeyCode, KeyMod, KeyChord} from 'vs/base/common/keyCodes'; +import { Throttler } from 'vs/base/common/async'; +import { onUnexpectedError } from 'vs/base/common/errors'; +import { MarkedString, textToMarkedString } from 'vs/base/common/htmlContent'; +import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import Severity from 'vs/base/common/severity'; import * as strings from 'vs/base/common/strings'; -import {TPromise} from 'vs/base/common/winjs.base'; +import { TPromise } from 'vs/base/common/winjs.base'; import * as browser from 'vs/base/browser/browser'; -import {IKeyboardEvent} from 'vs/base/browser/keyboardEvent'; -import {IEditorService} from 'vs/platform/editor/common/editor'; -import {IMessageService} from 'vs/platform/message/common/message'; -import {Range} from 'vs/editor/common/core/range'; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IEditorService } from 'vs/platform/editor/common/editor'; +import { IMessageService } from 'vs/platform/message/common/message'; +import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import {editorAction, IActionOptions, ServicesAccessor, EditorAction} from 'vs/editor/common/editorCommonExtensions'; -import {Location, DefinitionProviderRegistry} from 'vs/editor/common/modes'; -import {ICodeEditor, IEditorMouseEvent, IMouseTarget} from 'vs/editor/browser/editorBrowser'; -import {editorContribution} from 'vs/editor/browser/editorBrowserExtensions'; -import {getDeclarationsAtPosition} from 'vs/editor/contrib/goToDeclaration/common/goToDeclaration'; -import {ReferencesController} from 'vs/editor/contrib/referenceSearch/browser/referencesController'; -import {ReferencesModel} from 'vs/editor/contrib/referenceSearch/browser/referencesModel'; -import {IDisposable, dispose} from 'vs/base/common/lifecycle'; -import {PeekContext} from 'vs/editor/contrib/zoneWidget/browser/peekViewWidget'; -import {ContextKeyExpr} from 'vs/platform/contextkey/common/contextkey'; +import { editorAction, IActionOptions, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; +import { Location, DefinitionProviderRegistry } from 'vs/editor/common/modes'; +import { ICodeEditor, IEditorMouseEvent, IMouseTarget } from 'vs/editor/browser/editorBrowser'; +import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; +import { getDeclarationsAtPosition } from 'vs/editor/contrib/goToDeclaration/common/goToDeclaration'; +import { ReferencesController } from 'vs/editor/contrib/referenceSearch/browser/referencesController'; +import { ReferencesModel } from 'vs/editor/contrib/referenceSearch/browser/referencesModel'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { PeekContext } from 'vs/editor/contrib/zoneWidget/browser/peekViewWidget'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import ModeContextKeys = editorCommon.ModeContextKeys; import EditorContextKeys = editorCommon.EditorContextKeys; @@ -50,12 +50,12 @@ export class DefinitionAction extends EditorAction { private _configuration: DefinitionActionConfig; - constructor(configuration: DefinitionActionConfig, opts:IActionOptions) { + constructor(configuration: DefinitionActionConfig, opts: IActionOptions) { super(opts); this._configuration = configuration; } - public run(accessor:ServicesAccessor, editor:editorCommon.ICommonCodeEditor): TPromise { + public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): TPromise { const messageService = accessor.get(IMessageService); const editorService = accessor.get(IEditorService); @@ -102,7 +102,7 @@ export class DefinitionAction extends EditorAction { }); } - private _onResult(editorService:IEditorService, editor:editorCommon.ICommonCodeEditor, model: ReferencesModel) { + private _onResult(editorService: IEditorService, editor: editorCommon.ICommonCodeEditor, model: ReferencesModel) { if (this._configuration.openInPeek) { this._openInPeek(editorService, editor, model); } else { @@ -115,7 +115,7 @@ export class DefinitionAction extends EditorAction { } } - private _openReference(editorService:IEditorService, reference: Location, sideBySide: boolean): TPromise{ + private _openReference(editorService: IEditorService, reference: Location, sideBySide: boolean): TPromise { let {uri, range} = reference; return editorService.openEditor({ resource: uri, @@ -124,11 +124,11 @@ export class DefinitionAction extends EditorAction { revealIfVisible: !sideBySide } }, sideBySide).then(editor => { - return editor.getControl(); + return editor.getControl(); }); } - private _openInPeek(editorService:IEditorService, target: editorCommon.ICommonCodeEditor, model: ReferencesModel) { + private _openInPeek(editorService: IEditorService, target: editorCommon.ICommonCodeEditor, model: ReferencesModel) { let controller = ReferencesController.get(target); if (controller) { controller.toggleWidget(target.getSelection(), TPromise.as(model), { @@ -392,7 +392,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - let newDecorations : editorCommon.IModelDeltaDecoration = { + let newDecorations: editorCommon.IModelDeltaDecoration = { range: range, options: { inlineClassName: 'goto-definition-link', From fc263aa2b632863b9be554dc5f7c8857c4750a78 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 4 Oct 2016 10:39:36 +0200 Subject: [PATCH 370/433] use modeId of target, not source, fixes #13057 --- .../browser/goToDeclaration.ts | 49 +++++++------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts index 205ee4a5e2d..2c33ea87f67 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts @@ -9,7 +9,7 @@ import 'vs/css!./goToDeclaration'; import * as nls from 'vs/nls'; import { Throttler } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { MarkedString, textToMarkedString } from 'vs/base/common/htmlContent'; +import { MarkedString } from 'vs/base/common/htmlContent'; import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import Severity from 'vs/base/common/severity'; @@ -18,6 +18,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as browser from 'vs/base/browser/browser'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IEditorService } from 'vs/platform/editor/common/editor'; +import { IModeService } from 'vs/editor/common/services/modeService'; import { IMessageService } from 'vs/platform/message/common/message'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -232,7 +233,8 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC constructor( editor: ICodeEditor, - @IEditorService private editorService: IEditorService + @IEditorService private editorService: IEditorService, + @IModeService private modeService: IModeService ) { this.toUnhook = []; this.decorations = []; @@ -310,21 +312,18 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC startColumn: word.startColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn - }, nls.localize('multipleResults', "Click to show the {0} definitions found.", results.length), false); + }, nls.localize('multipleResults', "Click to show {0} definitions.", results.length)); } // Single result else { let result = results[0]; this.editorService.resolveEditorModel({ resource: result.uri }).then(model => { - let source: string; + let hoverMessage: MarkedString; if (model && model.textEditorModel) { - - let from = Math.max(1, result.range.startLineNumber), - to: number, - editorModel: editorCommon.IModel; - - editorModel = model.textEditorModel; + const editorModel = model.textEditorModel; + let from = Math.max(1, result.range.startLineNumber); + let to: number; // if we have a range, take that into consideration for the "to" position, otherwise fallback to MAX_SOURCE_PREVIEW_LINES if (!Range.isEmpty(result.range)) { @@ -333,7 +332,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC to = Math.min(from + GotoDefinitionWithMouseEditorContribution.MAX_SOURCE_PREVIEW_LINES, editorModel.getLineCount()); } - source = editorModel.getValueInRange({ + let source = editorModel.getValueInRange({ startLineNumber: from, startColumn: 1, endLineNumber: to, @@ -361,6 +360,12 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC if (to < editorModel.getLineCount()) { source += '\n\u2026'; } + + const language = this.modeService.getModeIdByFilenameOrFirstLine(editorModel.uri.fsPath); + hoverMessage = { + language, + value: source + }; } this.addDecoration({ @@ -368,31 +373,15 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC startColumn: word.startColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn - }, source, true); + }, hoverMessage); }); } }).done(undefined, onUnexpectedError); } - private addDecoration(range: editorCommon.IRange, text: string, isCode: boolean): void { - let model = this.editor.getModel(); - if (!model) { - return; - } + private addDecoration(range: editorCommon.IRange, hoverMessage: MarkedString): void { - let hoverMessage: MarkedString = void 0; - if (text && text.trim().length > 0) { - if (isCode) { - hoverMessage = { - language: model.getMode().getId(), - value: text - }; - } else { - hoverMessage = textToMarkedString(text); - } - } - - let newDecorations: editorCommon.IModelDeltaDecoration = { + const newDecorations: editorCommon.IModelDeltaDecoration = { range: range, options: { inlineClassName: 'goto-definition-link', From 9339926361af15a49333e6800befa7d8e8867fab Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 4 Oct 2016 10:01:53 +0200 Subject: [PATCH 371/433] Find in Folder: Null check guard --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index ee2048bddec..63e14845a74 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -670,7 +670,12 @@ export class SearchViewlet extends Viewlet { } public searchInFolder(resource: URI): void { - if (this.contextService.getWorkspace().resource.toString() === resource.toString()) { + const workspace = this.contextService.getWorkspace(); + if (!workspace) { + return; + } + + if (workspace.resource.toString() === resource.toString()) { this.inputPatternIncludes.setValue(''); this.searchWidget.focus(); return; From d01bc20b79ef1fefad9f3a98e1b107323287d48b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 4 Oct 2016 11:04:07 +0200 Subject: [PATCH 372/433] fix #13196 --- .../search/browser/search.contribution.ts | 1 + .../parts/search/browser/searchActions.ts | 14 ++++++++++++ .../parts/search/browser/searchWidget.ts | 22 +++++++++---------- .../parts/search/common/constants.ts | 2 ++ 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/search.contribution.ts b/src/vs/workbench/parts/search/browser/search.contribution.ts index 1a9d178171a..603887028f8 100644 --- a/src/vs/workbench/parts/search/browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/browser/search.contribution.ts @@ -181,6 +181,7 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FocusPre registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleCaseSensitiveAction, Constants.ToggleCaseSensitiveActionId, '', ToggleCaseSensitiveKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleWholeWordAction, Constants.ToggleWholeWordActionId, '', ToggleWholeWordKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleRegexAction, Constants.ToggleRegexActionId, '', ToggleRegexKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.CloseReplaceAction, Constants.CloseReplaceWidgetActionId, '', { primary: KeyCode.Escape }, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.ReplaceInputBoxFocussedKey)), ''); // Configuration const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index d8106725267..a84377313be 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -170,6 +170,20 @@ export class ReplaceInFilesAction extends Action { } } +export class CloseReplaceAction extends Action { + + constructor(id: string, label: string, @IViewletService private viewletService: IViewletService) { + super(id, label); + } + + public run(): TPromise { + let searchAndReplaceWidget = (this.viewletService.getActiveViewlet()).searchAndReplaceWidget; + searchAndReplaceWidget.toggleReplace(false); + searchAndReplaceWidget.focus(); + return TPromise.as(null); + } +} + export class FindInFolderAction extends Action { private resource: URI; diff --git a/src/vs/workbench/parts/search/browser/searchWidget.ts b/src/vs/workbench/parts/search/browser/searchWidget.ts index 3b66bedd7b6..5e6ec175aaa 100644 --- a/src/vs/workbench/parts/search/browser/searchWidget.ts +++ b/src/vs/workbench/parts/search/browser/searchWidget.ts @@ -76,6 +76,7 @@ export class SearchWidget extends Widget { public domNode: HTMLElement; public searchInput: FindInput; private searchInputBoxFocussed: IContextKey; + private replaceInputBoxFocussed: IContextKey; private replaceInput: InputBox; public searchInputFocusTracker: dom.IFocusTracker; @@ -113,6 +114,7 @@ export class SearchWidget extends Widget { this.searchHistory = new HistoryNavigator(); this.replaceActive = Constants.ReplaceActiveKey.bindTo(this.keyBindingService); this.searchInputBoxFocussed = Constants.SearchInputBoxFocussedKey.bindTo(this.keyBindingService); + this.replaceInputBoxFocussed = Constants.ReplaceInputBoxFocussedKey.bindTo(this.keyBindingService); this.render(container, options); } @@ -218,7 +220,7 @@ export class SearchWidget extends Widget { this.searchHistory.add(this.searchInput.getValue()); })); - this.searchInputFocusTracker = dom.trackFocus(this.searchInput.inputBox.inputElement); + this.searchInputFocusTracker = this._register(dom.trackFocus(this.searchInput.inputBox.inputElement)); this._register(this.searchInputFocusTracker.addFocusListener(() => { this.searchInputBoxFocussed.set(true); })); @@ -244,7 +246,13 @@ export class SearchWidget extends Widget { this.replaceActionBar = this._register(new ActionBar(this.replaceContainer)); this.replaceActionBar.push([this.replaceAllAction], { icon: true, label: false }); - this.replaceInputFocusTracker = dom.trackFocus(this.replaceInput.inputElement); + this.replaceInputFocusTracker = this._register(dom.trackFocus(this.replaceInput.inputElement)); + this._register(this.replaceInputFocusTracker.addFocusListener(() => { + this.replaceInputBoxFocussed.set(true); + })); + this._register(this.replaceInputFocusTracker.addBlurListener(() => { + this.replaceInputBoxFocussed.set(false); + })); } triggerReplaceAll(): TPromise { @@ -321,10 +329,6 @@ export class SearchWidget extends Widget { case KeyCode.Enter: this.submitSearch(); return; - case KeyCode.Escape: - this.onToggleReplaceButton(); - this.searchInput.focus(); - return; default: return; } @@ -340,12 +344,6 @@ export class SearchWidget extends Widget { this.setReplaceAllActionState(false); this.replaceAllAction.searchWidget= null; this.replaceActionBar = null; - if (this.searchInputFocusTracker) { - this.searchInputFocusTracker.dispose(); - } - if (this.replaceInputFocusTracker) { - this.replaceInputFocusTracker.dispose(); - } super.dispose(); } } diff --git a/src/vs/workbench/parts/search/common/constants.ts b/src/vs/workbench/parts/search/common/constants.ts index 678d59c02dd..26a5f3bf3bb 100644 --- a/src/vs/workbench/parts/search/common/constants.ts +++ b/src/vs/workbench/parts/search/common/constants.ts @@ -10,9 +10,11 @@ export const VIEWLET_ID = 'workbench.view.search'; export const ToggleCaseSensitiveActionId = 'toggleSearchCaseSensitive'; export const ToggleWholeWordActionId = 'toggleSearchWholeWord'; export const ToggleRegexActionId = 'toggleSearchRegex'; +export const CloseReplaceWidgetActionId = 'closeReplaceInFilesWidget'; export const SearchViewletVisibleKey = new RawContextKey('searchViewletVisible', true); export const InputBoxFocussedKey = new RawContextKey('inputBoxFocus', false); export const SearchInputBoxFocussedKey = new RawContextKey('searchInputBoxFocus', false); +export const ReplaceInputBoxFocussedKey = new RawContextKey('replaceInputBoxFocus', false); export const ReplaceActiveKey= new RawContextKey('replaceActive', false); \ No newline at end of file From 1fdc366e15829497e37a3cc93b2c06424cd91d4a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 11:12:13 +0200 Subject: [PATCH 373/433] smoother title control update when closing --- .../workbench/browser/parts/editor/sideBySideEditorControl.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts b/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts index 29021184ec0..84963de008a 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts @@ -223,8 +223,9 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti POSITIONS.forEach(position => { const titleAreaControl = this.getTitleAreaControl(position); const context = this.stacks.groupAt(position); + const hasContext = titleAreaControl.hasContext(); titleAreaControl.setContext(context); - if (!context && titleAreaControl.hasContext()) { + if (!context && hasContext) { titleAreaControl.refresh(); // clear out the control if the context is no longer present and there was a context } }); From 9e91f0ad9dbeb30ddd0ec07101a89343a736fcb3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 4 Oct 2016 11:32:43 +0200 Subject: [PATCH 374/433] fall back to current language, fixes #11331 --- .../hover/browser/modesContentHover.ts | 63 ++++++++++--------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/src/vs/editor/contrib/hover/browser/modesContentHover.ts b/src/vs/editor/contrib/hover/browser/modesContentHover.ts index f118c3fc3c4..4789f0080d0 100644 --- a/src/vs/editor/contrib/hover/browser/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/browser/modesContentHover.ts @@ -7,22 +7,22 @@ import 'vs/css!vs/base/browser/ui/progressbar/progressbar'; import * as nls from 'vs/nls'; import URI from 'vs/base/common/uri'; -import {onUnexpectedError} from 'vs/base/common/errors'; -import {$} from 'vs/base/browser/dom'; -import {TPromise} from 'vs/base/common/winjs.base'; -import {renderMarkedString} from 'vs/base/browser/htmlContentRenderer'; -import {IOpenerService, NullOpenerService} from 'vs/platform/opener/common/opener'; -import {IModeService} from 'vs/editor/common/services/modeService'; -import {Range} from 'vs/editor/common/core/range'; -import {Position} from 'vs/editor/common/core/position'; -import {IRange} from 'vs/editor/common/editorCommon'; -import {HoverProviderRegistry, Hover} from 'vs/editor/common/modes'; -import {tokenizeToString} from 'vs/editor/common/modes/textToHtmlTokenizer'; -import {ICodeEditor} from 'vs/editor/browser/editorBrowser'; -import {getHover} from '../common/hover'; -import {HoverOperation, IHoverComputer} from './hoverOperation'; -import {ContentHoverWidget} from './hoverWidgets'; -import {textToMarkedString, MarkedString} from 'vs/base/common/htmlContent'; +import { onUnexpectedError } from 'vs/base/common/errors'; +import { $ } from 'vs/base/browser/dom'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { renderMarkedString } from 'vs/base/browser/htmlContentRenderer'; +import { IOpenerService, NullOpenerService } from 'vs/platform/opener/common/opener'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import { Range } from 'vs/editor/common/core/range'; +import { Position } from 'vs/editor/common/core/position'; +import { IRange } from 'vs/editor/common/editorCommon'; +import { HoverProviderRegistry, Hover } from 'vs/editor/common/modes'; +import { tokenizeToString } from 'vs/editor/common/modes/textToHtmlTokenizer'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { getHover } from '../common/hover'; +import { HoverOperation, IHoverComputer } from './hoverOperation'; +import { ContentHoverWidget } from './hoverWidgets'; +import { textToMarkedString, MarkedString } from 'vs/base/common/htmlContent'; class ModesContentComputer implements IHoverComputer { @@ -58,7 +58,7 @@ class ModesContentComputer implements IHoverComputer { } public computeSync(): Hover[] { - var result:Hover[] = []; + var result: Hover[] = []; var lineNumber = this._range.startLineNumber; if (lineNumber > this._editor.getModel().getLineCount()) { @@ -67,7 +67,7 @@ class ModesContentComputer implements IHoverComputer { } var hasHoverContent = (contents: MarkedString | MarkedString[]) => { - return contents && (!Array.isArray(contents) || ( contents).length > 0); + return contents && (!Array.isArray(contents) || (contents).length > 0); }; var lineDecorations = this._editor.getLineDecorations(lineNumber); @@ -77,15 +77,15 @@ class ModesContentComputer implements IHoverComputer { var endColumn = (d.range.endLineNumber === lineNumber) ? d.range.endColumn : maxColumn; if (startColumn <= this._range.startColumn && this._range.endColumn <= endColumn && hasHoverContent(d.options.hoverMessage)) { - var obj:Hover = { + var obj: Hover = { contents: [], range: new Range(this._range.startLineNumber, startColumn, this._range.startLineNumber, endColumn) }; if (d.options.hoverMessage) { if (Array.isArray(d.options.hoverMessage)) { - obj.contents = obj.contents.concat( d.options.hoverMessage); + obj.contents = obj.contents.concat(d.options.hoverMessage); } else { - obj.contents.push( d.options.hoverMessage); + obj.contents.push(d.options.hoverMessage); } } result.push(obj); @@ -126,7 +126,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget { private _lastRange: Range; private _computer: ModesContentComputer; private _hoverOperation: HoverOperation; - private _highlightDecorations:string[]; + private _highlightDecorations: string[]; private _isChangingDecorations: boolean; private _openerService: IOpenerService; private _modeService: IModeService; @@ -143,9 +143,9 @@ export class ModesContentHoverWidget extends ContentHoverWidget { this._hoverOperation = new HoverOperation( this._computer, - (result:Hover[]) => this._withResult(result, true), + (result: Hover[]) => this._withResult(result, true), null, - (result:any) => this._withResult(result, false) + (result: any) => this._withResult(result, false) ); } @@ -215,12 +215,12 @@ export class ModesContentHoverWidget extends ContentHoverWidget { this._isChangingDecorations = false; } - public _withResult(result: Hover[], complete:boolean): void { + public _withResult(result: Hover[], complete: boolean): void { this._messages = result; if (this._lastRange && this._messages.length > 0) { this._renderMessages(this._lastRange, this._messages); - } else if(complete) { + } else if (complete) { this.hide(); } } @@ -248,10 +248,15 @@ export class ModesContentHoverWidget extends ContentHoverWidget { this._openerService.open(URI.parse(content)).then(void 0, onUnexpectedError); }, codeBlockRenderer: (languageAlias, value): string | TPromise => { - // In markdown, it is possible that we stumble upon language aliases (e.g. js instead of javascript) - const modeId = this._modeService.getModeIdForLanguageName(languageAlias); + // In markdown, + // it is possible that we stumble upon language aliases (e.g.js instead of javascript) + // it is possible no alias is given in which case we fall back to the current editor lang + const modeId = languageAlias + ? this._modeService.getModeIdForLanguageName(languageAlias) + : this._editor.getModel().getModeId(); + return this._modeService.getOrCreateMode(modeId).then(_ => { - return `
${ tokenizeToString(value, modeId) }
`; + return `
${tokenizeToString(value, modeId)}
`; }); } }); From f6f188cea819e8b51a17a531d0bd5ce29a043ac3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 11:36:57 +0200 Subject: [PATCH 375/433] allow to contribute to the tab context menu --- .../platform/actions/browser/menusExtensionPoint.ts | 1 + src/vs/platform/actions/common/actions.ts | 3 ++- .../workbench/browser/parts/editor/titleControl.ts | 13 +++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/actions/browser/menusExtensionPoint.ts b/src/vs/platform/actions/browser/menusExtensionPoint.ts index 3eb906cc83d..25be267fc03 100644 --- a/src/vs/platform/actions/browser/menusExtensionPoint.ts +++ b/src/vs/platform/actions/browser/menusExtensionPoint.ts @@ -30,6 +30,7 @@ namespace schema { case 'editor/title': return MenuId.EditorTitle; case 'editor/context': return MenuId.EditorContext; case 'explorer/context': return MenuId.ExplorerContext; + case 'editor/tab': return MenuId.EditorTab; } } diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 250504ec6eb..3de63bfcab8 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -39,7 +39,8 @@ export interface IMenuItem { export enum MenuId { EditorTitle = 1, EditorContext = 2, - ExplorerContext = 3 + ExplorerContext = 3, + EditorTab = 4 } export const IMenuService = createDecorator('menuService'); diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 436e2b5b14d..eda18501325 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -417,6 +417,12 @@ export abstract class TitleControl implements ITitleAreaControl { } protected onContextMenu(identifier: IEditorIdentifier, e: Event, node: HTMLElement): void { + + // Update the resource context + const currentContext = this.resourceContext.get(); + this.resourceContext.set(identifier.editor && getResource(identifier.editor)); + + // Find target anchor let anchor: HTMLElement | { x: number, y: number } = node; if (e instanceof MouseEvent) { const event = new StandardMouseEvent(e); @@ -434,6 +440,9 @@ export abstract class TitleControl implements ITitleAreaControl { } return null; + }, + onHide: (cancel) => { + this.resourceContext.set(currentContext); // restore previous context } }); } @@ -462,6 +471,10 @@ export abstract class TitleControl implements ITitleAreaControl { actions.push(new Separator(), this.pinEditorAction); } + const titleBarMenu = this.menuService.createMenu(MenuId.EditorTab, this.contextKeyService); + fillInActions(titleBarMenu, actions); + titleBarMenu.dispose(); // not needed anymore + return actions; } From e499b26fb0fd701973e932e409ddecc68c3e83c8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 4 Oct 2016 11:38:36 +0200 Subject: [PATCH 376/433] fix #12933 --- .../workbench/parts/tasks/electron-browser/task.contribution.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index dc5319eb7cb..05d43600e1f 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -440,6 +440,7 @@ class StatusBarItem implements IStatusbarItem { Dom.addClass(label, 'task-statusbar-item-label'); element.appendChild(label); + element.title = nls.localize('problems', "Problems"); Dom.addClass(error, 'task-statusbar-item-label-error'); error.innerHTML = '0'; From 512ce31500eac26a6f661fc883c926abfc33a788 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 4 Oct 2016 09:59:11 +0200 Subject: [PATCH 377/433] zoneWidget: introduce frameWidth option --- .../contrib/zoneWidget/browser/zoneWidget.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts index d7a0e78d845..2101a009c80 100644 --- a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts @@ -18,19 +18,20 @@ export interface IOptions { showFrame?: boolean; showArrow?: boolean; frameColor?: string; + frameWidth?: number; className?: string; isAccessible?: boolean; isResizeable?: boolean; } -var defaultOptions: IOptions = { +const defaultOptions: IOptions = { showArrow: true, showFrame: true, frameColor: '', className: '' }; -var WIDGET_ID = 'vs.editor.contrib.zoneWidget'; +const WIDGET_ID = 'vs.editor.contrib.zoneWidget'; export class ViewZoneDelegate implements IViewZone { @@ -112,7 +113,7 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { } this._disposables.add(this.editor.onDidLayoutChange((info: EditorLayoutInfo) => { - var width = this._getWidth(info); + const width = this._getWidth(info); this.domNode.style.width = width + 'px'; this._onWidth(width); })); @@ -263,10 +264,11 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { if (this.options.showFrame) { + const width = this.options.frameWidth ? this.options.frameWidth : frameThickness; this.container.style.borderTopColor = this.options.frameColor; this.container.style.borderBottomColor = this.options.frameColor; - this.container.style.borderTopWidth = frameThickness + 'px'; - this.container.style.borderBottomWidth = frameThickness + 'px'; + this.container.style.borderTopWidth = width + 'px'; + this.container.style.borderBottomWidth = width + 'px'; } let containerHeight = heightInLines * lineHeight - this._decoratingElementsHeight(); @@ -280,7 +282,7 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { this.editor.setSelection(where); // Reveal the line above or below the zone widget, to get the zone widget in the viewport - var revealLineNumber = Math.min(this.editor.getModel().getLineCount(), Math.max(1, where.endLineNumber + 1)); + const revealLineNumber = Math.min(this.editor.getModel().getLineCount(), Math.max(1, where.endLineNumber + 1)); this.editor.revealLine(revealLineNumber); } @@ -352,4 +354,3 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { return this.editor.getLayoutInfo().width; } } - From 0e3e5bd8ff8cce783aebadbdbaa3440686e2e853 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 4 Oct 2016 10:08:11 +0200 Subject: [PATCH 378/433] debug: add hit condition to breakpoint model --- .../debug/browser/debugEditorModelManager.ts | 37 ++++++++++--------- src/vs/workbench/parts/debug/common/debug.ts | 3 ++ .../parts/debug/common/debugModel.ts | 12 +++--- .../debug/electron-browser/debugService.ts | 6 +-- .../debug/electron-browser/debugViewer.ts | 4 +- 5 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts index 3d9510afb95..c6237974b7a 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts @@ -200,11 +200,12 @@ export class DebugEditorModelManager implements IWorkbenchContribution { const data: IRawBreakpoint[] = []; - const enabledAndConditions: { [key: number]: { enabled: boolean, condition: string } } = {}; + const lineToBreakpointDataMap: { [key: number]: { enabled: boolean, condition: string, hitCondition: string } } = {}; this.debugService.getModel().getBreakpoints().filter(bp => bp.source.uri.toString() === modelUrlStr).forEach(bp => { - enabledAndConditions[bp.lineNumber] = { + lineToBreakpointDataMap[bp.lineNumber] = { enabled: bp.enabled, - condition: bp.condition + condition: bp.condition, + hitCondition: bp.hitCondition }; }); @@ -217,8 +218,9 @@ export class DebugEditorModelManager implements IWorkbenchContribution { data.push({ uri: modelUrl, lineNumber: decorationRange.startLineNumber, - enabled: enabledAndConditions[modelData.breakpointLines[i]].enabled, - condition: enabledAndConditions[modelData.breakpointLines[i]].condition + enabled: lineToBreakpointDataMap[modelData.breakpointLines[i]].enabled, + condition: lineToBreakpointDataMap[modelData.breakpointLines[i]].condition, + hitCondition: lineToBreakpointDataMap[modelData.breakpointLines[i]].hitCondition }); } } @@ -280,7 +282,7 @@ export class DebugEditorModelManager implements IWorkbenchContribution { let result = (!breakpoint.enabled || !activated) ? DebugEditorModelManager.BREAKPOINT_DISABLED_DECORATION : debugActive && modelData && modelData.dirty && !breakpoint.verified ? DebugEditorModelManager.BREAKPOINT_DIRTY_DECORATION : debugActive && !breakpoint.verified ? DebugEditorModelManager.BREAKPOINT_UNVERIFIED_DECORATION : - !breakpoint.condition ? DebugEditorModelManager.BREAKPOINT_DECORATION : null; + !breakpoint.condition && !breakpoint.hitCondition ? DebugEditorModelManager.BREAKPOINT_DECORATION : null; if (result && breakpoint.message) { result = objects.clone(result); @@ -291,19 +293,20 @@ export class DebugEditorModelManager implements IWorkbenchContribution { return result; } - if (!session || session.configuration.capabilities.supportsConditionalBreakpoints) { - const mode = modelData ? modelData.model.getMode() : null; - const modeId = mode ? mode.getId() : ''; - const glyphMarginHoverMessage = `\`\`\`${modeId}\n${ breakpoint.condition }\`\`\``; - - return { - glyphMarginClassName: 'debug-breakpoint-conditional-glyph', - glyphMarginHoverMessage, - stickiness: editorcommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges - }; + if (session && !session.configuration.capabilities.supportsConditionalBreakpoints) { + return DebugEditorModelManager.BREAKPOINT_UNSUPPORTED_DECORATION; } + + const mode = modelData ? modelData.model.getMode() : null; + const modeId = mode ? mode.getId() : ''; + const condition = breakpoint.condition ? breakpoint.condition : breakpoint.hitCondition; + const glyphMarginHoverMessage = `\`\`\`${modeId}\n${ condition }\`\`\``; - return DebugEditorModelManager.BREAKPOINT_UNSUPPORTED_DECORATION; + return { + glyphMarginClassName: 'debug-breakpoint-conditional-glyph', + glyphMarginHoverMessage, + stickiness: editorcommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges + }; } // editor decorations diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 4e87d10c03a..4e2719cd7d8 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -130,6 +130,7 @@ export interface IRawBreakpoint { lineNumber: number; enabled?: boolean; condition?: string; + hitCondition?: string; } export interface IBreakpoint extends IEnablement { @@ -137,6 +138,7 @@ export interface IBreakpoint extends IEnablement { lineNumber: number; desiredLineNumber: number; condition: string; + hitCondition: string; verified: boolean; idFromAdapter: number; message: string; @@ -146,6 +148,7 @@ export interface IFunctionBreakpoint extends IEnablement { name: string; verified: boolean; idFromAdapter: number; + hitCondition: string; } export interface IExceptionBreakpoint extends IEnablement { diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index b4cac7501a4..9f55504dd9d 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -410,7 +410,8 @@ export class Breakpoint implements debug.IBreakpoint { public source: Source, public desiredLineNumber: number, public enabled: boolean, - public condition: string + public condition: string, + public hitCondition: string ) { if (enabled === undefined) { this.enabled = true; @@ -431,7 +432,7 @@ export class FunctionBreakpoint implements debug.IFunctionBreakpoint { public verified: boolean; public idFromAdapter: number; - constructor(public name: string, public enabled: boolean) { + constructor(public name: string, public enabled: boolean, public hitCondition: string) { this.verified = false; this.id = uuid.generateUuid(); } @@ -563,7 +564,7 @@ export class Model implements debug.IModel { public addBreakpoints(rawData: debug.IRawBreakpoint[]): void { this.breakpoints = this.breakpoints.concat(rawData.map(rawBp => - new Breakpoint(new Source(Source.toRawSource(rawBp.uri, this)), rawBp.lineNumber, rawBp.enabled, rawBp.condition))); + new Breakpoint(new Source(Source.toRawSource(rawBp.uri, this)), rawBp.lineNumber, rawBp.enabled, rawBp.condition, rawBp.hitCondition))); this.breakpointsActivated = true; this._onDidChangeBreakpoints.fire(); } @@ -612,17 +613,18 @@ export class Model implements debug.IModel { } public addFunctionBreakpoint(functionName: string): void { - this.functionBreakpoints.push(new FunctionBreakpoint(functionName, true)); + this.functionBreakpoints.push(new FunctionBreakpoint(functionName, true, null)); this._onDidChangeBreakpoints.fire(); } - public updateFunctionBreakpoints(data: { [id: string]: { name?: string, verified?: boolean; id?: number } }): void { + public updateFunctionBreakpoints(data: { [id: string]: { name?: string, verified?: boolean; id?: number; hitCondition?: string } }): void { this.functionBreakpoints.forEach(fbp => { const fbpData = data[fbp.getId()]; if (fbpData) { fbp.name = fbpData.name || fbp.name; fbp.verified = fbpData.verified; fbp.idFromAdapter = fbpData.id; + fbp.hitCondition = fbpData.hitCondition; } }); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index d1d67e57b1a..ae9288f4147 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -359,7 +359,7 @@ export class DebugService implements debug.IDebugService { try { result = JSON.parse(this.storageService.get(DEBUG_BREAKPOINTS_KEY, StorageScope.WORKSPACE, '[]')).map((breakpoint: any) => { return new model.Breakpoint(new Source(breakpoint.source.raw ? breakpoint.source.raw : { path: uri.parse(breakpoint.source.uri).fsPath, name: breakpoint.source.name }), - breakpoint.desiredLineNumber || breakpoint.lineNumber, breakpoint.enabled, breakpoint.condition); + breakpoint.desiredLineNumber || breakpoint.lineNumber, breakpoint.enabled, breakpoint.condition, breakpoint.hitCondition); }); } catch (e) { } @@ -370,7 +370,7 @@ export class DebugService implements debug.IDebugService { let result: debug.IFunctionBreakpoint[]; try { result = JSON.parse(this.storageService.get(DEBUG_FUNCTION_BREAKPOINTS_KEY, StorageScope.WORKSPACE, '[]')).map((fb: any) => { - return new model.FunctionBreakpoint(fb.name, fb.enabled); + return new model.FunctionBreakpoint(fb.name, fb.enabled, fb.hitCondition); }); } catch (e) { } @@ -1045,7 +1045,7 @@ export class DebugService implements debug.IDebugService { return this.session.setBreakpoints({ source: rawSource, lines: breakpointsToSend.map(bp => bp.desiredLineNumber), - breakpoints: breakpointsToSend.map(bp => ({ line: bp.desiredLineNumber, condition: bp.condition })), + breakpoints: breakpointsToSend.map(bp => ({ line: bp.desiredLineNumber, condition: bp.condition, hitCondition: bp.hitCondition })), sourceModified }).then(response => { if (!response || !response.body) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 6f43336463f..34ba1a8f8bc 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -1190,8 +1190,8 @@ export class BreakpointsRenderer implements tree.IRenderer { if (breakpoint.message) { data.breakpoint.title = breakpoint.message; } - } else if (breakpoint.condition) { - data.breakpoint.title = breakpoint.condition; + } else if (breakpoint.condition || breakpoint.hitCondition) { + data.breakpoint.title = breakpoint.condition ? breakpoint.condition : breakpoint.hitCondition; } } From 82b87c760d8cc79bdd93d4e7259310124882fe4d Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 4 Oct 2016 10:51:11 +0200 Subject: [PATCH 379/433] SelectBox --- src/vs/base/browser/ui/actionbar/actionbar.ts | 64 +++-------- .../base/browser/ui/selectBox/selectBox.css | 26 +++++ src/vs/base/browser/ui/selectBox/selectBox.ts | 103 ++++++++++++++++++ .../electron-browser/media/workbench.css | 23 +--- 4 files changed, 145 insertions(+), 71 deletions(-) create mode 100644 src/vs/base/browser/ui/selectBox/selectBox.css create mode 100644 src/vs/base/browser/ui/selectBox/selectBox.ts diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index 8c6d9466041..806341ed3f6 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -10,6 +10,7 @@ import nls = require('vs/nls'); import lifecycle = require('vs/base/common/lifecycle'); import {Promise} from 'vs/base/common/winjs.base'; import {Builder, $} from 'vs/base/browser/builder'; +import {SelectBox} from 'vs/base/browser/ui/selectBox/selectBox'; import platform = require('vs/base/common/platform'); import {IAction, IActionRunner, Action, IActionChangeEvent, ActionRunner} from 'vs/base/common/actions'; import DOM = require('vs/base/browser/dom'); @@ -661,39 +662,25 @@ export class ActionBar extends EventEmitter implements IActionRunner { } export class SelectActionItem extends BaseActionItem { - private select: HTMLSelectElement; - private options: string[]; - private selected: number; + private selectBox: SelectBox; protected toDispose: lifecycle.IDisposable[]; constructor(ctx: any, action: IAction, options: string[], selected: number) { super(ctx, action); - - this.select = document.createElement('select'); - this.select.className = 'action-bar-select'; - - this.options = options; - this.selected = selected; + this.selectBox = new SelectBox(options, selected); this.toDispose = []; - + this.toDispose.push(this.selectBox); this.registerListeners(); } public setOptions(options: string[], selected: number): void { - this.options = options; - if (selected >= 0) { - this.selected = selected; - } else if (this.selected < 0 || this.selected > this.options.length) { - this.selected = 0; - } - - this.doSetOptions(); + this.selectBox.setOptions(options, selected); } private registerListeners(): void { - this.toDispose.push(DOM.addStandardDisposableListener(this.select, 'change', (e) => { - this.actionRunner.run(this._action, this.getActionContext(e.target.value)).done(); + this.toDispose.push(this.selectBox.onDidSelect(selected => { + this.actionRunner.run(this._action, this.getActionContext(selected)).done(); })); } @@ -702,50 +689,27 @@ export class SelectActionItem extends BaseActionItem { } public focus(): void { - if (this.select) { - this.select.focus(); + if (this.selectBox) { + this.selectBox.focus(); } } public set enabled(value: boolean) { - this.select.disabled = !value; + this.selectBox.enabled = value; } public blur(): void { - if (this.select) { - this.select.blur(); + if (this.selectBox) { + this.selectBox.blur(); } } public render(container: HTMLElement): void { - DOM.addClass(container, 'select-container'); - container.appendChild(this.select); - this.doSetOptions(); + this.selectBox.render(container); } protected getSelected(): string { - return this.options && this.selected >= 0 && this.selected < this.options.length ? this.options[this.selected] : null; - } - - private doSetOptions(): void { - this.select.options.length = 0; - - this.options.forEach((option) => { - this.select.add(this.createOption(option)); - }); - - if (this.selected >= 0) { - this.select.selectedIndex = this.selected; - this.select.title = this.options[this.selected]; - } - } - - private createOption(value: string): HTMLOptionElement { - let option = document.createElement('option'); - option.value = value; - option.text = value; - - return option; + return this.selectBox.getSelected(); } public dispose(): void { diff --git a/src/vs/base/browser/ui/selectBox/selectBox.css b/src/vs/base/browser/ui/selectBox/selectBox.css new file mode 100644 index 00000000000..d54fc5b05bf --- /dev/null +++ b/src/vs/base/browser/ui/selectBox/selectBox.css @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-workbench .select-box { + width: 100%; + height: 20px; +} + +.vs .monaco-workbench .select-box { + background-color: white; + border-color: #CECECE; +} + +.vs-dark .monaco-workbench .select-box { + background-color: #3C3C3C; + border-color: #3C3C3C; + color: rgb(204, 204, 204); +} + +.hc-black .monaco-workbench .select-box { + background-color: #3C3C3C; + border-color: #3C3C3C; + color: white; +} diff --git a/src/vs/base/browser/ui/selectBox/selectBox.ts b/src/vs/base/browser/ui/selectBox/selectBox.ts new file mode 100644 index 00000000000..bd08f4c1693 --- /dev/null +++ b/src/vs/base/browser/ui/selectBox/selectBox.ts @@ -0,0 +1,103 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./selectBox'; + +import {IDisposable, dispose} from 'vs/base/common/lifecycle'; +import Event, {Emitter} from 'vs/base/common/event'; +import {Widget} from 'vs/base/browser/ui/widget'; +import * as dom from 'vs/base/browser/dom'; + +export class SelectBox extends Widget { + + private select: HTMLSelectElement; + private options: string[]; + private selected: number; + private _onDidSelect: Emitter; + private toDispose: IDisposable[]; + + constructor(options: string[], selected: number) { + super(); + + this.select = document.createElement('select'); + this.select.className = 'select-box'; + + this.options = options; + this.selected = selected; + this.toDispose = []; + this._onDidSelect = new Emitter(); + + this.toDispose.push(dom.addStandardDisposableListener(this.select, 'change', (e) => { + this._onDidSelect.fire(e.target.value); + })); + } + + public get onDidSelect(): Event { + return this._onDidSelect.event; + } + + public setOptions(options: string[], selected: number): void { + this.options = options; + if (selected >= 0) { + this.selected = selected; + } else if (this.selected < 0 || this.selected > this.options.length) { + this.selected = 0; + } + + this.doSetOptions(); + } + + public focus(): void { + if (this.select) { + this.select.focus(); + } + } + + public set enabled(value: boolean) { + this.select.disabled = !value; + } + + public blur(): void { + if (this.select) { + this.select.blur(); + } + } + + public render(container: HTMLElement): void { + dom.addClass(container, 'select-container'); + container.appendChild(this.select); + this.doSetOptions(); + } + + public getSelected(): string { + return this.options && this.selected >= 0 && this.selected < this.options.length ? this.options[this.selected] : null; + } + + private doSetOptions(): void { + this.select.options.length = 0; + + this.options.forEach((option) => { + this.select.add(this.createOption(option)); + }); + + if (this.selected >= 0) { + this.select.selectedIndex = this.selected; + this.select.title = this.options[this.selected]; + } + } + + private createOption(value: string): HTMLOptionElement { + let option = document.createElement('option'); + option.value = value; + option.text = value; + + return option; + } + + public dispose(): void { + this.toDispose = dispose(this.toDispose); + super.dispose(); + } +} \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/media/workbench.css b/src/vs/workbench/electron-browser/media/workbench.css index 101ff0af2ab..805433dba10 100644 --- a/src/vs/workbench/electron-browser/media/workbench.css +++ b/src/vs/workbench/electron-browser/media/workbench.css @@ -29,13 +29,11 @@ box-sizing: border-box; } -.monaco-workbench .action-bar-select { - width: 100%; - height: 20px; +.monaco-workbench .monaco-action-bar .select-box { margin-top: 8px; /* Center the select box */ } -.monaco-workbench.windows .action-bar-select { +.monaco-workbench.windows .monaco-action-bar .select-box { margin-top: 7px; /* Center the select box */ } @@ -76,11 +74,6 @@ background-color: #E1E1E1; } -.vs .monaco-workbench .action-bar-select { - background-color: white; - border-color: #CECECE; -} - /* ---------- Dark Theme ---------- */ .vs-dark .monaco-workbench { @@ -111,12 +104,6 @@ .vs-dark .monaco-workbench .stacked-view .action-label { color: inherit; } .vs-dark .monaco-workbench .stacked-view .action-label:hover { color: #3399FF; } -.vs-dark .monaco-workbench .action-bar-select { - background-color: #3C3C3C; - border-color: #3C3C3C; - color: rgb(204, 204, 204); -} - /* ---------- HC Theme ---------- */ .hc-black .monaco-workbench { color: #FFF; background-color: #000; } @@ -136,9 +123,3 @@ .hc-black .monaco-workbench .monaco-action-bar .action-item.disabled .action-label.disabled { opacity: .4; } - -.hc-black .monaco-workbench .action-bar-select { - background-color: #3C3C3C; - border-color: #3C3C3C; - color: white; -} \ No newline at end of file From 134a1ec223e8d017a864690dfed40e76f2236de1 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 4 Oct 2016 11:39:35 +0200 Subject: [PATCH 380/433] breakpoint widget: support hit condition editing --- .../parts/debug/browser/breakpointWidget.ts | 36 +++++++++++++++---- .../debug/browser/media/breakpointWidget.css | 20 +++++++++-- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/breakpointWidget.ts b/src/vs/workbench/parts/debug/browser/breakpointWidget.ts index dc13999eeea..35354848338 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/parts/debug/browser/breakpointWidget.ts @@ -9,6 +9,7 @@ import async = require('vs/base/common/async'); import errors = require('vs/base/common/errors'); import {KeyCode, KeyMod} from 'vs/base/common/keyCodes'; import platform = require('vs/base/common/platform'); +import {SelectBox} from 'vs/base/browser/ui/selectBox/selectBox'; import lifecycle = require('vs/base/common/lifecycle'); import dom = require('vs/base/browser/dom'); import {InputBox} from 'vs/base/browser/ui/inputbox/inputBox'; @@ -33,15 +34,25 @@ export class BreakpointWidget extends ZoneWidget { private inputBox: InputBox; private toDispose: lifecycle.IDisposable[]; private breakpointWidgetVisible: IContextKey; + private expressionPlaceholder: string; + private expressionAriaLabel: string; + private hitCountPlaceholder: string; + private hitCountAriaLabel: string; + private hitCountContext: boolean; constructor(editor: editorbrowser.ICodeEditor, private lineNumber: number, @IContextViewService private contextViewService: IContextViewService, @debug.IDebugService private debugService: debug.IDebugService, @IContextKeyService contextKeyService: IContextKeyService ) { - super(editor, { showFrame: true, showArrow: false }); + super(editor, { showFrame: true, showArrow: false, frameColor: '#007ACC', frameWidth: 1 }); this.toDispose = []; + this.expressionPlaceholder = nls.localize('breakpointWidgetExpressionPlaceholder', "Breakpoint on line {0} will only stop if this expression is true.", this.lineNumber); + this.expressionAriaLabel = nls.localize('breakpointWidgetAriaLabel', "Type the breakpoint condition for line {0}. The program will only stop here if this condition is true. Press Enter to accept or Escape to cancel.", this.lineNumber); + this.hitCountPlaceholder = nls.localize('breakpointWidgetHitCountPlaceholder', "Breakpoint on line {0} will only stop if the hit count condition is true.", this.lineNumber); + this.hitCountAriaLabel = nls.localize('breakpointWidgetHitCountAriaLabel', "Type the breakpoint hit count condition for line {0}. The program will only stop here if the hit count is met. Press Enter to accept or Escape to cancel.", this.lineNumber); + this.create(); this.breakpointWidgetVisible = CONTEXT_BREAKPOINT_WIDGET_VISIBLE.bindTo(contextKeyService); this.breakpointWidgetVisible.set(true); @@ -63,10 +74,19 @@ export class BreakpointWidget extends ZoneWidget { const uri = this.editor.getModel().uri; const breakpoint = this.debugService.getModel().getBreakpoints().filter(bp => bp.lineNumber === this.lineNumber && bp.source.uri.toString() === uri.toString()).pop(); + const selectBox = new SelectBox([nls.localize('expression', "Expression"), nls.localize('hitCount', "Hit Count")], 0); + selectBox.render(dom.append(container, $('.breakpoint-select-container'))); + selectBox.onDidSelect(e => { + this.hitCountContext = e === 'Hit Count'; + this.inputBox.setAriaLabel(this.hitCountContext ? this.hitCountAriaLabel : this.expressionAriaLabel); + this.inputBox.setPlaceHolder(this.hitCountContext ? this.hitCountPlaceholder : this.expressionPlaceholder); + this.inputBox.value = (this.hitCountContext && breakpoint && breakpoint.hitCondition) ? breakpoint.hitCondition : breakpoint && breakpoint.condition ? breakpoint.condition : ''; + }); + const inputBoxContainer = dom.append(container, $('.inputBoxContainer')); this.inputBox = new InputBox(inputBoxContainer, this.contextViewService, { - placeholder: nls.localize('breakpointWidgetPlaceholder', "Breakpoint on line {0} will only stop if this condition is true.", this.lineNumber), - ariaLabel: nls.localize('breakpointWidgetAriaLabel', "Type the breakpoint condition for line {0}. The program will only stop here if this condition is true. Press Enter to accept or Escape to cancel.") + placeholder: this.expressionPlaceholder, + ariaLabel: this.expressionAriaLabel }); this.toDispose.push(this.inputBox); @@ -80,12 +100,16 @@ export class BreakpointWidget extends ZoneWidget { if (!disposed) { disposed = true; if (success) { - const raw = { + const raw: debug.IRawBreakpoint = { uri, lineNumber: this.lineNumber, - enabled: true, - condition: this.inputBox.value + enabled: true }; + if (this.hitCountContext) { + raw.hitCondition = this.inputBox.value; + } else { + raw.condition = this.inputBox.value; + } // if there is already a breakpoint on this location - remove it. const oldBreakpoint = this.debugService.getModel().getBreakpoints() diff --git a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css index 65c0f1f320e..0fb6516a856 100644 --- a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css +++ b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css @@ -4,9 +4,25 @@ *--------------------------------------------------------------------------------------------*/ .monaco-editor .zone-widget .zone-widget-container.breakpoint-widget { - border-top-color: #E89208; - border-bottom-color: #E89208; height: 30px !important; + display: flex; + background-color: var(--input-bgcolor); +} + +.monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .breakpoint-select-container { + display: flex; + justify-content: center; + flex-direction: column; + padding: 0 10px; +} + +.monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .breakpoint-select-container .select-box { + margin-top: 0px; + border-color: rgba(128, 128, 128, 0.35); +} + +.monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .inputBoxContainer { + flex: 1; } .monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .monaco-inputbox { From 4dd18c1c7fc6abbed74ac55c52bd729242186ff9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 12:00:44 +0200 Subject: [PATCH 381/433] do not unset mode from picker --- src/vs/workbench/browser/parts/editor/editorStatus.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index bf4c3ed2389..381aa926f23 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -760,6 +760,14 @@ export class ChangeModeAction extends Action { return this.quickOpenService.pick(picks, { placeHolder: nls.localize('pickLanguage', "Select Language Mode") }).then(language => { if (language) { + + // User decided to permanently configure associations, return right after + if (language === configureModeAssociations) { + this.configureFileAssociation(fileinput.getResource()); + return; + } + + // Change mode for active editor activeEditor = this.editorService.getActiveEditor(); if (activeEditor instanceof BaseTextEditor) { const editorWidget = activeEditor.getControl(); @@ -780,8 +788,6 @@ export class ChangeModeAction extends Action { let mode: TPromise; if (language === autoDetectMode) { mode = this.modeService.getOrCreateModeByFilenameOrFirstLine(getUntitledOrFileResource(activeEditor.input, true).fsPath, textModel.getLineContent(1)); - } else if (language === configureModeAssociations) { - this.configureFileAssociation(fileinput.getResource()); } else { mode = this.modeService.getOrCreateModeByLanguageName(language.label); } From d90b865f65f003df3cc781d62d0987fad451c4b8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 10:52:12 +0200 Subject: [PATCH 382/433] fix huge intellisense icons --- src/vs/editor/contrib/suggest/browser/suggest.css | 12 ++++++------ .../editor/contrib/suggest/browser/suggestWidget.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggest.css b/src/vs/editor/contrib/suggest/browser/suggest.css index b1a643799ed..dced1e7bad4 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/suggest.css @@ -18,7 +18,7 @@ transition: left .05s ease-in-out; } -.monaco-editor.mac .suggest-widget .text { +.monaco-editor.mac .suggest-widget .contents { line-height: 1.3em; } @@ -42,14 +42,14 @@ white-space: nowrap; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .text { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents { flex: 1; height: 100%; overflow: hidden; padding-left: 2px; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .text > .main { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main { display: flex; overflow: hidden; text-overflow: ellipsis; @@ -92,7 +92,7 @@ color: #186B9E; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .text > .main > .type-label { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label { display: none; margin-left: 0.8em; flex: 1; @@ -102,11 +102,11 @@ opacity: 0.7; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .text > .main > .type-label > .monaco-tokenized-source { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label > .monaco-tokenized-source { display: inline; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .text > .main > .type-label { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { display: inline; } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 5485225ff18..056c6812021 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -70,7 +70,7 @@ class Renderer implements IRenderer { data.icon = append(container, $('.icon')); data.colorspan = append(data.icon, $('span.colorspan')); - const text = append(container, $('.text')); + const text = append(container, $('.contents')); const main = append(text, $('.main')); data.highlightedLabel = new HighlightedLabel(main); data.disposables.push(data.highlightedLabel); From c77820351cb80cca1201a44c54e8ebb050fbc370 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 10:53:55 +0200 Subject: [PATCH 383/433] fixes #12847 --- src/vs/editor/contrib/suggest/browser/suggest.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/editor/contrib/suggest/browser/suggest.css b/src/vs/editor/contrib/suggest/browser/suggest.css index dced1e7bad4..24890d9dee5 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/suggest.css @@ -164,6 +164,7 @@ box-sizing: border-box; display: flex; flex-direction: column; + cursor: default; } .monaco-editor .suggest-widget .details > .header { From fcf008f4a28e1e424f530cc556a4e91328371352 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 10:54:56 +0200 Subject: [PATCH 384/433] remove mac overwrite --- src/vs/editor/contrib/suggest/browser/suggest.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggest.css b/src/vs/editor/contrib/suggest/browser/suggest.css index 24890d9dee5..74ba1aed106 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/suggest.css @@ -18,10 +18,6 @@ transition: left .05s ease-in-out; } -.monaco-editor.mac .suggest-widget .contents { - line-height: 1.3em; -} - .monaco-editor .suggest-widget > .message { padding-left: 22px; opacity: 0.7; From 6c0b455f9df2daa5bd46bfd4dd835cc748c39752 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 11:21:45 +0200 Subject: [PATCH 385/433] fixes #12859 --- src/vs/editor/contrib/suggest/browser/suggest.css | 13 +++++++------ .../editor/contrib/suggest/browser/suggestWidget.ts | 12 +++++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggest.css b/src/vs/editor/contrib/suggest/browser/suggest.css index 74ba1aed106..acbf3bdf3dd 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/suggest.css @@ -64,14 +64,17 @@ opacity: 0.85; } +.monaco-editor .suggest-widget .monaco-list .monaco-list-row .docs > .docs-text.no-docs { + opacity: 0.5; + font-style: italic; +} + .monaco-editor .suggest-widget .monaco-list .monaco-list-row .docs > .docs-details { opacity: 0.6; - width: 14px; - height: 14px; background-image: url('./info.svg'); - background-size: 14px; background-position: center center; background-repeat: no-repeat; + background-size: 70%; } .monaco-editor .suggest-widget .details > .header > .go-back, @@ -177,10 +180,8 @@ .monaco-editor .suggest-widget .details > .header > .go-back { cursor: pointer; opacity: 0.6; - width: 14px; - height: 14px; background-image: url('./back.svg'); - background-size: 14px; + background-size: 70%; background-position: center center; background-repeat: no-repeat; } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 056c6812021..c60fd75c168 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -83,12 +83,15 @@ class Renderer implements IRenderer { const configureFont = () => { const fontInfo = this.editor.getConfiguration().fontInfo; + const lineHeight = `${ fontInfo.lineHeight }px`; data.root.style.fontSize = `${ fontInfo.fontSize }px`; main.style.fontFamily = fontInfo.fontFamily; - main.style.lineHeight = `${ fontInfo.lineHeight }px`; - data.icon.style.height = `${ fontInfo.lineHeight }px`; - data.icon.style.width = `${ fontInfo.lineHeight }px`; + main.style.lineHeight = lineHeight; + data.icon.style.height = lineHeight; + data.icon.style.width = lineHeight; + data.documentationDetails.style.height = lineHeight; + data.documentationDetails.style.width = lineHeight; }; configureFont(); @@ -261,10 +264,13 @@ class SuggestionDetails { private configureFont() { const fontInfo = this.editor.getConfiguration().fontInfo; const fontSize = `${ fontInfo.fontSize }px`; + const lineHeight = `${ fontInfo.lineHeight }px`; this.el.style.fontSize = fontSize; this.title.style.fontFamily = fontInfo.fontFamily; this.type.style.fontFamily = fontInfo.fontFamily; + this.back.style.height = lineHeight; + this.back.style.width = lineHeight; } dispose(): void { From 60211895c769abe55303a3dccec889d20c0f1a69 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 12:10:33 +0200 Subject: [PATCH 386/433] fixes #2465 --- .../common/config/commonEditorConfig.ts | 14 ++++++ src/vs/editor/common/config/defaultConfig.ts | 2 + src/vs/editor/common/editorCommon.ts | 18 +++++++ .../contrib/suggest/browser/suggestWidget.ts | 47 +++++++++++-------- src/vs/monaco.d.ts | 12 +++++ 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index efcc0815166..b51b3200971 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -312,6 +312,8 @@ class InternalEditorOptionsHelper { snippetSuggestions: opts.snippetSuggestions, tabCompletion: opts.tabCompletion, wordBasedSuggestions: opts.wordBasedSuggestions, + suggestFontSize: opts.suggestFontSize, + suggestLineHeight: opts.suggestLineHeight, selectionHighlight: toBoolean(opts.selectionHighlight), codeLens: opts.referenceInfos && opts.codeLens, folding: toBoolean(opts.folding), @@ -765,6 +767,18 @@ let editorConfiguration:IConfigurationNode = { 'default': DefaultConfig.editor.wordBasedSuggestions, 'description': nls.localize('wordBasedSuggestions', "Enable word based suggestions.") }, + 'editor.suggestFontSize' : { + 'type': 'integer', + 'default': 0, + 'minimum': 0, + 'description': nls.localize('suggestFontSize', "Font size for the suggest widget") + }, + 'editor.suggestLineHeight' : { + 'type': 'integer', + 'default': 0, + 'minimum': 0, + 'description': nls.localize('suggestLineHeight', "Line height for the suggest widget") + }, 'editor.tabCompletion': { 'type': 'boolean', 'default': DefaultConfig.editor.tabCompletion, diff --git a/src/vs/editor/common/config/defaultConfig.ts b/src/vs/editor/common/config/defaultConfig.ts index 5d9d2cefa14..01548d9f34c 100644 --- a/src/vs/editor/common/config/defaultConfig.ts +++ b/src/vs/editor/common/config/defaultConfig.ts @@ -87,6 +87,8 @@ class ConfigClass implements IConfiguration { snippetSuggestions: 'bottom', tabCompletion: false, wordBasedSuggestions: true, + suggestFontSize: 0, + suggestLineHeight: 0, selectionHighlight: true, codeLens: true, referenceInfos: true, diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index f64c674ec54..e892b495887 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -410,6 +410,16 @@ export interface IEditorOptions { * Enable word based suggestions. Defaults to 'true' */ wordBasedSuggestions?: boolean; + /** + * The font size for the suggest widget. + * Defaults to the editor font size. + */ + suggestFontSize?: number; + /** + * The line height for the suggest widget. + * Defaults to the editor line height. + */ + suggestLineHeight?: number; /** * Enable selection highlight. * Defaults to true. @@ -854,6 +864,8 @@ export class EditorContribOptions { snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; tabCompletion: boolean; wordBasedSuggestions: boolean; + suggestFontSize: number; + suggestLineHeight: number; selectionHighlight:boolean; codeLens: boolean; folding: boolean; @@ -875,6 +887,8 @@ export class EditorContribOptions { snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; tabCompletion: boolean; wordBasedSuggestions: boolean; + suggestFontSize: number; + suggestLineHeight: number; selectionHighlight:boolean; codeLens: boolean; folding: boolean; @@ -892,6 +906,8 @@ export class EditorContribOptions { this.snippetSuggestions = source.snippetSuggestions; this.tabCompletion = source.tabCompletion; this.wordBasedSuggestions = source.wordBasedSuggestions; + this.suggestFontSize = source.suggestFontSize; + this.suggestLineHeight = source.suggestLineHeight; this.selectionHighlight = Boolean(source.selectionHighlight); this.codeLens = Boolean(source.codeLens); this.folding = Boolean(source.folding); @@ -915,6 +931,8 @@ export class EditorContribOptions { && this.snippetSuggestions === other.snippetSuggestions && this.tabCompletion === other.tabCompletion && this.wordBasedSuggestions === other.wordBasedSuggestions + && this.suggestFontSize === other.suggestFontSize + && this.suggestLineHeight === other.suggestLineHeight && this.selectionHighlight === other.selectionHighlight && this.codeLens === other.codeLens && this.folding === other.folding diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index c60fd75c168..588f7aaf3a8 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -82,22 +82,26 @@ class Renderer implements IRenderer { data.documentationDetails.title = nls.localize('readMore', "Read More...{0}", this.triggerKeybindingLabel); const configureFont = () => { - const fontInfo = this.editor.getConfiguration().fontInfo; - const lineHeight = `${ fontInfo.lineHeight }px`; + const configuration = this.editor.getConfiguration(); + const fontFamily = configuration.fontInfo.fontFamily; + const fontSize = configuration.contribInfo.suggestFontSize || configuration.fontInfo.fontSize; + const lineHeight = configuration.contribInfo.suggestLineHeight || configuration.fontInfo.lineHeight; + const fontSizePx = `${ fontSize }px`; + const lineHeightPx = `${ lineHeight }px`; - data.root.style.fontSize = `${ fontInfo.fontSize }px`; - main.style.fontFamily = fontInfo.fontFamily; - main.style.lineHeight = lineHeight; - data.icon.style.height = lineHeight; - data.icon.style.width = lineHeight; - data.documentationDetails.style.height = lineHeight; - data.documentationDetails.style.width = lineHeight; + data.root.style.fontSize = fontSizePx; + main.style.fontFamily = fontFamily; + main.style.lineHeight = lineHeightPx; + data.icon.style.height = lineHeightPx; + data.icon.style.width = lineHeightPx; + data.documentationDetails.style.height = lineHeightPx; + data.documentationDetails.style.width = lineHeightPx; }; configureFont(); chain(this.editor.onDidChangeConfiguration.bind(this.editor)) - .filter(e => e.fontInfo) + .filter(e => e.fontInfo || e.contribInfo) .on(configureFont, null, data.disposables); return data; @@ -262,15 +266,18 @@ class SuggestionDetails { } private configureFont() { - const fontInfo = this.editor.getConfiguration().fontInfo; - const fontSize = `${ fontInfo.fontSize }px`; - const lineHeight = `${ fontInfo.lineHeight }px`; + const configuration = this.editor.getConfiguration(); + const fontFamily = configuration.fontInfo.fontFamily; + const fontSize = configuration.contribInfo.suggestFontSize || configuration.fontInfo.fontSize; + const lineHeight = configuration.contribInfo.suggestLineHeight || configuration.fontInfo.lineHeight; + const fontSizePx = `${ fontSize }px`; + const lineHeightPx = `${ lineHeight }px`; - this.el.style.fontSize = fontSize; - this.title.style.fontFamily = fontInfo.fontFamily; - this.type.style.fontFamily = fontInfo.fontFamily; - this.back.style.height = lineHeight; - this.back.style.width = lineHeight; + this.el.style.fontSize = fontSizePx; + this.title.style.fontFamily = fontFamily; + this.type.style.fontFamily = fontFamily; + this.back.style.height = lineHeightPx; + this.back.style.width = lineHeightPx; } dispose(): void { @@ -754,8 +761,8 @@ export class SuggestWidget implements IContentWidget, IDelegate } private get unfocusedHeight(): number { - const fontInfo = this.editor.getConfiguration().fontInfo; - return fontInfo.lineHeight; + const configuration = this.editor.getConfiguration(); + return configuration.contribInfo.suggestLineHeight || configuration.fontInfo.lineHeight; } // IDelegate diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 755ddd32afd..a53abe82de2 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1273,6 +1273,16 @@ declare module monaco.editor { * Enable word based suggestions. Defaults to 'true' */ wordBasedSuggestions?: boolean; + /** + * The font size for the suggest widget. + * Defaults to the editor font size. + */ + suggestFontSize?: number; + /** + * The line height for the suggest widget. + * Defaults to the editor line height. + */ + suggestLineHeight?: number; /** * Enable selection highlight. * Defaults to true. @@ -1453,6 +1463,8 @@ declare module monaco.editor { snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; tabCompletion: boolean; wordBasedSuggestions: boolean; + suggestFontSize: number; + suggestLineHeight: number; selectionHighlight: boolean; codeLens: boolean; folding: boolean; From 7e1a77429de4f98b15a20b5486601e6299eeb4ae Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 12:12:39 +0200 Subject: [PATCH 387/433] let => const --- .../browser/parts/editor/baseEditor.ts | 50 +++++++++---------- .../browser/parts/editor/binaryDiffEditor.ts | 22 ++++---- .../browser/parts/editor/binaryEditor.ts | 8 +-- .../parts/editor/editor.contribution.ts | 6 +-- .../browser/parts/editor/editorPicker.ts | 4 +- .../browser/parts/editor/stringEditor.ts | 30 +++++------ .../browser/parts/editor/textDiffEditor.ts | 44 ++++++++-------- 7 files changed, 82 insertions(+), 82 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/baseEditor.ts b/src/vs/workbench/browser/parts/editor/baseEditor.ts index 4dbbf9578dc..9918792ef8b 100644 --- a/src/vs/workbench/browser/parts/editor/baseEditor.ts +++ b/src/vs/workbench/browser/parts/editor/baseEditor.ts @@ -86,7 +86,7 @@ export abstract class BaseEditor extends Panel implements IEditor { public create(parent: Builder): void; // create is sync for editors public create(parent: Builder): TPromise; public create(parent: Builder): TPromise { - let res = super.create(parent); + const res = super.create(parent); // Create Editor this.createEditor(parent); @@ -105,7 +105,7 @@ export abstract class BaseEditor extends Panel implements IEditor { public setVisible(visible: boolean, position?: Position): void; // setVisible is sync for editors public setVisible(visible: boolean, position?: Position): TPromise; public setVisible(visible: boolean, position: Position = null): TPromise { - let promise = super.setVisible(visible); + const promise = super.setVisible(visible); // Propagate to Editor this.setEditorVisible(visible, position); @@ -185,7 +185,7 @@ class EditorRegistry implements IEditorRegistry { this.instantiationService = service; for (let key in this.editorInputFactoryConstructors) { - let element = this.editorInputFactoryConstructors[key]; + const element = this.editorInputFactoryConstructors[key]; this.createEditorInputFactory(key, element); } @@ -193,7 +193,7 @@ class EditorRegistry implements IEditorRegistry { } private createEditorInputFactory(editorInputId: string, ctor: IConstructorSignature0): void { - let instance = this.instantiationService.createInstance(ctor); + const instance = this.instantiationService.createInstance(ctor); this.editorInputFactoryInstances[editorInputId] = instance; } @@ -215,14 +215,14 @@ class EditorRegistry implements IEditorRegistry { } public getEditor(input: EditorInput): EditorDescriptor { - let findEditorDescriptors = (input: EditorInput, byInstanceOf?: boolean): EditorDescriptor[]=> { - let matchingDescriptors: EditorDescriptor[] = []; + const findEditorDescriptors = (input: EditorInput, byInstanceOf?: boolean): EditorDescriptor[]=> { + const matchingDescriptors: EditorDescriptor[] = []; for (let i = 0; i < this.editors.length; i++) { - let editor = this.editors[i]; - let inputDescriptors = []>editor[INPUT_DESCRIPTORS_PROPERTY]; + const editor = this.editors[i]; + const inputDescriptors = []>editor[INPUT_DESCRIPTORS_PROPERTY]; for (let j = 0; j < inputDescriptors.length; j++) { - let inputClass = inputDescriptors[j].ctor; + const inputClass = inputDescriptors[j].ctor; // Direct check on constructor type (ignores prototype chain) if (!byInstanceOf && (input).constructor === inputClass) { @@ -250,11 +250,11 @@ class EditorRegistry implements IEditorRegistry { return matchingDescriptors; }; - let descriptors = findEditorDescriptors(input); + const descriptors = findEditorDescriptors(input); if (descriptors && descriptors.length > 0) { // Ask the input for its preferred Editor - let preferredEditorId = input.getPreferredEditorId(descriptors.map(d => d.getId())); + const preferredEditorId = input.getPreferredEditorId(descriptors.map(d => d.getId())); if (preferredEditorId) { return this.getEditorById(preferredEditorId); } @@ -268,7 +268,7 @@ class EditorRegistry implements IEditorRegistry { public getEditorById(editorId: string): EditorDescriptor { for (let i = 0; i < this.editors.length; i++) { - let editor = this.editors[i]; + const editor = this.editors[i]; if (editor.getId() === editorId) { return editor; } @@ -286,10 +286,10 @@ class EditorRegistry implements IEditorRegistry { } public getEditorInputs(): any[] { - let inputClasses: any[] = []; + const inputClasses: any[] = []; for (let i = 0; i < this.editors.length; i++) { - let editor = this.editors[i]; - let editorInputDescriptors = []>editor[INPUT_DESCRIPTORS_PROPERTY]; + const editor = this.editors[i]; + const editorInputDescriptors = []>editor[INPUT_DESCRIPTORS_PROPERTY]; inputClasses.push(...editorInputDescriptors.map(descriptor=> descriptor.ctor)); } @@ -346,7 +346,7 @@ export class EditorInputActionContributor extends ActionBarContributor { } private createPositionArray(): any[] { - let array: any[] = []; + const array: any[] = []; for (let i = 0; i < POSITIONS.length; i++) { array[i] = {}; @@ -371,7 +371,7 @@ export class EditorInputActionContributor extends ActionBarContributor { private doClearInputsFromCache(cache: { [id: string]: IEditorInputAction[] }): void { for (let key in cache) { if (cache.hasOwnProperty(key)) { - let cachedActions = cache[key]; + const cachedActions = cache[key]; cachedActions.forEach((action) => { action.input = null; action.position = null; @@ -412,9 +412,9 @@ export class EditorInputActionContributor extends ActionBarContributor { this.clearInputsFromCache(context.position, true /* primary actions */); // First consult cache - let editorInput = context.input; - let editorPosition = context.position; - let cachedActions = this.mapEditorInputActionContextToPrimaryActions[context.position][this.toId(context)]; + const editorInput = context.input; + const editorPosition = context.position; + const cachedActions = this.mapEditorInputActionContextToPrimaryActions[context.position][this.toId(context)]; if (cachedActions) { // Update the input field and position in all actions to indicate this change and return @@ -427,7 +427,7 @@ export class EditorInputActionContributor extends ActionBarContributor { } // Otherwise collect and keep in cache - let actions = this.getActionsForEditorInput(context); + const actions = this.getActionsForEditorInput(context); actions.forEach((action) => { action.input = editorInput; action.position = editorPosition; @@ -470,9 +470,9 @@ export class EditorInputActionContributor extends ActionBarContributor { this.clearInputsFromCache(context.position, false /* secondary actions */); // First consult cache - let editorInput = context.input; - let editorPosition = context.position; - let cachedActions = this.mapEditorInputActionContextToSecondaryActions[context.position][this.toId(context)]; + const editorInput = context.input; + const editorPosition = context.position; + const cachedActions = this.mapEditorInputActionContextToSecondaryActions[context.position][this.toId(context)]; if (cachedActions) { // Update the input field and position in all actions to indicate this change and return @@ -485,7 +485,7 @@ export class EditorInputActionContributor extends ActionBarContributor { } // Otherwise collect and keep in cache - let actions = this.getSecondaryActionsForEditorInput(context); + const actions = this.getSecondaryActionsForEditorInput(context); actions.forEach((action) => { action.input = editorInput; action.position = editorPosition; diff --git a/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts b/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts index 79fb82d8288..e406a24e3b3 100644 --- a/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts @@ -64,7 +64,7 @@ export class BinaryResourceDiffEditor extends BaseEditor implements IVerticalSas public createEditor(parent: Builder): void { // Left Container for Binary - let leftBinaryContainerElement = document.createElement('div'); + const leftBinaryContainerElement = document.createElement('div'); leftBinaryContainerElement.className = 'binary-container'; this.leftBinaryContainer = $(leftBinaryContainerElement); this.leftBinaryContainer.tabindex(0); // enable focus support from the editor part (do not remove) @@ -82,7 +82,7 @@ export class BinaryResourceDiffEditor extends BaseEditor implements IVerticalSas this.sash.addListener2('reset', () => this.onSashReset()); // Right Container for Binary - let rightBinaryContainerElement = document.createElement('div'); + const rightBinaryContainerElement = document.createElement('div'); rightBinaryContainerElement.className = 'binary-container'; this.rightBinaryContainer = $(rightBinaryContainerElement); this.rightBinaryContainer.tabindex(0); // enable focus support from the editor part (do not remove) @@ -94,11 +94,11 @@ export class BinaryResourceDiffEditor extends BaseEditor implements IVerticalSas } public setInput(input: EditorInput, options: EditorOptions): TPromise { - let oldInput = this.getInput(); + const oldInput = this.getInput(); super.setInput(input, options); // Detect options - let forceOpen = options && options.forceOpen; + const forceOpen = options && options.forceOpen; // Same Input if (!forceOpen && input.matches(oldInput)) { @@ -119,11 +119,11 @@ export class BinaryResourceDiffEditor extends BaseEditor implements IVerticalSas } // Render original - let original = resolvedModel.originalModel; + const original = resolvedModel.originalModel; this.renderInput(original.getName(), original.getResource(), original.getSize(), original.getETag(), true); // Render modified - let modified = resolvedModel.modifiedModel; + const modified = resolvedModel.modifiedModel; this.renderInput(modified.getName(), modified.getResource(), modified.getSize(), modified.getETag(), false); }); } @@ -138,8 +138,8 @@ export class BinaryResourceDiffEditor extends BaseEditor implements IVerticalSas } // Pass to ResourceViewer - let container = isOriginal ? this.leftBinaryContainer : this.rightBinaryContainer; - let scrollbar = isOriginal ? this.leftScrollbar : this.rightScrollbar; + const container = isOriginal ? this.leftBinaryContainer : this.rightBinaryContainer; + const scrollbar = isOriginal ? this.leftScrollbar : this.rightScrollbar; ResourceViewer.show({ name, resource, size, etag }, container, scrollbar, (meta) => this.handleMetadataChanged(meta, isOriginal)); } @@ -172,14 +172,14 @@ export class BinaryResourceDiffEditor extends BaseEditor implements IVerticalSas } public layout(dimension: Dimension): void { - let oldDimension = this.dimension; + const oldDimension = this.dimension; this.dimension = dimension; // Calculate left hand container width based on sash move or fallback to 50% by default if (!this.leftContainerWidth || !oldDimension) { this.leftContainerWidth = this.dimension.width / 2; } else { - let sashRatio = this.leftContainerWidth / oldDimension.width; + const sashRatio = this.leftContainerWidth / oldDimension.width; this.leftContainerWidth = this.dimension.width * sashRatio; } @@ -208,7 +208,7 @@ export class BinaryResourceDiffEditor extends BaseEditor implements IVerticalSas private onSashDrag(e: ISashEvent): void { // Update Widths and keep in bounds of MIN_CONTAINER_WIDTH for both sides - let newLeftContainerWidth = this.startLeftContainerWidth + e.currentX - e.startX; + const newLeftContainerWidth = this.startLeftContainerWidth + e.currentX - e.startX; this.leftContainerWidth = Math.max(BinaryResourceDiffEditor.MIN_CONTAINER_WIDTH, newLeftContainerWidth); if (this.dimension.width - this.leftContainerWidth < BinaryResourceDiffEditor.MIN_CONTAINER_WIDTH) { this.leftContainerWidth = this.dimension.width - BinaryResourceDiffEditor.MIN_CONTAINER_WIDTH; diff --git a/src/vs/workbench/browser/parts/editor/binaryEditor.ts b/src/vs/workbench/browser/parts/editor/binaryEditor.ts index dc60e1108dd..42c50fcd567 100644 --- a/src/vs/workbench/browser/parts/editor/binaryEditor.ts +++ b/src/vs/workbench/browser/parts/editor/binaryEditor.ts @@ -49,7 +49,7 @@ export abstract class BaseBinaryResourceEditor extends BaseEditor { public createEditor(parent: Builder): void { // Container for Binary - let binaryContainerElement = document.createElement('div'); + const binaryContainerElement = document.createElement('div'); binaryContainerElement.className = 'binary-container'; this.binaryContainer = $(binaryContainerElement); this.binaryContainer.tabindex(0); // enable focus support from the editor part (do not remove) @@ -60,11 +60,11 @@ export abstract class BaseBinaryResourceEditor extends BaseEditor { } public setInput(input: EditorInput, options: EditorOptions): TPromise { - let oldInput = this.getInput(); + const oldInput = this.getInput(); super.setInput(input, options); // Detect options - let forceOpen = options && options.forceOpen; + const forceOpen = options && options.forceOpen; // Same Input if (!forceOpen && input.matches(oldInput)) { @@ -85,7 +85,7 @@ export abstract class BaseBinaryResourceEditor extends BaseEditor { } // Render Input - let model = resolvedModel; + const model = resolvedModel; ResourceViewer.show({ name: model.getName(), resource: model.getResource(), size: model.getSize(), etag: model.getETag() }, this.binaryContainer, this.scrollbar, (meta) => this.handleMetadataChanged(meta)); return TPromise.as(null); diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 536fe9573fe..0e7a4f6409e 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -95,15 +95,15 @@ export class QuickOpenActionContributor extends ActionBarContributor { } public hasActions(context: any): boolean { - let entry = this.getEntry(context); + const entry = this.getEntry(context); return !!entry; } public getActions(context: any): IAction[] { - let actions: Action[] = []; + const actions: Action[] = []; - let entry = this.getEntry(context); + const entry = this.getEntry(context); if (entry) { if (!this.openToSideActionInstance) { this.openToSideActionInstance = this.instantiationService.createInstance(OpenToSideAction); diff --git a/src/vs/workbench/browser/parts/editor/editorPicker.ts b/src/vs/workbench/browser/parts/editor/editorPicker.ts index 2f65018a3db..81a96b9627f 100644 --- a/src/vs/workbench/browser/parts/editor/editorPicker.ts +++ b/src/vs/workbench/browser/parts/editor/editorPicker.ts @@ -120,8 +120,8 @@ export abstract class BaseEditorPicker extends QuickOpenHandler { return true; } - let resource = e.getResource(); - let targetToMatch = resource ? labels.getPathLabel(e.getResource(), this.contextService) : e.getLabel(); + const resource = e.getResource(); + const targetToMatch = resource ? labels.getPathLabel(e.getResource(), this.contextService) : e.getLabel(); if (!scorer.matches(targetToMatch, normalizedSearchValueLowercase)) { return false; } diff --git a/src/vs/workbench/browser/parts/editor/stringEditor.ts b/src/vs/workbench/browser/parts/editor/stringEditor.ts index d996aef7eed..948fa455160 100644 --- a/src/vs/workbench/browser/parts/editor/stringEditor.ts +++ b/src/vs/workbench/browser/parts/editor/stringEditor.ts @@ -69,17 +69,17 @@ export class StringEditor extends BaseTextEditor { } public setInput(input: EditorInput, options: EditorOptions): TPromise { - let oldInput = this.getInput(); + const oldInput = this.getInput(); super.setInput(input, options); // Detect options - let forceOpen = options && options.forceOpen; + const forceOpen = options && options.forceOpen; // Same Input if (!forceOpen && input.matches(oldInput)) { // TextOptions (avoiding instanceof here for a reason, do not change!) - let textOptions = options; + const textOptions = options; if (textOptions && types.isFunction(textOptions.apply)) { textOptions.apply(this.getControl()); } @@ -106,20 +106,20 @@ export class StringEditor extends BaseTextEditor { } // Set Editor Model - let textEditor = this.getControl(); - let textEditorModel = (resolvedModel).textEditorModel; + const textEditor = this.getControl(); + const textEditorModel = (resolvedModel).textEditorModel; textEditor.setModel(textEditorModel); // Apply Options from TextOptions let optionsGotApplied = false; - let textOptions = options; + const textOptions = options; if (textOptions && types.isFunction(textOptions.apply)) { optionsGotApplied = textOptions.apply(textEditor); } // Otherwise restore View State if (!optionsGotApplied && input instanceof UntitledEditorInput) { - let viewState = this.mapResourceToEditorViewState[input.getResource().toString()]; + const viewState = this.mapResourceToEditorViewState[input.getResource().toString()]; if (viewState) { textEditor.restoreViewState(viewState); } @@ -131,16 +131,16 @@ export class StringEditor extends BaseTextEditor { } protected getCodeEditorOptions(): IEditorOptions { - let options = super.getCodeEditorOptions(); + const options = super.getCodeEditorOptions(); - let input = this.getInput(); - let isUntitled = input instanceof UntitledEditorInput; - let isReadonly = !isUntitled; // all string editors are readonly except for the untitled one + const input = this.getInput(); + const isUntitled = input instanceof UntitledEditorInput; + const isReadonly = !isUntitled; // all string editors are readonly except for the untitled one options.readOnly = isReadonly; let ariaLabel: string; - let inputName = input && input.getName(); + const inputName = input && input.getName(); if (isReadonly) { ariaLabel = inputName ? nls.localize('readonlyEditorWithInputAriaLabel', "{0}. Readonly text editor.", inputName) : nls.localize('readonlyEditorAriaLabel', "Readonly text editor."); } else { @@ -157,12 +157,12 @@ export class StringEditor extends BaseTextEditor { * If smart reveal is true will only reveal the last line if the line before last is visible #3351 */ public revealLastLine(smartReveal = false): void { - let codeEditor = this.getControl(); - let model = codeEditor.getModel(); + const codeEditor = this.getControl(); + const model = codeEditor.getModel(); const lineBeforeLastRevealed = codeEditor.getScrollTop() + codeEditor.getLayoutInfo().height >= codeEditor.getScrollHeight(); if (model && (!smartReveal || lineBeforeLastRevealed)) { - let lastLine = model.getLineCount(); + const lastLine = model.getLineCount(); codeEditor.revealLine(lastLine); } } diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index 219940bf448..8e219979834 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -84,11 +84,11 @@ export class TextDiffEditor extends BaseTextEditor { this.previousDiffAction = new NavigateAction(this, false); // Support navigation within the diff editor by overriding the editor service within - let delegatingEditorService = this.instantiationService.createInstance(DelegatingWorkbenchEditorService, (input: EditorInput, options?: EditorOptions, arg3?: any) => { + const delegatingEditorService = this.instantiationService.createInstance(DelegatingWorkbenchEditorService, (input: EditorInput, options?: EditorOptions, arg3?: any) => { // Check if arg4 is a position argument that differs from this editors position if (types.isUndefinedOrNull(arg3) || arg3 === false || arg3 === this.position) { - let activeDiffInput = this.getInput(); + const activeDiffInput = this.getInput(); if (input && options && activeDiffInput) { // Input matches modified side of the diff editor: perform the action on modified side @@ -98,7 +98,7 @@ export class TextDiffEditor extends BaseTextEditor { // Input matches original side of the diff editor: perform the action on original side else if (input.matches(activeDiffInput.originalInput)) { - let originalEditor = this.getControl().getOriginalEditor(); + const originalEditor = this.getControl().getOriginalEditor(); if (options instanceof TextEditorOptions) { (options).apply(originalEditor); @@ -112,23 +112,23 @@ export class TextDiffEditor extends BaseTextEditor { }); // Create a special child of instantiator that will delegate all calls to openEditor() to the same diff editor if the input matches with the modified one - let diffEditorInstantiator = this.instantiationService.createChild(new ServiceCollection([IWorkbenchEditorService, delegatingEditorService])); + const diffEditorInstantiator = this.instantiationService.createChild(new ServiceCollection([IWorkbenchEditorService, delegatingEditorService])); return diffEditorInstantiator.createInstance(DiffEditorWidget, parent.getHTMLElement(), this.getCodeEditorOptions()); } public setInput(input: EditorInput, options: EditorOptions): TPromise { - let oldInput = this.getInput(); + const oldInput = this.getInput(); super.setInput(input, options); // Detect options - let forceOpen = options && options.forceOpen; + const forceOpen = options && options.forceOpen; // Same Input if (!forceOpen && input.matches(oldInput)) { // TextOptions (avoiding instanceof here for a reason, do not change!) - let textOptions = options; + const textOptions = options; if (textOptions && types.isFunction(textOptions.apply)) { textOptions.apply(this.getControl()); } @@ -155,13 +155,13 @@ export class TextDiffEditor extends BaseTextEditor { } // Editor - let diffEditor = this.getControl(); + const diffEditor = this.getControl(); diffEditor.setModel((resolvedModel).textDiffEditorModel); // Respect text diff editor options let autoRevealFirstChange = true; if (options instanceof TextDiffEditorOptions) { - let textDiffOptions = (options); + const textDiffOptions = (options); autoRevealFirstChange = !types.isUndefinedOrNull(textDiffOptions.autoRevealFirstChange) ? textDiffOptions.autoRevealFirstChange : autoRevealFirstChange; } @@ -195,10 +195,10 @@ export class TextDiffEditor extends BaseTextEditor { private openAsBinary(input: EditorInput, options: EditorOptions): boolean { if (input instanceof DiffEditorInput) { - let originalInput = input.originalInput; - let modifiedInput = input.modifiedInput; + const originalInput = input.originalInput; + const modifiedInput = input.modifiedInput; - let binaryDiffInput = new DiffEditorInput(input.getName(), input.getDescription(), originalInput, modifiedInput, true); + const binaryDiffInput = new DiffEditorInput(input.getName(), input.getDescription(), originalInput, modifiedInput, true); this.editorService.openEditor(binaryDiffInput, options, this.position).done(null, onUnexpectedError); @@ -209,17 +209,17 @@ export class TextDiffEditor extends BaseTextEditor { } protected getCodeEditorOptions(): IEditorOptions { - let options: IDiffEditorOptions = super.getCodeEditorOptions(); + const options: IDiffEditorOptions = super.getCodeEditorOptions(); - let input = this.input; + const input = this.input; if (input instanceof DiffEditorInput) { - let modifiedInput = input.modifiedInput; - let readOnly = modifiedInput instanceof StringEditorInput || modifiedInput instanceof ResourceEditorInput; + const modifiedInput = input.modifiedInput; + const readOnly = modifiedInput instanceof StringEditorInput || modifiedInput instanceof ResourceEditorInput; options.readOnly = readOnly; let ariaLabel: string; - let inputName = input && input.getName(); + const inputName = input && input.getName(); if (readOnly) { ariaLabel = inputName ? nls.localize('readonlyEditorWithInputAriaLabel', "{0}. Readonly text compare editor.", inputName) : nls.localize('readonlyEditorAriaLabel', "Readonly text compare editor."); } else { @@ -236,7 +236,7 @@ export class TextDiffEditor extends BaseTextEditor { private isFileBinaryError(error: Error): boolean; private isFileBinaryError(error: any): boolean { if (types.isArray(error)) { - let errors = error; + const errors = error; return errors.some((e) => this.isFileBinaryError(e)); } @@ -275,16 +275,16 @@ export class TextDiffEditor extends BaseTextEditor { } public getSecondaryActions(): IAction[] { - let actions = super.getSecondaryActions(); + const actions = super.getSecondaryActions(); const control = this.getControl(); let inlineModeActive = control && !control.renderSideBySide; - let inlineLabel = nls.localize('inlineDiffLabel', "Switch to Inline View"); - let sideBySideLabel = nls.localize('sideBySideDiffLabel', "Switch to Side by Side View"); + const inlineLabel = nls.localize('inlineDiffLabel', "Switch to Inline View"); + const sideBySideLabel = nls.localize('sideBySideDiffLabel', "Switch to Side by Side View"); // Action to toggle editor mode from inline to side by side - let toggleEditorModeAction = new Action('toggle.diff.editorMode', inlineModeActive ? sideBySideLabel : inlineLabel, null, true, () => { + const toggleEditorModeAction = new Action('toggle.diff.editorMode', inlineModeActive ? sideBySideLabel : inlineLabel, null, true, () => { this.getControl().updateOptions({ renderSideBySide: inlineModeActive }); From 0af52604e57d02412e41b452c5faaf0467477367 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 12:21:35 +0200 Subject: [PATCH 388/433] distro related to #11722 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2169f9baa15..b1a20925add 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.6.0", "electronVersion": "1.3.7", - "distro": "7542725e6f4b1bb0cfe791f513e8819600edaefd", + "distro": "b1e023235579beebbb3cc127676cc91cc7f3e823", "author": { "name": "Microsoft Corporation" }, From d1023ee91894e9c6a2c73c7b92ff68da3f8fdc7d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 12:37:41 +0200 Subject: [PATCH 389/433] debt: no more mime in editor service --- src/vs/platform/editor/common/editor.ts | 5 ----- .../files/browser/editors/textFileEditor.ts | 3 +-- .../parts/files/browser/fileActions.ts | 20 ++----------------- .../parts/files/browser/views/explorerView.ts | 2 +- .../files/browser/views/explorerViewer.ts | 2 +- .../files/common/editors/fileEditorTracker.ts | 7 +++---- .../git/browser/gitActions.contribution.ts | 1 - .../workbench/parts/git/browser/gitActions.ts | 2 -- .../services/editor/browser/editorService.ts | 8 ++++---- .../workbench/test/browser/services.test.ts | 5 ++--- 10 files changed, 14 insertions(+), 41 deletions(-) diff --git a/src/vs/platform/editor/common/editor.ts b/src/vs/platform/editor/common/editor.ts index 897923795c7..9b7cc2e9f5e 100644 --- a/src/vs/platform/editor/common/editor.ts +++ b/src/vs/platform/editor/common/editor.ts @@ -52,11 +52,6 @@ export interface IResourceInput { */ resource: URI; - /** - * The mime type of the text input if known. - */ - mime?: string; - /** * The encoding of the text input if known. */ diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index 8700eb3f7b2..e3f87ff280a 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -8,7 +8,7 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import errors = require('vs/base/common/errors'); import {toErrorMessage} from 'vs/base/common/errorMessage'; -import {MIME_BINARY, MIME_TEXT} from 'vs/base/common/mime'; +import {MIME_BINARY} from 'vs/base/common/mime'; import types = require('vs/base/common/types'); import paths = require('vs/base/common/paths'); import {IEditorViewState} from 'vs/editor/common/editorCommon'; @@ -182,7 +182,6 @@ export class TextFileEditor extends BaseTextEditor { // Open return this.editorService.openEditor({ resource: input.getResource(), - mime: MIME_TEXT, options: { pinned: true // new file gets pinned by default } diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index 9858e2a8111..d6bc9be0b65 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -10,7 +10,7 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import {isWindows, isLinux, isMacintosh} from 'vs/base/common/platform'; import {sequence, ITask} from 'vs/base/common/async'; -import {MIME_TEXT, isUnspecific, isBinaryMime, guessMimeTypes} from 'vs/base/common/mime'; +import {isBinaryMime, guessMimeTypes} from 'vs/base/common/mime'; import paths = require('vs/base/common/paths'); import URI from 'vs/base/common/uri'; import errors = require('vs/base/common/errors'); @@ -1422,14 +1422,6 @@ export abstract class BaseSaveFileAction extends BaseActionWithErrorReporting { // Save As (or Save untitled with associated path) if (this.isSaveAs() || source.scheme === 'untitled') { - let mimeOfSource: string; - if (source.scheme === 'untitled') { - const selectedMime = this.untitledEditorService.get(source).getMime(); - if (!isUnspecific(selectedMime)) { - mimeOfSource = [selectedMime, MIME_TEXT].join(', '); - } - } - let encodingOfSource: string; if (source.scheme === 'untitled') { encodingOfSource = this.untitledEditorService.get(source).getEncoding(); @@ -1471,7 +1463,6 @@ export abstract class BaseSaveFileAction extends BaseActionWithErrorReporting { const replaceWith: IResourceInput = { resource: target, - mime: mimeOfSource, encoding: encodingOfSource, options: { pinned: true, @@ -1563,14 +1554,13 @@ export abstract class BaseSaveAllAction extends BaseActionWithErrorReporting { const stacks = this.editorGroupService.getStacksModel(); // Store some properties per untitled file to restore later after save is completed - const mapUntitledToProperties: { [resource: string]: { mime: string; encoding: string; indexInGroups: number[]; activeInGroups: boolean[] } } = Object.create(null); + const mapUntitledToProperties: { [resource: string]: { encoding: string; indexInGroups: number[]; activeInGroups: boolean[] } } = Object.create(null); this.textFileService.getDirty() .filter(r => r.scheme === 'untitled') // All untitled resources .map(r => this.untitledEditorService.get(r)) // Mapped to their inputs .filter(input => !!input) // If possible :) .forEach(input => { mapUntitledToProperties[input.getResource().toString()] = { - mime: input.getMime(), encoding: input.getEncoding(), indexInGroups: stacks.groups.map(g => g.indexOf(input)), activeInGroups: stacks.groups.map(g => g.isActive(input)) @@ -1593,18 +1583,12 @@ export abstract class BaseSaveAllAction extends BaseActionWithErrorReporting { return; } - let mimeOfSource: string; - if (!isUnspecific(untitledProps.mime)) { - mimeOfSource = [untitledProps.mime, MIME_TEXT].join(', '); - } - // For each position where the untitled file was opened untitledProps.indexInGroups.forEach((indexInGroup, index) => { if (indexInGroup >= 0) { untitledToReopen.push({ input: { resource: result.target, - mime: mimeOfSource, encoding: untitledProps.encoding, options: { pinned: true, diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index 87b3ceea993..fcc828278dd 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -282,7 +282,7 @@ export class ExplorerView extends CollapsibleViewletView { private openFocusedElement(preserveFocus?: boolean): void { const stat: FileStat = this.explorerViewer.getFocus(); if (stat && !stat.isDirectory) { - this.editorService.openEditor({ resource: stat.resource, mime: stat.mime, options: { preserveFocus, revealIfVisible: true } }).done(null, errors.onUnexpectedError); + this.editorService.openEditor({ resource: stat.resource, options: { preserveFocus, revealIfVisible: true } }).done(null, errors.onUnexpectedError); } } diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index cace354b43c..a36e842e6e4 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -611,7 +611,7 @@ export class FileController extends DefaultController { if (stat && !stat.isDirectory) { this.telemetryService.publicLog('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'explorer' }); - this.editorService.openEditor({ resource: stat.resource, mime: stat.mime, options: { preserveFocus, pinned } }, sideBySide).done(null, errors.onUnexpectedError); + this.editorService.openEditor({ resource: stat.resource, options: { preserveFocus, pinned } }, sideBySide).done(null, errors.onUnexpectedError); } } diff --git a/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts b/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts index 0feaf117748..df9c192b1cb 100644 --- a/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts +++ b/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts @@ -6,7 +6,6 @@ import {IWorkbenchContribution} from 'vs/workbench/common/contributions'; import errors = require('vs/base/common/errors'); -import {MIME_UNKNOWN} from 'vs/base/common/mime'; import URI from 'vs/base/common/uri'; import paths = require('vs/base/common/paths'); import {DiffEditorInput} from 'vs/workbench/common/editor/diffEditorInput'; @@ -71,11 +70,11 @@ export class FileEditorTracker implements IWorkbenchContribution { const before = e.getBefore(); const after = e.getAfter(); - this.handleMovedFileInOpenedEditors(before ? before.resource : null, after ? after.resource : null, after ? after.mime : null); + this.handleMovedFileInOpenedEditors(before ? before.resource : null, after ? after.resource : null); } } - private handleMovedFileInOpenedEditors(oldResource: URI, newResource: URI, mimeHint?: string): void { + private handleMovedFileInOpenedEditors(oldResource: URI, newResource: URI): void { const stacks = this.editorGroupService.getStacksModel(); stacks.groups.forEach(group => { group.getEditors().forEach(input => { @@ -93,7 +92,7 @@ export class FileEditorTracker implements IWorkbenchContribution { } // Reopen - this.editorService.openEditor({ resource: reopenFileResource, mime: mimeHint || MIME_UNKNOWN, options: { preserveFocus: true, pinned: group.isPinned(input), index: group.indexOf(input), inactive: !group.isActive(input) } }, stacks.positionOfGroup(group)).done(null, errors.onUnexpectedError); + this.editorService.openEditor({ resource: reopenFileResource, options: { preserveFocus: true, pinned: group.isPinned(input), index: group.indexOf(input), inactive: !group.isActive(input) } }, stacks.positionOfGroup(group)).done(null, errors.onUnexpectedError); } } }); diff --git a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts index cf0b5e3470f..a38afaf371c 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts @@ -189,7 +189,6 @@ class OpenInEditorAction extends baseeditor.EditorInputAction { return this.fileService.resolveFile(resource).then(stat => { return this.editorService.openEditor({ resource: stat.resource, - mime: stat.mime, options: { forceOpen: true } diff --git a/src/vs/workbench/parts/git/browser/gitActions.ts b/src/vs/workbench/parts/git/browser/gitActions.ts index 11f4b998eea..de9a8af81e0 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.ts @@ -173,7 +173,6 @@ export class OpenFileAction extends GitAction { return this.fileService.resolveFile(resource) .then(stat => this.editorService.openEditor({ resource: stat.resource, - mime: stat.mime, options: { forceOpen: true } })); } @@ -395,7 +394,6 @@ export abstract class BaseUndoAction extends GitAction { return this.fileService.resolveFile(this.contextService.toResource(path)).then((stat: IFileStat) => { return this.editorService.openEditor({ resource: stat.resource, - mime: stat.mime, options: { forceOpen: true } diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 27c433ae478..c5f826a7ed9 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -6,8 +6,8 @@ import {TPromise} from 'vs/base/common/winjs.base'; import URI from 'vs/base/common/uri'; -import network = require('vs/base/common/network'); import {guessMimeTypes} from 'vs/base/common/mime'; +import network = require('vs/base/common/network'); import {Registry} from 'vs/platform/platform'; import {basename, dirname} from 'vs/base/common/paths'; import types = require('vs/base/common/types'); @@ -263,7 +263,7 @@ export class WorkbenchEditorService implements IWorkbenchEditorService { // Base Text Editor Support for file resources else if (this.fileInputDescriptor && resourceInput.resource instanceof URI && resourceInput.resource.scheme === network.Schemas.file) { - return this.createFileInput(resourceInput.resource, resourceInput.mime, resourceInput.encoding); + return this.createFileInput(resourceInput.resource, resourceInput.encoding); } // Treat an URI as ResourceEditorInput @@ -277,10 +277,10 @@ export class WorkbenchEditorService implements IWorkbenchEditorService { return TPromise.as(null); } - private createFileInput(resource: URI, mime?: string, encoding?: string): TPromise { + private createFileInput(resource: URI, encoding?: string): TPromise { return this.instantiationService.createInstance(this.fileInputDescriptor).then((typedFileInput) => { typedFileInput.setResource(resource); - typedFileInput.setMime(mime || guessMimeTypes(resource.fsPath).join(', ')); + typedFileInput.setMime(guessMimeTypes(resource.fsPath).join(', ')); typedFileInput.setPreferredEncoding(encoding); return typedFileInput; diff --git a/src/vs/workbench/test/browser/services.test.ts b/src/vs/workbench/test/browser/services.test.ts index c942d30c79f..29ba658646e 100644 --- a/src/vs/workbench/test/browser/services.test.ts +++ b/src/vs/workbench/test/browser/services.test.ts @@ -299,13 +299,12 @@ suite('Workbench UI Services', () => { }); // Open Untyped Input - service.openEditor({ resource: toResource('/index.html'), mime: 'text/html', options: { selection: { startLineNumber: 1, startColumn: 1 } } }).then((editor) => { + service.openEditor({ resource: toResource('/index.html'), options: { selection: { startLineNumber: 1, startColumn: 1 } } }).then((editor) => { assert.strictEqual(editor, activeEditor); assert(openedEditorInput instanceof FileEditorInput); let contentInput = openedEditorInput; assert.strictEqual(contentInput.getResource().fsPath, toResource('/index.html').fsPath); - assert.strictEqual(contentInput.getMime(), 'text/html'); assert(openedEditorOptions instanceof TextEditorOptions); let textEditorOptions = openedEditorOptions; @@ -327,7 +326,7 @@ suite('Workbench UI Services', () => { }); // Resolve Editor Model (Untyped Input) - service.resolveEditorModel({ resource: toResource('/index.html'), mime: 'text/html' }, true).then((model) => { + service.resolveEditorModel({ resource: toResource('/index.html') }, true).then((model) => { assert(model instanceof TextFileEditorModel); }); }); From 4cd0bf095d9b7854333e45138c8b953023c8ffdf Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 13:08:28 +0200 Subject: [PATCH 390/433] debt: get rid of mime in file input --- src/vs/base/common/mime.ts | 6 +- src/vs/base/test/common/mime.test.ts | 38 +++++------ src/vs/base/test/node/mime/mime.test.ts | 2 +- .../common/services/languagesRegistry.ts | 8 +-- .../editor/common/services/modeServiceImpl.ts | 2 +- .../browser/parts/editor/binaryDiffEditor.ts | 4 +- .../browser/parts/editor/textDiffEditor.ts | 4 +- src/vs/workbench/common/editor.ts | 24 +++---- .../common/editor/diffEditorInput.ts | 22 +----- .../common/editor/stringEditorInput.ts | 4 -- .../common/editor/stringEditorModel.ts | 4 -- .../common/editor/untitledEditorInput.ts | 17 ++--- .../files/browser/editors/textFileEditor.ts | 5 +- .../parts/files/browser/fileActions.ts | 4 +- .../parts/files/browser/files.contribution.ts | 4 +- .../parts/files/browser/saveErrorHandler.ts | 2 +- .../files/common/editors/fileEditorInput.ts | 67 +++---------------- src/vs/workbench/parts/files/common/files.ts | 4 -- .../test/browser/fileEditorInput.test.ts | 30 ++++----- .../test/browser/fileEditorModel.test.ts | 4 +- .../files/test/browser/textFileEditor.test.ts | 46 ------------- .../textFileEditorModelManager.test.ts | 2 +- .../services/editor/browser/editorService.ts | 2 - .../workbench/test/browser/services.test.ts | 4 +- .../test/common/editor/editorInput.test.ts | 4 -- .../common/editor/editorStacksModel.test.ts | 7 -- .../common/editor/rangeDecorations.test.ts | 2 +- 27 files changed, 89 insertions(+), 233 deletions(-) delete mode 100644 src/vs/workbench/parts/files/test/browser/textFileEditor.test.ts diff --git a/src/vs/base/common/mime.ts b/src/vs/base/common/mime.ts index 272e14bd738..8357520cda7 100644 --- a/src/vs/base/common/mime.ts +++ b/src/vs/base/common/mime.ts @@ -14,6 +14,7 @@ export let MIME_BINARY = 'application/octet-stream'; export let MIME_UNKNOWN = 'application/unknown'; export interface ITextMimeAssociation { + id: string; mime: string; filename?: string; extension?: string; @@ -75,6 +76,7 @@ export function registerTextMime(association: ITextMimeAssociation): void { function toTextMimeAssociationItem(association: ITextMimeAssociation): ITextMimeAssociationItem { return { + id: association.id, mime: association.mime, filename: association.filename, extension: association.extension, @@ -240,14 +242,14 @@ export function isUnspecific(mime: string[] | string): boolean { return mime.length === 1 && isUnspecific(mime[0]); } -export function suggestFilename(theMime: string, prefix: string): string { +export function suggestFilename(langId: string, prefix: string): string { for (var i = 0; i < registeredAssociations.length; i++) { let association = registeredAssociations[i]; if (association.userConfigured) { continue; // only support registered ones } - if (association.mime === theMime && association.extension) { + if (association.id === langId && association.extension) { return prefix + association.extension; } } diff --git a/src/vs/base/test/common/mime.test.ts b/src/vs/base/test/common/mime.test.ts index 03ab4b905cf..574db7c4e67 100644 --- a/src/vs/base/test/common/mime.test.ts +++ b/src/vs/base/test/common/mime.test.ts @@ -12,28 +12,28 @@ suite('Mime', () => { var guess = guessMimeTypes('foo.monaco'); assert.deepEqual(guess, ['application/unknown']); - registerTextMime({ extension: '.monaco', mime: 'text/monaco' }); + registerTextMime({ id: 'monaco', extension: '.monaco', mime: 'text/monaco' }); guess = guessMimeTypes('foo.monaco'); assert.deepEqual(guess, ['text/monaco', 'text/plain']); guess = guessMimeTypes('.monaco'); assert.deepEqual(guess, ['text/monaco', 'text/plain']); - registerTextMime({ filename: 'Codefile', mime: 'text/code' }); + registerTextMime({ id: 'codefile', filename: 'Codefile', mime: 'text/code' }); guess = guessMimeTypes('Codefile'); assert.deepEqual(guess, ['text/code', 'text/plain']); guess = guessMimeTypes('foo.Codefile'); assert.deepEqual(guess, ['application/unknown']); - registerTextMime({ filepattern: 'Docker*', mime: 'text/docker' }); + registerTextMime({ id: 'docker', filepattern: 'Docker*', mime: 'text/docker' }); guess = guessMimeTypes('Docker-debug'); assert.deepEqual(guess, ['text/docker', 'text/plain']); guess = guessMimeTypes('docker-PROD'); assert.deepEqual(guess, ['text/docker', 'text/plain']); - registerTextMime({ mime: 'text/nice-regex', firstline: /RegexesAreNice/ }); + registerTextMime({ id: 'niceregex', mime: 'text/nice-regex', firstline: /RegexesAreNice/ }); guess = guessMimeTypes('Randomfile.noregistration', 'RegexesAreNice'); assert.deepEqual(guess, ['text/nice-regex', 'text/plain']); @@ -45,8 +45,8 @@ suite('Mime', () => { }); test('Mimes Priority', () => { - registerTextMime({ extension: '.monaco', mime: 'text/monaco' }); - registerTextMime({ mime: 'text/foobar', firstline: /foobar/ }); + registerTextMime({ id: 'monaco', extension: '.monaco', mime: 'text/monaco' }); + registerTextMime({ id: 'foobar', mime: 'text/foobar', firstline: /foobar/ }); var guess = guessMimeTypes('foo.monaco'); assert.deepEqual(guess, ['text/monaco', 'text/plain']); @@ -54,32 +54,32 @@ suite('Mime', () => { guess = guessMimeTypes('foo.monaco', 'foobar'); assert.deepEqual(guess, ['text/monaco', 'text/plain']); - registerTextMime({ filename: 'dockerfile', mime: 'text/winner' }); - registerTextMime({ filepattern: 'dockerfile*', mime: 'text/looser' }); + registerTextMime({ id: 'docker', filename: 'dockerfile', mime: 'text/winner' }); + registerTextMime({ id: 'docker', filepattern: 'dockerfile*', mime: 'text/looser' }); guess = guessMimeTypes('dockerfile'); assert.deepEqual(guess, ['text/winner', 'text/plain']); }); test('Specificity priority 1', () => { - registerTextMime({ extension: '.monaco2', mime: 'text/monaco2' }); - registerTextMime({ filename: 'specific.monaco2', mime: 'text/specific-monaco2' }); + registerTextMime({ id: 'monaco2', extension: '.monaco2', mime: 'text/monaco2' }); + registerTextMime({ id: 'monaco2', filename: 'specific.monaco2', mime: 'text/specific-monaco2' }); assert.deepEqual(guessMimeTypes('specific.monaco2'), ['text/specific-monaco2', 'text/plain']); assert.deepEqual(guessMimeTypes('foo.monaco2'), ['text/monaco2', 'text/plain']); }); test('Specificity priority 2', () => { - registerTextMime({ filename: 'specific.monaco3', mime: 'text/specific-monaco3' }); - registerTextMime({ extension: '.monaco3', mime: 'text/monaco3' }); + registerTextMime({ id: 'monaco3', filename: 'specific.monaco3', mime: 'text/specific-monaco3' }); + registerTextMime({ id: 'monaco3', extension: '.monaco3', mime: 'text/monaco3' }); assert.deepEqual(guessMimeTypes('specific.monaco3'), ['text/specific-monaco3', 'text/plain']); assert.deepEqual(guessMimeTypes('foo.monaco3'), ['text/monaco3', 'text/plain']); }); test('Mimes Priority - Longest Extension wins', () => { - registerTextMime({ extension: '.monaco', mime: 'text/monaco' }); - registerTextMime({ extension: '.monaco.xml', mime: 'text/monaco-xml' }); - registerTextMime({ extension: '.monaco.xml.build', mime: 'text/monaco-xml-build' }); + registerTextMime({ id: 'monaco', extension: '.monaco', mime: 'text/monaco' }); + registerTextMime({ id: 'monaco', extension: '.monaco.xml', mime: 'text/monaco-xml' }); + registerTextMime({ id: 'monaco', extension: '.monaco.xml.build', mime: 'text/monaco-xml-build' }); var guess = guessMimeTypes('foo.monaco'); assert.deepEqual(guess, ['text/monaco', 'text/plain']); @@ -92,16 +92,16 @@ suite('Mime', () => { }); test('Mimes Priority - User configured wins', () => { - registerTextMime({ extension: '.monaco.xnl', mime: 'text/monaco', userConfigured: true }); - registerTextMime({ extension: '.monaco.xml', mime: 'text/monaco-xml' }); + registerTextMime({ id: 'monaco', extension: '.monaco.xnl', mime: 'text/monaco', userConfigured: true }); + registerTextMime({ id: 'monaco', extension: '.monaco.xml', mime: 'text/monaco-xml' }); var guess = guessMimeTypes('foo.monaco.xnl'); assert.deepEqual(guess, ['text/monaco', 'text/plain']); }); test('Mimes Priority - Pattern matches on path if specified', () => { - registerTextMime({ filepattern: '**/dot.monaco.xml', mime: 'text/monaco' }); - registerTextMime({ filepattern: '*ot.other.xml', mime: 'text/other' }); + registerTextMime({ id: 'monaco', filepattern: '**/dot.monaco.xml', mime: 'text/monaco' }); + registerTextMime({ id: 'other', filepattern: '*ot.other.xml', mime: 'text/other' }); var guess = guessMimeTypes('/some/path/dot.monaco.xml'); assert.deepEqual(guess, ['text/monaco', 'text/plain']); diff --git a/src/vs/base/test/node/mime/mime.test.ts b/src/vs/base/test/node/mime/mime.test.ts index 05cd05c7456..0c70e0de9e0 100644 --- a/src/vs/base/test/node/mime/mime.test.ts +++ b/src/vs/base/test/node/mime/mime.test.ts @@ -23,7 +23,7 @@ suite('Mime', () => { }); test('detectMimesFromFile (PNG saved as TXT)', function (done: () => void) { - mimeCommon.registerTextMime({ mime: 'text/plain', extension: '.txt' }); + mimeCommon.registerTextMime({ id: 'text', mime: 'text/plain', extension: '.txt' }); var file = require.toUrl('./fixtures/some.png.txt'); mime.detectMimesFromFile(file, (error, mimes) => { assert.equal(error, null); diff --git a/src/vs/editor/common/services/languagesRegistry.ts b/src/vs/editor/common/services/languagesRegistry.ts index d75938dc3a6..5111fa0c4a7 100644 --- a/src/vs/editor/common/services/languagesRegistry.ts +++ b/src/vs/editor/common/services/languagesRegistry.ts @@ -123,7 +123,7 @@ export class LanguagesRegistry { if (Array.isArray(lang.extensions)) { this.id2Extensions[lang.id] = this.id2Extensions[lang.id] || []; for (let extension of lang.extensions) { - mime.registerTextMime({ mime: primaryMime, extension: extension }); + mime.registerTextMime({ id: lang.id, mime: primaryMime, extension: extension }); this.id2Extensions[lang.id].push(extension); } } @@ -131,14 +131,14 @@ export class LanguagesRegistry { if (Array.isArray(lang.filenames)) { this.id2Filenames[lang.id] = this.id2Filenames[lang.id] || []; for (let filename of lang.filenames) { - mime.registerTextMime({ mime: primaryMime, filename: filename }); + mime.registerTextMime({ id: lang.id, mime: primaryMime, filename: filename }); this.id2Filenames[lang.id].push(filename); } } if (Array.isArray(lang.filenamePatterns)) { for (let filenamePattern of lang.filenamePatterns) { - mime.registerTextMime({ mime: primaryMime, filepattern: filenamePattern }); + mime.registerTextMime({ id: lang.id, mime: primaryMime, filepattern: filenamePattern }); } } @@ -150,7 +150,7 @@ export class LanguagesRegistry { try { var firstLineRegex = new RegExp(firstLineRegexStr); if (!strings.regExpLeadsToEndlessLoop(firstLineRegex)) { - mime.registerTextMime({ mime: primaryMime, firstline: firstLineRegex }); + mime.registerTextMime({ id: lang.id, mime: primaryMime, firstline: firstLineRegex }); } } catch (err) { // Most likely, the regex was bad diff --git a/src/vs/editor/common/services/modeServiceImpl.ts b/src/vs/editor/common/services/modeServiceImpl.ts index 8818607fe08..96cddb7b9d2 100644 --- a/src/vs/editor/common/services/modeServiceImpl.ts +++ b/src/vs/editor/common/services/modeServiceImpl.ts @@ -513,7 +513,7 @@ export class MainThreadModeServiceImpl extends ModeServiceImpl { const langId = configuration.files.associations[pattern]; const mimetype = this.getMimeForMode(langId) || `text/x-${langId}`; - mime.registerTextMime({ mime: mimetype, filepattern: pattern, userConfigured: true }); + mime.registerTextMime({ id: langId, mime: mimetype, filepattern: pattern, userConfigured: true }); }); } } diff --git a/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts b/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts index e406a24e3b3..3cd86c44573 100644 --- a/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts @@ -15,7 +15,7 @@ import {Dimension, Builder, $} from 'vs/base/browser/builder'; import {ResourceViewer} from 'vs/base/browser/ui/resourceviewer/resourceViewer'; import {DomScrollableElement} from 'vs/base/browser/ui/scrollbar/scrollableElement'; import {BaseEditor} from 'vs/workbench/browser/parts/editor/baseEditor'; -import {EditorInput, EditorOptions} from 'vs/workbench/common/editor'; +import {EditorInput, EditorOptions, BINARY_DIFF_EDITOR_ID} from 'vs/workbench/common/editor'; import {BinaryEditorModel} from 'vs/workbench/common/editor/binaryEditorModel'; import {DiffEditorModel} from 'vs/workbench/common/editor/diffEditorModel'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; @@ -27,7 +27,7 @@ import {ScrollbarVisibility} from 'vs/base/common/scrollable'; */ export class BinaryResourceDiffEditor extends BaseEditor implements IVerticalSashLayoutProvider { - public static ID = 'workbench.editors.binaryResourceDiffEditor'; + public static ID = BINARY_DIFF_EDITOR_ID; private static MIN_CONTAINER_WIDTH = 100; diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index 8e219979834..5eec2f06a73 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -16,7 +16,7 @@ import {Position} from 'vs/platform/editor/common/editor'; import {IDiffEditor} from 'vs/editor/browser/editorBrowser'; import {IDiffEditorOptions, IEditorOptions} from 'vs/editor/common/editorCommon'; import {BaseTextEditor} from 'vs/workbench/browser/parts/editor/textEditor'; -import {TextEditorOptions, TextDiffEditorOptions, EditorModel, EditorInput, EditorOptions} from 'vs/workbench/common/editor'; +import {TextEditorOptions, TextDiffEditorOptions, EditorModel, EditorInput, EditorOptions, TEXT_DIFF_EDITOR_ID} from 'vs/workbench/common/editor'; import {StringEditorInput} from 'vs/workbench/common/editor/stringEditorInput'; import {ResourceEditorInput} from 'vs/workbench/common/editor/resourceEditorInput'; import {DiffEditorInput} from 'vs/workbench/common/editor/diffEditorInput'; @@ -44,7 +44,7 @@ export const TextCompareEditorVisible = new RawContextKey('textCompareE */ export class TextDiffEditor extends BaseTextEditor { - public static ID = 'workbench.editors.textDiffEditor'; + public static ID = TEXT_DIFF_EDITOR_ID; private diffNavigator: DiffNavigator; private nextDiffAction: NavigateAction; diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index b25dccd6e9d..a62afe5e8f1 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -36,6 +36,16 @@ export const Extensions = { Editors: 'workbench.contributions.editors' }; +/** + * Text diff editor id. + */ +export const TEXT_DIFF_EDITOR_ID = 'workbench.editors.textDiffEditor'; + +/** + * Binary diff editor id. + */ +export const BINARY_DIFF_EDITOR_ID = 'workbench.editors.binaryResourceDiffEditor'; + export interface IEditorRegistry { /** @@ -323,16 +333,6 @@ export interface IEncodingSupport { */ export interface IFileEditorInput extends IEditorInput, IEncodingSupport { - /** - * Gets the mime type of the file this input is about. - */ - getMime(): string; - - /** - * Sets the mime type of the file this input is about. - */ - setMime(mime: string): void; - /** * Gets the absolute file resource URI this input is about. */ @@ -360,8 +360,6 @@ export abstract class UntitledEditorInput extends EditorInput implements IEncodi abstract suggestFileName(): string; - abstract getMime(): string; - abstract getEncoding(): string; abstract setEncoding(encoding: string, mode: EncodingMode): void; @@ -799,7 +797,7 @@ export function asFileEditorInput(obj: any, supportDiff?: boolean): IFileEditorI let i = obj; - return i instanceof EditorInput && types.areFunctions(i.setResource, i.setMime, i.setEncoding, i.getEncoding, i.getResource, i.getMime) ? i : null; + return i instanceof EditorInput && types.areFunctions(i.setResource, i.setEncoding, i.getEncoding, i.getResource) ? i : null; } export interface IStacksModelChangeEvent { diff --git a/src/vs/workbench/common/editor/diffEditorInput.ts b/src/vs/workbench/common/editor/diffEditorInput.ts index f2fd52ce51f..87506881db4 100644 --- a/src/vs/workbench/common/editor/diffEditorInput.ts +++ b/src/vs/workbench/common/editor/diffEditorInput.ts @@ -6,12 +6,10 @@ import nls = require('vs/nls'); import {TPromise} from 'vs/base/common/winjs.base'; -import types = require('vs/base/common/types'); import {once} from 'vs/base/common/event'; import URI from 'vs/base/common/uri'; import {getPathLabel, IWorkspaceProvider} from 'vs/base/common/labels'; -import {isBinaryMime} from 'vs/base/common/mime'; -import {EditorModel, IFileEditorInput, EditorInput, BaseDiffEditorInput} from 'vs/workbench/common/editor'; +import {EditorModel, EditorInput, BaseDiffEditorInput, TEXT_DIFF_EDITOR_ID, BINARY_DIFF_EDITOR_ID} from 'vs/workbench/common/editor'; import {BaseTextEditorModel} from 'vs/workbench/common/editor/textEditorModel'; import {DiffEditorModel} from 'vs/workbench/common/editor/diffEditorModel'; import {TextDiffEditorModel} from 'vs/workbench/common/editor/textDiffEditorModel'; @@ -109,23 +107,7 @@ export class DiffEditorInput extends BaseDiffEditorInput { } public getPreferredEditorId(candidates: string[]): string { - - // Find the right diff editor for the given isBinary/isText state - const useBinaryEditor = this.forceOpenAsBinary || this.isBinary(this.originalInput) || this.isBinary(this.modifiedInput); - - return !useBinaryEditor ? 'workbench.editors.textDiffEditor' : 'workbench.editors.binaryResourceDiffEditor'; - } - - private isBinary(input: EditorInput): boolean { - let mime: string; - - // Find mime by checking for IFileEditorInput implementors - const fileInput = (input); - if (types.isFunction(fileInput.getMime)) { - mime = fileInput.getMime(); - } - - return mime && isBinaryMime(mime); + return this.forceOpenAsBinary ? BINARY_DIFF_EDITOR_ID : TEXT_DIFF_EDITOR_ID; } private createModel(refresh?: boolean): TPromise { diff --git a/src/vs/workbench/common/editor/stringEditorInput.ts b/src/vs/workbench/common/editor/stringEditorInput.ts index 08e817bfe3b..6d1f65c9a1a 100644 --- a/src/vs/workbench/common/editor/stringEditorInput.ts +++ b/src/vs/workbench/common/editor/stringEditorInput.ts @@ -63,10 +63,6 @@ export class StringEditorInput extends EditorInput { return this.value; } - public getMime(): string { - return this.mime; - } - /** * Sets the textual value of this input and will also update the underlying model if this input is resolved. */ diff --git a/src/vs/workbench/common/editor/stringEditorModel.ts b/src/vs/workbench/common/editor/stringEditorModel.ts index f97fa3c43d6..c56930a3194 100644 --- a/src/vs/workbench/common/editor/stringEditorModel.ts +++ b/src/vs/workbench/common/editor/stringEditorModel.ts @@ -99,10 +99,6 @@ export class StringEditorModel extends BaseTextEditorModel { return null; } - public getMime(): string { - return this.mime; - } - public load(): TPromise { // Create text editor model if not yet done diff --git a/src/vs/workbench/common/editor/untitledEditorInput.ts b/src/vs/workbench/common/editor/untitledEditorInput.ts index 8d527ae4189..2ab31e5a1dc 100644 --- a/src/vs/workbench/common/editor/untitledEditorInput.ts +++ b/src/vs/workbench/common/editor/untitledEditorInput.ts @@ -16,6 +16,7 @@ import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IModeService} from 'vs/editor/common/services/modeService'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import Event, {Emitter} from 'vs/base/common/event'; +import {PLAINTEXT_MODE_ID} from 'vs/editor/common/modes/modesRegistry'; import {ITextFileService} from 'vs/workbench/parts/files/common/files'; // TODO@Ben layer breaker @@ -98,23 +99,17 @@ export class UntitledEditorInput extends AbstractUntitledEditorInput { public suggestFileName(): string { if (!this.hasAssociatedFilePath) { - const mime = this.getMime(); - if (mime && mime !== MIME_TEXT /* do not suggest when the mime type is simple plain text */) { - return suggestFilename(mime, this.getName()); + if (this.cachedModel) { + const modeId = this.cachedModel.getModeId(); + if (modeId !== PLAINTEXT_MODE_ID) { // do not suggest when the mime type is simple plain text + return suggestFilename(modeId, this.getName()); + } } } return this.getName(); } - public getMime(): string { - if (this.cachedModel) { - return this.modeService.getMimeForMode(this.cachedModel.getModeId()); - } - - return null; - } - public getEncoding(): string { if (this.cachedModel) { return this.cachedModel.getEncoding(); diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index e3f87ff280a..eb634f695e5 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -8,7 +8,6 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import errors = require('vs/base/common/errors'); import {toErrorMessage} from 'vs/base/common/errorMessage'; -import {MIME_BINARY} from 'vs/base/common/mime'; import types = require('vs/base/common/types'); import paths = require('vs/base/common/paths'); import {IEditorViewState} from 'vs/editor/common/editorCommon'; @@ -199,7 +198,9 @@ export class TextFileEditor extends BaseTextEditor { } private openAsBinary(input: FileEditorInput, options: EditorOptions): void { - const fileInputBinary = this.instantiationService.createInstance(FileEditorInput, input.getResource(), MIME_BINARY, void 0); + const fileInputBinary = this.instantiationService.createInstance(FileEditorInput, input.getResource(), void 0); + fileInputBinary.setForceOpenAsBinary(); + this.editorService.openEditor(fileInputBinary, options, this.position).done(null, errors.onUnexpectedError); } diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index d6bc9be0b65..ce0c98dbdcd 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -1355,8 +1355,8 @@ export class CompareResourcesAction extends Action { this.tree.clearHighlight(); } - const leftInput = this.instantiationService.createInstance(FileEditorInput, globalResourceToCompare, void 0, void 0); - const rightInput = this.instantiationService.createInstance(FileEditorInput, this.resource, void 0, void 0); + const leftInput = this.instantiationService.createInstance(FileEditorInput, globalResourceToCompare, void 0); + const rightInput = this.instantiationService.createInstance(FileEditorInput, this.resource, void 0); return this.editorService.openEditor(new DiffEditorInput(toDiffLabel(globalResourceToCompare, this.resource, this.contextService), null, leftInput, rightInput)); } diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index 313abce7888..214832ce9b3 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -115,7 +115,7 @@ Registry.as(EditorExtensions.Editors).registerEditor( // Note: because of service injection, the descriptor needs to have the exact count // of arguments as the FileEditorInput constructor. Otherwise when creating an // instance through the instantiation service he will inject the services wrong! -const descriptor = new AsyncDescriptor('vs/workbench/parts/files/common/editors/fileEditorInput', 'FileEditorInput', /* DO NOT REMOVE */ void 0, /* DO NOT REMOVE */ void 0, /* DO NOT REMOVE */ void 0); +const descriptor = new AsyncDescriptor('vs/workbench/parts/files/common/editors/fileEditorInput', 'FileEditorInput', /* DO NOT REMOVE */ void 0, /* DO NOT REMOVE */ void 0); Registry.as(EditorExtensions.Editors).registerDefaultFileInput(descriptor); interface ISerializedFileInput { @@ -139,7 +139,7 @@ class FileEditorInputFactory implements IEditorInputFactory { public deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput { const fileInput: ISerializedFileInput = JSON.parse(serializedEditorInput); - return instantiationService.createInstance(FileEditorInput, URI.parse(fileInput.resource), void 0, void 0); + return instantiationService.createInstance(FileEditorInput, URI.parse(fileInput.resource), void 0); } } diff --git a/src/vs/workbench/parts/files/browser/saveErrorHandler.ts b/src/vs/workbench/parts/files/browser/saveErrorHandler.ts index 3614332c656..b31911389a6 100644 --- a/src/vs/workbench/parts/files/browser/saveErrorHandler.ts +++ b/src/vs/workbench/parts/files/browser/saveErrorHandler.ts @@ -263,7 +263,7 @@ class ResolveSaveConflictMessage implements IMessageWithAction { if (!this.model.isDisposed()) { const mime = guessMimeTypes(resource.fsPath).join(', '); const originalInput = this.instantiationService.createInstance(FileOnDiskEditorInput, resource, mime, paths.basename(resource.fsPath), resource.fsPath); - const modifiedInput = this.instantiationService.createInstance(FileEditorInput, resource, mime, void 0); + const modifiedInput = this.instantiationService.createInstance(FileEditorInput, resource, void 0); const conflictInput = this.instantiationService.createInstance(ConflictResolutionDiffEditorInput, this.model, nls.localize('saveConflictDiffLabel', "{0} (on disk) ↔ {1} (in {2})", modifiedInput.getName(), modifiedInput.getName(), product.nameLong), nls.localize('resolveSaveConflict', "Resolve save conflict"), originalInput, modifiedInput); return this.editorService.openEditor(conflictInput).then(() => { diff --git a/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts b/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts index 7d9caf81aba..fd348e70f79 100644 --- a/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts +++ b/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts @@ -5,18 +5,13 @@ 'use strict'; import {TPromise} from 'vs/base/common/winjs.base'; -import {Registry} from 'vs/platform/platform'; -import types = require('vs/base/common/types'); import paths = require('vs/base/common/paths'); -import {guessMimeTypes} from 'vs/base/common/mime'; import labels = require('vs/base/common/labels'); import URI from 'vs/base/common/uri'; -import strings = require('vs/base/common/strings'); -import assert = require('vs/base/common/assert'); -import {IEditorRegistry, Extensions, EditorModel, EncodingMode, ConfirmResult, IEditorDescriptor} from 'vs/workbench/common/editor'; +import {EditorModel, EncodingMode, ConfirmResult} from 'vs/workbench/common/editor'; import {BinaryEditorModel} from 'vs/workbench/common/editor/binaryEditorModel'; import {IFileOperationResult, FileOperationResult, FileChangesEvent, EventType} from 'vs/platform/files/common/files'; -import {ITextFileService, BINARY_FILE_EDITOR_ID, FILE_EDITOR_INPUT_ID, FileEditorInput as CommonFileEditorInput, AutoSaveMode, ModelState, TextFileModelChangeEvent, IFileEditorDescriptor, LocalFileChangeEvent} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService, BINARY_FILE_EDITOR_ID, TEXT_FILE_EDITOR_ID, FILE_EDITOR_INPUT_ID, FileEditorInput as CommonFileEditorInput, AutoSaveMode, ModelState, TextFileModelChangeEvent, LocalFileChangeEvent} from 'vs/workbench/parts/files/common/files'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IEventService} from 'vs/platform/event/common/event'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; @@ -28,8 +23,8 @@ import {IHistoryService} from 'vs/workbench/services/history/common/history'; */ export class FileEditorInput extends CommonFileEditorInput { private resource: URI; - private mime: string; private preferredEncoding: string; + private forceOpenAsBinary: boolean; private name: string; private description: string; @@ -42,7 +37,6 @@ export class FileEditorInput extends CommonFileEditorInput { */ constructor( resource: URI, - mime: string, preferredEncoding: string, @IInstantiationService private instantiationService: IInstantiationService, @IWorkspaceContextService private contextService: IWorkspaceContextService, @@ -56,7 +50,6 @@ export class FileEditorInput extends CommonFileEditorInput { if (resource) { this.setResource(resource); - this.setMime(mime || guessMimeTypes(this.resource.fsPath).join(', ')); this.preferredEncoding = preferredEncoding; } @@ -112,16 +105,6 @@ export class FileEditorInput extends CommonFileEditorInput { return this.resource; } - public getMime(): string { - return this.mime; - } - - public setMime(mime: string): void { - assert.ok(mime, 'Editor input needs mime type'); - - this.mime = mime; - } - public setPreferredEncoding(encoding: string): void { this.preferredEncoding = encoding; } @@ -144,6 +127,10 @@ export class FileEditorInput extends CommonFileEditorInput { } } + public setForceOpenAsBinary(): void { + this.forceOpenAsBinary = true; + } + public getTypeId(): string { return FILE_EDITOR_INPUT_ID; } @@ -203,38 +190,7 @@ export class FileEditorInput extends CommonFileEditorInput { } public getPreferredEditorId(candidates: string[]): string { - const editorRegistry = (Registry.as(Extensions.Editors)); - - // Lookup Editor by Mime - let descriptor: IEditorDescriptor; - const mimes = this.mime.split(','); - for (let m = 0; m < mimes.length; m++) { - const mime = strings.trim(mimes[m]); - - for (let i = 0; i < candidates.length; i++) { - descriptor = editorRegistry.getEditorById(candidates[i]); - - if (types.isFunction((descriptor).getMimeTypes)) { - const mimetypes = (descriptor).getMimeTypes(); - for (let j = 0; j < mimetypes.length; j++) { - const mimetype = mimetypes[j]; - - // Check for direct mime match - if (mime === mimetype) { - return descriptor.getId(); - } - - // Otherwise check for wildcard mime matches - if (strings.endsWith(mimetype, '/*') && strings.startsWith(mime, mimetype.substring(0, mimetype.length - 1))) { - return descriptor.getId(); - } - } - } - } - } - - // Otherwise use default editor - return BINARY_FILE_EDITOR_ID; + return this.forceOpenAsBinary ? BINARY_FILE_EDITOR_ID : TEXT_FILE_EDITOR_ID; } public resolve(refresh?: boolean): TPromise { @@ -283,13 +239,6 @@ export class FileEditorInput extends CommonFileEditorInput { } if (otherInput) { - - // Note that we can not test for the mime type here because we cache resolved file editor input models by resource. And - // these models have a fixed mode association that can not be changed afterwards. As such, we always treat this input - // equal if the resource is equal so that there is always just one text editor model (with undo hisotry etc.) around. - // - // !!! DO NOT CHANGE THIS ASSUMPTION !!! - // return otherInput instanceof FileEditorInput && (otherInput).resource.toString() === this.resource.toString(); } diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/parts/files/common/files.ts index b25d71ee21a..a11089d3977 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/parts/files/common/files.ts @@ -50,10 +50,6 @@ export abstract class FileEditorInput extends EditorInput implements IFileEditor public abstract getResource(): URI; - public abstract setMime(mime: string): void; - - public abstract getMime(): string; - public abstract setPreferredEncoding(encoding: string): void; public abstract setEncoding(encoding: string, mode: EncodingMode): void; diff --git a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts b/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts index 6ca8b272514..d01ff1e5e15 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts @@ -53,9 +53,9 @@ suite('Files - FileEditorInput', () => { }); test('Basics', function (done) { - let input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/file.js'), 'text/javascript', void 0); - const otherInput = instantiationService.createInstance(FileEditorInput, toResource('foo/bar/otherfile.js'), 'text/javascript', void 0); - const otherInputSame = instantiationService.createInstance(FileEditorInput, toResource('foo/bar/file.js'), 'text/javascript', void 0); + let input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/file.js'), void 0); + const otherInput = instantiationService.createInstance(FileEditorInput, toResource('foo/bar/otherfile.js'), void 0); + const otherInputSame = instantiationService.createInstance(FileEditorInput, toResource('foo/bar/file.js'), void 0); assert(input.matches(input)); assert(input.matches(otherInputSame)); @@ -72,8 +72,8 @@ suite('Files - FileEditorInput', () => { input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar.html'), 'text/html', void 0); - const inputToResolve: any = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/file.js'), 'text/javascript', void 0); - const sameOtherInput = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/file.js'), 'text/javascript', void 0); + const inputToResolve: any = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/file.js'), void 0); + const sameOtherInput = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/file.js'), void 0); return accessor.editorService.resolveEditorModel(inputToResolve, true).then(resolved => { const resolvedModelA = resolved; @@ -115,8 +115,8 @@ suite('Files - FileEditorInput', () => { }); test('matches', function () { - const input1 = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), 'text/javascript', void 0); - const input2 = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), 'text/javascript', void 0); + const input1 = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), void 0); + const input2 = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), void 0); assert.strictEqual(input1.matches(null), false); assert.strictEqual(input1.matches(input1), true); @@ -124,7 +124,7 @@ suite('Files - FileEditorInput', () => { }); test('getEncoding/setEncoding', function (done) { - const input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), 'text/javascript', void 0); + const input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), void 0); input.setEncoding('utf16', EncodingMode.Encode); assert.equal(input.getEncoding(), 'utf16'); @@ -139,7 +139,7 @@ suite('Files - FileEditorInput', () => { }); test('save', function (done) { - const input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), 'text/javascript', void 0); + const input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), void 0); return accessor.editorService.resolveEditorModel(input, true).then((resolved: ITextFileEditorModel) => { resolved.textEditorModel.setValue('changed'); @@ -156,7 +156,7 @@ suite('Files - FileEditorInput', () => { }); test('revert', function (done) { - const input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), 'text/javascript', void 0); + const input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), void 0); return accessor.editorService.resolveEditorModel(input, true).then((resolved: ITextFileEditorModel) => { resolved.textEditorModel.setValue('changed'); @@ -173,7 +173,7 @@ suite('Files - FileEditorInput', () => { }); test('resolve handles binary files', function (done) { - const input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), 'text/javascript', void 0); + const input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/updatefile.js'), void 0); accessor.textFileService.setResolveTextContentErrorOnce({ message: 'error', @@ -192,14 +192,14 @@ suite('Files - FileEditorInput', () => { test('disposes when resource gets deleted - local file changes', function () { const parent = toResource('/foo/bar'); const resource = toResource('/foo/bar/updatefile.js'); - let input = instantiationService.createInstance(FileEditorInput, resource, 'text/javascript', void 0); + let input = instantiationService.createInstance(FileEditorInput, resource, void 0); assert.ok(!input.isDisposed()); accessor.eventService.emit('files.internal:fileChanged', new LocalFileChangeEvent(toStat(resource))); assert.ok(input.isDisposed()); - input = instantiationService.createInstance(FileEditorInput, resource, 'text/javascript', void 0); + input = instantiationService.createInstance(FileEditorInput, resource, void 0); const other = toResource('/foo/barfoo'); @@ -218,14 +218,14 @@ suite('Files - FileEditorInput', () => { test('disposes when resource gets deleted - remote file changes', function () { const parent = toResource('/foo/bar'); const resource = toResource('/foo/bar/updatefile.js'); - let input = instantiationService.createInstance(FileEditorInput, resource, 'text/javascript', void 0); + let input = instantiationService.createInstance(FileEditorInput, resource, void 0); assert.ok(!input.isDisposed()); accessor.eventService.emit(EventType.FILE_CHANGES, new FileChangesEvent([{ resource, type: FileChangeType.DELETED }])); assert.ok(input.isDisposed()); - input = instantiationService.createInstance(FileEditorInput, resource, 'text/javascript', void 0); + input = instantiationService.createInstance(FileEditorInput, resource, void 0); const other = toResource('/foo/barfoo'); diff --git a/src/vs/workbench/parts/files/test/browser/fileEditorModel.test.ts b/src/vs/workbench/parts/files/test/browser/fileEditorModel.test.ts index e3bd65fbd1e..9752c86157b 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEditorModel.test.ts +++ b/src/vs/workbench/parts/files/test/browser/fileEditorModel.test.ts @@ -238,8 +238,8 @@ suite('Files - TextFileEditorModel', () => { }); test('save() and isDirty() - proper with check for mtimes', function (done) { - const input1 = instantiationService.createInstance(FileEditorInput, toResource('/path/index_async2.txt'), 'text/plain', 'utf8'); - const input2 = instantiationService.createInstance(FileEditorInput, toResource('/path/index_async.txt'), 'text/plain', 'utf8'); + const input1 = instantiationService.createInstance(FileEditorInput, toResource('/path/index_async2.txt'), 'utf8'); + const input2 = instantiationService.createInstance(FileEditorInput, toResource('/path/index_async.txt'), 'utf8'); input1.resolve().then((model1: TextFileEditorModel) => { input2.resolve().then((model2: TextFileEditorModel) => { diff --git a/src/vs/workbench/parts/files/test/browser/textFileEditor.test.ts b/src/vs/workbench/parts/files/test/browser/textFileEditor.test.ts deleted file mode 100644 index 0fa1f69a078..00000000000 --- a/src/vs/workbench/parts/files/test/browser/textFileEditor.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import {strictEqual, equal} from 'assert'; -import {join} from 'vs/base/common/paths'; -import URI from 'vs/base/common/uri'; -import {FileEditorDescriptor} from 'vs/workbench/parts/files/browser/files'; -import {Registry} from 'vs/platform/platform'; -import {SyncDescriptor} from 'vs/platform/instantiation/common/descriptors'; -import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; -import {Extensions} from 'vs/workbench/common/editor'; -import {workbenchInstantiationService} from 'vs/test/utils/servicesTestUtils'; - -const ExtensionId = Extensions.Editors; - -suite('Files - TextFileEditor', () => { - - test('TextFile Editor Registration', function () { - const d1 = new FileEditorDescriptor('ce-id1', 'name', 'vs/workbench/parts/files/browser/tests/contentEditor.test', 'MyClass', ['test-text/html', 'test-text/javascript']); - const d2 = new FileEditorDescriptor('ce-id2', 'name', 'vs/workbench/parts/files/browser/tests/contentEditor.test', 'MyOtherClass', ['test-text/css', 'test-text/javascript']); - - const oldEditors = Registry.as(ExtensionId).getEditors(); - Registry.as(ExtensionId).setEditors([]); - - const oldEditorCnt = Registry.as(ExtensionId).getEditors().length; - const oldInputCnt = Registry.as(ExtensionId).getEditorInputs().length; - - Registry.as(ExtensionId).registerEditor(d1, new SyncDescriptor(FileEditorInput)); - Registry.as(ExtensionId).registerEditor(d2, new SyncDescriptor(FileEditorInput)); - - equal(Registry.as(ExtensionId).getEditors().length, oldEditorCnt + 2); - equal(Registry.as(ExtensionId).getEditorInputs().length, oldInputCnt + 2); - - const instantiationService = workbenchInstantiationService(); - - strictEqual(Registry.as(ExtensionId).getEditor(instantiationService.createInstance(FileEditorInput, URI.file(join('C:\\', '/foo/bar/foobar.html')), 'test-text/html', void 0)), d1); - strictEqual(Registry.as(ExtensionId).getEditor(instantiationService.createInstance(FileEditorInput, URI.file(join('C:\\', '/foo/bar/foobar.js')), 'test-text/javascript', void 0)), d1); - strictEqual(Registry.as(ExtensionId).getEditor(instantiationService.createInstance(FileEditorInput, URI.file(join('C:\\', '/foo/bar/foobar.css')), 'test-text/css', void 0)), d2); - - Registry.as(ExtensionId).setEditors(oldEditors); - }); -}); \ No newline at end of file diff --git a/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts b/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts index 12c67a17a79..21616e674c3 100644 --- a/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts +++ b/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts @@ -146,7 +146,7 @@ suite('Files - TextFileEditorModelManager', () => { const model: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, resource, 'utf8'); manager.add(resource, model); - const input = instantiationService.createInstance(FileEditorInput, resource, 'text/plain', void 0); + const input = instantiationService.createInstance(FileEditorInput, resource, void 0); const stacks = accessor.editorGroupService.getStacksModel(); const group = stacks.openGroup('group', true); diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index c5f826a7ed9..bfbbbeaaa1c 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -6,7 +6,6 @@ import {TPromise} from 'vs/base/common/winjs.base'; import URI from 'vs/base/common/uri'; -import {guessMimeTypes} from 'vs/base/common/mime'; import network = require('vs/base/common/network'); import {Registry} from 'vs/platform/platform'; import {basename, dirname} from 'vs/base/common/paths'; @@ -280,7 +279,6 @@ export class WorkbenchEditorService implements IWorkbenchEditorService { private createFileInput(resource: URI, encoding?: string): TPromise { return this.instantiationService.createInstance(this.fileInputDescriptor).then((typedFileInput) => { typedFileInput.setResource(resource); - typedFileInput.setMime(guessMimeTypes(resource.fsPath).join(', ')); typedFileInput.setPreferredEncoding(encoding); return typedFileInput; diff --git a/src/vs/workbench/test/browser/services.test.ts b/src/vs/workbench/test/browser/services.test.ts index 29ba658646e..64e1260235c 100644 --- a/src/vs/workbench/test/browser/services.test.ts +++ b/src/vs/workbench/test/browser/services.test.ts @@ -272,7 +272,7 @@ suite('Workbench UI Services', () => { test('WorkbenchEditorService', function () { let instantiationService = workbenchInstantiationService(); - let activeInput: EditorInput = instantiationService.createInstance(FileEditorInput, toResource('/something.js'), 'text/javascript', void 0); + let activeInput: EditorInput = instantiationService.createInstance(FileEditorInput, toResource('/something.js'), void 0); let testEditorPart = new TestEditorPart(); testEditorPart.setActiveEditorInput(activeInput); @@ -333,7 +333,7 @@ suite('Workbench UI Services', () => { test('DelegatingWorkbenchEditorService', function () { let instantiationService = workbenchInstantiationService(); - let activeInput: EditorInput = instantiationService.createInstance(FileEditorInput, toResource('/something.js'), 'text/javascript', void 0); + let activeInput: EditorInput = instantiationService.createInstance(FileEditorInput, toResource('/something.js'), void 0); let testEditorPart = new TestEditorPart(); testEditorPart.setActiveEditorInput(activeInput); diff --git a/src/vs/workbench/test/common/editor/editorInput.test.ts b/src/vs/workbench/test/common/editor/editorInput.test.ts index b5a6e4e10fa..be9922707af 100644 --- a/src/vs/workbench/test/common/editor/editorInput.test.ts +++ b/src/vs/workbench/test/common/editor/editorInput.test.ts @@ -10,10 +10,6 @@ import {EditorInput} from 'vs/workbench/common/editor'; import {DiffEditorInput} from 'vs/workbench/common/editor/diffEditorInput'; class MyEditorInput extends EditorInput { - getMime() { - return 'text/css'; - } - public getTypeId(): string { return ''; } diff --git a/src/vs/workbench/test/common/editor/editorStacksModel.test.ts b/src/vs/workbench/test/common/editor/editorStacksModel.test.ts index a529a78850d..94c3822ec46 100644 --- a/src/vs/workbench/test/common/editor/editorStacksModel.test.ts +++ b/src/vs/workbench/test/common/editor/editorStacksModel.test.ts @@ -144,9 +144,6 @@ class TestFileEditorInput extends EditorInput implements IFileEditorInput { public setResource(r: URI): void { } - public setMime(mime: string) { - } - public setEncoding(encoding: string) { } @@ -160,10 +157,6 @@ class TestFileEditorInput extends EditorInput implements IFileEditorInput { public getResource(): URI { return this.resource; } - - public getMime(): string { - return null; - } } function input(id = String(index++), nonSerializable?: boolean, resource?: URI): EditorInput { diff --git a/src/vs/workbench/test/common/editor/rangeDecorations.test.ts b/src/vs/workbench/test/common/editor/rangeDecorations.test.ts index ae2c0c1dbef..6e0b98dddc2 100644 --- a/src/vs/workbench/test/common/editor/rangeDecorations.test.ts +++ b/src/vs/workbench/test/common/editor/rangeDecorations.test.ts @@ -149,7 +149,7 @@ suite('Editor - Range decorations', () => { function mockEditorService(editorInput: IEditorInput) function mockEditorService(resource: URI) function mockEditorService(arg: any) { - let editorInput: IEditorInput = arg instanceof URI ? instantiationService.createInstance(FileEditorInput, arg, '', '') : arg; + let editorInput: IEditorInput = arg instanceof URI ? instantiationService.createInstance(FileEditorInput, arg, void 0) : arg; instantiationService.stub(WorkbenchEditorService.IWorkbenchEditorService, 'getActiveEditorInput', editorInput); } From 03468f68786c08dacea82095c85f75837f124985 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 13:17:00 +0200 Subject: [PATCH 391/433] remove (now) unused code --- .../parts/files/browser/fileActions.ts | 18 ------------- .../parts/files/browser/files.contribution.ts | 25 ++++------------- src/vs/workbench/parts/files/browser/files.ts | 27 ------------------- src/vs/workbench/parts/files/common/files.ts | 6 +---- 4 files changed, 6 insertions(+), 70 deletions(-) delete mode 100644 src/vs/workbench/parts/files/browser/files.ts diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index ce0c98dbdcd..53431f18786 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -10,7 +10,6 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import {isWindows, isLinux, isMacintosh} from 'vs/base/common/platform'; import {sequence, ITask} from 'vs/base/common/async'; -import {isBinaryMime, guessMimeTypes} from 'vs/base/common/mime'; import paths = require('vs/base/common/paths'); import URI from 'vs/base/common/uri'; import errors = require('vs/base/common/errors'); @@ -1328,23 +1327,6 @@ export class CompareResourcesAction extends Action { return false; } - const mimeA = guessMimeTypes(this.resource.fsPath).join(', '); - const mimeB = guessMimeTypes(globalResourceToCompare.fsPath).join(', '); - - // Check if target has same mime - if (mimeA === mimeB) { - return true; - } - - // Ensure the mode is equal if this is text (limitation of current diff infrastructure) - const isBinaryA = isBinaryMime(mimeA); - const isBinaryB = isBinaryMime(mimeB); - - // Ensure we are not comparing binary with text - if (isBinaryA !== isBinaryB) { - return false; - } - return true; } diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index 214832ce9b3..b750e467a74 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -16,8 +16,8 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'v import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actionRegistry'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory, EditorInput, IFileEditorInput } from 'vs/workbench/common/editor'; -import { FileEditorDescriptor } from 'vs/workbench/parts/files/browser/files'; import { AutoSaveConfiguration, SUPPORTED_ENCODINGS } from 'vs/platform/files/common/files'; +import { EditorDescriptor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { FILE_EDITOR_INPUT_ID, VIEWLET_ID } from 'vs/workbench/parts/files/common/files'; import { FileEditorTracker } from 'vs/workbench/parts/files/common/editors/fileEditorTracker'; import { SaveErrorHandler } from 'vs/workbench/parts/files/browser/saveErrorHandler'; @@ -73,19 +73,11 @@ registry.registerWorkbenchAction( // Register file editors Registry.as(EditorExtensions.Editors).registerEditor( - new FileEditorDescriptor( + new EditorDescriptor( TextFileEditor.ID, // explicit dependency because we don't want these editors lazy loaded nls.localize('textFileEditor', "Text File Editor"), 'vs/workbench/parts/files/browser/editors/textFileEditor', - 'TextFileEditor', - [ - 'text/*', - - // In case the mime type is unknown, we prefer the text file editor over the binary editor to leave a chance - // of opening a potential text file properly. The resolution of the file in the text file editor will fail - // early on in case the file is actually binary, to prevent downloading a potential large binary file. - 'application/unknown' - ] + 'TextFileEditor' ), [ new SyncDescriptor(FileEditorInput) @@ -93,18 +85,11 @@ Registry.as(EditorExtensions.Editors).registerEditor( ); Registry.as(EditorExtensions.Editors).registerEditor( - new FileEditorDescriptor( + new EditorDescriptor( BinaryFileEditor.ID, // explicit dependency because we don't want these editors lazy loaded nls.localize('binaryFileEditor', "Binary File Editor"), 'vs/workbench/parts/files/browser/editors/binaryFileEditor', - 'BinaryFileEditor', - [ - 'image/*', - 'application/pdf', - 'audio/*', - 'video/*', - 'application/octet-stream' - ] + 'BinaryFileEditor' ), [ new SyncDescriptor(FileEditorInput) diff --git a/src/vs/workbench/parts/files/browser/files.ts b/src/vs/workbench/parts/files/browser/files.ts deleted file mode 100644 index fd8b85e2e49..00000000000 --- a/src/vs/workbench/parts/files/browser/files.ts +++ /dev/null @@ -1,27 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import {EditorDescriptor} from 'vs/workbench/browser/parts/editor/baseEditor'; -import {IFileEditorDescriptor} from 'vs/workbench/parts/files/common/files'; - -/** - * A lightweight descriptor of an editor for files. Optionally allows to specify a list of mime types the editor - * should be used for. This allows for fine grained contribution of editors to the Platform based on mime types. Wildcards - * can be used (e.g. text/*) to register an editor on a wider range of mime types. - */ -export class FileEditorDescriptor extends EditorDescriptor implements IFileEditorDescriptor { - private mimetypes: string[]; - - constructor(id: string, name: string, moduleId: string, ctorName: string, mimetypes: string[]) { - super(id, name, moduleId, ctorName); - - this.mimetypes = mimetypes; - } - - public getMimeTypes(): string[] { - return this.mimetypes; - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/parts/files/common/files.ts index a11089d3977..2525244dea5 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/parts/files/common/files.ts @@ -10,7 +10,7 @@ import URI from 'vs/base/common/uri'; import Event from 'vs/base/common/event'; import {IEditorOptions, IRawText} from 'vs/editor/common/editorCommon'; import {IDisposable} from 'vs/base/common/lifecycle'; -import {IEncodingSupport, EncodingMode, EditorInput, IFileEditorInput, ConfirmResult, IWorkbenchEditorConfiguration, IEditorDescriptor} from 'vs/workbench/common/editor'; +import {IEncodingSupport, EncodingMode, EditorInput, IFileEditorInput, ConfirmResult, IWorkbenchEditorConfiguration} from 'vs/workbench/common/editor'; import {IFileStat, IFilesConfiguration, IBaseStat, IResolveContentOptions} from 'vs/platform/files/common/files'; import {createDecorator} from 'vs/platform/instantiation/common/instantiation'; import {FileStat} from 'vs/workbench/parts/files/common/explorerViewModel'; @@ -236,10 +236,6 @@ export enum SaveReason { WINDOW_CHANGE = 4 } -export interface IFileEditorDescriptor extends IEditorDescriptor { - getMimeTypes(): string[]; -} - export const ITextFileService = createDecorator(TEXT_FILE_SERVICE_ID); export interface IRawTextContent extends IBaseStat { From 88c3cad7a054044ea64e25c3a8589828fd1f8cbe Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 13:30:40 +0200 Subject: [PATCH 392/433] debt: no more mimes in any workbench editor --- .../common/editor/binaryEditorModel.ts | 2 +- .../common/editor/stringEditorInput.ts | 21 ++++++++++--------- .../common/editor/stringEditorModel.ts | 8 +++---- .../common/editor/textEditorModel.ts | 14 ++++++------- .../common/editor/untitledEditorInput.ts | 16 ++++---------- .../common/editor/untitledEditorModel.ts | 14 ++++++------- 6 files changed, 34 insertions(+), 41 deletions(-) diff --git a/src/vs/workbench/common/editor/binaryEditorModel.ts b/src/vs/workbench/common/editor/binaryEditorModel.ts index 4f619860b69..e9008b320c5 100644 --- a/src/vs/workbench/common/editor/binaryEditorModel.ts +++ b/src/vs/workbench/common/editor/binaryEditorModel.ts @@ -10,7 +10,7 @@ import URI from 'vs/base/common/uri'; import {IFileService} from 'vs/platform/files/common/files'; /** - * An editor model that just represents a resource and mime for a resource that can be loaded. + * An editor model that just represents a resource that can be loaded. */ export class BinaryEditorModel extends EditorModel { private name: string; diff --git a/src/vs/workbench/common/editor/stringEditorInput.ts b/src/vs/workbench/common/editor/stringEditorInput.ts index 6d1f65c9a1a..cbab9f5d331 100644 --- a/src/vs/workbench/common/editor/stringEditorInput.ts +++ b/src/vs/workbench/common/editor/stringEditorInput.ts @@ -5,14 +5,14 @@ 'use strict'; import {TPromise} from 'vs/base/common/winjs.base'; -import {MIME_TEXT} from 'vs/base/common/mime'; +import {PLAINTEXT_MODE_ID} from 'vs/editor/common/modes/modesRegistry'; import {EditorModel, EditorInput} from 'vs/workbench/common/editor'; import {StringEditorModel} from 'vs/workbench/common/editor/stringEditorModel'; import URI from 'vs/base/common/uri'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; /** - * A read-only text editor input whos contents are made of the provided value and mime type. + * A read-only text editor input whos contents are made of the provided value and mode ID. */ export class StringEditorInput extends EditorInput { @@ -20,17 +20,18 @@ export class StringEditorInput extends EditorInput { protected cachedModel: StringEditorModel; + protected value: string; + private name: string; private description: string; - protected value: string; - protected mime: string; + private modeId: string; private singleton: boolean; constructor( name: string, description: string, value: string, - mime: string, + modeId: string, singleton: boolean, @IInstantiationService private instantiationService: IInstantiationService ) { @@ -39,7 +40,7 @@ export class StringEditorInput extends EditorInput { this.name = name; this.description = description; this.value = value; - this.mime = mime || MIME_TEXT; + this.modeId = modeId || PLAINTEXT_MODE_ID; this.singleton = singleton; } @@ -119,7 +120,7 @@ export class StringEditorInput extends EditorInput { } //Otherwise Create Model and Load - let model = this.instantiationService.createInstance(StringEditorModel, this.value, this.mime, this.getResource()); + let model = this.instantiationService.createInstance(StringEditorModel, this.value, this.modeId, this.getResource()); return model.load().then((resolvedModel: StringEditorModel) => { this.cachedModel = resolvedModel; @@ -135,8 +136,8 @@ export class StringEditorInput extends EditorInput { if (otherInput instanceof StringEditorInput) { let otherStringEditorInput = otherInput; - // If both inputs are singletons, check on the mime for equalness - if (otherStringEditorInput.singleton && this.singleton && otherStringEditorInput.mime === this.mime) { + // If both inputs are singletons, check on the modeId for equalness + if (otherStringEditorInput.singleton && this.singleton && otherStringEditorInput.modeId === this.modeId) { return true; } @@ -149,7 +150,7 @@ export class StringEditorInput extends EditorInput { // Otherwise compare by properties return otherStringEditorInput.value === this.value && - otherStringEditorInput.mime === this.mime && + otherStringEditorInput.modeId === this.modeId && otherStringEditorInput.description === this.description && otherStringEditorInput.name === this.name; } diff --git a/src/vs/workbench/common/editor/stringEditorModel.ts b/src/vs/workbench/common/editor/stringEditorModel.ts index c56930a3194..02dbd71eb6e 100644 --- a/src/vs/workbench/common/editor/stringEditorModel.ts +++ b/src/vs/workbench/common/editor/stringEditorModel.ts @@ -19,12 +19,12 @@ import {EditOperation} from 'vs/editor/common/core/editOperation'; */ export class StringEditorModel extends BaseTextEditorModel { protected value: string; - protected mime: string; + protected modeId: string; protected resource: URI; constructor( value: string, - mime: string, + modeId: string, resource: URI, @IModeService modeService: IModeService, @IModelService modelService: IModelService @@ -32,7 +32,7 @@ export class StringEditorModel extends BaseTextEditorModel { super(modelService, modeService); this.value = value; - this.mime = mime; + this.modeId = modeId; this.resource = resource; } @@ -103,7 +103,7 @@ export class StringEditorModel extends BaseTextEditorModel { // Create text editor model if not yet done if (!this.textEditorModel) { - return this.createTextEditorModel(this.value, this.resource, this.mime); + return this.createTextEditorModel(this.value, this.resource, this.modeId); } // Otherwise update diff --git a/src/vs/workbench/common/editor/textEditorModel.ts b/src/vs/workbench/common/editor/textEditorModel.ts index aac6121f159..c03cd043456 100644 --- a/src/vs/workbench/common/editor/textEditorModel.ts +++ b/src/vs/workbench/common/editor/textEditorModel.ts @@ -65,11 +65,11 @@ export abstract class BaseTextEditorModel extends EditorModel implements ITextEd } /** - * Creates the text editor model with the provided value, mime (can be comma separated for multiple values) and optional resource URL. + * Creates the text editor model with the provided value, modeId (can be comma separated for multiple values) and optional resource URL. */ - protected createTextEditorModel(value: string | IRawText, resource?: URI, mime?: string): TPromise { + protected createTextEditorModel(value: string | IRawText, resource?: URI, modeId?: string): TPromise { const firstLineText = this.getFirstLineText(value); - const mode = this.getOrCreateMode(this.modeService, mime, firstLineText); + const mode = this.getOrCreateMode(this.modeService, modeId, firstLineText); // To avoid flickering, give the mode at most 50ms to load. If the mode doesn't load in 50ms, proceed creating the model with a mode promise return TPromise.any([TPromise.timeout(50), mode]).then(() => { @@ -125,8 +125,8 @@ export abstract class BaseTextEditorModel extends EditorModel implements ITextEd * * @param firstLineText optional first line of the text buffer to set the mode on. This can be used to guess a mode from content. */ - protected getOrCreateMode(modeService: IModeService, mime: string, firstLineText?: string): TPromise { - return modeService.getOrCreateMode(mime); + protected getOrCreateMode(modeService: IModeService, modeId: string, firstLineText?: string): TPromise { + return modeService.getOrCreateMode(modeId); } /** @@ -156,13 +156,13 @@ export abstract class BaseTextEditorModel extends EditorModel implements ITextEd /** * Updates the text editor model mode based on the settings and configuration. */ - protected updateTextEditorModelMode(mime?: string): void { + protected updateTextEditorModelMode(modeId?: string): void { if (!this.textEditorModel) { return; } const firstLineText = this.getFirstLineText(this.textEditorModel.getValue()); - const mode = this.getOrCreateMode(this.modeService, mime, firstLineText); + const mode = this.getOrCreateMode(this.modeService, modeId, firstLineText); this.modelService.setMode(this.textEditorModel, mode); } diff --git a/src/vs/workbench/common/editor/untitledEditorInput.ts b/src/vs/workbench/common/editor/untitledEditorInput.ts index 2ab31e5a1dc..0159864a62c 100644 --- a/src/vs/workbench/common/editor/untitledEditorInput.ts +++ b/src/vs/workbench/common/editor/untitledEditorInput.ts @@ -6,8 +6,9 @@ import {TPromise} from 'vs/base/common/winjs.base'; import URI from 'vs/base/common/uri'; -import {isUnspecific, guessMimeTypes, MIME_TEXT, suggestFilename} from 'vs/base/common/mime'; +import {suggestFilename} from 'vs/base/common/mime'; import labels = require('vs/base/common/labels'); +import {PLAINTEXT_MODE_ID} from 'vs/editor/common/modes/modesRegistry'; import paths = require('vs/base/common/paths'); import {UntitledEditorInput as AbstractUntitledEditorInput, EncodingMode, ConfirmResult} from 'vs/workbench/common/editor'; import {UntitledEditorModel} from 'vs/workbench/common/editor/untitledEditorModel'; @@ -16,7 +17,6 @@ import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IModeService} from 'vs/editor/common/services/modeService'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import Event, {Emitter} from 'vs/base/common/event'; -import {PLAINTEXT_MODE_ID} from 'vs/editor/common/modes/modesRegistry'; import {ITextFileService} from 'vs/workbench/parts/files/common/files'; // TODO@Ben layer breaker @@ -101,7 +101,7 @@ export class UntitledEditorInput extends AbstractUntitledEditorInput { if (!this.hasAssociatedFilePath) { if (this.cachedModel) { const modeId = this.cachedModel.getModeId(); - if (modeId !== PLAINTEXT_MODE_ID) { // do not suggest when the mime type is simple plain text + if (modeId !== PLAINTEXT_MODE_ID) { // do not suggest when the mode ID is simple plain text return suggestFilename(modeId, this.getName()); } } @@ -142,15 +142,7 @@ export class UntitledEditorInput extends AbstractUntitledEditorInput { private createModel(): UntitledEditorModel { const content = ''; - let mime = this.modeId; - if (!mime && this.hasAssociatedFilePath) { - const mimeFromPath = guessMimeTypes(this.resource.fsPath)[0]; - if (!isUnspecific(mimeFromPath)) { - mime = mimeFromPath; // take most specific mime type if file path is associated and mime is specific - } - } - - const model = this.instantiationService.createInstance(UntitledEditorModel, content, mime || MIME_TEXT, this.resource, this.hasAssociatedFilePath); + const model = this.instantiationService.createInstance(UntitledEditorModel, content, this.modeId, this.resource, this.hasAssociatedFilePath); // re-emit some events from the model this.toUnbind.push(model.onDidChangeDirty(() => this._onDidChangeDirty.fire())); diff --git a/src/vs/workbench/common/editor/untitledEditorModel.ts b/src/vs/workbench/common/editor/untitledEditorModel.ts index c3f5c3cb1d1..177ab7cb73c 100644 --- a/src/vs/workbench/common/editor/untitledEditorModel.ts +++ b/src/vs/workbench/common/editor/untitledEditorModel.ts @@ -9,13 +9,13 @@ import {TPromise} from 'vs/base/common/winjs.base'; import {EditorModel, IEncodingSupport} from 'vs/workbench/common/editor'; import {StringEditorModel} from 'vs/workbench/common/editor/stringEditorModel'; import URI from 'vs/base/common/uri'; +import {PLAINTEXT_MODE_ID} from 'vs/editor/common/modes/modesRegistry'; import {EndOfLinePreference} from 'vs/editor/common/editorCommon'; import {IFilesConfiguration} from 'vs/platform/files/common/files'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {IModeService} from 'vs/editor/common/services/modeService'; import {IModelService} from 'vs/editor/common/services/modelService'; import {IMode} from 'vs/editor/common/modes'; -import {isUnspecific} from 'vs/base/common/mime'; import Event, {Emitter} from 'vs/base/common/event'; export class UntitledEditorModel extends StringEditorModel implements IEncodingSupport { @@ -33,14 +33,14 @@ export class UntitledEditorModel extends StringEditorModel implements IEncodingS constructor( value: string, - mime: string, + modeId: string, resource: URI, hasAssociatedFilePath: boolean, @IModeService modeService: IModeService, @IModelService modelService: IModelService, @IConfigurationService private configurationService: IConfigurationService ) { - super(value, mime, resource, modeService, modelService); + super(value, modeId, resource, modeService, modelService); this.hasAssociatedFilePath = hasAssociatedFilePath; this.dirty = hasAssociatedFilePath; // untitled associated to file path are dirty right away @@ -59,12 +59,12 @@ export class UntitledEditorModel extends StringEditorModel implements IEncodingS return this._onDidChangeEncoding.event; } - protected getOrCreateMode(modeService: IModeService, mime: string, firstLineText?: string): TPromise { - if (isUnspecific(mime)) { - return modeService.getOrCreateModeByFilenameOrFirstLine(this.resource.fsPath, firstLineText); // lookup mode via resource path if the provided mime is unspecific + protected getOrCreateMode(modeService: IModeService, modeId: string, firstLineText?: string): TPromise { + if (!modeId || modeId === PLAINTEXT_MODE_ID) { + return modeService.getOrCreateModeByFilenameOrFirstLine(this.resource.fsPath, firstLineText); // lookup mode via resource path if the provided modeId is unspecific } - return super.getOrCreateMode(modeService, mime, firstLineText); + return super.getOrCreateMode(modeService, modeId, firstLineText); } private registerListeners(): void { From 2d5c428787399861c19601fa1d67592648799559 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Oct 2016 13:43:09 +0200 Subject: [PATCH 393/433] polish based on feedback --- .../platform/actions/browser/menusExtensionPoint.ts | 7 ++++++- src/vs/platform/actions/common/actions.ts | 2 +- .../workbench/browser/parts/editor/titleControl.ts | 12 ++++++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/actions/browser/menusExtensionPoint.ts b/src/vs/platform/actions/browser/menusExtensionPoint.ts index 25be267fc03..8c9d818d1b1 100644 --- a/src/vs/platform/actions/browser/menusExtensionPoint.ts +++ b/src/vs/platform/actions/browser/menusExtensionPoint.ts @@ -30,7 +30,7 @@ namespace schema { case 'editor/title': return MenuId.EditorTitle; case 'editor/context': return MenuId.EditorContext; case 'explorer/context': return MenuId.ExplorerContext; - case 'editor/tab': return MenuId.EditorTab; + case 'editortab/context': return MenuId.EditorTabContext; } } @@ -98,6 +98,11 @@ namespace schema { type: 'array', items: menuItem }, + 'editortab/context': { + description: localize('menus.editorTabContext', "The editor tabs context menu"), + type: 'array', + items: menuItem + }, 'explorer/context': { description: localize('menus.explorerContext', "The file explorer context menu"), type: 'array', diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 3de63bfcab8..5e517209238 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -40,7 +40,7 @@ export enum MenuId { EditorTitle = 1, EditorContext = 2, ExplorerContext = 3, - EditorTab = 4 + EditorTabContext = 4 } export const IMenuService = createDecorator('menuService'); diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index eda18501325..6bbe529c0d5 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -35,7 +35,7 @@ import {IContextKeyService} from 'vs/platform/contextkey/common/contextkey'; import {CloseEditorsInGroupAction, SplitEditorAction, CloseEditorAction, KeepEditorAction, CloseOtherEditorsInGroupAction, CloseRightEditorsInGroupAction, ShowEditorsInGroupAction} from 'vs/workbench/browser/parts/editor/editorActions'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import {createActionItem, fillInActions} from 'vs/platform/actions/browser/menuItemActionItem'; -import {IMenuService, MenuId} from 'vs/platform/actions/common/actions'; +import {IMenuService, MenuId, IMenu} from 'vs/platform/actions/common/actions'; import {ResourceContextKey} from 'vs/platform/actions/common/resourceContextKey'; export interface IToolbarActions { @@ -90,6 +90,8 @@ export abstract class TitleControl implements ITitleAreaControl { private resourceContext: ResourceContextKey; private disposeOnEditorActions: IDisposable[] = []; + private contextMenu: IMenu; + constructor( @IContextMenuService protected contextMenuService: IContextMenuService, @IInstantiationService protected instantiationService: IInstantiationService, @@ -114,6 +116,9 @@ export abstract class TitleControl implements ITitleAreaControl { this.resourceContext = instantiationService.createInstance(ResourceContextKey); + this.contextMenu = this.menuService.createMenu(MenuId.EditorTabContext, this.contextKeyService); + this.toDispose.push(this.contextMenu); + this.initActions(); this.registerListeners(); } @@ -471,9 +476,8 @@ export abstract class TitleControl implements ITitleAreaControl { actions.push(new Separator(), this.pinEditorAction); } - const titleBarMenu = this.menuService.createMenu(MenuId.EditorTab, this.contextKeyService); - fillInActions(titleBarMenu, actions); - titleBarMenu.dispose(); // not needed anymore + // Fill in contributed actions + fillInActions(this.contextMenu, actions); return actions; } From 7666a930a2fd8c8caba59b808833a6108553e138 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 15:04:13 +0200 Subject: [PATCH 394/433] :lipstick: --- .../node/extensionManagementService.ts | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index daac9847e3b..d0dcde0b013 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -243,26 +243,24 @@ export class ExtensionManagementService implements IExtensionManagementService { private rollback(localExtension: ILocalExtension, dependecies: IGalleryExtension[]): TPromise { return this.uninstall(localExtension) - .then(() => this.filterOutUnInstalled(dependecies)) - .then(installed => TPromise.join(installed.map((i) => this.uninstall(i)))) - .then(() => null); + .then(() => this.filterOutUninstalled(dependecies)) + .then(installed => TPromise.join(installed.map((i) => this.uninstall(i)))) + .then(() => null); } private filterOutInstalled(extensions: IGalleryExtension[]): TPromise { - return this.getInstalled().then(local => { - return extensions.filter(extension => { - const extensionId = getExtensionId(extension, extension.version); - return local.every(local => local.id !== extensionId); + return this.getInstalled() + .then(local => { + return extensions.filter(extension => { + const extensionId = getExtensionId(extension, extension.version); + return local.every(local => local.id !== extensionId); + }); }); - }); } - private filterOutUnInstalled(extensions: IGalleryExtension[]): TPromise { - return this.getInstalled().then(installed => { - return installed.filter(local => { - return !!this.getGalleryExtensionForLocalExtension(extensions, local); - }); - }); + private filterOutUninstalled(extensions: IGalleryExtension[]): TPromise { + return this.getInstalled() + .then(installed => installed.filter(local => !!this.getGalleryExtensionForLocalExtension(extensions, local))); } private getGalleryExtensionForLocalExtension(galleryExtensions: IGalleryExtension[], localExtension: ILocalExtension): IGalleryExtension { @@ -273,10 +271,11 @@ export class ExtensionManagementService implements IExtensionManagementService { private downloadAndInstall(extension: IGalleryExtension): TPromise { const id = getExtensionId(extension, extension.version); const metadata = { - id: extension.id, - publisherId: extension.publisherId, - publisherDisplayName: extension.publisherDisplayName, - }; + id: extension.id, + publisherId: extension.publisherId, + publisherDisplayName: extension.publisherDisplayName, + }; + return this.galleryService.download(extension) .then(zipPath => validate(zipPath).then(() => zipPath)) .then(zipPath => this.installExtension(zipPath, id, metadata)); From 1ac264400a6d567fa2032005a10ce042427fa7f9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 4 Oct 2016 15:11:26 +0200 Subject: [PATCH 395/433] fixes #12761 --- .../node/extensionManagementService.ts | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index d0dcde0b013..95594d97399 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -307,12 +307,14 @@ export class ExtensionManagementService implements IExtensionManagementService { } uninstall(extension: ILocalExtension): TPromise { - return this.scanUserExtensions().then(installed => { - const promises = installed - .filter(e => e.manifest.publisher === extension.manifest.publisher && e.manifest.name === extension.manifest.name) - .map(({ id }) => this.uninstallExtension(id)); + return this.removeOutdatedExtensions().then(() => { + return this.scanUserExtensions().then(installed => { + const promises = installed + .filter(e => e.manifest.publisher === extension.manifest.publisher && e.manifest.name === extension.manifest.name) + .map(({ id }) => this.uninstallExtension(id)); - return TPromise.join(promises); + return TPromise.join(promises); + }); }); } @@ -379,21 +381,30 @@ export class ExtensionManagementService implements IExtensionManagementService { }); } - removeDeprecatedExtensions(): TPromise { - const outdated = this.getOutdatedExtensionIds() - .then(extensions => extensions.map(e => getExtensionId(e.manifest, e.manifest.version))); + removeDeprecatedExtensions(): TPromise { + return TPromise.join([ + this.removeOutdatedExtensions(), + this.removeObsoleteExtensions() + ]); + } - const obsolete = this.getObsoleteExtensions() - .then(obsolete => Object.keys(obsolete)); + private removeOutdatedExtensions(): TPromise { + return this.getOutdatedExtensionIds() + .then(extensions => extensions.map(e => getExtensionId(e.manifest, e.manifest.version))) + .then(extensionIds => this.removeExtensions(extensionIds)); + } - return TPromise.join([outdated, obsolete]) - .then(result => flatten(result)) - .then(extensionsIds => { - return TPromise.join(extensionsIds.map(id => { - return pfs.rimraf(path.join(this.extensionsPath, id)) - .then(() => this.withObsoleteExtensions(obsolete => delete obsolete[id])); - })); - }); + private removeObsoleteExtensions(): TPromise { + return this.getObsoleteExtensions() + .then(obsolete => Object.keys(obsolete)) + .then(extensionIds => this.removeExtensions(extensionIds)); + } + + private removeExtensions(extensionsIds: string[]): TPromise { + return TPromise.join(extensionsIds.map(id => { + return pfs.rimraf(path.join(this.extensionsPath, id)) + .then(() => this.withObsoleteExtensions(obsolete => delete obsolete[id])); + })); } private getOutdatedExtensionIds(): TPromise { From e925936c012899b674598f96c9123469aefbfc83 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 4 Oct 2016 15:57:10 +0200 Subject: [PATCH 396/433] breakpoint widget: fix placeholders and background color --- .../parts/debug/browser/breakpointWidget.ts | 22 ++++++++----------- .../debug/browser/media/breakpointWidget.css | 3 +-- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/breakpointWidget.ts b/src/vs/workbench/parts/debug/browser/breakpointWidget.ts index 35354848338..6c2f1b4223d 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/parts/debug/browser/breakpointWidget.ts @@ -26,6 +26,10 @@ import {IKeyboardEvent} from 'vs/base/browser/keyboardEvent'; const $ = dom.$; const CONTEXT_BREAKPOINT_WIDGET_VISIBLE = new RawContextKey('breakpointWidgetVisible', false); const CLOSE_BREAKPOINT_WIDGET_COMMAND_ID = 'closeBreakpointWidget'; +const EXPRESSION_PLACEHOLDER = nls.localize('breakpointWidgetExpressionPlaceholder', "Break when expression evaluates to true"); +const EXPRESSION_ARIA_LABEL = nls.localize('breakpointWidgetAriaLabel', "The program will only stop here if this condition is true. Press Enter to accept or Escape to cancel."); +const HIT_COUNT_PLACEHOLDER = nls.localize('breakpointWidgetHitCountPlaceholder', "Break when expression equals the hit count"); +const HIT_COUNT_ARIA_LABEL = nls.localize('breakpointWidgetHitCountAriaLabel', "The program will only stop here if the hit count is met. Press Enter to accept or Escape to cancel."); export class BreakpointWidget extends ZoneWidget { @@ -34,10 +38,6 @@ export class BreakpointWidget extends ZoneWidget { private inputBox: InputBox; private toDispose: lifecycle.IDisposable[]; private breakpointWidgetVisible: IContextKey; - private expressionPlaceholder: string; - private expressionAriaLabel: string; - private hitCountPlaceholder: string; - private hitCountAriaLabel: string; private hitCountContext: boolean; constructor(editor: editorbrowser.ICodeEditor, private lineNumber: number, @@ -48,10 +48,6 @@ export class BreakpointWidget extends ZoneWidget { super(editor, { showFrame: true, showArrow: false, frameColor: '#007ACC', frameWidth: 1 }); this.toDispose = []; - this.expressionPlaceholder = nls.localize('breakpointWidgetExpressionPlaceholder', "Breakpoint on line {0} will only stop if this expression is true.", this.lineNumber); - this.expressionAriaLabel = nls.localize('breakpointWidgetAriaLabel', "Type the breakpoint condition for line {0}. The program will only stop here if this condition is true. Press Enter to accept or Escape to cancel.", this.lineNumber); - this.hitCountPlaceholder = nls.localize('breakpointWidgetHitCountPlaceholder', "Breakpoint on line {0} will only stop if the hit count condition is true.", this.lineNumber); - this.hitCountAriaLabel = nls.localize('breakpointWidgetHitCountAriaLabel', "Type the breakpoint hit count condition for line {0}. The program will only stop here if the hit count is met. Press Enter to accept or Escape to cancel.", this.lineNumber); this.create(); this.breakpointWidgetVisible = CONTEXT_BREAKPOINT_WIDGET_VISIBLE.bindTo(contextKeyService); @@ -70,7 +66,7 @@ export class BreakpointWidget extends ZoneWidget { } protected _fillContainer(container: HTMLElement): void { - dom.addClass(container, 'breakpoint-widget'); + dom.addClass(container, 'breakpoint-widget monaco-editor-background'); const uri = this.editor.getModel().uri; const breakpoint = this.debugService.getModel().getBreakpoints().filter(bp => bp.lineNumber === this.lineNumber && bp.source.uri.toString() === uri.toString()).pop(); @@ -78,15 +74,15 @@ export class BreakpointWidget extends ZoneWidget { selectBox.render(dom.append(container, $('.breakpoint-select-container'))); selectBox.onDidSelect(e => { this.hitCountContext = e === 'Hit Count'; - this.inputBox.setAriaLabel(this.hitCountContext ? this.hitCountAriaLabel : this.expressionAriaLabel); - this.inputBox.setPlaceHolder(this.hitCountContext ? this.hitCountPlaceholder : this.expressionPlaceholder); + this.inputBox.setAriaLabel(this.hitCountContext ? HIT_COUNT_ARIA_LABEL : EXPRESSION_ARIA_LABEL); + this.inputBox.setPlaceHolder(this.hitCountContext ? HIT_COUNT_PLACEHOLDER : EXPRESSION_PLACEHOLDER); this.inputBox.value = (this.hitCountContext && breakpoint && breakpoint.hitCondition) ? breakpoint.hitCondition : breakpoint && breakpoint.condition ? breakpoint.condition : ''; }); const inputBoxContainer = dom.append(container, $('.inputBoxContainer')); this.inputBox = new InputBox(inputBoxContainer, this.contextViewService, { - placeholder: this.expressionPlaceholder, - ariaLabel: this.expressionAriaLabel + placeholder: EXPRESSION_PLACEHOLDER, + ariaLabel: EXPRESSION_ARIA_LABEL }); this.toDispose.push(this.inputBox); diff --git a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css index 0fb6516a856..b19784a9748 100644 --- a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css +++ b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css @@ -6,7 +6,6 @@ .monaco-editor .zone-widget .zone-widget-container.breakpoint-widget { height: 30px !important; display: flex; - background-color: var(--input-bgcolor); } .monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .breakpoint-select-container { @@ -17,7 +16,6 @@ } .monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .breakpoint-select-container .select-box { - margin-top: 0px; border-color: rgba(128, 128, 128, 0.35); } @@ -32,6 +30,7 @@ .monaco-editor .breakpoint-widget .input { font-family: Monaco, Menlo, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback"; line-height: 22px; + background-color: transparent; } .monaco-workbench.mac .monaco-editor .breakpoint-widget .input { From 105168b486c95d42f38e3a65c9c80ecf778fce46 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 4 Oct 2016 17:11:17 +0200 Subject: [PATCH 397/433] fix #11871 --- src/vs/code/electron-main/menus.ts | 2 +- .../search/browser/search.contribution.ts | 64 ++++++++----------- .../parts/search/browser/searchActions.ts | 31 ++++++++- .../parts/search/common/constants.ts | 2 + 4 files changed, 57 insertions(+), 42 deletions(-) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 68c626fc167..aa0d07a1e46 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -451,7 +451,7 @@ export class VSCodeMenu { const find = this.createMenuItem(nls.localize({ key: 'miFind', comment: ['&& denotes a mnemonic'] }, "&&Find"), 'actions.find'); const replace = this.createMenuItem(nls.localize({ key: 'miReplace', comment: ['&& denotes a mnemonic'] }, "&&Replace"), 'editor.action.startFindReplaceAction'); - const findInFiles = this.createMenuItem(nls.localize({ key: 'miFindInFiles', comment: ['&& denotes a mnemonic'] }, "Find &&in Files"), 'workbench.view.search'); + const findInFiles = this.createMenuItem(nls.localize({ key: 'miFindInFiles', comment: ['&& denotes a mnemonic'] }, "Find &&in Files"), 'workbench.action.findInFiles'); const replaceInFiles = this.createMenuItem(nls.localize({ key: 'miReplaceInFiles', comment: ['&& denotes a mnemonic'] }, "Replace &&in Files"), 'workbench.action.replaceInFiles'); [ diff --git a/src/vs/workbench/parts/search/browser/search.contribution.ts b/src/vs/workbench/parts/search/browser/search.contribution.ts index 603887028f8..e1dcc19ad9a 100644 --- a/src/vs/workbench/parts/search/browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/browser/search.contribution.ts @@ -21,7 +21,6 @@ import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegi import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {AsyncDescriptor} from 'vs/platform/instantiation/common/descriptors'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; -import {IKeybindings} from 'vs/platform/keybinding/common/keybinding'; import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService'; import {IViewletService} from 'vs/workbench/services/viewlet/common/viewletService'; import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; @@ -113,23 +112,34 @@ class ShowAllSymbolsAction extends QuickOpenAction { 10 )); -// Register Action to Open Viewlet -const openSearchViewletKb: IKeybindings = { - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F -}; +// Actions +const registry = Registry.as(ActionExtensions.WorkbenchActions); -(Registry.as(ActionExtensions.WorkbenchActions)).registerWorkbenchAction( - new SyncActionDescriptor(searchActions.OpenSearchViewletAction, searchActions.OpenSearchViewletAction.ID, searchActions.OpenSearchViewletAction.LABEL, openSearchViewletKb), - 'View: Show Search', - nls.localize('view', "View") -); -(Registry.as(ActionExtensions.WorkbenchActions)).registerWorkbenchAction( - new SyncActionDescriptor(searchActions.ReplaceInFilesAction, searchActions.ReplaceInFilesAction.ID, searchActions.ReplaceInFilesAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_H - }), - 'Replace in Files' -); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.OpenSearchViewletAction, Constants.VIEWLET_ID, nls.localize('showSearchViewlet', "Show Search"), { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, + Constants.SearchViewletVisibleKey.toNegated()), 'View: Show Search', nls.localize('view', "View")); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FocusActiveEditorAction, Constants.FocusActiveEditorActionId, '', { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, + ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FindInFilesAction, Constants.FindInFilesActionId, nls.localize('findInFiles', "Find in Files"), { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, + Constants.SearchInputBoxFocussedKey.toNegated()), 'Find in Files'); + +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ReplaceInFilesAction, searchActions.ReplaceInFilesAction.ID, searchActions.ReplaceInFilesAction.LABEL, {primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_H}), 'Replace in Files'); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.CloseReplaceAction, Constants.CloseReplaceWidgetActionId, '', { primary: KeyCode.Escape }, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.ReplaceInputBoxFocussedKey)), ''); + +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ShowNextSearchTermAction, searchActions.ShowNextSearchTermAction.ID, searchActions.ShowNextSearchTermAction.LABEL, ShowNextFindTermKeybinding, + ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ShowPreviousSearchTermAction, searchActions.ShowPreviousSearchTermAction.ID, searchActions.ShowPreviousSearchTermAction.LABEL, ShowPreviousFindTermKeybinding, + ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FocusNextInputAction, searchActions.FocusNextInputAction.ID, searchActions.FocusNextInputAction.LABEL, { primary: KeyCode.DownArrow }, + ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.InputBoxFocussedKey)), ''); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FocusPreviousInputAction, searchActions.FocusPreviousInputAction.ID, searchActions.FocusPreviousInputAction.LABEL, { primary: KeyCode.UpArrow }, + ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.InputBoxFocussedKey, Constants.SearchInputBoxFocussedKey.toNegated())), ''); + +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleCaseSensitiveAction, Constants.ToggleCaseSensitiveActionId, '', ToggleCaseSensitiveKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleWholeWordAction, Constants.ToggleWholeWordActionId, '', ToggleWholeWordKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); +registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleRegexAction, Constants.ToggleRegexActionId, '', ToggleRegexKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); + +registry.registerWorkbenchAction(new SyncActionDescriptor(ShowAllSymbolsAction, ACTION_ID, ACTION_LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_T }), 'Go to Symbol in Workspace...'); // Contribute to Explorer Viewer const actionBarRegistry = Registry.as(ActionBarExtensions.Actionbar); @@ -160,28 +170,6 @@ actionBarRegistry.registerActionBarContributor(Scope.VIEWER, ExplorerViewerActio ) ); -// Actions -const registry = Registry.as(ActionExtensions.WorkbenchActions); -registry.registerWorkbenchAction(new SyncActionDescriptor(ShowAllSymbolsAction, ACTION_ID, ACTION_LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_T -}), 'Go to Symbol in Workspace...'); - -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ShowNextSearchTermAction, searchActions.ShowNextSearchTermAction.ID, searchActions.ShowNextSearchTermAction.LABEL, ShowNextFindTermKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); - -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ShowPreviousSearchTermAction, searchActions.ShowPreviousSearchTermAction.ID, searchActions.ShowPreviousSearchTermAction.LABEL, ShowPreviousFindTermKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); - -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FocusNextInputAction, searchActions.FocusNextInputAction.ID, searchActions.FocusNextInputAction.LABEL, { - primary: KeyCode.DownArrow -}, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.InputBoxFocussedKey)), ''); - -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.FocusPreviousInputAction, searchActions.FocusPreviousInputAction.ID, searchActions.FocusPreviousInputAction.LABEL, { - primary: KeyCode.UpArrow -}, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.InputBoxFocussedKey, Constants.SearchInputBoxFocussedKey.toNegated())), ''); - -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleCaseSensitiveAction, Constants.ToggleCaseSensitiveActionId, '', ToggleCaseSensitiveKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleWholeWordAction, Constants.ToggleWholeWordActionId, '', ToggleWholeWordKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.ToggleRegexAction, Constants.ToggleRegexActionId, '', ToggleRegexKeybinding, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.SearchInputBoxFocussedKey)), ''); -registry.registerWorkbenchAction(new SyncActionDescriptor(searchActions.CloseReplaceAction, Constants.CloseReplaceWidgetActionId, '', { primary: KeyCode.Escape }, ContextKeyExpr.and(Constants.SearchViewletVisibleKey, Constants.ReplaceInputBoxFocussedKey)), ''); // Configuration const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index a84377313be..f0039e41e7a 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -143,15 +143,40 @@ export class FocusPreviousInputAction extends Action { export class OpenSearchViewletAction extends ToggleViewletAction { - public static ID = Constants.VIEWLET_ID; - public static LABEL = nls.localize('showSearchViewlet', "Show Search"); - constructor(id: string, label: string, @IViewletService viewletService: IViewletService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { super(id, label, Constants.VIEWLET_ID, viewletService, editorService); } } +export class FocusActiveEditorAction extends Action { + + constructor(id: string, label: string, @IWorkbenchEditorService private editorService: IWorkbenchEditorService) { + super(id, label); + } + + public run(): TPromise { + let editor = this.editorService.getActiveEditor(); + if (editor) { + editor.focus(); + } + return TPromise.as(true); + } + +} + +export class FindInFilesAction extends Action { + + constructor(id: string, label: string, @IViewletService private viewletService: IViewletService) { + super(id, label); + } + + public run(): TPromise { + return this.viewletService.openViewlet(Constants.VIEWLET_ID, true); + } + +} + export class ReplaceInFilesAction extends Action { public static ID = 'workbench.action.replaceInFiles'; diff --git a/src/vs/workbench/parts/search/common/constants.ts b/src/vs/workbench/parts/search/common/constants.ts index 26a5f3bf3bb..a569abc60dc 100644 --- a/src/vs/workbench/parts/search/common/constants.ts +++ b/src/vs/workbench/parts/search/common/constants.ts @@ -7,6 +7,8 @@ import {RawContextKey} from 'vs/platform/contextkey/common/contextkey'; export const VIEWLET_ID = 'workbench.view.search'; +export const FindInFilesActionId = 'workbench.action.findInFiles'; +export const FocusActiveEditorActionId = 'search.action.focusActiveEditor'; export const ToggleCaseSensitiveActionId = 'toggleSearchCaseSensitive'; export const ToggleWholeWordActionId = 'toggleSearchWholeWord'; export const ToggleRegexActionId = 'toggleSearchRegex'; From 9fcf0f62495e51d78fb4596c3e4ca812293a4955 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 4 Oct 2016 17:47:55 +0200 Subject: [PATCH 398/433] compute score from highlights, fixes #11423 --- .../contrib/suggest/common/completionModel.ts | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/contrib/suggest/common/completionModel.ts b/src/vs/editor/contrib/suggest/common/completionModel.ts index 0e3ddaaf89d..c19c0ea5b4c 100644 --- a/src/vs/editor/contrib/suggest/common/completionModel.ts +++ b/src/vs/editor/contrib/suggest/common/completionModel.ts @@ -5,10 +5,10 @@ 'use strict'; -import {isFalsyOrEmpty} from 'vs/base/common/arrays'; -import {IMatch, fuzzyContiguousFilter} from 'vs/base/common/filters'; -import {ISuggestSupport} from 'vs/editor/common/modes'; -import {ISuggestionItem} from './suggest'; +import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { IMatch, fuzzyContiguousFilter } from 'vs/base/common/filters'; +import { ISuggestSupport } from 'vs/editor/common/modes'; +import { ISuggestionItem } from './suggest'; export interface ICompletionItem extends ISuggestionItem { highlights?: IMatch[]; @@ -43,7 +43,7 @@ export class CompletionModel { this._lineContext = lineContext; } - replaceIncomplete(newItems: ISuggestionItem[], compareFn:(a:ISuggestionItem, b:ISuggestionItem) => number): void { + replaceIncomplete(newItems: ISuggestionItem[], compareFn: (a: ISuggestionItem, b: ISuggestionItem) => number): void { let newItemsIdx = 0; for (let i = 0; i < this._items.length; i++) { if (this._incomplete.indexOf(this._items[i].support) >= 0) { @@ -137,7 +137,7 @@ export class CompletionModel { match = item.highlights !== null; // no match on label nor codeSnippet -> check on filterText - if(!match && typeof suggestion.filterText === 'string') { + if (!match && typeof suggestion.filterText === 'string') { if (!isFalsyOrEmpty(filter(word, suggestion.filterText))) { match = true; @@ -155,7 +155,7 @@ export class CompletionModel { // compute score against word const wordLowerCase = word.toLowerCase(); - const score = CompletionModel._score(suggestion.insertText, word, wordLowerCase); + const score = CompletionModel._scoreByHighlight(item, word, wordLowerCase); if (score > topScore) { topScore = score; this._topScoreIdx = this._filteredItems.length - 1; @@ -176,20 +176,22 @@ export class CompletionModel { } } - private static _score(suggestion: string, currentWord: string, currentWordLowerCase: string): number { - const suggestionLowerCase = suggestion.toLowerCase(); + private static _scoreByHighlight(item: ICompletionItem, currentWord: string, currentWordLowerCase: string): number { + const {highlights, suggestion} = item; let score = 0; + if (!isFalsyOrEmpty(highlights)) { + for (const {start, end} of highlights) { + // find the highlight in the current word and + // score it based on case-match and start index + const part = suggestion.label.substring(start, end); + if (currentWord.indexOf(part) >= 0) { + score += (2 * part.length) / (start + 1); - for (let i = 0, len = Math.min(currentWord.length, suggestion.length); i < len; i++) { - if (currentWord[i] === suggestion[i]) { - score += 2; - } else if (currentWordLowerCase[i] === suggestionLowerCase[i]) { - score += 1; - } else { - break; + } else if (currentWordLowerCase.indexOf(part) >= 0) { + score += part.length / (start + 1); + } } } - return score; } } From 804729f775f9ab68083ffbe756f492726588665d Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 4 Oct 2016 09:17:40 -0700 Subject: [PATCH 399/433] Fix overflow with watermark (fixes #12980) --- src/vs/workbench/parts/watermark/watermark.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/watermark/watermark.css b/src/vs/workbench/parts/watermark/watermark.css index 3a9b9094c1f..ae749d0f7a6 100644 --- a/src/vs/workbench/parts/watermark/watermark.css +++ b/src/vs/workbench/parts/watermark/watermark.css @@ -14,6 +14,7 @@ top: calc(50% + 55px); text-align: center; white-space: nowrap; + overflow: hidden; } .monaco-workbench > .part.editor > .watermark > .watermark-box { From ac837a1d9cc6b8934a0ebc04d01df03ce79e9099 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 4 Oct 2016 10:55:51 -0700 Subject: [PATCH 400/433] Make s in "script" upper case Fixes #13208 --- .../parts/execution/electron-browser/terminalService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts b/src/vs/workbench/parts/execution/electron-browser/terminalService.ts index bf639a00575..10a4c2b69e8 100644 --- a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/execution/electron-browser/terminalService.ts @@ -149,7 +149,7 @@ export class MacTerminalService implements ITerminalService { const lines = stderr.split('\n', 1); e(new Error(lines[0])); } else { - e(new Error(nls.localize('mac.terminal.script.failed', "script '{0}' failed with exit code {1}", script, code))); + e(new Error(nls.localize('mac.terminal.script.failed', "Script '{0}' failed with exit code {1}", script, code))); } } }); @@ -277,4 +277,4 @@ function quote(args: string[]): string { r += ' '; } return r; -} \ No newline at end of file +} From 8bd60949abfca8cb88fef8f406bf0152e324fced Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 4 Oct 2016 14:27:04 -0700 Subject: [PATCH 401/433] Set line-height of xterm.js' text area to 0 It's taking up space when it has focus which breaks the terminal's position. This only seems to happen on Mac for some reason. Fixes #12038 --- src/vs/workbench/parts/terminal/electron-browser/media/xterm.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css index 24d687abcee..57e37d10f41 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css @@ -42,6 +42,7 @@ width: 0; height: 0; z-index: -10; + line-height: 0; } .monaco-workbench .panel.integrated-terminal .xterm .xterm-helper-textarea:focus { From 06947f29cb2c6e956597ededf6d3e61fad9b3576 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 4 Oct 2016 17:00:14 -0700 Subject: [PATCH 402/433] Add path end trivia and pass to find (fixes #12624) --- src/vs/base/common/glob.ts | 95 ++++++++++++++----- src/vs/base/test/common/glob.test.ts | 83 ++++++++++++++++ .../services/search/node/fileSearch.ts | 16 ++-- .../subfolder/anotherfolder/anotherfile.txt | 0 .../services/search/test/node/search.test.ts | 93 +++++++++++++++++- 5 files changed, 253 insertions(+), 34 deletions(-) create mode 100644 src/vs/workbench/services/search/test/node/fixtures/examples/subfolder/anotherfolder/anotherfile.txt diff --git a/src/vs/base/common/glob.ts b/src/vs/base/common/glob.ts index 433876df191..8ea9941c5c1 100644 --- a/src/vs/base/common/glob.ts +++ b/src/vs/base/common/glob.ts @@ -213,6 +213,7 @@ const T1 = /^\*\*\/\*\.[\w\.-]+$/; // **/*.something const T2 = /^\*\*\/([\w\.-]+)\/?$/; // **/something const T3 = /^{\*\*\/[\*\.]?[\w\.-]+\/?(,\*\*\/[\*\.]?[\w\.-]+\/?)*}$/; // {**/*.something,**/*.else} or {**/package.json,**/project.json} const T3_2 = /^{\*\*\/[\*\.]?[\w\.-]+(\/(\*\*)?)?(,\*\*\/[\*\.]?[\w\.-]+(\/(\*\*)?)?)*}$/; // Like T3, with optional trailing /** +const T4 = /^\*\*((\/[\w\.-]+)+)\/?$/; // **/something/else export type ParsedPattern = (path: string, basename?: string) => boolean; export type ParsedExpression = (path: string, basename?: string, siblingsFn?: () => string[]) => string /* the matching pattern */; @@ -226,12 +227,14 @@ interface ParsedStringPattern { basenames?: string[]; patterns?: string[]; allBasenames?: string[]; + allPathEnds?: string[]; } type SiblingsPattern = { siblings: string[], name: string }; interface ParsedExpressionPattern { (path: string, basename: string, siblingsPatternFn: () => SiblingsPattern): string /* the matching pattern */; requiresSiblings?: boolean; allBasenames?: string[]; + allPathEnds?: string[]; } const CACHE = new BoundedLinkedMap(10000); // bounded to 10000 elements @@ -266,33 +269,12 @@ function parsePattern(pattern: string, options: IGlobOptions): ParsedStringPatte parsedPattern = function (path, basename) { return path && strings.endsWith(path, base) ? pattern : null; }; - } else if (match = T2.exec(pattern)) { // common pattern: **/some.txt just need basename check - parsedPattern = trivia2(match[1], pattern); - } else if (options.trimForExclusions && strings.endsWith(pattern, '/**') && (match = T2.exec(pattern.substr(0, pattern.length - 2)))) { // common pattern: **/some/** for exclusions just need basename check + } else if (match = T2.exec(trimForExclusions(pattern, options))) { // common pattern: **/some.txt just need basename check parsedPattern = trivia2(match[1], pattern); } else if ((options.trimForExclusions ? T3_2 : T3).test(pattern)) { // repetition of common patterns (see above) {**/*.txt,**/*.png} - const parsedPatterns = aggregateBasenameMatches(pattern.slice(1, -1).split(',') - .map(pattern => parsePattern(pattern, options)) - .filter(pattern => pattern !== NULL), pattern); - const n = parsedPatterns.length; - if (!n) { - return NULL; - } - if (n === 1) { - return parsedPatterns[0]; - } - parsedPattern = function (path: string, basename: string) { - for (let i = 0, n = parsedPatterns.length; i < n; i++) { - if ((parsedPatterns[i])(path, basename)) { - return pattern; - } - } - return null; - }; - const withBasenames = arrays.first(parsedPatterns, pattern => !!(pattern).allBasenames); - if (withBasenames) { - parsedPattern.allBasenames = (withBasenames).allBasenames; - } + parsedPattern = trivia3(pattern, options); + } else if (match = T4.exec(trimForExclusions(pattern, options))) { // common pattern: **/something/else just need endsWith check + parsedPattern = trivia4(match[1], pattern); } // Otherwise convert to pattern @@ -306,6 +288,10 @@ function parsePattern(pattern: string, options: IGlobOptions): ParsedStringPatte return parsedPattern; } +function trimForExclusions(pattern: string, options: IGlobOptions): string { + return options.trimForExclusions && strings.endsWith(pattern, '/**') ? pattern.substr(0, pattern.length - 2) : pattern; // dropping **, tailing / is dropped later +} + // common pattern: **/some.txt just need basename check function trivia2(base: string, originalPattern: string): ParsedStringPattern { const slashBase = `/${base}`; @@ -326,6 +312,48 @@ function trivia2(base: string, originalPattern: string): ParsedStringPattern { return parsedPattern; } +// repetition of common patterns (see above) {**/*.txt,**/*.png} +function trivia3 (pattern: string, options: IGlobOptions): ParsedStringPattern { + const parsedPatterns = aggregateBasenameMatches(pattern.slice(1, -1).split(',') + .map(pattern => parsePattern(pattern, options)) + .filter(pattern => pattern !== NULL), pattern); + const n = parsedPatterns.length; + if (!n) { + return NULL; + } + if (n === 1) { + return parsedPatterns[0]; + } + const parsedPattern: ParsedStringPattern = function (path: string, basename: string) { + for (let i = 0, n = parsedPatterns.length; i < n; i++) { + if ((parsedPatterns[i])(path, basename)) { + return pattern; + } + } + return null; + }; + const withBasenames = arrays.first(parsedPatterns, pattern => !!(pattern).allBasenames); + if (withBasenames) { + parsedPattern.allBasenames = (withBasenames).allBasenames; + } + const allPathEnds = parsedPatterns.reduce((all, current) => current.allPathEnds ? all.concat(current.allPathEnds) : all, []); + if (allPathEnds.length) { + parsedPattern.allPathEnds = allPathEnds; + } + return parsedPattern; +} + +// common pattern: **/something/else just need endsWith check +function trivia4(pathEnd: string, pattern: string): ParsedStringPattern { + const nativePathEnd = pathEnd.replace(paths.sep, paths.nativeSep); + const nativePath = nativePathEnd.substr(1); + const parsedPattern: ParsedStringPattern = function (path, basename) { + return path && (path === nativePath || strings.endsWith(path, nativePathEnd)) ? pattern : null; + }; + parsedPattern.allPathEnds = [pathEnd]; + return parsedPattern; +} + function toRegExp(pattern: string): ParsedStringPattern { try { const regExp = new RegExp(`^${parseRegExp(pattern)}$`); @@ -383,6 +411,9 @@ export function parse(arg1: string | IExpression, options: IGlobOptions = {}): a if (parsedPattern.allBasenames) { (resultPattern).allBasenames = parsedPattern.allBasenames; } + if (parsedPattern.allPathEnds) { + (resultPattern).allPathEnds = parsedPattern.allPathEnds; + } return resultPattern; } @@ -394,6 +425,10 @@ export function getBasenameTerms(patternOrExpression: ParsedPattern | ParsedExpr return (patternOrExpression).allBasenames || []; } +export function getPathEndTerms(patternOrExpression: ParsedPattern | ParsedExpression): string[] { + return (patternOrExpression).allPathEnds || []; +} + function parsedExpression(expression: IExpression, options: IGlobOptions): ParsedExpression { const parsedPatterns = aggregateBasenameMatches(Object.getOwnPropertyNames(expression) .map(pattern => parseExpressionPattern(pattern, expression[pattern], options)) @@ -426,6 +461,11 @@ function parsedExpression(expression: IExpression, options: IGlobOptions): Parse resultExpression.allBasenames = (withBasenames).allBasenames; } + const allPathEnds = parsedPatterns.reduce((all, current) => current.allPathEnds ? all.concat(current.allPathEnds) : all, []); + if (allPathEnds.length) { + resultExpression.allPathEnds = allPathEnds; + } + return resultExpression; } @@ -465,6 +505,11 @@ function parsedExpression(expression: IExpression, options: IGlobOptions): Parse resultExpression.allBasenames = (withBasenames).allBasenames; } + const allPathEnds = parsedPatterns.reduce((all, current) => current.allPathEnds ? all.concat(current.allPathEnds) : all, []); + if (allPathEnds.length) { + resultExpression.allPathEnds = allPathEnds; + } + return resultExpression; } diff --git a/src/vs/base/test/common/glob.test.ts b/src/vs/base/test/common/glob.test.ts index 436e1f9c5a6..a085b05005a 100644 --- a/src/vs/base/test/common/glob.test.ts +++ b/src/vs/base/test/common/glob.test.ts @@ -771,4 +771,87 @@ suite('Glob', () => { assert.strictEqual(glob.parse('{**/foo/,**/abc/}', { trimForExclusions: true })('bar/foo', 'foo'), true); assert.strictEqual(glob.parse('{**/foo/,**/abc/}', { trimForExclusions: true })('bar/abc', 'abc'), true); }); + + test('expression/pattern path end', function () { + assert.strictEqual(glob.parse('**/foo/bar')('foo/baz', 'baz'), false); + assert.strictEqual(glob.parse('**/foo/bar')('foo/bar', 'bar'), true); + assert.strictEqual(glob.parse('**/foo/bar')('bar/foo/bar', 'bar'), true); + assert.strictEqual(glob.parse('**/foo/bar/**')('bar/foo/bar', 'bar'), true); + assert.strictEqual(glob.parse('**/foo/bar/**')('bar/foo/bar/baz', 'baz'), true); + assert.strictEqual(glob.parse('**/foo/bar/**', { trimForExclusions: true })('bar/foo/bar', 'bar'), true); + assert.strictEqual(glob.parse('**/foo/bar/**', { trimForExclusions: true })('bar/foo/bar/baz', 'baz'), false); + }); + + test('expression/pattern path ends', function () { + assert.deepStrictEqual(glob.getPathEndTerms(glob.parse('**/*.foo')), []); + assert.deepStrictEqual(glob.getPathEndTerms(glob.parse('**/foo')), []); + assert.deepStrictEqual(glob.getPathEndTerms(glob.parse('**/foo/bar')), ['/foo/bar']); + assert.deepStrictEqual(glob.getPathEndTerms(glob.parse('**/foo/bar/')), ['/foo/bar']); + // Not supported + // assert.deepStrictEqual(glob.getNativePathEnds(glob.parse('{**/baz/bar,**/foo/bar,**/bar}')), ['/baz/bar', '/foo/bar']); + // assert.deepStrictEqual(glob.getNativePathEnds(glob.parse('{**/baz/bar/,**/foo/bar/,**/bar/}')), ['/baz/bar', '/foo/bar']); + + const parsed = glob.parse({ + '**/foo/bar': true, + '**/foo2/bar2': true, + // Not supported + // '{**/bar/foo,**/baz/foo}': true, + // '{**/bar2/foo/,**/baz2/foo/}': true, + '**/bulb': true, + '**/bulb2': true, + '**/bulb/foo': false + }); + assert.deepStrictEqual(glob.getPathEndTerms(parsed), ['/foo/bar', '/foo2/bar2']); + assert.deepStrictEqual(glob.getBasenameTerms(parsed), ['bulb', 'bulb2']); + assert.deepStrictEqual(glob.getPathEndTerms(glob.parse({ + '**/foo/bar': { when: '$(basename).zip' }, + '**/bar/foo': true, + '**/bar2/foo2': true + })), ['/bar/foo', '/bar2/foo2']); + }); + + test('expression/pattern optimization for path ends', function () { + assert.deepStrictEqual(glob.getPathEndTerms(glob.parse('**/foo/bar/**')), []); + assert.deepStrictEqual(glob.getPathEndTerms(glob.parse('**/foo/bar/**', { trimForExclusions: true })), ['/foo/bar']); + + testOptimizationForPathEnds('**/*.foo/bar/**', [], [['baz/bar.foo/bar/baz', true]]); + testOptimizationForPathEnds('**/foo/bar/**', ['/foo/bar'], [['bar/foo/bar', true], ['bar/foo/bar/baz', false]]); + // Not supported + // testOptimizationForPathEnds('{**/baz/bar/**,**/foo/bar/**}', ['/baz/bar', '/foo/bar'], [['bar/baz/bar', true], ['bar/foo/bar', true]]); + + testOptimizationForPathEnds({ + '**/foo/bar/**': true, + // Not supported + // '{**/bar/bar/**,**/baz/bar/**}': true, + '**/bulb/bar/**': false + }, ['/foo/bar'], [ + ['bar/foo/bar', '**/foo/bar/**'], + // Not supported + // ['foo/bar/bar', '{**/bar/bar/**,**/baz/bar/**}'], + ['/foo/bar/nope', null] + ]); + + const siblingsFn = () => ['baz', 'baz.zip', 'nope']; + testOptimizationForPathEnds({ + '**/foo/123/**': { when: '$(basename).zip' }, + '**/bar/123/**': true + }, ['/bar/123'], [ + ['bar/foo/123', null], + ['bar/foo/123/baz', null], + ['bar/foo/123/nope', null], + ['foo/bar/123', '**/bar/123/**'], + ], [ + null, + siblingsFn, + siblingsFn + ]); + }); + + function testOptimizationForPathEnds(pattern: string|glob.IExpression, pathEndTerms: string[], matches: [string, string|boolean][], siblingsFns: (() => string[])[] = []) { + const parsed = glob.parse(pattern, { trimForExclusions: true }); + assert.deepStrictEqual(glob.getPathEndTerms(parsed), pathEndTerms); + matches.forEach(([text, result], i) => { + assert.strictEqual(parsed(text, null, siblingsFns[i]), result); + }); + } }); \ No newline at end of file diff --git a/src/vs/workbench/services/search/node/fileSearch.ts b/src/vs/workbench/services/search/node/fileSearch.ts index d7e2bc0d23a..600c1643577 100644 --- a/src/vs/workbench/services/search/node/fileSearch.ts +++ b/src/vs/workbench/services/search/node/fileSearch.ts @@ -256,15 +256,19 @@ export class FileWalker { */ public spawnFindCmd(rootFolder: string, excludePattern: glob.ParsedExpression) { const basenames = glob.getBasenameTerms(excludePattern); + const pathEnds = glob.getPathEndTerms(excludePattern); let args = ['-L', '.']; - if (basenames.length) { + if (basenames.length || pathEnds.length) { args.push('-not', '(', '('); - for (let i = 0, n = basenames.length; i < n; i++) { - if (i) { - args.push('-o'); - } - args.push('-name', FileWalker.escapeGlobSpecials(basenames[i])); + for (const basename of basenames) { + args.push('-name', FileWalker.escapeGlobSpecials(basename)); + args.push('-o'); } + for (const pathEnd of pathEnds) { + args.push('-path', '*' + FileWalker.escapeGlobSpecials(pathEnd)); + args.push('-o'); + } + args.pop(); args.push(')', '-prune', ')'); } args.push('-type', 'f'); diff --git a/src/vs/workbench/services/search/test/node/fixtures/examples/subfolder/anotherfolder/anotherfile.txt b/src/vs/workbench/services/search/test/node/fixtures/examples/subfolder/anotherfolder/anotherfile.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/vs/workbench/services/search/test/node/search.test.ts b/src/vs/workbench/services/search/test/node/search.test.ts index dd4aa07779e..d649a585c9a 100644 --- a/src/vs/workbench/services/search/test/node/search.test.ts +++ b/src/vs/workbench/services/search/test/node/search.test.ts @@ -85,7 +85,7 @@ suite('Search', () => { } }, () => { }, (error) => { assert.ok(!error); - assert.equal(count, 6); + assert.equal(count, 7); done(); }); }); @@ -121,7 +121,7 @@ suite('Search', () => { } }, () => { }, (error) => { assert.ok(!error); - assert.equal(count, 13); + assert.equal(count, 14); done(); }); }); @@ -237,7 +237,7 @@ suite('Search', () => { } }, () => { }, (error) => { assert.ok(!error); - assert.equal(count, 12); + assert.equal(count, 13); done(); }); }); @@ -478,6 +478,93 @@ suite('Search', () => { }); }); + test('Find: exclude folder path', function (done: () => void) { + if (platform.isWindows) { + done(); + return; + } + + const walker = new FileWalker({ rootFolders: rootfolders() }); + const file0 = './examples/company.js'; + const file1 = './examples/subfolder/subfile.txt'; + + const cmd1 = walker.spawnFindCmd(rootfolders()[0], glob.parse({ '**/examples/something': true })); + walker.readStdout(cmd1, 'utf8', (err1, stdout1) => { + assert.equal(err1, null); + assert.notStrictEqual(stdout1.split('\n').indexOf(file0), -1, stdout1); + assert.notStrictEqual(stdout1.split('\n').indexOf(file1), -1, stdout1); + + const cmd2 = walker.spawnFindCmd(rootfolders()[0], glob.parse({ '**/examples/subfolder': true })); + walker.readStdout(cmd2, 'utf8', (err2, stdout2) => { + assert.equal(err2, null); + assert.notStrictEqual(stdout1.split('\n').indexOf(file0), -1, stdout1); + assert.strictEqual(stdout2.split('\n').indexOf(file1), -1, stdout2); + done(); + }); + }); + }); + + test('Find: exclude subfolder path', function (done: () => void) { + if (platform.isWindows) { + done(); + return; + } + + const walker = new FileWalker({ rootFolders: rootfolders() }); + const file0 = './examples/subfolder/subfile.txt'; + const file1 = './examples/subfolder/anotherfolder/anotherfile.txt'; + + const cmd1 = walker.spawnFindCmd(rootfolders()[0], glob.parse({ '**/subfolder/something': true })); + walker.readStdout(cmd1, 'utf8', (err1, stdout1) => { + assert.equal(err1, null); + assert.notStrictEqual(stdout1.split('\n').indexOf(file0), -1, stdout1); + assert.notStrictEqual(stdout1.split('\n').indexOf(file1), -1, stdout1); + + const cmd2 = walker.spawnFindCmd(rootfolders()[0], glob.parse({ '**/subfolder/anotherfolder': true })); + walker.readStdout(cmd2, 'utf8', (err2, stdout2) => { + assert.equal(err2, null); + assert.notStrictEqual(stdout1.split('\n').indexOf(file0), -1, stdout1); + assert.strictEqual(stdout2.split('\n').indexOf(file1), -1, stdout2); + done(); + }); + }); + }); + + test('Find: exclude combination of paths', function (done: () => void) { + if (platform.isWindows) { + done(); + return; + } + + const walker = new FileWalker({ rootFolders: rootfolders() }); + const filesIn = [ + './examples/subfolder/subfile.txt', + './examples/company.js', + './index.html' + ]; + const filesOut = [ + './examples/subfolder/anotherfolder/anotherfile.txt', + './more/file.txt' + ]; + + const cmd1 = walker.spawnFindCmd(rootfolders()[0], glob.parse({ + '**/subfolder/anotherfolder': true, + '**/something/else': true, + '**/more': true, + '**/andmore': true + })); + walker.readStdout(cmd1, 'utf8', (err1, stdout1) => { + assert.equal(err1, null); + for (const fileIn of filesIn) { + assert.notStrictEqual(stdout1.split('\n').indexOf(fileIn), -1, stdout1); + } + for (const fileOut of filesOut) { + assert.strictEqual(stdout1.split('\n').indexOf(fileOut), -1, stdout1); + } + done(); + }); + }); + test('Text: GameOfLife', function (done: () => void) { let c = 0; let config = { From e8b516b34b0f01c0588297b14f6cd44d6ea94853 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 4 Oct 2016 18:40:05 -0700 Subject: [PATCH 403/433] Revert "Set line-height of xterm.js' text area to 0" This reverts commit 8bd60949abfca8cb88fef8f406bf0152e324fced. --- src/vs/workbench/parts/terminal/electron-browser/media/xterm.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css index 57e37d10f41..24d687abcee 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css @@ -42,7 +42,6 @@ width: 0; height: 0; z-index: -10; - line-height: 0; } .monaco-workbench .panel.integrated-terminal .xterm .xterm-helper-textarea:focus { From 23517f013ab919a5296a5d33af7f6cb9775f6219 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 4 Oct 2016 18:44:43 -0700 Subject: [PATCH 404/433] Add top to xterm.js' textarea Fixes #12038 --- src/vs/workbench/parts/terminal/electron-browser/media/xterm.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css index 24d687abcee..5e80769f86f 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css @@ -38,6 +38,7 @@ * Move textarea out of the screen to the far left, so that the cursor is not visible. */ left: -9999em; + top: -9999em; opacity: 0; width: 0; height: 0; From 8ba8ad18268290d377aeaf7143ab693c033eb896 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 09:02:14 +0200 Subject: [PATCH 405/433] bump to version 1.7.0 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c9f5485d0b8..76aace80bf5 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "code-oss-dev", - "version": "1.6.0", + "version": "1.7.0", "dependencies": { "agent-base": { "version": "1.0.2", diff --git a/package.json b/package.json index b1a20925add..7771417ae5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-oss-dev", - "version": "1.6.0", + "version": "1.7.0", "electronVersion": "1.3.7", "distro": "b1e023235579beebbb3cc127676cc91cc7f3e823", "author": { From 6d41cf4c90f46dbf06cc421f8cb4c75a6a17f00b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 5 Oct 2016 09:03:51 +0200 Subject: [PATCH 406/433] nls --- .../parts/extensions/electron-browser/extensionEditor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index aeceb42d2c5..b11c205167d 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -349,7 +349,7 @@ export class ExtensionEditor extends BaseEditor { $('tr', null, $('th', null, localize('setting name', "Name")), $('th', null, localize('description', "Description")), - $('th', null, localize('default', "Default")) + $('th', null, localize('default setting value', "Default")) ), ...contrib.map(key => $('tr', null, $('td', null, $('code', null, key)), From 223cb620ea48ebe45e053883373460b72dc2a441 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 5 Oct 2016 09:04:40 +0200 Subject: [PATCH 407/433] nls --- .../parts/extensions/electron-browser/extensionEditor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index b11c205167d..aeceb42d2c5 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -349,7 +349,7 @@ export class ExtensionEditor extends BaseEditor { $('tr', null, $('th', null, localize('setting name', "Name")), $('th', null, localize('description', "Description")), - $('th', null, localize('default setting value', "Default")) + $('th', null, localize('default', "Default")) ), ...contrib.map(key => $('tr', null, $('td', null, $('code', null, key)), From d99136f6ba7d8b1a43d4a0fbb006e7ba9234effb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 09:05:31 +0200 Subject: [PATCH 408/433] change scope to editor/title/context --- src/vs/platform/actions/browser/menusExtensionPoint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/actions/browser/menusExtensionPoint.ts b/src/vs/platform/actions/browser/menusExtensionPoint.ts index 8c9d818d1b1..ec73d5f1e3e 100644 --- a/src/vs/platform/actions/browser/menusExtensionPoint.ts +++ b/src/vs/platform/actions/browser/menusExtensionPoint.ts @@ -30,7 +30,7 @@ namespace schema { case 'editor/title': return MenuId.EditorTitle; case 'editor/context': return MenuId.EditorContext; case 'explorer/context': return MenuId.ExplorerContext; - case 'editortab/context': return MenuId.EditorTabContext; + case 'editor/title/context': return MenuId.EditorTabContext; } } From b7a8be16d4c9d5a9449fb7922fccf127bffe9056 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 09:06:48 +0200 Subject: [PATCH 409/433] also update schema --- src/vs/platform/actions/browser/menusExtensionPoint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/actions/browser/menusExtensionPoint.ts b/src/vs/platform/actions/browser/menusExtensionPoint.ts index ec73d5f1e3e..40f51309200 100644 --- a/src/vs/platform/actions/browser/menusExtensionPoint.ts +++ b/src/vs/platform/actions/browser/menusExtensionPoint.ts @@ -98,7 +98,7 @@ namespace schema { type: 'array', items: menuItem }, - 'editortab/context': { + 'editor/title/context': { description: localize('menus.editorTabContext', "The editor tabs context menu"), type: 'array', items: menuItem From 622797234dbc08eae803667ecb6a1b9c6bd66d72 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 09:21:50 +0200 Subject: [PATCH 410/433] more mime reduction --- .../parts/debug/browser/debugEditorInputs.ts | 6 ++--- .../files/browser/editors/textFileEditor.ts | 6 ++--- .../parts/files/browser/saveErrorHandler.ts | 9 ++------ src/vs/workbench/parts/files/common/files.ts | 2 -- .../output/browser/output.contribution.ts | 5 ++--- .../parts/output/browser/outputEditorInput.ts | 4 ++-- .../workbench/parts/output/common/output.ts | 5 ----- .../browser/parts/editor/baseEditor.test.ts | 16 +++++++------- .../common/editor/stringEditorInput.test.ts | 22 +++++++++---------- .../common/editor/stringEditorModel.test.ts | 4 ++-- 10 files changed, 33 insertions(+), 46 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugEditorInputs.ts b/src/vs/workbench/parts/debug/browser/debugEditorInputs.ts index 6cde849cf52..a5c38c3e137 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorInputs.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorInputs.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import {TPromise} from 'vs/base/common/winjs.base'; -import mime = require('vs/base/common/mime'); +import {PLAINTEXT_MODE_ID} from 'vs/editor/common/modes/modesRegistry'; import strinput = require('vs/workbench/common/editor/stringEditorInput'); import {EditorInput, EditorModel} from 'vs/workbench/common/editor'; import uri from 'vs/base/common/uri'; @@ -17,11 +17,11 @@ export class DebugStringEditorInput extends strinput.StringEditorInput { private resourceUrl: uri, description: string, value: string, - mimeType: string, + modeId: string, singleton: boolean, @IInstantiationService instantiationService: IInstantiationService ) { - super(name, description, value, mimeType || mime.MIME_TEXT, singleton, instantiationService); + super(name, description, value, modeId || PLAINTEXT_MODE_ID, singleton, instantiationService); } public getResource(): uri { diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index eb634f695e5..ffbef7832e4 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -119,8 +119,8 @@ export class TextFileEditor extends BaseTextEditor { // Different Input (Reload) return this.editorService.resolveEditorModel(input, true /* Reload */).then(resolvedModel => { - // There is a special case where the text editor has to handle binary file editor input: if a file with application/unknown - // mime has been resolved and cached before, it maybe an actual instance of BinaryEditorModel. In this case our text + // There is a special case where the text editor has to handle binary file editor input: if a binary file + // has been resolved and cached before, it maybe an actual instance of BinaryEditorModel. In this case our text // editor has to open this model using the binary editor. We return early in this case. if (resolvedModel instanceof BinaryEditorModel) { return this.openAsBinary(input, options); @@ -161,7 +161,7 @@ export class TextFileEditor extends BaseTextEditor { // In case we tried to open a file inside the text editor and the response // indicates that this is not a text file, reopen the file through the binary - // editor by using application/octet-stream as mime. + // editor. if ((error).fileOperationResult === FileOperationResult.FILE_IS_BINARY) { return this.openAsBinary(input, options); } diff --git a/src/vs/workbench/parts/files/browser/saveErrorHandler.ts b/src/vs/workbench/parts/files/browser/saveErrorHandler.ts index b31911389a6..e4ebe91c532 100644 --- a/src/vs/workbench/parts/files/browser/saveErrorHandler.ts +++ b/src/vs/workbench/parts/files/browser/saveErrorHandler.ts @@ -13,7 +13,6 @@ import {Action} from 'vs/base/common/actions'; import URI from 'vs/base/common/uri'; import product from 'vs/platform/product'; import {EditorModel} from 'vs/workbench/common/editor'; -import {guessMimeTypes} from 'vs/base/common/mime'; import {EditorInputAction} from 'vs/workbench/browser/parts/editor/baseEditor'; import {ResourceEditorInput} from 'vs/workbench/common/editor/resourceEditorInput'; import {DiffEditorInput} from 'vs/workbench/common/editor/diffEditorInput'; @@ -174,12 +173,10 @@ export class ConflictResolutionDiffEditorInput extends DiffEditorInput { export class FileOnDiskEditorInput extends ResourceEditorInput { private fileResource: URI; private lastModified: number; - private mime: string; private createdEditorModel: boolean; constructor( fileResource: URI, - mime: string, name: string, description: string, @IModelService modelService: IModelService, @@ -193,7 +190,6 @@ export class FileOnDiskEditorInput extends ResourceEditorInput { super(name, description, URI.from({ scheme: 'disk', path: fileResource.fsPath }), modelService, instantiationService); this.fileResource = fileResource; - this.mime = mime; } public getLastModified(): number { @@ -208,7 +204,7 @@ export class FileOnDiskEditorInput extends ResourceEditorInput { const codeEditorModel = this.modelService.getModel(this.resource); if (!codeEditorModel) { - this.modelService.createModel(content.value, this.modeService.getOrCreateMode(this.mime), this.resource); + this.modelService.createModel(content.value, this.modeService.getOrCreateModeByFilenameOrFirstLine(this.resource.fsPath), this.resource); this.createdEditorModel = true; } else { codeEditorModel.setValueFromRawText(content.value); @@ -261,8 +257,7 @@ class ResolveSaveConflictMessage implements IMessageWithAction { this.actions = [ new Action('workbench.files.action.resolveConflict', nls.localize('compareChanges', "Compare"), null, true, () => { if (!this.model.isDisposed()) { - const mime = guessMimeTypes(resource.fsPath).join(', '); - const originalInput = this.instantiationService.createInstance(FileOnDiskEditorInput, resource, mime, paths.basename(resource.fsPath), resource.fsPath); + const originalInput = this.instantiationService.createInstance(FileOnDiskEditorInput, resource, paths.basename(resource.fsPath), resource.fsPath); const modifiedInput = this.instantiationService.createInstance(FileEditorInput, resource, void 0); const conflictInput = this.instantiationService.createInstance(ConflictResolutionDiffEditorInput, this.model, nls.localize('saveConflictDiffLabel', "{0} (on disk) ↔ {1} (in {2})", modifiedInput.getName(), modifiedInput.getName(), product.nameLong), nls.localize('resolveSaveConflict', "Resolve save conflict"), originalInput, modifiedInput); diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/parts/files/common/files.ts index 2525244dea5..05934c194d3 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/parts/files/common/files.ts @@ -72,7 +72,6 @@ export interface IFilesConfiguration extends IFilesConfiguration, IWorkbenchEdit export interface IFileResource { resource: URI; isDirectory: boolean; - mimes: string[]; } /** @@ -84,7 +83,6 @@ export function asFileResource(obj: any): IFileResource { return { resource: stat.resource, - mimes: stat.mime ? stat.mime.split(', ') : [], isDirectory: stat.isDirectory }; } diff --git a/src/vs/workbench/parts/output/browser/output.contribution.ts b/src/vs/workbench/parts/output/browser/output.contribution.ts index 9dae48a6029..97efc2508a0 100644 --- a/src/vs/workbench/parts/output/browser/output.contribution.ts +++ b/src/vs/workbench/parts/output/browser/output.contribution.ts @@ -15,7 +15,7 @@ import {registerSingleton} from 'vs/platform/instantiation/common/extensions'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {OutputService} from 'vs/workbench/parts/output/browser/outputServices'; import {ToggleOutputAction, ClearOutputAction} from 'vs/workbench/parts/output/browser/outputActions'; -import {OUTPUT_MIME, OUTPUT_MODE_ID, OUTPUT_PANEL_ID, IOutputService} from 'vs/workbench/parts/output/common/output'; +import {OUTPUT_MODE_ID, OUTPUT_PANEL_ID, IOutputService} from 'vs/workbench/parts/output/common/output'; import panel = require('vs/workbench/browser/panel'); import {EditorContextKeys} from 'vs/editor/common/editorCommon'; import {CommandsRegistry, ICommandHandler} from 'vs/platform/commands/common/commands'; @@ -28,8 +28,7 @@ registerSingleton(IOutputService, OutputService); ModesRegistry.registerLanguage({ id: OUTPUT_MODE_ID, extensions: [], - aliases: [null], - mimetypes: [OUTPUT_MIME] + aliases: [null] }); // Register Output Panel diff --git a/src/vs/workbench/parts/output/browser/outputEditorInput.ts b/src/vs/workbench/parts/output/browser/outputEditorInput.ts index 1f78496046b..54a73eb81e2 100644 --- a/src/vs/workbench/parts/output/browser/outputEditorInput.ts +++ b/src/vs/workbench/parts/output/browser/outputEditorInput.ts @@ -11,7 +11,7 @@ import {TPromise} from 'vs/base/common/winjs.base'; import {RunOnceScheduler} from 'vs/base/common/async'; import {EditorModel} from 'vs/workbench/common/editor'; import {StringEditorInput} from 'vs/workbench/common/editor/stringEditorInput'; -import {OUTPUT_EDITOR_INPUT_ID, OUTPUT_PANEL_ID, IOutputEvent, OUTPUT_MIME, IOutputService, MAX_OUTPUT_LENGTH, IOutputChannel} from 'vs/workbench/parts/output/common/output'; +import {OUTPUT_EDITOR_INPUT_ID, OUTPUT_PANEL_ID, IOutputEvent, OUTPUT_MODE_ID, IOutputService, MAX_OUTPUT_LENGTH, IOutputChannel} from 'vs/workbench/parts/output/common/output'; import {OutputPanel} from 'vs/workbench/parts/output/browser/outputPanel'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; @@ -49,7 +49,7 @@ export class OutputEditorInput extends StringEditorInput { @IOutputService private outputService: IOutputService, @IPanelService private panelService: IPanelService ) { - super(nls.localize('output', "Output"), outputChannel ? nls.localize('outputChannel', "for '{0}'", outputChannel.label) : '', '', OUTPUT_MIME, true, instantiationService); + super(nls.localize('output', "Output"), outputChannel ? nls.localize('outputChannel', "for '{0}'", outputChannel.label) : '', '', OUTPUT_MODE_ID, true, instantiationService); this.bufferedOutput = ''; this.toDispose = []; diff --git a/src/vs/workbench/parts/output/common/output.ts b/src/vs/workbench/parts/output/common/output.ts index 88b1a82730f..4b9379120fa 100644 --- a/src/vs/workbench/parts/output/common/output.ts +++ b/src/vs/workbench/parts/output/common/output.ts @@ -11,11 +11,6 @@ import {createDecorator} from 'vs/platform/instantiation/common/instantiation'; import {IEditor} from 'vs/platform/editor/common/editor'; import {RawContextKey} from 'vs/platform/contextkey/common/contextkey'; -/** - * Mime type used by the output editor. - */ -export const OUTPUT_MIME = 'text/x-code-output'; - /** * Id used by the output editor. */ diff --git a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts index 7899059e316..c21a26a2d9e 100644 --- a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts @@ -14,7 +14,7 @@ import * as Platform from 'vs/platform/platform'; import {SyncDescriptor} from 'vs/platform/instantiation/common/descriptors'; import {StringEditorInput} from 'vs/workbench/common/editor/stringEditorInput'; import {ITelemetryService, NullTelemetryService} from 'vs/platform/telemetry/common/telemetry'; -import mime = require('vs/base/common/mime'); +import {PLAINTEXT_MODE_ID} from 'vs/editor/common/modes/modesRegistry'; let EditorRegistry: IEditorRegistry = Platform.Registry.as(Extensions.Editors); @@ -189,10 +189,10 @@ suite('Workbench BaseEditor', () => { let inst = new TestInstantiationService(); - inst.createInstance(EditorRegistry.getEditor(inst.createInstance(MyStringInput, 'fake', '', '', mime.MIME_TEXT, false)), 'id').then(editor => { + inst.createInstance(EditorRegistry.getEditor(inst.createInstance(MyStringInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { assert.strictEqual(editor.getId(), 'myEditor'); - return inst.createInstance(EditorRegistry.getEditor(inst.createInstance(StringEditorInput, 'fake', '', '', mime.MIME_TEXT, false)), 'id').then(editor => { + return inst.createInstance(EditorRegistry.getEditor(inst.createInstance(StringEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { assert.strictEqual(editor.getId(), 'myOtherEditor'); (EditorRegistry).setEditors(oldEditors); @@ -210,7 +210,7 @@ suite('Workbench BaseEditor', () => { let inst = new TestInstantiationService(); - inst.createInstance(EditorRegistry.getEditor(inst.createInstance(MyStringInput, 'fake', '', '', mime.MIME_TEXT, false)), 'id').then(editor => { + inst.createInstance(EditorRegistry.getEditor(inst.createInstance(MyStringInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { assert.strictEqual('myOtherEditor', editor.getId()); (EditorRegistry).setEditors(oldEditors); @@ -221,7 +221,7 @@ suite('Workbench BaseEditor', () => { let inst = new TestInstantiationService(); let action = new MyAction('id', 'label'); - action.input = inst.createInstance(StringEditorInput, 'input', '', '', mime.MIME_TEXT, false); + action.input = inst.createInstance(StringEditorInput, 'input', '', '', PLAINTEXT_MODE_ID, false); assert.equal(action.didCallIsEnabled, true); }); @@ -231,12 +231,12 @@ suite('Workbench BaseEditor', () => { let contributor = new MyEditorInputActionContributor(); assert(!contributor.hasActions(null)); - assert(contributor.hasActions({ editor: new MyEditor('id', NullTelemetryService), input: inst.createInstance(StringEditorInput, 'fake', '', '', mime.MIME_TEXT, false), position: 0 })); + assert(contributor.hasActions({ editor: new MyEditor('id', NullTelemetryService), input: inst.createInstance(StringEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false), position: 0 })); - let actionsFirst = contributor.getActions({ editor: new MyEditor('id', NullTelemetryService), input: inst.createInstance(StringEditorInput, 'fake', '', '', mime.MIME_TEXT, false), position: 0 }); + let actionsFirst = contributor.getActions({ editor: new MyEditor('id', NullTelemetryService), input: inst.createInstance(StringEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false), position: 0 }); assert.strictEqual(actionsFirst.length, 2); - let input = inst.createInstance(StringEditorInput, 'fake', '', '', mime.MIME_TEXT, false); + let input = inst.createInstance(StringEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false); let actions = contributor.getActions({ editor: new MyEditor('id', NullTelemetryService), input: input, position: 0 }); assert(actions[0] === actionsFirst[0]); assert(actions[1] === actionsFirst[1]); diff --git a/src/vs/workbench/test/common/editor/stringEditorInput.test.ts b/src/vs/workbench/test/common/editor/stringEditorInput.test.ts index 57158059545..e0090fd3f5d 100644 --- a/src/vs/workbench/test/common/editor/stringEditorInput.test.ts +++ b/src/vs/workbench/test/common/editor/stringEditorInput.test.ts @@ -32,12 +32,12 @@ suite('Workbench - StringEditorInput', () => { test('StringEditorInput', function (done) { - let input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', false); - let otherInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'othervalue', 'mime', false); - let otherInputSame = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', false); + let input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); + let otherInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'othervalue', 'mode', false); + let otherInputSame = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - let inputSingleton = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', true); - let otherInputSingleton = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'othervalue', 'mime', true); + let inputSingleton = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', true); + let otherInputSingleton = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'othervalue', 'mode', true); assert(inputSingleton.matches(otherInputSingleton)); (otherInputSingleton).singleton = false; assert(!inputSingleton.matches(otherInputSingleton)); @@ -48,15 +48,15 @@ suite('Workbench - StringEditorInput', () => { assert(!input.matches(null)); assert(input.getName()); - input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', false); + input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', false); + input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); editorService.resolveEditorModel(input, true).then(resolved => { let resolvedModelA = resolved; return editorService.resolveEditorModel(input, true).then(resolved => { assert(resolvedModelA === resolved); // assert: Resolved Model cached per instance - let otherInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', false); + let otherInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); return editorService.resolveEditorModel(otherInput, true).then(resolved => { assert(resolvedModelA !== resolved); // NOT assert: Different instance, different model @@ -78,7 +78,7 @@ suite('Workbench - StringEditorInput', () => { }); test('StringEditorInput - setValue, clearValue, append', function () { - let input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', false); + let input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); assert.strictEqual(input.getValue(), 'value'); input.setValue('foo'); @@ -94,10 +94,10 @@ suite('Workbench - StringEditorInput', () => { test('Input.matches() - StringEditorInput', function () { let inst = new TestInstantiationService(); - let stringEditorInput = inst.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', false); + let stringEditorInput = inst.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); let promiseEditorInput = inst.createInstance(ResourceEditorInput, 'name', 'description', URI.from({ scheme: 'inMemory', authority: null, path: 'thePath' })); - let stringEditorInput2 = inst.createInstance(StringEditorInput, 'name', 'description', 'value', 'mime', false); + let stringEditorInput2 = inst.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); let promiseEditorInput2 = inst.createInstance(ResourceEditorInput, 'name', 'description', URI.from({ scheme: 'inMemory', authority: null, path: 'thePath' })); assert.strictEqual(stringEditorInput.matches(null), false); diff --git a/src/vs/workbench/test/common/editor/stringEditorModel.test.ts b/src/vs/workbench/test/common/editor/stringEditorModel.test.ts index dab7dae73ac..d36f66ca699 100644 --- a/src/vs/workbench/test/common/editor/stringEditorModel.test.ts +++ b/src/vs/workbench/test/common/editor/stringEditorModel.test.ts @@ -23,7 +23,7 @@ suite('Workbench - StringEditorModel', () => { test('StringEditorModel', function (done) { instantiationService.stub(IModelService, createMockModelService(instantiationService)); - let m = instantiationService.createInstance(StringEditorModel, 'value', 'mime', null); + let m = instantiationService.createInstance(StringEditorModel, 'value', 'mode', null); m.load().then(model => { assert(model === m); @@ -45,7 +45,7 @@ suite('Workbench - StringEditorModel', () => { test('StringEditorModel - setValue, clearValue, append, trim', function (done) { instantiationService.stub(IModelService, createMockModelService(instantiationService)); - let m = instantiationService.createInstance(StringEditorModel, 'value', 'mime', null); + let m = instantiationService.createInstance(StringEditorModel, 'value', 'mode', null); m.load().then(model => { assert(model === m); From 89be12324c0868deb75a737bf3437c05edb4cd55 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 5 Oct 2016 09:22:17 +0200 Subject: [PATCH 411/433] fixes #13178 --- .../parts/extensions/electron-browser/extensionEditor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index aeceb42d2c5..01a24d3b11c 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -165,7 +165,7 @@ export class ExtensionEditor extends BaseEditor { const details = append(header, $('.details')); const title = append(details, $('.title')); this.name = append(title, $('span.name.clickable')); - this.identifier = append(title, $('span.identifier')); + this.identifier = append(title, $('span.identifier', { title: localize('extension id', "Extension identifier") })); const subtitle = append(details, $('.subtitle')); this.publisher = append(subtitle, $('span.publisher.clickable')); From 7d14e26db058bfa411db9aef447941353753669b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 5 Oct 2016 09:25:55 +0200 Subject: [PATCH 412/433] fixes #13179 --- .../parts/extensions/electron-browser/extensionEditor.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 01a24d3b11c..f31ab5598ab 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -164,15 +164,15 @@ export class ExtensionEditor extends BaseEditor { const details = append(header, $('.details')); const title = append(details, $('.title')); - this.name = append(title, $('span.name.clickable')); + this.name = append(title, $('span.name.clickable', { title: localize('name', "Extension name") })); this.identifier = append(title, $('span.identifier', { title: localize('extension id', "Extension identifier") })); const subtitle = append(details, $('.subtitle')); - this.publisher = append(subtitle, $('span.publisher.clickable')); + this.publisher = append(subtitle, $('span.publisher.clickable', { title: localize('publisher', "Publisher name") })); - this.installCount = append(subtitle, $('span.install')); + this.installCount = append(subtitle, $('span.install', { title: localize('install count', "Install count") })); - this.rating = append(subtitle, $('span.rating.clickable')); + this.rating = append(subtitle, $('span.rating.clickable', { title: localize('rating', "Rating") })); this.license = append(subtitle, $('span.license.clickable')); this.license.textContent = localize('license', 'License'); From ef59b96b50583fb81db37b4bf8301e742a944626 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 5 Oct 2016 09:30:12 +0200 Subject: [PATCH 413/433] remove rating count fixes #13180 --- .../parts/extensions/electron-browser/extensionsWidgets.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts index 9ffb1cd1d82..dc9a8da8678 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts @@ -133,6 +133,9 @@ export class RatingsWidget implements IDisposable { if (this.options.small) { append(this.container, $('span.full.star')); + + const count = append(this.container, $('span.count')); + count.textContent = String(rating); } else { for (let i = 1; i <= 5; i++) { if (rating >= i) { @@ -144,9 +147,6 @@ export class RatingsWidget implements IDisposable { } } } - - const count = append(this.container, $('span.count')); - count.textContent = String(this.options.small ? rating : this.extension.ratingCount); } dispose(): void { From 3b1c07b118a05a2b061c14f9eba469aee2e2f5fe Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 09:34:02 +0200 Subject: [PATCH 414/433] debt: remove mime traces from files land --- src/vs/platform/files/common/files.ts | 8 +------- src/vs/test/utils/servicesTestUtils.ts | 7 +------ .../cli/electron-browser/cli.contribution.ts | 2 +- .../parts/files/browser/views/explorerView.ts | 3 --- .../files/common/editors/textFileEditorModel.ts | 6 +++--- .../parts/files/common/explorerViewModel.ts | 12 +++--------- .../files/electron-browser/textFileService.ts | 1 - .../test/browser/explorerViewModel.test.ts | 17 ++++++++--------- .../files/test/browser/fileEditorInput.test.ts | 3 +-- .../browser/textFileEditorModelManager.test.ts | 3 +-- .../services/files/node/fileService.ts | 16 +++------------- 11 files changed, 22 insertions(+), 56 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 3b4c241d8e5..c01f2c3598f 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -307,12 +307,6 @@ export interface IBaseStat { * current state of the file or directory. */ etag: string; - - /** - * The mime type string. Applicate for files - * only. - */ - mime: string; } /** @@ -322,7 +316,7 @@ export interface IFileStat extends IBaseStat { /** * The resource is a directory. Iff {{true}} - * {{mime}} and {{encoding}} have no meaning. + * {{encoding}} has no meaning. */ isDirectory: boolean; diff --git a/src/vs/test/utils/servicesTestUtils.ts b/src/vs/test/utils/servicesTestUtils.ts index 483beed9908..6af456e2756 100644 --- a/src/vs/test/utils/servicesTestUtils.ts +++ b/src/vs/test/utils/servicesTestUtils.ts @@ -139,7 +139,6 @@ export class TestTextFileService extends TextFileService { name: content.name, mtime: content.mtime, etag: content.etag, - mime: content.mime, encoding: content.encoding, value: raw, valueLogicalHash: null @@ -255,7 +254,7 @@ export class TestPartService implements IPartService { public getWorkbenchElementId(): string { return ''; } public setRestoreSidebar(): void { - + } } @@ -523,7 +522,6 @@ export const TestFileService = { resource: resource, value: 'Hello Html', etag: 'index.txt', - mime: 'text/plain', encoding: 'utf8', mtime: Date.now(), name: paths.basename(resource.fsPath) @@ -534,7 +532,6 @@ export const TestFileService = { return TPromise.as({ resource: resource, etag: Date.now(), - mime: 'text/plain', encoding: 'utf8', mtime: Date.now(), name: paths.basename(resource.fsPath) @@ -555,7 +552,6 @@ export const TestFileService = { } }, etag: 'index.txt', - mime: 'text/plain', encoding: 'utf8', mtime: Date.now(), name: paths.basename(resource.fsPath) @@ -567,7 +563,6 @@ export const TestFileService = { return { resource: res, etag: 'index.txt', - mime: 'text/plain', encoding: 'utf8', mtime: Date.now(), name: paths.basename(res.fsPath) diff --git a/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts b/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts index 43cf9dcf42e..4fd7d974ec2 100644 --- a/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts +++ b/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts @@ -72,7 +72,7 @@ class InstallAction extends Action { ); const resource = URI.file(file); - const input = { resource, mime: 'text/x-shellscript' }; + const input = { resource }; const actions = [ new Action('inlineEdit', nls.localize('editFile', "Edit '{0}'", file), '', true, () => { return this.editorService.openEditor(input).then(() => { diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index fcc828278dd..9e101f8d307 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -412,9 +412,6 @@ export class ExplorerView extends CollapsibleViewletView { if (oldParentResource && newParentResource && oldParentResource.toString() === newParentResource.toString()) { modelElement = this.getInput().find(oldElement.resource); if (modelElement) { - if (!modelElement.isDirectory && !modelElement.mime) { - return; - } // Rename File (Model) modelElement.rename(newElement); diff --git a/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts b/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts index ba61631308e..434c5c139fa 100644 --- a/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts +++ b/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts @@ -8,6 +8,7 @@ import nls = require('vs/nls'); import Event, {Emitter} from 'vs/base/common/event'; import {TPromise} from 'vs/base/common/winjs.base'; import {onUnexpectedError} from 'vs/base/common/errors'; +import {guessMimeTypes} from 'vs/base/common/mime'; import {toErrorMessage} from 'vs/base/common/errorMessage'; import URI from 'vs/base/common/uri'; import * as assert from 'vs/base/common/assert'; @@ -204,7 +205,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil diag('load() - resolved content', this.resource, new Date()); // Telemetry - this.telemetryService.publicLog('fileGet', { mimeType: content.mime, ext: paths.extname(this.resource.fsPath), path: anonymize(this.resource.fsPath) }); + this.telemetryService.publicLog('fileGet', { mimeType: guessMimeTypes(this.resource.fsPath).join(', '), ext: paths.extname(this.resource.fsPath), path: anonymize(this.resource.fsPath) }); // Update our resolved disk stat model const resolvedStat: IFileStat = { @@ -212,7 +213,6 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil name: content.name, mtime: content.mtime, etag: content.etag, - mime: content.mime, isDirectory: false, hasChildren: false, children: void 0, @@ -489,7 +489,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil delete this.mapPendingSaveToVersionId[versionId]; // Telemetry - this.telemetryService.publicLog('filePUT', { mimeType: stat.mime, ext: paths.extname(this.versionOnDiskStat.resource.fsPath) }); + this.telemetryService.publicLog('filePUT', { mimeType: guessMimeTypes(this.resource.fsPath).join(', '), ext: paths.extname(this.versionOnDiskStat.resource.fsPath) }); // Update dirty state unless model has changed meanwhile if (versionId === this.versionId) { diff --git a/src/vs/workbench/parts/files/common/explorerViewModel.ts b/src/vs/workbench/parts/files/common/explorerViewModel.ts index 11b2a496828..3a8cbe6143b 100644 --- a/src/vs/workbench/parts/files/common/explorerViewModel.ts +++ b/src/vs/workbench/parts/files/common/explorerViewModel.ts @@ -10,7 +10,6 @@ import URI from 'vs/base/common/uri'; import {isLinux} from 'vs/base/common/platform'; import paths = require('vs/base/common/paths'); import {IFileStat} from 'vs/platform/files/common/files'; -import {guessMimeTypes} from 'vs/base/common/mime'; export enum StatType { FILE, @@ -23,7 +22,6 @@ export class FileStat implements IFileStat { public name: string; public mtime: number; public etag: string; - public mime: string; public isDirectory: boolean; public hasChildren: boolean; public children: FileStat[]; @@ -31,12 +29,11 @@ export class FileStat implements IFileStat { public isDirectoryResolved: boolean; - constructor(resource: URI, isDirectory?: boolean, hasChildren?: boolean, name: string = paths.basename(resource.fsPath), mime = !isDirectory ? guessMimeTypes(resource.fsPath).join(', ') : void (0), mtime?: number, etag?: string) { + constructor(resource: URI, isDirectory?: boolean, hasChildren?: boolean, name: string = paths.basename(resource.fsPath), mtime?: number, etag?: string) { this.resource = resource; this.name = name; this.isDirectory = !!isDirectory; this.hasChildren = isDirectory && hasChildren; - this.mime = mime; this.etag = etag; this.mtime = mtime; @@ -53,7 +50,7 @@ export class FileStat implements IFileStat { } public static create(raw: IFileStat, resolveTo?: URI[]): FileStat { - const stat = new FileStat(raw.resource, raw.isDirectory, raw.hasChildren, raw.name, raw.mime, raw.mtime, raw.etag); + const stat = new FileStat(raw.resource, raw.isDirectory, raw.hasChildren, raw.name, raw.mtime, raw.etag); // Recursively add children if present if (stat.isDirectory) { @@ -99,7 +96,6 @@ export class FileStat implements IFileStat { local.isDirectory = disk.isDirectory; local.hasChildren = disk.isDirectory && disk.hasChildren; local.mtime = disk.mtime; - local.mime = disk.mime; local.isDirectoryResolved = disk.isDirectoryResolved; // Merge Children if resolved @@ -138,7 +134,7 @@ export class FileStat implements IFileStat { * Returns a deep copy of this model object. */ public clone(): FileStat { - const stat = new FileStat(URI.parse(this.resource.toString()), this.isDirectory, this.hasChildren, this.name, this.mime, this.mtime, this.etag); + const stat = new FileStat(URI.parse(this.resource.toString()), this.isDirectory, this.hasChildren, this.name, this.mtime, this.etag); stat.isDirectoryResolved = this.isDirectoryResolved; if (this.parent) { @@ -248,7 +244,6 @@ export class FileStat implements IFileStat { // Merge a subset of Properties that can change on rename this.name = renamedStat.name; - this.mime = renamedStat.mime; this.mtime = renamedStat.mtime; // Update Paths including children @@ -320,7 +315,6 @@ export class NewStatPlaceholder extends FileStat { this.isDirectory = void 0; this.hasChildren = void 0; this.mtime = void 0; - this.mime = void 0; } public getId(): string { diff --git a/src/vs/workbench/parts/files/electron-browser/textFileService.ts b/src/vs/workbench/parts/files/electron-browser/textFileService.ts index 7dce42fb035..cba7157bd68 100644 --- a/src/vs/workbench/parts/files/electron-browser/textFileService.ts +++ b/src/vs/workbench/parts/files/electron-browser/textFileService.ts @@ -60,7 +60,6 @@ export class TextFileService extends AbstractTextFileService { name: streamContent.name, mtime: streamContent.mtime, etag: streamContent.etag, - mime: streamContent.mime, encoding: streamContent.encoding, value: res.rawText, valueLogicalHash: res.hash diff --git a/src/vs/workbench/parts/files/test/browser/explorerViewModel.test.ts b/src/vs/workbench/parts/files/test/browser/explorerViewModel.test.ts index d8995765a01..9bbf77918c7 100644 --- a/src/vs/workbench/parts/files/test/browser/explorerViewModel.test.ts +++ b/src/vs/workbench/parts/files/test/browser/explorerViewModel.test.ts @@ -10,13 +10,12 @@ import {isUndefinedOrNull, isArray} from 'vs/base/common/types'; import {isLinux, isWindows} from 'vs/base/common/platform'; import URI from 'vs/base/common/uri'; import {join} from 'vs/base/common/paths'; -import {guessMimeTypes} from 'vs/base/common/mime'; import {validateFileName} from 'vs/workbench/parts/files/browser/fileActions'; import {LocalFileChangeEvent} from 'vs/workbench/parts/files/common/files'; import {FileStat} from 'vs/workbench/parts/files/common/explorerViewModel'; function createStat(path, name, isFolder, hasChildren, size, mtime) { - return new FileStat(toResource(path), isFolder, hasChildren, name, !isFolder ? guessMimeTypes(path).join(', ') : null, mtime); + return new FileStat(toResource(path), isFolder, hasChildren, name, mtime); } function toResource(path) { @@ -240,9 +239,9 @@ suite('Files - View Model', () => { test('File Change Event (with stats)', function () { const d = new Date().toUTCString(); - const s1 = new FileStat(toResource('/path/to/sName'), false, false, 'sName', void 0, 8096 /* Size */, d); - const s2 = new FileStat(toResource('/path/to/sName'), false, false, 'sName', void 0, 16000 /* Size */, d); - const s3 = new FileStat(toResource('/path/to/sNameMoved'), false, false, 'sNameMoved', void 0, 8096 /* Size */, d); + const s1 = new FileStat(toResource('/path/to/sName'), false, false, 'sName', Date.now(), d); + const s2 = new FileStat(toResource('/path/to/sName'), false, false, 'sName', Date.now(), d); + const s3 = new FileStat(toResource('/path/to/sNameMoved'), false, false, 'sNameMoved', Date.now(), d); // Got Added let event = new LocalFileChangeEvent(null, s1); @@ -283,20 +282,20 @@ suite('Files - View Model', () => { test('Merge Local with Disk', function () { const d = new Date().toUTCString(); - const merge1 = new FileStat(URI.file(join('C:\\', '/path/to')), true, false, 'to', void 0, 8096, d); - const merge2 = new FileStat(URI.file(join('C:\\', '/path/to')), true, false, 'to', void 0, 16000, new Date(0).toUTCString()); + const merge1 = new FileStat(URI.file(join('C:\\', '/path/to')), true, false, 'to', Date.now(), d); + const merge2 = new FileStat(URI.file(join('C:\\', '/path/to')), true, false, 'to', Date.now(), new Date(0).toUTCString()); // Merge Properties FileStat.mergeLocalWithDisk(merge2, merge1); assert.strictEqual(merge1.mtime, merge2.mtime); // Merge Child when isDirectoryResolved=false is a no-op - merge2.addChild(new FileStat(URI.file(join('C:\\', '/path/to/foo.html')), true, false, 'foo.html', void 0, 8096, d)); + merge2.addChild(new FileStat(URI.file(join('C:\\', '/path/to/foo.html')), true, false, 'foo.html', Date.now(), d)); FileStat.mergeLocalWithDisk(merge2, merge1); assert.strictEqual(merge1.children.length, 0); // Merge Child with isDirectoryResolved=true - const child = new FileStat(URI.file(join('C:\\', '/path/to/foo.html')), true, false, 'foo.html', void 0, 8096, d); + const child = new FileStat(URI.file(join('C:\\', '/path/to/foo.html')), true, false, 'foo.html', Date.now(), d); merge2.removeChild(child); merge2.addChild(child); merge2.isDirectoryResolved = true; diff --git a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts b/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts index d01ff1e5e15..386678a4e7b 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts @@ -28,8 +28,7 @@ function toStat(resource: URI) { hasChildren: false, name: basename(resource.fsPath), mtime: Date.now(), - etag: 'etag', - mime: 'text/plain' + etag: 'etag' }; } diff --git a/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts b/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts index 21616e674c3..a9d909ad739 100644 --- a/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts +++ b/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts @@ -38,8 +38,7 @@ function toStat(resource: URI) { hasChildren: false, name: basename(resource.fsPath), mtime: Date.now(), - etag: 'etag', - mime: 'text/plain' + etag: 'etag' }; } diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts index 1851192c098..11f5b5f3c74 100644 --- a/src/vs/workbench/services/files/node/fileService.ts +++ b/src/vs/workbench/services/files/node/fileService.ts @@ -188,13 +188,7 @@ export class FileService implements IFileService { } // 2.) get content - return contentResolver(resource, options && options.etag, preferredEncoding).then(content => { - - // set our knowledge about the mime on the content obj - content.mime = detected.mimes.join(', '); - - return content; - }); + return contentResolver(resource, options && options.etag, preferredEncoding); }, (error) => { // bubble up existing file operation results @@ -678,7 +672,6 @@ export class StatResolver { private isDirectory: boolean; private mtime: number; private name: string; - private mime: string; private etag: string; private size: number; private verboseLogging: boolean; @@ -690,7 +683,6 @@ export class StatResolver { this.isDirectory = isDirectory; this.mtime = mtime; this.name = paths.basename(resource.fsPath); - this.mime = !this.isDirectory ? baseMime.guessMimeTypes(resource.fsPath).join(', ') : void 0; this.etag = etag(size, mtime); this.size = size; @@ -707,8 +699,7 @@ export class StatResolver { name: this.name, etag: this.etag, size: this.size, - mtime: this.mtime, - mime: this.mime + mtime: this.mtime }; // File Specific Data @@ -791,8 +782,7 @@ export class StatResolver { name: file, mtime: fileStat.mtime.getTime(), etag: etag(fileStat), - size: fileStat.size, - mime: !fileStat.isDirectory() ? baseMime.guessMimeTypes(fileResource.fsPath).join(', ') : void 0 + size: fileStat.size }; // Return early for files From 7e299e73a158d9c885856f2f3e3a6aabe494218e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 09:55:15 +0200 Subject: [PATCH 415/433] =?UTF-8?q?=F0=9F=92=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/editors/textFileEditorModel.ts | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts b/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts index 434c5c139fa..c40fdd64f28 100644 --- a/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts +++ b/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts @@ -446,24 +446,23 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil // We DO NOT run any save participant if we are in the shutdown phase and files are being // saved as a result of that. let saveParticipantPromise = TPromise.as(versionId); - if (TextFileEditorModel.saveParticipant && !this.lifecycleService.willShutdown) { + const onCompleteOrError = () => { + this.blockModelContentChange = false; + + return this.versionId; + }; + saveParticipantPromise = TPromise.as(undefined).then(() => { this.blockModelContentChange = true; + return TextFileEditorModel.saveParticipant.participate(this, { reason }); - }).then(() => { - this.blockModelContentChange = false; - return this.versionId; - }, err => { - // ignore error and proceed as if nothing has happend - this.blockModelContentChange = false; - return this.versionId; - }); + }).then(onCompleteOrError, onCompleteOrError); } this.mapPendingSaveToVersionId[versionId] = saveParticipantPromise.then(newVersionId => { - // remove save participant promise and update versionId with + // remove save participant promise from pending saves and update versionId with // its new value (if pre-save changes happened) delete this.mapPendingSaveToVersionId[versionId]; versionId = newVersionId; @@ -477,8 +476,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil // Save to Disk diag(`doSave(${versionId}) - before updateContent()`, this.resource, new Date()); this.mapPendingSaveToVersionId[versionId] = this.fileService.updateContent(this.versionOnDiskStat.resource, this.getValue(), { - overwriteReadonly: overwriteReadonly, - overwriteEncoding: overwriteEncoding, + overwriteReadonly, + overwriteEncoding, mtime: this.versionOnDiskStat.mtime, encoding: this.getEncoding(), etag: this.versionOnDiskStat.etag From 2876e9cc9d1c5c38503c39fa45d980460c631e9e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 12:18:49 +0200 Subject: [PATCH 416/433] some fixes around usage of file editor input --- src/vs/workbench/common/editor.ts | 20 +++++------ .../files/browser/editors/binaryFileEditor.ts | 2 +- .../parts/files/browser/fileActions.ts | 7 ++-- .../files/browser/views/openEditorsViewer.ts | 12 ++----- .../git/browser/views/changes/changesView.ts | 5 ++- .../common/editor/rangeDecorations.test.ts | 34 +++++++++---------- 6 files changed, 37 insertions(+), 43 deletions(-) diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index a62afe5e8f1..a8ee5aa2930 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -459,7 +459,7 @@ export class EditorOptions implements IEditorOptions { * Helper to create EditorOptions inline. */ public static create(settings: IEditorOptions): EditorOptions { - let options = new EditorOptions(); + const options = new EditorOptions(); options.preserveFocus = settings.preserveFocus; options.forceOpen = settings.forceOpen; options.revealIfVisible = settings.revealIfVisible; @@ -537,7 +537,7 @@ export class TextEditorOptions extends EditorOptions { } if (input.options.selection) { - let selection = input.options.selection; + const selection = input.options.selection; options.selection(selection.startLineNumber, selection.startColumn, selection.endLineNumber, selection.endColumn); } @@ -573,7 +573,7 @@ export class TextEditorOptions extends EditorOptions { * Helper to create TextEditorOptions inline. */ public static create(settings: ITextEditorOptions): TextEditorOptions { - let options = new TextEditorOptions(); + const options = new TextEditorOptions(); options.preserveFocus = settings.preserveFocus; options.forceOpen = settings.forceOpen; options.revealIfVisible = settings.revealIfVisible; @@ -660,7 +660,7 @@ export class TextEditorOptions extends EditorOptions { // Select if (!types.isUndefinedOrNull(this.endLineNumber) && !types.isUndefinedOrNull(this.endColumn)) { - let range = { + const range = { startLineNumber: this.startLineNumber, startColumn: this.startColumn, endLineNumber: this.endLineNumber, @@ -672,7 +672,7 @@ export class TextEditorOptions extends EditorOptions { // Reveal else { - let pos = { + const pos = { lineNumber: this.startLineNumber, column: this.startColumn }; @@ -705,7 +705,7 @@ export class TextDiffEditorOptions extends TextEditorOptions { * Helper to create TextDiffEditorOptions inline. */ public static create(settings: ITextDiffEditorOptions): TextDiffEditorOptions { - let options = new TextDiffEditorOptions(); + const options = new TextDiffEditorOptions(); options.autoRevealFirstChange = settings.autoRevealFirstChange; @@ -746,7 +746,7 @@ export function getUntitledOrFileResource(input: IEditorInput, supportDiff?: boo } // File - let fileInput = asFileEditorInput(input, supportDiff); + const fileInput = asFileEditorInput(input, supportDiff); return fileInput && fileInput.getResource(); } @@ -754,7 +754,7 @@ export function getUntitledOrFileResource(input: IEditorInput, supportDiff?: boo // TODO@Ben every editor should have an associated resource export function getResource(input: IEditorInput): URI { if (input instanceof EditorInput && typeof (input).getResource === 'function') { - let candidate = (input).getResource(); + const candidate = (input).getResource(); if (candidate instanceof URI) { return candidate; } @@ -795,9 +795,9 @@ export function asFileEditorInput(obj: any, supportDiff?: boolean): IFileEditorI obj = (obj).modifiedInput; } - let i = obj; + const i = obj; - return i instanceof EditorInput && types.areFunctions(i.setResource, i.setEncoding, i.getEncoding, i.getResource) ? i : null; + return i instanceof EditorInput && types.areFunctions(i.setResource, i.setEncoding, i.getEncoding, i.getResource, i.setPreferredEncoding) ? i : null; } export interface IStacksModelChangeEvent { diff --git a/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.ts index efcceabb886..0a23a31c342 100644 --- a/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.ts @@ -11,7 +11,7 @@ import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; /** - * An implementation of editor for binary files like images or videos leveraging the FileEditorInput. + * An implementation of editor for binary files like images. */ export class BinaryFileEditor extends BaseBinaryResourceEditor { diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index 53431f18786..1c6ec6683dc 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -26,7 +26,7 @@ import {dispose, IDisposable} from 'vs/base/common/lifecycle'; import {LocalFileChangeEvent, VIEWLET_ID, ITextFileService} from 'vs/workbench/parts/files/common/files'; import {IFileService, IFileStat, IImportResult} from 'vs/platform/files/common/files'; import {DiffEditorInput, toDiffLabel} from 'vs/workbench/common/editor/diffEditorInput'; -import {asFileEditorInput, getUntitledOrFileResource, UntitledEditorInput, IEditorIdentifier} from 'vs/workbench/common/editor'; +import {asFileEditorInput, getUntitledOrFileResource, IEditorIdentifier} from 'vs/workbench/common/editor'; import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import {FileStat, NewStatPlaceholder} from 'vs/workbench/parts/files/common/explorerViewModel'; import {ExplorerView} from 'vs/workbench/parts/files/browser/views/explorerView'; @@ -1633,8 +1633,9 @@ export class SaveAllInGroupAction extends BaseSaveAllAction { const editorGroup = editorIdentifier.group; const resourcesToSave = []; editorGroup.getEditors().forEach(editor => { - if (editor instanceof FileEditorInput || editor instanceof UntitledEditorInput) { - resourcesToSave.push(editor.getResource()); + const resource = getUntitledOrFileResource(editor, true); + if (resource) { + resourcesToSave.push(resource); } }); diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts index 8b202d448bc..a0b52ef52e3 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts @@ -22,9 +22,9 @@ import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; import {IContextMenuService} from 'vs/platform/contextview/browser/contextView'; import {IKeybindingService} from 'vs/platform/keybinding/common/keybinding'; -import {UntitledEditorInput, IEditorGroup, IEditorStacksModel} from 'vs/workbench/common/editor'; +import {UntitledEditorInput, IEditorGroup, IEditorStacksModel, getUntitledOrFileResource} from 'vs/workbench/common/editor'; import {ContributableActionProvider} from 'vs/workbench/browser/actionBarRegistry'; -import {ITextFileService, AutoSaveMode, FileEditorInput, asFileResource} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService, AutoSaveMode, asFileResource} from 'vs/workbench/parts/files/common/files'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {EditorStacksModel, EditorGroup} from 'vs/workbench/common/editor/editorStacksModel'; import {keybindingForAction, SaveFileAction, RevertFileAction, SaveFileAsAction, OpenToSideAction, SelectResourceForCompareAction, CompareResourcesAction, SaveAllInGroupAction} from 'vs/workbench/parts/files/browser/fileActions'; @@ -64,13 +64,7 @@ export class OpenEditor { } public getResource(): uri { - if (this.editor instanceof FileEditorInput) { - return (this.editor).getResource(); - } else if (this.editor instanceof UntitledEditorInput) { - return (this.editor).getResource(); - } - - return null; + return getUntitledOrFileResource(this.editor, true); } } diff --git a/src/vs/workbench/parts/git/browser/views/changes/changesView.ts b/src/vs/workbench/parts/git/browser/views/changes/changesView.ts index c208b75c5da..d27274df108 100644 --- a/src/vs/workbench/parts/git/browser/views/changes/changesView.ts +++ b/src/vs/workbench/parts/git/browser/views/changes/changesView.ts @@ -26,7 +26,6 @@ import GitActions = require('vs/workbench/parts/git/browser/gitActions'); import GitModel = require('vs/workbench/parts/git/common/gitModel'); import Viewer = require('vs/workbench/parts/git/browser/views/changes/changesViewer'); import GitEditorInputs = require('vs/workbench/parts/git/browser/gitEditorInputs'); -import Files = require('vs/workbench/parts/files/common/files'); import {IOutputService} from 'vs/workbench/parts/output/common/output'; import WorkbenchEditorCommon = require('vs/workbench/common/editor'); import InputBox = require('vs/base/browser/ui/inputbox/inputBox'); @@ -450,8 +449,8 @@ export class ChangesView extends EventEmitter.EventEmitter implements GitView.IV return ( input).getFileStatus() || null; } - if (input instanceof Files.FileEditorInput) { - const fileInput = input; + const fileInput = WorkbenchEditorCommon.asFileEditorInput(input); + if (fileInput) { const resource = fileInput.getResource(); const workspaceRoot = this.contextService.getWorkspace().resource.fsPath; diff --git a/src/vs/workbench/test/common/editor/rangeDecorations.test.ts b/src/vs/workbench/test/common/editor/rangeDecorations.test.ts index 6e0b98dddc2..794c0ce1cb7 100644 --- a/src/vs/workbench/test/common/editor/rangeDecorations.test.ts +++ b/src/vs/workbench/test/common/editor/rangeDecorations.test.ts @@ -6,20 +6,20 @@ import * as assert from 'assert'; import { TestInstantiationService } from 'vs/test/utils/instantiationTestUtils'; import URI from 'vs/base/common/uri'; -import {createMockModelService, TestEditorService, workbenchInstantiationService} from 'vs/test/utils/servicesTestUtils'; -import {IModelService} from 'vs/editor/common/services/modelService'; -import {IModeService} from 'vs/editor/common/services/modeService'; +import { createMockModelService, TestEditorService, workbenchInstantiationService } from 'vs/test/utils/servicesTestUtils'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { IModeService } from 'vs/editor/common/services/modeService'; import WorkbenchEditorService = require('vs/workbench/services/editor/common/editorService'); import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; -import {Model} from 'vs/editor/common/model/model'; -import {mockCodeEditor, MockCodeEditor} from 'vs/editor/test/common/mocks/mockCodeEditor'; +import { Model } from 'vs/editor/common/model/model'; +import { mockCodeEditor, MockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import {IEditorInput} from 'vs/platform/editor/common/editor'; -import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; -import {TextModel} from 'vs/editor/common/model/textModel'; -import {Range} from 'vs/editor/common/core/range'; -import {Position} from 'vs/editor/common/core/position'; -import {Cursor} from 'vs/editor/common/controller/cursor'; +import { IEditorInput } from 'vs/platform/editor/common/editor'; +import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import { TextModel } from 'vs/editor/common/model/textModel'; +import { Range } from 'vs/editor/common/core/range'; +import { Position } from 'vs/editor/common/core/position'; +import { Cursor } from 'vs/editor/common/controller/cursor'; suite('Editor - Range decorations', () => { @@ -36,8 +36,8 @@ suite('Editor - Range decorations', () => { setup(() => { instantiationService = workbenchInstantiationService(); - editorService= instantiationService.stub(WorkbenchEditorService.IWorkbenchEditorService, new TestEditorService(function () { })); - modeService= instantiationService.stub(IModeService); + editorService = instantiationService.stub(WorkbenchEditorService.IWorkbenchEditorService, new TestEditorService(function () { })); + modeService = instantiationService.stub(IModeService); modelService = instantiationService.stub(IModelService, createMockModelService(instantiationService)); text = 'LINE1' + '\n' + 'LINE2' + '\n' + 'LINE3' + '\n' + 'LINE4' + '\r\n' + 'LINE5'; model = aModel(URI.file('some_file')); @@ -65,7 +65,7 @@ suite('Editor - Range decorations', () => { }); test('remove highlight range', function () { - testObject.highlightRange({ resource: model.uri, range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }}); + testObject.highlightRange({ resource: model.uri, range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 } }); testObject.removeHighlightRange(); let actuals = rangeHighlightDecorations(model); @@ -74,7 +74,7 @@ suite('Editor - Range decorations', () => { }); test('highlight range for the resource removes previous highlight', function () { - testObject.highlightRange({ resource: model.uri, range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }}); + testObject.highlightRange({ resource: model.uri, range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 } }); let range: editorCommon.IRange = { startLineNumber: 2, startColumn: 2, endLineNumber: 4, endColumn: 3 }; testObject.highlightRange({ resource: model.uri, range }); @@ -124,7 +124,7 @@ suite('Editor - Range decorations', () => { test('previous highlight is not removed if not active editor', function () { let range: editorCommon.IRange = { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }; - testObject.highlightRange({ resource: model.uri, range}); + testObject.highlightRange({ resource: model.uri, range }); let model1 = aModel(URI.file('some model')); testObject.highlightRange({ resource: model1.uri, range: { startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 } }); @@ -150,7 +150,7 @@ suite('Editor - Range decorations', () => { function mockEditorService(resource: URI) function mockEditorService(arg: any) { let editorInput: IEditorInput = arg instanceof URI ? instantiationService.createInstance(FileEditorInput, arg, void 0) : arg; - instantiationService.stub(WorkbenchEditorService.IWorkbenchEditorService, 'getActiveEditorInput', editorInput); + instantiationService.stub(WorkbenchEditorService.IWorkbenchEditorService, 'getActiveEditorInput', editorInput); } function rangeHighlightDecorations(m: Model): editorCommon.IRange[] { From 95fec447ef5534e2531a5c0c4f95d4653cbc699c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 5 Oct 2016 12:13:18 +0200 Subject: [PATCH 417/433] :lipstick: --- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 588f7aaf3a8..236885ea69e 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -292,7 +292,8 @@ export class SuggestWidget implements IContentWidget, IDelegate static LOADING_MESSAGE: string = nls.localize('suggestWidget.loading', "Loading..."); static NO_SUGGESTIONS_MESSAGE: string = nls.localize('suggestWidget.noSuggestions', "No suggestions."); - allowEditorOverflow: boolean = true; // Editor.IContentWidget.allowEditorOverflow + // Editor.IContentWidget.allowEditorOverflow + allowEditorOverflow = true; private state: State; private isAuto: boolean; From 6b515aea3244d547c15f5b2e2ea3fe31d3897a4e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 5 Oct 2016 12:34:36 +0200 Subject: [PATCH 418/433] stable tabstop at snippet line start, fixes #11890 --- .../editor/contrib/snippet/common/snippet.ts | 52 ++++++++++------- .../snippet/test/common/snippet.test.ts | 58 +++++++++++++++++++ .../test/common/snippetController.test.ts | 24 ++++++++ 3 files changed, 113 insertions(+), 21 deletions(-) diff --git a/src/vs/editor/contrib/snippet/common/snippet.ts b/src/vs/editor/contrib/snippet/common/snippet.ts index 6bfbd8ba6e7..4245228ea5d 100644 --- a/src/vs/editor/contrib/snippet/common/snippet.ts +++ b/src/vs/editor/contrib/snippet/common/snippet.ts @@ -60,43 +60,53 @@ export class CodeSnippet implements ICodeSnippet { } public bind(referenceLine: string, deltaLine: number, firstLineDeltaColumn: number, config: IIndentationNormalizer): ICodeSnippet { - var resultLines: string[] = []; - var resultPlaceHolders: IPlaceHolder[] = []; + const resultLines: string[] = []; + const resultPlaceHolders: IPlaceHolder[] = []; - var referenceIndentation = this.extractLineIndentation(referenceLine, firstLineDeltaColumn + 1); - var originalLine: string, originalLineIndentation: string, remainingLine: string, indentation: string; - var i: number, len: number, j: number, lenJ: number; + const referenceIndentation = this.extractLineIndentation(referenceLine, firstLineDeltaColumn + 1); // Compute resultLines & keep deltaColumns as a reference for adjusting placeholders - var deltaColumns: number[] = []; - for (i = 0, len = this.lines.length; i < len; i++) { - originalLine = this.lines[i]; + const deltaColumns: number[] = []; + + for (let i = 0, len = this.lines.length; i < len; i++) { + let originalLine = this.lines[i]; if (i === 0) { deltaColumns[i + 1] = firstLineDeltaColumn; resultLines[i] = originalLine; } else { - originalLineIndentation = this.extractLineIndentation(originalLine); - remainingLine = originalLine.substr(originalLineIndentation.length); - indentation = config.normalizeIndentation(referenceIndentation + originalLineIndentation); + let originalLineIndentation = this.extractLineIndentation(originalLine); + let remainingLine = originalLine.substr(originalLineIndentation.length); + let indentation = config.normalizeIndentation(referenceIndentation + originalLineIndentation); deltaColumns[i + 1] = indentation.length - originalLineIndentation.length; resultLines[i] = indentation + remainingLine; } } // Compute resultPlaceHolders - var originalPlaceHolder: IPlaceHolder, originalOccurence: editorCommon.IRange, resultOccurences: editorCommon.IRange[]; - for (i = 0, len = this.placeHolders.length; i < len; i++) { - originalPlaceHolder = this.placeHolders[i]; + for (const originalPlaceHolder of this.placeHolders) { + let resultOccurences = []; - resultOccurences = []; - for (j = 0, lenJ = originalPlaceHolder.occurences.length; j < lenJ; j++) { - originalOccurence = originalPlaceHolder.occurences[j]; + for (let {startLineNumber, startColumn, endLineNumber, endColumn} of originalPlaceHolder.occurences) { + + if (startColumn > 1) { + // placeholders that aren't at the beginning of the snippet line + // will be moved by how many characters the indentation has been + // adjusted + startColumn = startColumn + deltaColumns[startLineNumber]; + endColumn = endColumn + deltaColumns[endLineNumber]; + + } else { + // placeholders at the beginning of the snippet line + // will be indented by the reference indentation + startColumn += referenceIndentation.length; + endColumn += referenceIndentation.length; + } resultOccurences.push({ - startLineNumber: originalOccurence.startLineNumber + deltaLine, - startColumn: originalOccurence.startColumn + deltaColumns[originalOccurence.startLineNumber], - endLineNumber: originalOccurence.endLineNumber + deltaLine, - endColumn: originalOccurence.endColumn + deltaColumns[originalOccurence.endLineNumber] + startLineNumber: startLineNumber + deltaLine, + startColumn, + endLineNumber: endLineNumber + deltaLine, + endColumn }); } diff --git a/src/vs/editor/contrib/snippet/test/common/snippet.test.ts b/src/vs/editor/contrib/snippet/test/common/snippet.test.ts index b18834b9b0b..cdb521c40e6 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippet.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippet.test.ts @@ -179,5 +179,63 @@ suite('Editor Contrib - Snippets', () => { assert.equal(snippet.placeHolders.length, 0); assert.deepEqual(snippet.lines, ['', '$scope.$broadcast(\'scroll.infiniteScrollComplete\');', '']); }); + + test('bind, adjust indentation', () => { + + // don't move placeholder at the beginning of the line + let snippet = CodeSnippet.fromTextmate([ + 'afterEach((done) => {', + '\t${1}test${2}', + '})' + ].join('\n')); + + // replace tab-stop with two spaces + let boundSnippet = snippet.bind('', 0, 0, { + normalizeIndentation(str: string): string { + return str.replace(/\t/g, ' '); + } + }); + let [first, second] = boundSnippet.placeHolders; + assert.equal(first.occurences.length, 1); + assert.equal(first.occurences[0].startColumn, 3); + assert.equal(second.occurences.length, 1); + assert.equal(second.occurences[0].startColumn, 7); + + // keep tab-stop, identity + boundSnippet = snippet.bind('', 0, 0, { + normalizeIndentation(str: string): string { + return str; + } + }); + [first, second] = boundSnippet.placeHolders; + assert.equal(first.occurences.length, 1); + assert.equal(first.occurences[0].startColumn, 2); + assert.equal(second.occurences.length, 1); + assert.equal(second.occurences[0].startColumn, 6); + }); + + + test('issue #11890: Bad cursor position', () => { + + let snippet = CodeSnippet.fromTextmate([ + 'afterEach((done) => {', + '${1}\ttest${2}', + '})' + ].join('\n')); + + let boundSnippet = snippet.bind('', 0, 0, { + normalizeIndentation(str: string): string { + return str.replace(/\t/g, ' '); + } + }); + + assert.equal(boundSnippet.lines[1], ' test'); + assert.equal(boundSnippet.placeHolders.length, 2); + let [first, second] = boundSnippet.placeHolders; + assert.equal(first.occurences.length, 1); + assert.equal(first.occurences[0].startColumn, 1); + assert.equal(second.occurences.length, 1); + assert.equal(second.occurences[0].startColumn, 7); + }); }); diff --git a/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts index 5f9eb9a3647..e405b6ae79f 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts @@ -408,6 +408,30 @@ suite('SnippetController', () => { }, ['af', '\taf']); }); + test('Final tabstop, #11890 stay at the beginning', () => { + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 5, 1, 5) + ]); + + codeSnippet = CodeSnippet.fromTextmate([ + 'afterEach((done) => {', + '${1}\ttest', + '});' + ].join('\n')); + + controller.run(codeSnippet, 2, 0, true); + + assert.equal(editor.getSelections().length, 1); + const [first] = editor.getSelections(); + + assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 3, endLineNumber: 2, endColumn: 3 }), first.toString()); + + }, [' af']); + }); + test('Final tabstop, no tabstop', () => { snippetTest((editor, cursor, codeSnippet, controller) => { From cd6fb060c187c0a199954d1fe19704a164827761 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 12:35:11 +0200 Subject: [PATCH 419/433] hunt down flaky tests --- src/vs/editor/common/model/model.ts | 2 +- .../workbench/parts/files/test/browser/fileEditorInput.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/model/model.ts b/src/vs/editor/common/model/model.ts index 7f8d2e82993..a38b3886b82 100644 --- a/src/vs/editor/common/model/model.ts +++ b/src/vs/editor/common/model/model.ts @@ -89,7 +89,7 @@ export class Model extends EditableTextModel implements IModel { if (aliveModels[String(this._associatedResource)]) { - throw new Error('Cannot instantiate a second Model with the same URI!'); + throw new Error('Cannot instantiate a second Model with the same URI: ' + String(this._associatedResource)); } this._attachedEditorCount = 0; diff --git a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts b/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts index 386678a4e7b..778c9702b2c 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts @@ -69,7 +69,7 @@ suite('Files - FileEditorInput', () => { assert.strictEqual(toResource('/foo/bar/file.js').fsPath, input.getResource().fsPath); assert(input.getResource() instanceof URI); - input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar.html'), 'text/html', void 0); + input = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar.html'), void 0); const inputToResolve: any = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/file.js'), void 0); const sameOtherInput = instantiationService.createInstance(FileEditorInput, toResource('/foo/bar/file.js'), void 0); From 39a3862d6577585cb7d469352148512bb2ab8174 Mon Sep 17 00:00:00 2001 From: Krzysztof Cieslak Date: Wed, 5 Oct 2016 14:12:47 +0200 Subject: [PATCH 420/433] Escape command title for CodeLens --- src/vs/editor/contrib/codelens/browser/codelens.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index c43f561d31d..6b3cc7f0bb0 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -10,7 +10,7 @@ import {RunOnceScheduler, asWinJsPromise} from 'vs/base/common/async'; import {onUnexpectedError} from 'vs/base/common/errors'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import Severity from 'vs/base/common/severity'; -import {format} from 'vs/base/common/strings'; +import {format, escape} from 'vs/base/common/strings'; import {TPromise} from 'vs/base/common/winjs.base'; import * as dom from 'vs/base/browser/dom'; import {ICommandService} from 'vs/platform/commands/common/commands'; @@ -114,12 +114,13 @@ class CodeLensContentWidget implements editorBrowser.IContentWidget { let html: string[] = []; for (let i = 0; i < symbols.length; i++) { let command = symbols[i].command; + let title = escape(command.title); let part: string; if (command.id) { - part = format('{1}', i, command.title); + part = format('{1}', i, title); this._commands[i] = command; } else { - part = format('{0}', command.title); + part = format('{0}', title); } html.push(part); } From 2507cc202e9d0f6147f27d0e20259effbf37b654 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 14:36:11 +0200 Subject: [PATCH 421/433] =?UTF-8?q?=F0=9F=92=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vs/base/parts/ipc/test/node/ipc.perf.ts | 8 -------- src/vs/platform/opener/browser/openerService.ts | 2 +- src/vs/workbench/browser/parts/editor/editorActions.ts | 2 +- src/vs/workbench/browser/parts/editor/editorCommands.ts | 1 - src/vs/workbench/electron-browser/actions.ts | 2 +- .../test/browser/parts/quickOpen/quickopen.perf.test.ts | 4 ++++ 6 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/vs/base/parts/ipc/test/node/ipc.perf.ts b/src/vs/base/parts/ipc/test/node/ipc.perf.ts index 2694f1ab0fa..24f88b2bd71 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.perf.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.perf.ts @@ -22,10 +22,6 @@ function createClient(): Client { suite('IPC performance', () => { test('increasing batch size', () => { - if (process.env['VSCODE_PID']) { - return; // TODO@Ben find out why test fails when run from within VS Code - } - const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); @@ -67,10 +63,6 @@ suite('IPC performance', () => { }); test('increasing raw data size', () => { - if (process.env['VSCODE_PID']) { - return; // TODO@Ben find out why test fails when run from within VS Code - } - const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); diff --git a/src/vs/platform/opener/browser/openerService.ts b/src/vs/platform/opener/browser/openerService.ts index 6d5dc1011fe..7c33ad82d9a 100644 --- a/src/vs/platform/opener/browser/openerService.ts +++ b/src/vs/platform/opener/browser/openerService.ts @@ -61,7 +61,7 @@ export class OpenerService implements IOpenerService { // remove fragment resource = resource.with({ fragment: '' }); } else if (resource.scheme === Schemas.file) { - resource = URI.file(normalize(resource.fsPath)); // TODO@Ben workaround for non-normalized paths (https://github.com/Microsoft/vscode/issues/12954) + resource = URI.file(normalize(resource.fsPath)); // workaround for non-normalized paths (https://github.com/Microsoft/vscode/issues/12954) } promise = this._editorService.openEditor({ resource, options: { selection, } }, options && options.openToSide); } diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 5c769f4fc51..3f7fe6457ed 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -401,7 +401,7 @@ export class OpenToSideAction extends Action { public static OPEN_TO_SIDE_ID = 'workbench.action.openToSide'; public static OPEN_TO_SIDE_LABEL = nls.localize('openToSide', "Open to the Side"); - constructor( @IWorkbenchEditorService private editorService: IWorkbenchEditorService) { + constructor(@IWorkbenchEditorService private editorService: IWorkbenchEditorService) { super(OpenToSideAction.OPEN_TO_SIDE_ID, OpenToSideAction.OPEN_TO_SIDE_LABEL); this.class = 'quick-open-sidebyside'; diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index c542173207f..8f4c719e873 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -191,7 +191,6 @@ function registerDiffEditorCommands(): void { }); } -// TODO@Ben remove eventually function handleCommandDeprecations(): void { const mapDeprecatedCommands = { 'workbench.action.focusFirstEditor': 'workbench.action.focusFirstEditorGroup', diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 76e25d00308..8054efc6f45 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -569,7 +569,7 @@ CommandsRegistry.registerCommand('_workbench.diff', function (accessor: Services return TPromise.join([editorService.createInput({ resource: left }), editorService.createInput({ resource: right })]).then(inputs => { const [left, right] = inputs; - const diff = new DiffEditorInput(label, undefined, left, right); + const diff = new DiffEditorInput(label, void 0, left, right); return editorService.openEditor(diff); }).then(() => { return void 0; diff --git a/src/vs/workbench/test/browser/parts/quickOpen/quickopen.perf.test.ts b/src/vs/workbench/test/browser/parts/quickOpen/quickopen.perf.test.ts index ae8d044e5e3..680f09ad821 100644 --- a/src/vs/workbench/test/browser/parts/quickOpen/quickopen.perf.test.ts +++ b/src/vs/workbench/test/browser/parts/quickOpen/quickopen.perf.test.ts @@ -40,6 +40,10 @@ declare var __dirname: string; suite('QuickOpen performance', () => { test('Measure', () => { + if (process.env['VSCODE_PID']) { + return; // TODO@Christoph find out why test fails when run from within VS Code + } + const n = 3; const argv = minimist(process.argv); const testWorkspaceArg = argv['testWorkspace']; From 96f11177ebf7bb4a3ab4d93312f18d85a154ddd7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 15:19:18 +0200 Subject: [PATCH 422/433] push ITextFileService to be a workbench service (fixes #6429) --- src/vs/test/utils/servicesTestUtils.ts | 5 +- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- .../node/extHostDocumentSaveParticipant.ts | 2 +- .../api/node/extHostTypeConverters.ts | 2 +- .../workbench/api/node/mainThreadDocuments.ts | 2 +- .../api/node/mainThreadSaveParticipant.ts | 5 +- .../workbench/api/node/mainThreadWorkspace.ts | 2 +- .../browser/parts/editor/editorStatus.ts | 3 +- .../common/editor/untitledEditorInput.ts | 3 +- .../workbench/electron-browser/workbench.ts | 5 + .../debug/electron-browser/debugService.ts | 2 +- .../files/browser/editors/textFileEditor.ts | 3 +- .../parts/files/browser/fileActions.ts | 3 +- .../parts/files/browser/saveErrorHandler.ts | 4 +- .../parts/files/browser/views/explorerView.ts | 3 +- .../files/browser/views/explorerViewer.ts | 3 +- .../files/browser/views/openEditorsView.ts | 3 +- .../files/browser/views/openEditorsViewer.ts | 3 +- .../files/common/editors/fileEditorInput.ts | 3 +- .../files/common/editors/fileEditorTracker.ts | 3 +- src/vs/workbench/parts/files/common/files.ts | 325 +---------------- .../electron-browser/dirtyFilesTracker.ts | 3 +- .../files.electron.contribution.ts | 9 +- .../test/browser/explorerViewModel.test.ts | 2 +- .../test/browser/fileEditorInput.test.ts | 3 +- .../files/test/browser/fileEvents.test.ts | 2 +- .../parts/git/browser/gitServices.ts | 2 +- .../electron-browser/electronGitService.ts | 2 +- .../electron-browser/task.contribution.ts | 2 +- .../textfile/browser}/textFileService.ts | 4 +- .../textfile/common}/textFileEditorModel.ts | 2 +- .../textFileEditorModelManager.test.ts | 6 +- .../common}/textFileEditorModelManager.ts | 4 +- .../services/textfile/common/textfiles.ts | 330 ++++++++++++++++++ .../electron-browser/textFileService.ts | 4 +- .../test/textFileEditorModel.test.ts} | 6 +- .../textfile/test}/textFileService.test.ts | 6 +- .../workbench/test/browser/services.test.ts | 2 +- .../extHostDocumentSaveParticipant.test.ts | 2 +- 39 files changed, 396 insertions(+), 381 deletions(-) rename src/vs/workbench/{parts/files/common => services/textfile/browser}/textFileService.ts (99%) rename src/vs/workbench/{parts/files/common/editors => services/textfile/common}/textFileEditorModel.ts (99%) rename src/vs/workbench/{parts/files/test/browser => services/textfile/common}/textFileEditorModelManager.test.ts (97%) rename src/vs/workbench/{parts/files/common/editors => services/textfile/common}/textFileEditorModelManager.ts (98%) create mode 100644 src/vs/workbench/services/textfile/common/textfiles.ts rename src/vs/workbench/{parts/files => services/textfile}/electron-browser/textFileService.ts (98%) rename src/vs/workbench/{parts/files/test/browser/fileEditorModel.test.ts => services/textfile/test/textFileEditorModel.test.ts} (97%) rename src/vs/workbench/{parts/files/test/browser => services/textfile/test}/textFileService.test.ts (95%) diff --git a/src/vs/test/utils/servicesTestUtils.ts b/src/vs/test/utils/servicesTestUtils.ts index 6af456e2756..60173af928e 100644 --- a/src/vs/test/utils/servicesTestUtils.ts +++ b/src/vs/test/utils/servicesTestUtils.ts @@ -30,17 +30,16 @@ import {EditorStacksModel} from 'vs/workbench/common/editor/editorStacksModel'; import {ServiceCollection} from 'vs/platform/instantiation/common/serviceCollection'; import {InstantiationService} from 'vs/platform/instantiation/common/instantiationService'; import {IEditorGroupService, GroupArrangement} from 'vs/workbench/services/group/common/groupService'; -import {TextFileService} from 'vs/workbench/parts/files/common/textFileService'; +import {TextFileService} from 'vs/workbench/services/textfile/browser/textFileService'; import {IFileService, IResolveContentOptions, IFileOperationResult} from 'vs/platform/files/common/files'; import {IModelService} from 'vs/editor/common/services/modelService'; import {ModelServiceImpl} from 'vs/editor/common/services/modelServiceImpl'; -import {IRawTextContent} from 'vs/workbench/parts/files/common/files'; +import {IRawTextContent, ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {RawText} from 'vs/editor/common/model/textModel'; import {parseArgs} from 'vs/platform/environment/node/argv'; import {EnvironmentService} from 'vs/platform/environment/node/environmentService'; import {IModeService} from 'vs/editor/common/services/modeService'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; -import {ITextFileService} from 'vs/workbench/parts/files/common/files'; import {IHistoryService} from 'vs/workbench/services/history/common/history'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index e9dca2ef83d..45547c8fba1 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -30,7 +30,7 @@ import { IResourceEdit } from 'vs/editor/common/services/bulkEdit'; import { ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IPickOpenEntry, IPickOptions } from 'vs/workbench/services/quickopen/common/quickOpenService'; -import { SaveReason } from 'vs/workbench/parts/files/common/files'; +import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkspaceSymbol } from 'vs/workbench/parts/search/common/search'; import { IApplyEditsOptions, TextEditorRevealType, ITextEditorConfigurationUpdate, IResolvedTextEditorConfiguration, ISelectionChangeEvent } from './mainThreadEditorsTracker'; diff --git a/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts b/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts index 879ff76d236..7a11ebe66df 100644 --- a/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts +++ b/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts @@ -15,7 +15,7 @@ import { TextEdit } from 'vs/workbench/api/node/extHostTypes'; import { fromRange, TextDocumentSaveReason } from 'vs/workbench/api/node/extHostTypeConverters'; import { IResourceEdit } from 'vs/editor/common/services/bulkEdit'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; -import { SaveReason } from 'vs/workbench/parts/files/common/files'; +import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; declare class WeakMap { // delete(key: K): boolean; diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 62006ea9bbd..1dd52ddbb79 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -16,7 +16,7 @@ import { IPosition, ISelection, IRange, IDecorationOptions, ISingleEditOperation import { IWorkspaceSymbol } from 'vs/workbench/parts/search/common/search'; import * as vscode from 'vscode'; import URI from 'vs/base/common/uri'; -import { SaveReason } from 'vs/workbench/parts/files/common/files'; +import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; export interface PositionLike { line: number; diff --git a/src/vs/workbench/api/node/mainThreadDocuments.ts b/src/vs/workbench/api/node/mainThreadDocuments.ts index 517cb71db93..c106c5e4073 100644 --- a/src/vs/workbench/api/node/mainThreadDocuments.ts +++ b/src/vs/workbench/api/node/mainThreadDocuments.ts @@ -14,7 +14,7 @@ import URI from 'vs/base/common/uri'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import {IEventService} from 'vs/platform/event/common/event'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; -import {TextFileModelChangeEvent, ITextFileService} from 'vs/workbench/parts/files/common/files'; +import {TextFileModelChangeEvent, ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {TPromise} from 'vs/base/common/winjs.base'; import {IFileService} from 'vs/platform/files/common/files'; import {IModeService} from 'vs/editor/common/services/modeService'; diff --git a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts b/src/vs/workbench/api/node/mainThreadSaveParticipant.ts index ca01d746290..f9d0766641b 100644 --- a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/node/mainThreadSaveParticipant.ts @@ -9,7 +9,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { sequence } from 'vs/base/common/async'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { ISaveParticipant, ITextFileEditorModel } from 'vs/workbench/parts/files/common/files'; +import { ISaveParticipant, ITextFileEditorModel, SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IPosition, IModel, ICommonCodeEditor, ISingleEditOperation, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; @@ -18,9 +18,8 @@ import { trimTrailingWhitespace } from 'vs/editor/common/commands/trimTrailingWh import { getDocumentRangeFormattingEdits } from 'vs/editor/contrib/format/common/format'; import { EditOperationsCommand } from 'vs/editor/contrib/format/common/formatCommand'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TextFileEditorModel } from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; +import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { ExtHostContext, ExtHostDocumentSaveParticipantShape } from './extHost.protocol'; -import { SaveReason } from 'vs/workbench/parts/files/common/files'; class TrimWhitespaceParticipant implements ISaveParticipant { diff --git a/src/vs/workbench/api/node/mainThreadWorkspace.ts b/src/vs/workbench/api/node/mainThreadWorkspace.ts index e5f7a1b6234..ab1ee8a7ec2 100644 --- a/src/vs/workbench/api/node/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/node/mainThreadWorkspace.ts @@ -9,7 +9,7 @@ import {ISearchService, QueryType} from 'vs/platform/search/common/search'; import {IWorkspaceContextService, IWorkspace} from 'vs/platform/workspace/common/workspace'; import {IEventService} from 'vs/platform/event/common/event'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; -import {ITextFileService} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {ICommonCodeEditor} from 'vs/editor/common/editorCommon'; import {bulkEdit, IResourceEdit} from 'vs/editor/common/services/bulkEdit'; import {TPromise} from 'vs/base/common/winjs.base'; diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 381aa926f23..0e780cff534 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -44,8 +44,7 @@ import {StyleMutator} from 'vs/base/browser/styleMutator'; import {Selection} from 'vs/editor/common/core/selection'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; import {TabFocus} from 'vs/editor/common/config/commonEditorConfig'; - -import {ITextFileService} from 'vs/workbench/parts/files/common/files'; // TODO@Ben layer breaker +import {ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; function getCodeEditor(editorWidget: IEditor): ICommonCodeEditor { if (editorWidget) { diff --git a/src/vs/workbench/common/editor/untitledEditorInput.ts b/src/vs/workbench/common/editor/untitledEditorInput.ts index 0159864a62c..e4c7a6cf5b1 100644 --- a/src/vs/workbench/common/editor/untitledEditorInput.ts +++ b/src/vs/workbench/common/editor/untitledEditorInput.ts @@ -17,8 +17,7 @@ import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IModeService} from 'vs/editor/common/services/modeService'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import Event, {Emitter} from 'vs/base/common/event'; - -import {ITextFileService} from 'vs/workbench/parts/files/common/files'; // TODO@Ben layer breaker +import {ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; /** * An editor input to be used for untitled text buffers. diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 0f40393c703..10b851046f0 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -63,6 +63,8 @@ import {IEditorGroupService} from 'vs/workbench/services/group/common/groupServi import {IHistoryService} from 'vs/workbench/services/history/common/history'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {SyncDescriptor} from 'vs/platform/instantiation/common/descriptors'; +import {TextFileService} from 'vs/workbench/services/textfile/electron-browser/textFileService'; +import {ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {ServiceCollection} from 'vs/platform/instantiation/common/serviceCollection'; import {ILifecycleService} from 'vs/platform/lifecycle/common/lifecycle'; import {IMessageService} from 'vs/platform/message/common/message'; @@ -401,6 +403,9 @@ export class Workbench implements IPartService { this.toShutdown.push(this.quickOpen); serviceCollection.set(IQuickOpenService, this.quickOpen); + // Text File Service + serviceCollection.set(ITextFileService, this.instantiationService.createInstance(TextFileService)); + // Contributed services const contributedServices = getServices(); for (let contributedService of contributedServices) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index ae9288f4147..3a1d38fa8a5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -46,7 +46,7 @@ import {TaskError, TaskErrors} from 'vs/workbench/parts/tasks/common/taskSystem' import {IViewletService} from 'vs/workbench/services/viewlet/common/viewletService'; import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; import {IPartService} from 'vs/workbench/services/part/common/partService'; -import {ITextFileService} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index ffbef7832e4..d4faecd8ab5 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -14,7 +14,8 @@ import {IEditorViewState} from 'vs/editor/common/editorCommon'; import {Action} from 'vs/base/common/actions'; import {Scope} from 'vs/workbench/common/memento'; import {IEditorOptions} from 'vs/editor/common/editorCommon'; -import {VIEWLET_ID, TEXT_FILE_EDITOR_ID, ITextFileEditorModel} from 'vs/workbench/parts/files/common/files'; +import {VIEWLET_ID, TEXT_FILE_EDITOR_ID} from 'vs/workbench/parts/files/common/files'; +import {ITextFileEditorModel} from 'vs/workbench/services/textfile/common/textfiles'; import {BaseTextEditor} from 'vs/workbench/browser/parts/editor/textEditor'; import {EditorOptions, TextEditorOptions} from 'vs/workbench/common/editor'; import {BinaryEditorModel} from 'vs/workbench/common/editor/binaryEditorModel'; diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index 1c6ec6683dc..2a652404c1d 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -23,7 +23,8 @@ import {Action, IAction} from 'vs/base/common/actions'; import {MessageType, IInputValidator} from 'vs/base/browser/ui/inputbox/inputBox'; import {ITree, IHighlightEvent} from 'vs/base/parts/tree/browser/tree'; import {dispose, IDisposable} from 'vs/base/common/lifecycle'; -import {LocalFileChangeEvent, VIEWLET_ID, ITextFileService} from 'vs/workbench/parts/files/common/files'; +import {VIEWLET_ID} from 'vs/workbench/parts/files/common/files'; +import {LocalFileChangeEvent, ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {IFileService, IFileStat, IImportResult} from 'vs/platform/files/common/files'; import {DiffEditorInput, toDiffLabel} from 'vs/workbench/common/editor/diffEditorInput'; import {asFileEditorInput, getUntitledOrFileResource, IEditorIdentifier} from 'vs/workbench/common/editor'; diff --git a/src/vs/workbench/parts/files/browser/saveErrorHandler.ts b/src/vs/workbench/parts/files/browser/saveErrorHandler.ts index e4ebe91c532..ac7e2366aae 100644 --- a/src/vs/workbench/parts/files/browser/saveErrorHandler.ts +++ b/src/vs/workbench/parts/files/browser/saveErrorHandler.ts @@ -21,14 +21,14 @@ import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEdito import {SaveFileAsAction, RevertFileAction, SaveFileAction} from 'vs/workbench/parts/files/browser/fileActions'; import {IFileOperationResult, FileOperationResult} from 'vs/platform/files/common/files'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; -import {ITextFileService, ISaveErrorHandler, ITextFileEditorModel} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService, ISaveErrorHandler, ITextFileEditorModel} from 'vs/workbench/services/textfile/common/textfiles'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IMessageService, IMessageWithAction, Severity, CancelAction} from 'vs/platform/message/common/message'; import {IModeService} from 'vs/editor/common/services/modeService'; import {IModelService} from 'vs/editor/common/services/modelService'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import {IWorkbenchContribution} from 'vs/workbench/common/contributions'; -import {TextFileEditorModel} from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; +import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFileEditorModel'; // A handler for save error happening with conflict resolution actions export class SaveErrorHandler implements ISaveErrorHandler, IWorkbenchContribution { diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index 9e101f8d307..29c2f1e2d64 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -16,7 +16,8 @@ import {Action, IActionRunner, IAction} from 'vs/base/common/actions'; import {prepareActions} from 'vs/workbench/browser/actionBarRegistry'; import {ITree} from 'vs/base/parts/tree/browser/tree'; import {Tree} from 'vs/base/parts/tree/browser/treeImpl'; -import {LocalFileChangeEvent, IFilesConfiguration} from 'vs/workbench/parts/files/common/files'; +import {IFilesConfiguration} from 'vs/workbench/parts/files/common/files'; +import {LocalFileChangeEvent} from 'vs/workbench/services/textfile/common/textfiles'; import {IFileStat, IResolveFileOptions, FileChangeType, FileChangesEvent, IFileChange, EventType as FileEventType, IFileService} from 'vs/platform/files/common/files'; import {FileImportedEvent, RefreshViewExplorerAction, NewFolderAction, NewFileAction} from 'vs/workbench/parts/files/browser/fileActions'; import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index a36e842e6e4..87104902766 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -24,7 +24,8 @@ import glob = require('vs/base/common/glob'); import {FileLabel, IFileLabelOptions} from 'vs/workbench/browser/labels'; import {IDisposable} from 'vs/base/common/lifecycle'; import {ContributableActionProvider} from 'vs/workbench/browser/actionBarRegistry'; -import {LocalFileChangeEvent, IFilesConfiguration, ITextFileService} from 'vs/workbench/parts/files/common/files'; +import {IFilesConfiguration} from 'vs/workbench/parts/files/common/files'; +import {LocalFileChangeEvent, ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {IFileOperationResult, FileOperationResult, IFileStat, IFileService} from 'vs/platform/files/common/files'; import {DuplicateFileAction, ImportFileAction, PasteFileAction, keybindingForAction, IEditableData, IFileViewletState} from 'vs/workbench/parts/files/browser/fileActions'; import {IDataSource, ITree, IElementCallback, IAccessibilityProvider, IRenderer, ContextMenuEvent, ISorter, IFilter, IDragAndDrop, IDragAndDropData, IDragOverReaction, DRAG_OVER_ACCEPT_BUBBLE_DOWN, DRAG_OVER_ACCEPT_BUBBLE_DOWN_COPY, DRAG_OVER_ACCEPT_BUBBLE_UP, DRAG_OVER_ACCEPT_BUBBLE_UP_COPY, DRAG_OVER_REJECT} from 'vs/base/parts/tree/browser/tree'; diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts index d02ad349e93..5c581bc83d5 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts @@ -19,7 +19,8 @@ import {IKeybindingService} from 'vs/platform/keybinding/common/keybinding'; import {IEditorStacksModel, IStacksModelChangeEvent, IEditorGroup} from 'vs/workbench/common/editor'; import {SaveAllAction} from 'vs/workbench/parts/files/browser/fileActions'; import {AdaptiveCollapsibleViewletView} from 'vs/workbench/browser/viewlet'; -import {ITextFileService, IFilesConfiguration, VIEWLET_ID, AutoSaveMode} from 'vs/workbench/parts/files/common/files'; +import {IFilesConfiguration, VIEWLET_ID} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService, AutoSaveMode} from 'vs/workbench/services/textfile/common/textfiles'; import {IViewletService} from 'vs/workbench/services/viewlet/common/viewletService'; import {Renderer, DataSource, Controller, AccessibilityProvider, ActionProvider, OpenEditor, DragAndDrop} from 'vs/workbench/parts/files/browser/views/openEditorsViewer'; import {IUntitledEditorService} from 'vs/workbench/services/untitled/common/untitledEditorService'; diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts index a0b52ef52e3..6bdcc3e553e 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts @@ -24,7 +24,8 @@ import {IContextMenuService} from 'vs/platform/contextview/browser/contextView'; import {IKeybindingService} from 'vs/platform/keybinding/common/keybinding'; import {UntitledEditorInput, IEditorGroup, IEditorStacksModel, getUntitledOrFileResource} from 'vs/workbench/common/editor'; import {ContributableActionProvider} from 'vs/workbench/browser/actionBarRegistry'; -import {ITextFileService, AutoSaveMode, asFileResource} from 'vs/workbench/parts/files/common/files'; +import {asFileResource} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService, AutoSaveMode} from 'vs/workbench/services/textfile/common/textfiles'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {EditorStacksModel, EditorGroup} from 'vs/workbench/common/editor/editorStacksModel'; import {keybindingForAction, SaveFileAction, RevertFileAction, SaveFileAsAction, OpenToSideAction, SelectResourceForCompareAction, CompareResourcesAction, SaveAllInGroupAction} from 'vs/workbench/parts/files/browser/fileActions'; diff --git a/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts b/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts index fd348e70f79..15a70a23091 100644 --- a/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts +++ b/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts @@ -11,7 +11,8 @@ import URI from 'vs/base/common/uri'; import {EditorModel, EncodingMode, ConfirmResult} from 'vs/workbench/common/editor'; import {BinaryEditorModel} from 'vs/workbench/common/editor/binaryEditorModel'; import {IFileOperationResult, FileOperationResult, FileChangesEvent, EventType} from 'vs/platform/files/common/files'; -import {ITextFileService, BINARY_FILE_EDITOR_ID, TEXT_FILE_EDITOR_ID, FILE_EDITOR_INPUT_ID, FileEditorInput as CommonFileEditorInput, AutoSaveMode, ModelState, TextFileModelChangeEvent, LocalFileChangeEvent} from 'vs/workbench/parts/files/common/files'; +import {BINARY_FILE_EDITOR_ID, TEXT_FILE_EDITOR_ID, FILE_EDITOR_INPUT_ID, FileEditorInput as CommonFileEditorInput} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService, AutoSaveMode, ModelState, TextFileModelChangeEvent, LocalFileChangeEvent} from 'vs/workbench/services/textfile/common/textfiles'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IEventService} from 'vs/platform/event/common/event'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts b/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts index df9c192b1cb..824c30f44bf 100644 --- a/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts +++ b/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts @@ -12,7 +12,8 @@ import {DiffEditorInput} from 'vs/workbench/common/editor/diffEditorInput'; import {IEditor} from 'vs/editor/common/editorCommon'; import {IEditor as IBaseEditor} from 'vs/platform/editor/common/editor'; import {EditorInput, IEditorStacksModel} from 'vs/workbench/common/editor'; -import {LocalFileChangeEvent, BINARY_FILE_EDITOR_ID, ITextFileService, ModelState} from 'vs/workbench/parts/files/common/files'; +import {BINARY_FILE_EDITOR_ID} from 'vs/workbench/parts/files/common/files'; +import {LocalFileChangeEvent, ITextFileService, ModelState} from 'vs/workbench/services/textfile/common/textfiles'; import {FileChangeType, FileChangesEvent, EventType as CommonFileEventType} from 'vs/platform/files/common/files'; import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/parts/files/common/files.ts index 05934c194d3..9b03fadd5a0 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/parts/files/common/files.ts @@ -4,18 +4,12 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import {TPromise} from 'vs/base/common/winjs.base'; -import {Event as BaseEvent, PropertyChangeEvent} from 'vs/base/common/events'; import URI from 'vs/base/common/uri'; -import Event from 'vs/base/common/event'; -import {IEditorOptions, IRawText} from 'vs/editor/common/editorCommon'; -import {IDisposable} from 'vs/base/common/lifecycle'; -import {IEncodingSupport, EncodingMode, EditorInput, IFileEditorInput, ConfirmResult, IWorkbenchEditorConfiguration} from 'vs/workbench/common/editor'; -import {IFileStat, IFilesConfiguration, IBaseStat, IResolveContentOptions} from 'vs/platform/files/common/files'; -import {createDecorator} from 'vs/platform/instantiation/common/instantiation'; +import {IEditorOptions} from 'vs/editor/common/editorCommon'; +import {EncodingMode, EditorInput, IFileEditorInput, IWorkbenchEditorConfiguration} from 'vs/workbench/common/editor'; +import {IFilesConfiguration} from 'vs/platform/files/common/files'; import {FileStat} from 'vs/workbench/parts/files/common/explorerViewModel'; import {RawContextKey} from 'vs/platform/contextkey/common/contextkey'; -import {ITextEditorModel} from 'vs/platform/editor/common/editor'; /** * Explorer viewlet id. @@ -88,317 +82,4 @@ export function asFileResource(obj: any): IFileResource { } return null; -} - -/** - * The save error handler can be installed on the text text file editor model to install code that executes when save errors occur. - */ -export interface ISaveErrorHandler { - - /** - * Called whenever a save fails. - */ - onSaveError(error: any, model: ITextFileEditorModel): void; -} - -export interface ISaveParticipant { - - /** - * Participate in a save of a model. Allows to change the model before it is being saved to disk. - */ - participate(model: ITextFileEditorModel, env: { reason: SaveReason }): TPromise; -} - -/** - * States the text text file editor model can be in. - */ -export enum ModelState { - SAVED, - DIRTY, - PENDING_SAVE, - CONFLICT, - ERROR -} - -/** - * Local file change events are being emitted when a file is added, removed, moved or its contents got updated. These events - * are being emitted from within the workbench and are not reflecting the truth on the disk file system. For that, please - * use FileChangesEvent instead. - */ -export class LocalFileChangeEvent extends PropertyChangeEvent { - - constructor(before?: IFileStat, after?: IFileStat, originalEvent?: BaseEvent) { - super(null, before, after, originalEvent); - } - - /** - * Returns the meta information of the file before the event occurred or null if the file is new. - */ - public getBefore(): IFileStat { - return this.oldValue; - } - - /** - * Returns the meta information of the file after the event occurred or null if the file got deleted. - */ - public getAfter(): IFileStat { - return this.newValue; - } - - /** - * Indicates if the file was added as a new file. - */ - public gotAdded(): boolean { - return !this.oldValue && !!this.newValue; - } - - /** - * Indicates if the file was moved to a different path. - */ - public gotMoved(): boolean { - return !!this.oldValue && !!this.newValue && this.oldValue.resource.toString() !== this.newValue.resource.toString(); - } - - /** - * Indicates if the files metadata was updated. - */ - public gotUpdated(): boolean { - return !!this.oldValue && !!this.newValue && !this.gotMoved() && this.oldValue !== this.newValue; - } - - /** - * Indicates if the file was deleted. - */ - public gotDeleted(): boolean { - return !!this.oldValue && !this.newValue; - } -} - -export enum StateChange { - DIRTY, - SAVING, - SAVE_ERROR, - SAVED, - REVERTED, - ENCODING -} - -export class TextFileModelChangeEvent { - private _resource: URI; - private _kind: StateChange; - - constructor(model: ITextFileEditorModel, kind: StateChange) { - this._resource = model.getResource(); - this._kind = kind; - } - - public get resource(): URI { - return this._resource; - } - - public get kind(): StateChange { - return this._kind; - } -} - -export const TEXT_FILE_SERVICE_ID = 'textFileService'; - -export interface ITextFileOperationResult { - results: IResult[]; -} - -export interface IResult { - source: URI; - target?: URI; - success?: boolean; -} - -export interface IAutoSaveConfiguration { - autoSaveDelay: number; - autoSaveFocusChange: boolean; - autoSaveApplicationChange: boolean; -} - -export enum AutoSaveMode { - OFF, - AFTER_SHORT_DELAY, - AFTER_LONG_DELAY, - ON_FOCUS_CHANGE, - ON_WINDOW_CHANGE -} - -export enum SaveReason { - EXPLICIT = 1, - AUTO = 2, - FOCUS_CHANGE = 3, - WINDOW_CHANGE = 4 -} - -export const ITextFileService = createDecorator(TEXT_FILE_SERVICE_ID); - -export interface IRawTextContent extends IBaseStat { - - /** - * The line grouped content of a text file. - */ - value: IRawText; - - /** - * The line grouped logical hash of a text file. - */ - valueLogicalHash: string; - - /** - * The encoding of the content if known. - */ - encoding: string; -} - -export interface ITextFileEditorModelManager { - - onModelDirty: Event; - onModelSaveError: Event; - onModelSaved: Event; - onModelReverted: Event; - onModelEncodingChanged: Event; - - get(resource: URI): ITextFileEditorModel; - - getAll(resource?: URI): ITextFileEditorModel[]; - - loadOrCreate(resource: URI, preferredEncoding: string, refresh?: boolean): TPromise; -} - -export interface IModelSaveOptions { - reason?: SaveReason; - overwriteReadonly?: boolean; - overwriteEncoding?: boolean; -} - -export interface ITextFileEditorModel extends ITextEditorModel, IEncodingSupport { - - onDidStateChange: Event; - - getResource(): URI; - - getLastSaveAttemptTime(): number; - - getLastModifiedTime(): number; - - getState(): ModelState; - - updatePreferredEncoding(encoding: string): void; - - save(options?: IModelSaveOptions): TPromise; - - revert(): TPromise; - - setConflictResolutionMode(); - - getValue(): string; - - isDirty(): boolean; - - isResolved(): boolean; - - isDisposed(): boolean; -} - -export interface ISaveOptions { - - /** - * Save the file on disk even if not dirty. If the file is not dirty, it will be touched - * so that mtime and atime are updated. This helps to trigger external file watchers. - */ - force: boolean; -} - -export interface ITextFileService extends IDisposable { - _serviceBrand: any; - onAutoSaveConfigurationChange: Event; - onFilesAssociationChange: Event; - - /** - * Access to the manager of text file editor models providing further methods to work with them. - */ - models: ITextFileEditorModelManager; - - /** - * Resolve the contents of a file identified by the resource. - */ - resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise; - - /** - * A resource is dirty if it has unsaved changes or is an untitled file not yet saved. - * - * @param resource the resource to check for being dirty. If it is not specified, will check for - * all dirty resources. - */ - isDirty(resource?: URI): boolean; - - /** - * Returns all resources that are currently dirty matching the provided resources or all dirty resources. - * - * @param resources the resources to check for being dirty. If it is not specified, will check for - * all dirty resources. - */ - getDirty(resources?: URI[]): URI[]; - - /** - * Saves the resource. - * - * @param resource the resource to save - * @return true iff the resource was saved. - */ - save(resource: URI, options?: ISaveOptions): TPromise; - - /** - * Saves the provided resource asking the user for a file name. - * - * @param resource the resource to save as. - * @return true iff the file was saved. - */ - saveAs(resource: URI, targetResource?: URI): TPromise; - - /** - * Saves the set of resources and returns a promise with the operation result. - * - * @param resources can be null to save all. - * @param includeUntitled to save all resources and optionally exclude untitled ones. - */ - saveAll(includeUntitled?: boolean): TPromise; - saveAll(resources: URI[]): TPromise; - - /** - * Reverts the provided resource. - * - * @param resource the resource of the file to revert. - * @param force to force revert even when the file is not dirty - */ - revert(resource: URI, force?: boolean): TPromise; - - /** - * Reverts all the provided resources and returns a promise with the operation result. - * - * @param force to force revert even when the file is not dirty - */ - revertAll(resources?: URI[], force?: boolean): TPromise; - - /** - * Brings up the confirm dialog to either save, don't save or cancel. - * - * @param resources the resources of the files to ask for confirmation or null if - * confirming for all dirty resources. - */ - confirmSave(resources?: URI[]): ConfirmResult; - - /** - * Convinient fast access to the current auto save mode. - */ - getAutoSaveMode(): AutoSaveMode; - - /** - * Convinient fast access to the raw configured auto save settings. - */ - getAutoSaveConfiguration(): IAutoSaveConfiguration; } \ No newline at end of file diff --git a/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.ts b/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.ts index 91a532732cb..0abfd9912d2 100644 --- a/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.ts +++ b/src/vs/workbench/parts/files/electron-browser/dirtyFilesTracker.ts @@ -8,7 +8,8 @@ import nls = require('vs/nls'); import errors = require('vs/base/common/errors'); import {IWorkbenchContribution} from 'vs/workbench/common/contributions'; -import {VIEWLET_ID, TextFileModelChangeEvent, ITextFileService, AutoSaveMode} from 'vs/workbench/parts/files/common/files'; +import {VIEWLET_ID} from 'vs/workbench/parts/files/common/files'; +import {TextFileModelChangeEvent, ITextFileService, AutoSaveMode} from 'vs/workbench/services/textfile/common/textfiles'; import {platform, Platform} from 'vs/base/common/platform'; import {IWindowService} from 'vs/workbench/services/window/electron-browser/windowService'; import {Position} from 'vs/platform/editor/common/editor'; diff --git a/src/vs/workbench/parts/files/electron-browser/files.electron.contribution.ts b/src/vs/workbench/parts/files/electron-browser/files.electron.contribution.ts index d8453578d70..b36bb3dfba7 100644 --- a/src/vs/workbench/parts/files/electron-browser/files.electron.contribution.ts +++ b/src/vs/workbench/parts/files/electron-browser/files.electron.contribution.ts @@ -12,14 +12,12 @@ import {Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarC import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; import env = require('vs/base/common/platform'); -import {ITextFileService, asFileResource} from 'vs/workbench/parts/files/common/files'; +import {asFileResource} from 'vs/workbench/parts/files/common/files'; import {IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions} from 'vs/workbench/common/contributions'; import {GlobalNewUntitledFileAction, SaveFileAsAction} from 'vs/workbench/parts/files/browser/fileActions'; import {DirtyFilesTracker} from 'vs/workbench/parts/files/electron-browser/dirtyFilesTracker'; -import {TextFileService} from 'vs/workbench/parts/files/electron-browser/textFileService'; import {OpenFolderAction, OpenFileAction, OpenFileFolderAction, ShowOpenedFileInNewWindow, GlobalRevealInOSAction, GlobalCopyPathAction, CopyPathAction, RevealInOSAction} from 'vs/workbench/parts/files/electron-browser/electronFileActions'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; -import {registerSingleton} from 'vs/platform/instantiation/common/extensions'; import {KeyMod, KeyChord, KeyCode} from 'vs/base/common/keyCodes'; class FileViewerActionContributor extends ActionBarContributor { @@ -78,7 +76,4 @@ actionsRegistry.registerActionBarContributor(Scope.VIEWER, FileViewerActionContr // Register Dirty Files Tracker (Registry.as(WorkbenchExtensions.Workbench)).registerWorkbenchContribution( DirtyFilesTracker -); - -// Register Service -registerSingleton(ITextFileService, TextFileService); \ No newline at end of file +); \ No newline at end of file diff --git a/src/vs/workbench/parts/files/test/browser/explorerViewModel.test.ts b/src/vs/workbench/parts/files/test/browser/explorerViewModel.test.ts index 9bbf77918c7..c42b0951ca2 100644 --- a/src/vs/workbench/parts/files/test/browser/explorerViewModel.test.ts +++ b/src/vs/workbench/parts/files/test/browser/explorerViewModel.test.ts @@ -11,7 +11,7 @@ import {isLinux, isWindows} from 'vs/base/common/platform'; import URI from 'vs/base/common/uri'; import {join} from 'vs/base/common/paths'; import {validateFileName} from 'vs/workbench/parts/files/browser/fileActions'; -import {LocalFileChangeEvent} from 'vs/workbench/parts/files/common/files'; +import {LocalFileChangeEvent} from 'vs/workbench/services/textfile/common/textfiles'; import {FileStat} from 'vs/workbench/parts/files/common/explorerViewModel'; function createStat(path, name, isFolder, hasChildren, size, mtime) { diff --git a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts b/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts index 778c9702b2c..18d92905eee 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts @@ -13,8 +13,7 @@ import {workbenchInstantiationService, TestTextFileService} from 'vs/test/utils/ import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {EncodingMode} from 'vs/workbench/common/editor'; import {IEventService} from 'vs/platform/event/common/event'; -import {ITextFileEditorModel} from 'vs/workbench/parts/files/common/files'; -import {ITextFileService, LocalFileChangeEvent} from 'vs/workbench/parts/files/common/files'; +import {ITextFileEditorModel, ITextFileService, LocalFileChangeEvent} from 'vs/workbench/services/textfile/common/textfiles'; import {FileOperationResult, IFileOperationResult, FileChangesEvent, FileChangeType, EventType} from 'vs/platform/files/common/files'; function toResource(path) { diff --git a/src/vs/workbench/parts/files/test/browser/fileEvents.test.ts b/src/vs/workbench/parts/files/test/browser/fileEvents.test.ts index c645c0eb359..bd17803b93e 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEvents.test.ts +++ b/src/vs/workbench/parts/files/test/browser/fileEvents.test.ts @@ -6,7 +6,7 @@ 'use strict'; import * as assert from 'assert'; -import {LocalFileChangeEvent} from 'vs/workbench/parts/files/common/files'; +import {LocalFileChangeEvent} from 'vs/workbench/services/textfile/common/textfiles'; import {FileImportedEvent} from 'vs/workbench/parts/files/browser/fileActions'; suite('Files - Events', () => { diff --git a/src/vs/workbench/parts/git/browser/gitServices.ts b/src/vs/workbench/parts/git/browser/gitServices.ts index 0de067a7db3..5b9ac5a66a0 100644 --- a/src/vs/workbench/parts/git/browser/gitServices.ts +++ b/src/vs/workbench/parts/git/browser/gitServices.ts @@ -20,7 +20,7 @@ import { IFileStatus, IGitServiceError, GitErrorCodes, Status, StatusType, AutoF import { Model } from 'vs/workbench/parts/git/common/gitModel'; import { NativeGitIndexStringEditorInput, GitIndexDiffEditorInput, GitWorkingTreeDiffEditorInput, GitDiffEditorInput } from 'vs/workbench/parts/git/browser/gitEditorInputs'; import { GitOperation } from 'vs/workbench/parts/git/browser/gitOperations'; -import { TextFileModelChangeEvent, ITextFileService } from 'vs/workbench/parts/files/common/files'; +import { TextFileModelChangeEvent, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileService, EventType as FileEventType, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; import { ThrottledDelayer, PeriodThrottledDelayer } from 'vs/base/common/async'; import severity from 'vs/base/common/severity'; diff --git a/src/vs/workbench/parts/git/electron-browser/electronGitService.ts b/src/vs/workbench/parts/git/electron-browser/electronGitService.ts index 9e5b068b503..acae7fed98d 100644 --- a/src/vs/workbench/parts/git/electron-browser/electronGitService.ts +++ b/src/vs/workbench/parts/git/electron-browser/electronGitService.ts @@ -8,7 +8,7 @@ import { IRawGitService, RawServiceState, IGitConfiguration } from 'vs/workbench import { NoOpGitService } from 'vs/workbench/parts/git/common/noopGitService'; import { GitService } from 'vs/workbench/parts/git/browser/gitServices'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { ITextFileService } from 'vs/workbench/parts/files/common/files'; +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IOutputService } from 'vs/workbench/parts/output/common/output'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 05d43600e1f..5ff78e9a6c2 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -57,7 +57,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ITextFileService } from 'vs/workbench/parts/files/common/files'; +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannel } from 'vs/workbench/parts/output/common/output'; import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TaskConfiguration, TaskDescription, TaskSystemEvents } from 'vs/workbench/parts/tasks/common/taskSystem'; diff --git a/src/vs/workbench/parts/files/common/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts similarity index 99% rename from src/vs/workbench/parts/files/common/textFileService.ts rename to src/vs/workbench/services/textfile/browser/textFileService.ts index 50d0f21f1aa..5ba8665a653 100644 --- a/src/vs/workbench/parts/files/common/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -11,7 +11,7 @@ import DOM = require('vs/base/browser/dom'); import errors = require('vs/base/common/errors'); import objects = require('vs/base/common/objects'); import Event, {Emitter} from 'vs/base/common/event'; -import {IResult, ITextFileOperationResult, ITextFileService, IRawTextContent, IAutoSaveConfiguration, AutoSaveMode, SaveReason, ITextFileEditorModelManager, ITextFileEditorModel, ISaveOptions} from 'vs/workbench/parts/files/common/files'; +import {IResult, ITextFileOperationResult, ITextFileService, IRawTextContent, IAutoSaveConfiguration, AutoSaveMode, SaveReason, ITextFileEditorModelManager, ITextFileEditorModel, ISaveOptions} from 'vs/workbench/services/textfile/common/textfiles'; import {ConfirmResult} from 'vs/workbench/common/editor'; import {ILifecycleService} from 'vs/platform/lifecycle/common/lifecycle'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; @@ -24,7 +24,7 @@ import {IEditorGroupService} from 'vs/workbench/services/group/common/groupServi import {IUntitledEditorService} from 'vs/workbench/services/untitled/common/untitledEditorService'; import {UntitledEditorModel} from 'vs/workbench/common/editor/untitledEditorModel'; import {BinaryEditorModel} from 'vs/workbench/common/editor/binaryEditorModel'; -import {TextFileEditorModelManager} from 'vs/workbench/parts/files/common/editors/textFileEditorModelManager'; +import {TextFileEditorModelManager} from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; /** diff --git a/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts similarity index 99% rename from src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts rename to src/vs/workbench/services/textfile/common/textFileEditorModel.ts index c40fdd64f28..29d66b65e93 100644 --- a/src/vs/workbench/parts/files/common/editors/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -19,7 +19,7 @@ import types = require('vs/base/common/types'); import {IModelContentChangedEvent} from 'vs/editor/common/editorCommon'; import {IMode} from 'vs/editor/common/modes'; import {ILifecycleService} from 'vs/platform/lifecycle/common/lifecycle'; -import {ITextFileService, IAutoSaveConfiguration, ModelState, ITextFileEditorModel, IModelSaveOptions, ISaveErrorHandler, ISaveParticipant, StateChange, SaveReason} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService, IAutoSaveConfiguration, ModelState, ITextFileEditorModel, IModelSaveOptions, ISaveErrorHandler, ISaveParticipant, StateChange, SaveReason} from 'vs/workbench/services/textfile/common/textfiles'; import {EncodingMode, EditorModel} from 'vs/workbench/common/editor'; import {BaseTextEditorModel} from 'vs/workbench/common/editor/textEditorModel'; import {IFileService, IFileStat, IFileOperationResult, FileOperationResult} from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.test.ts similarity index 97% rename from src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts rename to src/vs/workbench/services/textfile/common/textFileEditorModelManager.test.ts index a9d909ad739..ee4a33aa2b3 100644 --- a/src/vs/workbench/parts/files/test/browser/textFileEditorModelManager.test.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.test.ts @@ -8,15 +8,15 @@ import * as assert from 'assert'; import URI from 'vs/base/common/uri'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; -import {TextFileEditorModelManager} from 'vs/workbench/parts/files/common/editors/textFileEditorModelManager'; +import {TextFileEditorModelManager} from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import {EditorModel} from 'vs/workbench/common/editor'; import {join, basename} from 'vs/base/common/paths'; import {workbenchInstantiationService, TestEditorGroupService} from 'vs/test/utils/servicesTestUtils'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; -import {TextFileEditorModel} from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; +import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFileEditorModel'; import {IEventService} from 'vs/platform/event/common/event'; -import {LocalFileChangeEvent} from 'vs/workbench/parts/files/common/files'; +import {LocalFileChangeEvent} from 'vs/workbench/services/textfile/common/textfiles'; import {FileChangesEvent, EventType as CommonFileEventType, FileChangeType} from 'vs/platform/files/common/files'; class ServiceAccessor { diff --git a/src/vs/workbench/parts/files/common/editors/textFileEditorModelManager.ts b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts similarity index 98% rename from src/vs/workbench/parts/files/common/editors/textFileEditorModelManager.ts rename to src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts index 6a91400c223..5f126eaf103 100644 --- a/src/vs/workbench/parts/files/common/editors/textFileEditorModelManager.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts @@ -7,10 +7,10 @@ import Event, {Emitter} from 'vs/base/common/event'; import {TPromise} from 'vs/base/common/winjs.base'; import URI from 'vs/base/common/uri'; -import {TextFileEditorModel} from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; +import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFileEditorModel'; import {dispose, IDisposable} from 'vs/base/common/lifecycle'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; -import {ModelState, ITextFileEditorModel, LocalFileChangeEvent, ITextFileEditorModelManager, TextFileModelChangeEvent, StateChange} from 'vs/workbench/parts/files/common/files'; +import {ModelState, ITextFileEditorModel, LocalFileChangeEvent, ITextFileEditorModelManager, TextFileModelChangeEvent, StateChange} from 'vs/workbench/services/textfile/common/textfiles'; import {ILifecycleService} from 'vs/platform/lifecycle/common/lifecycle'; import {IEventService} from 'vs/platform/event/common/event'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts new file mode 100644 index 00000000000..185ee86c30c --- /dev/null +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -0,0 +1,330 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import {TPromise} from 'vs/base/common/winjs.base'; +import URI from 'vs/base/common/uri'; +import Event from 'vs/base/common/event'; +import {IRawText} from 'vs/editor/common/editorCommon'; +import {IDisposable} from 'vs/base/common/lifecycle'; +import {IEncodingSupport, ConfirmResult} from 'vs/workbench/common/editor'; +import {IFileStat, IBaseStat, IResolveContentOptions} from 'vs/platform/files/common/files'; +import {createDecorator} from 'vs/platform/instantiation/common/instantiation'; +import {ITextEditorModel} from 'vs/platform/editor/common/editor'; +import {Event as BaseEvent, PropertyChangeEvent} from 'vs/base/common/events'; + + +/** + * The save error handler can be installed on the text text file editor model to install code that executes when save errors occur. + */ +export interface ISaveErrorHandler { + + /** + * Called whenever a save fails. + */ + onSaveError(error: any, model: ITextFileEditorModel): void; +} + +export interface ISaveParticipant { + + /** + * Participate in a save of a model. Allows to change the model before it is being saved to disk. + */ + participate(model: ITextFileEditorModel, env: { reason: SaveReason }): TPromise; +} + +/** + * States the text text file editor model can be in. + */ +export enum ModelState { + SAVED, + DIRTY, + PENDING_SAVE, + CONFLICT, + ERROR +} + +/** + * Local file change events are being emitted when a file is added, removed, moved or its contents got updated. These events + * are being emitted from within the workbench and are not reflecting the truth on the disk file system. For that, please + * use FileChangesEvent instead. + */ +export class LocalFileChangeEvent extends PropertyChangeEvent { + + constructor(before?: IFileStat, after?: IFileStat, originalEvent?: BaseEvent) { + super(null, before, after, originalEvent); + } + + /** + * Returns the meta information of the file before the event occurred or null if the file is new. + */ + public getBefore(): IFileStat { + return this.oldValue; + } + + /** + * Returns the meta information of the file after the event occurred or null if the file got deleted. + */ + public getAfter(): IFileStat { + return this.newValue; + } + + /** + * Indicates if the file was added as a new file. + */ + public gotAdded(): boolean { + return !this.oldValue && !!this.newValue; + } + + /** + * Indicates if the file was moved to a different path. + */ + public gotMoved(): boolean { + return !!this.oldValue && !!this.newValue && this.oldValue.resource.toString() !== this.newValue.resource.toString(); + } + + /** + * Indicates if the files metadata was updated. + */ + public gotUpdated(): boolean { + return !!this.oldValue && !!this.newValue && !this.gotMoved() && this.oldValue !== this.newValue; + } + + /** + * Indicates if the file was deleted. + */ + public gotDeleted(): boolean { + return !!this.oldValue && !this.newValue; + } +} + +export enum StateChange { + DIRTY, + SAVING, + SAVE_ERROR, + SAVED, + REVERTED, + ENCODING +} + +export class TextFileModelChangeEvent { + private _resource: URI; + private _kind: StateChange; + + constructor(model: ITextFileEditorModel, kind: StateChange) { + this._resource = model.getResource(); + this._kind = kind; + } + + public get resource(): URI { + return this._resource; + } + + public get kind(): StateChange { + return this._kind; + } +} + +export const TEXT_FILE_SERVICE_ID = 'textFileService'; + +export interface ITextFileOperationResult { + results: IResult[]; +} + +export interface IResult { + source: URI; + target?: URI; + success?: boolean; +} + +export interface IAutoSaveConfiguration { + autoSaveDelay: number; + autoSaveFocusChange: boolean; + autoSaveApplicationChange: boolean; +} + +export enum AutoSaveMode { + OFF, + AFTER_SHORT_DELAY, + AFTER_LONG_DELAY, + ON_FOCUS_CHANGE, + ON_WINDOW_CHANGE +} + +export enum SaveReason { + EXPLICIT = 1, + AUTO = 2, + FOCUS_CHANGE = 3, + WINDOW_CHANGE = 4 +} + +export const ITextFileService = createDecorator(TEXT_FILE_SERVICE_ID); + +export interface IRawTextContent extends IBaseStat { + + /** + * The line grouped content of a text file. + */ + value: IRawText; + + /** + * The line grouped logical hash of a text file. + */ + valueLogicalHash: string; + + /** + * The encoding of the content if known. + */ + encoding: string; +} + +export interface ITextFileEditorModelManager { + + onModelDirty: Event; + onModelSaveError: Event; + onModelSaved: Event; + onModelReverted: Event; + onModelEncodingChanged: Event; + + get(resource: URI): ITextFileEditorModel; + + getAll(resource?: URI): ITextFileEditorModel[]; + + loadOrCreate(resource: URI, preferredEncoding: string, refresh?: boolean): TPromise; +} + +export interface IModelSaveOptions { + reason?: SaveReason; + overwriteReadonly?: boolean; + overwriteEncoding?: boolean; +} + +export interface ITextFileEditorModel extends ITextEditorModel, IEncodingSupport { + + onDidStateChange: Event; + + getResource(): URI; + + getLastSaveAttemptTime(): number; + + getLastModifiedTime(): number; + + getState(): ModelState; + + updatePreferredEncoding(encoding: string): void; + + save(options?: IModelSaveOptions): TPromise; + + revert(): TPromise; + + setConflictResolutionMode(); + + getValue(): string; + + isDirty(): boolean; + + isResolved(): boolean; + + isDisposed(): boolean; +} + +export interface ISaveOptions { + + /** + * Save the file on disk even if not dirty. If the file is not dirty, it will be touched + * so that mtime and atime are updated. This helps to trigger external file watchers. + */ + force: boolean; +} + +export interface ITextFileService extends IDisposable { + _serviceBrand: any; + onAutoSaveConfigurationChange: Event; + onFilesAssociationChange: Event; + + /** + * Access to the manager of text file editor models providing further methods to work with them. + */ + models: ITextFileEditorModelManager; + + /** + * Resolve the contents of a file identified by the resource. + */ + resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise; + + /** + * A resource is dirty if it has unsaved changes or is an untitled file not yet saved. + * + * @param resource the resource to check for being dirty. If it is not specified, will check for + * all dirty resources. + */ + isDirty(resource?: URI): boolean; + + /** + * Returns all resources that are currently dirty matching the provided resources or all dirty resources. + * + * @param resources the resources to check for being dirty. If it is not specified, will check for + * all dirty resources. + */ + getDirty(resources?: URI[]): URI[]; + + /** + * Saves the resource. + * + * @param resource the resource to save + * @return true iff the resource was saved. + */ + save(resource: URI, options?: ISaveOptions): TPromise; + + /** + * Saves the provided resource asking the user for a file name. + * + * @param resource the resource to save as. + * @return true iff the file was saved. + */ + saveAs(resource: URI, targetResource?: URI): TPromise; + + /** + * Saves the set of resources and returns a promise with the operation result. + * + * @param resources can be null to save all. + * @param includeUntitled to save all resources and optionally exclude untitled ones. + */ + saveAll(includeUntitled?: boolean): TPromise; + saveAll(resources: URI[]): TPromise; + + /** + * Reverts the provided resource. + * + * @param resource the resource of the file to revert. + * @param force to force revert even when the file is not dirty + */ + revert(resource: URI, force?: boolean): TPromise; + + /** + * Reverts all the provided resources and returns a promise with the operation result. + * + * @param force to force revert even when the file is not dirty + */ + revertAll(resources?: URI[], force?: boolean): TPromise; + + /** + * Brings up the confirm dialog to either save, don't save or cancel. + * + * @param resources the resources of the files to ask for confirmation or null if + * confirming for all dirty resources. + */ + confirmSave(resources?: URI[]): ConfirmResult; + + /** + * Convinient fast access to the current auto save mode. + */ + getAutoSaveMode(): AutoSaveMode; + + /** + * Convinient fast access to the raw configured auto save settings. + */ + getAutoSaveConfiguration(): IAutoSaveConfiguration; +} \ No newline at end of file diff --git a/src/vs/workbench/parts/files/electron-browser/textFileService.ts b/src/vs/workbench/services/textfile/electron-browser/textFileService.ts similarity index 98% rename from src/vs/workbench/parts/files/electron-browser/textFileService.ts rename to src/vs/workbench/services/textfile/electron-browser/textFileService.ts index cba7157bd68..5464b18da75 100644 --- a/src/vs/workbench/parts/files/electron-browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/electron-browser/textFileService.ts @@ -12,8 +12,8 @@ import strings = require('vs/base/common/strings'); import {isWindows, isLinux} from 'vs/base/common/platform'; import URI from 'vs/base/common/uri'; import {ConfirmResult} from 'vs/workbench/common/editor'; -import {TextFileService as AbstractTextFileService} from 'vs/workbench/parts/files/common/textFileService'; -import {IRawTextContent} from 'vs/workbench/parts/files/common/files'; +import {TextFileService as AbstractTextFileService} from 'vs/workbench/services/textfile/browser/textFileService'; +import {IRawTextContent} from 'vs/workbench/services/textfile/common/textfiles'; import {IUntitledEditorService} from 'vs/workbench/services/untitled/common/untitledEditorService'; import {IFileService, IResolveContentOptions} from 'vs/platform/files/common/files'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; diff --git a/src/vs/workbench/parts/files/test/browser/fileEditorModel.test.ts b/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts similarity index 97% rename from src/vs/workbench/parts/files/test/browser/fileEditorModel.test.ts rename to src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts index 9752c86157b..d9a243673b1 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEditorModel.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts @@ -12,11 +12,11 @@ import URI from 'vs/base/common/uri'; import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import paths = require('vs/base/common/paths'); import {EncodingMode} from 'vs/workbench/common/editor'; -import {TextFileEditorModel} from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; +import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFileEditorModel'; import {IEventService} from 'vs/platform/event/common/event'; -import {ITextFileService, ModelState, StateChange} from 'vs/workbench/parts/files/common/files'; +import {ITextFileService, ModelState, StateChange} from 'vs/workbench/services/textfile/common/textfiles'; import {workbenchInstantiationService, TestTextFileService} from 'vs/test/utils/servicesTestUtils'; -import {TextFileEditorModelManager} from 'vs/workbench/parts/files/common/editors/textFileEditorModelManager'; +import {TextFileEditorModelManager} from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import {FileOperationResult, IFileOperationResult} from 'vs/platform/files/common/files'; function toResource(path) { diff --git a/src/vs/workbench/parts/files/test/browser/textFileService.test.ts b/src/vs/workbench/services/textfile/test/textFileService.test.ts similarity index 95% rename from src/vs/workbench/parts/files/test/browser/textFileService.test.ts rename to src/vs/workbench/services/textfile/test/textFileService.test.ts index 24dfd64e2f1..21d0a3e35ae 100644 --- a/src/vs/workbench/parts/files/test/browser/textFileService.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileService.test.ts @@ -11,12 +11,12 @@ import paths = require('vs/base/common/paths'); import {ILifecycleService, ShutdownEvent} from 'vs/platform/lifecycle/common/lifecycle'; import {workbenchInstantiationService, TestLifecycleService, TestTextFileService} from 'vs/test/utils/servicesTestUtils'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; -import {TextFileEditorModel} from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; -import {ITextFileService} from 'vs/workbench/parts/files/common/files'; +import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFileEditorModel'; +import {ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {ConfirmResult} from 'vs/workbench/common/editor'; import {IUntitledEditorService} from 'vs/workbench/services/untitled/common/untitledEditorService'; import {UntitledEditorModel} from 'vs/workbench/common/editor/untitledEditorModel'; -import {TextFileEditorModelManager} from 'vs/workbench/parts/files/common/editors/textFileEditorModelManager'; +import {TextFileEditorModelManager} from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; function toResource(path) { return URI.file(paths.join('C:\\', path)); diff --git a/src/vs/workbench/test/browser/services.test.ts b/src/vs/workbench/test/browser/services.test.ts index 64e1260235c..4eebc8e0994 100644 --- a/src/vs/workbench/test/browser/services.test.ts +++ b/src/vs/workbench/test/browser/services.test.ts @@ -16,7 +16,7 @@ import {EditorInput, EditorOptions, TextEditorOptions} from 'vs/workbench/common import {StringEditorInput} from 'vs/workbench/common/editor/stringEditorInput'; import {StringEditorModel} from 'vs/workbench/common/editor/stringEditorModel'; import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; -import {TextFileEditorModel} from 'vs/workbench/parts/files/common/editors/textFileEditorModel'; +import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFileEditorModel'; import {workbenchInstantiationService} from 'vs/test/utils/servicesTestUtils'; import {Viewlet} from 'vs/workbench/browser/viewlet'; import {IPanel} from 'vs/workbench/common/panel'; diff --git a/src/vs/workbench/test/node/api/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/test/node/api/extHostDocumentSaveParticipant.test.ts index eaa69d4fca9..8e3aa07b591 100644 --- a/src/vs/workbench/test/node/api/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/test/node/api/extHostDocumentSaveParticipant.test.ts @@ -14,7 +14,7 @@ import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/node/extHostDoc import { OneGetThreadService } from './testThreadService'; import * as EditorCommon from 'vs/editor/common/editorCommon'; import { IResourceEdit } from 'vs/editor/common/services/bulkEdit'; -import { SaveReason } from 'vs/workbench/parts/files/common/files'; +import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; suite('ExtHostDocumentSaveParticipant', () => { From b61ae53c647a82bf5c2cd99e9cdb21d278955483 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 15:24:25 +0200 Subject: [PATCH 423/433] fix tests --- src/vs/test/utils/servicesTestUtils.ts | 5 +++++ .../services/textfile/test/textFileEditorModel.test.ts | 7 +++---- .../{common => test}/textFileEditorModelManager.test.ts | 5 ++--- 3 files changed, 10 insertions(+), 7 deletions(-) rename src/vs/workbench/services/textfile/{common => test}/textFileEditorModelManager.test.ts (97%) diff --git a/src/vs/test/utils/servicesTestUtils.ts b/src/vs/test/utils/servicesTestUtils.ts index 60173af928e..61bebb26e11 100644 --- a/src/vs/test/utils/servicesTestUtils.ts +++ b/src/vs/test/utils/servicesTestUtils.ts @@ -6,6 +6,7 @@ 'use strict'; import 'vs/workbench/parts/files/browser/files.contribution'; // load our contribution into the test +import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import {Promise, TPromise} from 'vs/base/common/winjs.base'; import {TestInstantiationService} from 'vs/test/utils/instantiationTestUtils'; import {EventEmitter} from 'vs/base/common/eventEmitter'; @@ -49,6 +50,10 @@ export const TestWorkspace: IWorkspace = { uid: Date.now() }; +export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { + return instantiationService.createInstance(FileEditorInput, resource, void 0); +} + export const TestEnvironmentService = new EnvironmentService(parseArgs(process.argv), process.execPath); export class TestContextService implements IWorkspaceContextService { diff --git a/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts b/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts index d9a243673b1..fb26e7c328c 100644 --- a/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts @@ -9,13 +9,12 @@ import * as assert from 'assert'; import {TPromise} from 'vs/base/common/winjs.base'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import URI from 'vs/base/common/uri'; -import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import paths = require('vs/base/common/paths'); import {EncodingMode} from 'vs/workbench/common/editor'; import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFileEditorModel'; import {IEventService} from 'vs/platform/event/common/event'; import {ITextFileService, ModelState, StateChange} from 'vs/workbench/services/textfile/common/textfiles'; -import {workbenchInstantiationService, TestTextFileService} from 'vs/test/utils/servicesTestUtils'; +import {workbenchInstantiationService, TestTextFileService, createFileInput} from 'vs/test/utils/servicesTestUtils'; import {TextFileEditorModelManager} from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import {FileOperationResult, IFileOperationResult} from 'vs/platform/files/common/files'; @@ -238,8 +237,8 @@ suite('Files - TextFileEditorModel', () => { }); test('save() and isDirty() - proper with check for mtimes', function (done) { - const input1 = instantiationService.createInstance(FileEditorInput, toResource('/path/index_async2.txt'), 'utf8'); - const input2 = instantiationService.createInstance(FileEditorInput, toResource('/path/index_async.txt'), 'utf8'); + const input1 = createFileInput(instantiationService, toResource('/path/index_async2.txt')); + const input2 = createFileInput(instantiationService, toResource('/path/index_async.txt')); input1.resolve().then((model1: TextFileEditorModel) => { input2.resolve().then((model2: TextFileEditorModel) => { diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.test.ts b/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts similarity index 97% rename from src/vs/workbench/services/textfile/common/textFileEditorModelManager.test.ts rename to src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts index ee4a33aa2b3..433bf428166 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts @@ -11,9 +11,8 @@ import {IInstantiationService} from 'vs/platform/instantiation/common/instantiat import {TextFileEditorModelManager} from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import {EditorModel} from 'vs/workbench/common/editor'; import {join, basename} from 'vs/base/common/paths'; -import {workbenchInstantiationService, TestEditorGroupService} from 'vs/test/utils/servicesTestUtils'; +import {workbenchInstantiationService, TestEditorGroupService, createFileInput} from 'vs/test/utils/servicesTestUtils'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; -import {FileEditorInput} from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFileEditorModel'; import {IEventService} from 'vs/platform/event/common/event'; import {LocalFileChangeEvent} from 'vs/workbench/services/textfile/common/textfiles'; @@ -145,7 +144,7 @@ suite('Files - TextFileEditorModelManager', () => { const model: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, resource, 'utf8'); manager.add(resource, model); - const input = instantiationService.createInstance(FileEditorInput, resource, void 0); + const input = createFileInput(instantiationService, resource); const stacks = accessor.editorGroupService.getStacksModel(); const group = stacks.openGroup('group', true); From 0d096feddd43598d07405b306a7e02f8fdb7f276 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 15:28:54 +0200 Subject: [PATCH 424/433] avoid input creation for checking for dirty state --- .../workbench/electron-browser/workbench.ts | 6 +-- .../node/configurationEditingService.ts | 46 +++++++++---------- .../node/configurationEditingService.test.ts | 45 +++++++++++------- 3 files changed, 54 insertions(+), 43 deletions(-) diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 10b851046f0..6832aa0ba59 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -389,6 +389,9 @@ export class Workbench implements IPartService { // History serviceCollection.set(IHistoryService, this.instantiationService.createInstance(HistoryService)); + // Text File Service + serviceCollection.set(ITextFileService, this.instantiationService.createInstance(TextFileService)); + // Configuration Editing serviceCollection.set(IConfigurationEditingService, this.instantiationService.createInstance(ConfigurationEditingService)); @@ -403,9 +406,6 @@ export class Workbench implements IPartService { this.toShutdown.push(this.quickOpen); serviceCollection.set(IQuickOpenService, this.quickOpen); - // Text File Service - serviceCollection.set(ITextFileService, this.instantiationService.createInstance(TextFileService)); - // Contributed services const contributedServices = getServices(); for (let contributedService of contributedServices) { diff --git a/src/vs/workbench/services/configuration/node/configurationEditingService.ts b/src/vs/workbench/services/configuration/node/configurationEditingService.ts index 507f97aafa7..7f715f73796 100644 --- a/src/vs/workbench/services/configuration/node/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/node/configurationEditingService.ts @@ -12,11 +12,11 @@ import * as json from 'vs/base/common/json'; import * as encoding from 'vs/base/node/encoding'; import strings = require('vs/base/common/strings'); import {getConfigurationKeys} from 'vs/platform/configuration/common/model'; -import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {setProperty} from 'vs/base/common/jsonEdit'; import {applyEdits} from 'vs/base/common/jsonFormatter'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IEnvironmentService} from 'vs/platform/environment/common/environment'; +import {ITextFileService} from 'vs/workbench/services/textfile/common/textfiles'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {WORKSPACE_CONFIG_DEFAULT_PATH} from 'vs/workbench/services/configuration/common/configuration'; import {IFileService} from 'vs/platform/files/common/files'; @@ -47,7 +47,7 @@ export class ConfigurationEditingService implements IConfigurationEditingService @IWorkspaceContextService private contextService: IWorkspaceContextService, @IEnvironmentService private environmentService: IEnvironmentService, @IFileService private fileService: IFileService, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService + @ITextFileService private textFileService: ITextFileService ) { } @@ -160,33 +160,31 @@ export class ConfigurationEditingService implements IConfigurationEditingService // Target cannot be dirty const resource = operation.target; - return this.editorService.createInput({ resource }).then(typedInput => { - if (typedInput.isDirty()) { - return { error: ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY }; + if (this.textFileService.isDirty(resource)) { + return TPromise.as({ error: ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY }); + } + + return this.fileService.existsFile(resource).then(exists => { + if (!exists) { + return { exists }; } - return this.fileService.existsFile(resource).then(exists => { - if (!exists) { - return { exists }; + return this.fileService.resolveContent(resource, { acceptTextOnly: true, encoding: encoding.UTF8 }).then(content => { + + // If we write to a workspace standalone file and replace the entire contents (no key provided) + // we can return here because any parse errors can safely be ignored since all contents are replaced + if (operation.isWorkspaceStandalone && !operation.key) { + return { exists, contents: content.value }; } - return this.fileService.resolveContent(resource, { acceptTextOnly: true, encoding: encoding.UTF8 }).then(content => { + // Target cannot contain JSON errors + const parseErrors = []; + json.parse(content.value, parseErrors); + if (parseErrors.length > 0) { + return { error: ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION }; + } - // If we write to a workspace standalone file and replace the entire contents (no key provided) - // we can return here because any parse errors can safely be ignored since all contents are replaced - if (operation.isWorkspaceStandalone && !operation.key) { - return { exists, contents: content.value }; - } - - // Target cannot contain JSON errors - const parseErrors = []; - json.parse(content.value, parseErrors); - if (parseErrors.length > 0) { - return { error: ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION }; - } - - return { exists, contents: content.value }; - }); + return { exists, contents: content.value }; }); }); } diff --git a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts index 9377af88a1a..6eb2c2e326d 100644 --- a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts @@ -13,10 +13,10 @@ import * as json from 'vs/base/common/json'; import {TPromise} from 'vs/base/common/winjs.base'; import {Registry} from 'vs/platform/platform'; import {ParsedArgs, parseArgs} from 'vs/platform/environment/node/argv'; -import {WorkspaceContextService} from 'vs/platform/workspace/common/workspace'; +import {WorkspaceContextService, IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {EnvironmentService} from 'vs/platform/environment/node/environmentService'; import extfs = require('vs/base/node/extfs'); -import {TestEventService, TestEditorService} from 'vs/test/utils/servicesTestUtils'; +import {TestEventService, workbenchInstantiationService, TestTextFileService} from 'vs/test/utils/servicesTestUtils'; import uuid = require('vs/base/common/uuid'); import {IConfigurationRegistry, Extensions as ConfigurationExtensions} from 'vs/platform/configuration/common/configurationRegistry'; import {WorkspaceConfigurationService} from 'vs/workbench/services/configuration/node/configurationService'; @@ -25,7 +25,14 @@ import utils = require('vs/workbench/services/files/test/node/utils'); import {FileService} from 'vs/workbench/services/files/node/fileService'; import {ConfigurationEditingService, WORKSPACE_STANDALONE_CONFIGURATIONS} from 'vs/workbench/services/configuration/node/configurationEditingService'; import {ConfigurationTarget, IConfigurationEditingError, ConfigurationEditingErrorCode} from 'vs/workbench/services/configuration/common/configurationEditing'; -import {IResourceInput} from 'vs/platform/editor/common/editor'; +import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; +import {IFileService} from 'vs/platform/files/common/files'; +import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; +import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; +import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; +import {IUntitledEditorService} from 'vs/workbench/services/untitled/common/untitledEditorService'; +import {ILifecycleService} from 'vs/platform/lifecycle/common/lifecycle'; +import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -36,19 +43,25 @@ class SettingsTestEnvironmentService extends EnvironmentService { get appSettingsPath(): string { return this.customAppSettingsHome; } } -class TestWorkbenchEditorService extends TestEditorService { +class TestDirtyTextFileService extends TestTextFileService { - constructor(private dirty: boolean) { - super(); + constructor( + private dirty: boolean, + @ILifecycleService lifecycleService: ILifecycleService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IConfigurationService configurationService: IConfigurationService, + @ITelemetryService telemetryService: ITelemetryService, + @IWorkbenchEditorService editorService: IWorkbenchEditorService, + @IEditorGroupService editorGroupService: IEditorGroupService, + @IFileService fileService: IFileService, + @IUntitledEditorService untitledEditorService: IUntitledEditorService, + @IInstantiationService instantiationService: IInstantiationService + ) { + super(lifecycleService, contextService, configurationService, telemetryService, editorService, editorGroupService, fileService, untitledEditorService, instantiationService); } - public createInput(input: IResourceInput): TPromise { - return TPromise.as({ - getName: () => 'name', - getDescription: () => 'description', - isDirty: () => this.dirty, - matches: () => false - }); + public isDirty(resource?: URI): boolean { + return this.dirty; } } @@ -70,14 +83,14 @@ suite('WorkspaceConfigurationEditingService - Node', () => { const workspaceContextService = new WorkspaceContextService(noWorkspace ? null : { resource: URI.file(workspaceDir) }); const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile); const configurationService = new WorkspaceConfigurationService(workspaceContextService, new TestEventService(), environmentService); - const editorService = new TestWorkbenchEditorService(dirty); + const textFileService = workbenchInstantiationService().createInstance(TestDirtyTextFileService, dirty); const events = new utils.TestEventService(); const fileService = new FileService(noWorkspace ? null : workspaceDir, { disableWatcher: true }, events); return configurationService.initialize().then(() => { return { - configurationEditingService: new ConfigurationEditingService(configurationService, workspaceContextService, environmentService, fileService, editorService), - configurationService: configurationService + configurationEditingService: new ConfigurationEditingService(configurationService, workspaceContextService, environmentService, fileService, textFileService), + configurationService }; }); } From 1d7389c79c03dd59207ffdd267e2a8d44e7f2d1d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Oct 2016 11:54:53 +0200 Subject: [PATCH 425/433] fix typo --- src/vs/workbench/parts/files/browser/views/explorerViewer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index 87104902766..59509c0a25b 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -172,7 +172,7 @@ export class FileActionProvider extends ContributableActionProvider { return super.getSecondaryActions(tree, stat); } - public runAction(tree: ITree, stat: FileStat, action: IAction, ontext?: any): TPromise; + public runAction(tree: ITree, stat: FileStat, action: IAction, context?: any): TPromise; public runAction(tree: ITree, stat: FileStat, actionID: string, context?: any): TPromise; public runAction(tree: ITree, stat: FileStat, arg: any, context: any = {}): TPromise { context = objects.mixin({ From 44b84f7f43002df67b91cdf8e7393bbb756c9e11 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Oct 2016 12:14:53 +0200 Subject: [PATCH 426/433] fix #13115 --- .../markers/browser/markersActionProvider.ts | 87 ------------------- .../parts/markers/browser/markersPanel.ts | 6 +- .../markers/browser/markersTreeController.ts | 87 ++++++++++++++++++- .../markers/browser/markersTreeViewer.ts | 4 +- .../browser/markersWorkbenchContributions.ts | 6 +- .../parts/markers/common/constants.ts | 3 +- .../markersElectronContributions.ts | 68 +++++++++++++++ .../parts/markers/markers.contribution.ts | 4 +- 8 files changed, 167 insertions(+), 98 deletions(-) delete mode 100644 src/vs/workbench/parts/markers/browser/markersActionProvider.ts create mode 100644 src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.ts diff --git a/src/vs/workbench/parts/markers/browser/markersActionProvider.ts b/src/vs/workbench/parts/markers/browser/markersActionProvider.ts deleted file mode 100644 index 0e9d2c18932..00000000000 --- a/src/vs/workbench/parts/markers/browser/markersActionProvider.ts +++ /dev/null @@ -1,87 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as nls from 'vs/nls'; -import winjs = require('vs/base/common/winjs.base'); -import lifecycle = require('vs/base/common/lifecycle'); -import actions = require('vs/base/common/actions'); -import actionbar = require('vs/base/browser/ui/actionbar/actionbar'); -import actionsrenderer = require('vs/base/parts/tree/browser/actionsRenderer'); -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import tree = require('vs/base/parts/tree/browser/tree'); -import { Resource } from 'vs/workbench/parts/markers/common/markersModel'; - -class RemoveResourceAction extends actions.Action { - constructor() { - super('remove', nls.localize('RemoveAction.label', "Remove"), 'action-remove'); - } - - public run(context?: any): winjs.TPromise { - return (context['tree']).refresh(); - } -} - -export class ActionContainer implements lifecycle.IDisposable { - - private cache: { [actionId:string]:actions.IAction; }; - private instantiationService: IInstantiationService; - - constructor(instantiationService: IInstantiationService) { - this.cache = {}; - this.instantiationService = instantiationService; - } - - protected getAction(ctor: any, ...args: any[]): any { - var action = this.cache[ctor.ID]; - - if (!action) { - args.unshift(ctor); - action = this.cache[ctor.ID] = this.instantiationService.createInstance.apply(this.instantiationService, args); - } - - return action; - } - - public dispose(): void { - Object.keys(this.cache).forEach(k => { - this.cache[k].dispose(); - }); - - this.cache = null; - } -} - - -export class ActionProvider extends ActionContainer implements actionsrenderer.IActionProvider { - - constructor(@IInstantiationService instantiationService: IInstantiationService) { - super(instantiationService); - } - - public hasActions(tree: tree.ITree, element: any): boolean { - return element instanceof Resource; - } - - public getActions(tree: tree.ITree, element: any): winjs.TPromise { - return winjs.TPromise.as(this.getActionsForResource()); - } - - public getActionsForResource(): actions.IAction[] { - return [new RemoveResourceAction()]; - } - - public hasSecondaryActions(tree: tree.ITree, element: any): boolean { - return false; - } - - public getSecondaryActions(tree: tree.ITree, element: any): winjs.TPromise { - return winjs.TPromise.as([]); - } - - public getActionItem(tree: tree.ITree, element: any, action: actions.IAction): actionbar.IActionItem { - return null; - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/browser/markersPanel.ts b/src/vs/workbench/parts/markers/browser/markersPanel.ts index f70322a2893..7a280eee158 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanel.ts @@ -30,11 +30,11 @@ import Tree = require('vs/base/parts/tree/browser/tree'); import TreeImpl = require('vs/base/parts/tree/browser/treeImpl'); import * as Viewer from 'vs/workbench/parts/markers/browser/markersTreeViewer'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ActionProvider } from 'vs/workbench/parts/markers/browser/markersActionProvider'; import { CollapseAllAction, FilterAction, FilterInputBoxActionItem } from 'vs/workbench/parts/markers/browser/markersPanelActions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import Messages from 'vs/workbench/parts/markers/common/messages'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; +import { ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; export class MarkersPanel extends Panel { @@ -169,9 +169,9 @@ export class MarkersPanel extends Panel { private createTree(parent: HTMLElement): void { this.treeContainer = dom.append(parent, dom.$('.tree-container')); dom.addClass(this.treeContainer, 'show-file-icons'); - var actionProvider = this.instantiationService.createInstance(ActionProvider); + var actionProvider = this.instantiationService.createInstance(ContributableActionProvider); var renderer = this.instantiationService.createInstance(Viewer.Renderer, this.getActionRunner(), actionProvider); - let controller = this.instantiationService.createInstance(Controller, this.rangeHighlightDecorations); + let controller = this.instantiationService.createInstance(Controller, this.rangeHighlightDecorations, actionProvider); this.tree = new TreeImpl.Tree(this.treeContainer, { dataSource: new Viewer.DataSource(), renderer, diff --git a/src/vs/workbench/parts/markers/browser/markersTreeController.ts b/src/vs/workbench/parts/markers/browser/markersTreeController.ts index 973824bd0be..05b79d9a4a1 100644 --- a/src/vs/workbench/parts/markers/browser/markersTreeController.ts +++ b/src/vs/workbench/parts/markers/browser/markersTreeController.ts @@ -10,15 +10,31 @@ import keyboard = require('vs/base/browser/keyboardEvent'); import tree = require('vs/base/parts/tree/browser/tree'); import treedefaults = require('vs/base/parts/tree/browser/treeDefaults'); import { MarkersModel, Marker } from 'vs/workbench/parts/markers/common/markersModel'; +import Constants from 'vs/workbench/parts/markers/common/constants'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IMenuService, IMenu, MenuId } from 'vs/platform/actions/common/actions'; +import { fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; +import { Keybinding } from 'vs/base/common/keybinding'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { IActionProvider } from 'vs/base/parts/tree/browser/actionsRenderer'; export class Controller extends treedefaults.DefaultController { - constructor(private rangeHighlightDecorations: RangeHighlightDecorations, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + private contributedContextMenu: IMenu; + + constructor(private rangeHighlightDecorations: RangeHighlightDecorations, private actionProvider: IActionProvider, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IContextMenuService private contextMenuService: IContextMenuService, + @IMenuService menuService: IMenuService, + @IContextKeyService contextKeyService: IContextKeyService, @ITelemetryService private telemetryService: ITelemetryService) { super(); + + this.contributedContextMenu = menuService.createMenu(MenuId.ExplorerContext, contextKeyService); + this.downKeyBindingDispatcher.set(Controller.getKeybindingForCopyAction(), (tree: tree.ITree, event: any) => this.onCopy(tree, event)); } protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean { @@ -57,6 +73,38 @@ export class Controller extends treedefaults.DefaultController { return super.onSpace(tree, event); } + public onContextMenu(tree: tree.ITree, element: any, event: tree.ContextMenuEvent): boolean { + if (!this.actionProvider.hasSecondaryActions(tree, element)) { + return true; + } + + const anchor = { x: event.posx + 1, y: event.posy }; + this.contextMenuService.showContextMenu({ + getAnchor: () => anchor, + getActions: () => { + return this.actionProvider.getSecondaryActions(tree, element).then(actions => { + fillInActions(this.contributedContextMenu, actions); + return actions; + }); + }, + getActionItem: this.actionProvider.getActionItem.bind(this.actionProvider, tree, element), + getKeyBinding: (a): Keybinding => Controller.keybindingForAction(a.id), + getActionsContext: (event) => { + return { + element, + event + }; + }, + onHide: (wasCancelled?: boolean) => { + if (wasCancelled) { + tree.DOMFocus(); + } + } + }); + + return true; + } + private openFileAtElement(element: any, preserveFocus: boolean, sideByside: boolean, pinned: boolean): boolean { if (element instanceof Marker) { const marker: Marker = element; @@ -82,4 +130,41 @@ export class Controller extends treedefaults.DefaultController { } return false; } + + private onCopy(tree: tree.ITree, event: any): boolean { + return this.runAction(tree, Constants.MARKER_COPY_ACTION_ID); + } + + private runAction(tree: tree.ITree, id: string): boolean { + const element = tree.getFocus(); + if (!element) { + return false; + } + + if (!this.actionProvider.hasSecondaryActions(tree, element)) { + return false; + } + + this.actionProvider.getSecondaryActions(tree, element) + .then(actions => { + for (const action of actions) { + if (action.id === id && action.enabled) { + action.run({ element }); + return; + } + } + }); + + return true; + } + + private static keybindingForAction(id: string): Keybinding { + if (Constants.MARKER_COPY_ACTION_ID === id) { + return new Keybinding(Controller.getKeybindingForCopyAction()); + } + } + + private static getKeybindingForCopyAction(): number { + return KeyMod.CtrlCmd | KeyCode.KEY_C; + } } \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts index 97c8b482681..ce6cd763357 100644 --- a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts @@ -10,7 +10,7 @@ import {IDataSource, ITree, IRenderer, IAccessibilityProvider, ISorter } from 'v import { IActionRunner } from 'vs/base/common/actions'; import Severity from 'vs/base/common/severity'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; -import { ActionProvider } from 'vs/workbench/parts/markers/browser/markersActionProvider'; +import { IActionProvider } from 'vs/base/parts/tree/browser/actionsRenderer'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { FileLabel } from 'vs/workbench/browser/labels'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; @@ -70,7 +70,7 @@ export class Renderer implements IRenderer { private static MARKER_TEMPLATE_ID= 'marker-template'; constructor(private actionRunner: IActionRunner, - private actionProvider:ActionProvider, + private actionProvider: IActionProvider, @IWorkspaceContextService private contextService: IWorkspaceContextService, @IInstantiationService private instantiationService: IInstantiationService ) { diff --git a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts index 96a05562b79..f6148763ac8 100644 --- a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts +++ b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import {localize} from 'vs/nls'; -import lifecycle = require('vs/base/common/lifecycle'); +import { localize } from 'vs/nls'; +import * as lifecycle from 'vs/base/common/lifecycle'; import Messages from 'vs/workbench/parts/markers/common/messages'; import Constants from 'vs/workbench/parts/markers/common/constants'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; @@ -93,4 +93,4 @@ export function registerContributions(): void { (platform.Registry.as(WorkbenchExtensions.Workbench)).registerWorkbenchContribution( StatusUpdater ); -} +} \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/common/constants.ts b/src/vs/workbench/parts/markers/common/constants.ts index 931d324cb56..7af42eb6b9f 100644 --- a/src/vs/workbench/parts/markers/common/constants.ts +++ b/src/vs/workbench/parts/markers/common/constants.ts @@ -5,5 +5,6 @@ 'use strict'; export default { - MARKERS_PANEL_ID: 'workbench.panel.markers' + MARKERS_PANEL_ID: 'workbench.panel.markers', + MARKER_COPY_ACTION_ID: 'workbench.action.marker.copy' }; diff --git a/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.ts b/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.ts new file mode 100644 index 00000000000..abbaf6daaf1 --- /dev/null +++ b/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.ts @@ -0,0 +1,68 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { TPromise } from 'vs/base/common/winjs.base'; +import { Registry } from 'vs/platform/platform'; +import { IAction, Action } from 'vs/base/common/actions'; +import { localize } from 'vs/nls'; +import { clipboard } from 'electron'; +import { Marker } from 'vs/workbench/parts/markers/common/markersModel'; +import Constants from 'vs/workbench/parts/markers/common/constants'; +import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import Severity from 'vs/base/common/severity'; + + +class CopyMarker extends Action { + + public static ID = Constants.MARKER_COPY_ACTION_ID; + + constructor(@IWorkspaceContextService private contextService: IWorkspaceContextService,) { + super(CopyMarker.ID, localize('copyMarker', "Copy")); + } + + public run(context): TPromise { + if (context.element) { + const marker = context.element; + clipboard.writeText(`${this.printFormat(marker)}`); + } + return TPromise.as(true); + } + + private printFormat(marker: Marker): string { + return [`file: '${marker.marker.resource}'`, + `severity: '${Severity.toString(marker.marker.severity)}'`, + `message: '${marker.marker.message}'`, + `at: '${marker.marker.startLineNumber},${marker.marker.startColumn}'`, + `source: '${marker.marker.source ? marker.marker.source : ''}'`].join('\n'); + } +} + +class MarkersViewerActionContributor extends ActionBarContributor { + + constructor(@IInstantiationService private instantiationService: IInstantiationService) { + super(); + } + + public hasSecondaryActions(context: any): boolean { + const element = context.element; + return element instanceof Marker; + } + + public getSecondaryActions(context: any): IAction[] { + const actions: IAction[] = []; + if (this.hasSecondaryActions(context)) { + actions.push(this.instantiationService.createInstance(CopyMarker)); + } + + return actions; + } +} + +export function registerContributions(): void { + const actionsRegistry = Registry.as(ActionBarExtensions.Actionbar); + actionsRegistry.registerActionBarContributor(Scope.VIEWER, MarkersViewerActionContributor); +} \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/markers.contribution.ts b/src/vs/workbench/parts/markers/markers.contribution.ts index c189abe82ca..8e93a5abe41 100644 --- a/src/vs/workbench/parts/markers/markers.contribution.ts +++ b/src/vs/workbench/parts/markers/markers.contribution.ts @@ -3,5 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { registerContributions } from 'vs/workbench/parts/markers/browser/markersWorkbenchContributions'; +import { registerContributions as registerElectronContributions } from 'vs/workbench/parts/markers/electron-browser/markersElectronContributions'; -registerContributions(); \ No newline at end of file +registerContributions(); +registerElectronContributions(); \ No newline at end of file From 5f98e9427f8eda22364a90f6f6b418a0e3db76e8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Oct 2016 15:46:16 +0200 Subject: [PATCH 427/433] implement menu in new approach --- src/vs/platform/actions/common/actions.ts | 3 +- src/vs/workbench/common/component.ts | 8 +- .../parts/markers/browser/markersPanel.ts | 16 ++ .../markers/browser/markersTreeController.ts | 93 +++++------ .../parts/markers/common/constants.ts | 7 +- .../parts/markers/common/markersModel.ts | 9 ++ .../markersElectronContributions.ts | 149 +++++++++++------- 7 files changed, 172 insertions(+), 113 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 5e517209238..1474cd8a0a8 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -40,7 +40,8 @@ export enum MenuId { EditorTitle = 1, EditorContext = 2, ExplorerContext = 3, - EditorTabContext = 4 + EditorTabContext = 4, + ProblemsPanelContext = 5 } export const IMenuService = createDecorator('menuService'); diff --git a/src/vs/workbench/common/component.ts b/src/vs/workbench/common/component.ts index 3a5eb71e533..960d723573a 100644 --- a/src/vs/workbench/common/component.ts +++ b/src/vs/workbench/common/component.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import {IDisposable, dispose} from 'vs/base/common/lifecycle'; +import {IDisposable, dispose, Disposable} from 'vs/base/common/lifecycle'; import {Scope, Memento} from 'vs/workbench/common/memento'; -import {IStorageService} from 'vs/platform/storage/common/storage'; +import { IStorageService } from 'vs/platform/storage/common/storage'; /** * Base class of any core/ui component in the workbench. Examples include services, extensions, parts, viewlets and quick open. @@ -54,12 +54,13 @@ export interface IWorkbenchComponent extends IDisposable { dispose(): void; } -export class WorkbenchComponent implements IWorkbenchComponent { +export class WorkbenchComponent extends Disposable implements IWorkbenchComponent { private _toUnbind: IDisposable[]; private id: string; private componentMemento: Memento; constructor(id: string) { + super(); this._toUnbind = []; this.id = id; this.componentMemento = new Memento(this.id); @@ -89,5 +90,6 @@ export class WorkbenchComponent implements IWorkbenchComponent { public dispose(): void { this._toUnbind = dispose(this._toUnbind); + super.dispose(); } } \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/browser/markersPanel.ts b/src/vs/workbench/parts/markers/browser/markersPanel.ts index 7a280eee158..8a4e7645d1e 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanel.ts @@ -35,6 +35,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import Messages from 'vs/workbench/parts/markers/common/messages'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; import { ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; export class MarkersPanel extends Panel { @@ -59,6 +60,8 @@ export class MarkersPanel extends Panel { private messageBoxContainer: HTMLElement; private messageBox: HTMLElement; + private markerFocusContextKey: IContextKey; + constructor( @IInstantiationService private instantiationService: IInstantiationService, @IMarkerService private markerService: IMarkerService, @@ -66,12 +69,14 @@ export class MarkersPanel extends Panel { @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IEventService private eventService: IEventService, @IConfigurationService private configurationService: IConfigurationService, + @IContextKeyService private contextKeyService: IContextKeyService, @ITelemetryService telemetryService: ITelemetryService ) { super(Constants.MARKERS_PANEL_ID, telemetryService); this.toDispose = []; this.delayedRefresh = new Delayer(500); this.autoExpanded = new Set.ArraySet(); + this.markerFocusContextKey = Constants.MarkerFocusContextKey.bindTo(contextKeyService); } public create(parent: builder.Builder): TPromise { @@ -183,6 +188,13 @@ export class MarkersPanel extends Panel { twistiePixels: 20, ariaLabel: Messages.MARKERS_PANEL_ARIA_LABEL_PROBLEMS_TREE }); + this._register(this.tree.addListener2('focus', (e: { focus: any }) => { + this.markerFocusContextKey.set(e.focus instanceof Marker); + })); + const focusTracker = this._register(dom.trackFocus(this.tree.getHTMLElement())); + focusTracker.addBlurListener(() => { + this.markerFocusContextKey.set(false); + }); } private createActions(): void { @@ -339,6 +351,10 @@ export class MarkersPanel extends Panel { return super.getActionItem(action); } + public getFocusElement(): Resource | Marker { + return this.tree.getFocus(); + } + public dispose(): void { this.delayedRefresh.cancel(); this.toDispose = lifecycle.dispose(this.toDispose); diff --git a/src/vs/workbench/parts/markers/browser/markersTreeController.ts b/src/vs/workbench/parts/markers/browser/markersTreeController.ts index 05b79d9a4a1..6b246e37528 100644 --- a/src/vs/workbench/parts/markers/browser/markersTreeController.ts +++ b/src/vs/workbench/parts/markers/browser/markersTreeController.ts @@ -5,36 +5,37 @@ 'use strict'; import * as errors from 'vs/base/common/errors'; -import mouse = require('vs/base/browser/mouseEvent'); +import { TPromise } from 'vs/base/common/winjs.base'; +import * as mouse from 'vs/base/browser/mouseEvent'; import keyboard = require('vs/base/browser/keyboardEvent'); import tree = require('vs/base/parts/tree/browser/tree'); import treedefaults = require('vs/base/parts/tree/browser/treeDefaults'); import { MarkersModel, Marker } from 'vs/workbench/parts/markers/common/markersModel'; -import Constants from 'vs/workbench/parts/markers/common/constants'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMenuService, IMenu, MenuId } from 'vs/platform/actions/common/actions'; -import { fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; +import { IAction } from 'vs/base/common/actions'; import { Keybinding } from 'vs/base/common/keybinding'; -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { IActionProvider } from 'vs/base/parts/tree/browser/actionsRenderer'; +import { ActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; export class Controller extends treedefaults.DefaultController { - private contributedContextMenu: IMenu; + private contextMenu: IMenu; constructor(private rangeHighlightDecorations: RangeHighlightDecorations, private actionProvider: IActionProvider, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IContextMenuService private contextMenuService: IContextMenuService, @IMenuService menuService: IMenuService, @IContextKeyService contextKeyService: IContextKeyService, + @IKeybindingService private _keybindingService: IKeybindingService, @ITelemetryService private telemetryService: ITelemetryService) { super(); - this.contributedContextMenu = menuService.createMenu(MenuId.ExplorerContext, contextKeyService); - this.downKeyBindingDispatcher.set(Controller.getKeybindingForCopyAction(), (tree: tree.ITree, event: any) => this.onCopy(tree, event)); + this.contextMenu = menuService.createMenu(MenuId.ProblemsPanelContext, contextKeyService); } protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean { @@ -74,27 +75,31 @@ export class Controller extends treedefaults.DefaultController { } public onContextMenu(tree: tree.ITree, element: any, event: tree.ContextMenuEvent): boolean { - if (!this.actionProvider.hasSecondaryActions(tree, element)) { + tree.setFocus(element); + const actions = this._getMenuActions(); + if (!actions.length) { return true; } - const anchor = { x: event.posx + 1, y: event.posy }; this.contextMenuService.showContextMenu({ getAnchor: () => anchor, + getActions: () => { - return this.actionProvider.getSecondaryActions(tree, element).then(actions => { - fillInActions(this.contributedContextMenu, actions); - return actions; - }); + return TPromise.as(actions); }, - getActionItem: this.actionProvider.getActionItem.bind(this.actionProvider, tree, element), - getKeyBinding: (a): Keybinding => Controller.keybindingForAction(a.id), - getActionsContext: (event) => { - return { - element, - event - }; + + getActionItem: (action) => { + const keybinding = this._keybindingFor(action); + if (keybinding) { + return new ActionItem(action, action, { label: true, keybinding: this._keybindingService.getLabelFor(keybinding) }); + } + return null; }, + + getKeyBinding: (action): Keybinding => { + return this._keybindingFor(action); + }, + onHide: (wasCancelled?: boolean) => { if (wasCancelled) { tree.DOMFocus(); @@ -131,40 +136,24 @@ export class Controller extends treedefaults.DefaultController { return false; } - private onCopy(tree: tree.ITree, event: any): boolean { - return this.runAction(tree, Constants.MARKER_COPY_ACTION_ID); + private _getMenuActions(): IAction[] { + const result: IAction[] = []; + const groups = this.contextMenu.getActions(); + + for (let group of groups) { + const [, actions] = group; + result.push(...actions); + result.push(new Separator()); + } + result.pop(); // remove last separator + return result; } - private runAction(tree: tree.ITree, id: string): boolean { - const element = tree.getFocus(); - if (!element) { - return false; + private _keybindingFor(action: IAction): Keybinding { + var opts = this._keybindingService.lookupKeybindings(action.id); + if (opts.length > 0) { + return opts[0]; // only take the first one } - - if (!this.actionProvider.hasSecondaryActions(tree, element)) { - return false; - } - - this.actionProvider.getSecondaryActions(tree, element) - .then(actions => { - for (const action of actions) { - if (action.id === id && action.enabled) { - action.run({ element }); - return; - } - } - }); - - return true; - } - - private static keybindingForAction(id: string): Keybinding { - if (Constants.MARKER_COPY_ACTION_ID === id) { - return new Keybinding(Controller.getKeybindingForCopyAction()); - } - } - - private static getKeybindingForCopyAction(): number { - return KeyMod.CtrlCmd | KeyCode.KEY_C; + return null; } } \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/common/constants.ts b/src/vs/workbench/parts/markers/common/constants.ts index 7af42eb6b9f..d3f122c3856 100644 --- a/src/vs/workbench/parts/markers/common/constants.ts +++ b/src/vs/workbench/parts/markers/common/constants.ts @@ -2,9 +2,12 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; + +import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; export default { MARKERS_PANEL_ID: 'workbench.panel.markers', - MARKER_COPY_ACTION_ID: 'workbench.action.marker.copy' + MARKER_COPY_ACTION_ID: 'problems.action.copy', + + MarkerFocusContextKey: new RawContextKey('problemFocus', false) }; diff --git a/src/vs/workbench/parts/markers/common/markersModel.ts b/src/vs/workbench/parts/markers/common/markersModel.ts index 52dc0b4edb4..6671a020d28 100644 --- a/src/vs/workbench/parts/markers/common/markersModel.ts +++ b/src/vs/workbench/parts/markers/common/markersModel.ts @@ -57,6 +57,15 @@ export class Marker { public get range(): IRange { return this.marker; } + + public toString(): string { + return [`file: '${this.marker.resource}'`, + `severity: '${Severity.toString(this.marker.severity)}'`, + `message: '${this.marker.message}'`, + `at: '${this.marker.startLineNumber},${this.marker.startColumn}'`, + `source: '${this.marker.source ? this.marker.source : ''}'`].join('\n'); + } + } export class FilterOptions { diff --git a/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.ts b/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.ts index abbaf6daaf1..e71ca0fa057 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.ts @@ -3,66 +3,105 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { TPromise } from 'vs/base/common/winjs.base'; -import { Registry } from 'vs/platform/platform'; -import { IAction, Action } from 'vs/base/common/actions'; import { localize } from 'vs/nls'; import { clipboard } from 'electron'; import { Marker } from 'vs/workbench/parts/markers/common/markersModel'; import Constants from 'vs/workbench/parts/markers/common/constants'; -import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import Severity from 'vs/base/common/severity'; +import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; +import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; +import {ContextKeyExpr} from 'vs/platform/contextkey/common/contextkey'; +import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { IKeybindings } from 'vs/platform/keybinding/common/keybinding'; +import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; +import { MarkersPanel } from 'vs/workbench/parts/markers/browser/markersPanel'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -class CopyMarker extends Action { - - public static ID = Constants.MARKER_COPY_ACTION_ID; - - constructor(@IWorkspaceContextService private contextService: IWorkspaceContextService,) { - super(CopyMarker.ID, localize('copyMarker', "Copy")); - } - - public run(context): TPromise { - if (context.element) { - const marker = context.element; - clipboard.writeText(`${this.printFormat(marker)}`); - } - return TPromise.as(true); - } - - private printFormat(marker: Marker): string { - return [`file: '${marker.marker.resource}'`, - `severity: '${Severity.toString(marker.marker.severity)}'`, - `message: '${marker.marker.message}'`, - `at: '${marker.marker.startLineNumber},${marker.marker.startColumn}'`, - `source: '${marker.marker.source ? marker.marker.source : ''}'`].join('\n'); - } -} - -class MarkersViewerActionContributor extends ActionBarContributor { - - constructor(@IInstantiationService private instantiationService: IInstantiationService) { - super(); - } - - public hasSecondaryActions(context: any): boolean { - const element = context.element; - return element instanceof Marker; - } - - public getSecondaryActions(context: any): IAction[] { - const actions: IAction[] = []; - if (this.hasSecondaryActions(context)) { - actions.push(this.instantiationService.createInstance(CopyMarker)); - } - - return actions; - } -} - export function registerContributions(): void { - const actionsRegistry = Registry.as(ActionBarExtensions.Actionbar); - actionsRegistry.registerActionBarContributor(Scope.VIEWER, MarkersViewerActionContributor); + registerAction({ + id: Constants.MARKER_COPY_ACTION_ID, + title: localize('copyMarker', "Copy"), + handler(accessor) { + copyMarker(accessor.get(IPanelService)); + }, + menu: { + menuId: MenuId.ProblemsPanelContext, + when: Constants.MarkerFocusContextKey + }, + keybinding: { + keys: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_C + }, + when: Constants.MarkerFocusContextKey + } + }); +} + +function copyMarker(panelService: IPanelService) { + const activePanel = panelService.getActivePanel(); + if (activePanel instanceof MarkersPanel) { + const element = (activePanel).getFocusElement(); + if (element instanceof Marker) { + clipboard.writeText(`${element}`); + } + } +} + +interface IActionDescriptor { + id: string; + handler: ICommandHandler; + + // ICommandUI + title: string; + category?: string; + iconClass?: string; + f1?: boolean; + + // + menu?: { + menuId: MenuId, + when?: ContextKeyExpr; + group?: string; + }; + + // + keybinding?: { + when?: ContextKeyExpr; + weight?: number; + keys: IKeybindings; + }; +} + +function registerAction(desc: IActionDescriptor) { + + const {id, handler, title, category, iconClass, menu, keybinding} = desc; + + // 1) register as command + CommandsRegistry.registerCommand(id, handler); + + // 2) menus + let command = { id, title, iconClass, category }; + if (menu) { + let {menuId, when, group} = menu; + MenuRegistry.appendMenuItem(menuId, { + command, + when, + group + }); + } + + // 3) keybindings + if (keybinding) { + let {when, weight, keys} = keybinding; + KeybindingsRegistry.registerKeybindingRule({ + id, + when, + weight, + primary: keys.primary, + secondary: keys.secondary, + linux: keys.linux, + mac: keys.mac, + win: keys.win + }); + } } \ No newline at end of file From 321bed74e2a86bafbea83fe2aa7c65da721c1f76 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Oct 2016 15:55:35 +0200 Subject: [PATCH 428/433] tests #13115 --- .../markers/test/common/markersModel.test.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/markers/test/common/markersModel.test.ts b/src/vs/workbench/parts/markers/test/common/markersModel.test.ts index e4be9d7b25a..6ea1c12e361 100644 --- a/src/vs/workbench/parts/markers/test/common/markersModel.test.ts +++ b/src/vs/workbench/parts/markers/test/common/markersModel.test.ts @@ -120,6 +120,13 @@ suite('MarkersModel Test', () => { assert.equal(actuals[14].marker, marker4); }); + test('toString()', function () { + assert.equal(`file: 'file:///a/res1'\nseverity: 'Error'\nmessage: 'some message'\nat: '10,5'\nsource: 'tslint'`, new Marker('', aMarker('a/res1')).toString()); + assert.equal(`file: 'file:///a/res2'\nseverity: 'Warning'\nmessage: 'some message'\nat: '10,5'\nsource: 'tslint'`, new Marker('', aMarker('a/res2', Severity.Warning)).toString()); + assert.equal(`file: 'file:///a/res2'\nseverity: 'Info'\nmessage: 'Info'\nat: '1,2'\nsource: ''`, new Marker('', aMarker('a/res2', Severity.Info, 1, 2, 1, 8, 'Info', '')).toString()); + assert.equal(`file: 'file:///a/res2'\nseverity: ''\nmessage: 'Ignore message'\nat: '1,2'\nsource: 'Ignore'`, new Marker('', aMarker('a/res2', Severity.Ignore, 1, 2, 1, 8, 'Ignore message', 'Ignore')).toString()); + }); + function hasMarker(markers:Marker[], marker:IMarker):boolean { return markers.filter((m):boolean => { return m.marker === marker; @@ -172,17 +179,19 @@ suite('MarkersModel Test', () => { startColumn:number=5, endLineNumber:number= startLineNumber + 1, endColumn:number=startColumn + 5, - message:string='some message' + message: string = 'some message', + source: string = 'tslint' ):IMarker { return { owner: 'someOwner', resource: URI.file(resource), - severity: severity, - message: message, - startLineNumber: startLineNumber, - startColumn: startColumn, - endLineNumber: endLineNumber, - endColumn: endColumn + severity, + message, + startLineNumber, + startColumn, + endLineNumber, + endColumn, + source }; } }); \ No newline at end of file From b9513f5dec5d4224578eb569aba99dc56572c805 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 16:03:42 +0200 Subject: [PATCH 429/433] fix flaky tests --- .../textfile/test/textFileEditorModel.test.ts | 8 +++++++- .../test/textFileEditorModelManager.test.ts | 20 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts b/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts index fb26e7c328c..7bef48631c7 100644 --- a/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts @@ -17,13 +17,14 @@ import {ITextFileService, ModelState, StateChange} from 'vs/workbench/services/t import {workbenchInstantiationService, TestTextFileService, createFileInput} from 'vs/test/utils/servicesTestUtils'; import {TextFileEditorModelManager} from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import {FileOperationResult, IFileOperationResult} from 'vs/platform/files/common/files'; +import {IModelService} from 'vs/editor/common/services/modelService'; function toResource(path) { return URI.file(paths.join('C:\\', path)); } class ServiceAccessor { - constructor( @IEventService public eventService: IEventService, @ITextFileService public textFileService: TestTextFileService) { + constructor( @IEventService public eventService: IEventService, @ITextFileService public textFileService: TestTextFileService, @IModelService public modelService: IModelService) { } } @@ -54,6 +55,7 @@ suite('Files - TextFileEditorModel', () => { assert.ok(!model.isDirty()); model.dispose(); + assert.ok(!accessor.modelService.getModel(model.getResource())); done(); }); @@ -112,6 +114,8 @@ suite('Files - TextFileEditorModel', () => { model.dispose(); + assert.ok(!accessor.modelService.getModel(model.getResource())); + done(); }); }); @@ -231,6 +235,8 @@ suite('Files - TextFileEditorModel', () => { model.dispose(); + assert.ok(!accessor.modelService.getModel(model.getResource())); + done(); }); }); diff --git a/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts b/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts index 433bf428166..43ec9b89b61 100644 --- a/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts @@ -17,11 +17,13 @@ import {TextFileEditorModel} from 'vs/workbench/services/textfile/common/textFil import {IEventService} from 'vs/platform/event/common/event'; import {LocalFileChangeEvent} from 'vs/workbench/services/textfile/common/textfiles'; import {FileChangesEvent, EventType as CommonFileEventType, FileChangeType} from 'vs/platform/files/common/files'; +import {IModelService} from 'vs/editor/common/services/modelService'; class ServiceAccessor { constructor( @IEditorGroupService public editorGroupService: TestEditorGroupService, - @IEventService public eventService: IEventService + @IEventService public eventService: IEventService, + @IModelService public modelService: IModelService ) { } } @@ -159,6 +161,8 @@ suite('Files - TextFileEditorModelManager', () => { assert.ok(model.isDisposed()); model.dispose(); + assert.ok(!accessor.modelService.getModel(model.getResource())); + manager.dispose(); }); @@ -178,6 +182,7 @@ suite('Files - TextFileEditorModelManager', () => { assert.ok(model.isDisposed()); model.dispose(); + assert.ok(!accessor.modelService.getModel(model.getResource())); manager.dispose(); }); @@ -196,6 +201,7 @@ suite('Files - TextFileEditorModelManager', () => { accessor.eventService.emit('files.internal:fileChanged', new LocalFileChangeEvent(toStat(resource), toStat(toResource('/path/index_moved.txt')))); assert.ok(model.isDisposed()); + assert.ok(!accessor.modelService.getModel(model.getResource())); manager.dispose(); }); @@ -214,6 +220,7 @@ suite('Files - TextFileEditorModelManager', () => { accessor.eventService.emit(CommonFileEventType.FILE_CHANGES, new FileChangesEvent([{ resource, type: FileChangeType.DELETED }])); assert.ok(model.isDisposed()); + assert.ok(!accessor.modelService.getModel(model.getResource())); manager.dispose(); }); @@ -232,6 +239,7 @@ suite('Files - TextFileEditorModelManager', () => { accessor.eventService.emit(CommonFileEventType.FILE_CHANGES, new FileChangesEvent([{ resource, type: FileChangeType.UPDATED }])); assert.ok(model.isDisposed()); + assert.ok(!accessor.modelService.getModel(model.getResource())); manager.dispose(); }); @@ -256,6 +264,8 @@ suite('Files - TextFileEditorModelManager', () => { assert.ok(!model.isDisposed()); model.dispose(); + assert.ok(!accessor.modelService.getModel(model.getResource())); + manager.dispose(); done(); }); @@ -311,6 +321,12 @@ suite('Files - TextFileEditorModelManager', () => { assert.equal(savedCounter, 1); assert.equal(encodingCounter, 2); + model1.dispose(); + model2.dispose(); + + assert.ok(!accessor.modelService.getModel(resource1)); + assert.ok(!accessor.modelService.getModel(resource2)); + done(); }); }); @@ -328,6 +344,8 @@ suite('Files - TextFileEditorModelManager', () => { model.dispose(); assert.ok(!manager.get(resource)); + assert.ok(!accessor.modelService.getModel(model.getResource())); + manager.dispose(); done(); }); From 20a41366eb9f99387eeea5eb2968e96b520eb33f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Oct 2016 16:14:46 +0200 Subject: [PATCH 430/433] Use register from dispose class --- .../terminal/electron-browser/terminalPanel.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 2a1a9853f3d..c1285be607a 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import DOM = require('vs/base/browser/dom'); -import lifecycle = require('vs/base/common/lifecycle'); import nls = require('vs/nls'); import platform = require('vs/base/common/platform'); import { Action, IAction } from 'vs/base/common/actions'; @@ -35,7 +34,6 @@ export class TerminalPanel extends Panel { private _parentDomElement: HTMLElement; private _terminalContainer: HTMLElement; private _themeStyleElement: HTMLElement; - private _toDispose: lifecycle.IDisposable[]; constructor( @IConfigurationService private _configurationService: IConfigurationService, @@ -47,8 +45,6 @@ export class TerminalPanel extends Panel { @ITelemetryService telemetryService: ITelemetryService ) { super(TERMINAL_PANEL_ID, telemetryService); - - this._toDispose = []; } public create(parent: Builder): TPromise { @@ -68,8 +64,8 @@ export class TerminalPanel extends Panel { this._terminalService.setContainers(this.getContainer(), this._terminalContainer); - this._toDispose.push(this._themeService.onDidColorThemeChange(this._updateTheme.bind(this))); - this._toDispose.push(this._configurationService.onDidUpdateConfiguration(this._updateConfig.bind(this))); + this._register(this._themeService.onDidColorThemeChange(this._updateTheme.bind(this))); + this._register(this._configurationService.onDidUpdateConfiguration(this._updateConfig.bind(this))); this._updateTheme(); this._updateConfig(); @@ -111,7 +107,7 @@ export class TerminalPanel extends Panel { this._instantiationService.createInstance(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.PANEL_LABEL) ]; this._actions.forEach(a => { - this._toDispose.push(a); + this._register(a); }); } return this._actions; @@ -126,7 +122,7 @@ export class TerminalPanel extends Panel { this._instantiationService.createInstance(TerminalPasteAction, TerminalPasteAction.ID, nls.localize('paste', "Paste")) ]; this._contextMenuActions.forEach(a => { - this._toDispose.push(a); + this._register(a); }); } return this._contextMenuActions; @@ -145,7 +141,7 @@ export class TerminalPanel extends Panel { } private _attachEventListeners(): void { - this._toDispose.push(DOM.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => { + this._register(DOM.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => { if (this._terminalService.terminalInstances.length === 0) { return; } @@ -176,7 +172,7 @@ export class TerminalPanel extends Panel { }); } })); - this._toDispose.push(DOM.addDisposableListener(this._parentDomElement, 'click', (event) => { + this._register(DOM.addDisposableListener(this._parentDomElement, 'click', (event) => { if (this._terminalService.terminalInstances.length === 0) { return; } @@ -185,7 +181,7 @@ export class TerminalPanel extends Panel { this._terminalService.getActiveInstance().focus(); } })); - this._toDispose.push(DOM.addDisposableListener(this._parentDomElement, 'keyup', (event: KeyboardEvent) => { + this._register(DOM.addDisposableListener(this._parentDomElement, 'keyup', (event: KeyboardEvent) => { if (event.keyCode === 27) { // Keep terminal open on escape event.stopPropagation(); From 809cef10e5e0125213feb0ed7be099c04cdb1e47 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 5 Oct 2016 17:31:21 +0200 Subject: [PATCH 431/433] Fixes #11417: Adopt native-keymap@0.3.0 --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 76aace80bf5..0b3fd12858e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -288,9 +288,9 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz" }, "native-keymap": { - "version": "0.2.0", - "from": "native-keymap@0.2.0", - "resolved": "https://registry.npmjs.org/native-keymap/-/native-keymap-0.2.0.tgz" + "version": "0.3.0", + "from": "native-keymap@0.3.0", + "resolved": "https://registry.npmjs.org/native-keymap/-/native-keymap-0.3.0.tgz" }, "normalize-path": { "version": "2.0.1", diff --git a/package.json b/package.json index 7771417ae5d..8ad3c9f600f 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "https-proxy-agent": "0.3.6", "iconv-lite": "0.4.13", "minimist": "1.2.0", - "native-keymap": "0.2.0", + "native-keymap": "0.3.0", "pty.js": "https://github.com/Tyriar/pty.js/tarball/fffbf86eb9e8051b5b2be4ba9c7b07faa018ce8d", "semver": "4.3.6", "vscode-debugprotocol": "1.13.0", From 742fb52847702adeff0d6f1603d32c02c90b1ba7 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 4 Oct 2016 08:35:15 -0700 Subject: [PATCH 432/433] Fit watermark into code org (fixes #13069) --- src/vs/test/utils/servicesTestUtils.ts | 4 + .../workbench/electron-browser/workbench.ts | 13 ++- .../watermark/{ => browser}/watermark.css | 0 .../parts/watermark/browser/watermark.ts | 101 ++++++++++++++++++ src/vs/workbench/parts/watermark/watermark.ts | 62 ----------- .../services/part/common/partService.ts | 5 + src/vs/workbench/workbench.main.ts | 2 + 7 files changed, 118 insertions(+), 69 deletions(-) rename src/vs/workbench/parts/watermark/{ => browser}/watermark.css (100%) create mode 100644 src/vs/workbench/parts/watermark/browser/watermark.ts delete mode 100644 src/vs/workbench/parts/watermark/watermark.ts diff --git a/src/vs/test/utils/servicesTestUtils.ts b/src/vs/test/utils/servicesTestUtils.ts index 61bebb26e11..b39619fe14e 100644 --- a/src/vs/test/utils/servicesTestUtils.ts +++ b/src/vs/test/utils/servicesTestUtils.ts @@ -230,6 +230,10 @@ export class TestPartService implements IPartService { return true; } + public getContainer(part): HTMLElement { + return null; + } + public isStatusBarHidden(): boolean { return false; } diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 6832aa0ba59..312f5568829 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -74,7 +74,6 @@ import {MenuService} from 'vs/platform/actions/common/menuService'; import {IContextMenuService} from 'vs/platform/contextview/browser/contextView'; import {IEnvironmentService} from 'vs/platform/environment/common/environment'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; -import * as watermark from 'vs/workbench/parts/watermark/watermark'; export const MessagesVisibleContext = new RawContextKey('globalMessageVisible', false); export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); @@ -470,6 +469,11 @@ export class Workbench implements IPartService { return false; } + const container = this.getContainer(part); + return DOM.isAncestor(activeElement, container); + } + + public getContainer(part: Parts): HTMLElement { let container: Builder = null; switch (part) { case Parts.ACTIVITYBAR_PART: @@ -488,8 +492,7 @@ export class Workbench implements IPartService { container = this.statusbarPart.getContainer(); break; } - - return DOM.isAncestor(activeElement, container.getHTMLElement()); + return container && container.getHTMLElement(); } public isVisible(part: Parts): boolean { @@ -783,10 +786,6 @@ export class Workbench implements IPartService { role: 'main' }); - if (this.telemetryService.getExperiments().showCommandsWatermark) { - this.toDispose.push(watermark.create(editorContainer, this.keybindingService)); - } - this.editorPart.create(editorContainer); } diff --git a/src/vs/workbench/parts/watermark/watermark.css b/src/vs/workbench/parts/watermark/browser/watermark.css similarity index 100% rename from src/vs/workbench/parts/watermark/watermark.css rename to src/vs/workbench/parts/watermark/browser/watermark.css diff --git a/src/vs/workbench/parts/watermark/browser/watermark.ts b/src/vs/workbench/parts/watermark/browser/watermark.ts new file mode 100644 index 00000000000..337dea4b52d --- /dev/null +++ b/src/vs/workbench/parts/watermark/browser/watermark.ts @@ -0,0 +1,101 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import 'vs/css!./watermark'; +import { $ } from 'vs/base/browser/builder'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import * as nls from 'vs/nls'; +import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; +import { Registry } from 'vs/platform/platform'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; + +const entries = [ + { + text: nls.localize('watermark.showCommands', "Command Palette"), + ids: ['workbench.action.showCommands'] + }, + { + text: nls.localize('watermark.quickOpen', "Go to File"), + ids: ['workbench.action.quickOpen'] + }, + { + text: nls.localize('watermark.moveLines', "Move Lines Up/Down"), + ids: ['editor.action.moveLinesUpAction', 'editor.action.moveLinesDownAction'] + }, + { + text: nls.localize('watermark.addCursor', "Add Cursors Above/Below"), + ids: ['editor.action.insertCursorAbove', 'editor.action.insertCursorBelow'] + }, + { + text: nls.localize('watermark.toggleTerminal', "Toggle Terminal"), + ids: ['workbench.action.terminal.toggleTerminal'] + }, +]; + +const UNBOUND = nls.localize('watermark.unboundCommand', "unbound"); + +export class WatermarkContribution implements IWorkbenchContribution { + + private toDispose: IDisposable[] = []; + + constructor( + @ILifecycleService lifecycleService: ILifecycleService, + @IPartService private partService: IPartService, + @IKeybindingService private keybindingService: IKeybindingService, + @ITelemetryService telemetryService: ITelemetryService + ) { + if (telemetryService.getExperiments().showCommandsWatermark) { + lifecycleService.onShutdown(this.dispose, this); + this.partService.joinCreation().then(() => { + this.create(); + }); + } + } + + public getId() { + return 'vs.watermark'; + } + + private create(): void { + const container = this.partService.getContainer(Parts.EDITOR_PART); + const watermark = $() + .div({ 'class': 'watermark' }); + const box = $(watermark) + .div({ 'class': 'watermark-box' }); + const update = () => { + const builder = $(box); + builder.clearChildren(); + entries.map(entry => { + builder.element('dl', {}, dl => { + dl.element('dt', {}, dt => dt.text(entry.text)); + dl.element('dd', {}, dd => dd.innerHtml( + entry.ids + .map(id => this.keybindingService.lookupKeybindings(id).slice(0, 1) + .map(k => `${this.keybindingService.getLabelFor(k)}`) + .join('') || UNBOUND) + .join(' / ') + )); + }); + }); + }; + update(); + watermark.build(container, 0); + $(container) + .addClass('has-watermark'); + this.toDispose.push(this.keybindingService.onDidUpdateKeybindings(update)); + } + + public dispose(): void { + this.toDispose = dispose(this.toDispose); + } +} + +Registry.as(WorkbenchExtensions.Workbench) + .registerWorkbenchContribution(WatermarkContribution); diff --git a/src/vs/workbench/parts/watermark/watermark.ts b/src/vs/workbench/parts/watermark/watermark.ts deleted file mode 100644 index 3edbb99419c..00000000000 --- a/src/vs/workbench/parts/watermark/watermark.ts +++ /dev/null @@ -1,62 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import 'vs/css!./watermark'; -import {Builder, $} from 'vs/base/browser/builder'; -import {IDisposable} from 'vs/base/common/lifecycle'; -import {IKeybindingService} from 'vs/platform/keybinding/common/keybinding'; -import * as nls from 'vs/nls'; - -const entries = [ - { - text: nls.localize('watermark.showCommands', "Command Palette"), - ids: ['workbench.action.showCommands'] - }, - { - text: nls.localize('watermark.quickOpen', "Go to File"), - ids: ['workbench.action.quickOpen'] - }, - { - text: nls.localize('watermark.moveLines', "Move Lines Up/Down"), - ids: ['editor.action.moveLinesUpAction', 'editor.action.moveLinesDownAction'] - }, - { - text: nls.localize('watermark.addCursor', "Add Cursors Above/Below"), - ids: ['editor.action.insertCursorAbove', 'editor.action.insertCursorBelow'] - }, - { - text: nls.localize('watermark.toggleTerminal', "Toggle Terminal"), - ids: ['workbench.action.terminal.toggleTerminal'] - }, -]; - -const UNBOUND = nls.localize('watermark.unboundCommand', "unbound"); - -export function create(container: Builder, keybindingService: IKeybindingService): IDisposable { - const watermark = $(container) - .addClass('has-watermark') - .div({ 'class': 'watermark' }); - const box = $(watermark) - .div({ 'class': 'watermark-box' }); - function update() { - const builder = $(box); - builder.clearChildren(); - entries.map(entry => { - builder.element('dl', {}, dl => { - dl.element('dt', {}, dt => dt.text(entry.text)); - dl.element('dd', {}, dd => dd.innerHtml( - entry.ids - .map(id => keybindingService.lookupKeybindings(id).slice(0, 1) - .map(k => `${keybindingService.getLabelFor(k)}`) - .join('') || UNBOUND) - .join(' / ') - )); - }); - }); - } - update(); - return keybindingService.onDidUpdateKeybindings(update); -} diff --git a/src/vs/workbench/services/part/common/partService.ts b/src/vs/workbench/services/part/common/partService.ts index aacd8950c57..4c935db776c 100644 --- a/src/vs/workbench/services/part/common/partService.ts +++ b/src/vs/workbench/services/part/common/partService.ts @@ -45,6 +45,11 @@ export interface IPartService { */ hasFocus(part: Parts): boolean; + /** + * Returns the parts HTML element, if there is one. + */ + getContainer(part: Parts): HTMLElement; + /** * Returns iff the part is visible. */ diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b7198436d14..8c5d2b08734 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -93,3 +93,5 @@ import 'vs/workbench/electron-browser/main.contribution'; import 'vs/workbench/electron-browser/main'; import 'vs/workbench/parts/themes/test/electron-browser/themes.test.contribution'; + +import 'vs/workbench/parts/watermark/browser/watermark'; \ No newline at end of file From 61328fd66c7bff7aad4e61f37e18373569c19768 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Oct 2016 19:28:16 +0200 Subject: [PATCH 433/433] =?UTF-8?q?=F0=9F=92=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vs/platform/editor/common/editor.ts | 3 ++- src/vs/workbench/api/node/mainThreadDocuments.ts | 4 ++++ .../workbench/parts/files/browser/editors/textFileEditor.ts | 6 ++---- src/vs/workbench/services/editor/browser/editorService.ts | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/editor/common/editor.ts b/src/vs/platform/editor/common/editor.ts index 9b7cc2e9f5e..389538ef883 100644 --- a/src/vs/platform/editor/common/editor.ts +++ b/src/vs/platform/editor/common/editor.ts @@ -8,6 +8,7 @@ import URI from 'vs/base/common/uri'; import {TPromise} from 'vs/base/common/winjs.base'; import {createDecorator} from 'vs/platform/instantiation/common/instantiation'; import Event from 'vs/base/common/event'; +import {IDisposable} from 'vs/base/common/lifecycle'; export const IEditorService = createDecorator('editorService'); @@ -127,7 +128,7 @@ export enum Direction { RIGHT } -export interface IEditorInput { +export interface IEditorInput extends IDisposable { onDispose: Event; diff --git a/src/vs/workbench/api/node/mainThreadDocuments.ts b/src/vs/workbench/api/node/mainThreadDocuments.ts index c106c5e4073..ecd9ee3ebf0 100644 --- a/src/vs/workbench/api/node/mainThreadDocuments.ts +++ b/src/vs/workbench/api/node/mainThreadDocuments.ts @@ -252,6 +252,10 @@ export class MainThreadDocuments extends MainThreadDocumentsShape { if (!this._editorService.isVisible(input, true)) { toBeDisposed.push(resource); } + + if (input) { + input.dispose(); + } }); })).then(() => { for (let resource of toBeDisposed) { diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index d4faecd8ab5..d111e897e38 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -199,10 +199,8 @@ export class TextFileEditor extends BaseTextEditor { } private openAsBinary(input: FileEditorInput, options: EditorOptions): void { - const fileInputBinary = this.instantiationService.createInstance(FileEditorInput, input.getResource(), void 0); - fileInputBinary.setForceOpenAsBinary(); - - this.editorService.openEditor(fileInputBinary, options, this.position).done(null, errors.onUnexpectedError); + input.setForceOpenAsBinary(); + this.editorService.openEditor(input, options, this.position).done(null, errors.onUnexpectedError); } private openAsFolder(input: FileEditorInput): boolean { diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index bfbbbeaaa1c..37021f28a3d 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -69,7 +69,7 @@ export class WorkbenchEditorService implements IWorkbenchEditorService { return false; } - return this.getVisibleEditors().some((editor) => { + return this.getVisibleEditors().some(editor => { if (!editor.input) { return false; } @@ -107,6 +107,7 @@ export class WorkbenchEditorService implements IWorkbenchEditorService { const schema = resourceInput.resource.scheme; if (schema === network.Schemas.http || schema === network.Schemas.https) { window.open(resourceInput.resource.toString(true)); + return TPromise.as(null); } }