Skip to content

Commit 75f7486

Browse files
committed
Merge branch 'master' of github.com:microsoft/vscode
2 parents dcc9e66 + 9bf6af0 commit 75f7486

11 files changed

Lines changed: 102 additions & 70 deletions

File tree

src/vs/platform/webview/electron-main/webviewProtocolProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ export class WebviewProtocolProvider extends Disposable {
131131
} else {
132132
url = require.toUrl(`vs/workbench/contrib/webview/browser/pre/${entry}`);
133133
}
134-
return callback(url.replace('file://', ''));
134+
return callback(decodeURIComponent(url.replace('file://', '')));
135135
}
136136
} catch {
137137
// noop

src/vs/workbench/api/common/extHostNotebook.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,12 +1151,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
11511151
}
11521152

11531153
if (this._notebookContentProviders.has(viewType)) {
1154-
try {
1155-
await this._notebookContentProviders.get(viewType)!.provider.saveNotebook(document, token);
1156-
} catch (e) {
1157-
return false;
1158-
}
1159-
1154+
await this._notebookContentProviders.get(viewType)!.provider.saveNotebook(document, token);
11601155
return true;
11611156
}
11621157

@@ -1170,12 +1165,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
11701165
}
11711166

11721167
if (this._notebookContentProviders.has(viewType)) {
1173-
try {
1174-
await this._notebookContentProviders.get(viewType)!.provider.saveNotebookAs(URI.revive(target), document, token);
1175-
} catch (e) {
1176-
return false;
1177-
}
1178-
1168+
await this._notebookContentProviders.get(viewType)!.provider.saveNotebookAs(URI.revive(target), document, token);
11791169
return true;
11801170
}
11811171

src/vs/workbench/contrib/notebook/browser/media/notebook.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,12 @@
396396
opacity: 1;
397397
}
398398

