/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
import { Event } from "../../../base/common/event.mjs";
import { URI } from "../../../base/common/uri.mjs";
export interface IEditorModel {
    /**
     * Emitted when the model is about to be disposed.
     */
    readonly onWillDispose: Event<void>;
    /**
     * Resolves the model.
     */
    resolve(): Promise<void>;
    /**
     * Find out if the editor model was resolved or not.
     */
    isResolved(): boolean;
    /**
     * Find out if this model has been disposed.
     */
    isDisposed(): boolean;
    /**
     * Dispose associated resources
     */
    dispose(): void;
}
export interface IBaseUntypedEditorInput {
    /**
     * Optional options to use when opening the input.
     */
    options?: IEditorOptions;
    /**
     * Label to show for the input.
     */
    readonly label?: string;
    /**
     * Description to show for the input.
     */
    readonly description?: string;
}
export interface IBaseResourceEditorInput extends IBaseUntypedEditorInput {
    /**
     * Hint to indicate that this input should be treated as a
     * untitled file.
     *
     * Without this hint, the editor service will make a guess by
     * looking at the scheme of the resource(s).
     *
     * Use `forceUntitled: true` when you pass in a `resource` that
     * does not use the `untitled` scheme. The `resource` will then
     * be used as associated path when saving the untitled file.
     */
    readonly forceUntitled?: boolean;
}
export interface IBaseTextResourceEditorInput extends IBaseResourceEditorInput {
    /**
     * Optional options to use when opening the text input.
     */
    options?: ITextEditorOptions;
    /**
     * The contents of the text input if known. If provided,
     * the input will not attempt to load the contents from
     * disk and may appear dirty.
     */
    contents?: string;
    /**
     * The encoding of the text input if known.
     */
    encoding?: string;
    /**
     * The identifier of the language id of the text input
     * if known to use when displaying the contents.
     */
    languageId?: string;
}
export interface IResourceEditorInput extends IBaseResourceEditorInput {
    /**
     * The resource URI of the resource to open.
     */
    readonly resource: URI;
}
export interface ITextResourceEditorInput extends IResourceEditorInput, IBaseTextResourceEditorInput {
    /**
     * Optional options to use when opening the text input.
     */
    options?: ITextEditorOptions;
}
/**
 * This identifier allows to uniquely identify an editor with a
 * resource, type and editor identifier.
 */
