blob: 4b9cefef221429fd6e05d7ceeb6071dd40facb8f [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_TOOLBAR_WRENCH_MENU_MODEL_H_
#define CHROME_BROWSER_UI_TOOLBAR_WRENCH_MENU_MODEL_H_
#include "base/files/file_path.h"
#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "base/timer/elapsed_timer.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "content/public/browser/host_zoom_map.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/models/button_menu_item_model.h"
#include "ui/base/models/simple_menu_model.h"
class BookmarkSubMenuModel;
class Browser;
class RecentTabsSubMenuModel;
class TabStripModel;
namespace {
class MockWrenchMenuModel;
} // namespace
enum WrenchMenuAction {
MENU_ACTION_NEW_TAB = 0,
MENU_ACTION_NEW_WINDOW,
MENU_ACTION_NEW_INCOGNITO_WINDOW,
MENU_ACTION_SHOW_BOOKMARK_BAR,
MENU_ACTION_SHOW_BOOKMARK_MANAGER,
MENU_ACTION_IMPORT_SETTINGS,
MENU_ACTION_BOOKMARK_PAGE,
MENU_ACTION_BOOKMARK_ALL_TABS,
MENU_ACTION_PIN_TO_START_SCREEN,
MENU_ACTION_RESTORE_TAB,
MENU_ACTION_WIN_DESKTOP_RESTART,
MENU_ACTION_WIN8_METRO_RESTART,
MENU_ACTION_WIN_CHROMEOS_RESTART,
MENU_ACTION_DISTILL_PAGE,
MENU_ACTION_SAVE_PAGE,
MENU_ACTION_FIND,
MENU_ACTION_PRINT,
MENU_ACTION_CUT,
MENU_ACTION_COPY,
MENU_ACTION_PASTE,
MENU_ACTION_CREATE_HOSTED_APP,
MENU_ACTION_CREATE_SHORTCUTS,
MENU_ACTION_MANAGE_EXTENSIONS,
MENU_ACTION_TASK_MANAGER,
MENU_ACTION_CLEAR_BROWSING_DATA,
MENU_ACTION_VIEW_SOURCE,
MENU_ACTION_DEV_TOOLS,
MENU_ACTION_DEV_TOOLS_CONSOLE,
MENU_ACTION_DEV_TOOLS_DEVICES,
MENU_ACTION_PROFILING_ENABLED,
MENU_ACTION_ZOOM_MINUS,
MENU_ACTION_ZOOM_PLUS,
MENU_ACTION_FULLSCREEN,
MENU_ACTION_SHOW_HISTORY,
MENU_ACTION_SHOW_DOWNLOADS,
MENU_ACTION_SHOW_SYNC_SETUP,
MENU_ACTION_OPTIONS,
MENU_ACTION_ABOUT,
MENU_ACTION_HELP_PAGE_VIA_MENU,
MENU_ACTION_FEEDBACK,
MENU_ACTION_TOGGLE_REQUEST_TABLET_SITE,
MENU_ACTION_EXIT,
MENU_ACTION_RECENT_TAB,
MENU_ACTION_BOOKMARK_OPEN,
LIMIT_MENU_ACTION
};
// A menu model that builds the contents of an encoding menu.
class EncodingMenuModel : public ui::SimpleMenuModel,
public ui::SimpleMenuModel::Delegate {
public:
explicit EncodingMenuModel(Browser* browser);
~EncodingMenuModel() override;
// Overridden from ui::SimpleMenuModel::Delegate:
bool IsCommandIdChecked(int command_id) const override;
bool IsCommandIdEnabled(int command_id) const override;
bool GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) override;
void ExecuteCommand(int command_id, int event_flags) override;
private:
void Build();
Browser* browser_; // weak
DISALLOW_COPY_AND_ASSIGN(EncodingMenuModel);
};
// A menu model that builds the contents of the zoom menu.
class ZoomMenuModel : public ui::SimpleMenuModel {
public:
explicit ZoomMenuModel(ui::SimpleMenuModel::Delegate* delegate);
~ZoomMenuModel() override;
private:
void Build();
DISALLOW_COPY_AND_ASSIGN(ZoomMenuModel);
};
class ToolsMenuModel : public ui::SimpleMenuModel {
public:
ToolsMenuModel(ui::SimpleMenuModel::Delegate* delegate, Browser* browser);
~ToolsMenuModel() override;
private:
void Build(Browser* browser);
scoped_ptr<EncodingMenuModel> encoding_menu_model_;
DISALLOW_COPY_AND_ASSIGN(ToolsMenuModel);
};
// A menu model that builds the contents of the wrench menu.
class WrenchMenuModel : public ui::SimpleMenuModel,
public ui::SimpleMenuModel::Delegate,
public ui::ButtonMenuItemModel::Delegate,
public TabStripModelObserver,
public content::NotificationObserver {
public:
// Range of command ID's to use for the items representing bookmarks in the
// bookmark menu, must not overlap with that for recent tabs submenu.
static const int kMinBookmarkCommandId = 1;
static const int kMaxBookmarkCommandId = 1000;
// Range of command ID's to use for the items in the recent tabs submenu, must
// not overlap with that for bookmarks.
static const int kMinRecentTabsCommandId = 1001;
static const int kMaxRecentTabsCommandId = 1200;
WrenchMenuModel(ui::AcceleratorProvider* provider, Browser* browser);
~WrenchMenuModel() override;
// Overridden for ButtonMenuItemModel::Delegate:
bool DoesCommandIdDismissMenu(int command_id) const override;
// Overridden for both ButtonMenuItemModel::Delegate and SimpleMenuModel:
bool IsItemForCommandIdDynamic(int command_id) const override;
base::string16 GetLabelForCommandId(int command_id) const override;
bool GetIconForCommandId(int command_id, gfx::Image* icon) const override;
void ExecuteCommand(int command_id, int event_flags) override;
bool IsCommandIdChecked(int command_id) const override;
bool IsCommandIdEnabled(int command_id) const override;
bool IsCommandIdVisible(int command_id) const override;
bool GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) override;
// Overridden from TabStripModelObserver:
void ActiveTabChanged(content::WebContents* old_contents,
content::WebContents* new_contents,
int index,
int reason) override;
void TabReplacedAt(TabStripModel* tab_strip_model,
content::WebContents* old_contents,
content::WebContents* new_contents,
int index) override;
void TabStripModelDeleted() override;
// Overridden from content::NotificationObserver:
void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) override;
// Getters.
Browser* browser() const { return browser_; }
BookmarkSubMenuModel* bookmark_sub_menu_model() const {
return bookmark_sub_menu_model_.get();
}
// Calculates |zoom_label_| in response to a zoom change.
void UpdateZoomControls();
private:
class HelpMenuModel;
// Testing constructor used for mocking.
friend class ::MockWrenchMenuModel;
WrenchMenuModel();
void Build();
void AddGlobalErrorMenuItems();
// Appends everything needed for the clipboard menu: a menu break, the
// clipboard menu content and the finalizing menu break.
void CreateCutCopyPasteMenu();
// Add a menu item for the extension icons.
void CreateExtensionToolbarOverflowMenu();
// Appends everything needed for the zoom menu: a menu break, then the zoom
// menu content and then another menu break.
void CreateZoomMenu();
void OnZoomLevelChanged(const content::HostZoomMap::ZoomLevelChange& change);
bool ShouldShowNewIncognitoWindowMenuItem();
// Called when a command is selected.
// Logs UMA metrics about which command was chosen and how long the user
// took to select the command.
void LogMenuMetrics(int command_id);
// Helper function to record the menu action in a UMA histogram.
void LogMenuAction(int action_id);
// Time menu has been open. Used by LogMenuMetrics() to record the time
// to action when the user selects a menu item.
base::ElapsedTimer timer_;
// Whether a UMA menu action has been recorded since the menu is open.
// Only the first time to action is recorded since some commands
// (zoom controls) don't dimiss the menu.
bool uma_action_recorded_;
// Models for the special menu items with buttons.
scoped_ptr<ui::ButtonMenuItemModel> edit_menu_item_model_;
scoped_ptr<ui::ButtonMenuItemModel> zoom_menu_item_model_;
// Label of the zoom label in the zoom menu item.
base::string16 zoom_label_;
#if defined(GOOGLE_CHROME_BUILD)
// Help menu.
scoped_ptr<HelpMenuModel> help_menu_model_;
#endif
// Tools menu.
scoped_ptr<ToolsMenuModel> tools_menu_model_;
// Bookmark submenu.
scoped_ptr<BookmarkSubMenuModel> bookmark_sub_menu_model_;
// Recent Tabs submenu.
scoped_ptr<RecentTabsSubMenuModel> recent_tabs_sub_menu_model_;
ui::AcceleratorProvider* provider_; // weak
Browser* browser_; // weak
TabStripModel* tab_strip_model_; // weak
scoped_ptr<content::HostZoomMap::Subscription> content_zoom_subscription_;
scoped_ptr<content::HostZoomMap::Subscription> browser_zoom_subscription_;
content::NotificationRegistrar registrar_;
DISALLOW_COPY_AND_ASSIGN(WrenchMenuModel);
};
#endif // CHROME_BROWSER_UI_TOOLBAR_WRENCH_MENU_MODEL_H_