| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/toolbar/wrench_menu.h" | 5 #include "chrome/browser/ui/views/toolbar/wrench_menu.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| 11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "chrome/app/chrome_command_ids.h" | 13 #include "chrome/app/chrome_command_ids.h" |
| 14 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 14 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| 15 #include "chrome/browser/bookmarks/bookmark_stats.h" | 15 #include "chrome/browser/bookmarks/bookmark_stats.h" |
| 16 #include "chrome/browser/chrome_notification_types.h" | 16 #include "chrome/browser/chrome_notification_types.h" |
| 17 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
| 18 #include "chrome/browser/search/search.h" | 18 #include "chrome/browser/search/search.h" |
| 19 #include "chrome/browser/ui/browser.h" | 19 #include "chrome/browser/ui/browser.h" |
| 20 #include "chrome/browser/ui/browser_window.h" | 20 #include "chrome/browser/ui/browser_window.h" |
| 21 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 21 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 22 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" | 22 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" |
| 23 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h" | 23 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h" |
| 24 #include "chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.h" |
| 24 #include "chrome/browser/ui/views/toolbar/wrench_menu_observer.h" | 25 #include "chrome/browser/ui/views/toolbar/wrench_menu_observer.h" |
| 25 #include "components/bookmarks/browser/bookmark_model.h" | 26 #include "components/bookmarks/browser/bookmark_model.h" |
| 26 #include "content/public/browser/host_zoom_map.h" | 27 #include "content/public/browser/host_zoom_map.h" |
| 27 #include "content/public/browser/notification_observer.h" | 28 #include "content/public/browser/notification_observer.h" |
| 28 #include "content/public/browser/notification_registrar.h" | 29 #include "content/public/browser/notification_registrar.h" |
| 29 #include "content/public/browser/notification_source.h" | 30 #include "content/public/browser/notification_source.h" |
| 30 #include "content/public/browser/notification_types.h" | 31 #include "content/public/browser/notification_types.h" |
| 31 #include "content/public/browser/user_metrics.h" | 32 #include "content/public/browser/user_metrics.h" |
| 32 #include "content/public/browser/web_contents.h" | 33 #include "content/public/browser/web_contents.h" |
| 34 #include "extensions/common/feature_switch.h" |
| 33 #include "grit/chromium_strings.h" | 35 #include "grit/chromium_strings.h" |
| 34 #include "grit/generated_resources.h" | 36 #include "grit/generated_resources.h" |
| 35 #include "grit/theme_resources.h" | 37 #include "grit/theme_resources.h" |
| 36 #include "third_party/skia/include/core/SkCanvas.h" | 38 #include "third_party/skia/include/core/SkCanvas.h" |
| 37 #include "third_party/skia/include/core/SkPaint.h" | 39 #include "third_party/skia/include/core/SkPaint.h" |
| 38 #include "ui/base/l10n/l10n_util.h" | 40 #include "ui/base/l10n/l10n_util.h" |
| 39 #include "ui/base/layout.h" | 41 #include "ui/base/layout.h" |
| 40 #include "ui/base/resource/resource_bundle.h" | 42 #include "ui/base/resource/resource_bundle.h" |
| 41 #include "ui/gfx/canvas.h" | 43 #include "ui/gfx/canvas.h" |
| 42 #include "ui/gfx/font_list.h" | 44 #include "ui/gfx/font_list.h" |
| (...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 | 673 |
| 672 fullscreen_button_->SetFocusable(true); | 674 fullscreen_button_->SetFocusable(true); |
| 673 fullscreen_button_->set_request_focus_on_press(false); | 675 fullscreen_button_->set_request_focus_on_press(false); |
| 674 fullscreen_button_->set_tag(fullscreen_index); | 676 fullscreen_button_->set_tag(fullscreen_index); |
| 675 fullscreen_button_->SetImageAlignment( | 677 fullscreen_button_->SetImageAlignment( |
| 676 ImageButton::ALIGN_CENTER, ImageButton::ALIGN_MIDDLE); | 678 ImageButton::ALIGN_CENTER, ImageButton::ALIGN_MIDDLE); |
| 677 int horizontal_padding = | 679 int horizontal_padding = |
| 678 menu->use_new_menu() ? kHorizontalTouchPadding : kHorizontalPadding; | 680 menu->use_new_menu() ? kHorizontalTouchPadding : kHorizontalPadding; |
| 679 fullscreen_button_->SetBorder(views::Border::CreateEmptyBorder( | 681 fullscreen_button_->SetBorder(views::Border::CreateEmptyBorder( |
| 680 0, horizontal_padding, 0, horizontal_padding)); | 682 0, horizontal_padding, 0, horizontal_padding)); |
| 681 fullscreen_button_->set_background( | 683 fullscreen_button_->set_background(new InMenuButtonBackground( |
| 682 new InMenuButtonBackground(InMenuButtonBackground::SINGLE_BUTTON, | 684 InMenuButtonBackground::SINGLE_BUTTON, menu->use_new_menu())); |
| 683 menu->use_new_menu())); | |
| 684 fullscreen_button_->SetAccessibleName( | 685 fullscreen_button_->SetAccessibleName( |
| 685 GetAccessibleNameForWrenchMenuItem( | 686 GetAccessibleNameForWrenchMenuItem( |
| 686 menu_model, fullscreen_index, IDS_ACCNAME_FULLSCREEN)); | 687 menu_model, fullscreen_index, IDS_ACCNAME_FULLSCREEN)); |
| 687 AddChildView(fullscreen_button_); | 688 AddChildView(fullscreen_button_); |
| 688 | 689 |
| 689 // Need to set a font list for the zoom label width calculations. | 690 // Need to set a font list for the zoom label width calculations. |
| 690 OnNativeThemeChanged(NULL); | 691 OnNativeThemeChanged(NULL); |
| 691 UpdateZoomControls(); | 692 UpdateZoomControls(); |
| 692 } | 693 } |
| 693 | 694 |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1137 return entry.first->IsItemCheckedAt(entry.second); | 1138 return entry.first->IsItemCheckedAt(entry.second); |
| 1138 } | 1139 } |
| 1139 | 1140 |
| 1140 bool WrenchMenu::IsCommandEnabled(int command_id) const { | 1141 bool WrenchMenu::IsCommandEnabled(int command_id) const { |
| 1141 if (IsBookmarkCommand(command_id)) | 1142 if (IsBookmarkCommand(command_id)) |
| 1142 return true; | 1143 return true; |
| 1143 | 1144 |
| 1144 if (command_id == 0) | 1145 if (command_id == 0) |
| 1145 return false; // The root item. | 1146 return false; // The root item. |
| 1146 | 1147 |
| 1147 // The items representing the cut menu (cut/copy/paste) and zoom menu | 1148 // The items representing the cut menu (cut/copy/paste), zoom menu |
| 1148 // (increment/decrement/reset) are always enabled. The child views of these | 1149 // (increment/decrement/reset) and extension toolbar view are always enabled. |
| 1149 // items enabled state updates appropriately. | 1150 // The child views of these items enabled state updates appropriately. |
| 1150 if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS) | 1151 if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS || |
| 1152 command_id == IDC_EXTENSIONS_OVERFLOW_MENU) |
| 1151 return true; | 1153 return true; |
| 1152 | 1154 |
| 1153 const Entry& entry = command_id_to_entry_.find(command_id)->second; | 1155 const Entry& entry = command_id_to_entry_.find(command_id)->second; |
| 1154 return entry.first->IsEnabledAt(entry.second); | 1156 return entry.first->IsEnabledAt(entry.second); |
| 1155 } | 1157 } |
| 1156 | 1158 |
| 1157 void WrenchMenu::ExecuteCommand(int command_id, int mouse_event_flags) { | 1159 void WrenchMenu::ExecuteCommand(int command_id, int mouse_event_flags) { |
| 1158 if (IsBookmarkCommand(command_id)) { | 1160 if (IsBookmarkCommand(command_id)) { |
| 1159 bookmark_menu_delegate_->ExecuteCommand(command_id, mouse_event_flags); | 1161 bookmark_menu_delegate_->ExecuteCommand(command_id, mouse_event_flags); |
| 1160 return; | 1162 return; |
| 1161 } | 1163 } |
| 1162 | 1164 |
| 1163 if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS) { | 1165 if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS || |
| 1166 command_id == IDC_EXTENSIONS_OVERFLOW_MENU) { |
| 1164 // These items are represented by child views. If ExecuteCommand is invoked | 1167 // These items are represented by child views. If ExecuteCommand is invoked |
| 1165 // it means the user clicked on the area around the buttons and we should | 1168 // it means the user clicked on the area around the buttons and we should |
| 1166 // not do anyting. | 1169 // not do anyting. |
| 1167 return; | 1170 return; |
| 1168 } | 1171 } |
| 1169 | 1172 |
| 1170 const Entry& entry = command_id_to_entry_.find(command_id)->second; | 1173 const Entry& entry = command_id_to_entry_.find(command_id)->second; |
| 1171 return entry.first->ActivatedAt(entry.second, mouse_event_flags); | 1174 return entry.first->ActivatedAt(entry.second, mouse_event_flags); |
| 1172 } | 1175 } |
| 1173 | 1176 |
| 1174 bool WrenchMenu::GetAccelerator(int command_id, | 1177 bool WrenchMenu::GetAccelerator(int command_id, |
| 1175 ui::Accelerator* accelerator) const { | 1178 ui::Accelerator* accelerator) const { |
| 1176 if (IsBookmarkCommand(command_id)) | 1179 if (IsBookmarkCommand(command_id)) |
| 1177 return false; | 1180 return false; |
| 1178 | 1181 |
| 1179 if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS) { | 1182 if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS || |
| 1183 command_id == IDC_EXTENSIONS_OVERFLOW_MENU) { |
| 1180 // These have special child views; don't show the accelerator for them. | 1184 // These have special child views; don't show the accelerator for them. |
| 1181 return false; | 1185 return false; |
| 1182 } | 1186 } |
| 1183 | 1187 |
| 1184 CommandIDToEntry::const_iterator ix = command_id_to_entry_.find(command_id); | 1188 CommandIDToEntry::const_iterator ix = command_id_to_entry_.find(command_id); |
| 1185 const Entry& entry = ix->second; | 1189 const Entry& entry = ix->second; |
| 1186 ui::Accelerator menu_accelerator; | 1190 ui::Accelerator menu_accelerator; |
| 1187 if (!entry.first->GetAcceleratorAt(entry.second, &menu_accelerator)) | 1191 if (!entry.first->GetAcceleratorAt(entry.second, &menu_accelerator)) |
| 1188 return false; | 1192 return false; |
| 1189 | 1193 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1236 MenuModel* model) { | 1240 MenuModel* model) { |
| 1237 for (int i = 0, max = model->GetItemCount(); i < max; ++i) { | 1241 for (int i = 0, max = model->GetItemCount(); i < max; ++i) { |
| 1238 // The button container menu items have a special height which we have to | 1242 // The button container menu items have a special height which we have to |
| 1239 // use instead of the normal height. | 1243 // use instead of the normal height. |
| 1240 int height = 0; | 1244 int height = 0; |
| 1241 if (use_new_menu_ && | 1245 if (use_new_menu_ && |
| 1242 (model->GetCommandIdAt(i) == IDC_CUT || | 1246 (model->GetCommandIdAt(i) == IDC_CUT || |
| 1243 model->GetCommandIdAt(i) == IDC_ZOOM_MINUS)) | 1247 model->GetCommandIdAt(i) == IDC_ZOOM_MINUS)) |
| 1244 height = kMenuItemContainingButtonsHeight; | 1248 height = kMenuItemContainingButtonsHeight; |
| 1245 | 1249 |
| 1250 scoped_ptr<ExtensionToolbarMenuView> extension_toolbar_menu_view; |
| 1251 if (model->GetCommandIdAt(i) == IDC_EXTENSIONS_OVERFLOW_MENU) { |
| 1252 extension_toolbar_menu_view.reset(new ExtensionToolbarMenuView(browser_)); |
| 1253 height = extension_toolbar_menu_view->GetPreferredSize().height(); |
| 1254 } |
| 1255 |
| 1246 // Add the menu item at the end. | 1256 // Add the menu item at the end. |
| 1247 int menu_index = parent->HasSubmenu() ? | 1257 int menu_index = parent->HasSubmenu() ? |
| 1248 parent->GetSubmenu()->child_count() : 0; | 1258 parent->GetSubmenu()->child_count() : 0; |
| 1249 MenuItemView* item = AddMenuItem( | 1259 MenuItemView* item = AddMenuItem( |
| 1250 parent, menu_index, model, i, model->GetTypeAt(i), height); | 1260 parent, menu_index, model, i, model->GetTypeAt(i), height); |
| 1251 | 1261 |
| 1252 if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) | 1262 if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) |
| 1253 PopulateMenu(item, model->GetSubmenuModelAt(i)); | 1263 PopulateMenu(item, model->GetSubmenuModelAt(i)); |
| 1254 | 1264 |
| 1255 switch (model->GetCommandIdAt(i)) { | 1265 switch (model->GetCommandIdAt(i)) { |
| 1266 case IDC_EXTENSIONS_OVERFLOW_MENU: |
| 1267 if (height > 0) |
| 1268 item->AddChildView(extension_toolbar_menu_view.release()); |
| 1269 else |
| 1270 item->SetVisible(false); |
| 1271 break; |
| 1256 case IDC_CUT: | 1272 case IDC_CUT: |
| 1257 DCHECK_EQ(MenuModel::TYPE_COMMAND, model->GetTypeAt(i)); | 1273 DCHECK_EQ(MenuModel::TYPE_COMMAND, model->GetTypeAt(i)); |
| 1258 DCHECK_LT(i + 2, max); | 1274 DCHECK_LT(i + 2, max); |
| 1259 DCHECK_EQ(IDC_COPY, model->GetCommandIdAt(i + 1)); | 1275 DCHECK_EQ(IDC_COPY, model->GetCommandIdAt(i + 1)); |
| 1260 DCHECK_EQ(IDC_PASTE, model->GetCommandIdAt(i + 2)); | 1276 DCHECK_EQ(IDC_PASTE, model->GetCommandIdAt(i + 2)); |
| 1261 item->SetTitle(l10n_util::GetStringUTF16(IDS_EDIT2)); | 1277 item->SetTitle(l10n_util::GetStringUTF16(IDS_EDIT2)); |
| 1262 item->AddChildView(new CutCopyPasteView(this, model, | 1278 item->AddChildView(new CutCopyPasteView(this, model, |
| 1263 i, i + 1, i + 2)); | 1279 i, i + 1, i + 2)); |
| 1264 i += 2; | 1280 i += 2; |
| 1265 break; | 1281 break; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1319 } | 1335 } |
| 1320 command_id_to_entry_[command_id].first = model; | 1336 command_id_to_entry_[command_id].first = model; |
| 1321 command_id_to_entry_[command_id].second = model_index; | 1337 command_id_to_entry_[command_id].second = model_index; |
| 1322 } | 1338 } |
| 1323 | 1339 |
| 1324 MenuItemView* menu_item = NULL; | 1340 MenuItemView* menu_item = NULL; |
| 1325 if (height > 0) { | 1341 if (height > 0) { |
| 1326 // For menu items with a special menu height we use our special class to be | 1342 // For menu items with a special menu height we use our special class to be |
| 1327 // able to modify the item height. | 1343 // able to modify the item height. |
| 1328 menu_item = new ButtonContainerMenuItemView(parent, command_id, height); | 1344 menu_item = new ButtonContainerMenuItemView(parent, command_id, height); |
| 1345 if (!parent->GetSubmenu()) |
| 1346 parent->CreateSubmenu(); |
| 1329 parent->GetSubmenu()->AddChildViewAt(menu_item, menu_index); | 1347 parent->GetSubmenu()->AddChildViewAt(menu_item, menu_index); |
| 1330 } else { | 1348 } else { |
| 1331 // For all other cases we use the more generic way to add menu items. | 1349 // For all other cases we use the more generic way to add menu items. |
| 1332 menu_item = views::MenuModelAdapter::AddMenuItemFromModelAt( | 1350 menu_item = views::MenuModelAdapter::AddMenuItemFromModelAt( |
| 1333 model, model_index, parent, menu_index, command_id); | 1351 model, model_index, parent, menu_index, command_id); |
| 1334 } | 1352 } |
| 1335 | 1353 |
| 1336 if (menu_item) { | 1354 if (menu_item) { |
| 1337 // Flush all buttons to the right side of the menu for the new menu type. | 1355 // Flush all buttons to the right side of the menu for the new menu type. |
| 1338 menu_item->set_use_right_margin(!use_new_menu_); | 1356 menu_item->set_use_right_margin(!use_new_menu_); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1380 0, | 1398 0, |
| 1381 BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS, | 1399 BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS, |
| 1382 BOOKMARK_LAUNCH_LOCATION_WRENCH_MENU); | 1400 BOOKMARK_LAUNCH_LOCATION_WRENCH_MENU); |
| 1383 } | 1401 } |
| 1384 | 1402 |
| 1385 int WrenchMenu::ModelIndexFromCommandId(int command_id) const { | 1403 int WrenchMenu::ModelIndexFromCommandId(int command_id) const { |
| 1386 CommandIDToEntry::const_iterator ix = command_id_to_entry_.find(command_id); | 1404 CommandIDToEntry::const_iterator ix = command_id_to_entry_.find(command_id); |
| 1387 DCHECK(ix != command_id_to_entry_.end()); | 1405 DCHECK(ix != command_id_to_entry_.end()); |
| 1388 return ix->second.second; | 1406 return ix->second.second; |
| 1389 } | 1407 } |
| OLD | NEW |