15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/base_bookmark_model_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageNavigator;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface implemented by an object that performs actions on the actual
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu for the controller.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkContextMenuControllerDelegate {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BookmarkContextMenuControllerDelegate() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes the bookmark context menu.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CloseMenu() = 0;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sent before any command from the menu is executed.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WillExecuteCommand(
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int command_id,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<const BookmarkNode*>& bookmarks) {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sent after any command from the menu is executed.
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidExecuteCommand(int command_id) {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BookmarkContextMenuController creates and manages state for the context menu
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shown for any bookmark item.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkContextMenuController : public BaseBookmarkModelObserver,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      public ui::SimpleMenuModel::Delegate {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the bookmark context menu.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |browser| is used to open the bookmark manager and is NULL in tests.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |profile| is used for opening urls as well as enabling 'open incognito'.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |navigator| is used if |browser| is null, and is provided for testing.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |parent| is the parent for newly created nodes if |selection| is empty.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |selection| is the nodes the context menu operates on and may be empty.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkContextMenuController(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::NativeWindow parent_window,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkContextMenuControllerDelegate* delegate,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* profile,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PageNavigator* navigator,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const BookmarkNode* parent,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<const BookmarkNode*>& selection);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BookmarkContextMenuController();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::SimpleMenuModel* menu_model() { return menu_model_.get(); }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::SimpleMenuModel::Delegate implementation:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual bool IsCommandIdVisible(int command_id) const OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetAcceleratorForCommandId(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int command_id,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator* accelerator) OVERRIDE;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE;
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual base::string16 GetLabelForCommandId(int command_id) const OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_navigator(content::PageNavigator* navigator) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigator_ = navigator;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void BuildMenu();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a IDC_* style command to the menu with a localized string.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddItem(int id, int localization_id);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a separator to the menu.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddSeparator();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a checkable item to the menu.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddCheckboxItem(int id, int localization_id);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from BaseBookmarkModelObserver:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Any change to the model results in closing the menu.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkModelChanged() OVERRIDE;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeWindow parent_window_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkContextMenuControllerDelegate* delegate_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PageNavigator* navigator_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* parent_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const BookmarkNode*> selection_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::SimpleMenuModel> menu_model_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BookmarkContextMenuController);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_H_
107