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

Unified Diff: ui/views/controls/menu/menu_controller.cc

Issue 10832360: Change to address default selection of menu item (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: type check Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/menu/menu_controller.h ('k') | ui/views/controls/menu/menu_runner.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/menu/menu_controller.cc
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index 5364b83da55b3c6fe23fe56fc1c580795fee83be..58bca034606bd209e5bdbe210f5b936d10856afe 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -253,7 +253,8 @@ struct MenuController::SelectByCharDetails {
MenuController::State::State()
: item(NULL),
submenu_open(false),
- anchor(views::MenuItemView::TOPLEFT) {}
+ anchor(views::MenuItemView::TOPLEFT),
+ context_menu(false) {}
MenuController::State::~State() {}
@@ -272,6 +273,7 @@ MenuItemView* MenuController::Run(Widget* parent,
MenuItemView* root,
const gfx::Rect& bounds,
MenuItemView::AnchorPosition position,
+ bool context_menu,
int* result_mouse_event_flags) {
exit_type_ = EXIT_NONE;
possible_drag_ = false;
@@ -295,7 +297,7 @@ MenuItemView* MenuController::Run(Widget* parent,
// Reset current state.
pending_state_ = State();
state_ = State();
- UpdateInitialLocation(bounds, position);
+ UpdateInitialLocation(bounds, position, context_menu);
owner_ = parent;
@@ -1080,7 +1082,9 @@ MenuController::SendAcceleratorResultType
void MenuController::UpdateInitialLocation(
const gfx::Rect& bounds,
- MenuItemView::AnchorPosition position) {
+ MenuItemView::AnchorPosition position,
+ bool context_menu) {
+ pending_state_.context_menu = context_menu;
pending_state_.initial_bounds = bounds;
if (bounds.height() > 1) {
// Inset the bounds slightly, otherwise drag coordinates don't line up
@@ -1181,10 +1185,9 @@ bool MenuController::ShowSiblingMenu(SubmenuView* source,
// Subtract 1 from the height to make the popup flush with the button border.
UpdateInitialLocation(gfx::Rect(screen_menu_loc.x(), screen_menu_loc.y(),
button->width(), button->height() - 1),
- anchor);
+ anchor, state_.context_menu);
alt_menu->PrepareForRun(
- has_mnemonics,
- source->GetMenuItem()->GetRootMenuItem()->show_mnemonics_);
+ has_mnemonics, source->GetMenuItem()->GetRootMenuItem()->show_mnemonics_);
alt_menu->controller_ = this;
SetSelection(alt_menu, SELECTION_OPEN_SUBMENU | SELECTION_UPDATE_IMMEDIATELY);
return true;
@@ -1550,9 +1553,18 @@ gfx::Rect MenuController::CalculateMenuBounds(MenuItemView* item,
if (!item->GetParentMenuItem()) {
// First item, position relative to initial location.
x = state_.initial_bounds.x();
+
+ // Offsets for context menu prevent menu items being selected by
+ // simply opening the menu (bug 142992).
+ if (MenuConfig::instance().offset_context_menus && state_.context_menu)
+ x += 1;
+
y = state_.initial_bounds.bottom();
- if (state_.anchor == MenuItemView::TOPRIGHT)
+ if (state_.anchor == MenuItemView::TOPRIGHT) {
x = x + state_.initial_bounds.width() - pref.width();
+ if (MenuConfig::instance().offset_context_menus && state_.context_menu)
+ x -= 1;
+ }
if (!state_.monitor_bounds.IsEmpty() &&
y + pref.height() > state_.monitor_bounds.bottom()) {
@@ -1623,6 +1635,13 @@ gfx::Rect MenuController::CalculateMenuBounds(MenuItemView* item,
} else {
item->set_actual_menu_position(MenuItemView::POSITION_BELOW_BOUNDS);
}
+ if (state_.monitor_bounds.width() != 0 &&
+ MenuConfig::instance().offset_context_menus && state_.context_menu) {
+ if (x + pref.width() > state_.monitor_bounds.right())
+ x = state_.initial_bounds.x() - pref.width() - 1;
+ if (x < state_.monitor_bounds.x())
+ x = state_.monitor_bounds.x();
+ }
} else {
// Not the first menu; position it relative to the bounds of the menu
// item.
« no previous file with comments | « ui/views/controls/menu/menu_controller.h ('k') | ui/views/controls/menu/menu_runner.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698