mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-07 17:23:56 -05:00
Merge VS Code 1.26.1 (#2394)
* Squash merge commits for 1.26 (#1) (#2323) * Polish tag search as per feedback (#55269) * Polish tag search as per feedback * Updated regex * Allow users to opt-out of features that send online requests in the background (#55097) * settings sweep #54690 * Minor css tweaks to enable eoverflow elipsis in more places (#55277) * fix an issue with titlebarheight when not scaling with zoom * Settings descriptions update #54690 * fixes #55209 * Settings editor - many padding fixes * More space above level 2 label * Fixing Cannot debug npm script using Yarn #55103 * Settings editor - show ellipsis when description overflows * Settings editor - ... fix measuring around links, relayout * Setting descriptions * Settings editor - fix ... for some short lines, fix select container width * Settings editor - overlay trees so scrollable shadow is full width * Fix #54133 - missing extension settings after reload * Settings color token description tweak * Settings editor - disable overflow indicator temporarily, needs to be faster * Added command to Run the selected npm script * fixes #54452 * fixes #54929 * fixes #55248 * prefix command with extension name * Contribute run selected to the context menu * node-debug@1.26.6 * Allow terminal rendererType to be swapped out at runtime Part of #53274 Fixes #55344 * Settings editor - fix not focusing search when restoring editor setInput must be actually async. Will be fixed naturally when we aren't using winJS promises... * Settings editor - TOC should only expand the section with a selected item * Bump node-debug2 * Settings editor - Tree focus outlines * Settings editor - don't blink the scrollbar when toc selection changes And hide TOC correctly when the editor is narrow * Settings editor - header rows should not be selectable * fixes #54877 * change debug assignee to isi * Settings sweep (#54690) * workaround for #55051 * Settings sweep (#54690) * settings sweep #54690 * Don't try closing tags when you type > after another > * Describe what implementation code lens does Fixes #55370 * fix javadoc formatter setting description * fixes #55325 * update to officical TS version * Settings editor - Even more padding, use semibold instead of bold * Fix #55357 - fix TOC twistie * fixes #55288 * explorer: refresh on di change file system provider registration fixes #53256 * Disable push to Linux repo to test standalone publisher * New env var to notify log level to extensions #54001 * Disable snippets in extension search (when not in suggest dropdown) (#55281) * Disable snippits in extension search (when not in suggest dropdown) * Add monaco input contributions * Fix bug preventing snippetSuggestions from taking effect in sub-editors * Latest emmet helper to fix #52366 * Fix comment updates for threads within same file * Allow extensions to log telemetry to log files #54001 * Pull latest css grammar * files.exclude control - use same style for "add" vs "edit" * files.exclude control - focus/keyboard behavior * don't show menubar too early * files.exclude - better styling * Place cursor at end of extensions search box on autofill (#55254) * Place cursor at end of extensions search box on autofill * Use position instead of selection * fix linux build issue (empty if block) * Settings editor - fix extension category prefixes * Settings editor - add simple ellipsis for first line that overflows, doesn't cover case when first line does not overflow but there is more text, TODO * File/Text search provider docs * Fixes #52655 * Include epoch (#55008) * Fixes #53385 * Fixes #49480 * VS Code Insiders (Users) not opening Fixes #55353 * Better handling of the case when the extension host fails to start * Fixes #53966 * Remove confusing Start from wordPartLeft commands ID * vscode-xterm@3.6.0-beta12 Fixes #55488 * Initial size is set to infinity!! Fixes #55461 * Polish embeddedEditorBackground * configuration service misses event * Fix #55224 - fix duplicate results in multiroot workspace from splitting the diskseach query * Select all not working in issue reporter on mac, fixes #55424 * Disable fuzzy matching for extensions autosuggest (#55498) * Fix clipping of extensions search border in some third party themes (#55504) * fixes #55538 * Fix bug causing an aria alert to not be shown the third time (and odd numbers thereafter) * Settings editor - work around rendering glitch with webkit-line-clamp * Settings editor - revert earlier '...' changes * Settings editor - move enumDescription to its own div, because it disturbs -webkit-line-clamp for some reason * Settings editor - better overflow indicator * Don't show existing filters in autocomplete (#55495) * Dont show existing filters in autocomplete * Simplify * Settings Editor: Add aria labels for input elements Fixes: #54836 (#55543) * fixes #55223 * Update vscode-css-languageservice to 3.0.10-next.1 * Fix #55509 - settings navigation * Fix #55519 * Fix #55520 * FIx #55524 * Fix #55556 - include wordSeparators in all search queries, so findTextInFiles can respect isWordMatch correctly * oss updates for endgame * Fix unit tests * fixes #55522 * Avoid missing manifest error from bubbling up #54757 * Settings format crawl * Search provider - Fix FileSearchProvider to return array, not progress * Fix #55598 * Settings editor - fix NPE rendering settings with no description * dont render inden guides in search box (#55600) * fixes #55454 * More settings crawl * Another change for #55598 - maxResults applies to FileSearch and TextSearch but not FileIndex * Fix FileSearchProvider unit tests for progress change * fixes #55561 * Settings description update for #54690 * Update setting descriptions for online services * Minor edits * fixes #55513 * fixes #55451 * Fix #55612 - fix findTextInFiles cancellation * fixes #55539 * More setting description tweaks * Setting to disable online experiments #54354 * fixes #55507 * fixes #55515 * Show online services action only in Insiders for now * Settings editor - change toc behavior default to 'filter' * Settings editor - nicer filter count style during search * Fix #55617 - search viewlet icons * Settings editor - better styling for element count indicator * SearchProvider - fix NPE when searching extraFileResources * Allow extends to work without json suffix Fixes #16905 * Remove accessability options logic entirely Follow up on #55451 * use latest version of DAP * fixes #55490 * fixes #55122 * fixes #52332 * Avoid assumptions about git: URIs (fixes #36236) * relative path for descriptions * resourece: get rid of isFile context key fixes #48275 * Register previous ids for compatibility (#53497) * more tuning for #48275 * no need to always re-read "files explorer" fixes #52003 * read out active composites properly fixes #51967 * Update link colors for hc theme to meet color contrast ratio, fixes #55651 Also updated link color for `textLinkActiveForeground` to be the same as `textLinkForeground` as it wasn't properly updated * detect 'winpty-agent.exe'; fixes #55672 * node-debug@1.26.7 * reset counter on new label * Settings editor - fix multiple setting links in one description * Settings editor - color code blocks in setting descriptions, fix #55532 * Settings editor - hover color in TOC * Settings editor - fix navigation NPE * Settings editor - fix text control width * Settings editor - maybe fix #55684 * Fix bug causing cursor to not move on paste * fixes #53582 * Use ctrlCmd instead of ctrl for go down from search box * fixes #55264 * fixes #55456 * filter for spcaes before triggering search (#55611) * Fix #55698 - don't lose filtered TOC counts when refreshing TOC * fixes #55421 * fixes #28979 * fixes #55576 * only add check for updates to windows/linux help * readonly files: append decoration to label fixes #53022 * debug: do not show toolbar while initialising fixes #55026 * Opening launch.json should not activate debug extensions fixes #55029 * fixes #55435 * fixes #55434 * fixes #55439 * trigger menu only on altkey up * Fix #50555 - fix settings editor memory leak * Fix #55712 - no need to focus 'a' anymore when restoring control focus after tree render * fixes #55335 * proper fix for readonly model fixes #53022 * improve FoldingRangeKind spec (for #55686) * Use class with static fields (fixes #55494) * Fixes #53671 * fixes #54630 * [html] should disable ionic suggestions by default. Currently forces deprecated Ionic v1 suggestions in .html files while typing. Fixes #53324 * cleanup deps * debug issues back to andre * update electron for smoketest * Fix #55757 - prevent settings tabs from overflowing * Fix #53897 - revert setting menu defaults to old editor * Add enum descriptions to `typescript.preferences.importModuleSpecifier` * Fix #55767 - leaking style elements from settings editor * Fix #55521 - prevent flashing when clicking in exclude control * Update Git modified color for contrast ratio, fixes #53140 * Revert "Merge branch 'master' of github.com:Microsoft/vscode" This reverts commit bf46b6bfbae0cab99c2863e1244a916181fa9fbc, reversing changes made to e275a424483dfb4ed33b428c97d5e2c441d6b917. * Revert "Revert "Merge branch 'master' of github.com:Microsoft/vscode"" This reverts commit 53949d963f39e40757557c6526332354a31d9154. * don't ask to install an incomplete menu * Fix NPE in terminal AccessibilityManager Fixes #55744 * don't display fallback menu unless we've closed the last window * fixes #55547 * Fix smoke tests for extension search box * Update OSSREADME.json for Electron 2.0.5 * Update distro Includes Chromium license changes * fix #55455 * fix #55865 * fixes #55893 * Fix bug causing workspace recommendations to go away upon ignoring a recommendation (#55805) * Fix bug causing workspace recommendations to go away upon ignoring a recommendation * ONly show on @recommended or @recommended:workspace * Make more consistant * Fix #55911 * Understand json activity (#55926) * Understand json file activity * Refactoring * adding composer.json * Distro update for experiments * use terminal.processId for auto-attach; fixes #55918 * Reject invalid URI with vscode.openFolder (for #55891) * improve win32 setup system vs user detection fixes #55840 fixes #55840 delay winreg import related to #55840 show notification earlier related to #55840 fix #55840 update inno setup message related to #55840 * Fix #55593 - this code only operates on local paths, so use fsPath and Uri.file instead * Bring back the old menu due to electron 2.0 issues (#55913) * add the old menu back for native menus * make menu labels match * `vscode.openFolder`: treat missing URI schema gracefully (for #55891) * delay EH reattach; fixes #55955 * Mark all json files under appSettingsHome as settings * Use localized strings for telemetry opt-out * Exception when saving file editor opened from remote file provider (fixes #55051) * Remove terminal menu from stable Fixes 56003 * VSCode Insiders crashes on open with TypeError: Cannot read property 'lastIndexOf' of undefined. Fixes #54933 * improve fix for #55891 * fix #55916 * Improve #55891 * increase EH debugging restart delay; fixes #55955 * Revert "Don't include non-resource entries in history quick pick" This reverts commit 37209a838e9f7e9abe6dc53ed73cdf1e03b72060. * Diff editor: horizontal scrollbar height is smaller (fixes #56062) * improve openFolder uri fix (correctly treat backslashes) * fixes #56116 repair ipc for native menubar keybindings * Fix #56240 - Open the JSON settings editor instead of the UI editor * Fix #55536 * uriDisplay: if no formatter is registered fall back to getPathlabel fixes #56104 * VSCode hangs when opening python file. Fixes #56377 * VS Code Hangs When Opening Specific PowerShell File. Fixes #56430 * Fix #56433 - search extraFileResources even when no folders open * Workaround #55649 * Fix in master #56371 * Fix tests #56371 * Fix in master #56317 * increase version to 1.26.1 * Fixes #56387: Handle SIGPIPE in extension host * fixes #56185 * Fix merge issues (part 1) * Fix build breaks (part 1) * Build breaks (part 2) * Build breaks (part 3) * More build breaks (part 4) * Fix build breaks (part 5) * WIP * Fix menus * Render query result and message panels (#2363) * Put back query editor hot exit changes * Fix grid changes that broke profiler (#2365) * Update APIs for saving query editor state * Fix restore view state for profiler and edit data * Updating custom default themes to support 4.5:1 contrast ratio * Test updates * Fix Extension Manager and Windows Setup * Update license headers * Add appveyor and travis files back * Fix hidden modal dropdown issue
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -80,8 +80,8 @@ function uriFromPath(_path) {
|
||||
}
|
||||
|
||||
function readFile(file) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
fs.readFile(file, 'utf8', function(err, data) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
fs.readFile(file, 'utf8', function (err, data) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
@@ -91,6 +91,53 @@ function readFile(file) {
|
||||
});
|
||||
}
|
||||
|
||||
function showPartsSplash(configuration) {
|
||||
perf.mark('willShowPartsSplash');
|
||||
|
||||
// TODO@Ben remove me after a while
|
||||
perf.mark('willAccessLocalStorage');
|
||||
let storage = window.localStorage;
|
||||
perf.mark('didAccessLocalStorage');
|
||||
|
||||
let data;
|
||||
try {
|
||||
let raw = storage.getItem('storage://global/parts-splash-data');
|
||||
data = JSON.parse(raw);
|
||||
} catch (e) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
if (data) {
|
||||
const splash = document.createElement('div');
|
||||
splash.id = data.id;
|
||||
const { layoutInfo, colorInfo } = data;
|
||||
|
||||
// ensure there is enough space
|
||||
layoutInfo.sideBarWidth = Math.min(layoutInfo.sideBarWidth, window.innerWidth - (layoutInfo.activityBarWidth + layoutInfo.editorPartMinWidth));
|
||||
|
||||
if (configuration.folderUri || configuration.workspace) {
|
||||
// folder or workspace -> status bar color, sidebar
|
||||
splash.innerHTML = `
|
||||
<div style="position: absolute; width: 100%; left: 0; top: 0; height: ${layoutInfo.titleBarHeight}px; background-color: ${colorInfo.titleBarBackground};"></div>
|
||||
<div style="position: absolute; height: calc(100% - ${layoutInfo.titleBarHeight}px); top: ${layoutInfo.titleBarHeight}px; ${layoutInfo.sideBarSide}: 0; width: ${layoutInfo.activityBarWidth}px; background-color: ${colorInfo.activityBarBackground};"></div>
|
||||
<div style="position: absolute; height: calc(100% - ${layoutInfo.titleBarHeight}px); top: ${layoutInfo.titleBarHeight}px; ${layoutInfo.sideBarSide}: ${layoutInfo.activityBarWidth}px; width: ${layoutInfo.sideBarWidth}px; background-color: ${colorInfo.sideBarBackground};"></div>
|
||||
<div style="position: absolute; width: 100%; bottom: 0; left: 0; height: ${layoutInfo.statusBarHeight}px; background-color: ${colorInfo.statusBarBackground};"></div>
|
||||
`;
|
||||
} else {
|
||||
// empty -> speical status bar color, no sidebar
|
||||
splash.innerHTML = `
|
||||
<div style="position: absolute; width: 100%; left: 0; top: 0; height: ${layoutInfo.titleBarHeight}px; background-color: ${colorInfo.titleBarBackground};"></div>
|
||||
<div style="position: absolute; height: calc(100% - ${layoutInfo.titleBarHeight}px); top: ${layoutInfo.titleBarHeight}px; ${layoutInfo.sideBarSide}: 0; width: ${layoutInfo.activityBarWidth}px; background-color: ${colorInfo.activityBarBackground};"></div>
|
||||
<div style="position: absolute; width: 100%; bottom: 0; left: 0; height: ${layoutInfo.statusBarHeight}px; background-color: ${colorInfo.statusBarNoFolderBackground};"></div>
|
||||
`;
|
||||
}
|
||||
document.body.appendChild(splash);
|
||||
}
|
||||
perf.mark('didShowPartsSplash');
|
||||
}
|
||||
|
||||
const writeFile = (file, content) => new Promise((c, e) => fs.writeFile(file, content, 'utf8', err => err ? e(err) : c()));
|
||||
|
||||
function registerListeners(enableDeveloperTools) {
|
||||
|
||||
// Devtools & reload support
|
||||
@@ -182,6 +229,8 @@ function main() {
|
||||
assign(process.env, configuration.userEnv);
|
||||
perf.importEntries(configuration.perfEntries);
|
||||
|
||||
showPartsSplash(configuration);
|
||||
|
||||
// Get the nls configuration into the process.env as early as possible.
|
||||
var nlsConfig = { availableLanguages: {} };
|
||||
const config = process.env['VSCODE_NLS_CONFIG'];
|
||||
@@ -194,7 +243,7 @@ function main() {
|
||||
|
||||
if (nlsConfig._resolvedLanguagePackCoreLocation) {
|
||||
let bundles = Object.create(null);
|
||||
nlsConfig.loadBundle = function(bundle, language, cb) {
|
||||
nlsConfig.loadBundle = function (bundle, language, cb) {
|
||||
let result = bundles[bundle];
|
||||
if (result) {
|
||||
cb(undefined, result);
|
||||
@@ -205,8 +254,15 @@ function main() {
|
||||
let json = JSON.parse(content);
|
||||
bundles[bundle] = json;
|
||||
cb(undefined, json);
|
||||
})
|
||||
.catch(cb);
|
||||
}).catch((error) => {
|
||||
try {
|
||||
if (nlsConfig._corruptedFile) {
|
||||
writeFile(nlsConfig._corruptedFile, 'corrupted').catch(function (error) { console.error(error); });
|
||||
}
|
||||
} finally {
|
||||
cb(error, undefined);
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -5,24 +5,21 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
import * as nls from 'vs/nls';
|
||||
import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes';
|
||||
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||
import { NoEditorsVisibleContext, InZenModeContext } from 'vs/workbench/electron-browser/workbench';
|
||||
import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows';
|
||||
import { List } from 'vs/base/browser/ui/list/listWidget';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
|
||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import URI from 'vs/base/common/uri';
|
||||
import { IEditorOptions, Position as EditorPosition } from 'vs/platform/editor/common/editor';
|
||||
import { WorkbenchListFocusContextKey, IListService, WorkbenchListSupportsMultiSelectContextKey, ListWidget } from 'vs/platform/list/browser/listService';
|
||||
import { WorkbenchListFocusContextKey, IListService, WorkbenchListSupportsMultiSelectContextKey, ListWidget, WorkbenchListHasSelectionOrFocus } from 'vs/platform/list/browser/listService';
|
||||
import { PagedList } from 'vs/base/browser/ui/list/listPaging';
|
||||
import { range } from 'vs/base/common/arrays';
|
||||
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { ITree } from 'vs/base/parts/tree/browser/tree';
|
||||
import { InEditorZenModeContext, NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench/common/editor';
|
||||
import { ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
|
||||
|
||||
// --- List Commands
|
||||
|
||||
@@ -36,6 +33,7 @@ function ensureDOMFocus(widget: ListWidget): void {
|
||||
}
|
||||
}
|
||||
|
||||
export const QUIT_ID = 'workbench.action.quit';
|
||||
export function registerCommands(): void {
|
||||
|
||||
function focusDown(accessor: ServicesAccessor, arg2?: number): void {
|
||||
@@ -67,7 +65,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.focusDown',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.DownArrow,
|
||||
mac: {
|
||||
@@ -108,8 +106,8 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.expandSelectionDown',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
when: WorkbenchListFocusContextKey,
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: ContextKeyExpr.and(WorkbenchListFocusContextKey, WorkbenchListSupportsMultiSelectContextKey),
|
||||
primary: KeyMod.Shift | KeyCode.DownArrow,
|
||||
handler: (accessor, arg2) => {
|
||||
const focused = accessor.get(IListService).lastFocusedList;
|
||||
@@ -169,7 +167,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.focusUp',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.UpArrow,
|
||||
mac: {
|
||||
@@ -181,8 +179,8 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.expandSelectionUp',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
when: WorkbenchListFocusContextKey,
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: ContextKeyExpr.and(WorkbenchListFocusContextKey, WorkbenchListSupportsMultiSelectContextKey),
|
||||
primary: KeyMod.Shift | KeyCode.UpArrow,
|
||||
handler: (accessor, arg2) => {
|
||||
const focused = accessor.get(IListService).lastFocusedList;
|
||||
@@ -215,7 +213,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.collapse',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.LeftArrow,
|
||||
mac: {
|
||||
@@ -245,7 +243,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.expand',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.RightArrow,
|
||||
handler: (accessor) => {
|
||||
@@ -271,7 +269,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.focusPageUp',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.PageUp,
|
||||
handler: (accessor) => {
|
||||
@@ -300,7 +298,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.focusPageDown',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.PageDown,
|
||||
handler: (accessor) => {
|
||||
@@ -329,7 +327,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.focusFirst',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.Home,
|
||||
handler: accessor => listFocusFirst(accessor)
|
||||
@@ -337,7 +335,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.focusFirstChild',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: null,
|
||||
handler: accessor => listFocusFirst(accessor, { fromFocused: true })
|
||||
@@ -368,7 +366,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.focusLast',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.End,
|
||||
handler: accessor => listFocusLast(accessor)
|
||||
@@ -376,7 +374,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.focusLastChild',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: null,
|
||||
handler: accessor => listFocusLast(accessor, { fromFocused: true })
|
||||
@@ -407,7 +405,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.select',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.Enter,
|
||||
mac: {
|
||||
@@ -438,7 +436,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.selectAll',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: ContextKeyExpr.and(WorkbenchListFocusContextKey, WorkbenchListSupportsMultiSelectContextKey),
|
||||
primary: KeyMod.CtrlCmd | KeyCode.KEY_A,
|
||||
handler: (accessor) => {
|
||||
@@ -454,7 +452,7 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.toggleExpand',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: WorkbenchListFocusContextKey,
|
||||
primary: KeyCode.Space,
|
||||
handler: (accessor) => {
|
||||
@@ -474,14 +472,31 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'list.clear',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
when: WorkbenchListFocusContextKey,
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: ContextKeyExpr.and(WorkbenchListFocusContextKey, WorkbenchListHasSelectionOrFocus),
|
||||
primary: KeyCode.Escape,
|
||||
handler: (accessor) => {
|
||||
const focused = accessor.get(IListService).lastFocusedList;
|
||||
|
||||
// Tree only
|
||||
if (focused && !(focused instanceof List || focused instanceof PagedList)) {
|
||||
// List
|
||||
if (focused instanceof List || focused instanceof PagedList) {
|
||||
const list = focused;
|
||||
|
||||
if (list.getSelection().length > 0) {
|
||||
list.setSelection([]);
|
||||
|
||||
return void 0;
|
||||
}
|
||||
|
||||
if (list.getFocus().length > 0) {
|
||||
list.setFocus([]);
|
||||
|
||||
return void 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Tree
|
||||
else if (focused) {
|
||||
const tree = focused;
|
||||
|
||||
if (tree.getSelection().length) {
|
||||
@@ -503,8 +518,8 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'workbench.action.closeWindow', // close the window when the last editor is closed by reusing the same keybinding
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
when: NoEditorsVisibleContext,
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
when: ContextKeyExpr.and(NoEditorsVisibleContext, SingleEditorGroupsContext),
|
||||
primary: KeyMod.CtrlCmd | KeyCode.KEY_W,
|
||||
handler: accessor => {
|
||||
const windowService = accessor.get(IWindowService);
|
||||
@@ -514,18 +529,18 @@ export function registerCommands(): void {
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'workbench.action.exitZenMode',
|
||||
weight: KeybindingsRegistry.WEIGHT.editorContrib(-1000),
|
||||
weight: KeybindingWeight.EditorContrib - 1000,
|
||||
handler(accessor: ServicesAccessor, configurationOrName: any) {
|
||||
const partService = accessor.get(IPartService);
|
||||
partService.toggleZenMode();
|
||||
},
|
||||
when: InZenModeContext,
|
||||
when: InEditorZenModeContext,
|
||||
primary: KeyChord(KeyCode.Escape, KeyCode.Escape)
|
||||
});
|
||||
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: 'workbench.action.quit',
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(),
|
||||
id: QUIT_ID,
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
handler(accessor: ServicesAccessor) {
|
||||
const windowsService = accessor.get(IWindowsService);
|
||||
windowsService.quit();
|
||||
@@ -535,39 +550,9 @@ export function registerCommands(): void {
|
||||
win: { primary: void 0 }
|
||||
});
|
||||
|
||||
CommandsRegistry.registerCommand('_workbench.diff', function (accessor: ServicesAccessor, args: [URI, URI, string, string, IEditorOptions, EditorPosition]) {
|
||||
const editorService = accessor.get(IWorkbenchEditorService);
|
||||
let [leftResource, rightResource, label, description, options, position] = args;
|
||||
|
||||
if (!options || typeof options !== 'object') {
|
||||
options = {
|
||||
preserveFocus: false
|
||||
};
|
||||
}
|
||||
|
||||
if (!label) {
|
||||
label = nls.localize('diffLeftRightLabel', "{0} ⟷ {1}", leftResource.toString(true), rightResource.toString(true));
|
||||
}
|
||||
|
||||
return editorService.openEditor({ leftResource, rightResource, label, description, options }, position).then(() => {
|
||||
return void 0;
|
||||
});
|
||||
});
|
||||
|
||||
CommandsRegistry.registerCommand('_workbench.open', function (accessor: ServicesAccessor, args: [URI, IEditorOptions, EditorPosition]) {
|
||||
const editorService = accessor.get(IWorkbenchEditorService);
|
||||
const [resource, options, column] = args;
|
||||
|
||||
return editorService.openEditor({ resource, options }, column).then(() => {
|
||||
return void 0;
|
||||
});
|
||||
});
|
||||
|
||||
CommandsRegistry.registerCommand('_workbench.removeFromRecentlyOpened', function (accessor: ServicesAccessor, path: string) {
|
||||
CommandsRegistry.registerCommand('_workbench.removeFromRecentlyOpened', function (accessor: ServicesAccessor, path: string | ISingleFolderWorkspaceIdentifier) {
|
||||
const windowsService = accessor.get(IWindowsService);
|
||||
|
||||
return windowsService.removeFromRecentlyOpened([path]).then(() => {
|
||||
return void 0;
|
||||
});
|
||||
return windowsService.removeFromRecentlyOpened([path]).then(() => void 0);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -14,12 +14,12 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions, Configur
|
||||
import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions';
|
||||
import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes';
|
||||
import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform';
|
||||
import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenIssueReporterAction, ReportPerformanceIssueUsingReporterAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseWorkspaceAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction, ShowStartupPerformance, ToggleSharedProcessAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, ShowAboutDialogAction, InspectContextKeysAction, OpenProcessExplorer } from 'vs/workbench/electron-browser/actions';
|
||||
import { registerCommands } from 'vs/workbench/electron-browser/commands';
|
||||
import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, OpenFolderAsWorkspaceInNewWindowAction, OpenFileFolderAction, OpenFileAction, OpenFolderAction } from 'vs/workbench/browser/actions/workspaceActions';
|
||||
import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenIssueReporterAction, ReportPerformanceIssueUsingReporterAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseWorkspaceAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction, ShowStartupPerformance, ToggleSharedProcessAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, ShowAboutDialogAction, InspectContextKeysAction, OpenProcessExplorer, OpenTwitterUrlAction, OpenRequestFeatureUrlAction, OpenPrivacyStatementUrlAction, OpenLicenseUrlAction, OpenRecentAction } from 'vs/workbench/electron-browser/actions';
|
||||
import { registerCommands, QUIT_ID } from 'vs/workbench/electron-browser/commands';
|
||||
import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, DuplicateWorkspaceInNewWindowAction, OpenFileFolderAction, OpenFileAction, OpenFolderAction } from 'vs/workbench/browser/actions/workspaceActions';
|
||||
import { ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen';
|
||||
import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
|
||||
@@ -66,6 +66,10 @@ if (OpenTipsAndTricksUrlAction.AVAILABLE) {
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenTipsAndTricksUrlAction, OpenTipsAndTricksUrlAction.ID, OpenTipsAndTricksUrlAction.LABEL), 'Help: Tips and Tricks', helpCategory);
|
||||
}
|
||||
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenTwitterUrlAction, OpenTwitterUrlAction.ID, OpenTwitterUrlAction.LABEL), 'Help: Join us on Twitter', helpCategory);
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenRequestFeatureUrlAction, OpenRequestFeatureUrlAction.ID, OpenRequestFeatureUrlAction.LABEL), 'Help: Search Feature Requests', helpCategory);
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenLicenseUrlAction, OpenLicenseUrlAction.ID, OpenLicenseUrlAction.LABEL), 'Help: View License', helpCategory);
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenPrivacyStatementUrlAction, OpenPrivacyStatementUrlAction.ID, OpenPrivacyStatementUrlAction.LABEL), 'Help: Privacy Statement', helpCategory);
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowAboutDialogAction, ShowAboutDialogAction.ID, ShowAboutDialogAction.LABEL), 'Help: About', helpCategory);
|
||||
|
||||
workbenchActionsRegistry.registerWorkbenchAction(
|
||||
@@ -105,7 +109,7 @@ workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(AddRoo
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalRemoveRootFolderAction, GlobalRemoveRootFolderAction.ID, GlobalRemoveRootFolderAction.LABEL), 'Workspaces: Remove Folder from Workspace...', workspacesCategory);
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkspaceAction, OpenWorkspaceAction.ID, OpenWorkspaceAction.LABEL), 'Workspaces: Open Workspace...', workspacesCategory);
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(SaveWorkspaceAsAction, SaveWorkspaceAsAction.ID, SaveWorkspaceAsAction.LABEL), 'Workspaces: Save Workspace As...', workspacesCategory);
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenFolderAsWorkspaceInNewWindowAction, OpenFolderAsWorkspaceInNewWindowAction.ID, OpenFolderAsWorkspaceInNewWindowAction.LABEL), 'Workspaces: Open Folder as Workspace in New Window', workspacesCategory);
|
||||
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(DuplicateWorkspaceInNewWindowAction, DuplicateWorkspaceInNewWindowAction.ID, DuplicateWorkspaceInNewWindowAction.LABEL), 'Workspaces: Duplicate Workspace in New Window', workspacesCategory);
|
||||
|
||||
CommandsRegistry.registerCommand(OpenWorkspaceConfigFileAction.ID, serviceAccessor => {
|
||||
serviceAccessor.get(IInstantiationService).createInstance(OpenWorkspaceConfigFileAction, OpenWorkspaceConfigFileAction.ID, OpenWorkspaceConfigFileAction.LABEL).run();
|
||||
@@ -130,7 +134,7 @@ const recentFilesPickerContext = ContextKeyExpr.and(inQuickOpenContext, ContextK
|
||||
const quickOpenNavigateNextInRecentFilesPickerId = 'workbench.action.quickOpenNavigateNextInRecentFilesPicker';
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: quickOpenNavigateNextInRecentFilesPickerId,
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(50),
|
||||
weight: KeybindingWeight.WorkbenchContrib + 50,
|
||||
handler: getQuickNavigateHandler(quickOpenNavigateNextInRecentFilesPickerId, true),
|
||||
when: recentFilesPickerContext,
|
||||
primary: KeyMod.CtrlCmd | KeyCode.KEY_R,
|
||||
@@ -140,13 +144,204 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
const quickOpenNavigatePreviousInRecentFilesPicker = 'workbench.action.quickOpenNavigatePreviousInRecentFilesPicker';
|
||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||
id: quickOpenNavigatePreviousInRecentFilesPicker,
|
||||
weight: KeybindingsRegistry.WEIGHT.workbenchContrib(50),
|
||||
weight: KeybindingWeight.WorkbenchContrib + 50,
|
||||
handler: getQuickNavigateHandler(quickOpenNavigatePreviousInRecentFilesPicker, false),
|
||||
when: recentFilesPickerContext,
|
||||
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_R,
|
||||
mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_R }
|
||||
});
|
||||
|
||||
// Menu registration - file menu
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '1_new',
|
||||
command: {
|
||||
id: NewWindowAction.ID,
|
||||
title: nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")
|
||||
},
|
||||
order: 2
|
||||
});
|
||||
|
||||
if (!isMacintosh) {
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '2_open',
|
||||
command: {
|
||||
id: OpenFileAction.ID,
|
||||
title: nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File...")
|
||||
},
|
||||
order: 1
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '2_open',
|
||||
command: {
|
||||
id: OpenFolderAction.ID,
|
||||
title: nls.localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder...")
|
||||
},
|
||||
order: 2
|
||||
});
|
||||
} else {
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '2_open',
|
||||
command: {
|
||||
id: OpenFileFolderAction.ID,
|
||||
title: nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open...")
|
||||
},
|
||||
order: 1
|
||||
});
|
||||
}
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '2_open',
|
||||
command: {
|
||||
id: OpenWorkspaceAction.ID,
|
||||
title: nls.localize({ key: 'miOpenWorkspace', comment: ['&& denotes a mnemonic'] }, "Open Wor&&kspace...")
|
||||
},
|
||||
order: 3
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
title: nls.localize({ key: 'miOpenRecent', comment: ['&& denotes a mnemonic'] }, "Open &&Recent"),
|
||||
submenu: MenuId.MenubarRecentMenu,
|
||||
group: '2_open',
|
||||
order: 4
|
||||
});
|
||||
|
||||
|
||||
// More
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarRecentMenu, {
|
||||
group: 'y_more',
|
||||
command: {
|
||||
id: OpenRecentAction.ID,
|
||||
title: nls.localize({ key: 'miMore', comment: ['&& denotes a mnemonic'] }, "&&More...")
|
||||
},
|
||||
order: 1
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '3_workspace',
|
||||
command: {
|
||||
id: AddRootFolderAction.ID,
|
||||
title: nls.localize({ key: 'miAddFolderToWorkspace', comment: ['&& denotes a mnemonic'] }, "A&&dd Folder to Workspace...")
|
||||
},
|
||||
order: 1
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '3_workspace',
|
||||
command: {
|
||||
id: SaveWorkspaceAsAction.ID,
|
||||
title: nls.localize('miSaveWorkspaceAs', "Save Workspace As...")
|
||||
},
|
||||
order: 2
|
||||
});
|
||||
|
||||
if (!isMacintosh) {
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
title: nls.localize({ key: 'miPreferences', comment: ['&& denotes a mnemonic'] }, "&&Preferences"),
|
||||
submenu: MenuId.MenubarPreferencesMenu,
|
||||
group: '5_autosave',
|
||||
order: 2
|
||||
});
|
||||
}
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '6_close',
|
||||
command: {
|
||||
id: CloseWorkspaceAction.ID,
|
||||
title: nls.localize({ key: 'miCloseFolder', comment: ['&& denotes a mnemonic'] }, "Close &&Folder"),
|
||||
precondition: new RawContextKey<number>('workspaceFolderCount', 0).notEqualsTo('0')
|
||||
},
|
||||
order: 3,
|
||||
when: new RawContextKey<string>('workbenchState', '').notEqualsTo('workspace')
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '6_close',
|
||||
command: {
|
||||
id: CloseWorkspaceAction.ID,
|
||||
title: nls.localize({ key: 'miCloseWorkspace', comment: ['&& denotes a mnemonic'] }, "Close &&Workspace")
|
||||
},
|
||||
order: 3,
|
||||
when: new RawContextKey<string>('workbenchState', '').isEqualTo('workspace')
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: '6_close',
|
||||
command: {
|
||||
id: CloseCurrentWindowAction.ID,
|
||||
title: nls.localize({ key: 'miCloseWindow', comment: ['&& denotes a mnemonic'] }, "Clos&&e Window")
|
||||
},
|
||||
order: 4
|
||||
});
|
||||
|
||||
if (!isMacintosh) {
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
|
||||
group: 'z_Exit',
|
||||
command: {
|
||||
id: QUIT_ID,
|
||||
title: nls.localize({ key: 'miExit', comment: ['&& denotes a mnemonic'] }, "E&&xit")
|
||||
},
|
||||
order: 1
|
||||
});
|
||||
}
|
||||
|
||||
// Appereance menu
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarViewMenu, {
|
||||
group: '2_appearance',
|
||||
title: nls.localize({ key: 'miAppearance', comment: ['&& denotes a mnemonic'] }, "&&Appearance"),
|
||||
submenu: MenuId.MenubarAppearanceMenu,
|
||||
order: 1
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, {
|
||||
group: '1_toggle_view',
|
||||
command: {
|
||||
id: ToggleFullScreenAction.ID,
|
||||
title: nls.localize({ key: 'miToggleFullScreen', comment: ['&& denotes a mnemonic'] }, "Toggle &&Full Screen")
|
||||
},
|
||||
order: 1
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, {
|
||||
group: '1_toggle_view',
|
||||
command: {
|
||||
id: ToggleMenuBarAction.ID,
|
||||
title: nls.localize({ key: 'miToggleMenuBar', comment: ['&& denotes a mnemonic'] }, "Toggle Menu &&Bar")
|
||||
},
|
||||
order: 4
|
||||
});
|
||||
|
||||
// Zoom
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, {
|
||||
group: '3_zoom',
|
||||
command: {
|
||||
id: ZoomInAction.ID,
|
||||
title: nls.localize({ key: 'miZoomIn', comment: ['&& denotes a mnemonic'] }, "&&Zoom In")
|
||||
},
|
||||
order: 1
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, {
|
||||
group: '3_zoom',
|
||||
command: {
|
||||
id: ZoomOutAction.ID,
|
||||
title: nls.localize({ key: 'miZoomOut', comment: ['&& denotes a mnemonic'] }, "&&Zoom Out")
|
||||
},
|
||||
order: 2
|
||||
});
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, {
|
||||
group: '3_zoom',
|
||||
command: {
|
||||
id: ZoomResetAction.ID,
|
||||
title: nls.localize({ key: 'miZoomReset', comment: ['&& denotes a mnemonic'] }, "&&Reset Zoom")
|
||||
},
|
||||
order: 3
|
||||
});
|
||||
|
||||
|
||||
// Configuration: Workbench
|
||||
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
|
||||
|
||||
@@ -158,7 +353,7 @@ configurationRegistry.registerConfiguration({
|
||||
'properties': {
|
||||
'workbench.editor.showTabs': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('showEditorTabs', "Controls if opened editors should show in tabs or not."),
|
||||
'description': nls.localize('showEditorTabs', "Controls whether opened editors should show in tabs or not."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.editor.labelFormat': {
|
||||
@@ -171,50 +366,67 @@ configurationRegistry.registerConfiguration({
|
||||
nls.localize('workbench.editor.labelFormat.long', "Show the name of the file followed by it's absolute path.")
|
||||
],
|
||||
'default': 'default',
|
||||
'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'], key: 'tabDescription' },
|
||||
"Controls the format of the label for an editor. Changing this setting can for example make it easier to understand the location of a file:\n- short: 'parent'\n- medium: 'workspace/src/parent'\n- long: '/home/user/workspace/src/parent'\n- default: '.../parent', when another tab shares the same title, or the relative workspace path if tabs are disabled"),
|
||||
'description': nls.localize({
|
||||
comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'],
|
||||
key: 'tabDescription'
|
||||
}, "Controls the format of the label for an editor."),
|
||||
},
|
||||
'workbench.editor.tabCloseButton': {
|
||||
'type': 'string',
|
||||
'enum': ['left', 'right', 'off'],
|
||||
'default': 'right',
|
||||
'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorTabCloseButton' }, "Controls the position of the editor's tabs close buttons or disables them when set to 'off'.")
|
||||
'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorTabCloseButton' }, "Controls the position of the editor's tabs close buttons, or disables them when set to 'off'.")
|
||||
},
|
||||
'workbench.editor.tabSizing': {
|
||||
'type': 'string',
|
||||
'enum': ['fit', 'shrink'],
|
||||
'default': 'fit',
|
||||
'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'tabSizing' }, "Controls the sizing of editor tabs. Set to 'fit' to keep tabs always large enough to show the full editor label. Set to 'shrink' to allow tabs to get smaller when the available space is not enough to show all tabs at once.")
|
||||
'enumDescriptions': [
|
||||
nls.localize('workbench.editor.tabSizing.fit', "Always keep tabs large enough to show the full editor label."),
|
||||
nls.localize('workbench.editor.tabSizing.shrink', "Allow tabs to get smaller when the available space is not enough to show all tabs at once.")
|
||||
],
|
||||
'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'tabSizing' }, "Controls the sizing of editor tabs.")
|
||||
},
|
||||
'workbench.editor.showIcons': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('showIcons', "Controls if opened editors should show with an icon or not. This requires an icon theme to be enabled as well."),
|
||||
'description': nls.localize('showIcons', "Controls whether opened editors should show with an icon or not. This requires an icon theme to be enabled as well."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.editor.enablePreview': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('enablePreview', "Controls if opened editors show as preview. Preview editors are reused until they are kept (e.g. via double click or editing) and show up with an italic font style."),
|
||||
'description': nls.localize('enablePreview', "Controls whether opened editors show as preview. Preview editors are reused until they are kept (e.g. via double click or editing) and show up with an italic font style."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.editor.enablePreviewFromQuickOpen': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('enablePreviewFromQuickOpen', "Controls if opened editors from Quick Open show as preview. Preview editors are reused until they are kept (e.g. via double click or editing)."),
|
||||
'description': nls.localize('enablePreviewFromQuickOpen', "Controls whether opened editors from Quick Open show as preview. Preview editors are reused until they are kept (e.g. via double click or editing)."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.editor.closeOnFileDelete': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('closeOnFileDelete', "Controls if editors showing a file should close automatically when the file is deleted or renamed by some other process. Disabling this will keep the editor open as dirty on such an event. Note that deleting from within the application will always close the editor and that dirty files will never close to preserve your data."),
|
||||
'description': nls.localize('closeOnFileDelete', "Controls whether editors showing a file should close automatically when the file is deleted or renamed by some other process. Disabling this will keep the editor open as dirty on such an event. Note that deleting from within the application will always close the editor and that dirty files will never close to preserve your data."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.editor.openPositioning': {
|
||||
'type': 'string',
|
||||
'enum': ['left', 'right', 'first', 'last'],
|
||||
'default': 'right',
|
||||
'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorOpenPositioning' }, "Controls where editors open. Select 'left' or 'right' to open editors to the left or right of the currently active one. Select 'first' or 'last' to open editors independently from the currently active one.")
|
||||
'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'editorOpenPositioning' }, "Controls where editors open. Select `left` or `right` to open editors to the left or right of the currently active one. Select `first` or `last` to open editors independently from the currently active one.")
|
||||
},
|
||||
'workbench.editor.openSideBySideDirection': {
|
||||
'type': 'string',
|
||||
'enum': ['right', 'down'],
|
||||
'default': 'right',
|
||||
'description': nls.localize('sideBySideDirection', "Controls the default direction of editors that are opened side by side (e.g. from the explorer). By default, editors will open on the right hand side of the currently active one. If changed to `down`, the editors will open below the currently active one.")
|
||||
},
|
||||
'workbench.editor.closeEmptyGroups': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('closeEmptyGroups', "Controls the behavior of empty editor groups when the last tab in the group is closed. When enabled, empty groups will automatically close. When disabled, empty groups will remain part of the grid."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.editor.revealIfOpen': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('revealIfOpen', "Controls if an editor is revealed in any of the visible groups if opened. If disabled, an editor will prefer to open in the currently active editor group. If enabled, an already opened editor will be revealed instead of opened again in the currently active editor group. Note that there are some cases where this setting is ignored, e.g. when forcing an editor to open in a specific group or to the side of the currently active group."),
|
||||
'description': nls.localize('revealIfOpen', "Controls whether an editor is revealed in any of the visible groups if opened. If disabled, an editor will prefer to open in the currently active editor group. If enabled, an already opened editor will be revealed instead of opened again in the currently active editor group. Note that there are some cases where this setting is ignored, e.g. when forcing an editor to open in a specific group or to the side of the currently active group."),
|
||||
'default': false
|
||||
},
|
||||
'workbench.editor.swipeToNavigate': {
|
||||
@@ -230,17 +442,22 @@ configurationRegistry.registerConfiguration({
|
||||
},
|
||||
'workbench.commandPalette.preserveInput': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('preserveInput', "Controls if the last typed input to the command palette should be restored when opening it the next time."),
|
||||
'description': nls.localize('preserveInput', "Controls whether the last typed input to the command palette should be restored when opening it the next time."),
|
||||
'default': false
|
||||
},
|
||||
'workbench.quickOpen.closeOnFocusLost': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('closeOnFocusLost', "Controls if Quick Open should close automatically once it loses focus."),
|
||||
'description': nls.localize('closeOnFocusLost', "Controls whether Quick Open should close automatically once it loses focus."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.settings.openDefaultSettings': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('openDefaultSettings', "Controls if opening settings also opens an editor showing all default settings."),
|
||||
'description': nls.localize('openDefaultSettings', "Controls whether opening settings also opens an editor showing all default settings."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.settings.openDefaultKeybindings': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('openDefaultKeybindings', "Controls whether opening keybinding settings also opens an editor showing all default keybindings."),
|
||||
'default': true
|
||||
},
|
||||
'workbench.sideBar.location': {
|
||||
@@ -253,7 +470,7 @@ configurationRegistry.registerConfiguration({
|
||||
'type': 'string',
|
||||
'enum': ['bottom', 'right'],
|
||||
'default': 'bottom',
|
||||
'description': nls.localize('panelDefaultLocation', "Controls the default location of the panel. It can either show at the bottom or on the right of the workbench.")
|
||||
'description': nls.localize('panelDefaultLocation', "Controls the default location of the panel (terminal, debug console, output, problems). It can either show at the bottom or on the right of the workbench.")
|
||||
},
|
||||
'workbench.statusBar.visible': {
|
||||
'type': 'boolean',
|
||||
@@ -275,7 +492,7 @@ configurationRegistry.registerConfiguration({
|
||||
'enum': ['default', 'antialiased', 'none', 'auto'],
|
||||
'default': 'default',
|
||||
'description':
|
||||
nls.localize('fontAliasing', "Controls font aliasing method in the workbench.\n- default: Sub-pixel font smoothing. On most non-retina displays this will give the sharpest text\n- antialiased: Smooth the font on the level of the pixel, as opposed to the subpixel. Can make the font appear lighter overall\n- none: Disables font smoothing. Text will show with jagged sharp edges\n- auto: Applies `default` or `antialiased` automatically based on the DPI of displays."),
|
||||
nls.localize('fontAliasing', "Controls font aliasing method in the workbench."),
|
||||
'enumDescriptions': [
|
||||
nls.localize('workbench.fontAliasing.default', "Sub-pixel font smoothing. On most non-retina displays this will give the sharpest text."),
|
||||
nls.localize('workbench.fontAliasing.antialiased', "Smooth the font on the level of the pixel, as opposed to the subpixel. Can make the font appear lighter overall."),
|
||||
@@ -286,8 +503,29 @@ configurationRegistry.registerConfiguration({
|
||||
},
|
||||
'workbench.settings.enableNaturalLanguageSearch': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('enableNaturalLanguageSettingsSearch', "Controls whether to enable the natural language search mode for settings."),
|
||||
'default': true
|
||||
'description': nls.localize('enableNaturalLanguageSettingsSearch', "Controls whether to enable the natural language search mode for settings. The natural language search is provided by an online service."),
|
||||
'default': true,
|
||||
'scope': ConfigurationScope.WINDOW,
|
||||
'tags': ['usesOnlineServices']
|
||||
},
|
||||
'workbench.settings.settingsSearchTocBehavior': {
|
||||
'type': 'string',
|
||||
'enum': ['hide', 'filter', 'show'],
|
||||
'description': nls.localize('settingsSearchTocBehavior', "Controls the behavior of the settings editor Table of Contents while searching."),
|
||||
'default': 'filter',
|
||||
'scope': ConfigurationScope.WINDOW
|
||||
},
|
||||
'workbench.settings.tocVisible': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('settingsTocVisible', "Controls whether the settings editor Table of Contents is visible."),
|
||||
'default': true,
|
||||
'scope': ConfigurationScope.WINDOW
|
||||
},
|
||||
'workbench.enableExperiments': {
|
||||
'type': 'boolean',
|
||||
'description': nls.localize('workbench.enableExperiments', "Fetches experiments to run from a Microsoft online service."),
|
||||
'default': true,
|
||||
'tags': ['usesOnlineServices']
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -304,41 +542,41 @@ configurationRegistry.registerConfiguration({
|
||||
'type': 'string',
|
||||
'enum': ['on', 'off', 'default'],
|
||||
'enumDescriptions': [
|
||||
nls.localize('window.openFilesInNewWindow.on', "Files will open in a new window"),
|
||||
nls.localize('window.openFilesInNewWindow.off', "Files will open in the window with the files' folder open or the last active window"),
|
||||
nls.localize('window.openFilesInNewWindow.on', "Files will open in a new window."),
|
||||
nls.localize('window.openFilesInNewWindow.off', "Files will open in the window with the files' folder open or the last active window."),
|
||||
isMacintosh ?
|
||||
nls.localize('window.openFilesInNewWindow.defaultMac', "Files will open in the window with the files' folder open or the last active window unless opened via the Dock or from Finder") :
|
||||
nls.localize('window.openFilesInNewWindow.default', "Files will open in a new window unless picked from within the application (e.g. via the File menu)")
|
||||
nls.localize('window.openFilesInNewWindow.defaultMac', "Files will open in the window with the files' folder open or the last active window unless opened via the Dock or from Finder.") :
|
||||
nls.localize('window.openFilesInNewWindow.default', "Files will open in a new window unless picked from within the application (e.g. via the File menu).")
|
||||
],
|
||||
'default': 'off',
|
||||
'scope': ConfigurationScope.APPLICATION,
|
||||
'description':
|
||||
isMacintosh ?
|
||||
nls.localize('openFilesInNewWindowMac', "Controls if files should open in a new window.\n- default: files will open in the window with the files' folder open or the last active window unless opened via the Dock or from Finder\n- on: files will open in a new window\n- off: files will open in the window with the files' folder open or the last active window\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).") :
|
||||
nls.localize('openFilesInNewWindow', "Controls if files should open in a new window.\n- default: files will open in a new window unless picked from within the application (e.g. via the File menu)\n- on: files will open in a new window\n- off: files will open in the window with the files' folder open or the last active window\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).")
|
||||
nls.localize('openFilesInNewWindowMac', "Controls whether files should open in a new window.\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).") :
|
||||
nls.localize('openFilesInNewWindow', "Controls whether files should open in a new window.\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).")
|
||||
},
|
||||
'window.openFoldersInNewWindow': {
|
||||
'type': 'string',
|
||||
'enum': ['on', 'off', 'default'],
|
||||
'enumDescriptions': [
|
||||
nls.localize('window.openFoldersInNewWindow.on', "Folders will open in a new window"),
|
||||
nls.localize('window.openFoldersInNewWindow.off', "Folders will replace the last active window"),
|
||||
nls.localize('window.openFoldersInNewWindow.default', "Folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu)")
|
||||
nls.localize('window.openFoldersInNewWindow.on', "Folders will open in a new window."),
|
||||
nls.localize('window.openFoldersInNewWindow.off', "Folders will replace the last active window."),
|
||||
nls.localize('window.openFoldersInNewWindow.default', "Folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu).")
|
||||
],
|
||||
'default': 'default',
|
||||
'scope': ConfigurationScope.APPLICATION,
|
||||
'description': nls.localize('openFoldersInNewWindow', "Controls if folders should open in a new window or replace the last active window.\n- default: folders will open in a new window unless a folder is picked from within the application (e.g. via the File menu)\n- on: folders will open in a new window\n- off: folders will replace the last active window\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).")
|
||||
'description': nls.localize('openFoldersInNewWindow', "Controls whether folders should open in a new window or replace the last active window.\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).")
|
||||
},
|
||||
'window.openWithoutArgumentsInNewWindow': {
|
||||
'type': 'string',
|
||||
'enum': ['on', 'off'],
|
||||
'enumDescriptions': [
|
||||
nls.localize('window.openWithoutArgumentsInNewWindow.on', "Open a new empty window"),
|
||||
nls.localize('window.openWithoutArgumentsInNewWindow.off', "Focus the last active running instance")
|
||||
nls.localize('window.openWithoutArgumentsInNewWindow.on', "Open a new empty window."),
|
||||
nls.localize('window.openWithoutArgumentsInNewWindow.off', "Focus the last active running instance.")
|
||||
],
|
||||
'default': isMacintosh ? 'off' : 'on',
|
||||
'scope': ConfigurationScope.APPLICATION,
|
||||
'description': nls.localize('openWithoutArgumentsInNewWindow', "Controls if a new empty window should open when starting a second instance without arguments or if the last running instance should get focus.\n- on: open a new empty window\n- off: the last active running instance will get focus\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).")
|
||||
'description': nls.localize('openWithoutArgumentsInNewWindow', "Controls whether a new empty window should open when starting a second instance without arguments or if the last running instance should get focus.\nNote that there can still be cases where this setting is ignored (e.g. when using the -new-window or -reuse-window command line option).")
|
||||
},
|
||||
'window.restoreWindows': {
|
||||
'type': 'string',
|
||||
@@ -351,13 +589,13 @@ configurationRegistry.registerConfiguration({
|
||||
],
|
||||
'default': 'one',
|
||||
'scope': ConfigurationScope.APPLICATION,
|
||||
'description': nls.localize('restoreWindows', "Controls how windows are being reopened after a restart. Select 'none' to always start with an empty workspace, 'one' to reopen the last window you worked on, 'folders' to reopen all windows that had folders opened or 'all' to reopen all windows of your last session.")
|
||||
'description': nls.localize('restoreWindows', "Controls how windows are being reopened after a restart.")
|
||||
},
|
||||
'window.restoreFullscreen': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'scope': ConfigurationScope.APPLICATION,
|
||||
'description': nls.localize('restoreFullscreen', "Controls if a window should restore to full screen mode if it was exited in full screen mode.")
|
||||
'description': nls.localize('restoreFullscreen', "Controls whether a window should restore to full screen mode if it was exited in full screen mode.")
|
||||
},
|
||||
'window.zoomLevel': {
|
||||
'type': 'number',
|
||||
@@ -368,7 +606,7 @@ configurationRegistry.registerConfiguration({
|
||||
'type': 'string',
|
||||
'default': isMacintosh ? '${activeEditorShort}${separator}${rootName}' : '${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}',
|
||||
'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'], key: 'title' },
|
||||
"Controls the window title based on the active editor. Variables are substituted based on the context:\n\${activeEditorShort}: the file name (e.g. myFile.txt)\n\${activeEditorMedium}: the path of the file relative to the workspace folder (e.g. myFolder/myFile.txt)\n\${activeEditorLong}: the full path of the file (e.g. /Users/Development/myProject/myFolder/myFile.txt)\n\${folderName}: name of the workspace folder the file is contained in (e.g. myFolder)\n\${folderPath}: file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)\n\${rootName}: name of the workspace (e.g. myFolder or myWorkspace)\n\${rootPath}: file path of the workspace (e.g. /Users/Development/myWorkspace)\n\${appName}: e.g. VS Code\n\${dirty}: a dirty indicator if the active editor is dirty\n\${separator}: a conditional separator (\" - \") that only shows when surrounded by variables with values or static text")
|
||||
"Controls the window title based on the active editor. Variables are substituted based on the context:\n- `\${activeEditorShort}`: the file name (e.g. myFile.txt).\n- `\${activeEditorMedium}`: the path of the file relative to the workspace folder (e.g. myFolder/myFile.txt).\n- `\${activeEditorLong}`: the full path of the file (e.g. /Users/Development/myProject/myFolder/myFile.txt).\n- `\${folderName}`: name of the workspace folder the file is contained in (e.g. myFolder).\n- `\${folderPath}`: file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder).\n- `\${rootName}`: name of the workspace (e.g. myFolder or myWorkspace).\n- `\${rootPath}`: file path of the workspace (e.g. /Users/Development/myWorkspace).\n- `\${appName}`: e.g. VS Code.\n- `\${dirty}`: a dirty indicator if the active editor is dirty.\n- `\${separator}`: a conditional separator (\" - \") that only shows when surrounded by variables with values or static text.")
|
||||
},
|
||||
'window.newWindowDimensions': {
|
||||
'type': 'string',
|
||||
@@ -381,12 +619,12 @@ configurationRegistry.registerConfiguration({
|
||||
],
|
||||
'default': 'default',
|
||||
'scope': ConfigurationScope.APPLICATION,
|
||||
'description': nls.localize('newWindowDimensions', "Controls the dimensions of opening a new window when at least one window is already opened. By default, a new window will open in the center of the screen with small dimensions. When set to 'inherit', the window will get the same dimensions as the last window that was active. When set to 'maximized', the window will open maximized and fullscreen if configured to 'fullscreen'. Note that this setting does not have an impact on the first window that is opened. The first window will always restore the size and location as you left it before closing.")
|
||||
'description': nls.localize('newWindowDimensions', "Controls the dimensions of opening a new window when at least one window is already opened. Note that this setting does not have an impact on the first window that is opened. The first window will always restore the size and location as you left it before closing.")
|
||||
},
|
||||
'window.closeWhenEmpty': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': nls.localize('closeWhenEmpty', "Controls if closing the last editor should also close the window. This setting only applies for windows that do not show folders.")
|
||||
'description': nls.localize('closeWhenEmpty', "Controls whether closing the last editor should also close the window. This setting only applies for windows that do not show folders.")
|
||||
},
|
||||
'window.menuBarVisibility': {
|
||||
'type': 'string',
|
||||
@@ -418,10 +656,9 @@ configurationRegistry.registerConfiguration({
|
||||
'window.titleBarStyle': {
|
||||
'type': 'string',
|
||||
'enum': ['native', 'custom'],
|
||||
'default': 'custom',
|
||||
'default': isMacintosh ? 'custom' : 'native',
|
||||
'scope': ConfigurationScope.APPLICATION,
|
||||
'description': nls.localize('titleBarStyle', "Adjust the appearance of the window title bar. Changes require a full restart to apply."),
|
||||
'included': isMacintosh
|
||||
'description': nls.localize('titleBarStyle', "Adjust the appearance of the window title bar. Changes require a full restart to apply.")
|
||||
},
|
||||
'window.nativeTabs': {
|
||||
'type': 'boolean',
|
||||
@@ -434,7 +671,7 @@ configurationRegistry.registerConfiguration({
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'scope': ConfigurationScope.APPLICATION,
|
||||
'description': nls.localize('window.smoothScrollingWorkaround', "Enable this workaround if scrolling is no longer smooth after restoring a minimized VS Code window. This is a workaround for an issue (https://github.com/Microsoft/vscode/issues/13612) where scrolling starts to lag on devices with precision trackpads like the Surface devices from Microsoft. Enabling this workaround can result in a little bit of layout flickering after restoring the window from minimized state but is otherwise harmless."),
|
||||
'description': nls.localize('window.smoothScrollingWorkaround', "Enable this workaround if scrolling is no longer smooth after restoring a minimized VS Code window. This is a workaround for an issue (https://github.com/Microsoft/vscode/issues/13612) where scrolling starts to lag on devices with precision trackpads like the Surface devices from Microsoft. Enabling this workaround can result in a little bit of layout flickering after restoring the window from minimized state but is otherwise harmless. Note: in order for this workaround to function, make sure to also set `#window.titleBarStyle#` to `native`."),
|
||||
'included': isWindows
|
||||
},
|
||||
'window.clickThroughInactive': {
|
||||
@@ -457,32 +694,32 @@ configurationRegistry.registerConfiguration({
|
||||
'zenMode.fullScreen': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': nls.localize('zenMode.fullScreen', "Controls if turning on Zen Mode also puts the workbench into full screen mode.")
|
||||
'description': nls.localize('zenMode.fullScreen', "Controls whether turning on Zen Mode also puts the workbench into full screen mode.")
|
||||
},
|
||||
'zenMode.centerLayout': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': nls.localize('zenMode.centerLayout', "Controls if turning on Zen Mode also centers the layout.")
|
||||
'description': nls.localize('zenMode.centerLayout', "Controls whether turning on Zen Mode also centers the layout.")
|
||||
},
|
||||
'zenMode.hideTabs': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': nls.localize('zenMode.hideTabs', "Controls if turning on Zen Mode also hides workbench tabs.")
|
||||
'description': nls.localize('zenMode.hideTabs', "Controls whether turning on Zen Mode also hides workbench tabs.")
|
||||
},
|
||||
'zenMode.hideStatusBar': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': nls.localize('zenMode.hideStatusBar', "Controls if turning on Zen Mode also hides the status bar at the bottom of the workbench.")
|
||||
'description': nls.localize('zenMode.hideStatusBar', "Controls whether turning on Zen Mode also hides the status bar at the bottom of the workbench.")
|
||||
},
|
||||
'zenMode.hideActivityBar': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': nls.localize('zenMode.hideActivityBar', "Controls if turning on Zen Mode also hides the activity bar at the left of the workbench.")
|
||||
'description': nls.localize('zenMode.hideActivityBar', "Controls whether turning on Zen Mode also hides the activity bar at the left of the workbench.")
|
||||
},
|
||||
'zenMode.restore': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': nls.localize('zenMode.restore', "Controls if a window should restore to zen mode if it was exited in zen mode.")
|
||||
'description': nls.localize('zenMode.restore', "Controls whether a window should restore to zen mode if it was exited in zen mode.")
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -39,7 +39,7 @@ import { IUpdateService } from 'vs/platform/update/common/update';
|
||||
import { URLHandlerChannel, URLServiceChannelClient } from 'vs/platform/url/common/urlIpc';
|
||||
import { IURLService } from 'vs/platform/url/common/url';
|
||||
import { WorkspacesChannelClient } from 'vs/platform/workspaces/common/workspacesIpc';
|
||||
import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { IWorkspacesService, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { createSpdLogService } from 'vs/platform/log/node/spdlogService';
|
||||
import * as fs from 'fs';
|
||||
import { ConsoleLogService, MultiplexLogService, ILogService } from 'vs/platform/log/common/log';
|
||||
@@ -47,6 +47,9 @@ import { IssueChannelClient } from 'vs/platform/issue/common/issueIpc';
|
||||
import { IIssueService } from 'vs/platform/issue/common/issue';
|
||||
import { LogLevelSetterChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc';
|
||||
import { RelayURLService } from 'vs/platform/url/common/urlService';
|
||||
import { MenubarChannelClient } from 'vs/platform/menubar/common/menubarIpc';
|
||||
import { IMenubarService } from 'vs/platform/menubar/common/menubar';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
|
||||
gracefulFs.gracefulify(fs); // enable gracefulFs
|
||||
|
||||
@@ -113,22 +116,24 @@ function openWorkbench(configuration: IWindowConfiguration): TPromise<void> {
|
||||
}
|
||||
|
||||
function createAndInitializeWorkspaceService(configuration: IWindowConfiguration, environmentService: EnvironmentService): TPromise<WorkspaceService> {
|
||||
return validateSingleFolderPath(configuration).then(() => {
|
||||
const folderUri = configuration.folderUri ? uri.revive(configuration.folderUri) : null;
|
||||
return validateFolderUri(folderUri, configuration.verbose).then(validatedFolderUri => {
|
||||
|
||||
const workspaceService = new WorkspaceService(environmentService);
|
||||
|
||||
return workspaceService.initialize(configuration.workspace || configuration.folderPath || configuration).then(() => workspaceService, error => workspaceService);
|
||||
return workspaceService.initialize(configuration.workspace || validatedFolderUri || configuration).then(() => workspaceService, error => workspaceService);
|
||||
});
|
||||
}
|
||||
|
||||
function validateSingleFolderPath(configuration: IWindowConfiguration): TPromise<void> {
|
||||
function validateFolderUri(folderUri: ISingleFolderWorkspaceIdentifier, verbose: boolean): TPromise<uri> {
|
||||
|
||||
// Return early if we do not have a single folder path
|
||||
if (!configuration.folderPath) {
|
||||
return TPromise.as(void 0);
|
||||
// Return early if we do not have a single folder uri or if it is a non file uri
|
||||
if (!folderUri || folderUri.scheme !== Schemas.file) {
|
||||
return TPromise.as(folderUri);
|
||||
}
|
||||
|
||||
// Otherwise: use realpath to resolve symbolic links to the truth
|
||||
return realpath(configuration.folderPath).then(realFolderPath => {
|
||||
return realpath(folderUri.fsPath).then(realFolderPath => {
|
||||
|
||||
// For some weird reason, node adds a trailing slash to UNC paths
|
||||
// we never ever want trailing slashes as our workspace path unless
|
||||
@@ -138,19 +143,19 @@ function validateSingleFolderPath(configuration: IWindowConfiguration): TPromise
|
||||
realFolderPath = strings.rtrim(realFolderPath, paths.nativeSep);
|
||||
}
|
||||
|
||||
return realFolderPath;
|
||||
return uri.file(realFolderPath);
|
||||
}, error => {
|
||||
if (configuration.verbose) {
|
||||
if (verbose) {
|
||||
errors.onUnexpectedError(error);
|
||||
}
|
||||
|
||||
// Treat any error case as empty workbench case (no folder path)
|
||||
return null;
|
||||
|
||||
}).then(realFolderPathOrNull => {
|
||||
}).then(realFolderUriOrNull => {
|
||||
|
||||
// Update config with real path if we have one
|
||||
configuration.folderPath = realFolderPathOrNull;
|
||||
return realFolderUriOrNull;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -190,10 +195,7 @@ function createStorageService(workspaceService: IWorkspaceContextService, enviro
|
||||
if (disableStorage) {
|
||||
storage = inMemoryLocalStorageInstance;
|
||||
} else {
|
||||
// TODO@Ben remove me after a while
|
||||
perf.mark('willAccessLocalStorage');
|
||||
storage = window.localStorage;
|
||||
perf.mark('didAccessLocalStorage');
|
||||
}
|
||||
|
||||
return new StorageService(storage, storage, workspaceId, secondaryWorkspaceId);
|
||||
@@ -227,6 +229,9 @@ function createMainProcessServices(mainProcessClient: ElectronIPCClient, configu
|
||||
const issueChannel = mainProcessClient.getChannel('issue');
|
||||
serviceCollection.set(IIssueService, new SyncDescriptor(IssueChannelClient, issueChannel));
|
||||
|
||||
const menubarChannel = mainProcessClient.getChannel('menubar');
|
||||
serviceCollection.set(IMenubarService, new SyncDescriptor(MenubarChannelClient, menubarChannel));
|
||||
|
||||
const workspacesChannel = mainProcessClient.getChannel('workspaces');
|
||||
serviceCollection.set(IWorkspacesService, new WorkspacesChannelClient(workspacesChannel));
|
||||
|
||||
|
||||
@@ -65,6 +65,36 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.monaco-shell .monaco-menu-container .monaco-menu {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif;
|
||||
}
|
||||
|
||||
.monaco-shell .monaco-menu .monaco-action-bar.vertical {
|
||||
padding: .5em 0;
|
||||
}
|
||||
|
||||
.monaco-shell .monaco-menu .monaco-action-bar.vertical .action-menu-item {
|
||||
height: 1.8em;
|
||||
}
|
||||
|
||||
.monaco-shell .monaco-menu .monaco-action-bar.vertical .action-label:not(.separator),
|
||||
.monaco-shell .monaco-menu .monaco-action-bar.vertical .keybinding {
|
||||
padding: 0 1.5em;
|
||||
}
|
||||
|
||||
.monaco-shell .monaco-menu .monaco-action-bar.vertical .action-label.separator {
|
||||
padding: 0.2em 0 0 0;
|
||||
margin-bottom: 0.2em;
|
||||
}
|
||||
|
||||
.monaco-shell .monaco-menu .monaco-action-bar.vertical .submenu-indicator {
|
||||
padding: 0 1em;
|
||||
}
|
||||
|
||||
.monaco-shell .monaco-menu .action-item {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/* START Keyboard Focus Indication Styles */
|
||||
|
||||
.monaco-shell [tabindex="0"]:focus,
|
||||
@@ -85,7 +115,6 @@
|
||||
.monaco-shell input[type="button"]:active,
|
||||
.monaco-shell input[type="checkbox"]:active,
|
||||
.monaco-shell .monaco-tree .monaco-tree-row
|
||||
.monaco-action-bar .action-item [tabindex="0"]:hover,
|
||||
.monaco-shell .monaco-tree.focused.no-focused-item:active:before {
|
||||
outline: 0 !important; /* fixes some flashing outlines from showing up when clicking */
|
||||
}
|
||||
@@ -94,8 +123,6 @@
|
||||
border: none; /* outline is a square, but border has a radius, so we avoid this glitch when focused (https://github.com/Microsoft/vscode/issues/26045) */
|
||||
}
|
||||
|
||||
|
||||
|
||||
.monaco-shell .monaco-tree.focused .monaco-tree-row.focused [tabindex="0"]:focus {
|
||||
outline-width: 1px; /* higher contrast color for focusable elements in a row that shows focus feedback */
|
||||
outline-style: solid;
|
||||
|
||||
@@ -3,10 +3,6 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
.monaco-workbench-container {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.monaco-workbench {
|
||||
font-size: 13px;
|
||||
line-height: 1.4em;
|
||||
@@ -20,14 +16,6 @@
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.monaco-workbench .monaco-action-bar .monaco-select-box {
|
||||
margin-top: 10px; /* Center the select box */
|
||||
}
|
||||
|
||||
.monaco-workbench.windows .monaco-action-bar .monaco-select-box {
|
||||
margin-top: 8px; /* Center the select box */
|
||||
}
|
||||
|
||||
.monaco-font-aliasing-antialiased {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
@@ -8,19 +8,20 @@
|
||||
import URI from 'vs/base/common/uri';
|
||||
import * as objects from 'vs/base/common/objects';
|
||||
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { Disposable } from 'vs/base/common/lifecycle';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration';
|
||||
import { ParsedExpression, IExpression, parse } from 'vs/base/common/glob';
|
||||
import { relative } from 'path';
|
||||
import { normalize } from 'vs/base/common/paths';
|
||||
|
||||
export class ResourceGlobMatcher {
|
||||
export class ResourceGlobMatcher extends Disposable {
|
||||
|
||||
private static readonly NO_ROOT: string = null;
|
||||
|
||||
private readonly _onExpressionChange: Emitter<void>;
|
||||
private toUnbind: IDisposable[];
|
||||
private readonly _onExpressionChange: Emitter<void> = this._register(new Emitter<void>());
|
||||
get onExpressionChange(): Event<void> { return this._onExpressionChange.event; }
|
||||
|
||||
private mapRootToParsedExpression: Map<string, ParsedExpression>;
|
||||
private mapRootToExpressionConfig: Map<string, IExpression>;
|
||||
|
||||
@@ -30,30 +31,24 @@ export class ResourceGlobMatcher {
|
||||
@IWorkspaceContextService private contextService: IWorkspaceContextService,
|
||||
@IConfigurationService private configurationService: IConfigurationService
|
||||
) {
|
||||
this.toUnbind = [];
|
||||
super();
|
||||
|
||||
this.mapRootToParsedExpression = new Map<string, ParsedExpression>();
|
||||
this.mapRootToExpressionConfig = new Map<string, IExpression>();
|
||||
|
||||
this._onExpressionChange = new Emitter<void>();
|
||||
this.toUnbind.push(this._onExpressionChange);
|
||||
|
||||
this.updateExcludes(false);
|
||||
|
||||
this.registerListeners();
|
||||
}
|
||||
|
||||
public get onExpressionChange(): Event<void> {
|
||||
return this._onExpressionChange.event;
|
||||
}
|
||||
|
||||
private registerListeners(): void {
|
||||
this.toUnbind.push(this.configurationService.onDidChangeConfiguration(e => {
|
||||
this._register(this.configurationService.onDidChangeConfiguration(e => {
|
||||
if (this.shouldUpdate(e)) {
|
||||
this.updateExcludes(true);
|
||||
}
|
||||
}));
|
||||
this.toUnbind.push(this.contextService.onDidChangeWorkspaceFolders(() => this.updateExcludes(true)));
|
||||
|
||||
this._register(this.contextService.onDidChangeWorkspaceFolders(() => this.updateExcludes(true)));
|
||||
}
|
||||
|
||||
private updateExcludes(fromEvent: boolean): void {
|
||||
@@ -98,7 +93,7 @@ export class ResourceGlobMatcher {
|
||||
}
|
||||
}
|
||||
|
||||
public matches(resource: URI): boolean {
|
||||
matches(resource: URI): boolean {
|
||||
const folder = this.contextService.getWorkspaceFolder(resource);
|
||||
|
||||
let expressionForRoot: ParsedExpression;
|
||||
@@ -121,8 +116,4 @@ export class ResourceGlobMatcher {
|
||||
|
||||
return !!expressionForRoot(resourcePathToMatch);
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
this.toUnbind = dispose(this.toUnbind);
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import 'vs/css!./media/shell';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import * as perf from 'vs/base/common/performance';
|
||||
import * as aria from 'vs/base/browser/ui/aria/aria';
|
||||
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import { toErrorMessage } from 'vs/base/common/errorMessage';
|
||||
import product from 'vs/platform/node/product';
|
||||
@@ -19,8 +19,7 @@ import pkg from 'vs/platform/node/package';
|
||||
import { ContextViewService } from 'vs/platform/contextview/browser/contextViewService';
|
||||
import { Workbench, IWorkbenchStartedInfo } from 'vs/workbench/electron-browser/workbench';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { NullTelemetryService, configurationTelemetry } from 'vs/platform/telemetry/common/telemetryUtils';
|
||||
import { IExperimentService, ExperimentService } from 'vs/platform/telemetry/common/experiments';
|
||||
import { NullTelemetryService, configurationTelemetry, LogAppender, combinedAppender } from 'vs/platform/telemetry/common/telemetryUtils';
|
||||
import { ITelemetryAppenderChannel, TelemetryAppenderClient } from 'vs/platform/telemetry/common/telemetryIpc';
|
||||
import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService';
|
||||
import ErrorTelemetry from 'vs/platform/telemetry/browser/errorTelemetry';
|
||||
@@ -36,7 +35,7 @@ import { LifecycleService } from 'vs/platform/lifecycle/electron-browser/lifecyc
|
||||
import { MarkerService } from 'vs/platform/markers/common/markerService';
|
||||
import { IModelService } from 'vs/editor/common/services/modelService';
|
||||
import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
|
||||
import { CodeEditorServiceImpl } from 'vs/editor/browser/services/codeEditorServiceImpl';
|
||||
import { CodeEditorService } from 'vs/workbench/services/codeEditor/browser/codeEditorService';
|
||||
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
|
||||
import { IntegrityServiceImpl } from 'vs/platform/integrity/node/integrityServiceImpl';
|
||||
import { IIntegrityService } from 'vs/platform/integrity/common/integrity';
|
||||
@@ -47,11 +46,10 @@ import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
|
||||
import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService';
|
||||
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { ILifecycleService, LifecyclePhase, ShutdownReason, StartupKind } from 'vs/platform/lifecycle/common/lifecycle';
|
||||
import { IMarkerService } from 'vs/platform/markers/common/markers';
|
||||
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
import { ISearchService } from 'vs/platform/search/common/search';
|
||||
import { ISearchService, ISearchHistoryService } from 'vs/platform/search/common/search';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { CommandService } from 'vs/workbench/services/commands/common/commandService';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
@@ -62,14 +60,14 @@ import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/serv
|
||||
import { ICrashReporterService, NullCrashReporterService, CrashReporterService } from 'vs/workbench/services/crashReporter/electron-browser/crashReporterService';
|
||||
import { getDelayedChannel, IPCClient } from 'vs/base/parts/ipc/common/ipc';
|
||||
import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net';
|
||||
import { DefaultURITransformer } from 'vs/base/common/uriIpc';
|
||||
import { IExtensionManagementChannel, ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc';
|
||||
import { IExtensionManagementService, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { IExtensionManagementService, IExtensionEnablementService, IExtensionManagementServerService } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { ExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService';
|
||||
import { ITimerService } from 'vs/workbench/services/timer/common/timerService';
|
||||
import { BareFontInfo } from 'vs/editor/common/config/fontInfo';
|
||||
import { restoreFontInfo, readFontInfo, saveFontInfo } from 'vs/editor/browser/config/configuration';
|
||||
import * as browser from 'vs/base/browser/browser';
|
||||
import 'vs/platform/opener/browser/opener.contribution';
|
||||
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||
import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService';
|
||||
import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration';
|
||||
@@ -94,7 +92,12 @@ import { NotificationService } from 'vs/workbench/services/notification/common/n
|
||||
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
|
||||
import { DialogService } from 'vs/workbench/services/dialogs/electron-browser/dialogService';
|
||||
import { DialogChannel } from 'vs/platform/dialogs/common/dialogIpc';
|
||||
import { EventType, addDisposableListener, addClass, getClientArea } from 'vs/base/browser/dom';
|
||||
import { EventType, addDisposableListener, addClass } from 'vs/base/browser/dom';
|
||||
import { IOpenerService } from 'vs/platform/opener/common/opener';
|
||||
import { OpenerService } from 'vs/editor/browser/services/openerService';
|
||||
import { SearchHistoryService } from 'vs/workbench/services/search/node/searchHistoryService';
|
||||
import { MulitExtensionManagementService } from 'vs/platform/extensionManagement/common/multiExtensionManagement';
|
||||
import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService';
|
||||
|
||||
// {{SQL CARBON EDIT}}
|
||||
import { FileTelemetryService } from 'sql/platform/telemetry/fileTelemetryService';
|
||||
@@ -115,15 +118,13 @@ export interface ICoreServices {
|
||||
* The workbench shell contains the workbench with a rich header containing navigation and the activity bar.
|
||||
* With the Shell being the top level element in the page, it is also responsible for driving the layouting.
|
||||
*/
|
||||
export class WorkbenchShell {
|
||||
export class WorkbenchShell extends Disposable {
|
||||
private storageService: IStorageService;
|
||||
private environmentService: IEnvironmentService;
|
||||
private logService: ILogService;
|
||||
private contextViewService: ContextViewService;
|
||||
private configurationService: IConfigurationService;
|
||||
private contextService: IWorkspaceContextService;
|
||||
private telemetryService: ITelemetryService;
|
||||
private experimentService: IExperimentService;
|
||||
private extensionService: ExtensionService;
|
||||
private broadcastService: IBroadcastService;
|
||||
private timerService: ITimerService;
|
||||
@@ -133,16 +134,15 @@ export class WorkbenchShell {
|
||||
private notificationService: INotificationService;
|
||||
|
||||
private container: HTMLElement;
|
||||
private toUnbind: IDisposable[];
|
||||
private previousErrorValue: string;
|
||||
private previousErrorTime: number;
|
||||
private content: HTMLElement;
|
||||
private contentsContainer: HTMLElement;
|
||||
|
||||
private configuration: IWindowConfiguration;
|
||||
private workbench: Workbench;
|
||||
|
||||
constructor(container: HTMLElement, coreServices: ICoreServices, mainProcessServices: ServiceCollection, private mainProcessClient: IPCClient, configuration: IWindowConfiguration) {
|
||||
super();
|
||||
|
||||
this.container = container;
|
||||
|
||||
this.configuration = configuration;
|
||||
@@ -156,27 +156,21 @@ export class WorkbenchShell {
|
||||
|
||||
this.mainProcessServices = mainProcessServices;
|
||||
|
||||
this.toUnbind = [];
|
||||
this.previousErrorTime = 0;
|
||||
}
|
||||
|
||||
private createContents(parent: HTMLElement): HTMLElement {
|
||||
|
||||
private renderContents(): void {
|
||||
// ARIA
|
||||
aria.setARIAContainer(document.body);
|
||||
|
||||
// Workbench Container
|
||||
const workbenchContainer = document.createElement('div');
|
||||
parent.appendChild(workbenchContainer);
|
||||
|
||||
// Instantiation service with services
|
||||
const [instantiationService, serviceCollection] = this.initServiceCollection(parent);
|
||||
const [instantiationService, serviceCollection] = this.initServiceCollection(this.container);
|
||||
|
||||
// Workbench
|
||||
this.workbench = this.createWorkbench(instantiationService, serviceCollection, parent, workbenchContainer);
|
||||
this.workbench = this.createWorkbench(instantiationService, serviceCollection, this.container);
|
||||
|
||||
// Window
|
||||
this.workbench.getInstantiationService().createInstance(ElectronWindow, this.container);
|
||||
this.workbench.getInstantiationService().createInstance(ElectronWindow);
|
||||
|
||||
// Handle case where workbench is not starting up properly
|
||||
const timeoutHandle = setTimeout(() => {
|
||||
@@ -186,13 +180,11 @@ export class WorkbenchShell {
|
||||
this.lifecycleService.when(LifecyclePhase.Running).then(() => {
|
||||
clearTimeout(timeoutHandle);
|
||||
});
|
||||
|
||||
return workbenchContainer;
|
||||
}
|
||||
|
||||
private createWorkbench(instantiationService: IInstantiationService, serviceCollection: ServiceCollection, parent: HTMLElement, workbenchContainer: HTMLElement): Workbench {
|
||||
private createWorkbench(instantiationService: IInstantiationService, serviceCollection: ServiceCollection, container: HTMLElement): Workbench {
|
||||
try {
|
||||
const workbench = instantiationService.createInstance(Workbench, parent, workbenchContainer, this.configuration, serviceCollection, this.lifecycleService, this.mainProcessClient);
|
||||
const workbench = instantiationService.createInstance(Workbench, container, this.configuration, serviceCollection, this.lifecycleService, this.mainProcessClient);
|
||||
|
||||
// Set lifecycle phase to `Restoring`
|
||||
this.lifecycleService.phase = LifecyclePhase.Restoring;
|
||||
@@ -211,13 +203,12 @@ export class WorkbenchShell {
|
||||
eventuallPhaseTimeoutHandle = void 0;
|
||||
this.lifecycleService.phase = LifecyclePhase.Eventually;
|
||||
}, 3000);
|
||||
this.toUnbind.push({
|
||||
dispose: () => {
|
||||
if (eventuallPhaseTimeoutHandle) {
|
||||
clearTimeout(eventuallPhaseTimeoutHandle);
|
||||
}
|
||||
|
||||
this._register(toDisposable(() => {
|
||||
if (eventuallPhaseTimeoutHandle) {
|
||||
clearTimeout(eventuallPhaseTimeoutHandle);
|
||||
}
|
||||
});
|
||||
}));
|
||||
|
||||
// localStorage metrics (TODO@Ben remove me later)
|
||||
if (!this.environmentService.extensionTestsPath && this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) {
|
||||
@@ -252,7 +243,6 @@ export class WorkbenchShell {
|
||||
"customKeybindingsCount": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true },
|
||||
"theme": { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
|
||||
"language": { "classification": "SystemMetaData", "purpose": "BusinessInsight" },
|
||||
"experiments": { "${inline}": [ "${IExperiments}" ] },
|
||||
"pinnedViewlets": { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
|
||||
"restoredViewlet": { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
|
||||
"restoredEditors": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true },
|
||||
@@ -270,25 +260,14 @@ export class WorkbenchShell {
|
||||
customKeybindingsCount: info.customKeybindingsCount,
|
||||
theme: this.themeService.getColorTheme().id,
|
||||
language: platform.language,
|
||||
experiments: this.experimentService.getExperiments(),
|
||||
pinnedViewlets: info.pinnedViewlets,
|
||||
restoredViewlet: info.restoredViewlet,
|
||||
restoredEditors: info.restoredEditors.length,
|
||||
restoredEditors: info.restoredEditorsCount,
|
||||
startupKind: this.lifecycleService.startupKind
|
||||
});
|
||||
|
||||
// Telemetry: startup metrics
|
||||
perf.mark('didStartWorkbench');
|
||||
this.extensionService.whenInstalledExtensionsRegistered().done(() => {
|
||||
/* __GDPR__
|
||||
"startupTime" : {
|
||||
"${include}": [
|
||||
"${IStartupMetrics}"
|
||||
]
|
||||
}
|
||||
*/
|
||||
this.telemetryService.publicLog('startupTime', this.timerService.startupMetrics);
|
||||
});
|
||||
}
|
||||
|
||||
// {{SQL CARBON EDIT}}
|
||||
@@ -372,8 +351,7 @@ export class WorkbenchShell {
|
||||
serviceCollection.set(IWorkspaceContextService, this.contextService);
|
||||
serviceCollection.set(IConfigurationService, this.configurationService);
|
||||
serviceCollection.set(IEnvironmentService, this.environmentService);
|
||||
serviceCollection.set(ILogService, this.logService);
|
||||
this.toUnbind.push(this.logService);
|
||||
serviceCollection.set(ILogService, this._register(this.logService));
|
||||
|
||||
serviceCollection.set(ITimerService, this.timerService);
|
||||
serviceCollection.set(IStorageService, this.storageService);
|
||||
@@ -404,9 +382,6 @@ export class WorkbenchShell {
|
||||
// Hash
|
||||
serviceCollection.set(IHashService, new SyncDescriptor(HashService));
|
||||
|
||||
// Experiments
|
||||
this.experimentService = instantiationService.createInstance(ExperimentService);
|
||||
serviceCollection.set(IExperimentService, this.experimentService);
|
||||
// {{SQL CARBON EDIT}}
|
||||
if (this.environmentService.args['perf-test']) {
|
||||
let telemetryOutput = this.environmentService.args['telemetry-output'];
|
||||
@@ -414,28 +389,23 @@ export class WorkbenchShell {
|
||||
// Telemetry
|
||||
} else if (this.environmentService.isBuilt && !this.environmentService.isExtensionDevelopment && !this.environmentService.args['disable-telemetry'] && !!product.enableTelemetry) {
|
||||
const channel = getDelayedChannel<ITelemetryAppenderChannel>(sharedProcess.then(c => c.getChannel('telemetryAppender')));
|
||||
const commit = product.commit;
|
||||
const version = pkg.version;
|
||||
|
||||
const config: ITelemetryServiceConfig = {
|
||||
appender: new TelemetryAppenderClient(channel),
|
||||
commonProperties: resolveWorkbenchCommonProperties(this.storageService, commit, version, this.configuration.machineId, this.environmentService.installSourcePath),
|
||||
appender: combinedAppender(new TelemetryAppenderClient(channel), new LogAppender(this.logService)),
|
||||
commonProperties: resolveWorkbenchCommonProperties(this.storageService, product.commit, pkg.version, this.configuration.machineId, this.environmentService.installSourcePath),
|
||||
piiPaths: [this.environmentService.appRoot, this.environmentService.extensionsPath]
|
||||
};
|
||||
|
||||
const telemetryService = instantiationService.createInstance(TelemetryService, config);
|
||||
this.telemetryService = telemetryService;
|
||||
this.telemetryService = this._register(instantiationService.createInstance(TelemetryService, config));
|
||||
this._register(new ErrorTelemetry(this.telemetryService));
|
||||
|
||||
const errorTelemetry = new ErrorTelemetry(telemetryService);
|
||||
|
||||
this.toUnbind.push(telemetryService, errorTelemetry);
|
||||
// {{SQL CARBON EDIT}}
|
||||
this.sendUsageEvents();
|
||||
} else {
|
||||
this.telemetryService = NullTelemetryService;
|
||||
}
|
||||
|
||||
serviceCollection.set(ITelemetryService, this.telemetryService);
|
||||
this.toUnbind.push(configurationTelemetry(this.telemetryService, this.configurationService));
|
||||
this._register(configurationTelemetry(this.telemetryService, this.configurationService));
|
||||
|
||||
let crashReporterService = NullCrashReporterService;
|
||||
if (!this.environmentService.disableCrashReporter && product.crashReporter && product.hockeyApp) {
|
||||
@@ -446,16 +416,17 @@ export class WorkbenchShell {
|
||||
serviceCollection.set(IDialogService, instantiationService.createInstance(DialogService));
|
||||
|
||||
const lifecycleService = instantiationService.createInstance(LifecycleService);
|
||||
this.toUnbind.push(lifecycleService.onShutdown(reason => this.dispose(reason)));
|
||||
this._register(lifecycleService.onShutdown(reason => this.dispose(reason)));
|
||||
serviceCollection.set(ILifecycleService, lifecycleService);
|
||||
this.lifecycleService = lifecycleService;
|
||||
|
||||
const extensionManagementChannel = getDelayedChannel<IExtensionManagementChannel>(sharedProcess.then(c => c.getChannel('extensions')));
|
||||
serviceCollection.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementChannelClient, extensionManagementChannel));
|
||||
const extensionManagementChannelClient = new ExtensionManagementChannelClient(extensionManagementChannel, DefaultURITransformer);
|
||||
serviceCollection.set(IExtensionManagementServerService, new SyncDescriptor(ExtensionManagementServerService, extensionManagementChannelClient));
|
||||
serviceCollection.set(IExtensionManagementService, new SyncDescriptor(MulitExtensionManagementService));
|
||||
|
||||
const extensionEnablementService = instantiationService.createInstance(ExtensionEnablementService);
|
||||
const extensionEnablementService = this._register(instantiationService.createInstance(ExtensionEnablementService));
|
||||
serviceCollection.set(IExtensionEnablementService, extensionEnablementService);
|
||||
this.toUnbind.push(extensionEnablementService);
|
||||
|
||||
serviceCollection.set(IRequestService, new SyncDescriptor(RequestService));
|
||||
|
||||
@@ -472,9 +443,6 @@ export class WorkbenchShell {
|
||||
|
||||
serviceCollection.set(ICommandService, new SyncDescriptor(CommandService));
|
||||
|
||||
this.contextViewService = instantiationService.createInstance(ContextViewService, this.container);
|
||||
serviceCollection.set(IContextViewService, this.contextViewService);
|
||||
|
||||
serviceCollection.set(IMarkerService, new SyncDescriptor(MarkerService));
|
||||
|
||||
serviceCollection.set(IModeService, new SyncDescriptor(WorkbenchModeServiceImpl));
|
||||
@@ -491,9 +459,13 @@ export class WorkbenchShell {
|
||||
|
||||
serviceCollection.set(ISearchService, new SyncDescriptor(SearchService));
|
||||
|
||||
serviceCollection.set(ISearchHistoryService, new SyncDescriptor(SearchHistoryService));
|
||||
|
||||
serviceCollection.set(IWorkbenchIssueService, new SyncDescriptor(WorkbenchIssueService));
|
||||
|
||||
serviceCollection.set(ICodeEditorService, new SyncDescriptor(CodeEditorServiceImpl));
|
||||
serviceCollection.set(ICodeEditorService, new SyncDescriptor(CodeEditorService));
|
||||
|
||||
serviceCollection.set(IOpenerService, new SyncDescriptor(OpenerService));
|
||||
|
||||
serviceCollection.set(IIntegrityService, new SyncDescriptor(IntegrityServiceImpl));
|
||||
|
||||
@@ -503,7 +475,16 @@ export class WorkbenchShell {
|
||||
return [instantiationService, serviceCollection];
|
||||
}
|
||||
|
||||
public open(): void {
|
||||
open(): void {
|
||||
|
||||
// Listen on unhandled rejection events
|
||||
window.addEventListener('unhandledrejection', (event) => {
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent
|
||||
errors.onUnexpectedError((<any>event).reason);
|
||||
|
||||
// Prevent the printing of this event to the console
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
// Listen on unexpected errors
|
||||
errors.setUnexpectedErrorHandler((error: any) => {
|
||||
@@ -513,13 +494,8 @@ export class WorkbenchShell {
|
||||
// Shell Class for CSS Scoping
|
||||
addClass(this.container, 'monaco-shell');
|
||||
|
||||
// Controls
|
||||
this.content = document.createElement('div');
|
||||
addClass(this.content, 'monaco-shell-content');
|
||||
this.container.appendChild(this.content);
|
||||
|
||||
// Create Contents
|
||||
this.contentsContainer = this.createContents(this.content);
|
||||
this.renderContents();
|
||||
|
||||
// Layout
|
||||
this.layout();
|
||||
@@ -531,7 +507,11 @@ export class WorkbenchShell {
|
||||
private registerListeners(): void {
|
||||
|
||||
// Resize
|
||||
this.toUnbind.push(addDisposableListener(window, EventType.RESIZE, () => this.layout()));
|
||||
this._register(addDisposableListener(window, EventType.RESIZE, e => {
|
||||
if (e.target === window) {
|
||||
this.layout();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
// {{SQL CARBON EDIT}}
|
||||
@@ -539,7 +519,7 @@ export class WorkbenchShell {
|
||||
return (nowDate - lastUseDate)/(24*3600*1000);
|
||||
}
|
||||
|
||||
public onUnexpectedError(error: any): void {
|
||||
onUnexpectedError(error: any): void {
|
||||
const errorMsg = toErrorMessage(error, true);
|
||||
if (!errorMsg) {
|
||||
return;
|
||||
@@ -563,19 +543,11 @@ export class WorkbenchShell {
|
||||
}
|
||||
|
||||
private layout(): void {
|
||||
const clientArea = getClientArea(this.container);
|
||||
|
||||
this.contentsContainer.style.width = `${clientArea.width}px`;
|
||||
this.contentsContainer.style.height = `${clientArea.height}px`;
|
||||
|
||||
this.contextViewService.layout();
|
||||
this.workbench.layout();
|
||||
}
|
||||
|
||||
public dispose(reason = ShutdownReason.QUIT): void {
|
||||
|
||||
// Dispose bindings
|
||||
this.toUnbind = dispose(this.toUnbind);
|
||||
dispose(reason = ShutdownReason.QUIT): void {
|
||||
super.dispose();
|
||||
|
||||
// Keep font info for next startup around
|
||||
saveFontInfo(this.storageService);
|
||||
@@ -587,6 +559,7 @@ export class WorkbenchShell {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
||||
|
||||
// Foreground
|
||||
|
||||
@@ -8,45 +8,42 @@
|
||||
import * as nls from 'vs/nls';
|
||||
import URI from 'vs/base/common/uri';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
import * as types from 'vs/base/common/types';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import * as arrays from 'vs/base/common/arrays';
|
||||
import * as objects from 'vs/base/common/objects';
|
||||
import * as DOM from 'vs/base/browser/dom';
|
||||
import { Separator } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { IAction, Action } from 'vs/base/common/actions';
|
||||
import { AutoSaveConfiguration, IFileService } from 'vs/platform/files/common/files';
|
||||
import { toResource } from 'vs/workbench/common/editor';
|
||||
import { IWorkbenchEditorService, IResourceInputType } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { toResource, IUntitledResourceInput } from 'vs/workbench/common/editor';
|
||||
import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
|
||||
import { IWindowsService, IWindowService, IWindowSettings, IPath, IOpenFileRequest, IWindowsConfiguration, IAddFoldersRequest, IRunActionInWindowRequest } from 'vs/platform/windows/common/windows';
|
||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
import { ITitleService } from 'vs/workbench/services/title/common/titleService';
|
||||
import { IWorkbenchThemeService, VS_HC_THEME, VS_DARK_THEME } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||
import * as browser from 'vs/base/browser/browser';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
|
||||
import { Position, IResourceInput, IUntitledResourceInput, IEditor } from 'vs/platform/editor/common/editor';
|
||||
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IResourceInput } from 'vs/platform/editor/common/editor';
|
||||
import { KeyboardMapperFactory } from 'vs/workbench/services/keybinding/electron-browser/keybindingService';
|
||||
import { Themable } from 'vs/workbench/common/theme';
|
||||
import { ipcRenderer as ipc, webFrame } from 'electron';
|
||||
import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing';
|
||||
import { IMenuService, MenuId, IMenu, MenuItemAction, ICommandAction } from 'vs/platform/actions/common/actions';
|
||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { fillInActions } from 'vs/platform/actions/browser/menuItemActionItem';
|
||||
import { fillInActionBarActions } from 'vs/platform/actions/browser/menuItemActionItem';
|
||||
import { RunOnceScheduler } from 'vs/base/common/async';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
||||
import { LifecyclePhase, ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
|
||||
import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { IIntegrityService } from 'vs/platform/integrity/common/integrity';
|
||||
import { AccessibilitySupport, isRootUser, isWindows, isMacintosh } from 'vs/base/common/platform';
|
||||
import product from 'vs/platform/node/product';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import { EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor';
|
||||
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
|
||||
const TextInputActions: IAction[] = [
|
||||
new Action('undo', nls.localize('undo', "Undo"), null, true, () => document.execCommand('undo') && TPromise.as(true)),
|
||||
@@ -61,22 +58,18 @@ const TextInputActions: IAction[] = [
|
||||
|
||||
export class ElectronWindow extends Themable {
|
||||
|
||||
private static readonly AUTO_SAVE_SETTING = 'files.autoSave';
|
||||
|
||||
private touchBarUpdater: RunOnceScheduler;
|
||||
private touchBarMenu: IMenu;
|
||||
private touchBarUpdater: RunOnceScheduler;
|
||||
private touchBarDisposables: IDisposable[];
|
||||
private lastInstalledTouchedBar: ICommandAction[][];
|
||||
|
||||
private previousConfiguredZoomLevel: number;
|
||||
|
||||
private addFoldersScheduler: RunOnceScheduler;
|
||||
private pendingFoldersToAdd: IAddFoldersRequest[];
|
||||
private pendingFoldersToAdd: URI[];
|
||||
|
||||
constructor(
|
||||
shellContainer: HTMLElement,
|
||||
@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
|
||||
@IEditorGroupService private editorGroupService: IEditorGroupService,
|
||||
@IEditorService private editorService: EditorServiceImpl,
|
||||
@IWindowsService private windowsService: IWindowsService,
|
||||
@IWindowService private windowService: IWindowService,
|
||||
@IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService,
|
||||
@@ -85,7 +78,6 @@ export class ElectronWindow extends Themable {
|
||||
@INotificationService private notificationService: INotificationService,
|
||||
@ICommandService private commandService: ICommandService,
|
||||
@IExtensionService private extensionService: IExtensionService,
|
||||
@IViewletService private viewletService: IViewletService,
|
||||
@IContextMenuService private contextMenuService: IContextMenuService,
|
||||
@IKeybindingService private keybindingService: IKeybindingService,
|
||||
@ITelemetryService private telemetryService: ITelemetryService,
|
||||
@@ -99,12 +91,8 @@ export class ElectronWindow extends Themable {
|
||||
|
||||
this.touchBarDisposables = [];
|
||||
|
||||
this.touchBarUpdater = new RunOnceScheduler(() => this.doSetupTouchbar(), 300);
|
||||
this.toUnbind.push(this.touchBarUpdater);
|
||||
|
||||
this.pendingFoldersToAdd = [];
|
||||
this.addFoldersScheduler = new RunOnceScheduler(() => this.doAddFolders(), 100);
|
||||
this.toUnbind.push(this.addFoldersScheduler);
|
||||
this.addFoldersScheduler = this._register(new RunOnceScheduler(() => this.doAddFolders(), 100));
|
||||
|
||||
this.registerListeners();
|
||||
this.create();
|
||||
@@ -113,15 +101,7 @@ export class ElectronWindow extends Themable {
|
||||
private registerListeners(): void {
|
||||
|
||||
// React to editor input changes
|
||||
this.toUnbind.push(this.editorGroupService.onEditorsChanged(() => {
|
||||
|
||||
// Represented File Name
|
||||
const file = toResource(this.editorService.getActiveEditorInput(), { supportSideBySide: true, filter: 'file' });
|
||||
this.titleService.setRepresentedFilename(file ? file.fsPath : '');
|
||||
|
||||
// Touch Bar
|
||||
this.updateTouchbarMenu();
|
||||
}));
|
||||
this._register(this.editorService.onDidActiveEditorChange(() => this.updateTouchbarMenu()));
|
||||
|
||||
// prevent opening a real URL inside the shell
|
||||
[DOM.EventType.DRAG_OVER, DOM.EventType.DROP].forEach(event => {
|
||||
@@ -137,9 +117,9 @@ export class ElectronWindow extends Themable {
|
||||
// If we run an action from the touchbar, we fill in the currently active resource
|
||||
// as payload because the touch bar items are context aware depending on the editor
|
||||
if (request.from === 'touchbar') {
|
||||
const activeEditor = this.editorService.getActiveEditor();
|
||||
const activeEditor = this.editorService.activeEditor;
|
||||
if (activeEditor) {
|
||||
const resource = toResource(activeEditor.input, { supportSideBySide: true });
|
||||
const resource = toResource(activeEditor, { supportSideBySide: true });
|
||||
if (resource) {
|
||||
args.push(resource);
|
||||
}
|
||||
@@ -169,7 +149,6 @@ export class ElectronWindow extends Themable {
|
||||
} catch (error) {
|
||||
// should not happen
|
||||
}
|
||||
|
||||
// Resolve keys using the keybinding service and send back to browser process
|
||||
this.resolveKeybindings(actionIds).done(keybindings => {
|
||||
if (keybindings.length) {
|
||||
@@ -197,11 +176,6 @@ export class ElectronWindow extends Themable {
|
||||
this.notificationService.info(message);
|
||||
});
|
||||
|
||||
// Support toggling auto save
|
||||
ipc.on('vscode.toggleAutoSave', () => {
|
||||
this.toggleAutoSave();
|
||||
});
|
||||
|
||||
// Fullscreen Events
|
||||
ipc.on('vscode:enterFullScreen', () => {
|
||||
this.lifecycleService.when(LifecyclePhase.Running).then(() => {
|
||||
@@ -246,7 +220,7 @@ export class ElectronWindow extends Themable {
|
||||
|
||||
// Zoom level changes
|
||||
this.updateWindowZoomLevel();
|
||||
this.toUnbind.push(this.configurationService.onDidChangeConfiguration(e => {
|
||||
this._register(this.configurationService.onDidChangeConfiguration(e => {
|
||||
if (e.affectsConfiguration('window.zoomLevel')) {
|
||||
this.updateWindowZoomLevel();
|
||||
}
|
||||
@@ -260,12 +234,12 @@ export class ElectronWindow extends Themable {
|
||||
if (e.target instanceof HTMLElement) {
|
||||
const target = <HTMLElement>e.target;
|
||||
if (target.nodeName && (target.nodeName.toLowerCase() === 'input' || target.nodeName.toLowerCase() === 'textarea')) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
DOM.EventHelper.stop(e, true);
|
||||
|
||||
this.contextMenuService.showContextMenu({
|
||||
getAnchor: () => e,
|
||||
getActions: () => TPromise.as(TextInputActions)
|
||||
getActions: () => TPromise.as(TextInputActions),
|
||||
onHide: () => target.focus() // fixes https://github.com/Microsoft/vscode/issues/52948
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -306,19 +280,11 @@ export class ElectronWindow extends Themable {
|
||||
return null;
|
||||
};
|
||||
|
||||
// Send over all extension viewlets when extensions are ready
|
||||
this.extensionService.whenInstalledExtensionsRegistered().then(() => {
|
||||
ipc.send('vscode:extensionViewlets', JSON.stringify(this.viewletService.getViewlets().filter(v => !!v.extensionId).map(v => { return { id: v.id, label: v.name }; })));
|
||||
});
|
||||
|
||||
// Emit event when vscode has loaded
|
||||
this.lifecycleService.when(LifecyclePhase.Running).then(() => {
|
||||
ipc.send('vscode:workbenchLoaded', this.windowService.getCurrentWindowId());
|
||||
});
|
||||
|
||||
// Touchbar Support
|
||||
this.updateTouchbarMenu();
|
||||
|
||||
// Integrity warning
|
||||
this.integrityService.isPure().then(res => this.titleService.updateProperties({ isPure: res.isPure }));
|
||||
|
||||
@@ -342,40 +308,40 @@ export class ElectronWindow extends Themable {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Touchbar menu (if enabled)
|
||||
this.updateTouchbarMenu();
|
||||
}
|
||||
|
||||
private updateTouchbarMenu(): void {
|
||||
if (!isMacintosh) {
|
||||
return; // macOS only
|
||||
}
|
||||
|
||||
const touchbarEnabled = this.configurationService.getValue<boolean>('keyboard.touchbar.enabled');
|
||||
if (!touchbarEnabled) {
|
||||
return; // disabled via setting
|
||||
if (
|
||||
!isMacintosh || // macOS only
|
||||
!this.configurationService.getValue<boolean>('keyboard.touchbar.enabled') // disabled via setting
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Dispose old
|
||||
this.touchBarDisposables = dispose(this.touchBarDisposables);
|
||||
this.touchBarMenu = void 0;
|
||||
|
||||
// Create new
|
||||
this.touchBarMenu = this.editorGroupService.invokeWithinEditorContext(accessor => this.menuService.createMenu(MenuId.TouchBarContext, accessor.get(IContextKeyService)));
|
||||
this.touchBarDisposables.push(this.touchBarMenu);
|
||||
this.touchBarDisposables.push(this.touchBarMenu.onDidChange(() => {
|
||||
this.scheduleSetupTouchbar();
|
||||
}));
|
||||
|
||||
this.scheduleSetupTouchbar();
|
||||
}
|
||||
|
||||
private scheduleSetupTouchbar(): void {
|
||||
// Create new (delayed)
|
||||
this.touchBarUpdater = new RunOnceScheduler(() => this.doUpdateTouchbarMenu(), 300);
|
||||
this.touchBarDisposables.push(this.touchBarUpdater);
|
||||
this.touchBarUpdater.schedule();
|
||||
}
|
||||
|
||||
private doSetupTouchbar(): void {
|
||||
private doUpdateTouchbarMenu(): void {
|
||||
if (!this.touchBarMenu) {
|
||||
this.touchBarMenu = this.editorService.invokeWithinEditorContext(accessor => this.menuService.createMenu(MenuId.TouchBarContext, accessor.get(IContextKeyService)));
|
||||
this.touchBarDisposables.push(this.touchBarMenu);
|
||||
this.touchBarDisposables.push(this.touchBarMenu.onDidChange(() => this.touchBarUpdater.schedule()));
|
||||
}
|
||||
|
||||
const actions: (MenuItemAction | Separator)[] = [];
|
||||
|
||||
// Fill actions into groups respecting order
|
||||
fillInActions(this.touchBarMenu, void 0, actions, this.contextMenuService);
|
||||
fillInActionBarActions(this.touchBarMenu, void 0, actions);
|
||||
|
||||
// Convert into command action multi array
|
||||
const items: ICommandAction[][] = [];
|
||||
@@ -416,19 +382,16 @@ export class ElectronWindow extends Themable {
|
||||
if (!binding) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// first try to resolve a native accelerator
|
||||
const electronAccelerator = binding.getElectronAccelerator();
|
||||
if (electronAccelerator) {
|
||||
return { id, label: electronAccelerator, isNative: true };
|
||||
}
|
||||
|
||||
// we need this fallback to support keybindings that cannot show in electron menus (e.g. chords)
|
||||
const acceleratorLabel = binding.getLabel();
|
||||
if (acceleratorLabel) {
|
||||
return { id, label: acceleratorLabel, isNative: false };
|
||||
}
|
||||
|
||||
return null;
|
||||
}));
|
||||
});
|
||||
@@ -437,7 +400,7 @@ export class ElectronWindow extends Themable {
|
||||
private onAddFoldersRequest(request: IAddFoldersRequest): void {
|
||||
|
||||
// Buffer all pending requests
|
||||
this.pendingFoldersToAdd.push(request);
|
||||
this.pendingFoldersToAdd.push(...request.foldersToAdd.map(f => URI.revive(f)));
|
||||
|
||||
// Delay the adding of folders a bit to buffer in case more requests are coming
|
||||
if (!this.addFoldersScheduler.isScheduled()) {
|
||||
@@ -448,8 +411,8 @@ export class ElectronWindow extends Themable {
|
||||
private doAddFolders(): void {
|
||||
const foldersToAdd: IWorkspaceFolderCreationData[] = [];
|
||||
|
||||
this.pendingFoldersToAdd.forEach(request => {
|
||||
foldersToAdd.push(...request.foldersToAdd.map(folderToAdd => ({ uri: URI.file(folderToAdd.filePath) })));
|
||||
this.pendingFoldersToAdd.forEach(folder => {
|
||||
foldersToAdd.push(({ uri: folder }));
|
||||
});
|
||||
|
||||
this.pendingFoldersToAdd = [];
|
||||
@@ -458,7 +421,7 @@ export class ElectronWindow extends Themable {
|
||||
}
|
||||
|
||||
private onOpenFiles(request: IOpenFileRequest): void {
|
||||
const inputs: IResourceInputType[] = [];
|
||||
const inputs: IResourceEditor[] = [];
|
||||
const diffMode = (request.filesToDiff.length === 2);
|
||||
|
||||
if (!diffMode && request.filesToOpen) {
|
||||
@@ -483,9 +446,8 @@ export class ElectronWindow extends Themable {
|
||||
// the wait marker file to signal to the outside that editing is done.
|
||||
const resourcesToWaitFor = request.filesToWait.paths.map(p => URI.file(p.filePath));
|
||||
const waitMarkerFile = URI.file(request.filesToWait.waitMarkerFilePath);
|
||||
const stacks = this.editorGroupService.getStacksModel();
|
||||
const unbind = stacks.onEditorClosed(() => {
|
||||
if (resourcesToWaitFor.every(r => !stacks.isOpen(r))) {
|
||||
const unbind = this.editorService.onDidCloseEditor(() => {
|
||||
if (resourcesToWaitFor.every(resource => !this.editorService.isOpen({ resource }))) {
|
||||
unbind.dispose();
|
||||
this.fileService.del(waitMarkerFile).done(null, errors.onUnexpectedError);
|
||||
}
|
||||
@@ -493,8 +455,8 @@ export class ElectronWindow extends Themable {
|
||||
}
|
||||
}
|
||||
|
||||
private openResources(resources: (IResourceInput | IUntitledResourceInput)[], diffMode: boolean): Thenable<IEditor | IEditor[]> {
|
||||
return this.lifecycleService.when(LifecyclePhase.Running).then((): TPromise<IEditor | IEditor[]> => {
|
||||
private openResources(resources: (IResourceInput | IUntitledResourceInput)[], diffMode: boolean): Thenable<any> {
|
||||
return this.lifecycleService.when(LifecyclePhase.Running).then((): TPromise<any> => {
|
||||
|
||||
// In diffMode we open 2 resources as diff
|
||||
if (diffMode && resources.length === 2) {
|
||||
@@ -507,17 +469,11 @@ export class ElectronWindow extends Themable {
|
||||
}
|
||||
|
||||
// Otherwise open all
|
||||
const activeEditor = this.editorService.getActiveEditor();
|
||||
return this.editorService.openEditors(resources.map((r, index) => {
|
||||
return {
|
||||
input: r,
|
||||
position: activeEditor ? activeEditor.position : Position.ONE
|
||||
};
|
||||
}));
|
||||
return this.editorService.openEditors(resources);
|
||||
});
|
||||
}
|
||||
|
||||
private toInputs(paths: IPath[], isNew: boolean): IResourceInputType[] {
|
||||
private toInputs(paths: IPath[], isNew: boolean): IResourceEditor[] {
|
||||
return paths.map(p => {
|
||||
const resource = URI.file(p.filePath);
|
||||
let input: IResourceInput | IUntitledResourceInput;
|
||||
@@ -538,24 +494,7 @@ export class ElectronWindow extends Themable {
|
||||
});
|
||||
}
|
||||
|
||||
private toggleAutoSave(): void {
|
||||
const setting = this.configurationService.inspect(ElectronWindow.AUTO_SAVE_SETTING);
|
||||
let userAutoSaveConfig = setting.user;
|
||||
if (types.isUndefinedOrNull(userAutoSaveConfig)) {
|
||||
userAutoSaveConfig = setting.default; // use default if setting not defined
|
||||
}
|
||||
|
||||
let newAutoSaveValue: string;
|
||||
if ([AutoSaveConfiguration.AFTER_DELAY, AutoSaveConfiguration.ON_FOCUS_CHANGE, AutoSaveConfiguration.ON_WINDOW_CHANGE].some(s => s === userAutoSaveConfig)) {
|
||||
newAutoSaveValue = AutoSaveConfiguration.OFF;
|
||||
} else {
|
||||
newAutoSaveValue = AutoSaveConfiguration.AFTER_DELAY;
|
||||
}
|
||||
|
||||
this.configurationService.updateValue(ElectronWindow.AUTO_SAVE_SETTING, newAutoSaveValue, ConfigurationTarget.USER);
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
dispose(): void {
|
||||
this.touchBarDisposables = dispose(this.touchBarDisposables);
|
||||
|
||||
super.dispose();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user