Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 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 #include "ash/mus/context_menu_mus.h" | |
| 6 | |
| 7 #include "ash/desktop_background/user_wallpaper_delegate.h" | |
| 8 #include "ash/root_window_controller.h" | |
| 9 #include "ash/session/session_state_delegate.h" | |
| 10 #include "ash/shelf/shelf.h" | |
| 11 #include "ash/shelf/shelf_types.h" | |
| 12 #include "ash/shelf/shelf_widget.h" | |
| 13 #include "ash/shell.h" | |
| 14 #include "grit/ash_strings.h" | |
| 15 #include "mojo/common/common_type_converters.h" | |
| 16 #include "mojo/shell/public/cpp/connector.h" | |
| 17 | |
| 18 namespace ash { | |
| 19 namespace sysui { | |
| 20 | |
| 21 ContextMenuMus::ContextMenuMus(ContextMenuMus* root_menu, | |
| 22 Shelf* shelf, | |
| 23 const ShelfItem* item) | |
| 24 : ui::SimpleMenuModel(nullptr), | |
| 25 root_menu_(root_menu ? root_menu : this), | |
| 26 shelf_(shelf), | |
| 27 item_(item), | |
| 28 alignment_menu_(shelf) { | |
| 29 set_delegate(this); | |
| 30 } | |
| 31 | |
| 32 void ContextMenuMus::InitializeRootMenu(mojo::Connector* connector) { | |
| 33 // Only the root menu should add ash items or make a connection to Chrome. | |
| 34 DCHECK_EQ(root_menu_, this); | |
| 35 | |
| 36 connector->ConnectToInterface("exe:chrome", &context_menu_); | |
| 37 context_menu_->GetItemsAndInfo( | |
| 38 item_ ? item_->type : ShelfItemType::TYPE_UNDEFINED, | |
| 39 item_ ? item_->id : 0, | |
| 40 base::Bind(&ContextMenuMus::GetItemsAndInfoCallback, | |
| 41 base::Unretained(this))); | |
| 42 context_menu_.WaitForIncomingResponse(); | |
|
sky
2016/03/18 20:30:57
We shouldn't block here. There are two options for
msw
2016/03/18 22:10:30
Adding a menu without Chrome hooks for now, as dis
| |
| 43 } | |
| 44 | |
| 45 ContextMenuMus::~ContextMenuMus() {} | |
| 46 | |
| 47 void ContextMenuMus::GetItemsAndInfoCallback( | |
| 48 mojo::Array<mash::shelf::mojom::ContextMenuItemPtr> items, | |
| 49 bool can_user_modify_shelf_auto_hide_behavior, | |
| 50 bool is_guest_session) { | |
| 51 AddItems(std::move(items)); | |
| 52 | |
| 53 // TODO(msw): |controller| is null; ask the window manager about fullscreen? | |
| 54 RootWindowController* controller = RootWindowController::ForWindow( | |
| 55 shelf_->shelf_widget()->GetNativeWindow()->GetRootWindow()); | |
| 56 if (can_user_modify_shelf_auto_hide_behavior && | |
| 57 (!controller || !controller->GetWindowForFullscreenMode())) { | |
| 58 AddCheckItemWithStringId(MENU_AUTO_HIDE, | |
| 59 IDS_ASH_SHELF_CONTEXT_MENU_AUTO_HIDE); | |
| 60 } | |
| 61 if (ShelfWidget::ShelfAlignmentAllowed() && | |
| 62 !Shell::GetInstance()->session_state_delegate()->IsScreenLocked()) { | |
| 63 AddSubMenuWithStringId(MENU_ALIGNMENT_MENU, | |
| 64 IDS_ASH_SHELF_CONTEXT_MENU_POSITION, | |
| 65 &alignment_menu_); | |
| 66 } | |
| 67 if (!is_guest_session) | |
| 68 AddItemWithStringId(MENU_CHANGE_WALLPAPER, IDS_AURA_SET_DESKTOP_WALLPAPER); | |
| 69 } | |
| 70 | |
| 71 void ContextMenuMus::AddItems( | |
| 72 mojo::Array<mash::shelf::mojom::ContextMenuItemPtr> items) { | |
| 73 for (const auto& item : items) { | |
| 74 switch (item->type) { | |
| 75 case mash::shelf::mojom::ContextMenuItem::Type::ITEM: | |
| 76 DCHECK_EQ(item_enabled_.count(item->command_id), 0U); | |
| 77 item_enabled_[item->command_id] = item->enabled; | |
| 78 AddItem(item->command_id, item->label.To<base::string16>()); | |
| 79 break; | |
| 80 case mash::shelf::mojom::ContextMenuItem::Type::CHECK: | |
| 81 DCHECK_EQ(item_enabled_.count(item->command_id), 0U); | |
| 82 DCHECK_EQ(item_checked_.count(item->command_id), 0U); | |
| 83 item_enabled_[item->command_id] = item->enabled; | |
| 84 item_checked_[item->command_id] = item->checked; | |
| 85 AddCheckItem(item->command_id, item->label.To<base::string16>()); | |
| 86 break; | |
| 87 case mash::shelf::mojom::ContextMenuItem::Type::RADIO: | |
| 88 DCHECK_EQ(item_enabled_.count(item->command_id), 0U); | |
| 89 DCHECK_EQ(item_checked_.count(item->command_id), 0U); | |
| 90 item_enabled_[item->command_id] = item->enabled; | |
| 91 item_checked_[item->command_id] = item->checked; | |
| 92 AddRadioItem(item->command_id, item->label.To<base::string16>(), | |
| 93 item->radio_group_id); | |
| 94 break; | |
| 95 case mash::shelf::mojom::ContextMenuItem::Type::SEPARATOR: | |
| 96 AddSeparator(ui::NORMAL_SEPARATOR); | |
| 97 break; | |
| 98 case mash::shelf::mojom::ContextMenuItem::Type::SUBMENU: | |
| 99 DCHECK_EQ(item_enabled_.count(item->command_id), 0U); | |
| 100 DCHECK_EQ(item_submenu_.count(item->command_id), 0U); | |
| 101 item_enabled_[item->command_id] = item->enabled; | |
| 102 item_submenu_[item->command_id].reset( | |
| 103 new ContextMenuMus(root_menu_, shelf_, item_)); | |
| 104 item_submenu_[item->command_id]->AddItems(std::move(item->submenu)); | |
| 105 AddSubMenu(item->command_id, item->label.To<base::string16>(), | |
| 106 item_submenu_[item->command_id].get()); | |
| 107 break; | |
| 108 default: | |
| 109 NOTREACHED() << "Unknown mus context menu item type."; | |
| 110 } | |
| 111 } | |
| 112 } | |
| 113 | |
| 114 bool ContextMenuMus::IsCommandIdChecked(int command_id) const { | |
| 115 switch (command_id) { | |
| 116 case MENU_AUTO_HIDE: | |
| 117 return shelf_->GetAutoHideBehavior() == SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS; | |
| 118 case MENU_ALIGNMENT_MENU: | |
| 119 case MENU_CHANGE_WALLPAPER: | |
| 120 return false; | |
| 121 default: | |
| 122 if (item_checked_.find(command_id) != item_checked_.end()) | |
| 123 return item_checked_.at(command_id); | |
| 124 } | |
| 125 NOTREACHED() << "Unknown mus context menu command " << command_id; | |
| 126 return false; | |
| 127 } | |
| 128 | |
| 129 bool ContextMenuMus::IsCommandIdEnabled(int command_id) const { | |
| 130 switch (command_id) { | |
| 131 case MENU_AUTO_HIDE: | |
| 132 case MENU_ALIGNMENT_MENU: | |
| 133 return true; | |
| 134 case MENU_CHANGE_WALLPAPER: | |
| 135 return Shell::GetInstance() | |
| 136 ->user_wallpaper_delegate() | |
| 137 ->CanOpenSetWallpaperPage(); | |
| 138 default: | |
| 139 if (item_enabled_.find(command_id) != item_enabled_.end()) | |
| 140 return item_enabled_.at(command_id); | |
| 141 } | |
| 142 NOTREACHED() << "Unknown mus context menu command " << command_id; | |
| 143 return false; | |
| 144 } | |
| 145 | |
| 146 bool ContextMenuMus::GetAcceleratorForCommandId(int command_id, | |
| 147 ui::Accelerator* accelerator) { | |
| 148 return false; | |
| 149 } | |
| 150 | |
| 151 void ContextMenuMus::ExecuteCommand(int command_id, int event_flags) { | |
| 152 Shell* shell = Shell::GetInstance(); | |
| 153 switch (static_cast<MenuItem>(command_id)) { | |
| 154 case MENU_AUTO_HIDE: | |
| 155 shelf_->SetAutoHideBehavior(shelf_->GetAutoHideBehavior() == | |
| 156 SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS | |
| 157 ? SHELF_AUTO_HIDE_BEHAVIOR_NEVER | |
| 158 : SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); | |
| 159 break; | |
| 160 case MENU_ALIGNMENT_MENU: | |
| 161 break; | |
| 162 case MENU_CHANGE_WALLPAPER: | |
| 163 shell->user_wallpaper_delegate()->OpenSetWallpaperPage(); | |
| 164 default: | |
| 165 DCHECK_EQ(item_enabled_.count(command_id), 1U); | |
| 166 root_menu_->context_menu_->ExecuteCommand(command_id, event_flags); | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 } // namespace sysui | |
| 171 } // namespace ash | |
| OLD | NEW |