Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ui/touch_selection/touch_selection_controller_aura.h" | |
| 6 | |
| 7 #include "ui/aura/client/cursor_client.h" | |
| 8 #include "ui/aura/env.h" | |
| 9 #include "ui/aura/window.h" | |
| 10 #include "ui/events/event.h" | |
| 11 #include "ui/events/gesture_detection/gesture_configuration.h" | |
| 12 #include "ui/events/gestures/motion_event_aura.h" | |
| 13 #include "ui/touch_selection/touch_handle_drawable_aura.h" | |
| 14 | |
| 15 | |
| 16 namespace ui { | |
| 17 | |
| 18 TouchSelectionControllerAura::TouchSelectionControllerAura( | |
| 19 TouchSelectionControllerAuraClient* client) | |
| 20 : client_(client), | |
| 21 motion_event_(new MotionEventAura), | |
| 22 scroll_in_progress_(false), | |
| 23 overscroll_in_progress_(false), | |
| 24 handle_drag_in_progress_(false) { | |
| 25 int tap_timeout_ms = | |
| 26 GestureConfiguration::GetInstance()->show_press_delay_in_ms(); | |
| 27 int touch_slop = | |
| 28 GestureConfiguration::GetInstance()->max_touch_move_in_pixels_for_click(); | |
| 29 controller_.reset(new TouchSelectionController( | |
| 30 this, | |
| 31 base::TimeDelta::FromMilliseconds(tap_timeout_ms), | |
| 32 touch_slop, | |
| 33 true)); | |
|
jdduke (slow)
2015/01/28 16:35:32
The side-effetcs of |true| are a little unclear un
mohsen
2015/02/22 23:23:09
Done.
| |
| 34 } | |
| 35 | |
| 36 TouchSelectionControllerAura::~TouchSelectionControllerAura() { | |
| 37 } | |
| 38 | |
| 39 void TouchSelectionControllerAura::OnSelectionEditable(bool editable) { | |
| 40 controller_->OnSelectionEditable(editable); | |
| 41 UpdateQuickMenu(); | |
| 42 } | |
| 43 | |
| 44 void TouchSelectionControllerAura::OnSelectionEmpty(bool empty) { | |
| 45 controller_->OnSelectionEmpty(empty); | |
| 46 UpdateQuickMenu(); | |
| 47 } | |
| 48 | |
| 49 | |
| 50 void TouchSelectionControllerAura::OnSelectionBoundsUpdated( | |
| 51 const SelectionBound& start, | |
| 52 const SelectionBound& end) { | |
| 53 if (controller_->start() == start && controller_->end() == end) | |
|
jdduke (slow)
2015/01/28 16:35:32
Don't love this early exit, one alternative would
mohsen
2015/02/22 23:23:09
Done.
| |
| 54 return; | |
| 55 | |
| 56 controller_->OnSelectionBoundsUpdated(start, end); | |
| 57 UpdateQuickMenu(); | |
| 58 } | |
| 59 | |
| 60 void TouchSelectionControllerAura::HandleGestureEvent(GestureEvent* event) { | |
| 61 switch (event->type()) { | |
| 62 case ET_GESTURE_LONG_PRESS: | |
| 63 controller_->OnLongPressEvent(); | |
| 64 break; | |
| 65 case ET_GESTURE_TAP: | |
| 66 if (!controller_->is_insertion_active() && | |
| 67 !controller_->is_selection_active() && | |
| 68 RectBetweenSelectionBounds( | |
| 69 controller_->start(), | |
| 70 controller_->end()).Contains(event->x(), event->y())) { | |
| 71 // TODO: also check for editability | |
| 72 controller_->TryActivateSelection(); | |
| 73 event->SetHandled(); | |
| 74 } else { | |
| 75 controller_->OnTapEvent(); | |
| 76 } | |
| 77 break; | |
| 78 case ET_GESTURE_SCROLL_BEGIN: | |
| 79 scroll_in_progress_ = true; | |
| 80 UpdateQuickMenu(); | |
| 81 break; | |
| 82 case ET_GESTURE_SCROLL_END: | |
| 83 scroll_in_progress_ = false; | |
| 84 UpdateQuickMenu(); | |
| 85 break; | |
| 86 default: | |
| 87 break; | |
| 88 } | |
| 89 } | |
| 90 | |
| 91 void TouchSelectionControllerAura::HandleTouchEvent(TouchEvent* event) { | |
| 92 const int index = motion_event_->FindPointerIndexOfId(event->touch_id()); | |
| 93 const bool pointer_id_is_active = index != -1; | |
| 94 | |
| 95 if (event->type() != ET_TOUCH_PRESSED && !pointer_id_is_active) | |
| 96 return; | |
| 97 | |
| 98 if (event->type() == ET_TOUCH_PRESSED && pointer_id_is_active) | |
| 99 motion_event_.reset(new MotionEventAura); | |
| 100 | |
| 101 motion_event_->OnTouch(*event); | |
| 102 if (controller_->WillHandleTouchEvent(*motion_event_)) | |
| 103 event->SetHandled(); | |
| 104 motion_event_->CleanupRemovedTouchPoints(*event); | |
| 105 } | |
| 106 | |
| 107 void TouchSelectionControllerAura::HideAndDisallowShowingAutomatically() { | |
| 108 controller_->HideAndDisallowShowingAutomatically(); | |
| 109 UpdateQuickMenu(); | |
| 110 } | |
| 111 | |
| 112 void TouchSelectionControllerAura::OnWindowMoved() { | |
| 113 UpdateQuickMenu(); | |
| 114 } | |
| 115 | |
| 116 void TouchSelectionControllerAura::OnOverscrollStarted() { | |
| 117 overscroll_in_progress_ = true; | |
| 118 UpdateQuickMenu(); | |
| 119 } | |
| 120 | |
| 121 void TouchSelectionControllerAura::OnOverscrollCompleted() { | |
| 122 overscroll_in_progress_ = false; | |
| 123 UpdateQuickMenu(); | |
| 124 } | |
| 125 | |
| 126 void TouchSelectionControllerAura::OnFlingCompleted() { | |
| 127 scroll_in_progress_ = false; | |
| 128 UpdateQuickMenu(); | |
| 129 } | |
| 130 | |
| 131 gfx::Rect TouchSelectionControllerAura::GetAnchorRect() const { | |
| 132 // TODO: Crop to view bounds | |
| 133 const SelectionBound& start = controller_->start(); | |
| 134 const SelectionBound& end = controller_->end(); | |
| 135 | |
| 136 if (start.visible() && end.visible()) | |
| 137 return RectBetweenSelectionBounds(start, end); | |
| 138 if (start.visible()) | |
| 139 return gfx::BoundingRect(start.edge_top_rounded(), | |
| 140 start.edge_bottom_rounded()); | |
| 141 return gfx::BoundingRect(end.edge_top_rounded(), end.edge_bottom_rounded()); | |
| 142 } | |
| 143 | |
| 144 void TouchSelectionControllerAura::ShowQuickMenu() { | |
| 145 DCHECK(controller_->is_insertion_active() || | |
| 146 controller_->is_selection_active()); | |
| 147 | |
| 148 if (!controller_->start().visible() && !controller_->end().visible()) | |
| 149 return; | |
| 150 | |
| 151 if (TouchSelectionMenuRunner::GetInstance()) { | |
| 152 TouchSelectionMenuRunner::GetInstance()->RunMenu( | |
| 153 this, | |
| 154 client_->ConvertRectToScreen(GetAnchorRect()), | |
| 155 TouchHandleDrawableAura::GetMaxHandleImageSize(), | |
| 156 client_->GetParentWindow()->GetToplevelWindow()); | |
| 157 } | |
| 158 } | |
| 159 | |
| 160 void TouchSelectionControllerAura::UpdateQuickMenu() { | |
| 161 // Hide quick menu if there is any. | |
| 162 if (TouchSelectionMenuRunner::GetInstance() && | |
| 163 TouchSelectionMenuRunner::GetInstance()->IsRunning()) { | |
| 164 TouchSelectionMenuRunner::GetInstance()->CloseMenu(); | |
| 165 } else { | |
| 166 quick_menu_timer_.Stop(); | |
| 167 } | |
| 168 | |
| 169 // Start timer to show quick menu if necessary. | |
| 170 if (!controller_->is_insertion_active() && | |
| 171 !controller_->is_selection_active()) | |
| 172 return; | |
| 173 | |
| 174 if (!IsQuickMenuAllowed()) | |
| 175 return; | |
| 176 | |
| 177 if (immediate_quick_menu_for_testing_) { | |
| 178 ShowQuickMenu(); | |
| 179 } else { | |
| 180 quick_menu_timer_.Start( | |
| 181 FROM_HERE, | |
| 182 base::TimeDelta::FromMilliseconds(100), | |
| 183 this, | |
| 184 &TouchSelectionControllerAura::ShowQuickMenu); | |
| 185 } | |
| 186 } | |
| 187 | |
| 188 bool TouchSelectionControllerAura::IsQuickMenuAllowed() const { | |
| 189 return !scroll_in_progress_ && !overscroll_in_progress_ && | |
| 190 !handle_drag_in_progress_; | |
| 191 } | |
| 192 | |
| 193 bool TouchSelectionControllerAura::SupportsAnimation() const { | |
| 194 return false; | |
| 195 } | |
| 196 | |
| 197 void TouchSelectionControllerAura::SetNeedsAnimate() { | |
| 198 NOTREACHED(); | |
| 199 } | |
| 200 | |
| 201 void TouchSelectionControllerAura::MoveCaret(const gfx::PointF& position) { | |
| 202 client_->MoveCaret(position); | |
| 203 } | |
| 204 | |
| 205 void TouchSelectionControllerAura::MoveRangeSelectionExtent( | |
| 206 const gfx::PointF& extent) { | |
| 207 client_->MoveRangeSelectionExtent(extent); | |
| 208 } | |
| 209 | |
| 210 void TouchSelectionControllerAura::SelectBetweenCoordinates( | |
| 211 const gfx::PointF& base, | |
| 212 const gfx::PointF& extent) { | |
| 213 client_->SelectBetweenCoordinates(base, extent); | |
| 214 } | |
| 215 | |
| 216 void TouchSelectionControllerAura::OnSelectionEvent( | |
| 217 SelectionEventType event, | |
| 218 const gfx::PointF& position) { | |
| 219 switch (event) { | |
| 220 case SELECTION_SHOWN: | |
| 221 UpdateQuickMenu(); | |
| 222 aura::Env::GetInstance()->RemovePreTargetHandler(this); | |
| 223 aura::Env::GetInstance()->AddPreTargetHandler(this); | |
| 224 break; | |
| 225 case SELECTION_CLEARED: | |
| 226 aura::Env::GetInstance()->RemovePreTargetHandler(this); | |
| 227 UpdateQuickMenu(); | |
| 228 break; | |
| 229 case SELECTION_DRAG_STARTED: | |
| 230 handle_drag_in_progress_ = true; | |
| 231 UpdateQuickMenu(); | |
| 232 break; | |
| 233 case SELECTION_DRAG_STOPPED: | |
| 234 handle_drag_in_progress_ = false; | |
| 235 UpdateQuickMenu(); | |
| 236 break; | |
| 237 case INSERTION_SHOWN: | |
| 238 UpdateQuickMenu(); | |
| 239 aura::Env::GetInstance()->RemovePreTargetHandler(this); | |
| 240 aura::Env::GetInstance()->AddPreTargetHandler(this); | |
| 241 break; | |
| 242 case INSERTION_MOVED: | |
| 243 break; | |
| 244 case INSERTION_TAPPED: | |
| 245 //UpdateQuickMenu(); | |
| 246 break; | |
| 247 case INSERTION_CLEARED: | |
| 248 aura::Env::GetInstance()->RemovePreTargetHandler(this); | |
| 249 UpdateQuickMenu(); | |
| 250 break; | |
| 251 case INSERTION_DRAG_STARTED: | |
| 252 handle_drag_in_progress_ = true; | |
| 253 UpdateQuickMenu(); | |
| 254 break; | |
| 255 case INSERTION_DRAG_STOPPED: | |
| 256 handle_drag_in_progress_ = false; | |
| 257 UpdateQuickMenu(); | |
| 258 break; | |
| 259 }; | |
| 260 } | |
| 261 | |
| 262 scoped_ptr<TouchHandleDrawable> TouchSelectionControllerAura::CreateDrawable() { | |
| 263 return scoped_ptr<TouchHandleDrawable>( | |
| 264 new TouchHandleDrawableAura(client_->GetParentWindow())); | |
| 265 } | |
| 266 | |
| 267 bool TouchSelectionControllerAura::IsCommandIdEnabled(int command_id) const { | |
| 268 return client_->IsCommandIdEnabled(command_id); | |
| 269 } | |
| 270 | |
| 271 void TouchSelectionControllerAura::ExecuteCommand(int command_id, | |
| 272 int event_flags) { | |
| 273 HideAndDisallowShowingAutomatically(); | |
| 274 client_->ExecuteCommand(command_id, event_flags); | |
| 275 } | |
| 276 | |
| 277 void TouchSelectionControllerAura::OpenContextMenu() { | |
| 278 HideAndDisallowShowingAutomatically(); | |
| 279 gfx::Rect anchor_rect = GetAnchorRect(); | |
| 280 client_->OpenContextMenu(gfx::Point(anchor_rect.CenterPoint().x(), | |
| 281 anchor_rect.y())); | |
| 282 } | |
| 283 | |
| 284 void TouchSelectionControllerAura::OnKeyEvent(KeyEvent* event) { | |
| 285 LOG(ERROR) << "KeyEvent: " << event->name(); | |
| 286 | |
| 287 DCHECK(controller_->is_insertion_active() || | |
| 288 controller_->is_selection_active()); | |
| 289 | |
| 290 HideAndDisallowShowingAutomatically(); | |
| 291 } | |
| 292 | |
| 293 void TouchSelectionControllerAura::OnMouseEvent(MouseEvent* event) { | |
| 294 LOG(ERROR) << "MouseEvent: " << event->name(); | |
| 295 | |
| 296 DCHECK(controller_->is_insertion_active() || | |
| 297 controller_->is_selection_active()); | |
| 298 | |
| 299 aura::client::CursorClient* cursor_client = aura::client::GetCursorClient( | |
| 300 client_->GetParentWindow()->GetRootWindow()); | |
| 301 if (!cursor_client || cursor_client->IsMouseEventsEnabled()) | |
| 302 HideAndDisallowShowingAutomatically(); | |
| 303 } | |
| 304 | |
| 305 void TouchSelectionControllerAura::OnScrollEvent(ScrollEvent* event) { | |
| 306 LOG(ERROR) << "ScrollEvent: " << event->name(); | |
| 307 | |
| 308 DCHECK(controller_->is_insertion_active() || | |
| 309 controller_->is_selection_active()); | |
| 310 | |
| 311 HideAndDisallowShowingAutomatically(); | |
| 312 } | |
| 313 | |
| 314 } // namespace ui | |
| OLD | NEW |