1// Copyright (c) 2011 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_VIEWS_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_VIEWS_H_
6#define CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_VIEWS_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/gfx/native_widget_types.h"
14
15class PageNavigator;
16class Profile;
17
18// An interface implemented by an object that performs actions on the actual
19// menu for the controller.
20class BookmarkContextMenuControllerViewsDelegate {
21 public:
22  virtual ~BookmarkContextMenuControllerViewsDelegate() {}
23
24  // Closes the bookmark context menu.
25  virtual void CloseMenu() = 0;
26
27  // Methods that add items to the underlying menu.
28  virtual void AddItemWithStringId(int command_id, int string_id) = 0;
29  virtual void AddSeparator() = 0;
30  virtual void AddCheckboxItem(int command_id, int string_id) = 0;
31
32  // Sent before bookmarks are removed.
33  virtual void WillRemoveBookmarks(
34      const std::vector<const BookmarkNode*>& bookmarks) {}
35
36  // Sent after bookmarks have been removed.
37  virtual void DidRemoveBookmarks() {}
38};
39
40// BookmarkContextMenuControllerViews creates and manages state for the context
41// menu shown for any bookmark item.
42class BookmarkContextMenuControllerViews : public BaseBookmarkModelObserver {
43 public:
44  // Creates the bookmark context menu.
45  // |parent_window| is the window that this menu should be added to.
46  // |delegate| is described above.
47  // |profile| is used for opening urls as well as enabling 'open incognito'.
48  // |navigator| is used if |browser| is null, and is provided for testing.
49  // |parent| is the parent for newly created nodes if |selection| is empty.
50  // |selection| is the nodes the context menu operates on and may be empty.
51  BookmarkContextMenuControllerViews(
52      gfx::NativeWindow parent_window,
53      BookmarkContextMenuControllerViewsDelegate* delegate,
54      Profile* profile,
55      PageNavigator* navigator,
56      const BookmarkNode* parent,
57      const std::vector<const BookmarkNode*>& selection);
58  virtual ~BookmarkContextMenuControllerViews();
59
60  void BuildMenu();
61
62  void ExecuteCommand(int id);
63  bool IsItemChecked(int id) const;
64  bool IsCommandEnabled(int id) const;
65
66  // Accessors:
67  Profile* profile() const { return profile_; }
68  PageNavigator* navigator() const { return navigator_; }
69
70 private:
71  // Overridden from BaseBookmarkModelObserver:
72  // Any change to the model results in closing the menu.
73  virtual void BookmarkModelChanged();
74
75  // Removes the observer from the model and NULLs out model_.
76  BookmarkModel* RemoveModelObserver();
77
78  // Returns true if selection_ has at least one bookmark of type url.
79  bool HasURLs() const;
80
81  gfx::NativeWindow parent_window_;
82  BookmarkContextMenuControllerViewsDelegate* delegate_;
83  Profile* profile_;
84  PageNavigator* navigator_;
85  const BookmarkNode* parent_;
86  std::vector<const BookmarkNode*> selection_;
87  BookmarkModel* model_;
88
89  DISALLOW_COPY_AND_ASSIGN(BookmarkContextMenuControllerViews);
90};
91
92#endif  // CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_CONTEXT_MENU_CONTROLLER_VIEWS_H_
93