mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Merge from vscode e0762af258c0b20320ed03f3871a41967acc4421 (#7404)
* Merge from vscode e0762af258c0b20320ed03f3871a41967acc4421 * readd svgs
This commit is contained in:
@@ -3,101 +3,23 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IProcessEnvironment, isMacintosh, isLinux, isWeb } from 'vs/base/common/platform';
|
||||
import { ParsedArgs, IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history';
|
||||
import { ExportData } from 'vs/base/common/performance';
|
||||
import { LogLevel } from 'vs/platform/log/common/log';
|
||||
import { DisposableStore, Disposable } from 'vs/base/common/lifecycle';
|
||||
import { URI, UriComponents } from 'vs/base/common/uri';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async';
|
||||
|
||||
export const IWindowsService = createDecorator<IWindowsService>('windowsService');
|
||||
|
||||
export interface INativeOpenDialogOptions {
|
||||
forceNewWindow?: boolean;
|
||||
|
||||
defaultPath?: string;
|
||||
|
||||
telemetryEventName?: string;
|
||||
telemetryExtraData?: ITelemetryData;
|
||||
export interface IOpenedWindow {
|
||||
id: number;
|
||||
workspace?: IWorkspaceIdentifier;
|
||||
folderUri?: ISingleFolderWorkspaceIdentifier;
|
||||
title: string;
|
||||
filename?: string;
|
||||
}
|
||||
|
||||
export interface IEnterWorkspaceResult {
|
||||
workspace: IWorkspaceIdentifier;
|
||||
backupPath?: string;
|
||||
}
|
||||
|
||||
export interface OpenDialogOptions {
|
||||
title?: string;
|
||||
defaultPath?: string;
|
||||
buttonLabel?: string;
|
||||
filters?: FileFilter[];
|
||||
properties?: Array<'openFile' | 'openDirectory' | 'multiSelections' | 'showHiddenFiles' | 'createDirectory' | 'promptToCreate' | 'noResolveAliases' | 'treatPackageAsDirectory'>;
|
||||
message?: string;
|
||||
}
|
||||
|
||||
export interface FileFilter {
|
||||
extensions: string[];
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface MessageBoxOptions {
|
||||
type?: string;
|
||||
buttons?: string[];
|
||||
defaultId?: number;
|
||||
title?: string;
|
||||
message: string;
|
||||
detail?: string;
|
||||
checkboxLabel?: string;
|
||||
checkboxChecked?: boolean;
|
||||
cancelId?: number;
|
||||
noLink?: boolean;
|
||||
normalizeAccessKeys?: boolean;
|
||||
}
|
||||
|
||||
export interface SaveDialogOptions {
|
||||
title?: string;
|
||||
defaultPath?: string;
|
||||
buttonLabel?: string;
|
||||
filters?: FileFilter[];
|
||||
message?: string;
|
||||
nameFieldLabel?: string;
|
||||
showsTagField?: boolean;
|
||||
}
|
||||
|
||||
export interface IWindowsService {
|
||||
|
||||
_serviceBrand: undefined;
|
||||
|
||||
readonly onWindowOpen: Event<number>;
|
||||
readonly onWindowFocus: Event<number>;
|
||||
readonly onWindowBlur: Event<number>;
|
||||
readonly onWindowMaximize: Event<number>;
|
||||
readonly onWindowUnmaximize: Event<number>;
|
||||
readonly onRecentlyOpenedChange: Event<void>;
|
||||
|
||||
addRecentlyOpened(recents: IRecent[]): Promise<void>;
|
||||
removeFromRecentlyOpened(paths: URI[]): Promise<void>;
|
||||
clearRecentlyOpened(): Promise<void>;
|
||||
getRecentlyOpened(windowId: number): Promise<IRecentlyOpened>;
|
||||
focusWindow(windowId: number): Promise<void>;
|
||||
isFocused(windowId: number): Promise<boolean>;
|
||||
|
||||
// Global methods
|
||||
openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise<void>;
|
||||
getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]>;
|
||||
getActiveWindowId(): Promise<number | undefined>;
|
||||
}
|
||||
|
||||
export const IWindowService = createDecorator<IWindowService>('windowService');
|
||||
|
||||
export interface IOpenSettings {
|
||||
export interface IOpenInWindowOptions {
|
||||
forceNewWindow?: boolean;
|
||||
forceReuseWindow?: boolean;
|
||||
diffMode?: boolean;
|
||||
@@ -105,59 +27,44 @@ export interface IOpenSettings {
|
||||
gotoLineMode?: boolean;
|
||||
noRecentEntry?: boolean;
|
||||
waitMarkerFileURI?: URI;
|
||||
args?: ParsedArgs;
|
||||
}
|
||||
|
||||
export type IURIToOpen = IWorkspaceToOpen | IFolderToOpen | IFileToOpen;
|
||||
export interface IOpenEmptyWindowOptions {
|
||||
reuse?: boolean;
|
||||
remoteAuthority?: string;
|
||||
}
|
||||
|
||||
export interface IWorkspaceToOpen {
|
||||
export type IWindowOpenable = IWorkspaceToOpen | IFolderToOpen | IFileToOpen;
|
||||
|
||||
export interface IBaseWindowOpenable {
|
||||
label?: string;
|
||||
}
|
||||
|
||||
export interface IWorkspaceToOpen extends IBaseWindowOpenable {
|
||||
workspaceUri: URI;
|
||||
label?: string;
|
||||
}
|
||||
|
||||
export interface IFolderToOpen {
|
||||
export interface IFolderToOpen extends IBaseWindowOpenable {
|
||||
folderUri: URI;
|
||||
label?: string;
|
||||
}
|
||||
|
||||
export interface IFileToOpen {
|
||||
export interface IFileToOpen extends IBaseWindowOpenable {
|
||||
fileUri: URI;
|
||||
label?: string;
|
||||
}
|
||||
|
||||
export function isWorkspaceToOpen(uriToOpen: IURIToOpen): uriToOpen is IWorkspaceToOpen {
|
||||
return !!(uriToOpen as IWorkspaceToOpen)['workspaceUri'];
|
||||
export function isWorkspaceToOpen(uriToOpen: IWindowOpenable): uriToOpen is IWorkspaceToOpen {
|
||||
return !!(uriToOpen as IWorkspaceToOpen).workspaceUri;
|
||||
}
|
||||
|
||||
export function isFolderToOpen(uriToOpen: IURIToOpen): uriToOpen is IFolderToOpen {
|
||||
return !!(uriToOpen as IFolderToOpen)['folderUri'];
|
||||
export function isFolderToOpen(uriToOpen: IWindowOpenable): uriToOpen is IFolderToOpen {
|
||||
return !!(uriToOpen as IFolderToOpen).folderUri;
|
||||
}
|
||||
|
||||
export function isFileToOpen(uriToOpen: IURIToOpen): uriToOpen is IFileToOpen {
|
||||
return !!(uriToOpen as IFileToOpen)['fileUri'];
|
||||
export function isFileToOpen(uriToOpen: IWindowOpenable): uriToOpen is IFileToOpen {
|
||||
return !!(uriToOpen as IFileToOpen).fileUri;
|
||||
}
|
||||
|
||||
|
||||
export interface IWindowService {
|
||||
|
||||
_serviceBrand: undefined;
|
||||
|
||||
readonly onDidChangeFocus: Event<boolean>;
|
||||
readonly onDidChangeMaximize: Event<boolean>;
|
||||
|
||||
readonly hasFocus: boolean;
|
||||
|
||||
readonly windowId: number;
|
||||
|
||||
getRecentlyOpened(): Promise<IRecentlyOpened>;
|
||||
addRecentlyOpened(recents: IRecent[]): Promise<void>;
|
||||
removeFromRecentlyOpened(paths: URI[]): Promise<void>;
|
||||
focusWindow(): Promise<void>;
|
||||
openWindow(uris: IURIToOpen[], options?: IOpenSettings): Promise<void>;
|
||||
isFocused(): Promise<boolean>;
|
||||
}
|
||||
|
||||
export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden';
|
||||
export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden' | 'compact';
|
||||
|
||||
export interface IWindowsConfiguration {
|
||||
window: IWindowSettings;
|
||||
@@ -352,37 +259,3 @@ export interface IRunActionInWindowRequest {
|
||||
export interface IRunKeybindingInWindowRequest {
|
||||
userSettingsLabel: string;
|
||||
}
|
||||
|
||||
export class ActiveWindowManager extends Disposable {
|
||||
|
||||
private readonly disposables = this._register(new DisposableStore());
|
||||
private firstActiveWindowIdPromise: CancelablePromise<number | undefined> | undefined;
|
||||
private activeWindowId: number | undefined;
|
||||
|
||||
constructor(@IWindowsService windowsService: IWindowsService) {
|
||||
super();
|
||||
|
||||
const onActiveWindowChange = Event.latch(Event.any(windowsService.onWindowOpen, windowsService.onWindowFocus));
|
||||
onActiveWindowChange(this.setActiveWindow, this, this.disposables);
|
||||
|
||||
this.firstActiveWindowIdPromise = createCancelablePromise(_ => windowsService.getActiveWindowId());
|
||||
this.firstActiveWindowIdPromise
|
||||
.then(id => this.activeWindowId = typeof this.activeWindowId === 'number' ? this.activeWindowId : id)
|
||||
.finally(this.firstActiveWindowIdPromise = undefined);
|
||||
}
|
||||
|
||||
private setActiveWindow(windowId: number | undefined) {
|
||||
if (this.firstActiveWindowIdPromise) {
|
||||
this.firstActiveWindowIdPromise.cancel();
|
||||
this.firstActiveWindowIdPromise = undefined;
|
||||
}
|
||||
|
||||
this.activeWindowId = windowId;
|
||||
}
|
||||
|
||||
async getActiveClientId(): Promise<string | undefined> {
|
||||
const id = this.firstActiveWindowIdPromise ? (await this.firstActiveWindowIdPromise) : this.activeWindowId;
|
||||
|
||||
return `window:${id}`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { IServerChannel } from 'vs/base/parts/ipc/common/ipc';
|
||||
import { IWindowsService, IURIToOpen, IOpenSettings, isWorkspaceToOpen, isFolderToOpen } from 'vs/platform/windows/common/windows';
|
||||
import { reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { IRecent, isRecentFile, isRecentFolder } from 'vs/platform/history/common/history';
|
||||
|
||||
export class WindowsChannel implements IServerChannel {
|
||||
|
||||
private readonly onWindowOpen: Event<number>;
|
||||
private readonly onWindowFocus: Event<number>;
|
||||
private readonly onWindowBlur: Event<number>;
|
||||
private readonly onWindowMaximize: Event<number>;
|
||||
private readonly onWindowUnmaximize: Event<number>;
|
||||
private readonly onRecentlyOpenedChange: Event<void>;
|
||||
|
||||
constructor(private readonly service: IWindowsService) {
|
||||
this.onWindowOpen = Event.buffer(service.onWindowOpen, true);
|
||||
this.onWindowFocus = Event.buffer(service.onWindowFocus, true);
|
||||
this.onWindowBlur = Event.buffer(service.onWindowBlur, true);
|
||||
this.onWindowMaximize = Event.buffer(service.onWindowMaximize, true);
|
||||
this.onWindowUnmaximize = Event.buffer(service.onWindowUnmaximize, true);
|
||||
this.onRecentlyOpenedChange = Event.buffer(service.onRecentlyOpenedChange, true);
|
||||
}
|
||||
|
||||
listen(_: unknown, event: string): Event<any> {
|
||||
switch (event) {
|
||||
case 'onWindowOpen': return this.onWindowOpen;
|
||||
case 'onWindowFocus': return this.onWindowFocus;
|
||||
case 'onWindowBlur': return this.onWindowBlur;
|
||||
case 'onWindowMaximize': return this.onWindowMaximize;
|
||||
case 'onWindowUnmaximize': return this.onWindowUnmaximize;
|
||||
case 'onRecentlyOpenedChange': return this.onRecentlyOpenedChange;
|
||||
}
|
||||
|
||||
throw new Error(`Event not found: ${event}`);
|
||||
}
|
||||
|
||||
call(_: unknown, command: string, arg?: any): Promise<any> {
|
||||
switch (command) {
|
||||
case 'addRecentlyOpened': return this.service.addRecentlyOpened(arg.map((recent: IRecent) => {
|
||||
if (isRecentFile(recent)) {
|
||||
recent.fileUri = URI.revive(recent.fileUri);
|
||||
} else if (isRecentFolder(recent)) {
|
||||
recent.folderUri = URI.revive(recent.folderUri);
|
||||
} else {
|
||||
recent.workspace = reviveWorkspaceIdentifier(recent.workspace);
|
||||
}
|
||||
return recent;
|
||||
}));
|
||||
case 'removeFromRecentlyOpened': return this.service.removeFromRecentlyOpened(arg.map(URI.revive));
|
||||
case 'clearRecentlyOpened': return this.service.clearRecentlyOpened();
|
||||
case 'getRecentlyOpened': return this.service.getRecentlyOpened(arg);
|
||||
case 'focusWindow': return this.service.focusWindow(arg);
|
||||
case 'isFocused': return this.service.isFocused(arg);
|
||||
case 'openWindow': {
|
||||
const urisToOpen: IURIToOpen[] = arg[1];
|
||||
const options: IOpenSettings = arg[2];
|
||||
urisToOpen.forEach(r => {
|
||||
if (isWorkspaceToOpen(r)) {
|
||||
r.workspaceUri = URI.revive(r.workspaceUri);
|
||||
} else if (isFolderToOpen(r)) {
|
||||
r.folderUri = URI.revive(r.folderUri);
|
||||
} else {
|
||||
r.fileUri = URI.revive(r.fileUri);
|
||||
}
|
||||
});
|
||||
options.waitMarkerFileURI = options.waitMarkerFileURI && URI.revive(options.waitMarkerFileURI);
|
||||
return this.service.openWindow(arg[0], urisToOpen, options);
|
||||
}
|
||||
case 'openExtensionDevelopmentHostWindow': return (this.service as any).openExtensionDevelopmentHostWindow(arg[0], arg[1]); // TODO@Isidor move
|
||||
case 'getWindows': return this.service.getWindows();
|
||||
case 'getActiveWindowId': return this.service.getActiveWindowId();
|
||||
}
|
||||
|
||||
throw new Error(`Call not found: ${command}`);
|
||||
}
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { IChannel } from 'vs/base/parts/ipc/common/ipc';
|
||||
import { IWindowsService, IURIToOpen, IOpenSettings } from 'vs/platform/windows/common/windows';
|
||||
import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { IRecentlyOpened, IRecent, isRecentWorkspace } from 'vs/platform/history/common/history';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { ParsedArgs } from 'vs/platform/environment/common/environment';
|
||||
import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService';
|
||||
import { IProcessEnvironment } from 'vs/base/common/platform';
|
||||
|
||||
export class WindowsService implements IWindowsService {
|
||||
|
||||
_serviceBrand: undefined;
|
||||
|
||||
private channel: IChannel;
|
||||
|
||||
get onWindowOpen(): Event<number> { return this.channel.listen('onWindowOpen'); }
|
||||
get onWindowFocus(): Event<number> { return this.channel.listen('onWindowFocus'); }
|
||||
get onWindowBlur(): Event<number> { return this.channel.listen('onWindowBlur'); }
|
||||
get onWindowMaximize(): Event<number> { return this.channel.listen('onWindowMaximize'); }
|
||||
get onWindowUnmaximize(): Event<number> { return this.channel.listen('onWindowUnmaximize'); }
|
||||
get onRecentlyOpenedChange(): Event<void> { return this.channel.listen('onRecentlyOpenedChange'); }
|
||||
|
||||
constructor(@IMainProcessService mainProcessService: IMainProcessService) {
|
||||
this.channel = mainProcessService.getChannel('windows');
|
||||
}
|
||||
|
||||
addRecentlyOpened(recent: IRecent[]): Promise<void> {
|
||||
return this.channel.call('addRecentlyOpened', recent);
|
||||
}
|
||||
|
||||
removeFromRecentlyOpened(paths: Array<URI>): Promise<void> {
|
||||
return this.channel.call('removeFromRecentlyOpened', paths);
|
||||
}
|
||||
|
||||
clearRecentlyOpened(): Promise<void> {
|
||||
return this.channel.call('clearRecentlyOpened');
|
||||
}
|
||||
|
||||
async getRecentlyOpened(windowId: number): Promise<IRecentlyOpened> {
|
||||
const recentlyOpened: IRecentlyOpened = await this.channel.call('getRecentlyOpened', windowId);
|
||||
recentlyOpened.workspaces.forEach(recent => isRecentWorkspace(recent) ? recent.workspace = reviveWorkspaceIdentifier(recent.workspace) : recent.folderUri = URI.revive(recent.folderUri));
|
||||
recentlyOpened.files.forEach(recent => recent.fileUri = URI.revive(recent.fileUri));
|
||||
|
||||
return recentlyOpened;
|
||||
}
|
||||
|
||||
focusWindow(windowId: number): Promise<void> {
|
||||
return this.channel.call('focusWindow', windowId);
|
||||
}
|
||||
|
||||
isFocused(windowId: number): Promise<boolean> {
|
||||
return this.channel.call('isFocused', windowId);
|
||||
}
|
||||
|
||||
openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise<void> {
|
||||
return this.channel.call('openWindow', [windowId, uris, options]);
|
||||
}
|
||||
|
||||
openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise<void> {
|
||||
return this.channel.call('openExtensionDevelopmentHostWindow', [args, env]);
|
||||
}
|
||||
|
||||
async getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> {
|
||||
const result = await this.channel.call<{
|
||||
id: number;
|
||||
workspace?: IWorkspaceIdentifier;
|
||||
folderUri?: ISingleFolderWorkspaceIdentifier;
|
||||
title: string;
|
||||
filename?: string;
|
||||
}[]>('getWindows');
|
||||
|
||||
for (const win of result) {
|
||||
if (win.folderUri) {
|
||||
win.folderUri = URI.revive(win.folderUri);
|
||||
}
|
||||
|
||||
if (win.workspace) {
|
||||
win.workspace = reviveWorkspaceIdentifier(win.workspace);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
getActiveWindowId(): Promise<number | undefined> {
|
||||
return this.channel.call('getActiveWindowId');
|
||||
}
|
||||
}
|
||||
@@ -1,203 +0,0 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { Disposable, DisposableStore } from 'vs/base/common/lifecycle';
|
||||
import { assign } from 'vs/base/common/objects';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { IWindowsService, OpenContext, IOpenSettings, IURIToOpen } from 'vs/platform/windows/common/windows';
|
||||
import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment';
|
||||
import { app, MessageBoxReturnValue, SaveDialogReturnValue, OpenDialogReturnValue, BrowserWindow, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions } from 'electron';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { IURLService, IURLHandler } from 'vs/platform/url/common/url';
|
||||
import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows';
|
||||
import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history';
|
||||
import { IHistoryMainService } from 'vs/platform/history/electron-main/historyMainService';
|
||||
import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { isMacintosh, IProcessEnvironment } from 'vs/base/common/platform';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
|
||||
// @deprecated this should eventually go away and be implemented by host & electron service
|
||||
export class LegacyWindowsMainService extends Disposable implements IWindowsService, IURLHandler {
|
||||
|
||||
_serviceBrand: undefined;
|
||||
|
||||
private readonly disposables = this._register(new DisposableStore());
|
||||
|
||||
private _activeWindowId: number | undefined;
|
||||
|
||||
readonly onWindowOpen: Event<number> = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-created', (_, w: BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id));
|
||||
readonly onWindowBlur: Event<number> = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-blur', (_, w: BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id));
|
||||
readonly onWindowMaximize: Event<number> = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-maximize', (_, w: BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id));
|
||||
readonly onWindowUnmaximize: Event<number> = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-unmaximize', (_, w: BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id));
|
||||
readonly onWindowFocus: Event<number> = Event.any(
|
||||
Event.map(Event.filter(Event.map(this.windowsMainService.onWindowsCountChanged, () => this.windowsMainService.getLastActiveWindow()), w => !!w), w => w!.id),
|
||||
Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-focus', (_, w: BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id))
|
||||
);
|
||||
|
||||
readonly onRecentlyOpenedChange: Event<void> = this.historyMainService.onRecentlyOpenedChange;
|
||||
|
||||
constructor(
|
||||
@IWindowsMainService private readonly windowsMainService: IWindowsMainService,
|
||||
@IEnvironmentService private readonly environmentService: IEnvironmentService,
|
||||
@IURLService urlService: IURLService,
|
||||
@IHistoryMainService private readonly historyMainService: IHistoryMainService,
|
||||
@ILogService private readonly logService: ILogService
|
||||
) {
|
||||
super();
|
||||
|
||||
urlService.registerHandler(this);
|
||||
|
||||
// remember last active window id
|
||||
Event.latch(Event.any(this.onWindowOpen, this.onWindowFocus))
|
||||
(id => this._activeWindowId = id, null, this.disposables);
|
||||
}
|
||||
|
||||
async showMessageBox(windowId: number, options: MessageBoxOptions): Promise<MessageBoxReturnValue> {
|
||||
this.logService.trace('windowsService#showMessageBox', windowId);
|
||||
|
||||
return this.withWindow(windowId, codeWindow => this.windowsMainService.showMessageBox(options, codeWindow), () => this.windowsMainService.showMessageBox(options))!;
|
||||
}
|
||||
|
||||
async showSaveDialog(windowId: number, options: SaveDialogOptions): Promise<SaveDialogReturnValue> {
|
||||
this.logService.trace('windowsService#showSaveDialog', windowId);
|
||||
|
||||
return this.withWindow(windowId, codeWindow => this.windowsMainService.showSaveDialog(options, codeWindow), () => this.windowsMainService.showSaveDialog(options))!;
|
||||
}
|
||||
|
||||
async showOpenDialog(windowId: number, options: OpenDialogOptions): Promise<OpenDialogReturnValue> {
|
||||
this.logService.trace('windowsService#showOpenDialog', windowId);
|
||||
|
||||
return this.withWindow(windowId, codeWindow => this.windowsMainService.showOpenDialog(options, codeWindow), () => this.windowsMainService.showOpenDialog(options))!;
|
||||
}
|
||||
|
||||
async addRecentlyOpened(recents: IRecent[]): Promise<void> {
|
||||
this.logService.trace('windowsService#addRecentlyOpened');
|
||||
this.historyMainService.addRecentlyOpened(recents);
|
||||
}
|
||||
|
||||
async removeFromRecentlyOpened(paths: URI[]): Promise<void> {
|
||||
this.logService.trace('windowsService#removeFromRecentlyOpened');
|
||||
|
||||
this.historyMainService.removeFromRecentlyOpened(paths);
|
||||
}
|
||||
|
||||
async clearRecentlyOpened(): Promise<void> {
|
||||
this.logService.trace('windowsService#clearRecentlyOpened');
|
||||
|
||||
this.historyMainService.clearRecentlyOpened();
|
||||
}
|
||||
|
||||
async getRecentlyOpened(windowId: number): Promise<IRecentlyOpened> {
|
||||
this.logService.trace('windowsService#getRecentlyOpened', windowId);
|
||||
|
||||
return this.withWindow(windowId, codeWindow => this.historyMainService.getRecentlyOpened(codeWindow.config.workspace, codeWindow.config.folderUri, codeWindow.config.filesToOpenOrCreate), () => this.historyMainService.getRecentlyOpened())!;
|
||||
}
|
||||
|
||||
async focusWindow(windowId: number): Promise<void> {
|
||||
this.logService.trace('windowsService#focusWindow', windowId);
|
||||
|
||||
if (isMacintosh) {
|
||||
return this.withWindow(windowId, codeWindow => codeWindow.win.show());
|
||||
} else {
|
||||
return this.withWindow(windowId, codeWindow => codeWindow.win.focus());
|
||||
}
|
||||
}
|
||||
|
||||
async isFocused(windowId: number): Promise<boolean> {
|
||||
this.logService.trace('windowsService#isFocused', windowId);
|
||||
|
||||
return this.withWindow(windowId, codeWindow => codeWindow.win.isFocused(), () => false)!;
|
||||
}
|
||||
|
||||
async openWindow(windowId: number, urisToOpen: IURIToOpen[], options: IOpenSettings): Promise<void> {
|
||||
this.logService.trace('windowsService#openWindow');
|
||||
if (!urisToOpen || !urisToOpen.length) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
this.windowsMainService.open({
|
||||
context: OpenContext.API,
|
||||
contextWindowId: windowId,
|
||||
urisToOpen: urisToOpen,
|
||||
cli: options.args ? { ...this.environmentService.args, ...options.args } : this.environmentService.args,
|
||||
forceNewWindow: options.forceNewWindow,
|
||||
forceReuseWindow: options.forceReuseWindow,
|
||||
diffMode: options.diffMode,
|
||||
addMode: options.addMode,
|
||||
gotoLineMode: options.gotoLineMode,
|
||||
noRecentEntry: options.noRecentEntry,
|
||||
waitMarkerFileURI: options.waitMarkerFileURI
|
||||
});
|
||||
}
|
||||
|
||||
async openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise<void> {
|
||||
this.logService.trace('windowsService#openExtensionDevelopmentHostWindow ' + JSON.stringify(args));
|
||||
|
||||
const extDevPaths = args.extensionDevelopmentPath;
|
||||
if (extDevPaths) {
|
||||
this.windowsMainService.openExtensionDevelopmentHostWindow(extDevPaths, {
|
||||
context: OpenContext.API,
|
||||
cli: args,
|
||||
userEnv: Object.keys(env).length > 0 ? env : undefined
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> {
|
||||
this.logService.trace('windowsService#getWindows');
|
||||
|
||||
const windows = this.windowsMainService.getWindows();
|
||||
|
||||
return windows.map(window => ({
|
||||
id: window.id,
|
||||
workspace: window.openedWorkspace,
|
||||
folderUri: window.openedFolderUri,
|
||||
title: window.win.getTitle(),
|
||||
filename: window.getRepresentedFilename()
|
||||
}));
|
||||
}
|
||||
|
||||
async getWindowCount(): Promise<number> {
|
||||
this.logService.trace('windowsService#getWindowCount');
|
||||
|
||||
return this.windowsMainService.getWindows().length;
|
||||
}
|
||||
|
||||
async getActiveWindowId(): Promise<number | undefined> {
|
||||
return this._activeWindowId;
|
||||
}
|
||||
|
||||
async handleURL(uri: URI): Promise<boolean> {
|
||||
|
||||
// Catch file URLs
|
||||
if (uri.authority === Schemas.file && !!uri.path) {
|
||||
this.openFileForURI({ fileUri: URI.file(uri.fsPath) }); // using fsPath on a non-file URI...
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private openFileForURI(uri: IURIToOpen): void {
|
||||
const cli = assign(Object.create(null), this.environmentService.args);
|
||||
const urisToOpen = [uri];
|
||||
|
||||
this.windowsMainService.open({ context: OpenContext.API, cli, urisToOpen, gotoLineMode: true });
|
||||
}
|
||||
|
||||
private withWindow<T>(windowId: number, fn: (window: ICodeWindow) => T, fallback?: () => T): T | undefined {
|
||||
const codeWindow = this.windowsMainService.getWindowById(windowId);
|
||||
if (codeWindow) {
|
||||
return fn(codeWindow);
|
||||
}
|
||||
|
||||
if (fallback) {
|
||||
return fallback();
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
@@ -3,12 +3,13 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { OpenContext, IWindowConfiguration, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen } from 'vs/platform/windows/common/windows';
|
||||
import { OpenContext, IWindowConfiguration, IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows';
|
||||
import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs';
|
||||
import { ParsedArgs } from 'vs/platform/environment/common/environment';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IProcessEnvironment } from 'vs/base/common/platform';
|
||||
import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { IWorkspaceIdentifier, IEnterWorkspaceResult } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { ISerializableCommandAction } from 'vs/platform/actions/common/actions';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { MessageBoxReturnValue, SaveDialogReturnValue, OpenDialogReturnValue, Rectangle, BrowserWindow, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions } from 'electron';
|
||||
@@ -108,7 +109,7 @@ export interface IWindowsMainService {
|
||||
focusLastActive(cli: ParsedArgs, context: OpenContext): ICodeWindow;
|
||||
getLastActiveWindow(): ICodeWindow | undefined;
|
||||
waitForWindowCloseOrLoad(windowId: number): Promise<void>;
|
||||
openEmptyWindow(context: OpenContext, options?: { reuse?: boolean, remoteAuthority?: string }): ICodeWindow[];
|
||||
openEmptyWindow(context: OpenContext, options?: IOpenEmptyWindowOptions): ICodeWindow[];
|
||||
openNewTabbedWindow(context: OpenContext): ICodeWindow[];
|
||||
openExternal(url: string): Promise<boolean>;
|
||||
sendToFocused(channel: string, ...args: any[]): void;
|
||||
@@ -125,7 +126,7 @@ export interface IOpenConfiguration {
|
||||
readonly contextWindowId?: number;
|
||||
readonly cli: ParsedArgs;
|
||||
readonly userEnv?: IProcessEnvironment;
|
||||
readonly urisToOpen?: IURIToOpen[];
|
||||
readonly urisToOpen?: IWindowOpenable[];
|
||||
readonly waitMarkerFileURI?: URI;
|
||||
readonly preferNewWindow?: boolean;
|
||||
readonly forceNewWindow?: boolean;
|
||||
|
||||
Reference in New Issue
Block a user