import URI from '@theia/core/lib/common/uri';
import { WorkspaceServer, UntitledWorkspaceService, WorkspaceFileService } from '../common';
import { WindowService } from '@theia/core/lib/browser/window/window-service';
import { FrontendApplicationContribution, LabelProvider, OnWillStopAction } from '@theia/core/lib/browser';
import { Deferred } from '@theia/core/lib/common/promise-util';
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
import { ILogger, Disposable, DisposableCollection, Emitter, Event, MaybePromise, MessageService, ContributionProvider } from '@theia/core';
import { WorkspacePreferences } from '../common/workspace-preferences';
import { FileStat, BaseStat } from '@theia/filesystem/lib/common/files';
import { FileService } from '@theia/filesystem/lib/browser/file-service';
import { WindowTitleService } from '@theia/core/lib/browser/window/window-title-service';
import { FileSystemPreferences } from '@theia/filesystem/lib/common';
import { WorkspaceSchemaUpdater } from './workspace-schema-updater';
import { IJSONSchema } from '@theia/core/lib/common/json-schema';
import { PreferenceSchemaService, PreferenceService } from '@theia/core/lib/common/preferences';
export declare const WorkspaceOpenHandlerContribution: unique symbol;
export interface WorkspaceOpenHandlerContribution {
    canHandle(uri: URI): MaybePromise<boolean>;
    openWorkspace(uri: URI, options?: WorkspaceInput): MaybePromise<void>;
    getWorkspaceLabel?(uri: URI): MaybePromise<string | undefined>;
}
export declare const WorkspaceHandlingContribution: unique symbol;
export interface WorkspaceHandlingContribution {
    modifyRecentWorkspaces?(workspaces: string[]): MaybePromise<string[]>;
}
/**
 * The workspace service.
 */
