- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / bookmarks / bookmark_menu_controller_views.h
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
16 class BookmarkBarView;
17 class BookmarkMenuControllerObserver;
18 class BookmarkMenuDelegate;
19 class BookmarkNode;
20 class Browser;
21
22 namespace content {
23 class PageNavigator;
24 }
25
26 namespace ui {
27 class OSExchangeData;
28 }
29
30 namespace views {
31 class MenuButton;
32 class MenuRunner;
33 class 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.
40 class 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 string16 GetTooltipText(int id, const gfx::Point& p) const OVERRIDE;
78   virtual bool IsTriggerableEvent(views::MenuItemView* view,
79                                   const ui::Event& e) OVERRIDE;
80   virtual void ExecuteCommand(int id, int mouse_event_flags) OVERRIDE;
81   virtual bool ShouldExecuteCommandWithoutClosingMenu(
82       int id,
83       const ui::Event& e) OVERRIDE;
84   virtual bool GetDropFormats(
85       views::MenuItemView* menu,
86       int* formats,
87       std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
88   virtual bool AreDropTypesRequired(views::MenuItemView* menu) OVERRIDE;
89   virtual bool CanDrop(views::MenuItemView* menu,
90                        const ui::OSExchangeData& data) OVERRIDE;
91   virtual int GetDropOperation(views::MenuItemView* item,
92                                const ui::DropTargetEvent& event,
93                                DropPosition* position) OVERRIDE;
94   virtual int OnPerformDrop(views::MenuItemView* menu,
95                             DropPosition position,
96                             const ui::DropTargetEvent& event) OVERRIDE;
97   virtual bool ShowContextMenu(views::MenuItemView* source,
98                                int id,
99                                const gfx::Point& p,
100                                ui::MenuSourceType source_type) OVERRIDE;
101   virtual void DropMenuClosed(views::MenuItemView* menu) OVERRIDE;
102   virtual bool CanDrag(views::MenuItemView* menu) OVERRIDE;
103   virtual void WriteDragData(views::MenuItemView* sender,
104                              ui::OSExchangeData* data) OVERRIDE;
105   virtual int GetDragOperations(views::MenuItemView* sender) OVERRIDE;
106   virtual views::MenuItemView* GetSiblingMenu(
107       views::MenuItemView* menu,
108       const gfx::Point& screen_point,
109       views::MenuItemView::AnchorPosition* anchor,
110       bool* has_mnemonics,
111       views::MenuButton** button) OVERRIDE;
112   virtual int GetMaxWidthForMenu(views::MenuItemView* view) OVERRIDE;
113
114   // BaseBookmarkModelObserver:
115   virtual void BookmarkModelChanged() OVERRIDE;
116
117  private:
118   // BookmarkMenuController deletes itself as necessary.
119   virtual ~BookmarkMenuController();
120
121   scoped_ptr<views::MenuRunner> menu_runner_;
122
123   scoped_ptr<BookmarkMenuDelegate> menu_delegate_;
124
125   // The node we're showing the contents of.
126   const BookmarkNode* node_;
127
128   // Data for the drop.
129   BookmarkNodeData drop_data_;
130
131   // The observer, may be null.
132   BookmarkMenuControllerObserver* observer_;
133
134   // Is the menu being shown for a drop?
135   bool for_drop_;
136
137   // The bookmark bar. This is only non-null if we're showing a menu item for a
138   // folder on the bookmark bar and not for drop, or if the BookmarkBarView has
139   // been destroyed before the menu.
140   BookmarkBarView* bookmark_bar_;
141
142   DISALLOW_COPY_AND_ASSIGN(BookmarkMenuController);
143 };
144
145 #endif  // CHROME_BROWSER_UI_VIEWS_BOOKMARKS_BOOKMARK_MENU_CONTROLLER_VIEWS_H_