15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/cursor/cursor.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/ui_base_switches_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/drag_controller.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h" 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/view_targeter.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/widget/root_view_targeter.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)typedef ui::EventDispatchDetails DispatchDetails; 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum EventType { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_ENTER, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_EXIT 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MouseEnterExitEvent : public ui::MouseEvent { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MouseEnterExitEvent(const ui::MouseEvent& event, ui::EventType type) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ui::MouseEvent(event, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<View*>(NULL), 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<View*>(NULL)) { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(type == ui::ET_MOUSE_ENTERED || 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type == ui::ET_MOUSE_EXITED); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(type); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MouseEnterExitEvent() {} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// This event handler receives events in the pre-target phase and takes care of 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// the following: 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// - Shows keyboard-triggered context menus. 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass PreEventDispatchHandler : public ui::EventHandler { 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public: 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch explicit PreEventDispatchHandler(View* owner) 61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : owner_(owner) { 62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual ~PreEventDispatchHandler() {} 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private: 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // ui::EventHandler: 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { 68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch CHECK_EQ(ui::EP_PRETARGET, event->phase()); 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (event->handled()) 70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch View* v = NULL; 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (owner_->GetFocusManager()) // Can be NULL in unittests. 74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch v = owner_->GetFocusManager()->GetFocusedView(); 75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Special case to handle keyboard-triggered context menus. 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (v && v->enabled() && ((event->key_code() == ui::VKEY_APPS) || 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch (event->key_code() == ui::VKEY_F10 && event->IsShiftDown()))) { 79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Clamp the menu location within the visible bounds of each ancestor view 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // to avoid showing the menu over a completely different view or window. 81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gfx::Point location = v->GetKeyboardContextMenuLocation(); 82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (View* parent = v->parent(); parent; parent = parent->parent()) { 83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const gfx::Rect& parent_bounds = parent->GetBoundsInScreen(); 84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch location.SetToMax(parent_bounds.origin()); 85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch location.SetToMin(parent_bounds.bottom_right()); 86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch v->ShowContextMenu(location, ui::MENU_SOURCE_KEYBOARD); 88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch event->StopPropagation(); 89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch View* owner_; 93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DISALLOW_COPY_AND_ASSIGN(PreEventDispatchHandler); 95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This event handler receives events in the post-target phase and takes care of 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// the following: 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// - Generates context menu, or initiates drag-and-drop, from gesture events. 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PostEventDispatchHandler : public ui::EventHandler { 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PostEventDispatchHandler() 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : touch_dnd_enabled_(::switches::IsTouchDragDropEnabled()) { 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~PostEventDispatchHandler() {} 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Overridden from ui::EventHandler: 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_EQ(ui::EP_POSTTARGET, event->phase()); 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (event->handled()) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) View* target = static_cast<View*>(event->target()); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Point location = event->location(); 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (touch_dnd_enabled_ && 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event->type() == ui::ET_GESTURE_LONG_PRESS && 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (!target->drag_controller() || 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target->drag_controller()->CanStartDragForView( 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target, location, location))) { 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (target->DoDrag(*event, location, 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH)) { 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event->StopPropagation(); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (target->context_menu_controller() && 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (event->type() == ui::ET_GESTURE_LONG_PRESS || 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event->type() == ui::ET_GESTURE_LONG_TAP || 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event->type() == ui::ET_GESTURE_TWO_FINGER_TAP)) { 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Point screen_location(location); 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) View::ConvertPointToScreen(target, &screen_location); 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target->ShowContextMenu(screen_location, ui::MENU_SOURCE_TOUCH); 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event->StopPropagation(); 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool touch_dnd_enabled_; 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PostEventDispatchHandler); 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char RootView::kViewClassName[] = "RootView"; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RootView, public: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creation and lifetime ------------------------------------------------------- 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RootView::RootView(Widget* widget) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : widget_(widget), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_(NULL), 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_handler_(NULL), 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_handler_(NULL), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_mouse_handler_(false), 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_flags_(0), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_x_(-1), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_y_(-1), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_handler_(NULL), 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gesture_handler_set_before_processing_(false), 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch pre_dispatch_handler_(new internal::PreEventDispatchHandler(this)), 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) post_dispatch_handler_(new internal::PostEventDispatchHandler), 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) focus_search_(this, false, false), 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_traversable_parent_(NULL), 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_traversable_parent_view_(NULL), 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) event_dispatch_target_(NULL), 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) old_dispatch_target_(NULL) { 170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AddPreTargetHandler(pre_dispatch_handler_.get()); 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddPostTargetHandler(post_dispatch_handler_.get()); 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetEventTargeter(scoped_ptr<ViewTargeter>(new RootViewTargeter(this, this))); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RootView::~RootView() { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have children remove them explicitly so to make sure a remove 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification is sent for each one of them. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_children()) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveAllChildViews(true); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tree operations ------------------------------------------------------------- 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetContentsView(View* contents_view) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(contents_view && GetWidget()->native_widget()) << 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Can't be called until after the native widget is created!"; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ContentsView must be set up _after_ the window is created so that its 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Widget pointer is valid. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(new FillLayout); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_children()) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveAllChildViews(true); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(contents_view); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a layout now, since the attached hierarchy won't be ready for the 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // containing window's bounds. Note that we call Layout directly rather than 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calling the widget's size changed handler, since the RootView's bounds may 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not have changed, which will cause the Layout not to be done otherwise. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* RootView::GetContentsView() { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return child_count() > 0 ? child_at(0) : NULL; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RootView::NotifyNativeViewHierarchyChanged() { 206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PropagateNativeViewHierarchyChanged(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Focus ----------------------------------------------------------------------- 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetFocusTraversableParent(FocusTraversable* focus_traversable) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(focus_traversable != this); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_traversable_parent_ = focus_traversable; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetFocusTraversableParentView(View* view) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_traversable_parent_view_ = view; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// System events --------------------------------------------------------------- 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::ThemeChanged() { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::PropagateThemeChanged(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::LocaleChanged() { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::PropagateLocaleChanged(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RootView, FocusTraversable implementation: 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusSearch* RootView::GetFocusSearch() { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &focus_search_; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusTraversable* RootView::GetFocusTraversableParent() { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return focus_traversable_parent_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* RootView::GetFocusTraversableParentView() { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return focus_traversable_parent_view_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// RootView, ui::EventProcessor overrides: 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ui::EventTarget* RootView::GetRootTarget() { 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return this; 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ui::EventDispatchDetails RootView::OnEventFromSource(ui::Event* event) { 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (event->IsKeyEvent()) 254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return EventProcessor::OnEventFromSource(event); 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (event->IsScrollEvent()) 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return EventProcessor::OnEventFromSource(event); 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (event->IsGestureEvent()) { 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(tdanderson): Once DispatchGestureEvent() has been removed, move 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // all of this logic into an override of a new 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // virtual method 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // EventProcessor::OnEventProcessingStarted() (which 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // returns false if no processing should take place). 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Also move the implementation of 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // PrepareEventForDispatch() into this new method. 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Then RootView::OnEventFromSource() can be removed. 2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::GestureEvent* gesture_event = event->AsGestureEvent(); 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Do not dispatch ui::ET_GESTURE_BEGIN events. 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (gesture_event->type() == ui::ET_GESTURE_BEGIN) 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return DispatchDetails(); 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Ignore ui::ET_GESTURE_END events which do not correspond to the 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // removal of the final touch point. 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (gesture_event->type() == ui::ET_GESTURE_END && 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gesture_event->details().touch_points() > 1) { 2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return DispatchDetails(); 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Ignore subsequent gesture scroll events if no handler was set for a 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // ui::ET_GESTURE_SCROLL_BEGIN event. 2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!gesture_handler_ && 2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (gesture_event->type() == ui::ET_GESTURE_SCROLL_UPDATE || 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gesture_event->type() == ui::ET_GESTURE_SCROLL_END || 2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gesture_event->type() == ui::ET_SCROLL_FLING_START)) { 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return DispatchDetails(); 2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gesture_handler_set_before_processing_ = !!gesture_handler_; 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return EventProcessor::OnEventFromSource(event); 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (event->IsTouchEvent()) 295e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch NOTREACHED() << "Touch events should not be sent to RootView."; 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (event->IsMouseEvent()) 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED() << "Should not be called with a MouseEvent."; 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return DispatchDetails(); 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RootView::OnEventProcessingFinished(ui::Event* event) { 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If |event| was not handled and |gesture_handler_| was not set by the 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // dispatch of a previous gesture event, then no default gesture handler 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // should be set prior to the next gesture event being received. 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event->IsGestureEvent() && 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !event->handled() && 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !gesture_handler_set_before_processing_) { 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gesture_handler_ = NULL; 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RootView, View overrides: 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Widget* RootView::GetWidget() const { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* RootView::GetWidget() { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_cast<Widget*>(const_cast<const RootView*>(this)->GetWidget()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RootView::IsDrawn() const { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return visible(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RootView::Layout() { 33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) View::Layout(); 33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) widget_->OnRootViewLayout(); 33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* RootView::GetClassName() const { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kViewClassName; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SchedulePaintInRect(const gfx::Rect& rect) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (layer()) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layer()->SchedulePaint(rect); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect xrect = ConvertRectToParent(rect); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect invalid_rect = gfx::IntersectRects(GetLocalBounds(), xrect); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!invalid_rect.IsEmpty()) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->SchedulePaintInRect(invalid_rect); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RootView::OnMousePressed(const ui::MouseEvent& event) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateCursor(event); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMouseLocationAndFlags(event); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If mouse_pressed_handler_ is non null, we are currently processing 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a pressed -> drag -> released session. In that case we send the 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event to mouse_pressed_handler_ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_pressed_handler_) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_pressed_event(event, static_cast<View*>(this), 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_info_.Reset(); 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(mouse_pressed_handler_, &mouse_pressed_event); 362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!explicit_mouse_handler_); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hit_disabled_view = false; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Walk up the tree until we find a view that wants the mouse event. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (mouse_pressed_handler_ = GetEventHandlerForPoint(event.location()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_ && (mouse_pressed_handler_ != this); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_ = mouse_pressed_handler_->parent()) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "OnMousePressed testing " 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << mouse_pressed_handler_->GetClassName(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mouse_pressed_handler_->enabled()) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disabled views should eat events instead of propagating them upwards. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hit_disabled_view = true; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See if this view wants to handle the mouse press. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_pressed_event(event, static_cast<View*>(this), 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the double-click flag if the handler is different than the 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one which got the first click part of the double-click. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_pressed_handler_ != last_click_handler_) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_event.set_flags(event.flags() & ~ui::EF_IS_DOUBLE_CLICK); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_info_.Reset(); 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(mouse_pressed_handler_, &mouse_pressed_event); 393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return mouse_pressed_event.handled(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view could have removed itself from the tree when handling 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnMousePressed(). In this case, the removal notification will have 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reset mouse_pressed_handler_ to NULL out from under us. Detect this 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case and stop. (See comments in view.h.) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: Don't return true here, because we don't want the frame to 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // forward future events to us when there's no handler. 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mouse_pressed_handler_) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the view handled the event, leave mouse_pressed_handler_ set and 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return true, which will cause subsequent drag/release events to get 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // forwarded to that view. 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mouse_pressed_event.handled()) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_handler_ = mouse_pressed_handler_; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "OnMousePressed handled by " 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << mouse_pressed_handler_->GetClassName(); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset mouse_pressed_handler_ to indicate that no processing is occurring. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_ = NULL; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the event that a double-click is not handled after traversing the 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entire hierarchy (even as a single-click when sent to a different view), 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it must be marked as handled to avoid anything happening from default 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // processing if it the first click-part was handled by us. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_click_handler_ && (event.flags() & ui::EF_IS_DOUBLE_CLICK)) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hit_disabled_view = true; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_handler_ = NULL; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hit_disabled_view; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RootView::OnMouseDragged(const ui::MouseEvent& event) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_pressed_handler_) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMouseLocationAndFlags(event); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_event(event, static_cast<View*>(this), 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_); 437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(mouse_pressed_handler_, &mouse_event); 439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::OnMouseReleased(const ui::MouseEvent& event) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateCursor(event); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_pressed_handler_) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_released(event, static_cast<View*>(this), 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We allow the view to delete us from the event dispatch callback. As such, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // configure state such that we're done first, then call View. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* mouse_pressed_handler = mouse_pressed_handler_; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMouseHandler(NULL); 455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(mouse_pressed_handler, &mouse_released); 457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::OnMouseCaptureLost() { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: this likely needs to reset touch handler too. 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_pressed_handler_ || gesture_handler_) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synthesize a release event for UpdateCursor. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_pressed_handler_) { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point last_point(last_mouse_event_x_, last_mouse_event_y_); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent release_event(ui::ET_MOUSE_RELEASED, 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_point, last_point, 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_mouse_event_flags_, 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateCursor(release_event); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We allow the view to delete us from OnMouseCaptureLost. As such, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // configure state such that we're done first, then call View. 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* mouse_pressed_handler = mouse_pressed_handler_; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* gesture_handler = gesture_handler_; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMouseHandler(NULL); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_pressed_handler) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler->OnMouseCaptureLost(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_handler->OnMouseCaptureLost(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING: we may have been deleted. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::OnMouseMoved(const ui::MouseEvent& event) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v = GetEventHandlerForPoint(event.location()); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the first enabled view, or the existing move handler, whichever comes 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // first. The check for the existing handler is because if a view becomes 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled while handling moves, it's wrong to suddenly send ET_MOUSE_EXITED 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and ET_MOUSE_ENTERED events, because the mouse hasn't actually exited yet. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (v && !v->enabled() && (v != mouse_move_handler_)) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = v->parent(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v && v != this) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v != mouse_move_handler_) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_move_handler_ != NULL && 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!mouse_move_handler_->notify_enter_exit_on_child() || 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !mouse_move_handler_->Contains(v))) { 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MouseEnterExitEvent exit(event, ui::ET_MOUSE_EXITED); 502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) exit.ConvertLocationToTarget(static_cast<View*>(this), 503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mouse_move_handler_); 504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(mouse_move_handler_, &exit); 506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED, 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_move_handler_, v); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* old_handler = mouse_move_handler_; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_handler_ = v; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mouse_move_handler_->notify_enter_exit_on_child() || 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !mouse_move_handler_->Contains(old_handler)) { 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MouseEnterExitEvent entered(event, ui::ET_MOUSE_ENTERED); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entered.ConvertLocationToTarget(static_cast<View*>(this), 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_move_handler_); 518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(mouse_move_handler_, &entered); 520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_ENTERED, 523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mouse_move_handler_, old_handler); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent moved_event(event, static_cast<View*>(this), 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_handler_); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_handler_->OnMouseMoved(moved_event); 529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(tdanderson): It may be possible to avoid setting the cursor twice 530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // (once here and once from CompoundEventFilter) on a 531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // mousemove. See crbug.com/351469. 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(moved_event.flags() & ui::EF_IS_NON_CLIENT)) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->SetCursor(mouse_move_handler_->GetCursor(moved_event)); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (mouse_move_handler_ != NULL) { 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MouseEnterExitEvent exited(event, ui::ET_MOUSE_EXITED); 536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(mouse_move_handler_, &exited); 538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED, 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_move_handler_, v); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Aura the non-client area extends slightly outside the root view for 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // some windows. Let the non-client cursor handling code set the cursor 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as we do above. 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(event.flags() & ui::EF_IS_NON_CLIENT)) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->SetCursor(gfx::kNullCursor); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_handler_ = NULL; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::OnMouseExited(const ui::MouseEvent& event) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_move_handler_ != NULL) { 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MouseEnterExitEvent exited(event, ui::ET_MOUSE_EXITED); 554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(mouse_move_handler_, &exited); 556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED, 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_move_handler_, NULL); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_move_handler_ = NULL; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RootView::OnMouseWheel(const ui::MouseWheelEvent& event) { 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (View* v = GetEventHandlerForPoint(event.location()); 566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v && v != this && !event.handled(); v = v->parent()) { 567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = 568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchEvent(v, const_cast<ui::MouseWheelEvent*>(&event)); 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed || 570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dispatch_details.target_destroyed) { 571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return event.handled(); 572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return event.handled(); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetMouseHandler(View* new_mh) { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're clearing the mouse handler, clear explicit_mouse_handler_ as well. 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_mouse_handler_ = (new_mh != NULL); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_ = new_mh; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_handler_ = new_mh; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_info_.Reset(); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RootView::GetAccessibleState(ui::AXViewState* state) { 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state->name = widget_->widget_delegate()->GetAccessibleWindowTitle(); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state->role = widget_->widget_delegate()->GetAccessibleWindowRole(); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RootView::UpdateParentLayer() { 59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (layer()) 59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ReparentLayer(gfx::Vector2d(GetMirroredX(), y()), widget_->GetLayer()); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RootView, protected: 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 598116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RootView::ViewHierarchyChanged( 599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ViewHierarchyChangedDetails& details) { 600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch widget_->ViewHierarchyChanged(details); 601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!details.is_add) { 603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!explicit_mouse_handler_ && mouse_pressed_handler_ == details.child) 604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mouse_pressed_handler_ = NULL; 605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (mouse_move_handler_ == details.child) 606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mouse_move_handler_ = NULL; 607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (gesture_handler_ == details.child) 608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gesture_handler_ = NULL; 609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (event_dispatch_target_ == details.child) 610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event_dispatch_target_ = NULL; 611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (old_dispatch_target_ == details.child) 612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch old_dispatch_target_ = NULL; 613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 616116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RootView::VisibilityChanged(View* /*starting_from*/, bool is_visible) { 617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!is_visible) { 618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // When the root view is being hidden (e.g. when widget is minimized) 619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // handlers are reset, so that after it is reshown, events are not captured 620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // by old handlers. 621116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit_mouse_handler_ = false; 622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mouse_pressed_handler_ = NULL; 623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mouse_move_handler_ = NULL; 624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gesture_handler_ = NULL; 625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event_dispatch_target_ = NULL; 626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch old_dispatch_target_ = NULL; 627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 630116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RootView::OnPaint(gfx::Canvas* canvas) { 631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!layer() || !layer()->fills_bounds_opaquely()) 632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch canvas->DrawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); 633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch View::OnPaint(canvas); 635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 637116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Vector2d RootView::CalculateOffsetToAncestorWithLayer( 638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::Layer** layer_parent) { 639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Vector2d offset(View::CalculateOffsetToAncestorWithLayer(layer_parent)); 640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!layer() && layer_parent) 641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *layer_parent = widget_->GetLayer(); 642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return offset; 643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 645116680a4aac90f2aa7413d9095a592090648e557Ben MurdochView::DragInfo* RootView::GetDragInfo() { 646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return &drag_info_; 647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// RootView, private: 651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Input ----------------------------------------------------------------------- 653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::UpdateCursor(const ui::MouseEvent& event) { 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(event.flags() & ui::EF_IS_NON_CLIENT)) { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v = GetEventHandlerForPoint(event.location()); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent me(event, static_cast<View*>(this), v); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->SetCursor(v->GetCursor(me)); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetMouseLocationAndFlags(const ui::MouseEvent& event) { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_flags_ = event.flags(); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_x_ = event.x(); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_y_ = event.y(); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RootView::NotifyEnterExitOfDescendant(const ui::MouseEvent& event, 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventType type, 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* view, 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* sibling) { 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (View* p = view->parent(); p; p = p->parent()) { 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!p->notify_enter_exit_on_child()) 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sibling && p->Contains(sibling)) 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It is necessary to recreate the notify-event for each dispatch, since one 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of the callbacks can mark the event as handled, and that would cause 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // incorrect event dispatch. 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MouseEnterExitEvent notify_event(event, type); 681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventDispatchDetails dispatch_details = DispatchEvent(p, ¬ify_event); 682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dispatch_details.dispatcher_destroyed || 683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dispatch_details.target_destroyed) { 684424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return; 685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 686424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 687424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 688424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RootView::CanDispatchToTarget(ui::EventTarget* target) { 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return event_dispatch_target_ == target; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ui::EventDispatchDetails RootView::PreDispatchEvent(ui::EventTarget* target, 694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::Event* event) { 6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci View* view = static_cast<View*>(target); 6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event->IsGestureEvent()) { 6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Update |gesture_handler_| to indicate which View is currently handling 6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // gesture events. 6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(tdanderson): Look into moving this to PostDispatchEvent() and 7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // using |event_dispatch_target_| instead of 7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |gesture_handler_| to detect if the view has been 7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // removed from the tree. 7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gesture_handler_ = view; 7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Disabled views are permitted to be targets of gesture events, but 7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // gesture events should never actually be dispatched to them. Prevent 7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // dispatch by marking the event as handled. 7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!view->enabled()) 7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event->SetHandled(); 7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) old_dispatch_target_ = event_dispatch_target_; 7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event_dispatch_target_ = view; 714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return DispatchDetails(); 715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ui::EventDispatchDetails RootView::PostDispatchEvent(ui::EventTarget* target, 718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ui::Event& event) { 7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The GESTURE_END event corresponding to the removal of the final touch 7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // point marks the end of a gesture sequence, so reset |gesture_handler_| 7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to NULL. 7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.type() == ui::ET_GESTURE_END) { 7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // In case a drag was in progress, reset all the handlers. Otherwise, just 7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // reset the gesture handler. 7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (gesture_handler_ && gesture_handler_ == mouse_pressed_handler_) 7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetMouseHandler(NULL); 7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gesture_handler_ = NULL; 7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DispatchDetails details; 732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (target != event_dispatch_target_) 733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) details.target_destroyed = true; 734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) event_dispatch_target_ = old_dispatch_target_; 736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) old_dispatch_target_ = NULL; 737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef NDEBUG 739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!event_dispatch_target_ || Contains(event_dispatch_target_)); 740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return details; 743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 747