1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_ 6#define CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_ 7 8#include <vector> 9 10#include "base/basictypes.h" 11#include "base/memory/scoped_ptr.h" 12#include "components/bookmarks/browser/base_bookmark_model_observer.h" 13#include "ui/base/models/simple_menu_model.h" 14#include "ui/gfx/native_widget_types.h" 15 16class Browser; 17class Profile; 18 19namespace content { 20class PageNavigator; 21} 22 23// An interface implemented by an object that performs actions on the actual 24// menu for the controller. 25class BookmarkContextMenuControllerDelegate { 26 public: 27 virtual ~BookmarkContextMenuControllerDelegate() {} 28 29 // Closes the bookmark context menu. 30 virtual void CloseMenu() = 0; 31 32 // Sent before any command from the menu is executed. 33 virtual void WillExecuteCommand( 34 int command_id, 35 const std::vector<const BookmarkNode*>& bookmarks) {} 36 37 // Sent after any command from the menu is executed. 38 virtual void DidExecuteCommand(int command_id) {} 39}; 40 41// BookmarkContextMenuController creates and manages state for the context menu 42// shown for any bookmark item. 43class BookmarkContextMenuController : public BaseBookmarkModelObserver, 44 public ui::SimpleMenuModel::Delegate { 45 public: 46 // Creates the bookmark context menu. 47 // |browser| is used to open the bookmark manager and is NULL in tests. 48 // |profile| is used for opening urls as well as enabling 'open incognito'. 49 // |navigator| is used if |browser| is null, and is provided for testing. 50 // |parent| is the parent for newly created nodes if |selection| is empty. 51 // |selection| is the nodes the context menu operates on and may be empty. 52 BookmarkContextMenuController( 53 gfx::NativeWindow parent_window, 54 BookmarkContextMenuControllerDelegate* delegate, 55 Browser* browser, 56 Profile* profile, 57 content::PageNavigator* navigator, 58 const BookmarkNode* parent, 59 const std::vector<const BookmarkNode*>& selection); 60 virtual ~BookmarkContextMenuController(); 61 62 ui::SimpleMenuModel* menu_model() { return menu_model_.get(); } 63 64 // ui::SimpleMenuModel::Delegate implementation: 65 virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; 66 virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; 67 virtual bool IsCommandIdVisible(int command_id) const OVERRIDE; 68 virtual bool GetAcceleratorForCommandId( 69 int command_id, 70 ui::Accelerator* accelerator) OVERRIDE; 71 virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; 72 virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE; 73 virtual base::string16 GetLabelForCommandId(int command_id) const OVERRIDE; 74 75 void set_navigator(content::PageNavigator* navigator) { 76 navigator_ = navigator; 77 } 78 79 private: 80 void BuildMenu(); 81 82 // Adds a IDC_* style command to the menu with a localized string. 83 void AddItem(int id, int localization_id); 84 // Adds a separator to the menu. 85 void AddSeparator(); 86 // Adds a checkable item to the menu. 87 void AddCheckboxItem(int id, int localization_id); 88 89 // Overridden from BaseBookmarkModelObserver: 90 // Any change to the model results in closing the menu. 91 virtual void BookmarkModelChanged() OVERRIDE; 92 93 gfx::NativeWindow parent_window_; 94 BookmarkContextMenuControllerDelegate* delegate_; 95 Browser* browser_; 96 Profile* profile_; 97 content::PageNavigator* navigator_; 98 const BookmarkNode* parent_; 99 std::vector<const BookmarkNode*> selection_; 100 BookmarkModel* model_; 101 scoped_ptr<ui::SimpleMenuModel> menu_model_; 102 103 DISALLOW_COPY_AND_ASSIGN(BookmarkContextMenuController); 104}; 105 106#endif // CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_ 107