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

Side by Side Diff: ui/views/touchui/touch_selection_controller_impl.cc

Issue 12224133: Move touch_selection_controller interface to ui/base. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: patch Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/views/touchui/touch_selection_controller_impl.h ('k') | ui/views/views.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/touchui/touch_selection_controller_impl.h" 5 #include "ui/views/touchui/touch_selection_controller_impl.h"
6 6
7 #include "base/time.h" 7 #include "base/time.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "grit/ui_strings.h" 9 #include "grit/ui_strings.h"
10 #include "third_party/skia/include/effects/SkGradientShader.h" 10 #include "third_party/skia/include/effects/SkGradientShader.h"
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 Layout(); 316 Layout();
317 } 317 }
318 318
319 scoped_ptr<Widget> widget_; 319 scoped_ptr<Widget> widget_;
320 TouchSelectionControllerImpl* controller_; 320 TouchSelectionControllerImpl* controller_;
321 321
322 DISALLOW_COPY_AND_ASSIGN(TouchContextMenuView); 322 DISALLOW_COPY_AND_ASSIGN(TouchContextMenuView);
323 }; 323 };
324 324
325 TouchSelectionControllerImpl::TouchSelectionControllerImpl( 325 TouchSelectionControllerImpl::TouchSelectionControllerImpl(
326 TouchSelectionClientView* client_view) 326 ui::TouchEditable* client_view)
327 : client_view_(client_view), 327 : client_view_(client_view),
328 selection_handle_1_(new SelectionHandleView(this)), 328 selection_handle_1_(new SelectionHandleView(this)),
329 selection_handle_2_(new SelectionHandleView(this)), 329 selection_handle_2_(new SelectionHandleView(this)),
330 context_menu_(new TouchContextMenuView(this)), 330 context_menu_(new TouchContextMenuView(this)),
331 dragging_handle_(NULL) { 331 dragging_handle_(NULL) {
332 } 332 }
333 333
334 TouchSelectionControllerImpl::~TouchSelectionControllerImpl() { 334 TouchSelectionControllerImpl::~TouchSelectionControllerImpl() {
335 } 335 }
336 336
337 void TouchSelectionControllerImpl::SelectionChanged(const gfx::Point& p1, 337 void TouchSelectionControllerImpl::SelectionChanged(const gfx::Point& p1,
338 const gfx::Point& p2) { 338 const gfx::Point& p2) {
339 gfx::Point screen_pos_1(p1); 339 gfx::Point screen_pos_1(p1);
340 View::ConvertPointToScreen(client_view_, &screen_pos_1); 340 client_view_->ConvertPointToScreen(&screen_pos_1);
341 gfx::Point screen_pos_2(p2); 341 gfx::Point screen_pos_2(p2);
342 View::ConvertPointToScreen(client_view_, &screen_pos_2); 342 client_view_->ConvertPointToScreen(&screen_pos_2);
343 343
344 if (dragging_handle_) { 344 if (dragging_handle_) {
345 // We need to reposition only the selection handle that is being dragged. 345 // We need to reposition only the selection handle that is being dragged.
346 // The other handle stays the same. Also, the selection handle being dragged 346 // The other handle stays the same. Also, the selection handle being dragged
347 // will always be at the end of selection, while the other handle will be at 347 // will always be at the end of selection, while the other handle will be at
348 // the start. 348 // the start.
349 dragging_handle_->SetScreenPosition(screen_pos_2); 349 dragging_handle_->SetScreenPosition(screen_pos_2);
350 } else { 350 } else {
351 UpdateContextMenu(p1, p2); 351 UpdateContextMenu(p1, p2);
352 352
353 // Check if there is any selection at all. 353 // Check if there is any selection at all.
354 if (IsEmptySelection(screen_pos_2, screen_pos_1)) { 354 if (IsEmptySelection(screen_pos_2, screen_pos_1)) {
355 selection_handle_1_->SetVisible(false); 355 selection_handle_1_->SetVisible(false);
356 selection_handle_2_->SetVisible(false); 356 selection_handle_2_->SetVisible(false);
357 return; 357 return;
358 } 358 }
359 359
360 if (client_view_->bounds().Contains(p1)) { 360 if (client_view_->GetBounds().Contains(p1)) {
361 selection_handle_1_->SetScreenPosition(screen_pos_1); 361 selection_handle_1_->SetScreenPosition(screen_pos_1);
362 selection_handle_1_->SetVisible(true); 362 selection_handle_1_->SetVisible(true);
363 } else { 363 } else {
364 selection_handle_1_->SetVisible(false); 364 selection_handle_1_->SetVisible(false);
365 } 365 }
366 366
367 if (client_view_->bounds().Contains(p2)) { 367 if (client_view_->GetBounds().Contains(p2)) {
368 selection_handle_2_->SetScreenPosition(screen_pos_2); 368 selection_handle_2_->SetScreenPosition(screen_pos_2);
369 selection_handle_2_->SetVisible(true); 369 selection_handle_2_->SetVisible(true);
370 } else { 370 } else {
371 selection_handle_2_->SetVisible(false); 371 selection_handle_2_->SetVisible(false);
372 } 372 }
373 } 373 }
374 } 374 }
375 375
376 void TouchSelectionControllerImpl::ClientViewLostFocus() { 376 void TouchSelectionControllerImpl::ClientViewLostFocus() {
377 selection_handle_1_->SetVisible(false); 377 selection_handle_1_->SetVisible(false);
378 selection_handle_2_->SetVisible(false); 378 selection_handle_2_->SetVisible(false);
379 HideContextMenu(); 379 HideContextMenu();
380 } 380 }
381 381
382 void TouchSelectionControllerImpl::SelectionHandleDragged( 382 void TouchSelectionControllerImpl::SelectionHandleDragged(
383 const gfx::Point& drag_pos) { 383 const gfx::Point& drag_pos) {
384 // We do not want to show the context menu while dragging. 384 // We do not want to show the context menu while dragging.
385 HideContextMenu(); 385 HideContextMenu();
386 context_menu_timer_.Start( 386 context_menu_timer_.Start(
387 FROM_HERE, 387 FROM_HERE,
388 base::TimeDelta::FromMilliseconds(kContextMenuTimoutMs), 388 base::TimeDelta::FromMilliseconds(kContextMenuTimoutMs),
389 this, 389 this,
390 &TouchSelectionControllerImpl::ContextMenuTimerFired); 390 &TouchSelectionControllerImpl::ContextMenuTimerFired);
391 391
392 if (client_view_->GetWidget()) { 392 DCHECK(dragging_handle_);
393 DCHECK(dragging_handle_); 393 // Find the stationary selection handle.
394 // Find the stationary selection handle. 394 SelectionHandleView* fixed_handle = selection_handle_1_.get();
395 SelectionHandleView* fixed_handle = selection_handle_1_.get(); 395 if (fixed_handle == dragging_handle_)
396 if (fixed_handle == dragging_handle_) 396 fixed_handle = selection_handle_2_.get();
397 fixed_handle = selection_handle_2_.get();
398 397
399 // Find selection end points in client_view's coordinate system. 398 // Find selection end points in client_view's coordinate system.
400 gfx::Point p1(drag_pos.x() + kSelectionHandleRadius, drag_pos.y()); 399 gfx::Point p1(drag_pos.x() + kSelectionHandleRadius, drag_pos.y());
401 ConvertPointToClientView(dragging_handle_, &p1); 400 ConvertPointToClientView(dragging_handle_, &p1);
402 401
403 gfx::Point p2(kSelectionHandleRadius, 0); 402 gfx::Point p2(kSelectionHandleRadius, 0);
404 ConvertPointToClientView(fixed_handle, &p2); 403 ConvertPointToClientView(fixed_handle, &p2);
405 404
406 // Instruct client_view to select the region between p1 and p2. The position 405 // Instruct client_view to select the region between p1 and p2. The position
407 // of |fixed_handle| is the start and that of |dragging_handle| is the end 406 // of |fixed_handle| is the start and that of |dragging_handle| is the end
408 // of selection. 407 // of selection.
409 client_view_->SelectRect(p2, p1); 408 client_view_->SelectRect(p2, p1);
410 }
411 } 409 }
412 410
413 void TouchSelectionControllerImpl::ConvertPointToClientView( 411 void TouchSelectionControllerImpl::ConvertPointToClientView(
414 SelectionHandleView* source, gfx::Point* point) { 412 SelectionHandleView* source, gfx::Point* point) {
415 View::ConvertPointToScreen(source, point); 413 View::ConvertPointToScreen(source, point);
416 gfx::Rect r = client_view_->GetWidget()->GetClientAreaBoundsInScreen(); 414 client_view_->ConvertPointFromScreen(point);
417 point->SetPoint(point->x() - r.x(), point->y() - r.y());
418 View::ConvertPointFromWidget(client_view_, point);
419 } 415 }
420 416
421 bool TouchSelectionControllerImpl::IsCommandIdEnabled(int command_id) const { 417 bool TouchSelectionControllerImpl::IsCommandIdEnabled(int command_id) const {
422 return client_view_->IsCommandIdEnabled(command_id); 418 return client_view_->IsCommandIdEnabled(command_id);
423 } 419 }
424 420
425 void TouchSelectionControllerImpl::ExecuteCommand(int command_id) { 421 void TouchSelectionControllerImpl::ExecuteCommand(int command_id) {
426 HideContextMenu(); 422 HideContextMenu();
427 client_view_->ExecuteCommand(command_id); 423 client_view_->ExecuteCommand(command_id);
428 } 424 }
429 425
430 void TouchSelectionControllerImpl::ContextMenuTimerFired() { 426 void TouchSelectionControllerImpl::ContextMenuTimerFired() {
431 // Get selection end points in client_view's space. 427 // Get selection end points in client_view's space.
432 gfx::Point p1(kSelectionHandleRadius, 0); 428 gfx::Point p1(kSelectionHandleRadius, 0);
433 ConvertPointToClientView(selection_handle_1_.get(), &p1); 429 ConvertPointToClientView(selection_handle_1_.get(), &p1);
434 gfx::Point p2(kSelectionHandleRadius, 0); 430 gfx::Point p2(kSelectionHandleRadius, 0);
435 ConvertPointToClientView(selection_handle_2_.get(), &p2); 431 ConvertPointToClientView(selection_handle_2_.get(), &p2);
436 432
437 // if selection is completely inside the view, we display the context menu 433 // if selection is completely inside the view, we display the context menu
438 // in the middle of the end points on the top. Else, we show the menu on the 434 // in the middle of the end points on the top. Else, we show the menu on the
439 // top border of the view in the center. 435 // top border of the view in the center.
440 gfx::Point menu_pos; 436 gfx::Point menu_pos;
441 if (client_view_->bounds().Contains(p1) && 437 gfx::Rect client_bounds = client_view_->GetBounds();
442 client_view_->bounds().Contains(p2)) { 438 if (client_bounds.Contains(p1) && client_bounds.Contains(p2)) {
443 menu_pos.set_x((p1.x() + p2.x()) / 2); 439 menu_pos.set_x((p1.x() + p2.x()) / 2);
444 menu_pos.set_y(std::min(p1.y(), p2.y()) - kContextMenuVerticalOffset); 440 menu_pos.set_y(std::min(p1.y(), p2.y()) - kContextMenuVerticalOffset);
445 } else { 441 } else {
446 menu_pos.set_x(client_view_->x() + client_view_->width() / 2); 442 menu_pos.set_x(client_bounds.x() + client_bounds.width() / 2);
447 menu_pos.set_y(client_view_->y()); 443 menu_pos.set_y(client_bounds.y());
448 } 444 }
449 445
450 View::ConvertPointToScreen(client_view_, &menu_pos); 446 client_view_->ConvertPointToScreen(&menu_pos);
451 447
452 context_menu_->SetScreenPosition(menu_pos); 448 context_menu_->SetScreenPosition(menu_pos);
453 context_menu_->SetVisible(true); 449 context_menu_->SetVisible(true);
454 } 450 }
455 451
456 void TouchSelectionControllerImpl::UpdateContextMenu(const gfx::Point& p1, 452 void TouchSelectionControllerImpl::UpdateContextMenu(const gfx::Point& p1,
457 const gfx::Point& p2) { 453 const gfx::Point& p2) {
458 // Hide context menu to be shown when the timer fires. 454 // Hide context menu to be shown when the timer fires.
459 HideContextMenu(); 455 HideContextMenu();
460 456
(...skipping 21 matching lines...) Expand all
482 } 478 }
483 479
484 bool TouchSelectionControllerImpl::IsSelectionHandle1Visible() { 480 bool TouchSelectionControllerImpl::IsSelectionHandle1Visible() {
485 return selection_handle_1_->visible(); 481 return selection_handle_1_->visible();
486 } 482 }
487 483
488 bool TouchSelectionControllerImpl::IsSelectionHandle2Visible() { 484 bool TouchSelectionControllerImpl::IsSelectionHandle2Visible() {
489 return selection_handle_2_->visible(); 485 return selection_handle_2_->visible();
490 } 486 }
491 487
488 } // namespace views
489
490 namespace ui {
491
492 TouchSelectionController* TouchSelectionController::create( 492 TouchSelectionController* TouchSelectionController::create(
493 TouchSelectionClientView* client_view) { 493 TouchEditable* client_view) {
494 return new TouchSelectionControllerImpl(client_view); 494 return new views::TouchSelectionControllerImpl(client_view);
495 } 495 }
496 496
497 } // namespace views 497 } // namespace ui
OLDNEW
« no previous file with comments | « ui/views/touchui/touch_selection_controller_impl.h ('k') | ui/views/views.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698