export interface IResourceEditorInputIdentifier {
    /**
     * The type of the editor.
     */
    readonly typeId: string;
    /**
     * The identifier of the editor if provided.
     */
    readonly editorId: string | undefined;
    /**
     * The resource URI of the editor.
     */
    readonly resource: URI;
}
export declare enum EditorActivation {
    /**
     * Activate the editor after it opened. This will automatically restore
     * the editor if it is minimized.
     */
    ACTIVATE = 1,
    /**
     * Only restore the editor if it is minimized but do not activate it.
     *
     * Note: will only work in combination with the `preserveFocus: true` option.
     * Otherwise, if focus moves into the editor, it will activate and restore
     * automatically.
     */
    RESTORE = 2,
    /**
     * Preserve the current active editor.
     *
     * Note: will only work in combination with the `preserveFocus: true` option.
     * Otherwise, if focus moves into the editor, it will activate and restore
     * automatically.
     */
    PRESERVE = 3
}
export declare enum EditorResolution {
    /**
     * Displays a picker and allows the user to decide which editor to use.
     */
    PICK = 0,
    /**
     * Only exclusive editors are considered.
     */
    EXCLUSIVE_ONLY = 1
}
export declare enum EditorOpenSource {
    /**
     * Default: the editor is opening via a programmatic call
     * to the editor service API.
     */
    API = 0,
    /**
     * Indicates that a user action triggered the opening, e.g.
     * via mouse or keyboard use.
     */
    USER = 1
}
export interface IEditorOptions {
    /**
     * Tells the editor to not receive keyboard focus when the editor is being opened.
     *
     * Will also not activate the group the editor opens in unless the group is already
     * the active one. This behaviour can be overridden via the `activation` option.
     */
    preserveFocus?: boolean;
    /**
     * This option is only relevant if an editor is opened into a group that is not active
     * already and allows to control if the inactive group should become active, restored
     * or preserved.
     *
     * By default, the editor group will become active unless `preserveFocus` or `inactive`
     * is specified.
     */
    activation?: EditorActivation;
    /**
     * Tells the editor to reload the editor input in the editor even if it is identical to the one
     * already showing. By default, the editor will not reload the input if it is identical to the
     * one showing.
     */
    forceReload?: boolean;
    /**
     * Will reveal the editor if it is already opened and visible in any of the opened editor groups.
     *
     * Note that this option is just a hint that might be ignored if the user wants to open an editor explicitly
     * to the side of another one or into a specific editor group.
     */
    revealIfVisible?: boolean;
    /**
     * Will reveal the editor if it is already opened (even when not visible) in any of the opened editor groups.
     *
     * Note that this option is just a hint that might be ignored if the user wants to open an editor explicitly
     * to the side of another one or into a specific editor group.
     */
    revealIfOpened?: boolean;
    /**
     * An editor that is pinned remains in the editor stack even when another editor is being opened.
     * An editor that is not pinned will always get replaced by another editor that is not pinned.
     */
    pinned?: boolean;
    /**
     * An editor that is sticky moves to the beginning of the editors list within the group and will remain
     * there unless explicitly closed. Operations such as "Close All" will not close sticky editors.
     */
    sticky?: boolean;
    /**
     * The index in the document stack where to insert the editor into when opening.
     */
    index?: number;
    /**
     * An active editor that is opened will show its contents directly. Set to true to open an editor
     * in the background without loading its contents.
     *
     * Will also not activate the group the editor opens in unless the group is already
     * the active one. This behaviour can be overridden via the `activation` option.
     */
    inactive?: boolean;
    /**
     * Will not show an error in case opening the editor fails and thus allows to show a custom error
     * message as needed. By default, an error will be presented as notification if opening was not possible.
     */
    /**
     * In case of an error opening the editor, will not present this error to the user (e.g. by showing
     * a generic placeholder in the editor area). So it is up to the caller to provide error information
     * in that case.
     *
     * By default, an error when opening an editor will result in a placeholder editor that shows the error.
     * In certain cases a modal dialog may be presented to ask the user for further action.
     */
    ignoreError?: boolean;
    /**
     * Allows to override the editor that should be used to display the input:
     * - `undefined`: let the editor decide for itself
     * - `string`: specific override by id
     * - `EditorResolution`: specific override handling
     */
    override?: string | EditorResolution;
    /**
     * A optional hint to signal in which context the editor opens.
     *
     * If configured to be `EditorOpenSource.USER`, this hint can be
     * used in various places to control the experience. For example,
     * if the editor to open fails with an error, a notification could
     * inform about this in a modal dialog. If the editor opened through
     * some background task, the notification would show in the background,
     * not as a modal dialog.
     */
    source?: EditorOpenSource;
    /**
     * An optional property to signal that certain view state should be
     * applied when opening the editor.
     */
    viewState?: object;
}
export interface ITextEditorSelection {
    readonly startLineNumber: number;
    readonly startColumn: number;
    readonly endLineNumber?: number;
    readonly endColumn?: number;
}
export declare const enum TextEditorSelectionRevealType {
    /**
     * Option to scroll vertically or horizontally as necessary and reveal a range centered vertically.
     */
    Center = 0,
    /**
     * Option to scroll vertically or horizontally as necessary and reveal a range centered vertically only if it lies outside the viewport.
     */
    CenterIfOutsideViewport = 1,
    /**
     * Option to scroll vertically or horizontally as necessary and reveal a range close to the top of the viewport, but not quite at the top.
     */
    NearTop = 2,
    /**
     * Option to scroll vertically or horizontally as necessary and reveal a range close to the top of the viewport, but not quite at the top.
     * Only if it lies outside the viewport
     */
    NearTopIfOutsideViewport = 3
}
export declare const enum TextEditorSelectionSource {
    /**
     * Programmatic source indicates a selection change that
     * was not triggered by the user via keyboard or mouse
     * but through text editor APIs.
     */
    PROGRAMMATIC = "api",
    /**
     * Navigation source indicates a selection change that
     * was caused via some command or UI component such as
     * an outline tree.
     */
    NAVIGATION = "code.navigation",
    /**
     * Jump source indicates a selection change that
     * was caused from within the text editor to another
     * location in the same or different text editor such
     * as "Go to definition".
     */
    JUMP = "code.jump"
}
export interface ITextEditorOptions extends IEditorOptions {
    /**
     * Text editor selection.
     */
    selection?: ITextEditorSelection;
    /**
     * Option to control the text editor selection reveal type.
     * Defaults to TextEditorSelectionRevealType.Center
     */
    selectionRevealType?: TextEditorSelectionRevealType;
    /**
     * Source of the call that caused the selection.
     */
    selectionSource?: TextEditorSelectionSource | string;
}
