Merge from vscode 892353d48e17303de203bb5071f21ea69573367d

This commit is contained in:
ADS Merger
2020-09-05 03:17:42 +00:00
parent b8d0e2a9e3
commit 6718c7565d
40 changed files with 330 additions and 130 deletions

View File

@@ -187,11 +187,11 @@ function registerCommandsAndActions(): void {
registerDebugViewMenuItem(MenuId.DebugCallStackContext, RESTART_FRAME_ID, nls.localize('restartFrame', "Restart Frame"), 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('stackFrame'), CONTEXT_RESTART_FRAME_SUPPORTED));
registerDebugViewMenuItem(MenuId.DebugCallStackContext, COPY_STACK_TRACE_ID, nls.localize('copyStackTrace', "Copy Call Stack"), 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('stackFrame'));
registerDebugViewMenuItem(MenuId.DebugVariablesContext, SET_VARIABLE_ID, nls.localize('setValue', "Set Value"), 10, CONTEXT_SET_VARIABLE_SUPPORTED);
registerDebugViewMenuItem(MenuId.DebugVariablesContext, COPY_VALUE_ID, nls.localize('copyValue', "Copy Value"), 20);
registerDebugViewMenuItem(MenuId.DebugVariablesContext, COPY_EVALUATE_PATH_ID, nls.localize('copyAsExpression', "Copy as Expression"), 30, CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT);
registerDebugViewMenuItem(MenuId.DebugVariablesContext, ADD_TO_WATCH_ID, nls.localize('addToWatchExpressions', "Add to Watch"), 10, CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT, undefined, '3_watch');
registerDebugViewMenuItem(MenuId.DebugVariablesContext, BREAK_WHEN_VALUE_CHANGES_ID, nls.localize('breakWhenValueChanges', "Break When Value Changes"), 20, CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED, undefined, '5_breakpoint');
registerDebugViewMenuItem(MenuId.DebugVariablesContext, SET_VARIABLE_ID, nls.localize('setValue', "Set Value"), 10, CONTEXT_SET_VARIABLE_SUPPORTED, undefined, '3_modification');
registerDebugViewMenuItem(MenuId.DebugVariablesContext, COPY_VALUE_ID, nls.localize('copyValue', "Copy Value"), 10, undefined, undefined, '5_cutcopypaste');
registerDebugViewMenuItem(MenuId.DebugVariablesContext, COPY_EVALUATE_PATH_ID, nls.localize('copyAsExpression', "Copy as Expression"), 20, CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT, undefined, '5_cutcopypaste');
registerDebugViewMenuItem(MenuId.DebugVariablesContext, ADD_TO_WATCH_ID, nls.localize('addToWatchExpressions', "Add to Watch"), 100, CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT, undefined, 'z_commands');
registerDebugViewMenuItem(MenuId.DebugVariablesContext, BREAK_WHEN_VALUE_CHANGES_ID, nls.localize('breakWhenValueChanges', "Break When Value Changes"), 200, CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED, undefined, 'z_commands');
// Touch Bar
if (isMacintosh) {

View File

@@ -22,6 +22,7 @@ import { KeyCode } from 'vs/base/common/keyCodes';
import { ContextScopedHistoryInputBox } from 'vs/platform/browser/contextScopedHistoryWidget';
import { attachInputBoxStyler } from 'vs/platform/theme/common/styler';
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { ReplEvaluationResult, ReplEvaluationInput } from 'vs/workbench/contrib/debug/common/replModel';
type ParsedQuery = {
@@ -51,6 +52,11 @@ export class ReplFilter implements ITreeFilter<IReplElement> {
}
filter(element: IReplElement, parentVisibility: TreeVisibility): TreeFilterResult<void> {
if (element instanceof ReplEvaluationInput || element instanceof ReplEvaluationResult) {
// Only filter the output events, everything else is visible https://github.com/microsoft/vscode/issues/105863
return TreeVisibility.Visible;
}
let includeQueryPresent = false;
let includeQueryMatched = false;
@@ -107,7 +113,7 @@ export class ReplFilterActionViewItem extends BaseActionViewItem {
@IThemeService private readonly themeService: IThemeService,
@IContextViewService private readonly contextViewService: IContextViewService) {
super(null, action);
this.delayedFilterUpdate = new Delayer<void>(200);
this.delayedFilterUpdate = new Delayer<void>(400);
this._register(toDisposable(() => this.delayedFilterUpdate.cancel()));
}

View File

@@ -27,7 +27,7 @@ export class SimpleReplElement implements IReplElement {
) { }
toString(): string {
const sourceStr = this.sourceData ? ` ${this.sourceData.source.name}:${this.sourceData.lineNumber}` : '';
const sourceStr = this.sourceData ? ` ${this.sourceData.source.name}` : '';
return this.value + sourceStr;
}
@@ -145,7 +145,7 @@ export class ReplGroup implements IReplElement {
}
toString(): string {
const sourceStr = this.sourceData ? ` ${this.sourceData.source.name}:${this.sourceData.lineNumber}` : '';
const sourceStr = this.sourceData ? ` ${this.sourceData.source.name}` : '';
return this.name + sourceStr;
}

View File

@@ -117,9 +117,9 @@ export class ExtensionRecommendationsService extends Disposable implements IExte
this.staticRecommendations.activate(), // {{SQL CARBON EDIT}} add ours
this.scenarioRecommendations.activate(), // {{SQL CARBON EDIT}} add ours
this.lifecycleService.when(LifecyclePhase.Eventually)
.then(() => {
.then(async () => {
if (!this.configurationService.getValue<boolean>(ShowRecommendationsOnlyOnDemandKey)) {
this.activateProactiveRecommendations();
await this.activateProactiveRecommendations();
}
})
]);

View File

@@ -686,7 +686,7 @@ export class ExtensionsListView extends ViewPane {
const recommendations = await this.extensionRecommendationsService.getWorkspaceRecommendations();
const { important } = await this.extensionRecommendationsService.getConfigBasedRecommendations();
for (const configBasedRecommendation of important) {
if (recommendations.some(r => r.extensionId !== configBasedRecommendation.extensionId)) {
if (!recommendations.find(r => r.extensionId === configBasedRecommendation.extensionId)) {
recommendations.push(configBasedRecommendation);
}
}

View File

@@ -0,0 +1,35 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls';
import { Action2, registerAction2 } from 'vs/platform/actions/common/actions';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { rendererLogChannelId } from 'vs/workbench/contrib/logs/common/logConstants';
import { IOutputService } from 'vs/workbench/contrib/output/common/output';
const developerCategory = { value: nls.localize({ key: 'developer', comment: ['A developer on Code itself or someone diagnosing issues in Code'] }, "Developer"), original: 'Developer' };
class ToggleKeybindingsLogAction extends Action2 {
constructor() {
super({
id: 'workbench.action.toggleKeybindingsLog',
title: { value: nls.localize('toggleKeybindingsLog', "Toggle Keyboard Shortcuts Troubleshooting"), original: 'Toggle Keyboard Shortcuts Troubleshooting' },
category: developerCategory,
f1: true
});
}
run(accessor: ServicesAccessor): void {
const logging = accessor.get(IKeybindingService).toggleLogging();
if (logging) {
const outputService = accessor.get(IOutputService);
outputService.showChannel(rendererLogChannelId);
}
}
}
registerAction2(ToggleKeybindingsLogAction);

View File

@@ -279,7 +279,7 @@ export class MarkersFilterActionViewItem extends BaseActionViewItem {
) {
super(null, action);
this.focusContextKey = Constants.MarkerViewFilterFocusContextKey.bindTo(contextKeyService);
this.delayedFilterUpdate = new Delayer<void>(200);
this.delayedFilterUpdate = new Delayer<void>(400);
this._register(toDisposable(() => this.delayedFilterUpdate.cancel()));
this._register(filterController.onDidFocusFilter(() => this.focus()));
this._register(filterController.onDidClearFilterText(() => this.clearFilterText()));

View File

@@ -209,7 +209,6 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD
}
async updateLayout() {
console.log('update layout');
if (!this._model) {
return;
}

View File

@@ -387,7 +387,7 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri
const existingEditors = group.editors.filter(editor => editor.resource && isEqual(editor.resource, notebookUri) && !(editor instanceof NotebookEditorInput));
if (existingEditors.length) {
return { override: this.editorService.openEditor(existingEditors[0]) };
return undefined;
}
const userAssociatedEditors = this.getUserAssociatedEditors(notebookUri);

View File

@@ -44,9 +44,8 @@ class NotebookDiffEditorModel extends EditorModel implements INotebookDiffEditor
}
dispose(): void {
super.dispose();
}
}
export class NotebookDiffEditorInput extends EditorInput {

View File

@@ -193,7 +193,6 @@ export type ToWebviewMessage =
| IHideOutputMessage
| IShowOutputMessage
| IUpdatePreloadResourceMessage
| IFocusOutputMessage
| IUpdateDecorationsMessage
| ICustomRendererMessage;

View File

@@ -561,7 +561,7 @@ export class OutlinePane extends ViewPane {
return;
}
this._revealTreeSelection(newModel, e.element, !!e.editorOptions.preserveFocus || !e.editorOptions.pinned, e.sideBySide);
this._revealTreeSelection(newModel, e.element, !!e.editorOptions.preserveFocus, !!e.editorOptions.pinned, e.sideBySide);
}));
// feature: reveal editor selection in outline
@@ -615,12 +615,13 @@ export class OutlinePane extends ViewPane {
}));
}
private async _revealTreeSelection(model: OutlineModel, element: OutlineElement, preserveFocus: boolean, aside: boolean): Promise<void> {
private async _revealTreeSelection(model: OutlineModel, element: OutlineElement, preserveFocus: boolean, pinned: boolean, aside: boolean): Promise<void> {
await this._editorService.openCodeEditor(
{
resource: model.uri,
options: {
preserveFocus,
pinned,
selection: Range.collapseToStart(element.symbol.selectionRange),
selectionRevealType: TextEditorSelectionRevealType.NearTopIfOutsideViewport,
}

View File

@@ -6,7 +6,7 @@
import 'vs/css!./media/scm';
import { Event, Emitter } from 'vs/base/common/event';
import { basename, dirname, isEqual } from 'vs/base/common/resources';
import { IDisposable, Disposable, DisposableStore, combinedDisposable, dispose } from 'vs/base/common/lifecycle';
import { IDisposable, Disposable, DisposableStore, combinedDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle';
import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer';
import { append, $, addClass, toggleClass, removeClass, Dimension } from 'vs/base/browser/dom';
import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list';
@@ -74,6 +74,7 @@ import { DEFAULT_FONT_FAMILY } from 'vs/workbench/browser/style';
import { Codicon } from 'vs/base/common/codicons';
import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview';
import { RepositoryRenderer } from 'vs/workbench/contrib/scm/browser/scmRepositoryRenderer';
import { IPosition } from 'vs/editor/common/core/position';
type TreeElement = ISCMRepository | ISCMInput | ISCMResourceGroup | IResourceNode<ISCMResource, ISCMResourceGroup> | ISCMResource;
@@ -131,6 +132,7 @@ class InputRenderer implements ICompressibleTreeRenderer<ISCMInput, FuzzyScore,
private inputWidgets = new Map<ISCMInput, SCMInputWidget>();
private contentHeights = new WeakMap<ISCMInput, number>();
private editorPositions = new WeakMap<ISCMInput, IPosition>();
constructor(
private outerLayout: ISCMLayout,
@@ -161,6 +163,21 @@ class InputRenderer implements ICompressibleTreeRenderer<ISCMInput, FuzzyScore,
this.inputWidgets.set(input, templateData.inputWidget);
disposables.add({ dispose: () => this.inputWidgets.delete(input) });
// Widget position
const position = this.editorPositions.get(input);
if (position) {
templateData.inputWidget.position = position;
}
disposables.add(toDisposable(() => {
const position = templateData.inputWidget.position;
if (position) {
this.editorPositions.set(input, position);
}
}));
// Rerender the element whenever the editor content height changes
const onDidChangeContentHeight = () => {
const contentHeight = templateData.inputWidget.getContentHeight();
@@ -1343,6 +1360,16 @@ class SCMInputWidget extends Disposable {
this.model = { input, textModel };
}
get position(): IPosition | null {
return this.inputEditor.getPosition();
}
set position(position: IPosition | null) {
if (position) {
this.inputEditor.setPosition(position);
}
}
constructor(
container: HTMLElement,
@IContextKeyService contextKeyService: IContextKeyService,

View File

@@ -473,7 +473,7 @@ configurationRegistry.registerConfiguration({
default: 30, minimum: 0, maximum: 30
},
'task.quickOpen.detail': {
markdownDescription: nls.localize('task.quickOpen.detail', "Controls whether to show the task detail for task that have a detail in the Run Task quick pick."),
markdownDescription: nls.localize('task.quickOpen.detail', "Controls whether to show the task detail for tasks that have a detail in task quick picks, such as Run Task."),
type: 'boolean',
default: true
},

View File

@@ -39,6 +39,7 @@ import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/co
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { ITerminalContributionService } from 'vs/workbench/contrib/terminal/common/terminalExtensionPoints';
import { SelectActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems';
import { FindInFilesCommand, IFindInFilesArgs } from 'vs/workbench/contrib/search/browser/searchActions';
async function getCwdForSplit(configHelper: ITerminalConfigHelper, instance: ITerminalInstance, folders?: IWorkspaceFolder[], commandService?: ICommandService): Promise<string | URI | undefined> {
switch (configHelper.config.splitCwd) {
@@ -1350,6 +1351,28 @@ export function registerTerminalActions() {
accessor.get(ITerminalService).findPrevious();
}
});
registerAction2(class extends Action2 {
constructor() {
super({
id: TERMINAL_COMMAND_ID.SEARCH_WORKSPACE,
title: { value: localize('workbench.action.terminal.searchWorkspace', "Search Workspace"), original: 'Search Workspace' },
f1: true,
category,
keybinding: [
{
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F,
when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED),
weight: KeybindingWeight.WorkbenchContrib
}
],
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
const query = accessor.get(ITerminalService).getActiveInstance()?.selection;
FindInFilesCommand(accessor, { query } as IFindInFilesArgs);
}
});
registerAction2(class extends Action2 {
constructor() {
super({

View File

@@ -838,9 +838,6 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
setTimeout(() => this.layout(this._timeoutDimension!), 0);
}
}
if (!visible) {
this._widgetManager.hideHovers();
}
}
public scrollDownLine(): void {

View File

@@ -5,15 +5,11 @@
import { IDisposable } from 'vs/base/common/lifecycle';
import { ITerminalWidget } from 'vs/workbench/contrib/terminal/browser/widgets/widgets';
import { IHoverService } from 'vs/workbench/services/hover/browser/hover';
export class TerminalWidgetManager implements IDisposable {
private _container: HTMLElement | undefined;
private _attached: Map<string, ITerminalWidget> = new Map();
constructor(@IHoverService private readonly _hoverService: IHoverService) {
}
attachToElement(terminalWrapper: HTMLElement) {
if (!this._container) {
this._container = document.createElement('div');
@@ -23,17 +19,12 @@ export class TerminalWidgetManager implements IDisposable {
}
dispose(): void {
this.hideHovers();
if (this._container && this._container.parentElement) {
this._container.parentElement.removeChild(this._container);
this._container = undefined;
}
}
hideHovers(): void {
this._hoverService.hideHover();
}
attachWidget(widget: ITerminalWidget): IDisposable | undefined {
if (!this._container) {
return undefined; // {{SQL CARBON EDIT}} strict-null-check

View File

@@ -500,7 +500,8 @@ export const enum TERMINAL_COMMAND_ID {
NAVIGATION_MODE_EXIT = 'workbench.action.terminal.navigationModeExit',
NAVIGATION_MODE_FOCUS_NEXT = 'workbench.action.terminal.navigationModeFocusNext',
NAVIGATION_MODE_FOCUS_PREVIOUS = 'workbench.action.terminal.navigationModeFocusPrevious',
SHOW_ENVIRONMENT_INFORMATION = 'workbench.action.terminal.showEnvironmentInformation'
SHOW_ENVIRONMENT_INFORMATION = 'workbench.action.terminal.showEnvironmentInformation',
SEARCH_WORKSPACE = 'workbench.action.terminal.searchWorkspace'
}
export const DEFAULT_COMMANDS_TO_SKIP_SHELL: string[] = [

View File

@@ -41,6 +41,7 @@ import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme
import { IHoverService, IHoverOptions, IHoverTarget } from 'vs/workbench/services/hover/browser/hover';
import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems';
import { IMarkdownString } from 'vs/base/common/htmlContent';
import { isMacintosh } from 'vs/base/common/platform';
class Root implements ITreeItem {
label = { label: 'root' };
@@ -692,7 +693,6 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
static readonly TREE_TEMPLATE_ID = 'treeExplorer';
private _actionRunner: MultipleSelectionActionRunner | undefined;
private readonly hoverDelay: number;
constructor(
private treeViewId: string,
@@ -706,7 +706,6 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
@IHoverService private readonly hoverService: IHoverService
) {
super();
this.hoverDelay = this.configurationService.getValue<number>('editor.hover.delay');
}
get templateId(): string {
@@ -757,35 +756,33 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
}) : undefined;
const icon = this.themeService.getColorTheme().type === LIGHT ? node.icon : node.iconDark;
const iconUrl = icon ? URI.revive(icon) : null;
const canResolve = node instanceof ResolvableTreeItem && node.hasResolve;
const title = node.tooltip ? (isString(node.tooltip) ? node.tooltip : undefined) : (resource ? undefined : (canResolve ? undefined : label));
// reset
templateData.actionBar.clear();
let fallbackHover = label;
if (resource || this.isFileKindThemeIcon(node.themeIcon)) {
const fileDecorations = this.configurationService.getValue<{ colors: boolean, badges: boolean }>('explorer.decorations');
templateData.resourceLabel.setResource({ name: label, description, resource: resource ? resource : URI.parse('missing:_icon_resource') }, {
const labelResource = resource ? resource : URI.parse('missing:_icon_resource');
templateData.resourceLabel.setResource({ name: label, description, resource: labelResource }, {
fileKind: this.getFileKind(node),
title: undefined,
title: '',
hideIcon: !!iconUrl,
fileDecorations,
extraClasses: ['custom-view-tree-node-item-resourceLabel'],
matches: matches ? matches : createMatches(element.filterData),
strikethrough: treeItemLabel?.strikethrough,
strikethrough: treeItemLabel?.strikethrough
});
fallbackHover = this.labelService.getUriLabel(labelResource);
} else {
templateData.resourceLabel.setResource({ name: label, description }, {
title: undefined,
title: '',
hideIcon: true,
extraClasses: ['custom-view-tree-node-item-resourceLabel'],
matches: matches ? matches : createMatches(element.filterData),
strikethrough: treeItemLabel?.strikethrough,
strikethrough: treeItemLabel?.strikethrough
});
}
templateData.icon.title = title ? title : '';
if (iconUrl) {
templateData.icon.className = 'custom-view-tree-node-item-icon';
templateData.icon.style.backgroundImage = DOM.asCSSUrl(iconUrl);
@@ -808,19 +805,27 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
const disposableStore = new DisposableStore();
templateData.elementDisposable = disposableStore;
disposableStore.add(this.themeService.onDidFileIconThemeChange(() => this.setAlignment(templateData.container, node)));
this.setupHovers(node, templateData.container, disposableStore, label);
this.setupHovers(node, <HTMLElement>templateData.resourceLabel.element.firstElementChild!, disposableStore, fallbackHover);
this.setupHovers(node, templateData.icon, disposableStore, fallbackHover);
}
private setupHovers(node: ITreeItem, htmlElement: HTMLElement, disposableStore: DisposableStore, label: string | undefined): void {
const hoverService = this.hoverService;
const hoverDelay = this.hoverDelay;
// Testing has indicated that on Windows and Linux 500 ms matches the native hovers most closely.
// On Mac, the delay is 1500.
const hoverDelay = isMacintosh ? 1500 : 500;
let hoverOptions: IHoverOptions | undefined;
let mouseX: number | undefined;
function mouseOver(this: HTMLElement, e: MouseEvent): any {
let isHovering = true;
function mouseMove(this: HTMLElement, e: MouseEvent): any {
mouseX = e.x;
}
function mouseLeave(this: HTMLElement, e: MouseEvent): any {
isHovering = false;
}
this.addEventListener(DOM.EventType.MOUSE_LEAVE, mouseLeave, { passive: true });
this.addEventListener(DOM.EventType.MOUSE_MOVE, mouseMove, { passive: true });
setTimeout(async () => {
if (node instanceof ResolvableTreeItem) {
await node.resolve();
@@ -834,9 +839,12 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
};
hoverOptions = { text: tooltip, target };
}
(<IHoverTarget>hoverOptions.target).x = e.x;
if (mouseX !== undefined) {
(<IHoverTarget>hoverOptions.target).x = mouseX;
}
hoverService.showHover(hoverOptions);
}
this.removeEventListener(DOM.EventType.MOUSE_MOVE, mouseMove);
this.removeEventListener(DOM.EventType.MOUSE_LEAVE, mouseLeave);
}, hoverDelay);
}