;
diff --git a/src/vs/editor/common/modes/textToHtmlTokenizer.ts b/src/vs/editor/common/modes/textToHtmlTokenizer.ts
index 9ad94baf5e7..cf1d060c186 100644
--- a/src/vs/editor/common/modes/textToHtmlTokenizer.ts
+++ b/src/vs/editor/common/modes/textToHtmlTokenizer.ts
@@ -8,11 +8,101 @@ import * as strings from 'vs/base/common/strings';
import { IState, ITokenizationSupport, TokenizationRegistry, LanguageId } from 'vs/editor/common/modes';
import { NULL_STATE, nullTokenize2 } from 'vs/editor/common/modes/nullMode';
import { LineTokens } from 'vs/editor/common/core/lineTokens';
+import { CharCode } from 'vs/base/common/charCode';
+import { ViewLineToken } from 'vs/editor/common/core/viewLineToken';
export function tokenizeToString(text: string, languageId: string): string {
return _tokenizeToString(text, _getSafeTokenizationSupport(languageId));
}
+export function tokenizeLineToHTML(text: string, viewLineTokens: ViewLineToken[], rules: { [key: string]: string }, options: { startOffset: number, endOffset: number, tabSize: number }): string {
+ let tabSize = options.tabSize;
+ let result = ``;
+ let charIndex = options.startOffset;
+ let tabsCharDelta = 0;
+
+ for (let tokenIndex = 0, lenJ = viewLineTokens.length; tokenIndex < lenJ; tokenIndex++) {
+ const token = viewLineTokens[tokenIndex];
+ const tokenEndIndex = token.endIndex;
+
+ if (token.endIndex < options.startOffset) {
+ continue;
+ }
+
+ const tokenType = token.type;
+ let partContentCnt = 0;
+ let partContent = '';
+
+ for (; charIndex < tokenEndIndex && charIndex < options.endOffset; charIndex++) {
+ const charCode = text.charCodeAt(charIndex);
+
+ switch (charCode) {
+ case CharCode.Tab:
+ let insertSpacesCount = tabSize - (charIndex + tabsCharDelta) % tabSize;
+ tabsCharDelta += insertSpacesCount - 1;
+ while (insertSpacesCount > 0) {
+ partContent += ' ';
+ partContentCnt++;
+ insertSpacesCount--;
+ }
+ break;
+
+ case CharCode.Space:
+ partContent += ' ';
+ partContentCnt++;
+ break;
+
+ case CharCode.LessThan:
+ partContent += '<';
+ partContentCnt++;
+ break;
+
+ case CharCode.GreaterThan:
+ partContent += '>';
+ partContentCnt++;
+ break;
+
+ case CharCode.Ampersand:
+ partContent += '&';
+ partContentCnt++;
+ break;
+
+ case CharCode.Null:
+ partContent += '';
+ partContentCnt++;
+ break;
+
+ case CharCode.UTF8_BOM:
+ case CharCode.LINE_SEPARATOR_2028:
+ partContent += '\ufffd';
+ partContentCnt++;
+ break;
+
+ case CharCode.CarriageReturn:
+ // zero width space, because carriage return would introduce a line break
+ partContent += '';
+ partContentCnt++;
+ break;
+
+ default:
+ partContent += String.fromCharCode(charCode);
+ partContentCnt++;
+ }
+ }
+
+ // TODO: adopt new view line tokens.
+ let style = tokenType.split(' ').map(type => rules[type]).join('');
+ result += `${partContent}`;
+
+ if (token.endIndex > options.endOffset) {
+ break;
+ }
+ }
+
+ result += `
`;
+ return result;
+}
+
function _getSafeTokenizationSupport(languageId: string): ITokenizationSupport {
let tokenizationSupport = TokenizationRegistry.get(languageId);
if (tokenizationSupport) {
diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts
index 9ce04658699..e513984f268 100644
--- a/src/vs/editor/common/viewModel/viewModel.ts
+++ b/src/vs/editor/common/viewModel/viewModel.ts
@@ -88,6 +88,9 @@ export interface IViewModel extends IEventEmitter {
getModelLineContent(modelLineNumber: number): string;
getModelLineMaxColumn(modelLineNumber: number): number;
validateModelPosition(modelPosition: IPosition): Position;
+
+ getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string;
+ getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string;
}
export class MinimapLinesRenderingData {
diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts
index 1793f09a553..d258214b220 100644
--- a/src/vs/editor/common/viewModel/viewModelImpl.ts
+++ b/src/vs/editor/common/viewModel/viewModelImpl.ts
@@ -11,6 +11,8 @@ import { Position } from 'vs/editor/common/core/position';
import { Range } from 'vs/editor/common/core/range';
import { Selection } from 'vs/editor/common/core/selection';
import * as editorCommon from 'vs/editor/common/editorCommon';
+import { TokenizationRegistry } from 'vs/editor/common/modes';
+import { tokenizeLineToHTML } from 'vs/editor/common/modes/textToHtmlTokenizer';
import { ViewModelCursors } from 'vs/editor/common/viewModel/viewModelCursors';
import { ViewModelDecorations } from 'vs/editor/common/viewModel/viewModelDecorations';
import { MinimapLinesRenderingData, ViewLineRenderingData, ViewModelDecoration, IViewModel, ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel';
@@ -566,4 +568,99 @@ export class ViewModel extends EventEmitter implements IViewModel {
public validateModelPosition(position: editorCommon.IPosition): Position {
return this.model.validatePosition(position);
}
+
+ public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string {
+ let newLineCharacter = this.getEOL();
+
+ if (ranges.length === 1) {
+ let range: Range = ranges[0];
+ if (range.isEmpty()) {
+ if (enableEmptySelectionClipboard) {
+ let modelLineNumber = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber;
+ return this.getModelLineContent(modelLineNumber) + newLineCharacter;
+ } else {
+ return '';
+ }
+ }
+
+ return this.getValueInRange(range, editorCommon.EndOfLinePreference.TextDefined);
+ } else {
+ ranges = ranges.slice(0).sort(Range.compareRangesUsingStarts);
+ let result: string[] = [];
+ for (let i = 0; i < ranges.length; i++) {
+ result.push(this.getValueInRange(ranges[i], editorCommon.EndOfLinePreference.TextDefined));
+ }
+
+ return result.join(newLineCharacter);
+ }
+ }
+
+ public getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string {
+ // TODO: adopt new view line tokens.
+ let rules: { [key: string]: string } = {};
+ let colorMap = TokenizationRegistry.getColorMap();
+ for (let i = 1, len = colorMap.length; i < len; i++) {
+ let color = colorMap[i];
+ if (/^(?:[0-9a-fA-F]{3}){1,2}$/.test(color)) {
+ color = '#' + color;
+ }
+ rules[`mtk${i}`] = `color: ${color};`;
+ }
+ rules['mtki'] = 'font-style: italic;';
+ rules['mtkb'] = 'font-weight: bold;';
+ rules['mtku'] = 'text-decoration: underline;';
+
+ let defaultForegroundColor = /^(?:[0-9a-fA-F]{3}){1,2}$/.test(colorMap[1]) ? '#' + colorMap[1] : colorMap[1];
+ let defaultBackgroundColor = /^(?:[0-9a-fA-F]{3}){1,2}$/.test(colorMap[2]) ? '#' + colorMap[2] : colorMap[2];
+
+ let fontInfo = this.configuration.editor.fontInfo;
+
+ let output = ``;
+
+ if (ranges.length === 1) {
+ let range: Range = ranges[0];
+
+ if (range.isEmpty()) {
+ if (enableEmptySelectionClipboard) {
+ let modelLineNumber = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber;
+ let viewLineStart = new Position(range.startLineNumber, 1);
+ let viewLineEnd = new Position(range.startLineNumber, this.getLineMaxColumn(range.startLineNumber));
+ let startOffset = this.coordinatesConverter.convertViewPositionToModelPosition(viewLineStart).column - 1;
+ let endOffset = this.coordinatesConverter.convertViewPositionToModelPosition(viewLineEnd).column - 1;
+ let viewLineRenderingData = this.getViewLineRenderingData(new Range(viewLineStart.lineNumber, viewLineStart.column, viewLineEnd.lineNumber, viewLineEnd.column), modelLineNumber);
+ let html = tokenizeLineToHTML(this.getModelLineContent(modelLineNumber),
+ viewLineRenderingData.tokens,
+ rules,
+ {
+ startOffset: startOffset,
+ endOffset: endOffset,
+ tabSize: this.getTabSize()
+ });
+ output += `${html}`;
+ } else {
+ return '';
+ }
+ } else {
+ for (let i = 0, lineCount = range.endLineNumber - range.startLineNumber; i <= lineCount; i++) {
+ let viewLineRenderingData = this.getViewLineRenderingData(range, range.startLineNumber + i);
+ let lineContent = viewLineRenderingData.content;
+ let startOffset = i === 0 ? range.startColumn - 1 : 0;
+ let endOffset = i === lineCount ? range.endColumn - 1 : lineContent.length;
+
+ let html = tokenizeLineToHTML(lineContent, viewLineRenderingData.tokens, rules,
+ {
+ startOffset: startOffset,
+ endOffset: endOffset,
+ tabSize: this.getTabSize()
+ });
+ output += `${html}`;
+ }
+ }
+ }
+
+ output += '
';
+
+ return output;
+ }
}
diff --git a/src/vs/editor/contrib/clipboard/browser/clipboard.ts b/src/vs/editor/contrib/clipboard/browser/clipboard.ts
index 1714c171e3c..e1d576c415d 100644
--- a/src/vs/editor/contrib/clipboard/browser/clipboard.ts
+++ b/src/vs/editor/contrib/clipboard/browser/clipboard.ts
@@ -25,6 +25,14 @@ function conditionalEditorAction(testCommand: string) {
return editorAction;
}
+function conditionalCopyWithSyntaxHighlighting() {
+ if (browser.isEdgeOrIE || !browser.supportsExecCommand('copy')) {
+ return () => { };
+ }
+
+ return editorAction;
+}
+
abstract class ExecCommandAction extends EditorAction {
private browserCommand: string;
@@ -136,3 +144,36 @@ class ExecCommandPasteAction extends ExecCommandAction {
});
}
}
+
+@conditionalCopyWithSyntaxHighlighting()
+class ExecCommandCopyWithSyntaxHighlightingAction extends ExecCommandAction {
+
+ constructor() {
+ super('copy', {
+ id: 'editor.action.clipboardCopyWithSyntaxHighlightingAction',
+ label: nls.localize('actions.clipboard.copyWithSyntaxHighlightingLabel', "Copy With Syntax Highlighting"),
+ alias: 'Copy With Syntax Highlighting',
+ precondition: null,
+ kbOpts: {
+ kbExpr: EditorContextKeys.TextFocus,
+ primary: null
+ },
+ menuOpts: {
+ group: CLIPBOARD_CONTEXT_MENU_GROUP,
+ order: 2
+ }
+ });
+ }
+
+ public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void {
+ var enableEmptySelectionClipboard = editor.getConfiguration().contribInfo.emptySelectionClipboard && browser.enableEmptySelectionClipboard;
+
+ if (!enableEmptySelectionClipboard && editor.getSelection().isEmpty()) {
+ return;
+ }
+
+ editorCommon.InternalEditorOptions.forceCopyWithSyntaxHighlighting = true;
+ super.run(accessor, editor);
+ editorCommon.InternalEditorOptions.forceCopyWithSyntaxHighlighting = false;
+ }
+}
diff --git a/src/vs/editor/contrib/folding/browser/folding.ts b/src/vs/editor/contrib/folding/browser/folding.ts
index c93d00bd5d7..7edee439119 100644
--- a/src/vs/editor/contrib/folding/browser/folding.ts
+++ b/src/vs/editor/contrib/folding/browser/folding.ts
@@ -505,7 +505,7 @@ abstract class FoldingAction extends EditorAction {
if (!foldingController) {
return;
}
- this.reportTelemetry(accessor);
+ this.reportTelemetry(accessor, editor);
this.invoke(foldingController, editor, args);
}
diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.css b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.css
index 058ef445e0f..2493cde3d82 100644
--- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.css
+++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.css
@@ -3,6 +3,27 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
+.monaco-editor .monaco-editor-overlaymessage {
+ padding-bottom: 8px;
+}
+
+.monaco-editor .monaco-editor-overlaymessage .message {
+ padding: 1px 4px;
+ background: #1382CE;
+ color: white;
+}
+
+.monaco-editor .monaco-editor-overlaymessage .anchor {
+ width: 0 !important;
+ height: 0 !important;
+ border-color: transparent;
+ border-style: solid;
+ z-index: 1000;
+ border-width: 8px;
+ border-top-color: #1382CE;
+ position: absolute;
+}
+
.monaco-editor .preview-zone-widget.preview .monaco-editor,
.monaco-editor .preview-zone-widget.preview .monaco-editor-background,
.monaco-editor .preview-zone-widget.preview .monaco-editor .line-numbers,
diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts
index 18e0271ade8..5a07ce54dc2 100644
--- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts
+++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts
@@ -8,6 +8,7 @@
import 'vs/css!./goToDeclaration';
import * as nls from 'vs/nls';
import { Throttler } from 'vs/base/common/async';
+import { any, filterEvent } from 'vs/base/common/event';
import { onUnexpectedError } from 'vs/base/common/errors';
import { MarkedString } from 'vs/base/common/htmlContent';
import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes';
@@ -24,7 +25,7 @@ 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 { ICodeEditor, IEditorMouseEvent, IMouseTarget, IContentWidget, IContentWidgetPosition, ContentWidgetPositionPreference } from 'vs/editor/browser/editorBrowser';
import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions';
import { getDefinitionsAtPosition, getImplementationsAtPosition, getTypeDefinitionsAtPosition } from 'vs/editor/contrib/goToDeclaration/common/goToDeclaration';
import { ReferencesController } from 'vs/editor/contrib/referenceSearch/browser/referencesController';
@@ -34,16 +35,90 @@ import { PeekContext } from 'vs/editor/contrib/zoneWidget/browser/peekViewWidget
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { ITextModelResolverService } from 'vs/editor/common/services/resolverService';
import * as corePosition from 'vs/editor/common/core/position';
-
import ModeContextKeys = editorCommon.ModeContextKeys;
import EditorContextKeys = editorCommon.EditorContextKeys;
+class MessageOverlay implements IContentWidget {
+
+ private static _last: IDisposable;
+
+ static show(editor: ICodeEditor, pos: editorCommon.IPosition, message: string): void {
+
+ dispose(MessageOverlay._last);
+
+ const widget = new MessageOverlay(message, pos.lineNumber, editor.getOffsetForColumn(pos.lineNumber, pos.column));
+ const remove = () => editor.removeContentWidget(widget);
+ editor.addContentWidget(widget);
+
+ const listener = any(
+ filterEvent(editor.onMouseMove, e => {
+ const { position } = e.target;
+ return Math.abs(position.lineNumber - pos.lineNumber) > 1
+ || Math.abs(position.column - pos.column) > 10;
+ }),
+ editor.onDidChangeCursorPosition,
+ editor.onDidBlurEditorText,
+ editor.onDidDispose,
+ editor.onDidChangeModel
+ )(_ => {
+ listener.dispose();
+ remove();
+ });
+
+
+ MessageOverlay._last = {
+ dispose() {
+ listener.dispose();
+ remove();
+ }
+ };
+ }
+
+ readonly allowEditorOverflow = true;
+ readonly suppressMouseDown = false;
+
+ private _position: editorCommon.IPosition;
+ private _domNode: HTMLDivElement;
+
+ constructor(text: string, lineNumber: number, horizontalOffset: number) {
+ this._position = { lineNumber, column: 1 };
+
+ this._domNode = document.createElement('div');
+ this._domNode.style.paddingLeft = `${horizontalOffset - 6}px`;
+ this._domNode.classList.add('monaco-editor-overlaymessage');
+
+
+ const message = document.createElement('div');
+ message.classList.add('message');
+ message.textContent = text;
+ this._domNode.appendChild(message);
+
+ const anchor = document.createElement('div');
+ anchor.classList.add('anchor');
+ this._domNode.appendChild(anchor);
+ }
+
+ getId(): string {
+ return 'messageoverlay';
+ }
+
+ getDomNode(): HTMLElement {
+ return this._domNode;
+ }
+
+ getPosition(): IContentWidgetPosition {
+ return { position: this._position, preference: [ContentWidgetPositionPreference.ABOVE] };
+ }
+}
+
+
export class DefinitionActionConfig {
constructor(
public openToSide = false,
public openInPeek = false,
- public filterCurrent = true
+ public filterCurrent = true,
+ public noResultsMessage = nls.localize('generic.noResults', "Could not find anything")
) {
//
}
@@ -67,10 +142,6 @@ export class DefinitionAction extends EditorAction {
return this.getDeclarationsAtPosition(model, pos).then(references => {
- if (!references) {
- return;
- }
-
// * remove falsy references
// * remove reference at the current pos
// * collapse ranges to start pos
@@ -80,7 +151,7 @@ export class DefinitionAction extends EditorAction {
if (!reference || !reference.range) {
continue;
}
- let {uri, range} = reference;
+ let { uri, range } = reference;
if (!this._configuration.filterCurrent
|| uri.toString() !== model.uri.toString()
|| !Range.containsPosition(range, pos)) {
@@ -93,6 +164,7 @@ export class DefinitionAction extends EditorAction {
}
if (result.length === 0) {
+ MessageOverlay.show(editor, pos, this._configuration.noResultsMessage);
return;
}
@@ -125,7 +197,7 @@ export class DefinitionAction extends EditorAction {
}
private _openReference(editorService: IEditorService, reference: Location, sideBySide: boolean): TPromise {
- let {uri, range} = reference;
+ let { uri, range } = reference;
return editorService.openEditor({
resource: uri,
options: {
diff --git a/src/vs/editor/contrib/gotoError/browser/gotoError.ts b/src/vs/editor/contrib/gotoError/browser/gotoError.ts
index fe68bf1d150..c759d8b45de 100644
--- a/src/vs/editor/contrib/gotoError/browser/gotoError.ts
+++ b/src/vs/editor/contrib/gotoError/browser/gotoError.ts
@@ -322,7 +322,7 @@ class MarkerNavigationAction extends EditorAction {
}
let model = controller.getOrCreateModel();
- telemetryService.publicLog('zoneWidgetShown', { mode: 'go to error' });
+ telemetryService.publicLog('zoneWidgetShown', { mode: 'go to error', ...editor.getTelemetryData() });
if (model) {
if (this._isNext) {
model.next();
diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts
index 4e1bee69956..99f7bc879d7 100644
--- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts
+++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts
@@ -14,7 +14,7 @@ import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors
import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle';
import { addClass, append, $, hide, removeClass, show, toggleClass } from 'vs/base/browser/dom';
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
-import { IDelegate, IFocusChangeEvent, IRenderer, ISelectionChangeEvent } from 'vs/base/browser/ui/list/list';
+import { IDelegate, IListEvent, IRenderer } from 'vs/base/browser/ui/list/list';
import { List } from 'vs/base/browser/ui/list/listWidget';
import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
@@ -407,7 +407,7 @@ export class SuggestWidget implements IContentWidget, IDelegate
});
}
- private onListSelection(e: ISelectionChangeEvent): void {
+ private onListSelection(e: IListEvent): void {
if (!e.elements.length) {
return;
}
@@ -439,7 +439,7 @@ export class SuggestWidget implements IContentWidget, IDelegate
}
}
- private onListFocus(e: IFocusChangeEvent): void {
+ private onListFocus(e: IListEvent): void {
if (!e.elements.length) {
if (this.currentSuggestionDetails) {
this.currentSuggestionDetails.cancel();
@@ -591,9 +591,9 @@ export class SuggestWidget implements IContentWidget, IDelegate
this.completionModel = null;
} else {
- const {stats} = this.completionModel;
+ const { stats } = this.completionModel;
stats['wasAutomaticallyTriggered'] = !!isAuto;
- this.telemetryService.publicLog('suggestWidget', stats);
+ this.telemetryService.publicLog('suggestWidget', { ...stats, ...this.editor.getTelemetryData() });
this.list.splice(0, this.list.length, this.completionModel.items);
this.list.setFocus([this.completionModel.topScoreIdx]);
@@ -694,7 +694,7 @@ export class SuggestWidget implements IContentWidget, IDelegate
this.setState(State.Details);
this.editor.focus();
- this.telemetryService.publicLog('suggestWidget:toggleDetails');
+ this.telemetryService.publicLog('suggestWidget:toggleDetails', this.editor.getTelemetryData());
}
private show(): void {
diff --git a/src/vs/editor/electron-browser/textMate/TMSyntax.ts b/src/vs/editor/electron-browser/textMate/TMSyntax.ts
index 05d584b9a51..09817ef6d3f 100644
--- a/src/vs/editor/electron-browser/textMate/TMSyntax.ts
+++ b/src/vs/editor/electron-browser/textMate/TMSyntax.ts
@@ -21,6 +21,7 @@ import { grammarsExtPoint, IEmbeddedLanguagesMap, ITMSyntaxExtensionPoint } from
import { TokenizationResult, TokenizationResult2 } from 'vs/editor/common/core/token';
import { TokenMetadata } from 'vs/editor/common/model/tokensBinaryEncoding';
import { nullTokenize2 } from 'vs/editor/common/modes/nullMode';
+import { hexToCSS } from 'vs/base/common/color';
export class TMScopeRegistry {
@@ -153,7 +154,7 @@ export class MainProcessTextMateSyntax implements ITextMateService {
let rules: string[] = [];
for (let i = 1, len = colorMap.length; i < len; i++) {
let color = colorMap[i];
- rules[i] = `.mtk${i} { color: ${color.substr(0, 7)}; }`;
+ rules[i] = `.mtk${i} { color: ${hexToCSS(color)}; }`;
}
rules.push('.mtki { font-style: italic; }');
rules.push('.mtkb { font-weight: bold; }');
diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts
index 6872d63cf9a..02ee516811b 100644
--- a/src/vs/editor/test/browser/controller/imeTester.ts
+++ b/src/vs/editor/test/browser/controller/imeTester.ts
@@ -53,6 +53,14 @@ class SingleLineTestModel implements ISimpleModel {
getLineCount(): number {
return 1;
}
+
+ public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string {
+ return '';
+ }
+
+ public getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string {
+ return '';
+ }
}
class TestView {
@@ -180,4 +188,4 @@ const TESTS = [
TESTS.forEach((t) => {
document.body.appendChild(doCreateTest(TextAreaStrategy.NVDA, t.description, t.in, t.out));
document.body.appendChild(doCreateTest(TextAreaStrategy.IENarrator, t.description, t.in, t.out));
-});
+});
\ No newline at end of file
diff --git a/src/vs/editor/test/common/controller/textAreaState.test.ts b/src/vs/editor/test/common/controller/textAreaState.test.ts
index 959974b9e33..6da10786e1f 100644
--- a/src/vs/editor/test/common/controller/textAreaState.test.ts
+++ b/src/vs/editor/test/common/controller/textAreaState.test.ts
@@ -472,4 +472,12 @@ class SimpleModel implements ISimpleModel {
public getLineCount(): number {
return this._lines.length;
}
+
+ public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string {
+ return '';
+ }
+
+ public getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string {
+ return '';
+ }
}
diff --git a/src/vs/platform/actions/browser/menusExtensionPoint.ts b/src/vs/platform/actions/browser/menusExtensionPoint.ts
index 497a437071f..91cd7b8c64a 100644
--- a/src/vs/platform/actions/browser/menusExtensionPoint.ts
+++ b/src/vs/platform/actions/browser/menusExtensionPoint.ts
@@ -28,6 +28,7 @@ namespace schema {
export function parseMenuId(value: string): MenuId {
switch (value) {
+ case 'commandPalette': return MenuId.CommandPalette;
case 'editor/title': return MenuId.EditorTitle;
case 'editor/context': return MenuId.EditorContext;
case 'explorer/context': return MenuId.ExplorerContext;
@@ -224,7 +225,7 @@ ExtensionsRegistry.registerExtensionPoint(value)) {
for (let command of value) {
handleCommand(command, extension);
@@ -259,7 +260,7 @@ ExtensionsRegistry.registerExtensionPoint('menus', [], schema.menusContribtion).setHandler(extensions => {
for (let extension of extensions) {
- const {value, collector} = extension;
+ const { value, collector } = extension;
forEach(value, entry => {
if (!schema.isValidMenuItems(entry.value, collector)) {
diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts
index 67fe9f67b89..590fd423b9e 100644
--- a/src/vs/platform/actions/common/actions.ts
+++ b/src/vs/platform/actions/common/actions.ts
@@ -21,11 +21,6 @@ export interface ICommandAction {
iconClass?: string;
}
-export interface IMenu extends IDisposable {
- onDidChange: Event;
- getActions(arg?: any): [string, MenuItemAction[]][];
-}
-
export interface IMenuItem {
command: ICommandAction;
alt?: ICommandAction;
@@ -49,6 +44,7 @@ export class MenuId {
static readonly SCMTitle = new MenuId('11');
static readonly SCMResourceGroupContext = new MenuId('12');
static readonly SCMResourceContext = new MenuId('13');
+ static readonly CommandPalette = new MenuId('14');
constructor(private _id: string) {
@@ -59,6 +55,11 @@ export class MenuId {
}
}
+export interface IMenu extends IDisposable {
+ onDidChange: Event;
+ getActions(arg?: any): [string, MenuItemAction[]][];
+}
+
export const IMenuService = createDecorator('menuService');
export interface IMenuService {
@@ -66,8 +67,6 @@ export interface IMenuService {
_serviceBrand: any;
createMenu(id: MenuId, scopedKeybindingService: IContextKeyService): IMenu;
-
- getCommandActions(): ICommandAction[];
}
export interface IMenuRegistry {
@@ -94,7 +93,7 @@ export const MenuRegistry: IMenuRegistry = new class {
return this.commands[id];
}
- appendMenuItem({id}: MenuId, item: IMenuItem): IDisposable {
+ appendMenuItem({ id }: MenuId, item: IMenuItem): IDisposable {
let array = this.menuItems[id];
if (!array) {
this.menuItems[id] = array = [item];
@@ -111,8 +110,30 @@ export const MenuRegistry: IMenuRegistry = new class {
};
}
- getMenuItems({id}: MenuId): IMenuItem[] {
- return this.menuItems[id] || [];
+ getMenuItems({ id }: MenuId): IMenuItem[] {
+ const result = this.menuItems[id] || [];
+
+ if (id === MenuId.CommandPalette.id) {
+ // CommandPalette is special because it shows
+ // all commands by default
+ this._appendImplicitItems(result);
+ }
+ return result;
+ }
+
+ private _appendImplicitItems(result: IMenuItem[]) {
+ const set = new Set();
+ for (const { command, alt } of result) {
+ set.add(command.id);
+ if (alt) {
+ set.add(alt.id);
+ }
+ }
+ for (let id in this.commands) {
+ if (!set.has(id)) {
+ result.push({ command: this.commands[id] });
+ }
+ }
}
};
@@ -202,4 +223,4 @@ export class SyncActionDescriptor {
public get keybindingWeight(): number {
return this._keybindingWeight;
}
-}
\ No newline at end of file
+}
diff --git a/src/vs/platform/actions/common/menu.ts b/src/vs/platform/actions/common/menu.ts
index 621eee3a73a..e4b241d8bb8 100644
--- a/src/vs/platform/actions/common/menu.ts
+++ b/src/vs/platform/actions/common/menu.ts
@@ -21,7 +21,7 @@ export class Menu implements IMenu {
private _onDidChange = new Emitter();
constructor(
- id: MenuId,
+ private id: MenuId,
startupSignal: TPromise,
@ICommandService private _commandService: ICommandService,
@IContextKeyService private _contextKeyService: IContextKeyService
diff --git a/src/vs/platform/actions/common/menuService.ts b/src/vs/platform/actions/common/menuService.ts
index 87d79822189..77ee1f52905 100644
--- a/src/vs/platform/actions/common/menuService.ts
+++ b/src/vs/platform/actions/common/menuService.ts
@@ -5,9 +5,8 @@
'use strict';
-import { values } from 'vs/base/common/collections';
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
-import { MenuId, MenuRegistry, ICommandAction, IMenu, IMenuService } from 'vs/platform/actions/common/actions';
+import { MenuId, IMenu, IMenuService } from 'vs/platform/actions/common/actions';
import { Menu } from 'vs/platform/actions/common/menu';
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
import { ICommandService } from 'vs/platform/commands/common/commands';
@@ -26,8 +25,4 @@ export class MenuService implements IMenuService {
createMenu(id: MenuId, contextKeyService: IContextKeyService): IMenu {
return new Menu(id, this._extensionService.onReady(), this._commandService, contextKeyService);
}
-
- getCommandActions(): ICommandAction[] {
- return values(MenuRegistry.commands);
- }
}
diff --git a/src/vs/platform/actions/test/common/menuService.test.ts b/src/vs/platform/actions/test/common/menuService.test.ts
index 4cc8cc02d73..b8408b178ee 100644
--- a/src/vs/platform/actions/test/common/menuService.test.ts
+++ b/src/vs/platform/actions/test/common/menuService.test.ts
@@ -186,4 +186,20 @@ suite('MenuService', function () {
assert.equal(two.id, 'b');
assert.equal(three.id, 'a');
});
+
+ test('special MenuId palette', function () {
+
+ disposables.push(MenuRegistry.appendMenuItem(MenuId.CommandPalette, {
+ command: { id: 'a', title: 'Explicit' }
+ }));
+
+ MenuRegistry.addCommand({ id: 'b', title: 'Implicit' });
+
+ const [first, second] = MenuRegistry.getMenuItems(MenuId.CommandPalette);
+ assert.equal(first.command.id, 'a');
+ assert.equal(first.command.title, 'Explicit');
+
+ assert.equal(second.command.id, 'b');
+ assert.equal(second.command.title, 'Implicit');
+ });
});
diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts
index 08cdd95782f..b5181490056 100644
--- a/src/vs/platform/configuration/common/configurationRegistry.ts
+++ b/src/vs/platform/configuration/common/configurationRegistry.ts
@@ -122,13 +122,13 @@ class ConfigurationRegistry implements IConfigurationRegistry {
this.updateOverridePropertyPatternKey();
}
- public registerDefaultConfigurations(defaultConnfigurations: IDefaultConfigurationExtension[]): void {
+ public registerDefaultConfigurations(defaultConfigurations: IDefaultConfigurationExtension[]): void {
const configurationNode: IConfigurationNode = {
id: 'defaultOverrides',
title: nls.localize('defaultConfigurations.title', "Default Configuration Overrides"),
properties: {}
};
- for (const defaultConfiguration of defaultConnfigurations) {
+ for (const defaultConfiguration of defaultConfigurations) {
for (const key in defaultConfiguration.defaults) {
const defaultValue = defaultConfiguration.defaults[key];
if (OVERRIDE_PROPERTY_PATTERN.test(key) && typeof defaultValue === 'object') {
@@ -141,7 +141,9 @@ class ConfigurationRegistry implements IConfigurationRegistry {
}
}
}
- this.registerConfiguration(configurationNode, false);
+ if (Object.keys(configurationNode.properties).length) {
+ this.registerConfiguration(configurationNode, false);
+ }
}
private validateAndRegisterProperties(configuration: IConfigurationNode, validate: boolean = true, overridable: boolean = false) {
@@ -360,10 +362,8 @@ configurationExtPoint.setHandler(extensions => {
validateProperties(configuration, collector);
- if (configuration.properties) {
- configuration.id = extensions[i].description.id;
- configurations.push(configuration);
- }
+ configuration.id = extensions[i].description.id;
+ configurations.push(configuration);
}
configurationRegistry.registerConfigurations(configurations, false);
diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts
index 4f2dab386eb..b8c47e548ea 100644
--- a/src/vs/platform/environment/node/environmentService.ts
+++ b/src/vs/platform/environment/node/environmentService.ts
@@ -29,25 +29,25 @@ function getUniqueUserId(): string {
return crypto.createHash('sha256').update(username).digest('hex').substr(0, 6);
}
-function getIPCHandlePrefix(nixBaseDir: string = os.tmpdir()): string {
- let name = pkg.name;
-
- // Support to run VS Code multiple times as different user
- // by making the socket unique over the logged in user
- let userId = getUniqueUserId();
- if (userId) {
- name += `-${userId}`;
- }
-
- if (process.platform === 'win32') {
- return `\\\\.\\pipe\\${name}`;
- } else {
- return path.join(nixBaseDir, name);
- }
+function getNixIPCHandle(userDataPath: string, type: string): string {
+ return path.join(userDataPath, `${pkg.version}-${type}.sock`);
}
-function getIPCHandleSuffix(): string {
- return process.platform === 'win32' ? '-sock' : '.sock';
+function getWin32IPCHandle(type: string): string {
+ // Support to run VS Code multiple times as different user
+ // by making the socket unique over the logged in user
+ const userId = getUniqueUserId();
+ const name = product.applicationName + (userId ? `-${userId}` : '');
+
+ return `\\\\.\\pipe\\${name}-${pkg.version}-${type}-sock`;
+}
+
+function getIPCHandle(userDataPath: string, type: string): string {
+ if (process.platform === 'win32') {
+ return getWin32IPCHandle(type);
+ } else {
+ return getNixIPCHandle(userDataPath, type);
+ }
}
export class EnvironmentService implements IEnvironmentService {
@@ -113,10 +113,10 @@ export class EnvironmentService implements IEnvironmentService {
get logExtensionHostCommunication(): boolean { return this._args.logExtensionHostCommunication; }
@memoize
- get mainIPCHandle(): string { return `${getIPCHandlePrefix(this.userDataPath)}-${pkg.version}${getIPCHandleSuffix()}`; }
+ get mainIPCHandle(): string { return getIPCHandle(this.userDataPath, 'main'); }
@memoize
- get sharedIPCHandle(): string { return `${getIPCHandlePrefix(this.userDataPath)}-${pkg.version}-shared${getIPCHandleSuffix()}`; }
+ get sharedIPCHandle(): string { return getIPCHandle(this.userDataPath, 'shared'); }
@memoize
get nodeCachedDataDir(): string { return path.join(this.userDataPath, 'CachedData'); }
diff --git a/src/vs/platform/telemetry/common/telemetry.ts b/src/vs/platform/telemetry/common/telemetry.ts
index aca834c2d6f..1d9edfb7576 100644
--- a/src/vs/platform/telemetry/common/telemetry.ts
+++ b/src/vs/platform/telemetry/common/telemetry.ts
@@ -15,11 +15,17 @@ export interface ITelemetryInfo {
instanceId: string;
}
+export interface ITelemetryData {
+ from?: string;
+ target?: string;
+ [key: string]: any;
+}
+
export interface ITelemetryExperiments {
showNewUserWatermark: boolean;
openUntitledFile: boolean;
- openGettingStarted?: boolean;
enableWelcomePage: boolean;
+ repositionPlaygroundLink: boolean;
}
export interface ITelemetryService {
@@ -30,7 +36,7 @@ export interface ITelemetryService {
* Sends a telemetry event that has been privacy approved.
* Do not call this unless you have been given approval.
*/
- publicLog(eventName: string, data?: any): TPromise;
+ publicLog(eventName: string, data?: ITelemetryData): TPromise;
getTelemetryInfo(): TPromise;
diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts
index 2b886246083..aa7e3f4a754 100644
--- a/src/vs/platform/telemetry/common/telemetryService.ts
+++ b/src/vs/platform/telemetry/common/telemetryService.ts
@@ -7,7 +7,7 @@
import { localize } from 'vs/nls';
import { escapeRegExpCharacters } from 'vs/base/common/strings';
-import { ITelemetryService, ITelemetryInfo, ITelemetryExperiments } from 'vs/platform/telemetry/common/telemetry';
+import { ITelemetryService, ITelemetryInfo, ITelemetryExperiments, ITelemetryData } from 'vs/platform/telemetry/common/telemetry';
import { ITelemetryAppender, defaultExperiments } from 'vs/platform/telemetry/common/telemetryUtils';
import { optional } from 'vs/platform/instantiation/common/instantiation';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
@@ -100,7 +100,7 @@ export class TelemetryService implements ITelemetryService {
this._disposables = dispose(this._disposables);
}
- publicLog(eventName: string, data?: any): TPromise {
+ publicLog(eventName: string, data?: ITelemetryData): TPromise {
// don't send events when the user is optout
if (!this._userOptIn) {
return TPromise.as(undefined);
diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts
index 8ef9acb59ef..dbc50faabce 100644
--- a/src/vs/platform/telemetry/common/telemetryUtils.ts
+++ b/src/vs/platform/telemetry/common/telemetryUtils.ts
@@ -14,7 +14,7 @@ import { IKeybindingService, KeybindingSource } from 'vs/platform/keybinding/com
import { ILifecycleService, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
-import { ITelemetryService, ITelemetryExperiments, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry';
+import { ITelemetryService, ITelemetryExperiments, ITelemetryInfo, ITelemetryData } from 'vs/platform/telemetry/common/telemetry';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { StorageService } from 'vs/platform/storage/common/storageService';
import * as objects from 'vs/base/common/objects';
@@ -22,13 +22,14 @@ import * as objects from 'vs/base/common/objects';
export const defaultExperiments: ITelemetryExperiments = {
showNewUserWatermark: false,
openUntitledFile: true,
- enableWelcomePage: true
+ enableWelcomePage: true,
+ repositionPlaygroundLink: false,
};
export const NullTelemetryService = {
_serviceBrand: undefined,
_experiments: defaultExperiments,
- publicLog(eventName: string, data?: any) {
+ publicLog(eventName: string, data?: ITelemetryData) {
return TPromise.as(null);
},
isOptedIn: true,
@@ -44,9 +45,6 @@ export const NullTelemetryService = {
}
};
-const beginGettingStartedExp = Date.UTC(2017, 0, 9);
-const endGettingStartedExp = Date.UTC(2017, 0, 16);
-
export function loadExperiments(accessor: ServicesAccessor): ITelemetryExperiments {
const contextService = accessor.get(IWorkspaceContextService);
const storageService = accessor.get(IStorageService);
@@ -58,8 +56,8 @@ export function loadExperiments(accessor: ServicesAccessor): ITelemetryExperimen
let {
showNewUserWatermark,
openUntitledFile,
- openGettingStarted,
- enableWelcomePage
+ enableWelcomePage,
+ repositionPlaygroundLink,
} = splitExperimentsRandomness();
const newUserDuration = 24 * 60 * 60 * 1000;
@@ -70,17 +68,11 @@ export function loadExperiments(accessor: ServicesAccessor): ITelemetryExperimen
openUntitledFile = defaultExperiments.openUntitledFile;
}
- const isNewSession = !storageService.get('telemetry.lastSessionDate');
- const now = Date.now();
- if (!(isNewSession && now >= beginGettingStartedExp && now < endGettingStartedExp)) {
- openGettingStarted = undefined;
- }
-
return applyOverrides({
showNewUserWatermark,
openUntitledFile,
- openGettingStarted,
- enableWelcomePage
+ enableWelcomePage,
+ repositionPlaygroundLink,
});
}
@@ -103,13 +95,13 @@ function splitExperimentsRandomness(): ITelemetryExperiments {
const random1 = getExperimentsRandomness();
const [random2, showNewUserWatermark] = splitRandom(random1);
const [random3, openUntitledFile] = splitRandom(random2);
- const [random4, openGettingStarted] = splitRandom(random3);
+ const [random4, repositionPlaygroundLink] = splitRandom(random3);
const [, enableWelcomePage] = splitRandom(random4);
return {
showNewUserWatermark,
openUntitledFile,
- openGettingStarted,
- enableWelcomePage
+ enableWelcomePage,
+ repositionPlaygroundLink,
};
}
diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts
index dc4f1b3f2a6..03dc91cd19e 100644
--- a/src/vs/vscode.proposed.d.ts
+++ b/src/vs/vscode.proposed.d.ts
@@ -134,6 +134,7 @@ declare module 'vscode' {
readonly resources: SCMResourceGroup[];
readonly onDidChange: Event;
readonly count?: number | undefined;
+ readonly state?: string;
getOriginalResource?(uri: Uri, token: CancellationToken): ProviderResult;
open?(resource: SCMResource, token: CancellationToken): ProviderResult;
diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts
index 3e227a1150a..1a0c54b595a 100644
--- a/src/vs/workbench/api/node/extHost.protocol.ts
+++ b/src/vs/workbench/api/node/extHost.protocol.ts
@@ -183,6 +183,7 @@ export abstract class MainThreadMessageServiceShape {
export abstract class MainThreadOutputServiceShape {
$append(channelId: string, label: string, value: string): TPromise { throw ni(); }
$clear(channelId: string, label: string): TPromise { throw ni(); }
+ $dispose(channelId: string, label: string): TPromise { throw ni(); }
$reveal(channelId: string, label: string, preserveFocus: boolean): TPromise { throw ni(); }
$close(channelId: string): TPromise { throw ni(); }
}
@@ -258,7 +259,7 @@ export type SCMRawResourceGroup = [string /*id*/, string /*label*/, SCMRawResour
export abstract class MainThreadSCMShape {
$register(id: string, features: SCMProviderFeatures): void { throw ni(); }
$unregister(id: string): void { throw ni(); }
- $onChange(id: string, resources: SCMRawResourceGroup[], count: number | undefined): void { throw ni(); }
+ $onChange(id: string, resources: SCMRawResourceGroup[], count: number | undefined, state: string | undefined): void { throw ni(); }
$setInputBoxValue(value: string): void { throw ni(); }
}
diff --git a/src/vs/workbench/api/node/extHostOutputService.ts b/src/vs/workbench/api/node/extHostOutputService.ts
index 7bda3aa3363..9a0190ae7e5 100644
--- a/src/vs/workbench/api/node/extHostOutputService.ts
+++ b/src/vs/workbench/api/node/extHostOutputService.ts
@@ -29,7 +29,7 @@ export class ExtHostOutputChannel implements vscode.OutputChannel {
dispose(): void {
if (!this._disposed) {
- this._proxy.$clear(this._id, this._name).then(() => {
+ this._proxy.$dispose(this._id, this._name).then(() => {
this._disposed = true;
});
}
diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts
index c874314608e..978ca281f8e 100644
--- a/src/vs/workbench/api/node/extHostSCM.ts
+++ b/src/vs/workbench/api/node/extHostSCM.ts
@@ -189,7 +189,7 @@ export class ExtHostSCM {
return [g.id, g.label, rawResources] as SCMRawResourceGroup;
});
- this._proxy.$onChange(providerId, rawResourceGroups, provider.count);
+ this._proxy.$onChange(providerId, rawResourceGroups, provider.count, provider.state);
});
return new Disposable(() => {
diff --git a/src/vs/workbench/api/node/mainThreadOutputService.ts b/src/vs/workbench/api/node/mainThreadOutputService.ts
index bbaacb49b47..b0a32a6202d 100644
--- a/src/vs/workbench/api/node/mainThreadOutputService.ts
+++ b/src/vs/workbench/api/node/mainThreadOutputService.ts
@@ -58,4 +58,9 @@ export class MainThreadOutputService extends MainThreadOutputServiceShape {
return undefined;
}
+
+ public $dispose(channelId: string, label: string): TPromise {
+ this._getChannel(channelId, label).dispose();
+ return undefined;
+ }
}
diff --git a/src/vs/workbench/api/node/mainThreadSCM.ts b/src/vs/workbench/api/node/mainThreadSCM.ts
index 0962c9453c7..5726da0a8e1 100644
--- a/src/vs/workbench/api/node/mainThreadSCM.ts
+++ b/src/vs/workbench/api/node/mainThreadSCM.ts
@@ -30,6 +30,9 @@ class MainThreadSCMProvider implements ISCMProvider {
private _count: number | undefined = undefined;
get count(): number | undefined { return this._count; }
+ private _state: string | undefined = undefined;
+ get state(): string | undefined { return this._state; }
+
constructor(
private _id: string,
private proxy: ExtHostSCMShape,
@@ -71,7 +74,7 @@ class MainThreadSCMProvider implements ISCMProvider {
// }
}
- $onChange(rawResourceGroups: SCMRawResourceGroup[], count: number | undefined): void {
+ $onChange(rawResourceGroups: SCMRawResourceGroup[], count: number | undefined, state: string | undefined): void {
this._resources = rawResourceGroups.map(rawGroup => {
const [id, label, rawResources] = rawGroup;
@@ -96,7 +99,9 @@ class MainThreadSCMProvider implements ISCMProvider {
return { id, label, resources };
});
+
this._count = count;
+ this._state = state;
this._onDidChange.fire(this.resources);
}
@@ -140,14 +145,14 @@ export class MainThreadSCM extends MainThreadSCMShape {
delete this.providers[id];
}
- $onChange(id: string, rawResourceGroups: SCMRawResourceGroup[], count: number | undefined): void {
+ $onChange(id: string, rawResourceGroups: SCMRawResourceGroup[], count: number | undefined, state: string | undefined): void {
const provider = this.providers[id];
if (!provider) {
return;
}
- provider.$onChange(rawResourceGroups, count);
+ provider.$onChange(rawResourceGroups, count, state);
}
$setInputBoxValue(value: string): void {
diff --git a/src/vs/workbench/common/actionRegistry.ts b/src/vs/workbench/common/actionRegistry.ts
index e16dd395bcd..95669c4d86e 100644
--- a/src/vs/workbench/common/actionRegistry.ts
+++ b/src/vs/workbench/common/actionRegistry.ts
@@ -168,14 +168,15 @@ export function triggerAndDisposeAction(instantitationService: IInstantiationSer
return undefined;
}
+ const from = args && args.from || 'keybinding';
if (telemetryService) {
- telemetryService.publicLog('workbenchActionExecuted', { id: actionInstance.id, from: args && args.from || 'keybinding' });
+ telemetryService.publicLog('workbenchActionExecuted', { id: actionInstance.id, from });
}
// run action when workbench is created
return partService.joinCreation().then(() => {
try {
- return TPromise.as(actionInstance.run()).then(() => {
+ return TPromise.as(actionInstance.run(undefined, { from })).then(() => {
actionInstance.dispose();
}, (err) => {
actionInstance.dispose();
diff --git a/src/vs/workbench/electron-browser/bootstrap/index.html b/src/vs/workbench/electron-browser/bootstrap/index.html
index 73cc8d4c91d..b0d3e486f7b 100644
--- a/src/vs/workbench/electron-browser/bootstrap/index.html
+++ b/src/vs/workbench/electron-browser/bootstrap/index.html
@@ -9,6 +9,12 @@
.monaco-shell.vs-dark {
background-color: #1E1E1E;
}
+ .monaco-shell.vs {
+ background-color: #FFFFFF;
+ }
+ .monaco-shell.hc-black {
+ background-color: #000000;
+ }
@@ -16,13 +22,13 @@