Skip to content

Commit 77db09a

Browse files
committed
chore: raise events when menus, submenus and menu items are added
1 parent e081f62 commit 77db09a

File tree

2 files changed

+75
-7
lines changed

2 files changed

+75
-7
lines changed

src/command/Menus.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,24 @@ define(function (require, exports, module) {
9999
*/
100100
const EVENT_BEFORE_SUB_MENU_CLOSE = "beforeSubMenuClose";
101101

102+
/**
103+
* Event triggered when a menu or menu is added
104+
* @event EVENT_MENU_ADDED
105+
*/
106+
const EVENT_MENU_ADDED = "menuAdded";
107+
108+
/**
109+
* Event triggered when a menu or submenu is added
110+
* @event EVENT_SUB_MENU_ADDED
111+
*/
112+
const EVENT_SUB_MENU_ADDED = "subMenuAdded";
113+
114+
/**
115+
* Event triggered when a menu item is added
116+
* @event EVENT_MENU_ITEM_ADDED
117+
*/
118+
const EVENT_MENU_ITEM_ADDED = "menuItemAdded";
119+
102120

103121

104122
// Define each section as a separate constant
@@ -761,6 +779,9 @@ define(function (require, exports, module) {
761779
menuItem._nameChanged();
762780
}
763781

782+
const menuId = self.id;
783+
exports.trigger(EVENT_MENU_ITEM_ADDED, menuId, commandID, menuItem);
784+
764785
return menuItem;
765786
};
766787

@@ -910,6 +931,8 @@ define(function (require, exports, module) {
910931
_insertInList($("li#" + StringUtils.jQueryIdEscape(this.id) + " > ul.dropdown-menu"),
911932
$menuItem, position, $relativeElement);
912933

934+
exports.trigger(EVENT_SUB_MENU_ADDED, id, menu);
935+
913936
return menu;
914937
};
915938

@@ -1302,6 +1325,7 @@ define(function (require, exports, module) {
13021325
PopUpManager.addPopUp($popUp, closeAll, false);
13031326

13041327
_addAltMenuShortcut(name, id);
1328+
exports.trigger(EVENT_MENU_ADDED, id, menu);
13051329

13061330
return menu;
13071331
}
@@ -1713,6 +1737,8 @@ define(function (require, exports, module) {
17131737
});
17141738
});
17151739

1740+
EventDispatcher.makeEventDispatcher(exports);
1741+
17161742
// Deprecated menu ids
17171743
DeprecationWarning.deprecateConstant(ContextMenuIds, "WORKING_SET_MENU", "WORKING_SET_CONTEXT_MENU");
17181744
DeprecationWarning.deprecateConstant(ContextMenuIds, "WORKING_SET_SETTINGS_MENU", "WORKING_SET_CONFIG_MENU");
@@ -1747,4 +1773,7 @@ define(function (require, exports, module) {
17471773
exports.EVENT_BEFORE_CONTEXT_MENU_CLOSE = EVENT_BEFORE_CONTEXT_MENU_CLOSE;
17481774
exports.EVENT_BEFORE_SUB_MENU_OPEN = EVENT_BEFORE_SUB_MENU_OPEN;
17491775
exports.EVENT_BEFORE_SUB_MENU_CLOSE = EVENT_BEFORE_SUB_MENU_CLOSE;
1776+
exports.EVENT_MENU_ADDED = EVENT_MENU_ADDED;
1777+
exports.EVENT_SUB_MENU_ADDED = EVENT_SUB_MENU_ADDED;
1778+
exports.EVENT_MENU_ITEM_ADDED = EVENT_MENU_ITEM_ADDED;
17501779
});

test/spec/Menu-integ-test.js

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,30 @@ define(function (require, exports, module) {
6060
return testWindow.$("#titlebar > ul.nav").children();
6161
}
6262

63-
it("should add new menu in last position of list", async function () {
63+
it("should add new menu in last position of list and get menu events", async function () {
64+
const testMenuID = "menu-unittest1";
65+
let idAdded, menuAdded;
66+
Menus.on(Menus.EVENT_MENU_ADDED+".test1", (_evt, _id, _menu)=>{
67+
if(_id !== testMenuID) {
68+
return;
69+
}
70+
idAdded = _id;
71+
menuAdded = _menu;
72+
});
6473
var $listItems = getTopMenus();
6574
expect($listItems.length).toBeGreaterThan(0);
6675

6776
var menuCountOriginal = $listItems.length;
68-
var menu = Menus.addMenu("Custom1", "menu-unittest1");
77+
var menu = Menus.addMenu("Custom1", testMenuID);
6978
expect(menu).toBeTruthy();
7079
expect(menu).toBeDefined();
7180

7281
$listItems = getTopMenus(); // refresh
7382
expect($listItems.length).toBe(menuCountOriginal + 1);
74-
expect($($listItems[menuCountOriginal]).attr("id")).toBe("menu-unittest1");
83+
expect($($listItems[menuCountOriginal]).attr("id")).toBe(testMenuID);
84+
expect(idAdded).toBe(testMenuID);
85+
expect(menuAdded.id).toBe(testMenuID);
86+
Menus.off(Menus.EVENT_MENU_ADDED+".test1");
7587
});
7688

7789
it("should add new menu in first position of list", async function () {
@@ -157,22 +169,38 @@ define(function (require, exports, module) {
157169
describe("Add Menu Items", function () {
158170

159171
it("should add new menu items", async function () {
160-
var menu = Menus.addMenu("MenuItem Menu 0", "menuitem-unittest0");
172+
const utMenuID = "menuitem-unittest0";
173+
var menu = Menus.addMenu("MenuItem Menu 0", utMenuID);
161174
var listSelector = "#menuitem-unittest0 > ul";
162175
var $listItems = testWindow.$(listSelector).children();
163176
expect($listItems.length).toBe(0);
164177

178+
const testCmd = "Menu-test.command00";
179+
let addedOnMenu, commandItemAdded, menuItemAdded;
180+
Menus.on(Menus.EVENT_MENU_ITEM_ADDED+".addTest", (_evt, _menuID, _cmdID, _menuItem)=>{
181+
if(_cmdID !== testCmd) {
182+
return;
183+
}
184+
addedOnMenu = _menuID;
185+
commandItemAdded = _cmdID;
186+
menuItemAdded = _menuItem;
187+
});
165188

166189
// add new menu item to empty menu
167-
CommandManager.register("Brackets Test Command Custom 0", "Menu-test.command00", function () {});
168-
var menuItem = menu.addMenuItem("Menu-test.command00");
190+
CommandManager.register("Brackets Test Command Custom 0", testCmd, function () {});
191+
var menuItem = menu.addMenuItem(testCmd);
169192
expect(menuItem).toBeTruthy();
170193
expect(menuItem).toBeDefined();
171194

172195
$listItems = testWindow.$(listSelector).children();
173196
expect($listItems.length).toBe(1);
174197
expect($($listItems[0]).length).toBe(1);
175198

199+
expect(addedOnMenu).toBe(utMenuID);
200+
expect(commandItemAdded).toBe(testCmd);
201+
expect(menuItemAdded.getCommand().getID()).toBe(testCmd);
202+
Menus.off(Menus.EVENT_MENU_ITEM_ADDED+".addTest");
203+
176204
// Periods (aka "dots") are allowed in HTML identifiers, but jQuery interprets
177205
// them as the start of a class selector, so they need to be escaped
178206
expect($($listItems[0]).find("a#menuitem-unittest0-Menu-test\\.command00").length).toBe(1);
@@ -659,13 +687,24 @@ define(function (require, exports, module) {
659687
describe("Add a context submenu", function() {
660688
it("should add new context submenu", async function() {
661689
menuId = "context-menu-custom-addSubmenu-1";
690+
subMenuId = "submenu-custom-addSubmenu-1";
691+
let idAdded, menuAdded;
692+
Menus.on(Menus.EVENT_SUB_MENU_ADDED+".subTest", (_evt, _id, _menu)=>{
693+
if(_id !== subMenuId) {
694+
return;
695+
}
696+
idAdded = _id;
697+
menuAdded = _menu;
698+
});
662699
menu = Menus.registerContextMenu(menuId);
663700

664-
subMenuId = "submenu-custom-addSubmenu-1";
665701
subMenu = menu.addSubMenu("submenu", subMenuId);
666702

667703
expect(subMenu).toBeTruthy();
668704
expect(subMenu.parentMenuItem).toBeTruthy();
705+
expect(idAdded).toBe(subMenuId);
706+
expect(menuAdded.id).toBe(subMenuId);
707+
Menus.off(Menus.EVENT_MENU_ADDED+".subTest");
669708

670709
// check if new submenu is empty
671710
var children = testWindow.$("#submenu-custom-addSubmenu-1 > ul").children();

0 commit comments

Comments
 (0)