From 9a0ce85aa95321404f0c39793564b685ac2410e9 Mon Sep 17 00:00:00 2001 From: Nikolay Yakimov Date: Sat, 16 Dec 2017 13:23:54 +0300 Subject: [PATCH 1/3] [atom] Added TextEditorElement and TextEditorComponent --- types/atom/atom-tests.ts | 45 +++++++++++++++++++ types/atom/index.d.ts | 95 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 132 insertions(+), 8 deletions(-) diff --git a/types/atom/atom-tests.ts b/types/atom/atom-tests.ts index 6ea7b9ae1f..e43b592272 100644 --- a/types/atom/atom-tests.ts +++ b/types/atom/atom-tests.ts @@ -13,6 +13,8 @@ declare let element: HTMLElement; declare let elements: HTMLElement[]; declare const div: HTMLDivElement; declare const event: KeyboardEvent; +declare const mouseEvent: MouseEvent; +declare let pixelPos: {left: number, top: number}; declare let buffer: Atom.TextBuffer; declare const color: Atom.Color; @@ -65,6 +67,8 @@ declare let subscription: Atom.Disposable; declare let subscriptions: Atom.CompositeDisposable; declare let tooltips: Atom.Tooltip[]; declare let workspaceCenter: Atom.WorkspaceCenter; +declare let textEditorElement: Atom.TextEditorElement; +declare let textEditorComponent: Atom.TextEditorComponent; // AtomEnvironment ============================================================ function testAtomEnvironment() { @@ -267,6 +271,10 @@ function testCommandRegistry() { description: "A Command Test", displayName: "Command: Test", }); + atom.commands.add("atom-text-editor", { + "test-function": (event) => event.currentTarget.getModel(), + "test-function2": (event) => event.currentTarget.getComponent(), + }); const commands = atom.commands.findCommands({ target: element }); atom.commands.dispatch(element, "test:function"); @@ -2981,6 +2989,7 @@ function testViewRegistry() { }); element = atom.views.getView(element); + textEditorElement = atom.views.getView(editor); } // Workspace ================================================================== @@ -3220,3 +3229,39 @@ const pathWatcher = Atom.watchPath("/var/test", {}, (events) => { if (event.oldPath) str = event.oldPath; } }); + +// TextEditorElement ========================================================== +function testTextEditorElement() { + textEditorComponent = textEditorElement.getComponent(); + editor = textEditorElement.getModel(); + + textEditorElement.getNextUpdatePromise().then(() => {}); + let num: number = textEditorElement.getBaseCharacterWidth(); + + textEditorElement.scrollToTop(); + textEditorElement.scrollToBottom(); + textEditorElement.setScrollTop(num); + num = textEditorElement.getScrollTop(); + textEditorElement.setScrollLeft(num); + num = textEditorElement.getScrollLeft(); + num = textEditorElement.getScrollHeight(); + + pixelPos = textEditorElement.pixelPositionForBufferPosition(pos); + pixelPos = textEditorElement.pixelPositionForScreenPosition({row: 1, column: 2}); + pixelPos = textEditorElement.pixelPositionForScreenPosition(pos); + + subscription = textEditorElement.onDidChangeScrollTop((scrollTop: number) => {}); + subscription = textEditorElement.onDidChangeScrollLeft((scrollLeft: number) => {}); + subscription = textEditorElement.onDidAttach(() => {}); + subscription = textEditorElement.onDidDetach(() => {}); + + textEditorElement = document.createElement('atom-text-editor'); +} + +// TextEditorComponent ======================================================== +function testTextEditorComponent() { + pixelPos = textEditorComponent.pixelPositionForMouseEvent(mouseEvent); + pixelPos = textEditorComponent.pixelPositionForScreenPosition(pos); + pos = textEditorComponent.screenPositionForMouseEvent(mouseEvent); + pos = textEditorComponent.screenPositionForPixelPosition(pixelPos); +} diff --git a/types/atom/index.d.ts b/types/atom/index.d.ts index 4adac61dc1..cf997bf5a6 100644 --- a/types/atom/index.d.ts +++ b/types/atom/index.d.ts @@ -16,6 +16,10 @@ import { ChildProcess } from "child_process"; declare global { const atom: AtomEnvironment; + + interface HTMLElementTagNameMap { + "atom-text-editor": TextEditorElement; + } } /** @@ -252,21 +256,37 @@ export interface Color { toRGBAString(): string; } +export interface CommandRegistryTargetMap extends HTMLElementTagNameMap { + [key: string]: EventTarget; +} + +export type CommandRegistryListener = { + didDispatch(event: CommandEvent): void, + displayName?: string, + description?: string, +} | ((event: CommandEvent) => void); + /** * Associates listener functions with commands in a context-sensitive way * using CSS selectors. */ export interface CommandRegistry { /** Register a single command. */ - add(target: string|Node, commandName: string, listener: { - didDispatch(event: CommandEvent): void, - displayName?: string, - description?: string, - } | ((event: CommandEvent) => void)): Disposable; + add( + target: T, commandName: string, + listener: CommandRegistryListener + ): Disposable; + add( + target: T, commandName: string, + listener: CommandRegistryListener + ): Disposable; /** Register multiple commands. */ - add(target: string|Node, commands: { - [key: string]: (event: CommandEvent) => void + add(target: T, commands: { + [key: string]: (event: CommandEvent) => void + }): CompositeDisposable; + add(target: T, commands: { + [key: string]: (event: CommandEvent) => void }): CompositeDisposable; /** Find all registered commands matching a query. */ @@ -2381,6 +2401,63 @@ export class TextEditor { setPlaceholderText(placeholderText: string): void; } +/** + * Undocumented: Rendering component for TextEditor + */ +export interface TextEditorComponent { + /** Does not clip screenPosition, unlike similar method on TextEditorElement */ + pixelPositionForScreenPosition(screenPosition: PointLike): {left: number, top: number}; + screenPositionForPixelPosition(pos: {top: number, left: number}): Point; + pixelPositionForMouseEvent(event: { + clientX: number, clientY: number + }): {top: number, left: number}; + screenPositionForMouseEvent(event: {clientX: number, clientY: number}): Point; +} + +/** + * Undocumented: Custom HTML elemnent for TextEditor, atom-text-editor + */ +export interface TextEditorElement extends HTMLElement { + getModel(): TextEditor; + getComponent(): TextEditorComponent; + /** + * Extended: Get a promise that resolves the next time the element's + * DOM is updated in any way. + */ + getNextUpdatePromise(): Promise; + + /** Extended: get the width of an `x` character displayed in this element. */ + getBaseCharacterWidth(): number; + + /** Essential: Scrolls the editor to the top. */ + scrollToTop(): void; + + /** Essential: Scrolls the editor to the bottom. */ + scrollToBottom(): void; + + setScrollTop(scrollTop: number): void; + getScrollTop(): number; + + setScrollLeft(scrollLeft: number): void; + getScrollLeft(): number; + + getScrollHeight(): number; + + /** Extended: Converts a buffer position to a pixel position. */ + pixelPositionForBufferPosition(bufferPosition: PointLike): {left: number, top: number}; + + /** Extended: Converts a screen position to a pixel position. */ + pixelPositionForScreenPosition(screenPosition: PointLike): {left: number, top: number}; + + // Event subscription + onDidChangeScrollTop(callback: (scrollTop: number) => void): Disposable; + onDidChangeScrollLeft(callback: (scrollLeft: number) => void): Disposable; + /** Called when the editor is attached to the DOM. */ + onDidAttach(callback: () => void): Disposable; + /** Called when the editor is detached from the DOM. */ + onDidDetach(callback: () => void): Disposable; +} + /** Experimental: This global registry tracks registered TextEditors. */ export interface TextEditorRegistry { // Managing Text Editors @@ -2469,6 +2546,7 @@ export interface ViewRegistry { (instance: T) => HTMLElement|undefined): Disposable; /** Get the view associated with an object in the workspace. */ + getView(obj: TextEditor): TextEditorElement; getView(obj: object): HTMLElement; } @@ -5268,13 +5346,14 @@ export interface BufferStoppedChangingEvent { * intent to stop propagation so event bubbling can be properly simulated for * detached elements. */ -export interface CommandEvent extends CustomEvent { +export interface CommandEvent extends CustomEvent { keyBindingAborted: boolean; propagationStopped: boolean; abortKeyBinding(): void; stopPropagation(): CustomEvent; stopImmediatePropagation(): CustomEvent; + currentTarget: CurrentTarget; } export interface CursorPositionChangedEvent { From 3d0964bd85bc23eafd43f95af29be6f3518149fe Mon Sep 17 00:00:00 2001 From: Nikolay Yakimov Date: Sun, 17 Dec 2017 18:48:21 +0300 Subject: [PATCH 2/3] [atom] Use interface for pixel position type --- types/atom/atom-tests.ts | 2 +- types/atom/index.d.ts | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/types/atom/atom-tests.ts b/types/atom/atom-tests.ts index e43b592272..6001f621f7 100644 --- a/types/atom/atom-tests.ts +++ b/types/atom/atom-tests.ts @@ -14,7 +14,6 @@ declare let elements: HTMLElement[]; declare const div: HTMLDivElement; declare const event: KeyboardEvent; declare const mouseEvent: MouseEvent; -declare let pixelPos: {left: number, top: number}; declare let buffer: Atom.TextBuffer; declare const color: Atom.Color; @@ -67,6 +66,7 @@ declare let subscription: Atom.Disposable; declare let subscriptions: Atom.CompositeDisposable; declare let tooltips: Atom.Tooltip[]; declare let workspaceCenter: Atom.WorkspaceCenter; +declare let pixelPos: Atom.PixelPosition; declare let textEditorElement: Atom.TextEditorElement; declare let textEditorComponent: Atom.TextEditorComponent; diff --git a/types/atom/index.d.ts b/types/atom/index.d.ts index cf997bf5a6..6bf1bc6fd0 100644 --- a/types/atom/index.d.ts +++ b/types/atom/index.d.ts @@ -2401,16 +2401,21 @@ export class TextEditor { setPlaceholderText(placeholderText: string): void; } +export interface PixelPosition { + left: number; + top: number; +} + /** * Undocumented: Rendering component for TextEditor */ export interface TextEditorComponent { /** Does not clip screenPosition, unlike similar method on TextEditorElement */ - pixelPositionForScreenPosition(screenPosition: PointLike): {left: number, top: number}; - screenPositionForPixelPosition(pos: {top: number, left: number}): Point; + pixelPositionForScreenPosition(screenPosition: PointLike): PixelPosition; + screenPositionForPixelPosition(pos: PixelPosition): Point; pixelPositionForMouseEvent(event: { clientX: number, clientY: number - }): {top: number, left: number}; + }): PixelPosition; screenPositionForMouseEvent(event: {clientX: number, clientY: number}): Point; } @@ -2444,10 +2449,10 @@ export interface TextEditorElement extends HTMLElement { getScrollHeight(): number; /** Extended: Converts a buffer position to a pixel position. */ - pixelPositionForBufferPosition(bufferPosition: PointLike): {left: number, top: number}; + pixelPositionForBufferPosition(bufferPosition: PointLike): PixelPosition; /** Extended: Converts a screen position to a pixel position. */ - pixelPositionForScreenPosition(screenPosition: PointLike): {left: number, top: number}; + pixelPositionForScreenPosition(screenPosition: PointLike): PixelPosition; // Event subscription onDidChangeScrollTop(callback: (scrollTop: number) => void): Disposable; From e04d65fe120f2cfcdcfbf25acfa75bc9b9bfddbe Mon Sep 17 00:00:00 2001 From: Nikolay Yakimov Date: Sun, 17 Dec 2017 19:42:22 +0300 Subject: [PATCH 3/3] [atom] Adding myself (@lierdakil) to authors list Also removing extraneous comma, as per multiline format example at https://github.com/DefinitelyTyped/DefinitelyTyped#edit-an-existing-package --- types/atom/index.d.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/types/atom/index.d.ts b/types/atom/index.d.ts index 6bf1bc6fd0..4a2a83a32a 100644 --- a/types/atom/index.d.ts +++ b/types/atom/index.d.ts @@ -1,7 +1,8 @@ // Type definitions for Atom 1.22 // Project: https://github.com/atom/atom -// Definitions by: GlenCFL , +// Definitions by: GlenCFL // smhxx +// lierdakil // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.3