399+
.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-side {
400+
/** Overidden for code cells */
401+
top: 0px;
402+
bottom: 0px;
403+
}
404+
399405
.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-top,
400406
.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-bottom {
401407
width: 100%;

src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -268,19 +268,17 @@ abstract class AbstractCellRenderer {
268268
this.notebookEditor.focus();
269269
}
270270

271-
if (templateData.focusIndicator) {
272-
if (actions.primary.length || actions.secondary.length) {
273-
templateData.container.classList.add('cell-has-toolbar-actions');
271+
if (actions.primary.length || actions.secondary.length) {
272+
templateData.container.classList.add('cell-has-toolbar-actions');
273+
if (isCodeCellRenderTemplate(templateData)) {
274274
templateData.focusIndicator.style.top = `${EDITOR_TOOLBAR_HEIGHT + EDITOR_TOP_MARGIN}px`;
275-
if (isCodeCellRenderTemplate(templateData)) {
276-
templateData.focusIndicatorRight.style.top = `${EDITOR_TOOLBAR_HEIGHT + EDITOR_TOP_MARGIN}px`;
277-
}
278-
} else {
279-
templateData.container.classList.remove('cell-has-toolbar-actions');
275+
templateData.focusIndicatorRight.style.top = `${EDITOR_TOOLBAR_HEIGHT + EDITOR_TOP_MARGIN}px`;
276+
}
277+
} else {
278+
templateData.container.classList.remove('cell-has-toolbar-actions');
279+
if (isCodeCellRenderTemplate(templateData)) {
280280
templateData.focusIndicator.style.top = `${EDITOR_TOP_MARGIN}px`;
281-
if (isCodeCellRenderTemplate(templateData)) {
282-
templateData.focusIndicatorRight.style.top = `${EDITOR_TOP_MARGIN}px`;
283-
}
281+
templateData.focusIndicatorRight.style.top = `${EDITOR_TOP_MARGIN}px`;
284282
}
285283
}
286284
};

src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,8 @@ export class CodeCell extends Disposable {
364364
let hasDynamicHeight = result.hasDynamicHeight;
365365

366366
if (hasDynamicHeight) {
367+
this.viewCell.selfSizeMonitoring = true;
368+
367369
let clientHeight = outputItemDiv.clientHeight;
368370
let dimension = {
369371
width: this.viewCell.layoutInfo.editorWidth,

src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,17 @@
2828
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-sibling {
2929
max-width: 10%;
3030
}
31-
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key {
31+
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key,
32+
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key {
3233
margin-left: 4px;
33-
flex: 2;
3434
min-width: 40%;
3535
}
36+
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key {
37+
margin-left: 0;
38+
}
39+
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-value,
3640
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value {
37-
flex: 3;
41+
width: 100%;
3842
}
3943
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row:hover .setting-list-object-value,
4044
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row:focus .setting-list-object-value,
@@ -139,16 +143,13 @@
139143
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input {
140144
height: 24px;
141145
max-width: 320px;
142-
flex: 3;
143146
margin-right: 4px;
144147
}
145-
146-
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key {
147-
flex: 2;
148-
min-width: 40%;
148+
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input {
149+
max-width: unset;
149150
}
150151

151-
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-okButton {
152+
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-ok-button {
152153
margin-right: 4px;
153154
}
154155

src/vs/workbench/contrib/preferences/browser/settingsTree.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticip
4444
import { getIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge';
4545
import { ITOCEntry } from 'vs/workbench/contrib/preferences/browser/settingsLayout';
4646
import { ISettingsEditorViewState, settingKeyToDisplayFormat, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels';
47-
import { ExcludeSettingWidget, ISettingListChangeEvent, IListDataItem, ListSettingWidget, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground, ObjectSettingWidget, IObjectDataItem, IObjectEnumOption } from 'vs/workbench/contrib/preferences/browser/settingsWidgets';
47+
import { ExcludeSettingWidget, ISettingListChangeEvent, IListDataItem, ListSettingWidget, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground, ObjectSettingWidget, IObjectDataItem, IObjectEnumOption, ObjectValue } from 'vs/workbench/contrib/preferences/browser/settingsWidgets';
4848
import { SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/preferences/common/preferences';
4949
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
5050
import { ISetting, ISettingsGroup, SettingValueType } from 'vs/workbench/services/preferences/common/preferences';
@@ -94,6 +94,16 @@ function getEnumOptionsFromSchema(schema: IJSONSchema): IObjectEnumOption[] {
9494
});
9595
}
9696

97+
function getObjectValueType(schema: IJSONSchema): ObjectValue['type'] {
98+
if (schema.type === 'boolean') {
99+
return 'boolean';
100+
} else if (schema.type === 'string' && isDefined(schema.enum) && schema.enum.length > 0) {
101+
return 'enum';
102+
} else {
103+
return 'string';
104+
}
105+
}
106+
97107
function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectDataItem[] {
98108
const data = element.isConfigured ?
99109
{ ...element.defaultValue, ...element.scopeValue } :
@@ -129,7 +139,7 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData
129139
options: wellDefinedKeyEnumOptions,
130140
},
131141
value: {
132-
type: valueEnumOptions.length > 0 ? 'enum' : 'string',
142+
type: getObjectValueType(objectProperties[key]),
133143
data: data[key],
134144
options: valueEnumOptions,
135145
},
@@ -144,7 +154,7 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData
144154
return {
145155
key: { type: 'string', data: key },
146156
value: {
147-
type: valueEnumOptions.length > 0 ? 'enum' : 'string',
157+
type: getObjectValueType(schema),
148158
data: data[key],
149159
options: valueEnumOptions,
150160
},
@@ -155,7 +165,7 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData
155165
return {
156166
key: { type: 'string', data: key },
157167
value: {
158-
type: additionalValueEnums.length > 0 ? 'enum' : 'string',
168+
type: typeof objectAdditionalProperties === 'object' ? getObjectValueType(objectAdditionalProperties) : 'string',
159169
data: data[key],
160170
options: additionalValueEnums,
161171
},

src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ export function isExcludeSetting(setting: ISetting): boolean {
469469
}
470470

471471
function isObjectRenderableSchema({ type }: IJSONSchema): boolean {
472-
return type === 'string';
472+
return type === 'string' || type === 'boolean';
473473
}
474474

475475
function isObjectSetting({
@@ -496,13 +496,14 @@ function isObjectSetting({
496496
return false;
497497
}
498498

499-
return Object.values(objectProperties ?? {}).every(isObjectRenderableSchema) &&
500-
Object.values(objectPatternProperties ?? {}).every(isObjectRenderableSchema) &&
501-
(
502-
typeof objectAdditionalProperties === 'object'
503-
? isObjectRenderableSchema(objectAdditionalProperties)
504-
: true
505-
);
499+
const schemas = [...Object.values(objectProperties ?? {}), ...Object.values(objectPatternProperties ?? {})];
500+
501+
if (typeof objectAdditionalProperties === 'object') {
502+
schemas.push(objectAdditionalProperties);
503+
}
504+
505+
// This should not render boolean only objects
506+
return schemas.every(isObjectRenderableSchema) && schemas.some(({ type }) => type === 'string');
506507
}
507508

508509
function settingTypeEnumRenderable(_type: string | string[]) {

src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -560,13 +560,15 @@ export class ListSettingWidget extends AbstractListSettingWidget<IListDataItem>
560560

561561
const okButton = this._register(new Button(rowElement));
562562
okButton.label = localize('okButton', "OK");
563-
okButton.element.classList.add('setting-list-okButton');
563+
okButton.element.classList.add('setting-list-ok-button');
564+
564565
this.listDisposables.add(attachButtonStyler(okButton, this.themeService));
565566
this.listDisposables.add(okButton.onDidClick(() => onSubmit(updatedItem())));
566567

567568
const cancelButton = this._register(new Button(rowElement));
568569
cancelButton.label = localize('cancelButton', "Cancel");
569-
cancelButton.element.classList.add('setting-list-okButton');
570+
cancelButton.element.classList.add('setting-list-cancel-button');
571+
570572
this.listDisposables.add(attachButtonStyler(cancelButton, this.themeService));
571573
this.listDisposables.add(cancelButton.onDidClick(onCancel));
572574

@@ -639,11 +641,17 @@ interface IObjectEnumData {
639641
options: IObjectEnumOption[];
640642
}
641643

642-
type ObjectKeyOrValue = IObjectStringData | IObjectEnumData;
644+
interface IObjectBoolData {
645+
type: 'boolean';
646+
data: boolean;
647+
}
648+
649+
type ObjectKey = IObjectStringData | IObjectEnumData;
650+
export type ObjectValue = IObjectStringData | IObjectEnumData | IObjectBoolData;
643651

644652
export interface IObjectDataItem {
645-
key: ObjectKeyOrValue;
646-
value: ObjectKeyOrValue;
653+
key: ObjectKey;
654+
value: ObjectValue;
647655
removable: boolean;
648656
}
649657

@@ -735,7 +743,7 @@ export class ObjectSettingWidget extends AbstractListSettingWidget<IObjectDataIt
735743
const valueElement = DOM.append(rowElement, $('.setting-list-object-value'));
736744

737745
keyElement.textContent = item.key.data;
738-
valueElement.textContent = item.value.data;
746+
valueElement.textContent = item.value.data.toString();
739747

740748
return rowElement;
741749
}
@@ -794,20 +802,27 @@ export class ObjectSettingWidget extends AbstractListSettingWidget<IObjectDataIt
794802
} else if (valueWidget instanceof SelectBox) {
795803
this.listDisposables.add(
796804
valueWidget.onDidSelect(({ selected }) => {
797-
onSubmit({ ...item, value: { ...item.value, data: selected } });
805+
onSubmit({
806+
...item,
807+
value: item.value.type === 'boolean'
808+
? { ...item.value, data: selected === 'true' ? true : false }
809+
: { ...item.value, data: selected },
810+
});
798811
})
799812
);
800813
}
801814

802815
const okButton = this._register(new Button(rowElement));
803816
okButton.label = localize('okButton', "OK");
804-
okButton.element.classList.add('setting-list-okButton');
817+
okButton.element.classList.add('setting-list-ok-button');
818+
805819
this.listDisposables.add(attachButtonStyler(okButton, this.themeService));
806820
this.listDisposables.add(okButton.onDidClick(() => onSubmit(updatedItem())));
807821

808822
const cancelButton = this._register(new Button(rowElement));
809823
cancelButton.label = localize('cancelButton', "Cancel");
810-
cancelButton.element.classList.add('setting-list-okButton');
824+
cancelButton.element.classList.add('setting-list-cancel-button');
825+
811826
this.listDisposables.add(attachButtonStyler(cancelButton, this.themeService));
812827
this.listDisposables.add(cancelButton.onDidClick(onCancel));
813828

@@ -847,22 +862,32 @@ export class ObjectSettingWidget extends AbstractListSettingWidget<IObjectDataIt
847862
};
848863
}
849864

850-
private renderEditWidget(keyOrValue: ObjectKeyOrValue, rowElement: HTMLElement, isKey: boolean) {
865+
private renderEditWidget(keyOrValue: ObjectKey | ObjectValue, rowElement: HTMLElement, isKey: boolean) {
851866
switch (keyOrValue.type) {
852867
case 'string':
853868
return this.renderStringEditWidget(keyOrValue, rowElement, isKey);
854869
case 'enum':
855870
return this.renderEnumEditWidget(keyOrValue, rowElement, isKey);
871+
case 'boolean':
872+
return this.renderEnumEditWidget(
873+
{
874+
type: 'enum',
875+
data: keyOrValue.data.toString(),
876+
options: [{ value: 'true' }, { value: 'false' }],
877+
},
878+
rowElement,
879+
isKey
880+
);
856881
}
857882
}
858883

859884
private renderStringEditWidget(keyOrValue: IObjectStringData, rowElement: HTMLElement, isKey: boolean) {
860885
const inputBox = new InputBox(rowElement, this.contextViewService);
861886

862-
inputBox.element.classList.add('setting-list-object-input');
863-
if (isKey) {
864-
inputBox.element.classList.add('setting-list-object-input-key');
865-
}
887+
inputBox.element.classList.add(
888+
'setting-list-object-input',
889+
isKey ? 'setting-list-object-input-key' : 'setting-list-object-input-value',
890+
);
866891

867892
this.listDisposables.add(attachInputBoxStyler(inputBox, this.themeService, {
868893
inputBackground: settingsTextInputBackground,
@@ -877,8 +902,7 @@ export class ObjectSettingWidget extends AbstractListSettingWidget<IObjectDataIt
877902

878903
private renderEnumEditWidget(keyOrValue: IObjectEnumData, rowElement: HTMLElement, isKey: boolean) {
879904
const selectBoxOptions = keyOrValue.options.map(({ value, description }) => ({ text: value, description }));
880-
const dataIndex = keyOrValue.options.findIndex(option => keyOrValue.data === option.value);
881-
const selected = dataIndex >= 0 ? dataIndex : 0;
905+
const selected = keyOrValue.options.findIndex(option => keyOrValue.data === option.value);
882906

883907
const selectBox = new SelectBox(selectBoxOptions, selected, this.contextViewService, undefined, {
884908
useCustomDrawn: !(isIOS && BrowserFeatures.pointerEvents)
@@ -892,9 +916,9 @@ export class ObjectSettingWidget extends AbstractListSettingWidget<IObjectDataIt
892916
}));
893917

894918
const wrapper = $('.setting-list-object-input');
895-
if (isKey) {
896-
wrapper.classList.add('setting-list-object-input-key');
897-
}
919+
wrapper.classList.add(
920+
isKey ? 'setting-list-object-input-key' : 'setting-list-object-input-value',
921+
);
898922

899923
selectBox.render(wrapper);
900924
rowElement.append(wrapper);

src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,9 +1064,9 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
10641064
const eol = model.getEOL();
10651065
const edits = format(JSON.stringify(task), undefined, { eol, tabSize, insertSpaces });
10661066
let stringified = applyEdits(JSON.stringify(task), edits);
1067-
const regex = new RegExp(eol + '\\t', 'g');
1068-
stringified = stringified.replace(regex, eol + '\t\t\t');
1069-
const twoTabs = '\t\t';
1067+
const regex = new RegExp(eol + (insertSpaces ? strings.repeat(' ', tabSize) : '\\t'), 'g');
1068+
stringified = stringified.replace(regex, eol + (insertSpaces ? strings.repeat(' ', tabSize * 3) : '\t\t\t'));
1069+
const twoTabs = insertSpaces ? strings.repeat(' ', tabSize * 2) : '\t\t';
10701070
stringValue = twoTabs + stringified.slice(0, stringified.length - 1) + twoTabs + stringified.slice(stringified.length - 1);
10711071
} finally {
10721072
if (reference) {
@@ -1089,7 +1089,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
10891089
const contentValue = content.toString();
10901090
let stringValue: string | undefined;
10911091
if (configIndex !== -1) {
1092-
const json: TaskConfig.ExternalTaskRunnerConfiguration = JSON.parse(contentValue);
1092+
const json: TaskConfig.ExternalTaskRunnerConfiguration = this.configurationService.getValue<TaskConfig.ExternalTaskRunnerConfiguration>('tasks', { resource });
10931093
if (json.tasks && (json.tasks.length > configIndex)) {
10941094
stringValue = await this.formatTaskForJson(resource, json.tasks[configIndex]);
10951095
}

0 commit comments

Comments
 (0)