summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authormukai@chromium.org <mukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-09 03:43:18 +0000
committermukai@chromium.org <mukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-09 03:43:18 +0000
commitdd44b6c890d06767091092b28abc481d33e2c377 (patch)
treec5c5c316cdf1abae21f314d1a55a9d3958a45951 /ui
parentd5711eb7cbe2a03e9a0b55bf81746861035a47b5 (diff)
downloadchromium_src-dd44b6c890d06767091092b28abc481d33e2c377.zip
chromium_src-dd44b6c890d06767091092b28abc481d33e2c377.tar.gz
chromium_src-dd44b6c890d06767091092b28abc481d33e2c377.tar.bz2
Refactor MenuController::SendAcceleratorToHotTrackedView() and OnKeyDown().
The space/return key handling has tri-states: 1. no hot_view: most menu items 2. menu should be closed: wrench menu cut/copy/paste 3. menu shouldn't be closed: wrench menu zoom buttons The original SendAcceleratorToHotTrackedView() only distinguishes 1 and 2-3. This CL defines an enum type to distinguish all of these three cases. BUG=107919 TEST=manually Review URL: http://codereview.chromium.org/9307100 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121171 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r--ui/views/controls/menu/menu_controller.cc36
-rw-r--r--ui/views/controls/menu/menu_controller.h17
2 files changed, 30 insertions, 23 deletions
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index 0f16a60..7850c58 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -913,13 +913,6 @@ base::MessagePumpDispatcher::DispatchStatus
if (!OnKeyDown(ui::KeyboardCodeFromNative(xev)))
return base::MessagePumpDispatcher::EVENT_QUIT;
- // OnKeyDown may have set exit_type_.
- // TODO(sky): This shouldn't be necessary if OnKeyDown returns correct
- // value for space key on edit menu. Fix OnKeyDown and remove this.
- // See crbug.com/107919.
- if (exit_type_ != EXIT_NONE)
- return base::MessagePumpDispatcher::EVENT_QUIT;
-
return SelectByChar(ui::KeyboardCodeFromNative(xev)) ?
base::MessagePumpDispatcher::EVENT_QUIT :
base::MessagePumpDispatcher::EVENT_PROCESSED;
@@ -950,11 +943,6 @@ bool MenuController::Dispatch(GdkEvent* event) {
if (!OnKeyDown(ui::WindowsKeyCodeForGdkKeyCode(event->key.keyval)))
return false;
- // OnKeyDown may have set exit_type_.
- // TODO(sky): Eliminate this. See crbug.com/107919.
- if (exit_type_ != EXIT_NONE)
- return false;
-
guint32 keycode = gdk_keyval_to_unicode(event->key.keyval);
if (keycode)
return !SelectByChar(keycode);
@@ -1005,17 +993,23 @@ bool MenuController::OnKeyDown(ui::KeyboardCode key_code) {
break;
case ui::VKEY_SPACE:
- SendAcceleratorToHotTrackedView();
+ if (SendAcceleratorToHotTrackedView() == ACCELERATOR_PROCESSED_EXIT)
+ return false;
break;
case ui::VKEY_RETURN:
if (pending_state_.item) {
if (pending_state_.item->HasSubmenu()) {
OpenSubmenuChangeSelectionIfCan();
- } else if (!SendAcceleratorToHotTrackedView() &&
- pending_state_.item->enabled()) {
- Accept(pending_state_.item, 0);
- return false;
+ } else {
+ SendAcceleratorResultType result = SendAcceleratorToHotTrackedView();
+ if (result == ACCELERATOR_NOT_PROCESSED &&
+ pending_state_.item->enabled()) {
+ Accept(pending_state_.item, 0);
+ return false;
+ } else if (result == ACCELERATOR_PROCESSED_EXIT) {
+ return false;
+ }
}
}
break;
@@ -1074,15 +1068,17 @@ MenuController::~MenuController() {
StopCancelAllTimer();
}
-bool MenuController::SendAcceleratorToHotTrackedView() {
+MenuController::SendAcceleratorResultType
+ MenuController::SendAcceleratorToHotTrackedView() {
View* hot_view = GetFirstHotTrackedView(pending_state_.item);
if (!hot_view)
- return false;
+ return ACCELERATOR_NOT_PROCESSED;
ui::Accelerator accelerator(ui::VKEY_RETURN, false, false, false);
hot_view->AcceleratorPressed(accelerator);
hot_view->SetHotTracked(true);
- return true;
+ return (exit_type_ == EXIT_NONE) ?
+ ACCELERATOR_PROCESSED : ACCELERATOR_PROCESSED_EXIT;
}
void MenuController::UpdateInitialLocation(
diff --git a/ui/views/controls/menu/menu_controller.h b/ui/views/controls/menu/menu_controller.h
index d1439b5..b48df02 100644
--- a/ui/views/controls/menu/menu_controller.h
+++ b/ui/views/controls/menu/menu_controller.h
@@ -155,6 +155,18 @@ class VIEWS_EXPORT MenuController : public MessageLoop::Dispatcher {
SELECTION_EXIT = 1 << 2,
};
+ // Result type for SendAcceleratorToHotTrackedView
+ enum SendAcceleratorResultType {
+ // Accelerator is not sent because of no hot tracked views.
+ ACCELERATOR_NOT_PROCESSED,
+
+ // Accelerator is sent to the hot tracked views.
+ ACCELERATOR_PROCESSED,
+
+ // Same as above and the accelerator causes the exit of the menu.
+ ACCELERATOR_PROCESSED_EXIT
+ };
+
// Tracks selection information.
struct State {
State();
@@ -247,9 +259,8 @@ class VIEWS_EXPORT MenuController : public MessageLoop::Dispatcher {
virtual ~MenuController();
- // If there is a hot tracked view AcceleratorPressed is invoked on it and
- // true is returned.
- bool SendAcceleratorToHotTrackedView();
+ // AcceleratorPressed is invoked on the hot tracked view if it exists.
+ SendAcceleratorResultType SendAcceleratorToHotTrackedView();
void UpdateInitialLocation(const gfx::Rect& bounds,
MenuItemView::AnchorPosition position);