From aa25d1ab8f75a7372bc36f106955ea74184c329b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 25 Nov 2016 18:40:43 +0100 Subject: [PATCH] list.onContextMenu --- src/vs/base/browser/ui/list/listWidget.ts | 10 +++++++++- src/vs/base/common/event.ts | 11 +++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 36581beb633..9a28faa7deb 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -6,11 +6,12 @@ import 'vs/css!./list'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { isNumber } from 'vs/base/common/types'; +import { memoize } from 'vs/base/common/decorators'; import * as DOM from 'vs/base/browser/dom'; import { EventType as TouchEventType } from 'vs/base/browser/touch'; import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import Event, { Emitter, EventBufferer, chain, mapEvent } from 'vs/base/common/event'; +import Event, { Emitter, EventBufferer, chain, mapEvent, fromCallback } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IDelegate, IRenderer, IListMouseEvent, IFocusChangeEvent, ISelectionChangeEvent } from './list'; import { ListView, IListViewOptions } from './listView'; @@ -217,14 +218,21 @@ export class List implements IDisposable { private controller: Controller; private disposables: IDisposable[]; + @memoize get onFocusChange(): Event> { return this.eventBufferer.wrapEvent(mapEvent(this.focus.onChange, e => this.toListEvent(e))); } + @memoize get onSelectionChange(): Event> { return this.eventBufferer.wrapEvent(mapEvent(this.selection.onChange, e => this.toListEvent(e))); } + @memoize + get onContextMenu(): Event> { + return fromCallback(handler => this.view.addListener('contextmenu', handler)); + } + private _onDOMFocus: Event; get onDOMFocus(): Event { return this._onDOMFocus; } diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 6742a44cfa1..f679d983b62 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -223,6 +223,17 @@ export function fromEventEmitter(emitter: EventEmitter, eventType: string): E }; } +export function fromCallback(fn: (handler: (e: T) => void) => IDisposable): Event { + let listener: IDisposable; + + const emitter = new Emitter({ + onFirstListenerAdd: () => listener = fn(e => emitter.fire(e)), + onLastListenerRemove: () => listener.dispose() + }); + + return emitter.event; +} + export function fromPromise(promise: TPromise): Event { const emitter = new Emitter(); let shouldEmit = false; -- GitLab