/*--------------------------------------------------------------------------------------------- * 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 { IMarkdownString } from 'vs/base/common/htmlContent'; import URI, { UriComponents } from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range, IRange } from 'vs/editor/common/core/range'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; import { ITextModel, IModelDecorationsChangeAccessor, TrackedRangeStickiness, OverviewRulerLane, IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; /** * A builder and helper for edit operations for a command. */ export interface IEditOperationBuilder { /** * Add a new edit operation (a replace operation). * @param range The range to replace (delete). May be empty to represent a simple insert. * @param text The text to replace with. May be null to represent a simple delete. */ addEditOperation(range: Range, text: string): void; /** * Add a new edit operation (a replace operation). * The inverse edits will be accessible in `ICursorStateComputerData.getInverseEditOperations()` * @param range The range to replace (delete). May be empty to represent a simple insert. * @param text The text to replace with. May be null to represent a simple delete. */ addTrackedEditOperation(range: Range, text: string): void; /** * Track `selection` when applying edit operations. * A best effort will be made to not grow/expand the selection. * An empty selection will clamp to a nearby character. * @param selection The selection to track. * @param trackPreviousOnEmpty If set, and the selection is empty, indicates whether the selection * should clamp to the previous or the next character. * @return A unique identifer. */ trackSelection(selection: Selection, trackPreviousOnEmpty?: boolean): string; } /** * A helper for computing cursor state after a command. */ export interface ICursorStateComputerData { /** * Get the inverse edit operations of the added edit operations. */ getInverseEditOperations(): IIdentifiedSingleEditOperation[]; /** * Get a previously tracked selection. * @param id The unique identifier returned by `trackSelection`. * @return The selection. */ getTrackedSelection(id: string): Selection; } /** * A command that modifies text / cursor state on a model. */ export interface ICommand { /** * Signal that this command is inserting automatic whitespace that should be trimmed if possible. * @internal */ readonly insertsAutoWhitespace?: boolean; /** * Get the edit operations needed to execute this command. * @param model The model the command will execute on. * @param builder A helper to collect the needed edit operations and to track selections. */ getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void; /** * Compute the cursor state after the edit operations were applied. * @param model The model the commad has executed on. * @param helper A helper to get inverse edit operations and to get previously tracked selections. * @return The cursor state after the command executed. */ computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection; } /** * A model for the diff editor. */ export interface IDiffEditorModel { /** * Original model. */ original: ITextModel; /** * Modified model. */ modified: ITextModel; } /** * An event describing that an editor has had its model reset (i.e. `editor.setModel()`). */ export interface IModelChangedEvent { /** * The `uri` of the previous model or null. */ readonly oldModelUrl: URI; /** * The `uri` of the new model or null. */ readonly newModelUrl: URI; } export interface IDimension { width: number; height: number; } /** * A change */ export interface IChange { readonly originalStartLineNumber: number; readonly originalEndLineNumber: number; readonly modifiedStartLineNumber: number; readonly modifiedEndLineNumber: number; } /** * A character level change. */ export interface ICharChange extends IChange { readonly originalStartColumn: number; readonly originalEndColumn: number; readonly modifiedStartColumn: number; readonly modifiedEndColumn: number; } /** * A line change */ export interface ILineChange extends IChange { readonly charChanges: ICharChange[]; } /** * @internal */ export interface IConfiguration extends IDisposable { onDidChange(listener: (e: editorOptions.IConfigurationChangedEvent) => void): IDisposable; readonly editor: editorOptions.InternalEditorOptions; setMaxLineNumber(maxLineNumber: number): void; updateOptions(newOptions: editorOptions.IEditorOptions): void; getRawOptions(): editorOptions.IEditorOptions; observeReferenceElement(dimension?: IDimension): void; setIsDominatedByLongLines(isDominatedByLongLines: boolean): void; } // --- view export interface IScrollEvent { readonly scrollTop: number; readonly scrollLeft: number; readonly scrollWidth: number; readonly scrollHeight: number; readonly scrollTopChanged: boolean; readonly scrollLeftChanged: boolean; readonly scrollWidthChanged: boolean; readonly scrollHeightChanged: boolean; } export interface INewScrollPosition { scrollLeft?: number; scrollTop?: number; } export interface IEditorAction { readonly id: string; readonly label: string; readonly alias: string; isSupported(): boolean; run(): TPromise; } export type IEditorModel = ITextModel | IDiffEditorModel; /** * A (serializable) state of the cursors. */ export interface ICursorState { inSelectionMode: boolean; selectionStart: IPosition; position: IPosition; } /** * A (serializable) state of the view. */ export interface IViewState { /** written by previous versions */ scrollTop?: number; /** written by previous versions */ scrollTopWithoutViewZones?: number; scrollLeft: number; firstPosition: IPosition; firstPositionDeltaTop: number; } /** * A (serializable) state of the code editor. */ export interface ICodeEditorViewState { cursorState: ICursorState[]; viewState: IViewState; contributionsState: { [id: string]: any }; } /** * (Serializable) View state for the diff editor. */ export interface IDiffEditorViewState { original: ICodeEditorViewState; modified: ICodeEditorViewState; } /** * An editor view state. */ export type IEditorViewState = ICodeEditorViewState | IDiffEditorViewState; export const enum ScrollType { Smooth = 0, Immediate = 1, } /** * An editor. */ export interface IEditor { /** * An event emitted when the editor has been disposed. * @event */ onDidDispose(listener: () => void): IDisposable; /** * Dispose the editor. */ dispose(): void; /** * Get a unique id for this editor instance. */ getId(): string; /** * Get the editor type. Please see `EditorType`. * This is to avoid an instanceof check */ getEditorType(): string; /** * Update the editor's options after the editor has been created. */ updateOptions(newOptions: editorOptions.IEditorOptions): void; /** * Indicates that the editor becomes visible. * @internal */ onVisible(): void; /** * Indicates that the editor becomes hidden. * @internal */ onHide(): void; /** * Instructs the editor to remeasure its container. This method should * be called when the container of the editor gets resized. */ layout(dimension?: IDimension): void; /** * Brings browser focus to the editor text */ focus(): void; /** * Returns true if the text inside this editor is focused (i.e. cursor is blinking). */ hasTextFocus(): boolean; /** * Returns all actions associated with this editor. */ getSupportedActions(): IEditorAction[]; /** * Saves current view state of the editor in a serializable object. */ saveViewState(): IEditorViewState; /** * Restores the view state of the editor from a serializable object generated by `saveViewState`. */ restoreViewState(state: IEditorViewState): void; /** * Given a position, returns a column number that takes tab-widths into account. */ getVisibleColumnFromPosition(position: IPosition): number; /** * Returns the primary position of the cursor. */ getPosition(): Position; /** * Set the primary position of the cursor. This will remove any secondary cursors. * @param position New primary cursor's position */ setPosition(position: IPosition): void; /** * Scroll vertically as necessary and reveal a line. */ revealLine(lineNumber: number, scrollType?: ScrollType): void; /** * Scroll vertically as necessary and reveal a line centered vertically. */ revealLineInCenter(lineNumber: number, scrollType?: ScrollType): void; /** * Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport. */ revealLineInCenterIfOutsideViewport(lineNumber: number, scrollType?: ScrollType): void; /** * Scroll vertically or horizontally as necessary and reveal a position. */ revealPosition(position: IPosition, scrollType?: ScrollType): void; /** * Scroll vertically or horizontally as necessary and reveal a position centered vertically. */ revealPositionInCenter(position: IPosition, scrollType?: ScrollType): void; /** * Scroll vertically or horizontally as necessary and reveal a position centered vertically only if it lies outside the viewport. */ revealPositionInCenterIfOutsideViewport(position: IPosition, scrollType?: ScrollType): void; /** * Returns the primary selection of the editor. */ getSelection(): Selection; /** * Returns all the selections of the editor. */ getSelections(): Selection[]; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection */ setSelection(selection: IRange): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection */ setSelection(selection: Range): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection */ setSelection(selection: ISelection): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection */ setSelection(selection: Selection): void; /** * Set the selections for all the cursors of the editor. * Cursors will be removed or added, as necessary. */ setSelections(selections: ISelection[]): void; /** * Scroll vertically as necessary and reveal lines. */ revealLines(startLineNumber: number, endLineNumber: number, scrollType?: ScrollType): void; /** * Scroll vertically as necessary and reveal lines centered vertically. */ revealLinesInCenter(lineNumber: number, endLineNumber: number, scrollType?: ScrollType): void; /** * Scroll vertically as necessary and reveal lines centered vertically only if it lies outside the viewport. */ revealLinesInCenterIfOutsideViewport(lineNumber: number, endLineNumber: number, scrollType?: ScrollType): void; /** * Scroll vertically or horizontally as necessary and reveal a range. */ revealRange(range: IRange, scrollType?: ScrollType): void; /** * Scroll vertically or horizontally as necessary and reveal a range centered vertically. */ revealRangeInCenter(range: IRange, scrollType?: ScrollType): void; /** * Scroll vertically or horizontally as necessary and reveal a range at the top of the viewport. */ revealRangeAtTop(range: IRange, scrollType?: ScrollType): void; /** * Scroll vertically or horizontally as necessary and reveal a range centered vertically only if it lies outside the viewport. */ revealRangeInCenterIfOutsideViewport(range: IRange, scrollType?: ScrollType): void; /** * Directly trigger a handler or an editor action. * @param source The source of the call. * @param handlerId The id of the handler or the id of a contribution. * @param payload Extra data to be sent to the handler. */ trigger(source: string, handlerId: string, payload: any): void; /** * Gets the current model attached to this editor. */ getModel(): IEditorModel; /** * Sets the current model attached to this editor. * If the previous model was created by the editor via the value key in the options * literal object, it will be destroyed. Otherwise, if the previous model was set * via setModel, or the model key in the options literal object, the previous model * will not be destroyed. * It is safe to call setModel(null) to simply detach the current model from the editor. */ setModel(model: IEditorModel): void; /** * Change the decorations. All decorations added through this changeAccessor * will get the ownerId of the editor (meaning they will not show up in other * editors). * @see `ITextModel.changeDecorations` * @internal */ changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any; } /** * An editor contribution that gets created every time a new editor gets created and gets disposed when the editor gets disposed. */ export interface IEditorContribution { /** * Get a unique identifier for this contribution. */ getId(): string; /** * Dispose this contribution. */ dispose(): void; /** * Store view state. */ saveViewState?(): any; /** * Restore view state. */ restoreViewState?(state: any): void; } /** * @internal */ export function isThemeColor(o: any): o is ThemeColor { return o && typeof o.id === 'string'; } /** * @internal */ export interface IThemeDecorationRenderOptions { backgroundColor?: string | ThemeColor; outline?: string; outlineColor?: string | ThemeColor; outlineStyle?: string; outlineWidth?: string; border?: string; borderColor?: string | ThemeColor; borderRadius?: string; borderSpacing?: string; borderStyle?: string; borderWidth?: string; fontStyle?: string; fontWeight?: string; textDecoration?: string; cursor?: string; color?: string | ThemeColor; opacity?: number; letterSpacing?: string; gutterIconPath?: string | UriComponents; gutterIconSize?: string; overviewRulerColor?: string | ThemeColor; before?: IContentDecorationRenderOptions; after?: IContentDecorationRenderOptions; } /** * @internal */ export interface IContentDecorationRenderOptions { contentText?: string; contentIconPath?: string | UriComponents; border?: string; borderColor?: string | ThemeColor; fontStyle?: string; fontWeight?: string; textDecoration?: string; color?: string | ThemeColor; backgroundColor?: string | ThemeColor; margin?: string; width?: string; height?: string; } /** * @internal */ export interface IDecorationRenderOptions extends IThemeDecorationRenderOptions { isWholeLine?: boolean; rangeBehavior?: TrackedRangeStickiness; overviewRulerLane?: OverviewRulerLane; light?: IThemeDecorationRenderOptions; dark?: IThemeDecorationRenderOptions; } /** * @internal */ export interface IThemeDecorationInstanceRenderOptions { before?: IContentDecorationRenderOptions; after?: IContentDecorationRenderOptions; } /** * @internal */ export interface IDecorationInstanceRenderOptions extends IThemeDecorationInstanceRenderOptions { light?: IThemeDecorationInstanceRenderOptions; dark?: IThemeDecorationInstanceRenderOptions; } /** * @internal */ export interface IDecorationOptions { range: IRange; hoverMessage?: IMarkdownString | IMarkdownString[]; renderOptions?: IDecorationInstanceRenderOptions; } /** * The type of the `IEditor`. */ export const EditorType = { ICodeEditor: 'vs.editor.ICodeEditor', IDiffEditor: 'vs.editor.IDiffEditor' }; /** * Built-in commands. * @internal */ export const Handler = { ExecuteCommand: 'executeCommand', ExecuteCommands: 'executeCommands', Type: 'type', ReplacePreviousChar: 'replacePreviousChar', CompositionStart: 'compositionStart', CompositionEnd: 'compositionEnd', Paste: 'paste', Cut: 'cut', Undo: 'undo', Redo: 'redo', };