Skip to content

Commit 7ceb3af

Browse files
committed
isolate DropdownMenuActionViewItem
1 parent 89f2de6 commit 7ceb3af

6 files changed

Lines changed: 123 additions & 109 deletions

File tree

src/vs/base/browser/ui/dropdown/dropdown.ts

Lines changed: 3 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@
55

66
import 'vs/css!./dropdown';
77
import { Gesture, EventType as GestureEventType } from 'vs/base/browser/touch';
8-
import { ActionRunner, IAction, IActionRunner, IActionViewItemProvider } from 'vs/base/common/actions';
8+
import { ActionRunner, IAction } from 'vs/base/common/actions';
99
import { IDisposable } from 'vs/base/common/lifecycle';
1010
import { IContextViewProvider, IAnchor, AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview';
1111
import { IMenuOptions } from 'vs/base/browser/ui/menu/menu';
12-
import { ResolvedKeybinding, KeyCode } from 'vs/base/common/keyCodes';
13-
import { EventHelper, EventType, removeClass, addClass, append, $, addDisposableListener, addClasses, DOMEvent } from 'vs/base/browser/dom';
12+
import { KeyCode } from 'vs/base/common/keyCodes';
13+
import { EventHelper, EventType, removeClass, addClass, append, $, addDisposableListener, DOMEvent } from 'vs/base/browser/dom';
1414
import { IContextMenuDelegate } from 'vs/base/browser/contextmenu';
1515
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
1616
import { Emitter } from 'vs/base/common/event';
17-
import { BaseActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems';
1817

1918
export interface ILabelRenderer {
2019
(container: HTMLElement): IDisposable | null;
@@ -283,104 +282,3 @@ export class DropdownMenu extends BaseDropdown {
283282
removeClass(this.element, 'active');
284283
}
285284
}
286-
287-
export class DropdownMenuActionViewItem extends BaseActionViewItem {
288-
private menuActionsOrProvider: ReadonlyArray<IAction> | IActionProvider;
289-
private dropdownMenu: DropdownMenu | undefined;
290-
private contextMenuProvider: IContextMenuProvider;
291-
private actionViewItemProvider?: IActionViewItemProvider;
292-
private keybindings?: (action: IAction) => ResolvedKeybinding | undefined;
293-
private clazz: string | undefined;
294-
private anchorAlignmentProvider: (() => AnchorAlignment) | undefined;
295-
private menuAsChild?: boolean;
296-
297-
private _onDidChangeVisibility = this._register(new Emitter<boolean>());
298-
readonly onDidChangeVisibility = this._onDidChangeVisibility.event;
299-
300-
constructor(action: IAction, menuActions: ReadonlyArray<IAction>, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean);
301-
constructor(action: IAction, actionProvider: IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean);
302-
constructor(action: IAction, menuActionsOrProvider: ReadonlyArray<IAction> | IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean) {
303-
super(null, action);
304-
305-
this.menuActionsOrProvider = menuActionsOrProvider;
306-
this.contextMenuProvider = contextMenuProvider;
307-
this.actionViewItemProvider = actionViewItemProvider;
308-
this.actionRunner = actionRunner;
309-
this.keybindings = keybindings;
310-
this.clazz = clazz;
311-
this.anchorAlignmentProvider = anchorAlignmentProvider;
312-
this.menuAsChild = menuAsChild;
313-
}
314-
315-
render(container: HTMLElement): void {
316-
const labelRenderer: ILabelRenderer = (el: HTMLElement): IDisposable | null => {
317-
this.element = append(el, $('a.action-label.codicon')); // todo@aeschli: remove codicon, should come through `this.clazz`
318-
if (this.clazz) {
319-
addClasses(this.element, this.clazz);
320-
}
321-
322-
this.element.tabIndex = 0;
323-
this.element.setAttribute('role', 'button');
324-
this.element.setAttribute('aria-haspopup', 'true');
325-
this.element.setAttribute('aria-expanded', 'false');
326-
this.element.title = this._action.label || '';
327-
328-
return null;
329-
};
330-
331-
const options: IDropdownMenuOptions = {
332-
contextMenuProvider: this.contextMenuProvider,
333-
labelRenderer: labelRenderer,
334-
menuAsChild: this.menuAsChild
335-
};
336-
337-
// Render the DropdownMenu around a simple action to toggle it
338-
if (Array.isArray(this.menuActionsOrProvider)) {
339-
options.actions = this.menuActionsOrProvider;
340-
} else {
341-
options.actionProvider = this.menuActionsOrProvider as IActionProvider;
342-
}
343-
344-
this.dropdownMenu = this._register(new DropdownMenu(container, options));
345-
this._register(this.dropdownMenu.onDidChangeVisibility(visible => {
346-
this.element?.setAttribute('aria-expanded', `${visible}`);
347-
this._onDidChangeVisibility.fire(visible);
348-
}));
349-
350-
this.dropdownMenu.menuOptions = {
351-
actionViewItemProvider: this.actionViewItemProvider,
352-
actionRunner: this.actionRunner,
353-
getKeyBinding: this.keybindings,
354-
context: this._context
355-
};
356-
357-
if (this.anchorAlignmentProvider) {
358-
const that = this;
359-
360-
this.dropdownMenu.menuOptions = {
361-
...this.dropdownMenu.menuOptions,
362-
get anchorAlignment(): AnchorAlignment {
363-
return that.anchorAlignmentProvider!();
364-
}
365-
};
366-
}
367-
}
368-
369-
setActionContext(newContext: unknown): void {
370-
super.setActionContext(newContext);
371-
372-
if (this.dropdownMenu) {
373-
if (this.dropdownMenu.menuOptions) {
374-
this.dropdownMenu.menuOptions.context = newContext;
375-
} else {
376-
this.dropdownMenu.menuOptions = { context: newContext };
377-
}
378-
}
379-
}
380-
381-
show(): void {
382-
if (this.dropdownMenu) {
383-
this.dropdownMenu.show();
384-
}
385-
}
386-
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import 'vs/css!./dropdown';
7+
import { IAction, IActionRunner, IActionViewItemProvider } from 'vs/base/common/actions';
8+
import { IDisposable } from 'vs/base/common/lifecycle';
9+
import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview';
10+
import { ResolvedKeybinding } from 'vs/base/common/keyCodes';
11+
import { append, $, addClasses } from 'vs/base/browser/dom';
12+
import { Emitter } from 'vs/base/common/event';
13+
import { BaseActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems';
14+
import { IActionProvider, DropdownMenu, IContextMenuProvider, IDropdownMenuOptions, ILabelRenderer } from 'vs/base/browser/ui/dropdown/dropdown';
15+
16+
export class DropdownMenuActionViewItem extends BaseActionViewItem {
17+
private menuActionsOrProvider: ReadonlyArray<IAction> | IActionProvider;
18+
private dropdownMenu: DropdownMenu | undefined;
19+
private contextMenuProvider: IContextMenuProvider;
20+
private actionViewItemProvider?: IActionViewItemProvider;
21+
private keybindings?: (action: IAction) => ResolvedKeybinding | undefined;
22+
private clazz: string | undefined;
23+
private anchorAlignmentProvider: (() => AnchorAlignment) | undefined;
24+
private menuAsChild?: boolean;
25+
26+
private _onDidChangeVisibility = this._register(new Emitter<boolean>());
27+
readonly onDidChangeVisibility = this._onDidChangeVisibility.event;
28+
29+
constructor(action: IAction, menuActions: ReadonlyArray<IAction>, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean);
30+
constructor(action: IAction, actionProvider: IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean);
31+
constructor(action: IAction, menuActionsOrProvider: ReadonlyArray<IAction> | IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean) {
32+
super(null, action);
33+
34+
this.menuActionsOrProvider = menuActionsOrProvider;
35+
this.contextMenuProvider = contextMenuProvider;
36+
this.actionViewItemProvider = actionViewItemProvider;
37+
this.actionRunner = actionRunner;
38+
this.keybindings = keybindings;
39+
this.clazz = clazz;
40+
this.anchorAlignmentProvider = anchorAlignmentProvider;
41+
this.menuAsChild = menuAsChild;
42+
}
43+
44+
render(container: HTMLElement): void {
45+
const labelRenderer: ILabelRenderer = (el: HTMLElement): IDisposable | null => {
46+
this.element = append(el, $('a.action-label.codicon')); // todo@aeschli: remove codicon, should come through `this.clazz`
47+
if (this.clazz) {
48+
addClasses(this.element, this.clazz);
49+
}
50+
51+
this.element.tabIndex = 0;
52+
this.element.setAttribute('role', 'button');
53+
this.element.setAttribute('aria-haspopup', 'true');
54+
this.element.setAttribute('aria-expanded', 'false');
55+
this.element.title = this._action.label || '';
56+
57+
return null;
58+
};
59+
60+
const options: IDropdownMenuOptions = {
61+
contextMenuProvider: this.contextMenuProvider,
62+
labelRenderer: labelRenderer,
63+
menuAsChild: this.menuAsChild
64+
};
65+
66+
// Render the DropdownMenu around a simple action to toggle it
67+
if (Array.isArray(this.menuActionsOrProvider)) {
68+
options.actions = this.menuActionsOrProvider;
69+
} else {
70+
options.actionProvider = this.menuActionsOrProvider as IActionProvider;
71+
}
72+
73+
this.dropdownMenu = this._register(new DropdownMenu(container, options));
74+
this._register(this.dropdownMenu.onDidChangeVisibility(visible => {
75+
this.element?.setAttribute('aria-expanded', `${visible}`);
76+
this._onDidChangeVisibility.fire(visible);
77+
}));
78+
79+
this.dropdownMenu.menuOptions = {
80+
actionViewItemProvider: this.actionViewItemProvider,
81+
actionRunner: this.actionRunner,
82+
getKeyBinding: this.keybindings,
83+
context: this._context
84+
};
85+
86+
if (this.anchorAlignmentProvider) {
87+
const that = this;
88+
89+
this.dropdownMenu.menuOptions = {
90+
...this.dropdownMenu.menuOptions,
91+
get anchorAlignment(): AnchorAlignment {
92+
return that.anchorAlignmentProvider!();
93+
}
94+
};
95+
}
96+
}
97+
98+
setActionContext(newContext: unknown): void {
99+
super.setActionContext(newContext);
100+
101+
if (this.dropdownMenu) {
102+
if (this.dropdownMenu.menuOptions) {
103+
this.dropdownMenu.menuOptions.context = newContext;
104+
} else {
105+
this.dropdownMenu.menuOptions = { context: newContext };
106+
}
107+
}
108+
}
109+
110+
show(): void {
111+
if (this.dropdownMenu) {
112+
this.dropdownMenu.show();
113+
}
114+
}
115+
}

src/vs/base/browser/ui/toolbar/toolbar.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import 'vs/css!./toolbar';
77
import * as nls from 'vs/nls';
88
import { Action, IActionRunner, IAction, IActionViewItemProvider } from 'vs/base/common/actions';
99
import { ActionBar, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar';
10-
import { IContextMenuProvider, DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown';
10+
import { IContextMenuProvider } from 'vs/base/browser/ui/dropdown/dropdown';
1111
import { ResolvedKeybinding } from 'vs/base/common/keyCodes';
1212
import { Disposable, IDisposable, combinedDisposable } from 'vs/base/common/lifecycle';
1313
import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview';
1414
import { withNullAsUndefined } from 'vs/base/common/types';
1515
import { Codicon, registerIcon } from 'vs/base/common/codicons';
1616
import { Emitter } from 'vs/base/common/event';
17+
import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem';
1718

1819
export const CONTEXT = 'context.toolbar';
1920

src/vs/workbench/browser/parts/notifications/notificationsViewer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ import { IAction, IActionRunner } from 'vs/base/common/actions';
1616
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1717
import { dispose, DisposableStore, Disposable } from 'vs/base/common/lifecycle';
1818
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
19-
import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown';
2019
import { INotificationViewItem, NotificationViewItem, NotificationViewItemContentChangeKind, INotificationMessage, ChoiceAction } from 'vs/workbench/common/notifications';
2120
import { ClearNotificationAction, ExpandNotificationAction, CollapseNotificationAction, ConfigureNotificationAction } from 'vs/workbench/browser/parts/notifications/notificationsActions';
2221
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
2322
import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar';
2423
import { Severity } from 'vs/platform/notification/common/notification';
2524
import { isNonEmptyArray } from 'vs/base/common/arrays';
2625
import { Codicon } from 'vs/base/common/codicons';
26+
import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem';
2727

2828
export class NotificationsListDelegate implements IListVirtualDelegate<INotificationViewItem> {
2929

src/vs/workbench/contrib/comments/browser/commentNode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import { Emitter, Event } from 'vs/base/common/event';
2323
import { INotificationService } from 'vs/platform/notification/common/notification';
2424
import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar';
2525
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
26-
import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown';
2726
import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview';
2827
import { ToggleReactionsAction, ReactionAction, ReactionActionViewItem } from './reactionsAction';
2928
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
@@ -35,6 +34,7 @@ import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/c
3534
import { CommentFormActions } from 'vs/workbench/contrib/comments/browser/commentFormActions';
3635
import { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from 'vs/base/browser/ui/mouseCursor/mouseCursor';
3736
import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems';
37+
import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem';
3838

3939
export class CommentNode extends Disposable {
4040
private _domNode: HTMLElement;

src/vs/workbench/contrib/markers/browser/markersViewActions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ import { ContextScopedHistoryInputBox } from 'vs/platform/browser/contextScopedH
2323
import { Marker } from 'vs/workbench/contrib/markers/browser/markersModel';
2424
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
2525
import { Event, Emitter } from 'vs/base/common/event';
26-
import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown';
2726
import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview';
2827
import { IViewsService } from 'vs/workbench/common/views';
2928
import { Codicon } from 'vs/base/common/codicons';
3029
import { BaseActionViewItem, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems';
30+
import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem';
3131

3232
export class ShowProblemsPanelAction extends Action {
3333

0 commit comments

Comments
 (0)