diff --git a/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts b/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts index d43874e450706c209ee9f60dadf47782d94b4c38..012f011b6a0de242600421850767cd8b56af63ff 100644 --- a/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts +++ b/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts @@ -8,7 +8,6 @@ import * as nls from 'vs/nls'; import {IAction} from 'vs/base/common/actions'; import {KeyCode, KeyMod, Keybinding} from 'vs/base/common/keyCodes'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; -import {SortedList} from 'vs/base/common/sortedList'; import {TPromise} from 'vs/base/common/winjs.base'; import * as dom from 'vs/base/browser/dom'; import {IKeyboardEvent} from 'vs/base/browser/keyboardEvent'; @@ -124,47 +123,53 @@ class ContextMenuController implements IEditorContribution { } private _getMenuActions(): IAction[] { - var editorModel = this._editor.getModel(); + const editorModel = this._editor.getModel(); if (!editorModel) { return []; } - var allActions = this._editor.getActions(); - var contributedActions = allActions.filter((action)=>(typeof action.shouldShowInContextMenu === 'function') && action.shouldShowInContextMenu() && action.isSupported()); + const contributedActions = this._editor.getActions().filter(action => { + if (action instanceof EditorAction) { + return action.shouldShowInContextMenu() && action.isSupported(); + } + }); - return this._prepareActions(contributedActions); + return ContextMenuController._prepareActions(contributedActions); } - private _prepareActions(actions:EditorAction[]):IAction[] { - var list = new SortedList>(); + private static _prepareActions(actions: EditorAction[]): IAction[] { - actions.forEach((action)=>{ - var groups = action.getGroupId().split('/'); - var actionsForGroup = list.getValue(groups[0]); - if (!actionsForGroup) { - actionsForGroup = new SortedList(); - list.add(groups[0], actionsForGroup); - } + const data = actions.map(action => { + const groupId = action.getGroupId(); + const idx = groupId.indexOf('/'); + const group = idx > 0 + ? groupId.substr(0, idx) + : groupId; - actionsForGroup.add(groups[1] || groups[0], action); + return { action, group }; }); - var sortedAndGroupedActions:IAction[] = []; - var groupIterator = list.getIterator(); - while(groupIterator.moveNext()) { - var group = groupIterator.current.value; - var actionsIterator = group.getIterator(); - while(actionsIterator.moveNext()) { - var action = actionsIterator.current.value; - sortedAndGroupedActions.push(action); + data.sort((a, b) => { + if (a.group < b.group) { + return -1; + } else if (a.group > b.group) { + return 1; + } else { + return 0; } + }); - if (groupIterator.hasNext()) { - sortedAndGroupedActions.push(new Separator()); + const result: IAction[] = []; + let lastGroup: string; + data.forEach((value, idx) => { + if (lastGroup && lastGroup !== value.group) { + result.push(new Separator()); } - } + result.push(value.action); + lastGroup = value.group; + }); - return sortedAndGroupedActions; + return result; } private _doShowContextMenu(actions:IAction[], forcedPosition:IPosition = null): void {