Bug 884340: Allow addons to add menu items to tools. r=mfinkle, f=sriram

This commit is contained in:
Sriram Ramasubramanian 2013-07-08 22:47:10 -07:00
Родитель fcf87a3142
Коммит 207035c31f
5 изменённых файлов: 38 добавлений и 7 удалений

Просмотреть файл

@ -99,6 +99,7 @@ abstract public class BrowserApp extends GeckoApp
private AboutHome mAboutHome;
protected Telemetry.Timer mAboutHomeStartupTimer = null;
private static final int GECKO_TOOLS_MENU = -1;
private static final int ADDON_MENU_OFFSET = 1000;
private class MenuItemInfo {
public int id;
@ -990,7 +991,8 @@ abstract public class BrowserApp extends GeckoApp
info.enabled = message.optBoolean("enabled", true);
info.visible = message.optBoolean("visible", true);
info.checkable = message.optBoolean("checkable", false);
info.parent = message.optInt("parent", -ADDON_MENU_OFFSET) + ADDON_MENU_OFFSET;
int parent = message.optInt("parent", 0);
info.parent = parent <= 0 ? parent : parent + ADDON_MENU_OFFSET;
final MenuItemInfo menuItemInfo = info;
ThreadUtils.postToUiThread(new Runnable() {
@Override
@ -1384,6 +1386,26 @@ abstract public class BrowserApp extends GeckoApp
}
}
private Menu findParentMenu(Menu menu, MenuItem item) {
final int itemId = item.getItemId();
final int count = (menu != null) ? menu.size() : 0;
for (int i = 0; i < count; i++) {
MenuItem menuItem = menu.getItem(i);
if (menuItem.getItemId() == itemId) {
return menu;
}
if (menuItem.hasSubMenu()) {
Menu parent = findParentMenu(menuItem.getSubMenu(), item);
if (parent != null) {
return parent;
}
}
}
return null;
}
private void addAddonMenuItem(final MenuItemInfo info) {
if (mMenu == null) {
if (mAddonMenuItemsCache == null)
@ -1396,14 +1418,19 @@ abstract public class BrowserApp extends GeckoApp
Menu menu;
if (info.parent == 0) {
menu = mMenu;
} else if (info.parent == GECKO_TOOLS_MENU) {
MenuItem tools = mMenu.findItem(R.id.tools);
menu = tools != null ? tools.getSubMenu() : mMenu;
} else {
MenuItem parent = mMenu.findItem(info.parent);
if (parent == null)
return;
Menu parentMenu = findParentMenu(mMenu, parent);
if (!parent.hasSubMenu()) {
mMenu.removeItem(parent.getItemId());
menu = mMenu.addSubMenu(Menu.NONE, parent.getItemId(), Menu.NONE, parent.getTitle());
parentMenu.removeItem(parent.getItemId());
menu = parentMenu.addSubMenu(Menu.NONE, parent.getItemId(), Menu.NONE, parent.getTitle());
if (parent.getIcon() != null)
((SubMenu) menu).getItem().setIcon(parent.getIcon());
} else {

Просмотреть файл

@ -40,7 +40,8 @@
android:title="@string/desktop_mode"
android:checkable="true" />
<item android:title="@string/tools"
<item android:id="@+id/tools"
android:title="@string/tools"
android:icon="@drawable/ic_menu_tools">
<menu>

Просмотреть файл

@ -41,7 +41,8 @@
android:title="@string/desktop_mode"
android:checkable="true" />
<item android:title="@string/tools"
<item android:id="@+id/tools"
android:title="@string/tools"
android:icon="@drawable/ic_menu_tools">
<menu>

Просмотреть файл

@ -41,7 +41,8 @@
android:title="@string/desktop_mode"
android:checkable="true" />
<item android:title="@string/tools"
<item android:id="@+id/tools"
android:title="@string/tools"
android:icon="@drawable/ic_menu_tools">
<menu>

Просмотреть файл

@ -1576,7 +1576,8 @@ var NativeWindow = {
menu: {
_callbacks: [],
_menuId: 0,
_menuId: 1,
toolsMenuID: -1,
add: function() {
let options;
if (arguments.length == 1) {