Home | History | Annotate | Download | only in launcher
      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 
     15 class ChromeLauncherController;
     16 
     17 namespace ash {
     18 class ShelfItemDelegate;
     19 }
     20 
     21 namespace aura {
     22 class Window;
     23 }
     24 
     25 namespace extensions {
     26 class ContextMenuMatcher;
     27 }
     28 
     29 // Context menu shown for a launcher item.
     30 class 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