summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authormsw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-29 00:39:05 +0000
committermsw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-29 00:39:05 +0000
commit34338254f776be94d79ca184c4eb2ea5b3f62318 (patch)
treea20d913935cfe06590e6a39808234774e35e3ff8 /views
parent7bd801611073a0e79a011a96ec72cb201656344a (diff)
downloadchromium_src-34338254f776be94d79ca184c4eb2ea5b3f62318.zip
chromium_src-34338254f776be94d79ca184c4eb2ea5b3f62318.tar.gz
chromium_src-34338254f776be94d79ca184c4eb2ea5b3f62318.tar.bz2
Disambiguate OnMouseCaptureLost from OnMouseReleased.
Nix RenderWidgetHostViewViews' OnMouseCaptureLost forwarding. Consolidate code, remove unnecessary overrides, etc. Fix up test, |event| args, OVERRIDEs, and (c) dates. BUG=72040 TEST=Views mouse button release, cancelling mouse down/drag. Review URL: http://codereview.chromium.org/6685069 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@79640 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r--views/controls/button/button_dropdown.cc13
-rw-r--r--views/controls/button/button_dropdown.h4
-rw-r--r--views/controls/button/checkbox.cc10
-rw-r--r--views/controls/button/checkbox.h3
-rw-r--r--views/controls/button/custom_button.cc13
-rw-r--r--views/controls/button/custom_button.h3
-rw-r--r--views/controls/button/image_button.h6
-rw-r--r--views/controls/button/menu_button.cc8
-rw-r--r--views/controls/button/menu_button.h2
-rw-r--r--views/controls/button/radio_button.cc12
-rw-r--r--views/controls/button/radio_button.h8
-rw-r--r--views/controls/link.cc41
-rw-r--r--views/controls/link.h10
-rw-r--r--views/controls/menu/menu_controller.cc33
-rw-r--r--views/controls/menu/menu_controller.h8
-rw-r--r--views/controls/menu/menu_host_root_view.cc33
-rw-r--r--views/controls/menu/menu_host_root_view.h10
-rw-r--r--views/controls/resize_area.cc11
-rw-r--r--views/controls/resize_area.h6
-rw-r--r--views/controls/scrollbar/bitmap_scroll_bar.cc36
-rw-r--r--views/controls/scrollbar/bitmap_scroll_bar.h3
-rw-r--r--views/controls/single_split_view.cc6
-rw-r--r--views/controls/single_split_view.h4
-rw-r--r--views/controls/single_split_view_unittest.cc13
-rw-r--r--views/controls/textfield/native_textfield_views.cc18
-rw-r--r--views/controls/textfield/native_textfield_views.h10
-rw-r--r--views/focus/accelerator_handler_touch.cc4
-rw-r--r--views/touchui/gesture_manager.cc4
-rw-r--r--views/view.cc13
-rw-r--r--views/view.h11
-rw-r--r--views/view_unittest.cc16
-rw-r--r--views/widget/root_view.cc31
-rw-r--r--views/widget/root_view.h7
-rw-r--r--views/widget/widget_gtk.cc4
-rw-r--r--views/widget/widget_win.cc4
35 files changed, 205 insertions, 213 deletions
diff --git a/views/controls/button/button_dropdown.cc b/views/controls/button/button_dropdown.cc
index c2da598..7afdbd5 100644
--- a/views/controls/button/button_dropdown.cc
+++ b/views/controls/button/button_dropdown.cc
@@ -73,17 +73,12 @@ bool ButtonDropDown::OnMouseDragged(const MouseEvent& event) {
return result;
}
-void ButtonDropDown::OnMouseReleased(const MouseEvent& event, bool canceled) {
- // Showing the drop down results in a MouseReleased with a canceled drag, we
- // need to ignore it.
- if (!canceled && (IsTriggerableEvent(event) ||
- (event.IsRightMouseButton() && !HitTest(event.location())))) {
- ImageButton::OnMouseReleased(event, canceled);
+void ButtonDropDown::OnMouseReleased(const MouseEvent& event) {
+ if (IsTriggerableEvent(event) ||
+ (event.IsRightMouseButton() && !HitTest(event.location()))) {
+ ImageButton::OnMouseReleased(event);
}
- if (canceled)
- return;
-
if (IsTriggerableEvent(event))
show_menu_factory_.RevokeAll();
diff --git a/views/controls/button/button_dropdown.h b/views/controls/button/button_dropdown.h
index 0a62584..9e8785c 100644
--- a/views/controls/button/button_dropdown.h
+++ b/views/controls/button/button_dropdown.h
@@ -28,7 +28,9 @@ class ButtonDropDown : public ImageButton {
// Overridden from views::View
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
+ // Showing the drop down results in a MouseCaptureLost, we need to ignore it.
+ virtual void OnMouseCaptureLost() OVERRIDE {}
virtual void OnMouseExited(const MouseEvent& event) OVERRIDE;
// Display the right-click menu, as triggered by the keyboard, for instance.
// Using the member function ShowDropDownMenu for the actual display.
diff --git a/views/controls/button/checkbox.cc b/views/controls/button/checkbox.cc
index 693e282..0cb01f6 100644
--- a/views/controls/button/checkbox.cc
+++ b/views/controls/button/checkbox.cc
@@ -131,14 +131,18 @@ bool Checkbox::OnMouseDragged(const MouseEvent& event) {
return false;
}
-void Checkbox::OnMouseReleased(const MouseEvent& event, bool canceled) {
- native_wrapper_->SetPushed(false);
- if (!canceled && HitTestLabel(event)) {
+void Checkbox::OnMouseReleased(const MouseEvent& event) {
+ OnMouseCaptureLost();
+ if (HitTestLabel(event)) {
SetChecked(!checked());
ButtonPressed();
}
}
+void Checkbox::OnMouseCaptureLost() {
+ native_wrapper_->SetPushed(false);
+}
+
void Checkbox::OnMouseMoved(const MouseEvent& event) {
native_wrapper_->SetPushed(HitTestLabel(event));
}
diff --git a/views/controls/button/checkbox.h b/views/controls/button/checkbox.h
index 19491e9..4451217 100644
--- a/views/controls/button/checkbox.h
+++ b/views/controls/button/checkbox.h
@@ -49,7 +49,8 @@ class Checkbox : public NativeButton {
virtual std::string GetClassName() const OVERRIDE;
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
virtual void OnMouseMoved(const MouseEvent& event) OVERRIDE;
virtual void OnMouseEntered(const MouseEvent& event) OVERRIDE;
virtual void OnMouseExited(const MouseEvent& event) OVERRIDE;
diff --git a/views/controls/button/custom_button.cc b/views/controls/button/custom_button.cc
index 5f8e82e..55acba8 100644
--- a/views/controls/button/custom_button.cc
+++ b/views/controls/button/custom_button.cc
@@ -129,9 +129,8 @@ bool CustomButton::OnMouseDragged(const MouseEvent& event) {
return true;
}
-void CustomButton::OnMouseReleased(const MouseEvent& event, bool canceled) {
- // Starting a drag results in a MouseReleased, we need to ignore it.
- if ((state_ == BS_DISABLED) || InDrag())
+void CustomButton::OnMouseReleased(const MouseEvent& event) {
+ if (state_ == BS_DISABLED)
return;
if (!HitTest(event.location())) {
@@ -140,13 +139,19 @@ void CustomButton::OnMouseReleased(const MouseEvent& event, bool canceled) {
}
SetState(BS_HOT);
- if (!canceled && IsTriggerableEvent(event)) {
+ if (IsTriggerableEvent(event)) {
NotifyClick(event);
// NOTE: We may be deleted at this point (by the listener's notification
// handler).
}
}
+void CustomButton::OnMouseCaptureLost() {
+ // Starting a drag results in a MouseCaptureLost, we need to ignore it.
+ if (state_ != BS_DISABLED && !InDrag())
+ SetState(BS_NORMAL);
+}
+
void CustomButton::OnMouseEntered(const MouseEvent& event) {
if (state_ != BS_DISABLED)
SetState(BS_HOT);
diff --git a/views/controls/button/custom_button.h b/views/controls/button/custom_button.h
index 8b4008c..b898483 100644
--- a/views/controls/button/custom_button.h
+++ b/views/controls/button/custom_button.h
@@ -80,7 +80,8 @@ class CustomButton : public Button,
virtual std::string GetClassName() const OVERRIDE;
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
virtual void OnMouseEntered(const MouseEvent& event) OVERRIDE;
virtual void OnMouseExited(const MouseEvent& event) OVERRIDE;
virtual void OnMouseMoved(const MouseEvent& event) OVERRIDE;
diff --git a/views/controls/button/image_button.h b/views/controls/button/image_button.h
index 7ac6a29..1b09d5f 100644
--- a/views/controls/button/image_button.h
+++ b/views/controls/button/image_button.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -43,8 +43,8 @@ class ImageButton : public CustomButton {
VerticalAlignment v_align);
// Overridden from View:
- virtual gfx::Size GetPreferredSize();
- virtual void OnPaint(gfx::Canvas* canvas);
+ virtual gfx::Size GetPreferredSize() OVERRIDE;
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
// Sets preferred size, so it could be correctly positioned in layout even if
// it is NULL.
diff --git a/views/controls/button/menu_button.cc b/views/controls/button/menu_button.cc
index 3ada964..3451434 100644
--- a/views/controls/button/menu_button.cc
+++ b/views/controls/button/menu_button.cc
@@ -198,17 +198,17 @@ bool MenuButton::OnMousePressed(const MouseEvent& event) {
return true;
}
-void MenuButton::OnMouseReleased(const MouseEvent& event, bool canceled) {
+void MenuButton::OnMouseReleased(const MouseEvent& event) {
// Explicitly test for left mouse button to show the menu. If we tested for
// !IsTriggerableEvent it could lead to a situation where we end up showing
// the menu and context menu (this would happen if the right button is not
// triggerable and there's a context menu).
if (GetDragOperations(event.location()) != ui::DragDropTypes::DRAG_NONE &&
- state() != BS_DISABLED && !canceled && !InDrag() &&
- event.IsOnlyLeftMouseButton() && HitTest(event.location())) {
+ state() != BS_DISABLED && !InDrag() && event.IsOnlyLeftMouseButton() &&
+ HitTest(event.location())) {
Activate();
} else {
- TextButton::OnMouseReleased(event, canceled);
+ TextButton::OnMouseReleased(event);
}
}
diff --git a/views/controls/button/menu_button.h b/views/controls/button/menu_button.h
index b564b1c..edab18b 100644
--- a/views/controls/button/menu_button.h
+++ b/views/controls/button/menu_button.h
@@ -55,7 +55,7 @@ class MenuButton : public TextButton {
virtual gfx::Size GetPreferredSize() OVERRIDE;
virtual std::string GetClassName() const OVERRIDE;
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
virtual void OnMouseExited(const MouseEvent& event) OVERRIDE;
virtual bool OnKeyPressed(const KeyEvent& event) OVERRIDE;
virtual bool OnKeyReleased(const KeyEvent& event) OVERRIDE;
diff --git a/views/controls/button/radio_button.cc b/views/controls/button/radio_button.cc
index f162f2c..46133be 100644
--- a/views/controls/button/radio_button.cc
+++ b/views/controls/button/radio_button.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -87,13 +87,17 @@ bool RadioButton::IsGroupFocusTraversable() const {
return false;
}
-void RadioButton::OnMouseReleased(const MouseEvent& event, bool canceled) {
- native_wrapper_->SetPushed(false);
+void RadioButton::OnMouseReleased(const MouseEvent& event) {
// Set the checked state to true only if we are unchecked, since we can't
// be toggled on and off like a checkbox.
- if (!checked() && !canceled && HitTestLabel(event))
+ if (!checked() && HitTestLabel(event))
SetChecked(true);
+ OnMouseCaptureLost();
+}
+
+void RadioButton::OnMouseCaptureLost() {
+ native_wrapper_->SetPushed(false);
ButtonPressed();
}
diff --git a/views/controls/button/radio_button.h b/views/controls/button/radio_button.h
index 5ff6f76..7df8387 100644
--- a/views/controls/button/radio_button.h
+++ b/views/controls/button/radio_button.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -28,15 +28,15 @@ class RadioButton : public Checkbox {
virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
virtual View* GetSelectedViewForGroup(int group_id) OVERRIDE;
virtual bool IsGroupFocusTraversable() const OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled)
- OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
protected:
// Overridden from View:
virtual std::string GetClassName() const OVERRIDE;
// Overridden from NativeButton:
- virtual NativeButtonWrapper* CreateWrapper();
+ virtual NativeButtonWrapper* CreateWrapper() OVERRIDE;
private:
friend class NativeRadioButtonGtk;
diff --git a/views/controls/link.cc b/views/controls/link.cc
index c6e22f1..0112952 100644
--- a/views/controls/link.cc
+++ b/views/controls/link.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -97,38 +97,41 @@ const LinkController* Link::GetController() {
return controller_;
}
-bool Link::OnMousePressed(const MouseEvent& e) {
- if (!enabled_ || (!e.IsLeftMouseButton() && !e.IsMiddleMouseButton()))
+bool Link::OnMousePressed(const MouseEvent& event) {
+ if (!enabled_ || (!event.IsLeftMouseButton() && !event.IsMiddleMouseButton()))
return false;
SetHighlighted(true);
return true;
}
-bool Link::OnMouseDragged(const MouseEvent& e) {
+bool Link::OnMouseDragged(const MouseEvent& event) {
SetHighlighted(enabled_ &&
- (e.IsLeftMouseButton() || e.IsMiddleMouseButton()) &&
- HitTest(e.location()));
+ (event.IsLeftMouseButton() || event.IsMiddleMouseButton()) &&
+ HitTest(event.location()));
return true;
}
-void Link::OnMouseReleased(const MouseEvent& e, bool canceled) {
+void Link::OnMouseReleased(const MouseEvent& event) {
// Change the highlight first just in case this instance is deleted
// while calling the controller
- SetHighlighted(false);
- if (enabled_ && !canceled &&
- (e.IsLeftMouseButton() || e.IsMiddleMouseButton()) &&
- HitTest(e.location())) {
+ OnMouseCaptureLost();
+ if (enabled_ && (event.IsLeftMouseButton() || event.IsMiddleMouseButton()) &&
+ HitTest(event.location())) {
// Focus the link on click.
RequestFocus();
if (controller_)
- controller_->LinkActivated(this, e.flags());
+ controller_->LinkActivated(this, event.flags());
}
}
-bool Link::OnKeyPressed(const KeyEvent& e) {
- bool activate = ((e.key_code() == ui::VKEY_SPACE) ||
- (e.key_code() == ui::VKEY_RETURN));
+void Link::OnMouseCaptureLost() {
+ SetHighlighted(false);
+}
+
+bool Link::OnKeyPressed(const KeyEvent& event) {
+ bool activate = ((event.key_code() == ui::VKEY_SPACE) ||
+ (event.key_code() == ui::VKEY_RETURN));
if (!activate)
return false;
@@ -138,15 +141,15 @@ bool Link::OnKeyPressed(const KeyEvent& e) {
RequestFocus();
if (controller_)
- controller_->LinkActivated(this, e.flags());
+ controller_->LinkActivated(this, event.flags());
return true;
}
-bool Link::SkipDefaultKeyEventProcessing(const KeyEvent& e) {
+bool Link::SkipDefaultKeyEventProcessing(const KeyEvent& event) {
// Make sure we don't process space or enter as accelerators.
- return (e.key_code() == ui::VKEY_SPACE) ||
- (e.key_code() == ui::VKEY_RETURN);
+ return (event.key_code() == ui::VKEY_SPACE) ||
+ (event.key_code() == ui::VKEY_RETURN);
}
void Link::GetAccessibleState(ui::AccessibleViewState* state) {
diff --git a/views/controls/link.h b/views/controls/link.h
index e616317..7bdfe7a 100644
--- a/views/controls/link.h
+++ b/views/controls/link.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -48,10 +48,10 @@ class Link : public Label {
// Overridden from View:
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event,
- bool canceled) OVERRIDE;
- virtual bool OnKeyPressed(const KeyEvent& e) OVERRIDE;
- virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& e) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
+ virtual bool OnKeyPressed(const KeyEvent& event) OVERRIDE;
+ virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& event) OVERRIDE;
virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Overridden from Label:
diff --git a/views/controls/menu/menu_controller.cc b/views/controls/menu/menu_controller.cc
index 4e9ba38..59ba744 100644
--- a/views/controls/menu/menu_controller.cc
+++ b/views/controls/menu/menu_controller.cc
@@ -377,7 +377,7 @@ void MenuController::Cancel(ExitType type) {
MenuItemView* selected = state_.item;
exit_type_ = type;
- SendMouseReleaseToActiveView();
+ SendMouseCaptureLostToActiveView();
// Hide windows immediately.
SetSelection(NULL, SELECTION_UPDATE_IMMEDIATELY | SELECTION_EXIT);
@@ -518,7 +518,7 @@ void MenuController::OnMouseReleased(SubmenuView* source,
// If we open a context menu just return now
if (part.menu->GetDelegate()->ShowContextMenu(
part.menu, part.menu->GetCommand(), loc, true)) {
- SendMouseReleaseToActiveView(source, event, true);
+ SendMouseCaptureLostToActiveView();
return;
}
}
@@ -530,7 +530,7 @@ void MenuController::OnMouseReleased(SubmenuView* source,
!(part.menu->HasSubmenu() &&
(event.flags() == ui::EF_LEFT_BUTTON_DOWN))) {
if (active_mouse_view_) {
- SendMouseReleaseToActiveView(source, event, false);
+ SendMouseReleaseToActiveView(source, event);
return;
}
if (part.menu->GetDelegate()->IsTriggerableEvent(event)) {
@@ -542,7 +542,7 @@ void MenuController::OnMouseReleased(SubmenuView* source,
SetSelection(part.menu ? part.menu : state_.item,
SELECTION_OPEN_SUBMENU | SELECTION_UPDATE_IMMEDIATELY);
}
- SendMouseReleaseToActiveView(source, event, true);
+ SendMouseCaptureLostToActiveView();
}
void MenuController::OnMouseMoved(SubmenuView* source,
@@ -1796,12 +1796,7 @@ void MenuController::UpdateActiveMouseView(SubmenuView* event_source,
target = NULL;
}
if (target != active_mouse_view_) {
- if (active_mouse_view_) {
- // TODO(msw): Revise api and uses with OnMouseCaptureLost (like ui/views).
- // Send a mouse release with cancel set to true.
- active_mouse_view_->OnMouseReleased(event, true);
- active_mouse_view_ = NULL;
- }
+ SendMouseCaptureLostToActiveView();
active_mouse_view_ = target;
if (active_mouse_view_) {
gfx::Point target_point(target_menu_loc);
@@ -1828,8 +1823,7 @@ void MenuController::UpdateActiveMouseView(SubmenuView* event_source,
}
void MenuController::SendMouseReleaseToActiveView(SubmenuView* event_source,
- const MouseEvent& event,
- bool cancel) {
+ const MouseEvent& event) {
if (!active_mouse_view_)
return;
@@ -1839,23 +1833,22 @@ void MenuController::SendMouseReleaseToActiveView(SubmenuView* event_source,
View::ConvertPointToView(NULL, active_mouse_view_, &target_loc);
MouseEvent release_event(ui::ET_MOUSE_RELEASED, target_loc.x(),
target_loc.y(), event.flags());
- // Reset the active_mouse_view_ before sending mouse released. That way if if
- // calls back to use we aren't in a weird state.
+ // Reset the active_mouse_view_ before sending mouse released. That way if it
+ // calls back to us, we aren't in a weird state.
View* active_view = active_mouse_view_;
active_mouse_view_ = NULL;
- active_view->OnMouseReleased(release_event, cancel);
+ active_view->OnMouseReleased(release_event);
}
-void MenuController::SendMouseReleaseToActiveView() {
+void MenuController::SendMouseCaptureLostToActiveView() {
if (!active_mouse_view_)
return;
- MouseEvent release_event(ui::ET_MOUSE_RELEASED, -1, -1, 0);
- // Reset the active_mouse_view_ before sending mouse released. That way if if
- // calls back to use we aren't in a weird state.
+ // Reset the active_mouse_view_ before sending mouse capture lost. That way if
+ // it calls back to us, we aren't in a weird state.
View* active_view = active_mouse_view_;
active_mouse_view_ = NULL;
- active_view->OnMouseReleased(release_event, true);
+ active_view->OnMouseCaptureLost();
}
} // namespace views
diff --git a/views/controls/menu/menu_controller.h b/views/controls/menu/menu_controller.h
index 8458a30..177a460 100644
--- a/views/controls/menu/menu_controller.h
+++ b/views/controls/menu/menu_controller.h
@@ -394,11 +394,11 @@ class MenuController : public MessageLoopForUI::Dispatcher {
// Sends a mouse release event to the current |active_mouse_view_| and sets
// it to null.
void SendMouseReleaseToActiveView(SubmenuView* event_source,
- const MouseEvent& event,
- bool cancel);
+ const MouseEvent& event);
- // Variant of above that sends a cancel mouse release.
- void SendMouseReleaseToActiveView();
+ // Sends a mouse capture lost event to the current |active_mouse_view_| and
+ // sets it to null.
+ void SendMouseCaptureLostToActiveView();
// The active instance.
static MenuController* active_instance_;
diff --git a/views/controls/menu/menu_host_root_view.cc b/views/controls/menu/menu_host_root_view.cc
index 0372261..dee5472 100644
--- a/views/controls/menu/menu_host_root_view.cc
+++ b/views/controls/menu/menu_host_root_view.cc
@@ -13,14 +13,10 @@ MenuHostRootView::MenuHostRootView(Widget* widget,
SubmenuView* submenu)
: RootView(widget),
submenu_(submenu),
- forward_drag_to_menu_controller_(true),
- suspend_events_(false) {
+ forward_drag_to_menu_controller_(true) {
}
bool MenuHostRootView::OnMousePressed(const MouseEvent& event) {
- if (suspend_events_)
- return true;
-
forward_drag_to_menu_controller_ =
((event.x() < 0 || event.y() < 0 || event.x() >= width() ||
event.y() >= height()) ||
@@ -31,9 +27,6 @@ bool MenuHostRootView::OnMousePressed(const MouseEvent& event) {
}
bool MenuHostRootView::OnMouseDragged(const MouseEvent& event) {
- if (suspend_events_)
- return true;
-
if (forward_drag_to_menu_controller_ && GetMenuController()) {
GetMenuController()->OnMouseDragged(submenu_, event);
return true;
@@ -41,38 +34,20 @@ bool MenuHostRootView::OnMouseDragged(const MouseEvent& event) {
return RootView::OnMouseDragged(event);
}
-void MenuHostRootView::OnMouseReleased(const MouseEvent& event,
- bool canceled) {
- if (suspend_events_)
- return;
-
- RootView::OnMouseReleased(event, canceled);
+void MenuHostRootView::OnMouseReleased(const MouseEvent& event) {
+ RootView::OnMouseReleased(event);
if (forward_drag_to_menu_controller_ && GetMenuController()) {
forward_drag_to_menu_controller_ = false;
- if (canceled) {
- GetMenuController()->Cancel(MenuController::EXIT_ALL);
- } else {
- GetMenuController()->OnMouseReleased(submenu_, event);
- }
+ GetMenuController()->OnMouseReleased(submenu_, event);
}
}
void MenuHostRootView::OnMouseMoved(const MouseEvent& event) {
- if (suspend_events_)
- return;
-
RootView::OnMouseMoved(event);
if (GetMenuController())
GetMenuController()->OnMouseMoved(submenu_, event);
}
-void MenuHostRootView::OnMouseExited(const MouseEvent& event) {
- if (suspend_events_)
- return;
-
- RootView::OnMouseExited(event);
-}
-
bool MenuHostRootView::OnMouseWheel(const MouseWheelEvent& event) {
#if defined(OS_LINUX)
// ChromeOS uses MenuController to forward events like other
diff --git a/views/controls/menu/menu_host_root_view.h b/views/controls/menu/menu_host_root_view.h
index b8b8e34..ccd5247 100644
--- a/views/controls/menu/menu_host_root_view.h
+++ b/views/controls/menu/menu_host_root_view.h
@@ -23,15 +23,11 @@ class MenuHostRootView : public RootView {
public:
MenuHostRootView(Widget* widget, SubmenuView* submenu);
- // When invoked subsequent events are NOT forwarded to the MenuController.
- void suspend_events() { suspend_events_ = true; }
-
// Overridden from View:
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
virtual void OnMouseMoved(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseExited(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE;
private:
@@ -44,10 +40,6 @@ class MenuHostRootView : public RootView {
// Whether mouse dragged/released should be forwarded to the MenuController.
bool forward_drag_to_menu_controller_;
- // Whether events are suspended. If true, no events are forwarded to the
- // MenuController.
- bool suspend_events_;
-
DISALLOW_COPY_AND_ASSIGN(MenuHostRootView);
};
diff --git a/views/controls/resize_area.cc b/views/controls/resize_area.cc
index 0769cf9..c04a537 100644
--- a/views/controls/resize_area.cc
+++ b/views/controls/resize_area.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -70,9 +70,12 @@ bool ResizeArea::OnMouseDragged(const views::MouseEvent& event) {
return true;
}
-void ResizeArea::OnMouseReleased(const views::MouseEvent& event,
- bool canceled) {
- ReportResizeAmount(canceled ? initial_position_ : event.x(), true);
+void ResizeArea::OnMouseReleased(const views::MouseEvent& event) {
+ ReportResizeAmount(event.x(), true);
+}
+
+void ResizeArea::OnMouseCaptureLost() {
+ ReportResizeAmount(initial_position_, true);
}
void ResizeArea::GetAccessibleState(ui::AccessibleViewState* state) {
diff --git a/views/controls/resize_area.h b/views/controls/resize_area.h
index cf9bea7..6c0f66d 100644
--- a/views/controls/resize_area.h
+++ b/views/controls/resize_area.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -46,8 +46,8 @@ class ResizeArea : public View {
const gfx::Point& p) OVERRIDE;
virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled)
- OVERRIDE;
+ virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
private:
diff --git a/views/controls/scrollbar/bitmap_scroll_bar.cc b/views/controls/scrollbar/bitmap_scroll_bar.cc
index beef8c4..20a1a96 100644
--- a/views/controls/scrollbar/bitmap_scroll_bar.cc
+++ b/views/controls/scrollbar/bitmap_scroll_bar.cc
@@ -54,15 +54,18 @@ class AutorepeatButton : public ImageButton {
virtual ~AutorepeatButton() {}
protected:
- virtual bool OnMousePressed(const MouseEvent& event) {
+ virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE {
Button::NotifyClick(event);
repeater_.Start();
return true;
}
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) {
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE {
+ OnMouseCaptureLost();
+ }
+
+ virtual void OnMouseCaptureLost() OVERRIDE {
repeater_.Stop();
- View::OnMouseReleased(event, canceled);
}
private:
@@ -149,7 +152,7 @@ class BitmapScrollBarThumb : public View {
}
// View overrides:
- virtual gfx::Size GetPreferredSize() {
+ virtual gfx::Size GetPreferredSize() OVERRIDE {
return gfx::Size(background_bitmap()->width(),
start_cap_bitmap()->height() +
end_cap_bitmap()->height() +
@@ -158,7 +161,7 @@ class BitmapScrollBarThumb : public View {
protected:
// View overrides:
- virtual void Paint(gfx::Canvas* canvas) {
+ virtual void Paint(gfx::Canvas* canvas) OVERRIDE {
canvas->DrawBitmapInt(*start_cap_bitmap(), 0, 0);
int top_cap_height = start_cap_bitmap()->height();
int bottom_cap_height = end_cap_bitmap()->height();
@@ -174,22 +177,22 @@ class BitmapScrollBarThumb : public View {
canvas->DrawBitmapInt(*grippy_bitmap(), grippy_x, grippy_y);
}
- virtual void OnMouseEntered(const MouseEvent& event) {
+ virtual void OnMouseEntered(const MouseEvent& event) OVERRIDE {
SetState(CustomButton::BS_HOT);
}
- virtual void OnMouseExited(const MouseEvent& event) {
+ virtual void OnMouseExited(const MouseEvent& event) OVERRIDE {
SetState(CustomButton::BS_NORMAL);
}
- virtual bool OnMousePressed(const MouseEvent& event) {
+ virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE {
mouse_offset_ = scroll_bar_->IsHorizontal() ? event.x() : event.y();
drag_start_position_ = GetPosition();
SetState(CustomButton::BS_PUSHED);
return true;
}
- virtual bool OnMouseDragged(const MouseEvent& event) {
+ virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE {
// If the user moves the mouse more than |kScrollThumbDragOutSnap| outside
// the bounds of the thumb, the scrollbar will snap the scroll back to the
// point it was at before the drag began.
@@ -216,10 +219,12 @@ class BitmapScrollBarThumb : public View {
return true;
}
- virtual void OnMouseReleased(const MouseEvent& event,
- bool canceled) {
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE {
+ OnMouseCaptureLost();
+ }
+
+ virtual void OnMouseCaptureLost() OVERRIDE {
SetState(CustomButton::BS_HOT);
- View::OnMouseReleased(event, canceled);
}
private:
@@ -471,10 +476,13 @@ bool BitmapScrollBar::OnMousePressed(const MouseEvent& event) {
return true;
}
-void BitmapScrollBar::OnMouseReleased(const MouseEvent& event, bool canceled) {
+void BitmapScrollBar::OnMouseReleased(const MouseEvent& event) {
+ OnMouseCaptureLost();
+}
+
+void BitmapScrollBar::OnMouseCaptureLost() {
SetThumbTrackState(CustomButton::BS_NORMAL);
repeater_.Stop();
- View::OnMouseReleased(event, canceled);
}
bool BitmapScrollBar::OnKeyPressed(const KeyEvent& event) {
diff --git a/views/controls/scrollbar/bitmap_scroll_bar.h b/views/controls/scrollbar/bitmap_scroll_bar.h
index 8357fd1..833a045 100644
--- a/views/controls/scrollbar/bitmap_scroll_bar.h
+++ b/views/controls/scrollbar/bitmap_scroll_bar.h
@@ -98,7 +98,8 @@ class BitmapScrollBar : public ScrollBar,
virtual gfx::Size GetPreferredSize() OVERRIDE;
virtual void Layout() OVERRIDE;
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
virtual bool OnKeyPressed(const KeyEvent& event) OVERRIDE;
virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE;
diff --git a/views/controls/single_split_view.cc b/views/controls/single_split_view.cc
index 76e924e..d9f8912 100644
--- a/views/controls/single_split_view.cc
+++ b/views/controls/single_split_view.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -182,11 +182,11 @@ bool SingleSplitView::OnMouseDragged(const MouseEvent& event) {
return true;
}
-void SingleSplitView::OnMouseReleased(const MouseEvent& event, bool canceled) {
+void SingleSplitView::OnMouseCaptureLost() {
if (child_count() < 2)
return;
- if (canceled && drag_info_.initial_divider_offset != divider_offset_) {
+ if (drag_info_.initial_divider_offset != divider_offset_) {
set_divider_offset(drag_info_.initial_divider_offset);
if (!observer_ || observer_->SplitHandleMoved(this))
Layout();
diff --git a/views/controls/single_split_view.h b/views/controls/single_split_view.h
index de4ccf5..63fd702 100644
--- a/views/controls/single_split_view.h
+++ b/views/controls/single_split_view.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -80,7 +80,7 @@ class SingleSplitView : public views::View {
// View overrides.
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
private:
diff --git a/views/controls/single_split_view_unittest.cc b/views/controls/single_split_view_unittest.cc
index 65fbb00..f880528 100644
--- a/views/controls/single_split_view_unittest.cc
+++ b/views/controls/single_split_view_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -133,9 +133,9 @@ TEST(SingleSplitViewTest, MouseDrag) {
ON_CALL(observer, SplitHandleMoved(_))
.WillByDefault(Return(true));
- // SplitHandleMoved is expected to be called once for every mouse move.
+ // SplitHandleMoved is called for two mouse moves and one mouse capture loss.
EXPECT_CALL(observer, SplitHandleMoved(_))
- .Times(2);
+ .Times(3);
split.SetBounds(0, 0, 10, 100);
const int kInitialDividerOffset = 33;
@@ -166,9 +166,14 @@ TEST(SingleSplitViewTest, MouseDrag) {
MouseEvent mouse_released(
ui::ET_MOUSE_RELEASED, 7,
kInitialDividerOffset + kMouseOffset + kMouseMoveDelta * 2, 0);
- split.OnMouseReleased(mouse_released, false);
+ split.OnMouseReleased(mouse_released);
EXPECT_EQ(kInitialDividerOffset + kMouseMoveDelta * 2,
split.divider_offset());
+
+ // Expect intial offset after a system/user gesture cancels the drag.
+ // This shouldn't occur after mouse release, but it's sufficient for testing.
+ split.OnMouseCaptureLost();
+ EXPECT_EQ(kInitialDividerOffset, split.divider_offset());
}
} // namespace views
diff --git a/views/controls/textfield/native_textfield_views.cc b/views/controls/textfield/native_textfield_views.cc
index 48bdea9..e1b8ccc 100644
--- a/views/controls/textfield/native_textfield_views.cc
+++ b/views/controls/textfield/native_textfield_views.cc
@@ -85,17 +85,17 @@ NativeTextfieldViews::~NativeTextfieldViews() {
////////////////////////////////////////////////////////////////////////////////
// NativeTextfieldViews, View overrides:
-bool NativeTextfieldViews::OnMousePressed(const views::MouseEvent& e) {
+bool NativeTextfieldViews::OnMousePressed(const views::MouseEvent& event) {
OnBeforeUserAction();
- if (HandleMousePressed(e))
+ if (HandleMousePressed(event))
SchedulePaint();
OnAfterUserAction();
return true;
}
-bool NativeTextfieldViews::OnMouseDragged(const views::MouseEvent& e) {
+bool NativeTextfieldViews::OnMouseDragged(const views::MouseEvent& event) {
OnBeforeUserAction();
- size_t pos = FindCursorPosition(e.location());
+ size_t pos = FindCursorPosition(event.location());
if (model_->MoveCursorTo(pos, true)) {
UpdateCursorBoundsAndTextOffset();
SchedulePaint();
@@ -104,18 +104,14 @@ bool NativeTextfieldViews::OnMouseDragged(const views::MouseEvent& e) {
return true;
}
-void NativeTextfieldViews::OnMouseReleased(const views::MouseEvent& e,
- bool canceled) {
-}
-
-bool NativeTextfieldViews::OnKeyPressed(const views::KeyEvent& e) {
+bool NativeTextfieldViews::OnKeyPressed(const views::KeyEvent& event) {
// OnKeyPressed/OnKeyReleased/OnFocus/OnBlur will never be invoked on
// NativeTextfieldViews as it will never gain focus.
NOTREACHED();
return false;
}
-bool NativeTextfieldViews::OnKeyReleased(const views::KeyEvent& e) {
+bool NativeTextfieldViews::OnKeyReleased(const views::KeyEvent& event) {
NOTREACHED();
return false;
}
@@ -470,7 +466,7 @@ void NativeTextfieldViews::UpdateCursorBoundsAndTextOffset() {
} else if (x_left < 0) {
// when the cursor overflows to the left
text_offset_ = -cursor_bounds_.x();
- } else if(full_width > width && text_offset_ + full_width < width) {
+ } else if (full_width > width && text_offset_ + full_width < width) {
// when the cursor moves within the textfield with the text
// longer than the field.
text_offset_ = width - full_width;
diff --git a/views/controls/textfield/native_textfield_views.h b/views/controls/textfield/native_textfield_views.h
index 7cc8317f..c91281b 100644
--- a/views/controls/textfield/native_textfield_views.h
+++ b/views/controls/textfield/native_textfield_views.h
@@ -47,12 +47,10 @@ class NativeTextfieldViews : public views::View,
~NativeTextfieldViews();
// views::View overrides:
- virtual bool OnMousePressed(const views::MouseEvent& e) OVERRIDE;
- virtual bool OnMouseDragged(const views::MouseEvent& e) OVERRIDE;
- virtual void OnMouseReleased(const views::MouseEvent& e,
- bool canceled) OVERRIDE;
- virtual bool OnKeyPressed(const views::KeyEvent& e) OVERRIDE;
- virtual bool OnKeyReleased(const views::KeyEvent& e) OVERRIDE;
+ virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
+ virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
+ virtual bool OnKeyPressed(const views::KeyEvent& event) OVERRIDE;
+ virtual bool OnKeyReleased(const views::KeyEvent& event) OVERRIDE;
virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
virtual void OnFocus() OVERRIDE;
virtual void OnBlur() OVERRIDE;
diff --git a/views/focus/accelerator_handler_touch.cc b/views/focus/accelerator_handler_touch.cc
index ce15c51..3755e76 100644
--- a/views/focus/accelerator_handler_touch.cc
+++ b/views/focus/accelerator_handler_touch.cc
@@ -130,7 +130,7 @@ bool DispatchX2Event(RootView* root, XEvent* xev) {
case XI_ButtonPress:
return root->OnMousePressed(mouseev);
case XI_ButtonRelease:
- root->OnMouseReleased(mouseev, false);
+ root->OnMouseReleased(mouseev);
return true;
case XI_Motion: {
if (mouseev.type() == ui::ET_MOUSE_DRAGGED) {
@@ -185,7 +185,7 @@ bool DispatchXEvent(XEvent* xev) {
if (xev->type == ButtonPress) {
return root->OnMousePressed(mouseev);
} else {
- root->OnMouseReleased(mouseev, false);
+ root->OnMouseReleased(mouseev);
return true; // Assume the event has been processed to make sure we
// don't process it twice.
}
diff --git a/views/touchui/gesture_manager.cc b/views/touchui/gesture_manager.cc
index 2442469..18efe5f 100644
--- a/views/touchui/gesture_manager.cc
+++ b/views/touchui/gesture_manager.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -52,7 +52,7 @@ bool GestureManager::ProcessTouchEventForGesture(const TouchEvent& event,
DVLOG(1) << "GestureManager::ProcessTouchEventForGesture: TouchReleased";
MouseEvent mouse_event(ui::ET_MOUSE_RELEASED, location.x(), location.y(),
event.flags());
- source->OnMouseReleased(mouse_event, false);
+ source->OnMouseReleased(mouse_event);
return true;
}
diff --git a/views/view.cc b/views/view.cc
index 6770d6d..70299cc 100644
--- a/views/view.cc
+++ b/views/view.cc
@@ -801,7 +801,10 @@ bool View::OnMouseDragged(const MouseEvent& event) {
return false;
}
-void View::OnMouseReleased(const MouseEvent& event, bool canceled) {
+void View::OnMouseReleased(const MouseEvent& event) {
+}
+
+void View::OnMouseCaptureLost() {
}
void View::OnMouseMoved(const MouseEvent& event) {
@@ -1557,18 +1560,18 @@ bool View::ProcessMouseDragged(const MouseEvent& event, DragInfo* drag_info) {
return (context_menu_controller != NULL) || possible_drag;
}
-void View::ProcessMouseReleased(const MouseEvent& event, bool canceled) {
- if (!canceled && context_menu_controller_ && event.IsOnlyRightMouseButton()) {
+void View::ProcessMouseReleased(const MouseEvent& event) {
+ if (context_menu_controller_ && event.IsOnlyRightMouseButton()) {
// Assume that if there is a context menu controller we won't be deleted
// from mouse released.
gfx::Point location(event.location());
- OnMouseReleased(event, canceled);
+ OnMouseReleased(event);
if (HitTest(location)) {
ConvertPointToScreen(this, &location);
ShowContextMenu(location, true);
}
} else {
- OnMouseReleased(event, canceled);
+ OnMouseReleased(event);
}
// WARNING: we may have been deleted.
}
diff --git a/views/view.h b/views/view.h
index 4f845dd..f34e555 100644
--- a/views/view.h
+++ b/views/view.h
@@ -621,13 +621,14 @@ class View : public AcceleratorTarget {
// This method is invoked when the user releases the mouse
// button. The event is in the receiver's coordinate system.
//
- // If canceled is true it indicates the mouse press/drag was canceled by a
- // system/user gesture.
- //
// Default implementation notifies the ContextMenuController is appropriate.
// Subclasses that wish to honor the ContextMenuController should invoke
// super.
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled);
+ virtual void OnMouseReleased(const MouseEvent& event);
+
+ // This method is invoked when the mouse press/drag was canceled by a
+ // system/user gesture.
+ virtual void OnMouseCaptureLost();
// This method is invoked when the mouse is above this control
// The event is in the receiver's coordinate system.
@@ -1230,7 +1231,7 @@ class View : public AcceleratorTarget {
// method. If a drag is detected, DoDrag is invoked.
bool ProcessMousePressed(const MouseEvent& event, DragInfo* drop_info);
bool ProcessMouseDragged(const MouseEvent& event, DragInfo* drop_info);
- void ProcessMouseReleased(const MouseEvent& event, bool canceled);
+ void ProcessMouseReleased(const MouseEvent& event);
#if defined(TOUCH_UI)
// RootView will invoke this with incoming TouchEvents. Returns the
diff --git a/views/view_unittest.cc b/views/view_unittest.cc
index 08666b5..f2791c7 100644
--- a/views/view_unittest.cc
+++ b/views/view_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -154,7 +154,7 @@ class TestView : public View {
bool is_add, View *parent, View *child) OVERRIDE;
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
#if defined(TOUCH_UI)
virtual TouchStatus OnTouchEvent(const TouchEvent& event);
#endif
@@ -354,7 +354,7 @@ bool TestView::OnMouseDragged(const MouseEvent& event) {
return true;
}
-void TestView::OnMouseReleased(const MouseEvent& event, bool canceled) {
+void TestView::OnMouseReleased(const MouseEvent& event) {
last_mouse_event_type_ = event.type();
location_.SetPoint(event.x(), event.y());
}
@@ -1475,7 +1475,7 @@ TEST_F(ButtonDropDownTest, RegularClickTest) {
MouseEvent release_event(ui::ET_MOUSE_RELEASED, 1, 1,
ui::EF_LEFT_BUTTON_DOWN);
button_as_view_->OnMousePressed(press_event);
- button_as_view_->OnMouseReleased(release_event, false);
+ button_as_view_->OnMouseReleased(release_event);
EXPECT_EQ(test_dialog_->last_pressed_button_, test_dialog_->button_drop_);
}
@@ -1750,7 +1750,7 @@ TEST_F(ViewTest, TransformEvent) {
EXPECT_EQ(10, v2->location_.y());
MouseEvent released(ui::ET_MOUSE_RELEASED, 0, 0, 0);
- root->OnMouseReleased(released, false);
+ root->OnMouseReleased(released);
// Now rotate |v2| inside |v1| clockwise.
v2->SetRotation(90.0);
@@ -1771,7 +1771,7 @@ TEST_F(ViewTest, TransformEvent) {
EXPECT_EQ(10, v2->location_.x());
EXPECT_EQ(20, v2->location_.y());
- root->OnMouseReleased(released, false);
+ root->OnMouseReleased(released);
v1->ResetTransform();
v2->ResetTransform();
@@ -1802,7 +1802,7 @@ TEST_F(ViewTest, TransformEvent) {
EXPECT_EQ(10, v3->location_.x());
EXPECT_EQ(25, v3->location_.y());
- root->OnMouseReleased(released, false);
+ root->OnMouseReleased(released);
v1->ResetTransform();
v2->ResetTransform();
@@ -1834,7 +1834,7 @@ TEST_F(ViewTest, TransformEvent) {
EXPECT_EQ(10, v3->location_.x());
EXPECT_EQ(25, v3->location_.y());
- root->OnMouseReleased(released, false);
+ root->OnMouseReleased(released);
widget->CloseNow();
}
diff --git a/views/widget/root_view.cc b/views/widget/root_view.cc
index fed3f01..aae04b7 100644
--- a/views/widget/root_view.cc
+++ b/views/widget/root_view.cc
@@ -82,15 +82,6 @@ void RootView::NotifyNativeViewHierarchyChanged(bool attached,
// Input -----------------------------------------------------------------------
-void RootView::ProcessMouseDragCanceled() {
- if (mouse_pressed_handler_) {
- // Synthesize a release event.
- MouseEvent release_event(ui::ET_MOUSE_RELEASED, last_mouse_event_x_,
- last_mouse_event_y_, last_mouse_event_flags_);
- OnMouseReleased(release_event, true);
- }
-}
-
bool RootView::ProcessKeyEvent(const KeyEvent& event) {
bool consumed = false;
@@ -261,7 +252,7 @@ bool RootView::OnMouseDragged(const MouseEvent& event) {
return false;
}
-void RootView::OnMouseReleased(const MouseEvent& event, bool canceled) {
+void RootView::OnMouseReleased(const MouseEvent& event) {
MouseEvent e(event, this);
UpdateCursor(e);
@@ -272,9 +263,23 @@ void RootView::OnMouseReleased(const MouseEvent& event, bool canceled) {
// We allow the view to delete us from ProcessMouseReleased. As such,
// configure state such that we're done first, then call View.
View* mouse_pressed_handler = mouse_pressed_handler_;
- mouse_pressed_handler_ = NULL;
- explicit_mouse_handler_ = false;
- mouse_pressed_handler->ProcessMouseReleased(mouse_released, canceled);
+ SetMouseHandler(NULL);
+ mouse_pressed_handler->ProcessMouseReleased(mouse_released);
+ // WARNING: we may have been deleted.
+ }
+}
+
+void RootView::OnMouseCaptureLost() {
+ if (mouse_pressed_handler_) {
+ // Synthesize a release event for UpdateCursor and OnMouseReleased.
+ MouseEvent release_event(ui::ET_MOUSE_RELEASED, last_mouse_event_x_,
+ last_mouse_event_y_, last_mouse_event_flags_);
+ UpdateCursor(release_event);
+ // We allow the view to delete us from OnMouseCaptureLost. As such,
+ // configure state such that we're done first, then call View.
+ View* mouse_pressed_handler = mouse_pressed_handler_;
+ SetMouseHandler(NULL);
+ mouse_pressed_handler->OnMouseCaptureLost();
// WARNING: we may have been deleted.
}
}
diff --git a/views/widget/root_view.h b/views/widget/root_view.h
index 6be5f4e..3465312 100644
--- a/views/widget/root_view.h
+++ b/views/widget/root_view.h
@@ -59,10 +59,6 @@ class RootView : public View,
// Input ---------------------------------------------------------------------
- // Invoked By the Widget if the mouse drag is interrupted by
- // the system. Invokes OnMouseReleased with a value of true for canceled.
- void ProcessMouseDragCanceled();
-
// Process a key event. Send the event to the focused view and up the focus
// path, and finally to the default keyboard handler, until someone consumes
// it. Returns whether anyone consumed the event.
@@ -106,7 +102,8 @@ class RootView : public View,
virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE;
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
virtual void OnMouseMoved(const MouseEvent& event) OVERRIDE;
virtual void OnMouseExited(const MouseEvent& event) OVERRIDE;
virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE;
diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc
index 0e07b4e..dd44ced 100644
--- a/views/widget/widget_gtk.cc
+++ b/views/widget/widget_gtk.cc
@@ -1279,7 +1279,7 @@ void WidgetGtk::HandleXGrabBroke() {
void WidgetGtk::HandleGtkGrabBroke() {
if (is_mouse_down_)
- GetRootView()->ProcessMouseDragCanceled();
+ GetRootView()->OnMouseCaptureLost();
is_mouse_down_ = false;
}
@@ -1350,7 +1350,7 @@ void WidgetGtk::ProcessMouseReleased(GdkEventButton* event) {
is_mouse_down_ = false;
// GTK generates a mouse release at the end of dnd. We need to ignore it.
if (!drag_data_)
- GetRootView()->OnMouseReleased(mouse_up, false);
+ GetRootView()->OnMouseReleased(mouse_up);
}
bool WidgetGtk::ProcessScroll(GdkEventScroll* event) {
diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc
index ebf3129..f57e43b 100644
--- a/views/widget/widget_win.cc
+++ b/views/widget/widget_win.cc
@@ -567,7 +567,7 @@ void WidgetWin::OnCancelMode() {
void WidgetWin::OnCaptureChanged(HWND hwnd) {
if (is_mouse_down_)
- GetRootView()->ProcessMouseDragCanceled();
+ GetRootView()->OnMouseCaptureLost();
is_mouse_down_ = false;
}
@@ -1024,7 +1024,7 @@ bool WidgetWin::ProcessMouseReleased(UINT message,
MSG msg;
MakeMSG(&msg, message, w_param, l_param, 0, GET_X_LPARAM(l_param),
GET_Y_LPARAM(l_param));
- GetRootView()->OnMouseReleased(MouseEvent(msg), false);
+ GetRootView()->OnMouseReleased(MouseEvent(msg));
return true;
}