• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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