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_ASH_LAUNCHER_LAUNCHER_CONTEXT_MENU_H_
6#define CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_CONTEXT_MENU_H_
7
8#include "ash/shelf/shelf_alignment_menu.h"
9#include "ash/shelf/shelf_item_types.h"
10#include "base/basictypes.h"
11#include "base/gtest_prod_util.h"
12#include "base/memory/scoped_ptr.h"
13#include "ui/base/models/simple_menu_model.h"
14
15class ChromeLauncherController;
16
17namespace ash {
18class ShelfItemDelegate;
19}
20
21namespace aura {
22class Window;
23}
24
25namespace extensions {
26class ContextMenuMatcher;
27}
28
29// Context menu shown for a launcher item.
30class LauncherContextMenu : public ui::SimpleMenuModel,
31                            public ui::SimpleMenuModel::Delegate {
32 public:
33  // |item| is NULL if the context menu is for the launcher (the user right
34  // |clicked on an area with no icons).
35  LauncherContextMenu(ChromeLauncherController* controller,
36                      const ash::ShelfItem* item,
37                      aura::Window* root_window);
38
39  // Creates a menu used by item created by ShelfWindowWatcher.
40  LauncherContextMenu(ChromeLauncherController* controller,
41                      ash::ShelfItemDelegate* item_delegate,
42                      ash::ShelfItem* item,
43                      aura::Window* root_window);
44
45  // Creates a menu used as a desktop context menu on |root_window|.
46  LauncherContextMenu(ChromeLauncherController* controller,
47                      aura::Window* root_window);
48  virtual ~LauncherContextMenu();
49
50  void Init();
51
52  // ID of the item we're showing the context menu for.
53  ash::ShelfID id() const { return item_.id; }
54
55  // ui::SimpleMenuModel::Delegate overrides:
56  virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE;
57  virtual base::string16 GetLabelForCommandId(int command_id) const OVERRIDE;
58  virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
59  virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
60  virtual bool IsCommandIdVisible(int command_id) const OVERRIDE;
61  virtual bool GetAcceleratorForCommandId(
62      int command_id,
63      ui::Accelerator* accelerator) OVERRIDE;
64  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
65
66 private:
67  FRIEND_TEST_ALL_PREFIXES(
68      LauncherContextMenuTest,
69      NewIncognitoWindowMenuIsDisabledWhenIncognitoModeOff);
70  FRIEND_TEST_ALL_PREFIXES(
71      LauncherContextMenuTest,
72      NewWindowMenuIsDisabledWhenIncognitoModeForced);
73  FRIEND_TEST_ALL_PREFIXES(
74      LauncherContextMenuTest,
75      AutoHideOptionInMaximizedMode);
76
77  enum MenuItem {
78    MENU_OPEN_NEW,
79    MENU_CLOSE,
80    MENU_PIN,
81    MENU_INSTALL,
82    LAUNCH_TYPE_PINNED_TAB,
83    LAUNCH_TYPE_REGULAR_TAB,
84    LAUNCH_TYPE_FULLSCREEN,
85    LAUNCH_TYPE_WINDOW,
86    MENU_AUTO_HIDE,
87    MENU_NEW_WINDOW,
88    MENU_NEW_INCOGNITO_WINDOW,
89    MENU_ALIGNMENT_MENU,
90#if defined(OS_CHROMEOS)
91    MENU_CHANGE_WALLPAPER,
92#endif
93  };
94
95  // Does |item_| represent a valid item? See description of constructor for
96  // details on why it may not be valid.
97  bool is_valid_item() const { return item_.id != 0; }
98
99  ChromeLauncherController* controller_;
100
101  ash::ShelfItem item_;
102
103  ash::ShelfAlignmentMenu shelf_alignment_menu_;
104
105  scoped_ptr<extensions::ContextMenuMatcher> extension_items_;
106
107  aura::Window* root_window_;
108
109  // Not owned.
110  ash::ShelfItemDelegate* item_delegate_;
111
112  DISALLOW_COPY_AND_ASSIGN(LauncherContextMenu);
113};
114
115#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_CONTEXT_MENU_H_
116