Index: chrome/browser/ui/toolbar/action_box_menu_model.cc |
diff --git a/chrome/browser/ui/toolbar/action_box_menu_model.cc b/chrome/browser/ui/toolbar/action_box_menu_model.cc |
index 8148598dc8974f8d53d889a42e3654e9892e40e3..afca65abb1789e512058ef195c948ebe980afde0 100644 |
--- a/chrome/browser/ui/toolbar/action_box_menu_model.cc |
+++ b/chrome/browser/ui/toolbar/action_box_menu_model.cc |
@@ -5,30 +5,72 @@ |
#include "chrome/browser/ui/toolbar/action_box_menu_model.h" |
#include "base/utf_string_conversions.h" |
+#include "chrome/app/chrome_command_ids.h" |
#include "chrome/browser/extensions/extension_toolbar_model.h" |
+#include "grit/generated_resources.h" |
+#include "grit/theme_resources.h" |
+#include "ui/base/resource/resource_bundle.h" |
-// Arbitrary number just to leave enough space for menu IDs |
-// that show before extensions. Like "Bookmark this page", "Send tab to device" |
-// and so on. They could have any IDs < kFirstExtensionCommandId. |
-static const int kFirstExtensionCommandId = 1000; |
+namespace { |
+ |
+// Extensions get command IDs that are beyond the maximal valid extension ID |
+// (0xDFFF) so that they are not confused with actual commands that appear in |
+// the menu. For more details see: chrome/app/chrome_command_ids.h |
+// |
+const int kFirstExtensionCommandId = 0xE000; |
+ |
+} // namespace |
//////////////////////////////////////////////////////////////////////////////// |
// ActionBoxMenuModel |
-ActionBoxMenuModel::ActionBoxMenuModel(ExtensionService* extension_service) |
- : ALLOW_THIS_IN_INITIALIZER_LIST(ui::SimpleMenuModel(NULL)), |
+ActionBoxMenuModel::ActionBoxMenuModel(Browser* browser, |
+ ExtensionService* extension_service) |
+ : ALLOW_THIS_IN_INITIALIZER_LIST(ui::SimpleMenuModel(this)), |
+ browser_(browser), |
extension_service_(extension_service) { |
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
+ InsertItemWithStringIdAt(0, IDC_CHROME_TO_MOBILE_PAGE, |
+ IDS_CHROME_TO_MOBILE_BUBBLE_TOOLTIP); |
+ SetIcon(0, *rb.GetImageSkiaNamed(IDR_MOBILE)); |
+ InsertItemWithStringIdAt(1, IDC_BOOKMARK_PAGE, IDS_BOOKMARK_STAR); |
+ SetIcon(1, *rb.GetImageSkiaNamed(IDR_STAR)); |
+ |
// Adds extensions to the model. |
int command_id = kFirstExtensionCommandId; |
const extensions::ExtensionList& action_box_items = action_box_menu_items(); |
- for (size_t i = 0; i < action_box_items.size(); ++i) { |
- const extensions::Extension* extension = action_box_items[i]; |
- AddItem(command_id, UTF8ToUTF16(extension->name())); |
- id_to_extension_id_map_[command_id++] = extension->id(); |
+ if (!action_box_items.empty()) { |
+ AddSeparator(); |
+ for (size_t i = 0; i < action_box_items.size(); ++i) { |
+ const extensions::Extension* extension = action_box_items[i]; |
+ AddItem(command_id, UTF8ToUTF16(extension->name())); |
+ id_to_extension_id_map_[command_id++] = extension->id(); |
+ } |
} |
} |
ActionBoxMenuModel::~ActionBoxMenuModel() { |
+ // Ensures parent destructor does not use a partially destroyed delegate. |
+ set_delegate(NULL); |
+} |
+ |
+bool ActionBoxMenuModel::IsCommandIdChecked(int command_id) const { |
+ return false; |
+} |
+ |
+bool ActionBoxMenuModel::IsCommandIdEnabled(int command_id) const { |
+ return true; |
+} |
+ |
+bool ActionBoxMenuModel::GetAcceleratorForCommandId( |
+ int command_id, |
+ ui::Accelerator* accelerator) { |
+ return false; |
+} |
+ |
+void ActionBoxMenuModel::ExecuteCommand(int command_id) { |
+ if (command_id < kFirstExtensionCommandId) |
+ chrome::ExecuteCommand(browser_, command_id); |
} |
void ActionBoxMenuModel::Observe(int type, |