bookmark_menu_controller_views.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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_VIEWS_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_VIEWS_H_
6#define CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_VIEWS_H_
7
8#include <set>
9
10#include "base/compiler_specific.h"
11#include "chrome/browser/bookmarks/base_bookmark_model_observer.h"
12#include "chrome/browser/bookmarks/bookmark_node_data.h"
13#include "ui/views/controls/menu/menu_delegate.h"
14#include "ui/views/controls/menu/menu_item_view.h"
15
16class BookmarkBarView;
17class BookmarkMenuControllerObserver;
18class BookmarkMenuDelegate;
19class BookmarkNode;
20class Browser;
21
22namespace content {
23class PageNavigator;
24}
25
26namespace ui {
27class OSExchangeData;
28}
29
30namespace views {
31class MenuButton;
32class MenuRunner;
33class Widget;
34}
35
36// BookmarkMenuController is responsible for showing a menu of bookmarks,
37// each item in the menu represents a bookmark.
38// BookmarkMenuController deletes itself as necessary, although the menu can
39// be explicitly hidden by way of the Cancel method.
40class BookmarkMenuController : public BaseBookmarkModelObserver,
41                               public views::MenuDelegate {
42 public:
43  // Creates a BookmarkMenuController showing the children of |node| starting
44  // at |start_child_index|.
45  BookmarkMenuController(Browser* browser,
46                         content::PageNavigator* page_navigator,
47                         views::Widget* parent,
48                         const BookmarkNode* node,
49                         int start_child_index);
50
51  void RunMenuAt(BookmarkBarView* bookmark_bar, bool for_drop);
52
53  void clear_bookmark_bar() {
54    bookmark_bar_ = NULL;
55  }
56
57  // Hides the menu.
58  void Cancel();
59
60  // Returns the node the menu is showing for.
61  const BookmarkNode* node() const { return node_; }
62
63  // Returns the menu.
64  views::MenuItemView* menu() const;
65
66  // Returns the context menu, or NULL if the context menu isn't showing.
67  views::MenuItemView* context_menu() const;
68
69  // Sets the page navigator.
70  void SetPageNavigator(content::PageNavigator* navigator);
71
72  void set_observer(BookmarkMenuControllerObserver* observer) {
73    observer_ = observer;
74  }
75
76  // views::MenuDelegate:
77  virtual base::string16 GetTooltipText(int id,
78                                        const gfx::Point& p) const OVERRIDE;
79  virtual bool IsTriggerableEvent(views::MenuItemView* view,
80                                  const ui::Event& e) OVERRIDE;
81  virtual void ExecuteCommand(int id, int mouse_event_flags) OVERRIDE;
82  virtual bool ShouldExecuteCommandWithoutClosingMenu(
83      int id,
84      const ui::Event& e) OVERRIDE;
85  virtual bool GetDropFormats(
86      views::MenuItemView* menu,
87      int* formats,
88      std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
89  virtual bool AreDropTypesRequired(views::MenuItemView* menu) OVERRIDE;
90  virtual bool CanDrop(views::MenuItemView* menu,
91                       const ui::OSExchangeData& data) OVERRIDE;
92  virtual int GetDropOperation(views::MenuItemView* item,
93                               const ui::DropTargetEvent& event,
94                               DropPosition* position) OVERRIDE;
95  virtual int OnPerformDrop(views::MenuItemView* menu,
96                            DropPosition position,
97                            const ui::DropTargetEvent& event) OVERRIDE;
98  virtual bool ShowContextMenu(views::MenuItemView* source,
99                               int id,
100                               const gfx::Point& p,
101                               ui::MenuSourceType source_type) OVERRIDE;
102  virtual void DropMenuClosed(views::MenuItemView* menu) OVERRIDE;
103  virtual bool CanDrag(views::MenuItemView* menu) OVERRIDE;
104  virtual void WriteDragData(views::MenuItemView* sender,
105                             ui::OSExchangeData* data) OVERRIDE;
106  virtual int GetDragOperations(views::MenuItemView* sender) OVERRIDE;
107  virtual views::MenuItemView* GetSiblingMenu(
108      views::MenuItemView* menu,
109      const gfx::Point& screen_point,
110      views::MenuItemView::AnchorPosition* anchor,
111      bool* has_mnemonics,
112      views::MenuButton** button) OVERRIDE;
113  virtual int GetMaxWidthForMenu(views::MenuItemView* view) OVERRIDE;
114
115  // BaseBookmarkModelObserver:
116  virtual void BookmarkModelChanged() OVERRIDE;
117
118 private:
119  // BookmarkMenuController deletes itself as necessary.
120  virtual ~BookmarkMenuController();
121
122  scoped_ptr<views::MenuRunner> menu_runner_;
123
124  scoped_ptr<BookmarkMenuDelegate> menu_delegate_;
125
126  // The node we're showing the contents of.
127  const BookmarkNode* node_;
128
129  // Data for the drop.
130  BookmarkNodeData drop_data_;
131
132  // The observer, may be null.
133  BookmarkMenuControllerObserver* observer_;
134
135  // Is the menu being shown for a drop?
136  bool for_drop_;
137
138  // The bookmark bar. This is only non-null if we're showing a menu item for a
139  // folder on the bookmark bar and not for drop, or if the BookmarkBarView has
140  // been destroyed before the menu.
141  BookmarkBarView* bookmark_bar_;
142
143  DISALLOW_COPY_AND_ASSIGN(BookmarkMenuController);
144};
145
146#endif  // CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_VIEWS_H_
147