1 // Copyright (c) 2010 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_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_ 6 #define CHROME_BROWSER_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_ 7 #pragma once 8 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "chrome/browser/bookmarks/base_bookmark_model_observer.h" 13 #include "ui/base/models/simple_menu_model.h" 14 #include "ui/gfx/native_widget_types.h" 15 16 class PageNavigator; 17 class Profile; 18 19 // An interface implemented by an object that performs actions on the actual 20 // menu for the controller. 21 class BookmarkContextMenuControllerDelegate { 22 public: ~BookmarkContextMenuControllerDelegate()23 virtual ~BookmarkContextMenuControllerDelegate() {} 24 25 // Closes the bookmark context menu. 26 virtual void CloseMenu() = 0; 27 28 // Sent before any command from the menu is executed. WillExecuteCommand()29 virtual void WillExecuteCommand() {} 30 31 // Sent after any command from the menu is executed. DidExecuteCommand()32 virtual void DidExecuteCommand() {} 33 }; 34 35 // BookmarkContextMenuController creates and manages state for the context menu 36 // shown for any bookmark item. 37 class BookmarkContextMenuController : public BaseBookmarkModelObserver, 38 public ui::SimpleMenuModel::Delegate { 39 public: 40 // Creates the bookmark context menu. 41 // |profile| is used for opening urls as well as enabling 'open incognito'. 42 // |browser| is used to determine the PageNavigator and may be null. 43 // |navigator| is used if |browser| is null, and is provided for testing. 44 // |parent| is the parent for newly created nodes if |selection| is empty. 45 // |selection| is the nodes the context menu operates on and may be empty. 46 BookmarkContextMenuController( 47 gfx::NativeWindow parent_window, 48 BookmarkContextMenuControllerDelegate* delegate, 49 Profile* profile, 50 PageNavigator* navigator, 51 const BookmarkNode* parent, 52 const std::vector<const BookmarkNode*>& selection); 53 virtual ~BookmarkContextMenuController(); 54 55 void BuildMenu(); 56 menu_model()57 ui::SimpleMenuModel* menu_model() const { return menu_model_.get(); } 58 59 // ui::SimpleMenuModel::Delegate implementation: 60 virtual bool IsCommandIdChecked(int command_id) const; 61 virtual bool IsCommandIdEnabled(int command_id) const; 62 virtual bool GetAcceleratorForCommandId(int command_id, 63 ui::Accelerator* accelerator); 64 virtual void ExecuteCommand(int command_id); 65 66 // Accessors: profile()67 Profile* profile() const { return profile_; } navigator()68 PageNavigator* navigator() const { return navigator_; } 69 70 private: 71 // Adds a IDC_* style command to the menu with a localized string. 72 void AddItem(int id, int localization_id); 73 // Adds a separator to the menu. 74 void AddSeparator(); 75 // Adds a checkable item to the menu. 76 void AddCheckboxItem(int id, int localization_id); 77 78 // Overridden from BaseBookmarkModelObserver: 79 // Any change to the model results in closing the menu. 80 virtual void BookmarkModelChanged(); 81 82 // Returns true if selection_ has at least one bookmark of type url. 83 bool HasURLs() const; 84 85 gfx::NativeWindow parent_window_; 86 BookmarkContextMenuControllerDelegate* delegate_; 87 Profile* profile_; 88 PageNavigator* navigator_; 89 const BookmarkNode* parent_; 90 std::vector<const BookmarkNode*> selection_; 91 BookmarkModel* model_; 92 scoped_ptr<ui::SimpleMenuModel> menu_model_; 93 94 DISALLOW_COPY_AND_ASSIGN(BookmarkContextMenuController); 95 }; 96 97 #endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_ 98