Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(499)

Side by Side Diff: views/controls/menu/menu_item_view.cc

Issue 2742003: Adds support for showing accelerators in bookmark menus. (Closed)
Patch Set: Added GetAcceleratorText Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « views/controls/menu/menu_item_view.h ('k') | views/controls/menu/menu_item_view_gtk.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "views/controls/menu/menu_item_view.h" 5 #include "views/controls/menu/menu_item_view.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "gfx/canvas.h" 8 #include "gfx/canvas.h"
9 #include "grit/app_strings.h" 9 #include "grit/app_strings.h"
10 #include "views/controls/button/text_button.h"
10 #include "views/controls/menu/menu_config.h" 11 #include "views/controls/menu/menu_config.h"
11 #include "views/controls/menu/menu_controller.h" 12 #include "views/controls/menu/menu_controller.h"
12 #include "views/controls/menu/menu_separator.h" 13 #include "views/controls/menu/menu_separator.h"
13 #include "views/controls/menu/submenu_view.h" 14 #include "views/controls/menu/submenu_view.h"
14 15
15 namespace views { 16 namespace views {
16 17
17 namespace { 18 namespace {
18 19
19 // EmptyMenuMenuItem --------------------------------------------------------- 20 // EmptyMenuMenuItem ---------------------------------------------------------
20 21
21 // EmptyMenuMenuItem is used when a menu has no menu items. EmptyMenuMenuItem 22 // EmptyMenuMenuItem is used when a menu has no menu items. EmptyMenuMenuItem
22 // is itself a MenuItemView, but it uses a different ID so that it isn't 23 // is itself a MenuItemView, but it uses a different ID so that it isn't
23 // identified as a MenuItemView. 24 // identified as a MenuItemView.
24 25
25 class EmptyMenuMenuItem : public MenuItemView { 26 class EmptyMenuMenuItem : public MenuItemView {
26 public: 27 public:
27 explicit EmptyMenuMenuItem(MenuItemView* parent) : 28 explicit EmptyMenuMenuItem(MenuItemView* parent)
28 MenuItemView(parent, 0, NORMAL) { 29 : MenuItemView(parent, 0, NORMAL) {
29 SetTitle(l10n_util::GetString(IDS_APP_MENU_EMPTY_SUBMENU)); 30 SetTitle(l10n_util::GetString(IDS_APP_MENU_EMPTY_SUBMENU));
30 // Set this so that we're not identified as a normal menu item. 31 // Set this so that we're not identified as a normal menu item.
31 SetID(kEmptyMenuItemViewID); 32 SetID(kEmptyMenuItemViewID);
32 SetEnabled(false); 33 SetEnabled(false);
33 } 34 }
34 35
35 private: 36 private:
36 DISALLOW_COPY_AND_ASSIGN(EmptyMenuMenuItem); 37 DISALLOW_COPY_AND_ASSIGN(EmptyMenuMenuItem);
37 }; 38 };
38 39
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 // Child views are layed out right aligned and given the full height. To right 306 // Child views are layed out right aligned and given the full height. To right
306 // align start with the last view and progress to the first. 307 // align start with the last view and progress to the first.
307 for (int i = child_count - 1, x = width() - item_right_margin_; i >= 0; --i) { 308 for (int i = child_count - 1, x = width() - item_right_margin_; i >= 0; --i) {
308 View* child = GetChildViewAt(i); 309 View* child = GetChildViewAt(i);
309 int width = child->GetPreferredSize().width(); 310 int width = child->GetPreferredSize().width();
310 child->SetBounds(x - width, 0, width, height()); 311 child->SetBounds(x - width, 0, width, height());
311 x -= width - kChildXPadding; 312 x -= width - kChildXPadding;
312 } 313 }
313 } 314 }
314 315
316 int MenuItemView::GetAcceleratorTextWidth() {
317 std::wstring text = GetAcceleratorText();
318 return text.empty() ? 0 : MenuConfig::instance().font.GetStringWidth(text);
319 }
320
315 MenuItemView::MenuItemView(MenuItemView* parent, 321 MenuItemView::MenuItemView(MenuItemView* parent,
316 int command, 322 int command,
317 MenuItemView::Type type) { 323 MenuItemView::Type type) {
318 Init(parent, command, type, NULL); 324 Init(parent, command, type, NULL);
319 } 325 }
320 326
321 // Calculates all sizes that we can from the OS. 327 // Calculates all sizes that we can from the OS.
322 // 328 //
323 // This is invoked prior to Running a menu. 329 // This is invoked prior to Running a menu.
324 void MenuItemView::UpdateMenuPartSizes(bool has_icons) { 330 void MenuItemView::UpdateMenuPartSizes(bool has_icons) {
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 } else if (child->GetID() == EmptyMenuMenuItem::kEmptyMenuItemViewID) { 451 } else if (child->GetID() == EmptyMenuMenuItem::kEmptyMenuItemViewID) {
446 submenu_->RemoveChildView(child); 452 submenu_->RemoveChildView(child);
447 } 453 }
448 } 454 }
449 } 455 }
450 456
451 void MenuItemView::AdjustBoundsForRTLUI(gfx::Rect* rect) const { 457 void MenuItemView::AdjustBoundsForRTLUI(gfx::Rect* rect) const {
452 rect->set_x(MirroredLeftPointForRect(*rect)); 458 rect->set_x(MirroredLeftPointForRect(*rect));
453 } 459 }
454 460
461 void MenuItemView::PaintAccelerator(gfx::Canvas* canvas) {
462 std::wstring accel_text = GetAcceleratorText();
463 if (accel_text.empty())
464 return;
465
466 const gfx::Font& font = MenuConfig::instance().font;
467 int available_height = height() - GetTopMargin() - GetBottomMargin();
468 int max_accel_width =
469 parent_menu_item_->GetSubmenu()->max_accelerator_width();
470 gfx::Rect accel_bounds(width() - item_right_margin_ - max_accel_width,
471 GetTopMargin(), max_accel_width, available_height);
472 accel_bounds.set_x(MirroredLeftPointForRect(accel_bounds));
473 int flags = GetRootMenuItem()->GetDrawStringFlags() |
474 gfx::Canvas::TEXT_VALIGN_MIDDLE;
475 flags &= ~(gfx::Canvas::TEXT_ALIGN_RIGHT | gfx::Canvas::TEXT_ALIGN_LEFT);
476 if (base::i18n::IsRTL())
477 flags |= gfx::Canvas::TEXT_ALIGN_LEFT;
478 else
479 flags |= gfx::Canvas::TEXT_ALIGN_RIGHT;
480 canvas->DrawStringInt(
481 accel_text, font, TextButton::kDisabledColor, accel_bounds.x(),
482 accel_bounds.y(), accel_bounds.width(), accel_bounds.height(),
483 flags);
484 }
485
455 void MenuItemView::DestroyAllMenuHosts() { 486 void MenuItemView::DestroyAllMenuHosts() {
456 if (!HasSubmenu()) 487 if (!HasSubmenu())
457 return; 488 return;
458 489
459 submenu_->Close(); 490 submenu_->Close();
460 for (int i = 0, item_count = submenu_->GetMenuItemCount(); i < item_count; 491 for (int i = 0, item_count = submenu_->GetMenuItemCount(); i < item_count;
461 ++i) { 492 ++i) {
462 submenu_->GetMenuItemAt(i)->DestroyAllMenuHosts(); 493 submenu_->GetMenuItemAt(i)->DestroyAllMenuHosts();
463 } 494 }
464 } 495 }
(...skipping 19 matching lines...) Expand all
484 515
485 int width = 0; 516 int width = 0;
486 for (int i = 0; i < child_count; ++i) { 517 for (int i = 0; i < child_count; ++i) {
487 if (i) 518 if (i)
488 width += kChildXPadding; 519 width += kChildXPadding;
489 width += GetChildViewAt(i)->GetPreferredSize().width(); 520 width += GetChildViewAt(i)->GetPreferredSize().width();
490 } 521 }
491 return width; 522 return width;
492 } 523 }
493 524
525 std::wstring MenuItemView::GetAcceleratorText() {
526 Accelerator accelerator;
527 return (GetDelegate() &&
528 GetDelegate()->GetAccelerator(GetCommand(), &accelerator)) ?
529 accelerator.GetShortcutText() : std::wstring();
530 }
531
494 } // namespace views 532 } // namespace views
OLDNEW
« no previous file with comments | « views/controls/menu/menu_item_view.h ('k') | views/controls/menu/menu_item_view_gtk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698