Merge from vscode c58aaab8a1cc22a7139b761166a0d4f37d41e998 (#7880)

* Merge from vscode c58aaab8a1cc22a7139b761166a0d4f37d41e998

* fix pipelines

* fix strict-null-checks

* add missing files
This commit is contained in:
Anthony Dresser
2019-10-21 22:12:22 -07:00
committed by GitHub
parent 7c9be74970
commit 1e22f47304
913 changed files with 18898 additions and 16536 deletions

View File

@@ -59,6 +59,9 @@ export class KeybindingsSearchWidget extends SearchWidget {
super(parent, options, contextViewService, instantiationService, themeService);
this._register(attachInputBoxStyler(this.inputBox, themeService));
this._register(toDisposable(() => this.stopRecordingKeys()));
this._firstPart = null;
this._chordPart = null;
this._inputValue = '';
this._reset();
}
@@ -166,7 +169,45 @@ export class DefineKeybindingWidget extends Widget {
@IThemeService private readonly themeService: IThemeService
) {
super();
this.create();
this._domNode = createFastDomNode(document.createElement('div'));
this._domNode.setDisplay('none');
this._domNode.setClassName('defineKeybindingWidget');
this._domNode.setWidth(DefineKeybindingWidget.WIDTH);
this._domNode.setHeight(DefineKeybindingWidget.HEIGHT);
const message = nls.localize('defineKeybinding.initial', "Press desired key combination and then press ENTER.");
dom.append(this._domNode.domNode, dom.$('.message', undefined, message));
this._register(attachStylerCallback(this.themeService, { editorWidgetBackground, editorWidgetForeground, widgetShadow }, colors => {
if (colors.editorWidgetBackground) {
this._domNode.domNode.style.backgroundColor = colors.editorWidgetBackground.toString();
} else {
this._domNode.domNode.style.backgroundColor = '';
}
if (colors.editorWidgetForeground) {
this._domNode.domNode.style.color = colors.editorWidgetForeground.toString();
} else {
this._domNode.domNode.style.color = null;
}
if (colors.widgetShadow) {
this._domNode.domNode.style.boxShadow = `0 2px 8px ${colors.widgetShadow}`;
} else {
this._domNode.domNode.style.boxShadow = '';
}
}));
this._keybindingInputWidget = this._register(this.instantiationService.createInstance(KeybindingsSearchWidget, this._domNode.domNode, { ariaLabel: message }));
this._keybindingInputWidget.startRecordingKeys();
this._register(this._keybindingInputWidget.onKeybinding(keybinding => this.onKeybinding(keybinding)));
this._register(this._keybindingInputWidget.onEnter(() => this.hide()));
this._register(this._keybindingInputWidget.onEscape(() => this.onCancel()));
this._register(this._keybindingInputWidget.onBlur(() => this.onCancel()));
this._outputNode = dom.append(this._domNode.domNode, dom.$('.output'));
this._showExistingKeybindingsNode = dom.append(this._domNode.domNode, dom.$('.existing'));
if (parent) {
dom.append(parent, this._domNode.domNode);
}
@@ -217,46 +258,6 @@ export class DefineKeybindingWidget extends Widget {
}
}
private create(): void {
this._domNode = createFastDomNode(document.createElement('div'));
this._domNode.setDisplay('none');
this._domNode.setClassName('defineKeybindingWidget');
this._domNode.setWidth(DefineKeybindingWidget.WIDTH);
this._domNode.setHeight(DefineKeybindingWidget.HEIGHT);
const message = nls.localize('defineKeybinding.initial', "Press desired key combination and then press ENTER.");
dom.append(this._domNode.domNode, dom.$('.message', undefined, message));
this._register(attachStylerCallback(this.themeService, { editorWidgetBackground, editorWidgetForeground, widgetShadow }, colors => {
if (colors.editorWidgetBackground) {
this._domNode.domNode.style.backgroundColor = colors.editorWidgetBackground.toString();
} else {
this._domNode.domNode.style.backgroundColor = null;
}
if (colors.editorWidgetForeground) {
this._domNode.domNode.style.color = colors.editorWidgetForeground.toString();
} else {
this._domNode.domNode.style.color = null;
}
if (colors.widgetShadow) {
this._domNode.domNode.style.boxShadow = `0 2px 8px ${colors.widgetShadow}`;
} else {
this._domNode.domNode.style.boxShadow = null;
}
}));
this._keybindingInputWidget = this._register(this.instantiationService.createInstance(KeybindingsSearchWidget, this._domNode.domNode, { ariaLabel: message }));
this._keybindingInputWidget.startRecordingKeys();
this._register(this._keybindingInputWidget.onKeybinding(keybinding => this.onKeybinding(keybinding)));
this._register(this._keybindingInputWidget.onEnter(() => this.hide()));
this._register(this._keybindingInputWidget.onEscape(() => this.onCancel()));
this._register(this._keybindingInputWidget.onBlur(() => this.onCancel()));
this._outputNode = dom.append(this._domNode.domNode, dom.$('.output'));
this._showExistingKeybindingsNode = dom.append(this._domNode.domNode, dom.$('.existing'));
}
private onKeybinding(keybinding: [ResolvedKeybinding | null, ResolvedKeybinding | null]): void {
const [firstPart, chordPart] = keybinding;
this._firstPart = firstPart;

View File

@@ -29,7 +29,6 @@ import {
} from 'vs/workbench/contrib/preferences/common/preferences';
import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView';
import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing';
import { List } from 'vs/base/browser/ui/list/listWidget';
import { IListVirtualDelegate, IListRenderer, IListContextMenuEvent, IListEvent } from 'vs/base/browser/ui/list/list';
import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService';
import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
@@ -79,7 +78,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor
private keybindingsListContainer: HTMLElement;
private unAssignedKeybindingItemToRevealAndFocus: IKeybindingItemEntry | null;
private listEntries: IListEntry[];
private keybindingsList: List<IListEntry>;
private keybindingsList: WorkbenchList<IListEntry>;
private dimension: DOM.Dimension;
private delayedFiltering: Delayer<void>;
@@ -402,13 +401,13 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor
const recordingBadge = DOM.append(container, DOM.$('.recording-badge.disabled'));
recordingBadge.textContent = localize('recording', "Recording Keys");
this._register(attachStylerCallback(this.themeService, { badgeBackground, contrastBorder, badgeForeground }, colors => {
const background = colors.badgeBackground ? colors.badgeBackground.toString() : null;
const border = colors.contrastBorder ? colors.contrastBorder.toString() : null;
const color = colors.badgeForeground ? colors.badgeForeground.toString() : null;
const background = colors.badgeBackground ? colors.badgeBackground.toString() : '';
const border = colors.contrastBorder ? colors.contrastBorder.toString() : '';
const color = colors.badgeForeground ? colors.badgeForeground.toString() : '';
recordingBadge.style.backgroundColor = background;
recordingBadge.style.borderWidth = border ? '1px' : null;
recordingBadge.style.borderStyle = border ? 'solid' : null;
recordingBadge.style.borderWidth = border ? '1px' : '';
recordingBadge.style.borderStyle = border ? 'solid' : '';
recordingBadge.style.borderColor = border;
recordingBadge.style.color = color ? color.toString() : null;
}));

View File

@@ -23,14 +23,13 @@ import { parseTree, Node } from 'vs/base/common/json';
import { ScanCodeBinding } from 'vs/base/common/scanCode';
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
import { WindowsNativeResolvedKeybinding } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper';
import { themeColorFromId, ThemeColor, registerThemingParticipant } from 'vs/platform/theme/common/themeService';
import { themeColorFromId, ThemeColor } from 'vs/platform/theme/common/themeService';
import { overviewRulerInfo, overviewRulerError } from 'vs/editor/common/view/editorColorRegistry';
import { IModelDeltaDecoration, ITextModel, TrackedRangeStickiness, OverviewRulerLane } from 'vs/editor/common/model';
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
import { KeybindingParser } from 'vs/base/common/keybindingParser';
import Severity from 'vs/base/common/severity';
import { SeverityIcon } from 'vs/platform/severityIcon/common/severityIcon';
import { EditorOption } from 'vs/editor/common/config/editorOptions';
import { equals } from 'vs/base/common/arrays';
const NLS_LAUNCH_MESSAGE = nls.localize('defineKeybinding.start', "Define Keybinding");
const NLS_KB_LAYOUT_ERROR_MESSAGE = nls.localize('defineKeybinding.kbLayoutErrorMessage', "You won't be able to produce this key combination under your current keyboard layout.");
@@ -39,7 +38,7 @@ const INTERESTING_FILE = /keybindings\.json$/;
export class DefineKeybindingController extends Disposable implements editorCommon.IEditorContribution {
private static readonly ID = 'editor.contrib.defineKeybinding';
public static readonly ID = 'editor.contrib.defineKeybinding';
static get(editor: ICodeEditor): DefineKeybindingController {
return editor.getContribution<DefineKeybindingController>(DefineKeybindingController.ID);
@@ -58,10 +57,6 @@ export class DefineKeybindingController extends Disposable implements editorComm
this._update();
}
getId(): string {
return DefineKeybindingController.ID;
}
get keybindingWidgetRenderer(): KeybindingWidgetRenderer | undefined {
return this._keybindingWidgetRenderer;
}
@@ -267,18 +262,7 @@ export class KeybindingEditorDecorationsRenderer extends Disposable {
const aParts = KeybindingParser.parseUserBinding(a);
const bParts = KeybindingParser.parseUserBinding(b);
if (aParts.length !== bParts.length) {
return false;
}
for (let i = 0, len = aParts.length; i < len; i++) {
if (!this._userBindingEquals(aParts[i], bParts[i])) {
return false;
}
}
return true;
return equals(aParts, bParts, (a, b) => this._userBindingEquals(a, b));
}
private static _userBindingEquals(a: SimpleKeybinding | ScanCodeBinding, b: SimpleKeybinding | ScanCodeBinding): boolean {
@@ -397,10 +381,5 @@ function isInterestingEditorModel(editor: ICodeEditor): boolean {
return INTERESTING_FILE.test(url);
}
registerEditorContribution(DefineKeybindingController);
registerEditorContribution(DefineKeybindingController.ID, DefineKeybindingController);
registerEditorCommand(new DefineKeybindingCommand());
registerThemingParticipant((theme, collector) => {
collector.addRule(`.monaco-editor .inlineKeybindingInfo:before { background: url("data:image/svg+xml,${SeverityIcon.getSVGData(Severity.Info, theme)}") -0.1em -0.2em no-repeat; }`);
collector.addRule(`.monaco-editor .inlineKeybindingError:before { background: url("data:image/svg+xml,${SeverityIcon.getSVGData(Severity.Error, theme)}") -0.1em -0.2em no-repeat; }`);
});

View File

@@ -273,7 +273,7 @@
max-width: 1000px;
margin: auto;
box-sizing: border-box;
padding-left: 217px;
padding-left: 219px;
padding-right: 20px;
overflow: visible;
}

View File

@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { Action } from 'vs/base/common/actions';
import { dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle';
import { DisposableStore } from 'vs/base/common/lifecycle';
import { URI } from 'vs/base/common/uri';
import { getIconClasses } from 'vs/editor/common/services/getIconClasses';
import { IModelService } from 'vs/editor/common/services/modelService';
@@ -198,9 +198,6 @@ export class OpenFolderSettingsAction extends Action {
static readonly ID = 'workbench.action.openFolderSettings';
static readonly LABEL = OPEN_FOLDER_SETTINGS_LABEL;
private disposables: IDisposable[] = [];
constructor(
id: string,
label: string,
@@ -210,8 +207,8 @@ export class OpenFolderSettingsAction extends Action {
) {
super(id, label);
this.update();
this.workspaceContextService.onDidChangeWorkbenchState(() => this.update(), this, this.disposables);
this.workspaceContextService.onDidChangeWorkspaceFolders(() => this.update(), this, this.disposables);
this._register(this.workspaceContextService.onDidChangeWorkbenchState(() => this.update(), this));
this._register(this.workspaceContextService.onDidChangeWorkspaceFolders(() => this.update(), this));
}
private update(): void {
@@ -228,11 +225,6 @@ export class OpenFolderSettingsAction extends Action {
return undefined;
});
}
dispose(): void {
this.disposables = dispose(this.disposables);
super.dispose();
}
}
export class ConfigureLanguageBasedSettingsAction extends Action {

View File

@@ -17,7 +17,7 @@ import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle';
import * as strings from 'vs/base/common/strings';
import { URI } from 'vs/base/common/uri';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { EditorExtensionsRegistry, IEditorContributionCtor, registerEditorContribution } from 'vs/editor/browser/editorExtensions';
import { EditorExtensionsRegistry, registerEditorContribution, IEditorContributionDescription } from 'vs/editor/browser/editorExtensions';
import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget';
import { IEditorOptions } from 'vs/editor/common/config/editorOptions';
import * as editorCommon from 'vs/editor/common/editorCommon';
@@ -54,7 +54,7 @@ import { DefaultPreferencesEditorInput, PreferencesEditorInput } from 'vs/workbe
import { DefaultSettingsEditorModel, SettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IHostService } from 'vs/workbench/services/host/browser/host';
import { withNullAsUndefined, withUndefinedAsNull } from 'vs/base/common/types';
import { withNullAsUndefined, withUndefinedAsNull, assertIsDefined } from 'vs/base/common/types';
export class PreferencesEditor extends BaseEditor {
@@ -683,7 +683,7 @@ class PreferencesRenderersController extends Disposable {
}
private _updatePreference(key: string, value: any, source: ISetting, fromEditableSettings?: boolean): void {
const data: { [key: string]: any } = {
const data: { [key: string]: any; } = {
userConfigurationKeys: [key]
};
@@ -718,7 +718,7 @@ class PreferencesRenderersController extends Disposable {
this.telemetryService.publicLog('defaultSettingsActions.copySetting', data);
}
private _findSetting(filterResult: IFilterResult, key: string): { groupIdx: number, settingIdx: number, overallSettingIdx: number } | undefined {
private _findSetting(filterResult: IFilterResult, key: string): { groupIdx: number, settingIdx: number, overallSettingIdx: number; } | undefined {
let overallSettingIdx = 0;
for (let groupIdx = 0; groupIdx < filterResult.filteredGroups.length; groupIdx++) {
@@ -826,11 +826,7 @@ class SideBySidePreferencesWidget extends Widget {
this._register(attachStylerCallback(this.themeService, { scrollbarShadow }, colors => {
const shadow = colors.scrollbarShadow ? colors.scrollbarShadow.toString() : null;
if (shadow) {
this.editablePreferencesEditorContainer.style.boxShadow = `-6px 0 5px -5px ${shadow}`;
} else {
this.editablePreferencesEditorContainer.style.boxShadow = null;
}
this.editablePreferencesEditorContainer.style.boxShadow = shadow ? `-6px 0 5px -5px ${shadow}` : '';
}));
this.splitview.addView({
@@ -845,7 +841,7 @@ class SideBySidePreferencesWidget extends Widget {
this._register(focusTracker.onDidFocus(() => this._onFocus.fire()));
}
setInput(defaultPreferencesEditorInput: DefaultPreferencesEditorInput, editablePreferencesEditorInput: EditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise<{ defaultPreferencesRenderer?: IPreferencesRenderer<ISetting>, editablePreferencesRenderer?: IPreferencesRenderer<ISetting> }> {
setInput(defaultPreferencesEditorInput: DefaultPreferencesEditorInput, editablePreferencesEditorInput: EditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise<{ defaultPreferencesRenderer?: IPreferencesRenderer<ISetting>, editablePreferencesRenderer?: IPreferencesRenderer<ISetting>; }> {
this.getOrCreateEditablePreferencesEditor(editablePreferencesEditorInput);
this.settingsTargetsWidget.settingsTarget = this.getSettingsTarget(editablePreferencesEditorInput.getResource()!);
return Promise.all([
@@ -990,10 +986,10 @@ export class DefaultPreferencesEditor extends BaseTextEditor {
super(DefaultPreferencesEditor.ID, telemetryService, instantiationService, storageService, configurationService, themeService, textFileService, editorService, editorGroupService, hostService);
}
private static _getContributions(): IEditorContributionCtor[] {
const skipContributions = [FoldingController.prototype, SelectionHighlighter.prototype, FindController.prototype];
const contributions = EditorExtensionsRegistry.getEditorContributions().filter(c => skipContributions.indexOf(c.prototype) === -1);
contributions.push(DefaultSettingsEditorContribution);
private static _getContributions(): IEditorContributionDescription[] {
const skipContributions = [FoldingController.ID, SelectionHighlighter.ID, FindController.ID];
const contributions = EditorExtensionsRegistry.getEditorContributions().filter(c => skipContributions.indexOf(c.id) === -1);
contributions.push({ id: DefaultSettingsEditorContribution.ID, ctor: DefaultSettingsEditorContribution });
return contributions;
}
@@ -1049,20 +1045,25 @@ export class DefaultPreferencesEditor extends BaseTextEditor {
return;
}
this.getControl().setModel((<ResourceEditorModel>editorModel).textEditorModel);
const editor = assertIsDefined(this.getControl());
editor.setModel((<ResourceEditorModel>editorModel).textEditorModel);
}));
}
clearInput(): void {
// Clear Model
this.getControl().setModel(null);
const editor = this.getControl();
if (editor) {
editor.setModel(null);
}
// Pass to super
super.clearInput();
}
layout(dimension: DOM.Dimension) {
this.getControl().layout(dimension);
const editor = assertIsDefined(this.getControl());
editor.layout(dimension);
}
protected getAriaLabel(): string {
@@ -1157,17 +1158,12 @@ abstract class AbstractSettingsEditorContribution extends Disposable implements
}
protected abstract _createPreferencesRenderer(): Promise<IPreferencesRenderer<ISetting> | null> | null;
abstract getId(): string;
}
export class DefaultSettingsEditorContribution extends AbstractSettingsEditorContribution implements ISettingsEditorContribution {
static readonly ID: string = 'editor.contrib.defaultsettings';
getId(): string {
return DefaultSettingsEditorContribution.ID;
}
protected _createPreferencesRenderer(): Promise<IPreferencesRenderer<ISetting> | null> | null {
return this.preferencesService.createPreferencesEditorModel(this.editor.getModel()!.uri)
.then<any>(editorModel => {
@@ -1194,10 +1190,6 @@ class SettingsEditorContribution extends AbstractSettingsEditorContribution impl
this._register(this.workspaceContextService.onDidChangeWorkbenchState(() => this._onModelChanged()));
}
getId(): string {
return SettingsEditorContribution.ID;
}
protected _createPreferencesRenderer(): Promise<IPreferencesRenderer<ISetting> | null> | null {
const model = this.editor.getModel();
if (model) {
@@ -1227,4 +1219,4 @@ class SettingsEditorContribution extends AbstractSettingsEditorContribution impl
}
}
registerEditorContribution(SettingsEditorContribution);
registerEditorContribution(SettingsEditorContribution.ID, SettingsEditorContribution);

View File

@@ -32,6 +32,7 @@ import { DefaultSettingsEditorModel, SettingsEditorModel, WorkspaceConfiguration
import { IMarkerService, IMarkerData, MarkerSeverity, MarkerTag } from 'vs/platform/markers/common/markers';
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
import { EditorOption } from 'vs/editor/common/config/editorOptions';
import { find } from 'vs/base/common/arrays';
export interface IPreferencesRenderer<T> extends IDisposable {
readonly preferencesModel: IPreferencesEditorModel<T>;
@@ -258,7 +259,7 @@ export class DefaultSettingsRenderer extends Disposable implements IPreferencesR
this.settingsGroupTitleRenderer = this._register(instantiationService.createInstance(SettingsGroupTitleRenderer, editor));
this.filteredMatchesRenderer = this._register(instantiationService.createInstance(FilteredMatchesRenderer, editor));
this.editSettingActionRenderer = this._register(instantiationService.createInstance(EditSettingRenderer, editor, preferencesModel, this.settingHighlighter));
this.bracesHidingRenderer = this._register(instantiationService.createInstance(BracesHidingRenderer, editor, preferencesModel));
this.bracesHidingRenderer = this._register(instantiationService.createInstance(BracesHidingRenderer, editor));
this.hiddenAreasRenderer = this._register(instantiationService.createInstance(HiddenAreasRenderer, editor, [this.settingsGroupTitleRenderer, this.filteredMatchesRenderer, this.bracesHidingRenderer]));
this._register(this.editSettingActionRenderer.onUpdateSetting(e => this._onUpdatePreference.fire(e)));
@@ -321,12 +322,7 @@ export class DefaultSettingsRenderer extends Disposable implements IPreferencesR
const { key, overrideOf } = setting;
if (overrideOf) {
const setting = this.getSetting(overrideOf);
for (const override of setting!.overrides!) {
if (override.key === key) {
return override;
}
}
return undefined;
return find(setting!.overrides!, override => override.key === key);
}
const settingsGroups = this.filterResult ? this.filterResult.filteredGroups : this.preferencesModel.settingsGroups;
return this.getPreference(key, settingsGroups);

View File

@@ -34,6 +34,7 @@ import { PANEL_ACTIVE_TITLE_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIV
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
import { ISettingsGroup } from 'vs/workbench/services/preferences/common/preferences';
import { EditorOption } from 'vs/editor/common/config/editorOptions';
import { isEqual } from 'vs/base/common/resources';
export class SettingsHeaderWidget extends Widget implements IViewZone {
@@ -341,7 +342,7 @@ export class FolderSettingsActionViewItem extends BaseActionViewItem {
this.container = container;
this.labelElement = DOM.$('.action-title');
this.detailsElement = DOM.$('.action-details');
this.dropDownElement = DOM.$('.dropdown-icon.octicon.octicon-triangle-down.hide');
this.dropDownElement = DOM.$('.dropdown-icon.codicon.codicon-triangle-down.hide');
this.anchorElement = DOM.$('a.action-label.folder-settings', {
role: 'button',
'aria-haspopup': 'true',
@@ -387,7 +388,7 @@ export class FolderSettingsActionViewItem extends BaseActionViewItem {
const oldFolder = this._folder;
const workspace = this.contextService.getWorkspace();
if (oldFolder) {
this._folder = workspace.folders.filter(folder => folder.uri.toString() === oldFolder.uri.toString())[0] || workspace.folders[0];
this._folder = workspace.folders.filter(folder => isEqual(folder.uri, oldFolder.uri))[0] || workspace.folders[0];
}
this._folder = this._folder ? this._folder : workspace.folders.length === 1 ? workspace.folders[0] : null;
@@ -440,7 +441,7 @@ export class FolderSettingsActionViewItem extends BaseActionViewItem {
return <IAction>{
id: 'folderSettingsTarget' + index,
label: this.labelWithCount(folder.name, folderCount),
checked: this.folder && this.folder.uri.toString() === folder.uri.toString(),
checked: this.folder && isEqual(this.folder.uri, folder.uri),
enabled: true,
run: () => this._action.run(folder)
};
@@ -574,7 +575,7 @@ export class SettingsTargetsWidget extends Widget {
const isSameTarget = this.settingsTarget === settingsTarget ||
settingsTarget instanceof URI &&
this.settingsTarget instanceof URI &&
this.settingsTarget.toString() === settingsTarget.toString();
isEqual(this.settingsTarget, settingsTarget);
if (!isSameTarget) {
this.settingsTarget = settingsTarget;
@@ -632,13 +633,13 @@ export class SearchWidget extends Widget {
if (this.options.showResultCount) {
this.countElement = DOM.append(this.controlsDiv, DOM.$('.settings-count-widget'));
this._register(attachStylerCallback(this.themeService, { badgeBackground, contrastBorder }, colors => {
const background = colors.badgeBackground ? colors.badgeBackground.toString() : null;
const border = colors.contrastBorder ? colors.contrastBorder.toString() : null;
const background = colors.badgeBackground ? colors.badgeBackground.toString() : '';
const border = colors.contrastBorder ? colors.contrastBorder.toString() : '';
this.countElement.style.backgroundColor = background;
this.countElement.style.borderWidth = border ? '1px' : null;
this.countElement.style.borderStyle = border ? 'solid' : null;
this.countElement.style.borderWidth = border ? '1px' : '';
this.countElement.style.borderStyle = border ? 'solid' : '';
this.countElement.style.borderColor = border;
const color = this.themeService.getTheme().getColor(badgeForeground);

View File

@@ -12,7 +12,7 @@ import * as collections from 'vs/base/common/collections';
import { getErrorMessage, isPromiseCanceledError } from 'vs/base/common/errors';
import { Iterator } from 'vs/base/common/iterator';
import * as strings from 'vs/base/common/strings';
import { isArray, withNullAsUndefined } from 'vs/base/common/types';
import { isArray, withNullAsUndefined, withUndefinedAsNull } from 'vs/base/common/types';
import { URI } from 'vs/base/common/uri';
import 'vs/css!./media/settingsEditor2';
import { localize } from 'vs/nls';
@@ -71,6 +71,7 @@ export class SettingsEditor2 extends BaseEditor {
private static NUM_INSTANCES: number = 0;
private static SETTING_UPDATE_FAST_DEBOUNCE: number = 200;
private static SETTING_UPDATE_SLOW_DEBOUNCE: number = 1000;
private static CONFIG_SCHEMA_UPDATE_DELAYER = 500;
private static readonly SUGGESTIONS: string[] = [
`@${MODIFIED_SETTING_TAG}`, '@tag:usesOnlineServices', `@${EXTENSION_SETTING_TAG}`
@@ -115,6 +116,8 @@ export class SettingsEditor2 extends BaseEditor {
private remoteSearchThrottle: ThrottledDelayer<void>;
private searchInProgress: CancellationTokenSource | null = null;
private updatedConfigSchemaDelayer: Delayer<void>;
private settingFastUpdateDelayer: Delayer<void>;
private settingSlowUpdateDelayer: Delayer<void>;
private pendingSettingUpdate: { key: string, value: any } | null = null;
@@ -161,6 +164,8 @@ export class SettingsEditor2 extends BaseEditor {
this.settingFastUpdateDelayer = new Delayer<void>(SettingsEditor2.SETTING_UPDATE_FAST_DEBOUNCE);
this.settingSlowUpdateDelayer = new Delayer<void>(SettingsEditor2.SETTING_UPDATE_SLOW_DEBOUNCE);
this.updatedConfigSchemaDelayer = new Delayer<void>(SettingsEditor2.CONFIG_SCHEMA_UPDATE_DELAYER);
this.inSettingsEditorContextKey = CONTEXT_SETTINGS_EDITOR.bindTo(contextKeyService);
this.searchFocusContextKey = CONTEXT_SETTINGS_SEARCH_FOCUS.bindTo(contextKeyService);
this.tocRowFocused = CONTEXT_TOC_ROW_FOCUS.bindTo(contextKeyService);
@@ -216,31 +221,29 @@ export class SettingsEditor2 extends BaseEditor {
return super.setInput(input, options, token)
.then(() => timeout(0)) // Force setInput to be async
.then(() => {
return this.render(token);
})
.then(() => {
options = options || SettingsEditorOptions.create({});
// Don't block setInput on render (which can trigger an async search)
this.render(token).then(() => {
options = options || SettingsEditorOptions.create({});
if (!this.viewState.settingsTarget) {
if (!options.target) {
options.target = ConfigurationTarget.USER_LOCAL;
if (!this.viewState.settingsTarget) {
if (!options.target) {
options.target = ConfigurationTarget.USER_LOCAL;
}
}
}
this._setOptions(options);
this._setOptions(options);
this._register(input.onDispose(() => {
this.searchWidget.setValue('');
}));
this._register(input.onDispose(() => {
this.searchWidget.setValue('');
}));
// Init TOC selection
this.updateTreeScrollSync();
this.restoreCachedState();
// Init TOC selection
this.updateTreeScrollSync();
});
});
}
private restoreCachedState(): void {
private restoreCachedState(): ISettingsEditor2State | null {
const cachedState = this.group && this.input && this.editorMemento.loadEditorState(this.group, this.input);
if (cachedState && typeof cachedState.target === 'object') {
cachedState.target = URI.revive(cachedState.target);
@@ -249,9 +252,15 @@ export class SettingsEditor2 extends BaseEditor {
if (cachedState) {
const settingsTarget = cachedState.target;
this.settingsTargetsWidget.settingsTarget = settingsTarget;
this.onDidSettingsTargetChange(settingsTarget);
this.viewState.settingsTarget = settingsTarget;
this.searchWidget.setValue(cachedState.searchQuery);
}
if (this.input) {
this.editorMemento.clearEditorState(this.input, this.group);
}
return withUndefinedAsNull(cachedState);
}
setOptions(options: SettingsEditorOptions | undefined): void {
@@ -281,10 +290,6 @@ export class SettingsEditor2 extends BaseEditor {
clearInput(): void {
this.inSettingsEditorContextKey.set(false);
if (this.input) {
this.editorMemento.clearEditorState(this.input, this.group);
}
super.clearInput();
}
@@ -408,15 +413,15 @@ export class SettingsEditor2 extends BaseEditor {
this.countElement = DOM.append(searchContainer, DOM.$('.settings-count-widget'));
this._register(attachStylerCallback(this.themeService, { badgeBackground, contrastBorder, badgeForeground }, colors => {
const background = colors.badgeBackground ? colors.badgeBackground.toString() : null;
const border = colors.contrastBorder ? colors.contrastBorder.toString() : null;
const foreground = colors.badgeForeground ? colors.badgeForeground.toString() : null;
const background = colors.badgeBackground ? colors.badgeBackground.toString() : '';
const border = colors.contrastBorder ? colors.contrastBorder.toString() : '';
const foreground = colors.badgeForeground ? colors.badgeForeground.toString() : '';
this.countElement.style.backgroundColor = background;
this.countElement.style.color = foreground;
this.countElement.style.borderWidth = border ? '1px' : null;
this.countElement.style.borderStyle = border ? 'solid' : null;
this.countElement.style.borderWidth = border ? '1px' : '';
this.countElement.style.borderStyle = border ? 'solid' : '';
this.countElement.style.borderColor = border;
}));
@@ -855,7 +860,11 @@ export class SettingsEditor2 extends BaseEditor {
return undefined;
}
this._register(model.onDidChangeGroups(() => this.onConfigUpdate()));
this._register(model.onDidChangeGroups(() => {
this.updatedConfigSchemaDelayer.trigger(() => {
this.onConfigUpdate(undefined, undefined, true);
});
}));
this.defaultSettingsEditorModel = model;
return this.onConfigUpdate(undefined, true);
});
@@ -889,7 +898,7 @@ export class SettingsEditor2 extends BaseEditor {
});
}
private onConfigUpdate(keys?: string[], forceRefresh = false): void {
private async onConfigUpdate(keys?: string[], forceRefresh = false, schemaChange = false): Promise<void> {
if (keys && this.settingsTreeModel) {
return this.updateElementsByKey(keys);
}
@@ -922,23 +931,26 @@ export class SettingsEditor2 extends BaseEditor {
if (this.settingsTreeModel) {
this.settingsTreeModel.update(resolvedSettingsRoot);
// Make sure that all extensions' settings are included in search results
const cachedState = this.group && this.input && this.editorMemento.loadEditorState(this.group, this.input);
if (cachedState && cachedState.searchQuery) {
this.triggerSearch(cachedState.searchQuery);
} else {
this.renderTree(undefined, forceRefresh);
this.refreshTOCTree();
if (schemaChange && !!this.searchResultModel) {
// If an extension's settings were just loaded and a search is active, retrigger the search so it shows up
return await this.onSearchInputChanged();
}
this.refreshTOCTree();
this.renderTree(undefined, forceRefresh);
} else {
this.settingsTreeModel = this.instantiationService.createInstance(SettingsTreeModel, this.viewState);
this.settingsTreeModel.update(resolvedSettingsRoot);
this.tocTreeModel.settingsTreeRoot = this.settingsTreeModel.root as SettingsTreeGroupElement;
this.refreshTOCTree();
this.refreshTree();
this.tocTree.collapseAll();
const cachedState = this.restoreCachedState();
if (cachedState && cachedState.searchQuery) {
await this.onSearchInputChanged();
} else {
this.refreshTOCTree();
this.refreshTree();
this.tocTree.collapseAll();
}
}
}
@@ -1045,14 +1057,14 @@ export class SettingsEditor2 extends BaseEditor {
}
}
private onSearchInputChanged(): void {
private async onSearchInputChanged(): Promise<void> {
const query = this.searchWidget.getValue().trim();
this.delayedFilterLogging.cancel();
this.triggerSearch(query.replace(//g, ' ')).then(() => {
if (query && this.searchResultModel) {
this.delayedFilterLogging.trigger(() => this.reportFilteringUsed(query, this.searchResultModel!.getUniqueResults()));
}
});
await this.triggerSearch(query.replace(//g, ' '));
if (query && this.searchResultModel) {
this.delayedFilterLogging.trigger(() => this.reportFilteringUsed(query, this.searchResultModel!.getUniqueResults()));
}
}
private parseSettingFromJSON(query: string): string | null {
@@ -1097,16 +1109,16 @@ export class SettingsEditor2 extends BaseEditor {
// Added a filter model
this.tocTree.setSelection([]);
this.tocTree.expandAll();
this.refreshTOCTree();
this.renderResultCountMessages();
this.refreshTree();
} else {
// Leaving search mode
this.tocTree.collapseAll();
this.refreshTOCTree();
this.renderResultCountMessages();
this.refreshTree();
}
this.refreshTOCTree();
}
return Promise.resolve();
@@ -1235,8 +1247,8 @@ export class SettingsEditor2 extends BaseEditor {
this.viewState.filterToCategory = undefined;
this.tocTree.expandAll();
this.renderTree(undefined, true);
this.refreshTOCTree();
this.renderTree(undefined, true);
return result;
});
}

View File

@@ -132,7 +132,7 @@ export const tocData: ITOCEntry = {
{
id: 'features/search',
label: localize('search', "Search"),
settings: ['search.*', 'searchRipgrep.*']
settings: ['search.*']
}
,
{
@@ -155,6 +155,11 @@ export const tocData: ITOCEntry = {
label: localize('terminal', "Terminal"),
settings: ['terminal.*']
},
{
id: 'features/task',
label: localize('task', "Task"),
settings: ['task.*']
},
{
id: 'features/problems',
label: localize('problems', "Problems"),

View File

@@ -12,7 +12,7 @@ import { alert as ariaAlert } from 'vs/base/browser/ui/aria/aria';
import { Button } from 'vs/base/browser/ui/button/button';
import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox';
import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
import { IListVirtualDelegate, ListAriaRootRole } from 'vs/base/browser/ui/list/list';
import { ListAriaRootRole, CachedListVirtualDelegate } from 'vs/base/browser/ui/list/list';
import { DefaultStyleController } from 'vs/base/browser/ui/list/listWidget';
import { ISelectOptionItem, SelectBox } from 'vs/base/browser/ui/selectBox/selectBox';
import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar';
@@ -1379,29 +1379,7 @@ export class SettingsTreeFilter implements ITreeFilter<SettingsTreeElement> {
}
}
class SettingsTreeDelegate implements IListVirtualDelegate<SettingsTreeGroupChild> {
private heightCache = new WeakMap<SettingsTreeGroupChild, number>();
getHeight(element: SettingsTreeGroupChild): number {
const cachedHeight = this.heightCache.get(element);
if (typeof cachedHeight === 'number') {
return cachedHeight;
}
if (element instanceof SettingsTreeGroupElement) {
if (element.isFirstGroup) {
return 31;
}
return 40 + (7 * element.level);
}
return element instanceof SettingsTreeSettingElement && element.valueType === SettingValueType.Boolean ?
78 :
104;
}
class SettingsTreeDelegate extends CachedListVirtualDelegate<SettingsTreeGroupChild> {
getTemplateId(element: SettingsTreeGroupElement | SettingsTreeSettingElement | SettingsTreeNewExtensionsElement): string {
if (element instanceof SettingsTreeGroupElement) {
@@ -1447,8 +1425,16 @@ class SettingsTreeDelegate implements IListVirtualDelegate<SettingsTreeGroupChil
return !(element instanceof SettingsTreeGroupElement);
}
setDynamicHeight(element: SettingsTreeGroupChild, height: number): void {
this.heightCache.set(element, height);
protected estimateHeight(element: SettingsTreeGroupChild): number {
if (element instanceof SettingsTreeGroupElement) {
if (element.isFirstGroup) {
return 31;
}
return 40 + (7 * element.level);
}
return element instanceof SettingsTreeSettingElement && element.valueType === SettingValueType.Boolean ? 78 : 104;
}
}
@@ -1488,8 +1474,8 @@ export class SettingsTree extends ObjectTree<SettingsTreeElement> {
filter: instantiationService.createInstance(SettingsTreeFilter, viewState)
});
this.disposables = [];
this.disposables.push(registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
this.disposables.clear();
this.disposables.add(registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
const activeBorderColor = theme.getColor(focusBorder);
if (activeBorderColor) {
// TODO@rob - why isn't this applied when added to the stylesheet from tocTree.ts? Seems like a chromium glitch.
@@ -1539,7 +1525,7 @@ export class SettingsTree extends ObjectTree<SettingsTreeElement> {
this.getHTMLElement().classList.add(treeClass);
this.disposables.push(attachStyler(themeService, {
this.disposables.add(attachStyler(themeService, {
listActiveSelectionBackground: transparent(Color.white, 0),
listActiveSelectionForeground: foreground,
listFocusAndSelectionBackground: transparent(Color.white, 0),

View File

@@ -90,7 +90,7 @@ export class SettingsTreeNewExtensionsElement extends SettingsTreeElement {
}
export class SettingsTreeSettingElement extends SettingsTreeElement {
private static MAX_DESC_LINES = 20;
private static readonly MAX_DESC_LINES = 20;
setting: ISetting;
@@ -273,13 +273,7 @@ export class SettingsTreeSettingElement extends SettingsTreeElement {
return false;
}
for (let extensionId of extensionFilters) {
if (extensionId.toLowerCase() === this.setting.extensionInfo.id.toLowerCase()) {
return true;
}
}
return false;
return Array.from(extensionFilters).some(extensionId => extensionId.toLowerCase() === this.setting.extensionInfo!.id.toLowerCase());
}
}
@@ -409,7 +403,7 @@ function sanitizeId(id: string): string {
return id.replace(/[\.\/]/, '_');
}
export function settingKeyToDisplayFormat(key: string, groupId = ''): { category: string, label: string } {
export function settingKeyToDisplayFormat(key: string, groupId = ''): { category: string, label: string; } {
const lastDotIdx = key.lastIndexOf('.');
let category = '';
if (lastDotIdx >= 0) {
@@ -542,12 +536,18 @@ export class SearchResultModel extends SettingsTreeModel {
setResult(order: SearchResultIdx, result: ISearchResult | null): void {
this.cachedUniqueSearchResults = null;
this.newExtensionSearchResults = null;
this.rawSearchResults = this.rawSearchResults || [];
if (!result) {
delete this.rawSearchResults[order];
return;
}
if (result.exactMatch) {
this.rawSearchResults = [];
}
this.rawSearchResults[order] = result;
this.updateChildren();
}

View File

@@ -57,6 +57,11 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox { background-color: ${checkboxBackgroundColor} !important; }`);
}
const checkboxForegroundColor = theme.getColor(settingsCheckboxForeground);
if (checkboxForegroundColor) {
collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox { color: ${checkboxForegroundColor} !important; }`);
}
const checkboxBorderColor = theme.getColor(settingsCheckboxBorder);
if (checkboxBorderColor) {
collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox { border-color: ${checkboxBorderColor} !important; }`);

View File

@@ -211,7 +211,7 @@ export class TOCTree extends ObjectTree<SettingsTreeGroupElement> {
this.getHTMLElement().classList.add(treeClass);
this.disposables.push(attachStyler(themeService, {
this.disposables.add(attachStyler(themeService, {
listActiveSelectionBackground: editorBackground,
listActiveSelectionForeground: settingsHeaderForeground,
listFocusAndSelectionBackground: editorBackground,