export declare class WorkspaceService implements FrontendApplicationContribution, WorkspaceOpenHandlerContribution {
    protected _workspace: FileStat | undefined;
    protected _roots: FileStat[];
    protected deferredRoots: Deferred<FileStat[]>;
    protected readonly fileService: FileService;
    protected readonly server: WorkspaceServer;
    protected readonly windowService: WindowService;
    protected logger: ILogger;
    protected preferences: WorkspacePreferences;
    protected readonly preferenceImpl: PreferenceService;
    protected readonly schemaService: PreferenceSchemaService;
    protected readonly envVariableServer: EnvVariablesServer;
    protected readonly messageService: MessageService;
    protected readonly labelProvider: LabelProvider;
    protected readonly fsPreferences: FileSystemPreferences;
    protected readonly schemaUpdater: WorkspaceSchemaUpdater;
    protected readonly untitledWorkspaceService: UntitledWorkspaceService;
    protected readonly workspaceFileService: WorkspaceFileService;
    protected readonly windowTitleService: WindowTitleService;
    protected readonly openHandlerContribution: ContributionProvider<WorkspaceOpenHandlerContribution>;
    protected readonly workspaceHandlingContribution: ContributionProvider<WorkspaceHandlingContribution>;
    protected _ready: Deferred<void>;
    get ready(): Promise<void>;
    protected init(): void;
    protected doInit(): Promise<void>;
    /**
     * Resolves to the default workspace URI as string.
     *
     * The default implementation tries to extract the default workspace location
     * from the `window.location.hash`, then falls-back to the most recently
     * used workspace root from the server.
     *
     * It is not ensured that the resolved workspace URI is valid, it can point
     * to a non-existing location.
     */
    protected getDefaultWorkspaceUri(): MaybePromise<string | undefined>;
    protected doGetDefaultWorkspaceUri(): Promise<string | undefined>;
    /**
     * Set the URL fragment to the given workspace path.
     */
    protected setURLFragment(workspacePath: string): void;
    protected getWorkspacePath(resource: URI): string;
    get roots(): Promise<FileStat[]>;
    tryGetRoots(): FileStat[];
    get workspace(): FileStat | undefined;
    protected readonly onWorkspaceChangeEmitter: Emitter<FileStat[]>;
    get onWorkspaceChanged(): Event<FileStat[]>;
    protected readonly onWorkspaceLocationChangedEmitter: Emitter<FileStat | undefined>;
    get onWorkspaceLocationChanged(): Event<FileStat | undefined>;
    protected readonly toDisposeOnWorkspace: DisposableCollection;
    protected setWorkspace(workspaceStat: FileStat | undefined): Promise<void>;
    protected updateWorkspace(): Promise<void>;
    protected updateRoots(): Promise<void>;
    protected computeRoots(): Promise<FileStat[]>;
    protected getWorkspaceDataFromFile(): Promise<WorkspaceData | undefined>;
    protected updateTitle(): void;
    /**
     * On unload, we set our workspace root as the last recently used on the backend.
     *
     * In the browser, we use `onStop` (fire-and-forget) because `onWillStop` actions
     * are never executed during browser tab close and returning an `OnWillStopAction`
     * would trigger an unwanted "Leave site?" confirmation dialog.
     *
     * In Electron, we use `onWillStop` so the workspace is persisted before the window closes.
     */
    onStop(): void;
    onWillStop(): OnWillStopAction | undefined;
    protected setMostRecentlyUsedWorkspace(): void;
    /**
     * Returns true if the current window is connected to a remote backend.
     * In remote sessions, we must not overwrite the local MRU with the remote
     * workspace's file URI, as the local MRU should retain the remote connection
     * URI (e.g. `devcontainer://...`) so the session can be restored on restart.
     *
     * Detection: the backend port is always in `?port=`. When connected to a
     * remote, the URL also has `?localPort=` (the original backend port).
     */
    protected isRemoteSession(): boolean;
    recentWorkspaces(): Promise<string[]>;
    removeRecentWorkspace(uri: string): Promise<void>;
    /**
     * Returns `true` if theia has an opened workspace or folder
     * @returns {boolean}
     */
    get opened(): boolean;
    /**
     * Returns `true` if a multiple-root workspace is currently open.
     * @returns {boolean}
     */
    get isMultiRootWorkspaceOpened(): boolean;
    /**
     * Opens directory, or recreates a workspace from the file that `uri` points to.
     */
    open(uri: URI, options?: WorkspaceInput): void;
    protected doOpen(uri: URI, options?: WorkspaceInput): Promise<void>;
    canHandle(uri: URI): boolean;
    openWorkspace(uri: URI, options?: WorkspaceInput): Promise<void>;
    /**
     * Adds root folder(s) to the workspace
     * @param uris URI or URIs of the root folder(s) to add
     */
    addRoot(uris: URI[] | URI): Promise<void>;
    /**
     * Removes root folder(s) from workspace.
     */
    removeRoots(uris: URI[]): Promise<void>;
    spliceRoots(start: number, deleteCount?: number, ...rootsToAdd: URI[]): Promise<URI[]>;
    getUntitledWorkspace(): Promise<URI>;
    protected writeWorkspaceFile(workspaceFile: FileStat | undefined, workspaceData: WorkspaceData): Promise<FileStat | undefined>;
    /**
     * Clears current workspace root.
     */
    close(): Promise<void>;
    /**
     * returns a FileStat if the argument URI points to an existing directory. Otherwise, `undefined`.
     */
    protected toValidRoot(uri: URI | string | undefined): Promise<FileStat | undefined>;
    /**
     * returns a FileStat if the argument URI points to a file or directory. Otherwise, `undefined`.
     */
    protected toFileStat(uri: URI | string | undefined): Promise<FileStat | undefined>;
    protected openWindow(uri: FileStat, options?: WorkspaceInput): void;
    protected reloadWindow(workspacePath: string, options?: WorkspaceInput): void;
    protected openNewWindow(workspacePath: string, options?: WorkspaceInput): void;
    protected shouldPreserveWindow(options?: WorkspaceInput): boolean;
    /**
     * Return true if one of the paths in paths array is present in the workspace
     * NOTE: You should always explicitly use `/` as the separator between the path segments.
     */
    containsSome(paths: string[]): Promise<boolean>;
    /**
     * `true` if the current workspace is configured using a configuration file.
     *
     * `false` if there is no workspace or the workspace is simply a folder.
     */
    get saved(): boolean;
    /**
     * Save workspace data into a file
     * @param uri URI or FileStat of the workspace file
     */
    save(uri: URI | FileStat): Promise<void>;
    protected readonly rootWatchers: Map<string, Disposable>;
    protected watchRoots(): Promise<void>;
    protected refreshRootWatchers(): Promise<void>;
    protected watchRoot(root: FileStat): Promise<void>;
    protected getExcludes(uri: string): string[];
    /**
     * Returns the workspace root uri that the given file belongs to.
     * In case that the file is found in more than one workspace roots, returns the root that is closest to the file.
     * If the file is not from the current workspace, returns `undefined`.
     * @param uri URI of the file
     */
    getWorkspaceRootUri(uri: URI | undefined): URI | undefined;
    /**
     * Returns the relative path of the given file to the workspace root.
     * @param uri URI of the file
     * @see getWorkspaceRootUri(uri)
     */
    getWorkspaceRelativePath(uri: URI): Promise<string>;
    areWorkspaceRoots(uris: URI[]): boolean;
    /**
     * Check if the file should be considered as a workspace file.
     *
     * Example: We should not try to read the contents of an .exe file.
     */
    protected isWorkspaceFile(candidate: FileStat | URI): boolean;
    isUntitledWorkspace(candidate?: URI): boolean;
    isSafeToReload(withURI?: URI): Promise<boolean>;
    /**
     *
     * @param key the property key under which to store the schema (e.g. tasks, launch)
     * @param schema the schema for the property. If none is supplied, the update is treated as a deletion.
     */
    updateSchema(key: string, schema?: IJSONSchema): Promise<boolean>;
}
export interface WorkspaceInput {
    /**
     * Tests whether the same window should be used or a new one has to be opened after setting the workspace root. By default it is `false`.
     */
    preserveWindow?: boolean;
}
export interface WorkspaceData {
    folders: Array<{
        path: string;
        name?: string;
    }>;
    [key: string]: {
        [id: string]: any;
    };
}
export declare namespace WorkspaceData {
    function is(data: unknown): data is WorkspaceData;
    function buildWorkspaceData(folders: string[] | FileStat[], additionalFields?: Partial<WorkspaceData>): WorkspaceData;
    function transformToRelative(data: WorkspaceData, workspaceFile?: FileStat): WorkspaceData;
    function transformToAbsolute(data: WorkspaceData, workspaceFile?: BaseStat): WorkspaceData;
}
//# sourceMappingURL=workspace-service.d.ts.map