/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; 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 } from 'vs/base/common/platform'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { IWorkspaceIdentifier } from "vs/platform/workspaces/common/workspaces"; export const IWindowsService = createDecorator('windowsService'); export interface IWindowsService { _serviceBrand: any; onWindowOpen: Event; onWindowFocus: Event; pickFileFolderAndOpen(windowId: number, forceNewWindow?: boolean, data?: ITelemetryData): TPromise; pickFileAndOpen(windowId: number, forceNewWindow?: boolean, path?: string, data?: ITelemetryData): TPromise; pickFolderAndOpen(windowId: number, forceNewWindow?: boolean, data?: ITelemetryData): TPromise; pickFolder(windowId: number, options?: { buttonLabel: string; title: string; }): TPromise; reloadWindow(windowId: number): TPromise; openDevTools(windowId: number): TPromise; toggleDevTools(windowId: number): TPromise; closeFolder(windowId: number): TPromise; toggleFullScreen(windowId: number): TPromise; setRepresentedFilename(windowId: number, fileName: string): TPromise; addToRecentlyOpened(paths: { path: string, isFile?: boolean }[]): TPromise; removeFromRecentlyOpened(paths: string[]): TPromise; clearRecentlyOpened(): TPromise; getRecentlyOpened(windowId: number): TPromise<{ files: string[]; folders: string[]; }>; focusWindow(windowId: number): TPromise; closeWindow(windowId: number): TPromise; isFocused(windowId: number): TPromise; isMaximized(windowId: number): TPromise; maximizeWindow(windowId: number): TPromise; unmaximizeWindow(windowId: number): TPromise; onWindowTitleDoubleClick(windowId: number): TPromise; setDocumentEdited(windowId: number, flag: boolean): TPromise; quit(): TPromise; relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise; // Shared process whenSharedProcessReady(): TPromise; toggleSharedProcess(): TPromise; // Global methods openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise; openNewWindow(): TPromise; showWindow(windowId: number): TPromise; getWindows(): TPromise<{ id: number; path: string; title: string; filename?: string; }[]>; getWindowCount(): TPromise; log(severity: string, ...messages: string[]): TPromise; // TODO@joao: what? closeExtensionHostWindow(extensionDevelopmentPaths: string[]): TPromise; showItemInFolder(path: string): TPromise; // This needs to be handled from browser process to prevent // foreground ordering issues on Windows openExternal(url: string): TPromise; // TODO: this is a bit backwards startCrashReporter(config: Electron.CrashReporterStartOptions): TPromise; } export const IWindowService = createDecorator('windowService'); export interface IWindowService { _serviceBrand: any; getCurrentWindowId(): number; pickFileFolderAndOpen(forceNewWindow?: boolean, data?: ITelemetryData): TPromise; pickFileAndOpen(forceNewWindow?: boolean, path?: string, data?: ITelemetryData): TPromise; pickFolderAndOpen(forceNewWindow?: boolean, data?: ITelemetryData): TPromise; pickFolder(options?: { buttonLabel: string; title: string; }): TPromise; reloadWindow(): TPromise; openDevTools(): TPromise; toggleDevTools(): TPromise; closeFolder(): TPromise; toggleFullScreen(): TPromise; setRepresentedFilename(fileName: string): TPromise; getRecentlyOpened(): TPromise<{ files: string[]; folders: string[]; }>; focusWindow(): TPromise; closeWindow(): TPromise; isFocused(): TPromise; setDocumentEdited(flag: boolean): TPromise; isMaximized(): TPromise; maximizeWindow(): TPromise; unmaximizeWindow(): TPromise; onWindowTitleDoubleClick(): TPromise; showMessageBox(options: Electron.ShowMessageBoxOptions): number; showSaveDialog(options: Electron.SaveDialogOptions, callback?: (fileName: string) => void): string; } export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden'; export interface IWindowsConfiguration { window: IWindowSettings; } export interface IWindowSettings { openFilesInNewWindow: 'on' | 'off' | 'default'; openFoldersInNewWindow: 'on' | 'off' | 'default'; restoreWindows: 'all' | 'folders' | 'one' | 'none'; reopenFolders: 'all' | 'one' | 'none'; // TODO@Ben deprecated restoreFullscreen: boolean; zoomLevel: number; titleBarStyle: 'native' | 'custom'; autoDetectHighContrast: boolean; menuBarVisibility: MenuBarVisibility; newWindowDimensions: 'default' | 'inherit' | 'maximized' | 'fullscreen'; nativeTabs: boolean; enableMenuBarMnemonics: boolean; closeWhenEmpty: boolean; } export enum OpenContext { // opening when running from the command line CLI, // macOS only: opening from the dock (also when opening files to a running instance from desktop) DOCK, // opening from the main application window MENU, // opening from a file or folder dialog DIALOG, // opening from the OS's UI DESKTOP, // opening through the API API } export enum ReadyState { /** * This window has not loaded any HTML yet */ NONE, /** * This window is loading HTML */ LOADING, /** * This window is navigating to another HTML */ NAVIGATING, /** * This window is done loading HTML */ READY } export interface IPath { // the file path to open within a Code instance filePath?: string; // the line number in the file path to open lineNumber?: number; // the column number in the file path to open columnNumber?: number; } export interface IOpenFileRequest { filesToOpen?: IPath[]; filesToCreate?: IPath[]; filesToDiff?: IPath[]; } export interface IWindowConfiguration extends ParsedArgs, IOpenFileRequest { appRoot: string; execPath: string; userEnv: IProcessEnvironment; isISOKeyboard?: boolean; zoomLevel?: number; fullscreen?: boolean; highContrast?: boolean; baseTheme?: string; backgroundColor?: string; accessibilitySupport?: boolean; isInitialStartup?: boolean; perfStartTime?: number; perfAppReady?: number; perfWindowLoadTime?: number; workspace?: IWorkspaceIdentifier; folderPath?: string; backupPath?: string; nodeCachedDataDir: string; }