| OLD | NEW |
| 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 "chrome/browser/ui/views/tabs/tab_drag_controller.h" | 5 #include "chrome/browser/ui/views/tabs/tab_drag_controller.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 const std::vector<BaseTab*>& tabs, | 386 const std::vector<BaseTab*>& tabs, |
| 387 const gfx::Point& mouse_offset, | 387 const gfx::Point& mouse_offset, |
| 388 int source_tab_offset, | 388 int source_tab_offset, |
| 389 const TabStripSelectionModel& initial_selection_model, | 389 const TabStripSelectionModel& initial_selection_model, |
| 390 DetachBehavior detach_behavior, | 390 DetachBehavior detach_behavior, |
| 391 MoveBehavior move_behavior) { | 391 MoveBehavior move_behavior) { |
| 392 DCHECK(!tabs.empty()); | 392 DCHECK(!tabs.empty()); |
| 393 DCHECK(std::find(tabs.begin(), tabs.end(), source_tab) != tabs.end()); | 393 DCHECK(std::find(tabs.begin(), tabs.end(), source_tab) != tabs.end()); |
| 394 source_tabstrip_ = source_tabstrip; | 394 source_tabstrip_ = source_tabstrip; |
| 395 source_tab_offset_ = source_tab_offset; | 395 source_tab_offset_ = source_tab_offset; |
| 396 start_screen_point_ = gfx::Point(source_tab_offset, mouse_offset.y()); | 396 start_point_in_screen_ = gfx::Point(source_tab_offset, mouse_offset.y()); |
| 397 views::View::ConvertPointToScreen(source_tab, &start_screen_point_); | 397 views::View::ConvertPointToScreen(source_tab, &start_point_in_screen_); |
| 398 mouse_offset_ = mouse_offset; | 398 mouse_offset_ = mouse_offset; |
| 399 detach_behavior_ = detach_behavior; | 399 detach_behavior_ = detach_behavior; |
| 400 move_behavior_ = move_behavior; | 400 move_behavior_ = move_behavior; |
| 401 last_screen_point_ = start_screen_point_; | 401 last_point_in_screen_ = start_point_in_screen_; |
| 402 last_move_screen_loc_ = start_screen_point_.x(); | 402 last_move_screen_loc_ = start_point_in_screen_.x(); |
| 403 initial_tab_positions_ = source_tabstrip->GetTabXCoordinates(); | 403 initial_tab_positions_ = source_tabstrip->GetTabXCoordinates(); |
| 404 if (detach_into_browser_) | 404 if (detach_into_browser_) |
| 405 GetModel(source_tabstrip_)->AddObserver(this); | 405 GetModel(source_tabstrip_)->AddObserver(this); |
| 406 | 406 |
| 407 drag_data_.resize(tabs.size()); | 407 drag_data_.resize(tabs.size()); |
| 408 for (size_t i = 0; i < tabs.size(); ++i) | 408 for (size_t i = 0; i < tabs.size(); ++i) |
| 409 InitTabDragData(tabs[i], &(drag_data_[i])); | 409 InitTabDragData(tabs[i], &(drag_data_[i])); |
| 410 source_tab_index_ = | 410 source_tab_index_ = |
| 411 std::find(tabs.begin(), tabs.end(), source_tab) - tabs.begin(); | 411 std::find(tabs.begin(), tabs.end(), source_tab) - tabs.begin(); |
| 412 | 412 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 432 return instance_ && instance_->active(); | 432 return instance_ && instance_->active(); |
| 433 } | 433 } |
| 434 | 434 |
| 435 void TabDragController::SetMoveBehavior(MoveBehavior behavior) { | 435 void TabDragController::SetMoveBehavior(MoveBehavior behavior) { |
| 436 if (started_drag()) | 436 if (started_drag()) |
| 437 return; | 437 return; |
| 438 | 438 |
| 439 move_behavior_ = behavior; | 439 move_behavior_ = behavior; |
| 440 } | 440 } |
| 441 | 441 |
| 442 void TabDragController::Drag(const gfx::Point& screen_point) { | 442 void TabDragController::Drag(const gfx::Point& point_in_screen) { |
| 443 #if defined(OS_WIN) && !defined(USE_AURA) | 443 #if defined(OS_WIN) && !defined(USE_AURA) |
| 444 // Windows coordinates are 16 bit values. When we hide the frame we move it to | 444 // Windows coordinates are 16 bit values. When we hide the frame we move it to |
| 445 // the max x/y coordinate. If the distance between the hidden frame and the | 445 // the max x/y coordinate. If the distance between the hidden frame and the |
| 446 // current mouse coordinate is greater than 32k then the coordinate passed to | 446 // current mouse coordinate is greater than 32k then the coordinate passed to |
| 447 // the mouse handler wraps and we drag to the wrong place. For this reason we | 447 // the mouse handler wraps and we drag to the wrong place. For this reason we |
| 448 // ignore the coordinates and use the actual cursor position. | 448 // ignore the coordinates and use the actual cursor position. |
| 449 // NOTE: this works for touch too as dragging with touch updates the mouse | 449 // NOTE: this works for touch too as dragging with touch updates the mouse |
| 450 // position. | 450 // position. |
| 451 gfx::Point real_screen_point(GetCursorScreenPoint()); | 451 gfx::Point real_point_in_screen(GetCursorScreenPoint()); |
| 452 #else | 452 #else |
| 453 gfx::Point real_screen_point(screen_point); | 453 gfx::Point real_point_in_screen(point_in_screen); |
| 454 #endif | 454 #endif |
| 455 bring_to_front_timer_.Stop(); | 455 bring_to_front_timer_.Stop(); |
| 456 move_stacked_timer_.Stop(); | 456 move_stacked_timer_.Stop(); |
| 457 | 457 |
| 458 if (waiting_for_run_loop_to_exit_) | 458 if (waiting_for_run_loop_to_exit_) |
| 459 return; | 459 return; |
| 460 | 460 |
| 461 if (!started_drag_) { | 461 if (!started_drag_) { |
| 462 if (!CanStartDrag(real_screen_point)) | 462 if (!CanStartDrag(real_point_in_screen)) |
| 463 return; // User hasn't dragged far enough yet. | 463 return; // User hasn't dragged far enough yet. |
| 464 | 464 |
| 465 started_drag_ = true; | 465 started_drag_ = true; |
| 466 SaveFocus(); | 466 SaveFocus(); |
| 467 Attach(source_tabstrip_, gfx::Point()); | 467 Attach(source_tabstrip_, gfx::Point()); |
| 468 if (detach_into_browser_ && static_cast<int>(drag_data_.size()) == | 468 if (detach_into_browser_ && static_cast<int>(drag_data_.size()) == |
| 469 GetModel(source_tabstrip_)->count()) { | 469 GetModel(source_tabstrip_)->count()) { |
| 470 RunMoveLoop(); // Runs a nested loop, returning when done. | 470 RunMoveLoop(); // Runs a nested loop, returning when done. |
| 471 return; | 471 return; |
| 472 } | 472 } |
| 473 } | 473 } |
| 474 | 474 |
| 475 ContinueDragging(real_screen_point); | 475 ContinueDragging(real_point_in_screen); |
| 476 } | 476 } |
| 477 | 477 |
| 478 void TabDragController::EndDrag(bool canceled) { | 478 void TabDragController::EndDrag(bool canceled) { |
| 479 EndDragImpl(canceled && source_tabstrip_ ? CANCELED : NORMAL); | 479 EndDragImpl(canceled && source_tabstrip_ ? CANCELED : NORMAL); |
| 480 } | 480 } |
| 481 | 481 |
| 482 void TabDragController::InitTabDragData(BaseTab* tab, | 482 void TabDragController::InitTabDragData(BaseTab* tab, |
| 483 TabDragData* drag_data) { | 483 TabDragData* drag_data) { |
| 484 drag_data->source_model_index = | 484 drag_data->source_model_index = |
| 485 source_tabstrip_->GetModelIndexOfBaseTab(tab); | 485 source_tabstrip_->GetModelIndexOfBaseTab(tab); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 create_point.set_x(work_area.right()); | 661 create_point.set_x(work_area.right()); |
| 662 if (create_point.y() < work_area.y()) | 662 if (create_point.y() < work_area.y()) |
| 663 create_point.set_y(work_area.y()); | 663 create_point.set_y(work_area.y()); |
| 664 else if (create_point.y() > work_area.bottom()) | 664 else if (create_point.y() > work_area.bottom()) |
| 665 create_point.set_y(work_area.bottom()); | 665 create_point.set_y(work_area.bottom()); |
| 666 } | 666 } |
| 667 return gfx::Point(create_point.x() - window_create_point_.x(), | 667 return gfx::Point(create_point.x() - window_create_point_.x(), |
| 668 create_point.y() - window_create_point_.y()); | 668 create_point.y() - window_create_point_.y()); |
| 669 } | 669 } |
| 670 | 670 |
| 671 void TabDragController::UpdateDockInfo(const gfx::Point& screen_point) { | 671 void TabDragController::UpdateDockInfo(const gfx::Point& point_in_screen) { |
| 672 // Update the DockInfo for the current mouse coordinates. | 672 // Update the DockInfo for the current mouse coordinates. |
| 673 DockInfo dock_info = GetDockInfoAtPoint(screen_point); | 673 DockInfo dock_info = GetDockInfoAtPoint(point_in_screen); |
| 674 if (!dock_info.equals(dock_info_)) { | 674 if (!dock_info.equals(dock_info_)) { |
| 675 // DockInfo for current position differs. | 675 // DockInfo for current position differs. |
| 676 if (dock_info_.type() != DockInfo::NONE && | 676 if (dock_info_.type() != DockInfo::NONE && |
| 677 !dock_controllers_.empty()) { | 677 !dock_controllers_.empty()) { |
| 678 // Hide old visual indicator. | 678 // Hide old visual indicator. |
| 679 dock_controllers_.back()->Hide(); | 679 dock_controllers_.back()->Hide(); |
| 680 } | 680 } |
| 681 dock_info_ = dock_info; | 681 dock_info_ = dock_info; |
| 682 if (dock_info_.type() != DockInfo::NONE) { | 682 if (dock_info_.type() != DockInfo::NONE) { |
| 683 // Show new docking position. | 683 // Show new docking position. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 703 old_focused_view_ = source_tabstrip_->GetFocusManager()->GetFocusedView(); | 703 old_focused_view_ = source_tabstrip_->GetFocusManager()->GetFocusedView(); |
| 704 source_tabstrip_->GetFocusManager()->SetFocusedView(source_tabstrip_); | 704 source_tabstrip_->GetFocusManager()->SetFocusedView(source_tabstrip_); |
| 705 } | 705 } |
| 706 | 706 |
| 707 void TabDragController::RestoreFocus() { | 707 void TabDragController::RestoreFocus() { |
| 708 if (old_focused_view_ && attached_tabstrip_ == source_tabstrip_) | 708 if (old_focused_view_ && attached_tabstrip_ == source_tabstrip_) |
| 709 old_focused_view_->GetFocusManager()->SetFocusedView(old_focused_view_); | 709 old_focused_view_->GetFocusManager()->SetFocusedView(old_focused_view_); |
| 710 old_focused_view_ = NULL; | 710 old_focused_view_ = NULL; |
| 711 } | 711 } |
| 712 | 712 |
| 713 bool TabDragController::CanStartDrag(const gfx::Point& screen_point) const { | 713 bool TabDragController::CanStartDrag(const gfx::Point& point_in_screen) const { |
| 714 // Determine if the mouse has moved beyond a minimum elasticity distance in | 714 // Determine if the mouse has moved beyond a minimum elasticity distance in |
| 715 // any direction from the starting point. | 715 // any direction from the starting point. |
| 716 static const int kMinimumDragDistance = 10; | 716 static const int kMinimumDragDistance = 10; |
| 717 int x_offset = abs(screen_point.x() - start_screen_point_.x()); | 717 int x_offset = abs(point_in_screen.x() - start_point_in_screen_.x()); |
| 718 int y_offset = abs(screen_point.y() - start_screen_point_.y()); | 718 int y_offset = abs(point_in_screen.y() - start_point_in_screen_.y()); |
| 719 return sqrt(pow(static_cast<float>(x_offset), 2) + | 719 return sqrt(pow(static_cast<float>(x_offset), 2) + |
| 720 pow(static_cast<float>(y_offset), 2)) > kMinimumDragDistance; | 720 pow(static_cast<float>(y_offset), 2)) > kMinimumDragDistance; |
| 721 } | 721 } |
| 722 | 722 |
| 723 void TabDragController::ContinueDragging(const gfx::Point& screen_point) { | 723 void TabDragController::ContinueDragging(const gfx::Point& point_in_screen) { |
| 724 DCHECK(!detach_into_browser_ || attached_tabstrip_); | 724 DCHECK(!detach_into_browser_ || attached_tabstrip_); |
| 725 | 725 |
| 726 TabStrip* target_tabstrip = detach_behavior_ == DETACHABLE ? | 726 TabStrip* target_tabstrip = detach_behavior_ == DETACHABLE ? |
| 727 GetTabStripForPoint(screen_point) : source_tabstrip_; | 727 GetTabStripForPoint(point_in_screen) : source_tabstrip_; |
| 728 bool tab_strip_changed = (target_tabstrip != attached_tabstrip_); | 728 bool tab_strip_changed = (target_tabstrip != attached_tabstrip_); |
| 729 | 729 |
| 730 if (attached_tabstrip_) { | 730 if (attached_tabstrip_) { |
| 731 int move_delta = screen_point.x() - last_screen_point_.x(); | 731 int move_delta = point_in_screen.x() - last_point_in_screen_.x(); |
| 732 if (move_delta > 0) | 732 if (move_delta > 0) |
| 733 mouse_move_direction_ |= kMovedMouseRight; | 733 mouse_move_direction_ |= kMovedMouseRight; |
| 734 else if (move_delta < 0) | 734 else if (move_delta < 0) |
| 735 mouse_move_direction_ |= kMovedMouseLeft; | 735 mouse_move_direction_ |= kMovedMouseLeft; |
| 736 } | 736 } |
| 737 last_screen_point_ = screen_point; | 737 last_point_in_screen_ = point_in_screen; |
| 738 | 738 |
| 739 if (tab_strip_changed) { | 739 if (tab_strip_changed) { |
| 740 if (detach_into_browser_ && | 740 if (detach_into_browser_ && |
| 741 DragBrowserToNewTabStrip(target_tabstrip, screen_point) == | 741 DragBrowserToNewTabStrip(target_tabstrip, point_in_screen) == |
| 742 DRAG_BROWSER_RESULT_STOP) { | 742 DRAG_BROWSER_RESULT_STOP) { |
| 743 return; | 743 return; |
| 744 } else if (!detach_into_browser_) { | 744 } else if (!detach_into_browser_) { |
| 745 if (attached_tabstrip_) | 745 if (attached_tabstrip_) |
| 746 Detach(RELEASE_CAPTURE); | 746 Detach(RELEASE_CAPTURE); |
| 747 if (target_tabstrip) | 747 if (target_tabstrip) |
| 748 Attach(target_tabstrip, screen_point); | 748 Attach(target_tabstrip, point_in_screen); |
| 749 } | 749 } |
| 750 } | 750 } |
| 751 if (view_.get() || is_dragging_window_) { | 751 if (view_.get() || is_dragging_window_) { |
| 752 static_cast<base::Timer*>(&bring_to_front_timer_)->Start(FROM_HERE, | 752 static_cast<base::Timer*>(&bring_to_front_timer_)->Start(FROM_HERE, |
| 753 base::TimeDelta::FromMilliseconds(kBringToFrontDelay), | 753 base::TimeDelta::FromMilliseconds(kBringToFrontDelay), |
| 754 base::Bind(&TabDragController::BringWindowUnderPointToFront, | 754 base::Bind(&TabDragController::BringWindowUnderPointToFront, |
| 755 base::Unretained(this), screen_point)); | 755 base::Unretained(this), point_in_screen)); |
| 756 } | 756 } |
| 757 | 757 |
| 758 UpdateDockInfo(screen_point); | 758 UpdateDockInfo(point_in_screen); |
| 759 | 759 |
| 760 if (!is_dragging_window_) { | 760 if (!is_dragging_window_) { |
| 761 if (attached_tabstrip_) { | 761 if (attached_tabstrip_) { |
| 762 if (move_only()) { | 762 if (move_only()) { |
| 763 DragActiveTabStacked(screen_point); | 763 DragActiveTabStacked(point_in_screen); |
| 764 } else { | 764 } else { |
| 765 MoveAttached(screen_point); | 765 MoveAttached(point_in_screen); |
| 766 if (tab_strip_changed) { | 766 if (tab_strip_changed) { |
| 767 // Move the corresponding window to the front. We do this after the | 767 // Move the corresponding window to the front. We do this after the |
| 768 // move as on windows activate triggers a synchronous paint. | 768 // move as on windows activate triggers a synchronous paint. |
| 769 attached_tabstrip_->GetWidget()->Activate(); | 769 attached_tabstrip_->GetWidget()->Activate(); |
| 770 } | 770 } |
| 771 } | 771 } |
| 772 } else { | 772 } else { |
| 773 MoveDetached(screen_point); | 773 MoveDetached(point_in_screen); |
| 774 } | 774 } |
| 775 } | 775 } |
| 776 } | 776 } |
| 777 | 777 |
| 778 TabDragController::DragBrowserResultType | 778 TabDragController::DragBrowserResultType |
| 779 TabDragController::DragBrowserToNewTabStrip( | 779 TabDragController::DragBrowserToNewTabStrip( |
| 780 TabStrip* target_tabstrip, | 780 TabStrip* target_tabstrip, |
| 781 const gfx::Point& screen_point) { | 781 const gfx::Point& point_in_screen) { |
| 782 if (!target_tabstrip) { | 782 if (!target_tabstrip) { |
| 783 DetachIntoNewBrowserAndRunMoveLoop(screen_point); | 783 DetachIntoNewBrowserAndRunMoveLoop(point_in_screen); |
| 784 return DRAG_BROWSER_RESULT_STOP; | 784 return DRAG_BROWSER_RESULT_STOP; |
| 785 } | 785 } |
| 786 if (is_dragging_window_) { | 786 if (is_dragging_window_) { |
| 787 #if defined(USE_ASH) | 787 #if defined(USE_ASH) |
| 788 // ReleaseCapture() is going to result in calling back to us (because it | 788 // ReleaseCapture() is going to result in calling back to us (because it |
| 789 // results in a move). That'll cause all sorts of problems. Reset the | 789 // results in a move). That'll cause all sorts of problems. Reset the |
| 790 // observer so we don't get notified and process the event. | 790 // observer so we don't get notified and process the event. |
| 791 move_loop_widget_->RemoveObserver(this); | 791 move_loop_widget_->RemoveObserver(this); |
| 792 move_loop_widget_ = NULL; | 792 move_loop_widget_ = NULL; |
| 793 #endif | 793 #endif |
| (...skipping 18 matching lines...) Expand all Loading... |
| 812 browser_widget->EndMoveLoop(); | 812 browser_widget->EndMoveLoop(); |
| 813 | 813 |
| 814 // Ideally we would always swap the tabs now, but on windows it seems that | 814 // Ideally we would always swap the tabs now, but on windows it seems that |
| 815 // running the move loop implicitly activates the window when done, leading | 815 // running the move loop implicitly activates the window when done, leading |
| 816 // to all sorts of flicker. So, on windows, instead we process the move | 816 // to all sorts of flicker. So, on windows, instead we process the move |
| 817 // after the loop completes. But on chromeos, we can do tab swapping now to | 817 // after the loop completes. But on chromeos, we can do tab swapping now to |
| 818 // avoid the tab flashing issue(crbug.com/116329). | 818 // avoid the tab flashing issue(crbug.com/116329). |
| 819 #if defined(USE_ASH) | 819 #if defined(USE_ASH) |
| 820 is_dragging_window_ = false; | 820 is_dragging_window_ = false; |
| 821 Detach(DONT_RELEASE_CAPTURE); | 821 Detach(DONT_RELEASE_CAPTURE); |
| 822 Attach(target_tabstrip, screen_point); | 822 Attach(target_tabstrip, point_in_screen); |
| 823 // Move the tabs into position. | 823 // Move the tabs into position. |
| 824 MoveAttached(screen_point); | 824 MoveAttached(point_in_screen); |
| 825 attached_tabstrip_->GetWidget()->Activate(); | 825 attached_tabstrip_->GetWidget()->Activate(); |
| 826 #else | 826 #else |
| 827 tab_strip_to_attach_to_after_exit_ = target_tabstrip; | 827 tab_strip_to_attach_to_after_exit_ = target_tabstrip; |
| 828 #endif | 828 #endif |
| 829 | 829 |
| 830 waiting_for_run_loop_to_exit_ = true; | 830 waiting_for_run_loop_to_exit_ = true; |
| 831 end_run_loop_behavior_ = END_RUN_LOOP_CONTINUE_DRAGGING; | 831 end_run_loop_behavior_ = END_RUN_LOOP_CONTINUE_DRAGGING; |
| 832 return DRAG_BROWSER_RESULT_STOP; | 832 return DRAG_BROWSER_RESULT_STOP; |
| 833 } | 833 } |
| 834 Detach(DONT_RELEASE_CAPTURE); | 834 Detach(DONT_RELEASE_CAPTURE); |
| 835 Attach(target_tabstrip, screen_point); | 835 Attach(target_tabstrip, point_in_screen); |
| 836 return DRAG_BROWSER_RESULT_CONTINUE; | 836 return DRAG_BROWSER_RESULT_CONTINUE; |
| 837 } | 837 } |
| 838 | 838 |
| 839 void TabDragController::DragActiveTabStacked( | 839 void TabDragController::DragActiveTabStacked( |
| 840 const gfx::Point& screen_point) { | 840 const gfx::Point& point_in_screen) { |
| 841 if (attached_tabstrip_->tab_count() != | 841 if (attached_tabstrip_->tab_count() != |
| 842 static_cast<int>(initial_tab_positions_.size())) | 842 static_cast<int>(initial_tab_positions_.size())) |
| 843 return; // TODO: should cancel drag if this happens. | 843 return; // TODO: should cancel drag if this happens. |
| 844 | 844 |
| 845 int delta = screen_point.x() - start_screen_point_.x(); | 845 int delta = point_in_screen.x() - start_point_in_screen_.x(); |
| 846 attached_tabstrip_->DragActiveTab(initial_tab_positions_, delta); | 846 attached_tabstrip_->DragActiveTab(initial_tab_positions_, delta); |
| 847 } | 847 } |
| 848 | 848 |
| 849 void TabDragController::MoveAttachedToNextStackedIndex( | 849 void TabDragController::MoveAttachedToNextStackedIndex( |
| 850 const gfx::Point& screen_point) { | 850 const gfx::Point& point_in_screen) { |
| 851 int index = attached_tabstrip_->touch_layout_->active_index(); | 851 int index = attached_tabstrip_->touch_layout_->active_index(); |
| 852 if (index + 1 >= attached_tabstrip_->tab_count()) | 852 if (index + 1 >= attached_tabstrip_->tab_count()) |
| 853 return; | 853 return; |
| 854 | 854 |
| 855 GetModel(attached_tabstrip_)->MoveSelectedTabsTo(index + 1); | 855 GetModel(attached_tabstrip_)->MoveSelectedTabsTo(index + 1); |
| 856 StartMoveStackedTimerIfNecessary(screen_point, kMoveAttachedSubsequentDelay); | 856 StartMoveStackedTimerIfNecessary(point_in_screen, |
| 857 kMoveAttachedSubsequentDelay); |
| 857 } | 858 } |
| 858 | 859 |
| 859 void TabDragController::MoveAttachedToPreviousStackedIndex( | 860 void TabDragController::MoveAttachedToPreviousStackedIndex( |
| 860 const gfx::Point& screen_point) { | 861 const gfx::Point& point_in_screen) { |
| 861 int index = attached_tabstrip_->touch_layout_->active_index(); | 862 int index = attached_tabstrip_->touch_layout_->active_index(); |
| 862 if (index <= attached_tabstrip_->GetMiniTabCount()) | 863 if (index <= attached_tabstrip_->GetMiniTabCount()) |
| 863 return; | 864 return; |
| 864 | 865 |
| 865 GetModel(attached_tabstrip_)->MoveSelectedTabsTo(index - 1); | 866 GetModel(attached_tabstrip_)->MoveSelectedTabsTo(index - 1); |
| 866 StartMoveStackedTimerIfNecessary(screen_point, kMoveAttachedSubsequentDelay); | 867 StartMoveStackedTimerIfNecessary(point_in_screen, |
| 868 kMoveAttachedSubsequentDelay); |
| 867 } | 869 } |
| 868 | 870 |
| 869 void TabDragController::MoveAttached(const gfx::Point& screen_point) { | 871 void TabDragController::MoveAttached(const gfx::Point& point_in_screen) { |
| 870 DCHECK(attached_tabstrip_); | 872 DCHECK(attached_tabstrip_); |
| 871 DCHECK(!view_.get()); | 873 DCHECK(!view_.get()); |
| 872 DCHECK(!is_dragging_window_); | 874 DCHECK(!is_dragging_window_); |
| 873 | 875 |
| 874 gfx::Point dragged_view_point = GetAttachedDragPoint(screen_point); | 876 gfx::Point dragged_view_point = GetAttachedDragPoint(point_in_screen); |
| 875 | 877 |
| 876 // Determine the horizontal move threshold. This is dependent on the width | 878 // Determine the horizontal move threshold. This is dependent on the width |
| 877 // of tabs. The smaller the tabs compared to the standard size, the smaller | 879 // of tabs. The smaller the tabs compared to the standard size, the smaller |
| 878 // the threshold. | 880 // the threshold. |
| 879 int threshold = kHorizontalMoveThreshold; | 881 int threshold = kHorizontalMoveThreshold; |
| 880 if (!attached_tabstrip_->touch_layout_.get()) { | 882 if (!attached_tabstrip_->touch_layout_.get()) { |
| 881 double unselected, selected; | 883 double unselected, selected; |
| 882 attached_tabstrip_->GetCurrentTabWidths(&unselected, &selected); | 884 attached_tabstrip_->GetCurrentTabWidths(&unselected, &selected); |
| 883 double ratio = unselected / Tab::GetStandardSize().width(); | 885 double ratio = unselected / Tab::GetStandardSize().width(); |
| 884 threshold = static_cast<int>(ratio * kHorizontalMoveThreshold); | 886 threshold = static_cast<int>(ratio * kHorizontalMoveThreshold); |
| 885 } | 887 } |
| 886 // else case: touch tabs never shrink. | 888 // else case: touch tabs never shrink. |
| 887 | 889 |
| 888 std::vector<BaseTab*> tabs(drag_data_.size()); | 890 std::vector<BaseTab*> tabs(drag_data_.size()); |
| 889 for (size_t i = 0; i < drag_data_.size(); ++i) | 891 for (size_t i = 0; i < drag_data_.size(); ++i) |
| 890 tabs[i] = drag_data_[i].attached_tab; | 892 tabs[i] = drag_data_[i].attached_tab; |
| 891 | 893 |
| 892 bool did_layout = false; | 894 bool did_layout = false; |
| 893 // Update the model, moving the WebContents from one index to another. Do this | 895 // Update the model, moving the WebContents from one index to another. Do this |
| 894 // only if we have moved a minimum distance since the last reorder (to prevent | 896 // only if we have moved a minimum distance since the last reorder (to prevent |
| 895 // jitter) or if this the first move and the tabs are not consecutive. | 897 // jitter) or if this the first move and the tabs are not consecutive. |
| 896 if ((abs(screen_point.x() - last_move_screen_loc_) > threshold || | 898 if ((abs(point_in_screen.x() - last_move_screen_loc_) > threshold || |
| 897 (initial_move_ && !AreTabsConsecutive()))) { | 899 (initial_move_ && !AreTabsConsecutive()))) { |
| 898 TabStripModel* attached_model = GetModel(attached_tabstrip_); | 900 TabStripModel* attached_model = GetModel(attached_tabstrip_); |
| 899 gfx::Rect bounds = GetDraggedViewTabStripBounds(dragged_view_point); | 901 gfx::Rect bounds = GetDraggedViewTabStripBounds(dragged_view_point); |
| 900 int to_index = GetInsertionIndexForDraggedBounds(bounds); | 902 int to_index = GetInsertionIndexForDraggedBounds(bounds); |
| 901 TabContents* last_contents = drag_data_[drag_data_.size() - 1].contents; | 903 TabContents* last_contents = drag_data_[drag_data_.size() - 1].contents; |
| 902 int index_of_last_item = | 904 int index_of_last_item = |
| 903 attached_model->GetIndexOfTabContents(last_contents); | 905 attached_model->GetIndexOfTabContents(last_contents); |
| 904 if (initial_move_) { | 906 if (initial_move_) { |
| 905 // TabStrip determines if the tabs needs to be animated based on model | 907 // TabStrip determines if the tabs needs to be animated based on model |
| 906 // position. This means we need to invoke LayoutDraggedTabsAt before | 908 // position. This means we need to invoke LayoutDraggedTabsAt before |
| 907 // changing the model. | 909 // changing the model. |
| 908 attached_tabstrip_->LayoutDraggedTabsAt( | 910 attached_tabstrip_->LayoutDraggedTabsAt( |
| 909 tabs, source_tab_drag_data()->attached_tab, dragged_view_point, | 911 tabs, source_tab_drag_data()->attached_tab, dragged_view_point, |
| 910 initial_move_); | 912 initial_move_); |
| 911 did_layout = true; | 913 did_layout = true; |
| 912 } | 914 } |
| 913 attached_model->MoveSelectedTabsTo(to_index); | 915 attached_model->MoveSelectedTabsTo(to_index); |
| 914 | 916 |
| 915 // Move may do nothing in certain situations (such as when dragging pinned | 917 // Move may do nothing in certain situations (such as when dragging pinned |
| 916 // tabs). Make sure the tabstrip actually changed before updating | 918 // tabs). Make sure the tabstrip actually changed before updating |
| 917 // last_move_screen_loc_. | 919 // last_move_screen_loc_. |
| 918 if (index_of_last_item != | 920 if (index_of_last_item != |
| 919 attached_model->GetIndexOfTabContents(last_contents)) { | 921 attached_model->GetIndexOfTabContents(last_contents)) { |
| 920 last_move_screen_loc_ = screen_point.x(); | 922 last_move_screen_loc_ = point_in_screen.x(); |
| 921 } | 923 } |
| 922 } | 924 } |
| 923 | 925 |
| 924 if (!did_layout) { | 926 if (!did_layout) { |
| 925 attached_tabstrip_->LayoutDraggedTabsAt( | 927 attached_tabstrip_->LayoutDraggedTabsAt( |
| 926 tabs, source_tab_drag_data()->attached_tab, dragged_view_point, | 928 tabs, source_tab_drag_data()->attached_tab, dragged_view_point, |
| 927 initial_move_); | 929 initial_move_); |
| 928 } | 930 } |
| 929 | 931 |
| 930 StartMoveStackedTimerIfNecessary(screen_point, kMoveAttachedInitialDelay); | 932 StartMoveStackedTimerIfNecessary(point_in_screen, kMoveAttachedInitialDelay); |
| 931 | 933 |
| 932 initial_move_ = false; | 934 initial_move_ = false; |
| 933 } | 935 } |
| 934 | 936 |
| 935 void TabDragController::MoveDetached(const gfx::Point& screen_point) { | 937 void TabDragController::MoveDetached(const gfx::Point& point_in_screen) { |
| 936 DCHECK(!attached_tabstrip_); | 938 DCHECK(!attached_tabstrip_); |
| 937 DCHECK(view_.get()); | 939 DCHECK(view_.get()); |
| 938 DCHECK(!is_dragging_window_); | 940 DCHECK(!is_dragging_window_); |
| 939 | 941 |
| 940 // Move the View. There are no changes to the model if we're detached. | 942 // Move the View. There are no changes to the model if we're detached. |
| 941 view_->MoveTo(screen_point); | 943 view_->MoveTo(point_in_screen); |
| 942 } | 944 } |
| 943 | 945 |
| 944 void TabDragController::StartMoveStackedTimerIfNecessary( | 946 void TabDragController::StartMoveStackedTimerIfNecessary( |
| 945 const gfx::Point& screen_point, | 947 const gfx::Point& point_in_screen, |
| 946 int delay_ms) { | 948 int delay_ms) { |
| 947 DCHECK(attached_tabstrip_); | 949 DCHECK(attached_tabstrip_); |
| 948 | 950 |
| 949 TouchTabStripLayout* touch_layout = attached_tabstrip_->touch_layout_.get(); | 951 TouchTabStripLayout* touch_layout = attached_tabstrip_->touch_layout_.get(); |
| 950 if (!touch_layout) | 952 if (!touch_layout) |
| 951 return; | 953 return; |
| 952 | 954 |
| 953 gfx::Point dragged_view_point = GetAttachedDragPoint(screen_point); | 955 gfx::Point dragged_view_point = GetAttachedDragPoint(point_in_screen); |
| 954 gfx::Rect bounds = GetDraggedViewTabStripBounds(dragged_view_point); | 956 gfx::Rect bounds = GetDraggedViewTabStripBounds(dragged_view_point); |
| 955 int index = touch_layout->active_index(); | 957 int index = touch_layout->active_index(); |
| 956 if (ShouldDragToNextStackedTab(bounds, index)) { | 958 if (ShouldDragToNextStackedTab(bounds, index)) { |
| 957 static_cast<base::Timer*>(&move_stacked_timer_)->Start( | 959 static_cast<base::Timer*>(&move_stacked_timer_)->Start( |
| 958 FROM_HERE, | 960 FROM_HERE, |
| 959 base::TimeDelta::FromMilliseconds(delay_ms), | 961 base::TimeDelta::FromMilliseconds(delay_ms), |
| 960 base::Bind(&TabDragController::MoveAttachedToNextStackedIndex, | 962 base::Bind(&TabDragController::MoveAttachedToNextStackedIndex, |
| 961 base::Unretained(this), screen_point)); | 963 base::Unretained(this), point_in_screen)); |
| 962 } else if (ShouldDragToPreviousStackedTab(bounds, index)) { | 964 } else if (ShouldDragToPreviousStackedTab(bounds, index)) { |
| 963 static_cast<base::Timer*>(&move_stacked_timer_)->Start( | 965 static_cast<base::Timer*>(&move_stacked_timer_)->Start( |
| 964 FROM_HERE, | 966 FROM_HERE, |
| 965 base::TimeDelta::FromMilliseconds(delay_ms), | 967 base::TimeDelta::FromMilliseconds(delay_ms), |
| 966 base::Bind(&TabDragController::MoveAttachedToPreviousStackedIndex, | 968 base::Bind(&TabDragController::MoveAttachedToPreviousStackedIndex, |
| 967 base::Unretained(this), screen_point)); | 969 base::Unretained(this), point_in_screen)); |
| 968 } | 970 } |
| 969 } | 971 } |
| 970 | 972 |
| 971 TabDragController::DetachPosition TabDragController::GetDetachPosition( | 973 TabDragController::DetachPosition TabDragController::GetDetachPosition( |
| 972 const gfx::Point& screen_point) { | 974 const gfx::Point& point_in_screen) { |
| 973 DCHECK(attached_tabstrip_); | 975 DCHECK(attached_tabstrip_); |
| 974 gfx::Point attached_point(screen_point); | 976 gfx::Point attached_point(point_in_screen); |
| 975 views::View::ConvertPointToView(NULL, attached_tabstrip_, &attached_point); | 977 views::View::ConvertPointToView(NULL, attached_tabstrip_, &attached_point); |
| 976 if (attached_point.x() < 0) | 978 if (attached_point.x() < 0) |
| 977 return DETACH_BEFORE; | 979 return DETACH_BEFORE; |
| 978 if (attached_point.x() >= attached_tabstrip_->width()) | 980 if (attached_point.x() >= attached_tabstrip_->width()) |
| 979 return DETACH_AFTER; | 981 return DETACH_AFTER; |
| 980 return DETACH_ABOVE_OR_BELOW; | 982 return DETACH_ABOVE_OR_BELOW; |
| 981 } | 983 } |
| 982 | 984 |
| 983 DockInfo TabDragController::GetDockInfoAtPoint(const gfx::Point& screen_point) { | 985 DockInfo TabDragController::GetDockInfoAtPoint( |
| 986 const gfx::Point& point_in_screen) { |
| 984 // TODO: add support for dock info when |detach_into_browser_| is true. | 987 // TODO: add support for dock info when |detach_into_browser_| is true. |
| 985 if (attached_tabstrip_ || detach_into_browser_) { | 988 if (attached_tabstrip_ || detach_into_browser_) { |
| 986 // If the mouse is over a tab strip, don't offer a dock position. | 989 // If the mouse is over a tab strip, don't offer a dock position. |
| 987 return DockInfo(); | 990 return DockInfo(); |
| 988 } | 991 } |
| 989 | 992 |
| 990 if (dock_info_.IsValidForPoint(screen_point)) { | 993 if (dock_info_.IsValidForPoint(point_in_screen)) { |
| 991 // It's possible any given screen coordinate has multiple docking | 994 // It's possible any given screen coordinate has multiple docking |
| 992 // positions. Check the current info first to avoid having the docking | 995 // positions. Check the current info first to avoid having the docking |
| 993 // position bounce around. | 996 // position bounce around. |
| 994 return dock_info_; | 997 return dock_info_; |
| 995 } | 998 } |
| 996 | 999 |
| 997 gfx::NativeView dragged_view = view_->GetWidget()->GetNativeView(); | 1000 gfx::NativeView dragged_view = view_->GetWidget()->GetNativeView(); |
| 998 dock_windows_.insert(dragged_view); | 1001 dock_windows_.insert(dragged_view); |
| 999 DockInfo info = DockInfo::GetDockInfoAtPoint(screen_point, dock_windows_); | 1002 DockInfo info = DockInfo::GetDockInfoAtPoint(point_in_screen, dock_windows_); |
| 1000 dock_windows_.erase(dragged_view); | 1003 dock_windows_.erase(dragged_view); |
| 1001 return info; | 1004 return info; |
| 1002 } | 1005 } |
| 1003 | 1006 |
| 1004 TabStrip* TabDragController::GetTabStripForPoint( | 1007 TabStrip* TabDragController::GetTabStripForPoint( |
| 1005 const gfx::Point& screen_point) { | 1008 const gfx::Point& point_in_screen) { |
| 1006 gfx::NativeView dragged_view = NULL; | 1009 gfx::NativeView dragged_view = NULL; |
| 1007 if (view_.get()) | 1010 if (view_.get()) |
| 1008 dragged_view = view_->GetWidget()->GetNativeView(); | 1011 dragged_view = view_->GetWidget()->GetNativeView(); |
| 1009 else if (is_dragging_window_) | 1012 else if (is_dragging_window_) |
| 1010 dragged_view = attached_tabstrip_->GetWidget()->GetNativeView(); | 1013 dragged_view = attached_tabstrip_->GetWidget()->GetNativeView(); |
| 1011 if (dragged_view) | 1014 if (dragged_view) |
| 1012 dock_windows_.insert(dragged_view); | 1015 dock_windows_.insert(dragged_view); |
| 1013 gfx::NativeWindow local_window = | 1016 gfx::NativeWindow local_window = |
| 1014 DockInfo::GetLocalProcessWindowAtPoint(screen_point, dock_windows_); | 1017 DockInfo::GetLocalProcessWindowAtPoint(point_in_screen, dock_windows_); |
| 1015 if (dragged_view) | 1018 if (dragged_view) |
| 1016 dock_windows_.erase(dragged_view); | 1019 dock_windows_.erase(dragged_view); |
| 1017 TabStrip* tab_strip = GetTabStripForWindow(local_window); | 1020 TabStrip* tab_strip = GetTabStripForWindow(local_window); |
| 1018 if (tab_strip && DoesTabStripContain(tab_strip, screen_point)) | 1021 if (tab_strip && DoesTabStripContain(tab_strip, point_in_screen)) |
| 1019 return tab_strip; | 1022 return tab_strip; |
| 1020 return is_dragging_window_ ? attached_tabstrip_ : NULL; | 1023 return is_dragging_window_ ? attached_tabstrip_ : NULL; |
| 1021 } | 1024 } |
| 1022 | 1025 |
| 1023 TabStrip* TabDragController::GetTabStripForWindow(gfx::NativeWindow window) { | 1026 TabStrip* TabDragController::GetTabStripForWindow(gfx::NativeWindow window) { |
| 1024 if (!window) | 1027 if (!window) |
| 1025 return NULL; | 1028 return NULL; |
| 1026 BrowserView* browser_view = | 1029 BrowserView* browser_view = |
| 1027 BrowserView::GetBrowserViewForNativeWindow(window); | 1030 BrowserView::GetBrowserViewForNativeWindow(window); |
| 1028 // We don't allow drops on windows that don't have tabstrips. | 1031 // We don't allow drops on windows that don't have tabstrips. |
| 1029 if (!browser_view || | 1032 if (!browser_view || |
| 1030 !browser_view->browser()->SupportsWindowFeature( | 1033 !browser_view->browser()->SupportsWindowFeature( |
| 1031 Browser::FEATURE_TABSTRIP)) | 1034 Browser::FEATURE_TABSTRIP)) |
| 1032 return NULL; | 1035 return NULL; |
| 1033 | 1036 |
| 1034 TabStrip* other_tabstrip = browser_view->tabstrip(); | 1037 TabStrip* other_tabstrip = browser_view->tabstrip(); |
| 1035 TabStrip* tab_strip = | 1038 TabStrip* tab_strip = |
| 1036 attached_tabstrip_ ? attached_tabstrip_ : source_tabstrip_; | 1039 attached_tabstrip_ ? attached_tabstrip_ : source_tabstrip_; |
| 1037 DCHECK(tab_strip); | 1040 DCHECK(tab_strip); |
| 1038 | 1041 |
| 1039 return other_tabstrip->controller()->IsCompatibleWith(tab_strip) ? | 1042 return other_tabstrip->controller()->IsCompatibleWith(tab_strip) ? |
| 1040 other_tabstrip : NULL; | 1043 other_tabstrip : NULL; |
| 1041 } | 1044 } |
| 1042 | 1045 |
| 1043 bool TabDragController::DoesTabStripContain( | 1046 bool TabDragController::DoesTabStripContain( |
| 1044 TabStrip* tabstrip, | 1047 TabStrip* tabstrip, |
| 1045 const gfx::Point& screen_point) const { | 1048 const gfx::Point& point_in_screen) const { |
| 1046 static const int kVerticalDetachMagnetism = 15; | 1049 static const int kVerticalDetachMagnetism = 15; |
| 1047 // Make sure the specified screen point is actually within the bounds of the | 1050 // Make sure the specified screen point is actually within the bounds of the |
| 1048 // specified tabstrip... | 1051 // specified tabstrip... |
| 1049 gfx::Rect tabstrip_bounds = GetViewScreenBounds(tabstrip); | 1052 gfx::Rect tabstrip_bounds = GetViewScreenBounds(tabstrip); |
| 1050 if (screen_point.x() < tabstrip_bounds.right() && | 1053 if (point_in_screen.x() < tabstrip_bounds.right() && |
| 1051 screen_point.x() >= tabstrip_bounds.x()) { | 1054 point_in_screen.x() >= tabstrip_bounds.x()) { |
| 1052 // TODO(beng): make this be relative to the start position of the mouse | 1055 // TODO(beng): make this be relative to the start position of the mouse |
| 1053 // for the source TabStrip. | 1056 // for the source TabStrip. |
| 1054 int upper_threshold = tabstrip_bounds.bottom() + kVerticalDetachMagnetism; | 1057 int upper_threshold = tabstrip_bounds.bottom() + kVerticalDetachMagnetism; |
| 1055 int lower_threshold = tabstrip_bounds.y() - kVerticalDetachMagnetism; | 1058 int lower_threshold = tabstrip_bounds.y() - kVerticalDetachMagnetism; |
| 1056 return screen_point.y() >= lower_threshold && | 1059 return point_in_screen.y() >= lower_threshold && |
| 1057 screen_point.y() <= upper_threshold; | 1060 point_in_screen.y() <= upper_threshold; |
| 1058 } | 1061 } |
| 1059 return false; | 1062 return false; |
| 1060 } | 1063 } |
| 1061 | 1064 |
| 1062 void TabDragController::Attach(TabStrip* attached_tabstrip, | 1065 void TabDragController::Attach(TabStrip* attached_tabstrip, |
| 1063 const gfx::Point& screen_point) { | 1066 const gfx::Point& point_in_screen) { |
| 1064 DCHECK(!attached_tabstrip_); // We should already have detached by the time | 1067 DCHECK(!attached_tabstrip_); // We should already have detached by the time |
| 1065 // we get here. | 1068 // we get here. |
| 1066 | 1069 |
| 1067 attached_tabstrip_ = attached_tabstrip; | 1070 attached_tabstrip_ = attached_tabstrip; |
| 1068 | 1071 |
| 1069 // And we don't need the dragged view. | 1072 // And we don't need the dragged view. |
| 1070 view_.reset(); | 1073 view_.reset(); |
| 1071 | 1074 |
| 1072 std::vector<BaseTab*> tabs = | 1075 std::vector<BaseTab*> tabs = |
| 1073 GetTabsMatchingDraggedContents(attached_tabstrip_); | 1076 GetTabsMatchingDraggedContents(attached_tabstrip_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1085 drag_data_[i].contents->web_contents()->SetDelegate(NULL); | 1088 drag_data_[i].contents->web_contents()->SetDelegate(NULL); |
| 1086 drag_data_[i].original_delegate = NULL; | 1089 drag_data_[i].original_delegate = NULL; |
| 1087 } | 1090 } |
| 1088 | 1091 |
| 1089 // Return the WebContents to normalcy. | 1092 // Return the WebContents to normalcy. |
| 1090 source_dragged_contents()->web_contents()->SetCapturingContents(false); | 1093 source_dragged_contents()->web_contents()->SetCapturingContents(false); |
| 1091 } | 1094 } |
| 1092 | 1095 |
| 1093 // Inserting counts as a move. We don't want the tabs to jitter when the | 1096 // Inserting counts as a move. We don't want the tabs to jitter when the |
| 1094 // user moves the tab immediately after attaching it. | 1097 // user moves the tab immediately after attaching it. |
| 1095 last_move_screen_loc_ = screen_point.x(); | 1098 last_move_screen_loc_ = point_in_screen.x(); |
| 1096 | 1099 |
| 1097 // Figure out where to insert the tab based on the bounds of the dragged | 1100 // Figure out where to insert the tab based on the bounds of the dragged |
| 1098 // representation and the ideal bounds of the other Tabs already in the | 1101 // representation and the ideal bounds of the other Tabs already in the |
| 1099 // strip. ("ideal bounds" are stable even if the Tabs' actual bounds are | 1102 // strip. ("ideal bounds" are stable even if the Tabs' actual bounds are |
| 1100 // changing due to animation). | 1103 // changing due to animation). |
| 1101 gfx::Point tab_strip_point(screen_point); | 1104 gfx::Point tab_strip_point(point_in_screen); |
| 1102 views::View::ConvertPointToView(NULL, attached_tabstrip_, &tab_strip_point); | 1105 views::View::ConvertPointToView(NULL, attached_tabstrip_, &tab_strip_point); |
| 1103 tab_strip_point.set_x( | 1106 tab_strip_point.set_x( |
| 1104 attached_tabstrip_->GetMirroredXInView(tab_strip_point.x())); | 1107 attached_tabstrip_->GetMirroredXInView(tab_strip_point.x())); |
| 1105 tab_strip_point.Offset(-mouse_offset_.x(), -mouse_offset_.y()); | 1108 tab_strip_point.Offset(-mouse_offset_.x(), -mouse_offset_.y()); |
| 1106 gfx::Rect bounds = GetDraggedViewTabStripBounds(tab_strip_point); | 1109 gfx::Rect bounds = GetDraggedViewTabStripBounds(tab_strip_point); |
| 1107 int index = GetInsertionIndexForDraggedBounds(bounds); | 1110 int index = GetInsertionIndexForDraggedBounds(bounds); |
| 1108 for (size_t i = 0; i < drag_data_.size(); ++i) { | 1111 for (size_t i = 0; i < drag_data_.size(); ++i) { |
| 1109 int add_types = TabStripModel::ADD_NONE; | 1112 int add_types = TabStripModel::ADD_NONE; |
| 1110 if (attached_tabstrip_->touch_layout_.get()) { | 1113 if (attached_tabstrip_->touch_layout_.get()) { |
| 1111 // TouchTabStripLayout positions relative to the active tab, if we don't | 1114 // TouchTabStripLayout positions relative to the active tab, if we don't |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1224 | 1227 |
| 1225 // Create the dragged view. | 1228 // Create the dragged view. |
| 1226 if (!detach_into_browser_) | 1229 if (!detach_into_browser_) |
| 1227 CreateDraggedView(tab_data, drag_bounds); | 1230 CreateDraggedView(tab_data, drag_bounds); |
| 1228 | 1231 |
| 1229 attached_tabstrip_->DraggedTabsDetached(); | 1232 attached_tabstrip_->DraggedTabsDetached(); |
| 1230 attached_tabstrip_ = NULL; | 1233 attached_tabstrip_ = NULL; |
| 1231 } | 1234 } |
| 1232 | 1235 |
| 1233 void TabDragController::DetachIntoNewBrowserAndRunMoveLoop( | 1236 void TabDragController::DetachIntoNewBrowserAndRunMoveLoop( |
| 1234 const gfx::Point& screen_point) { | 1237 const gfx::Point& point_in_screen) { |
| 1235 if (GetModel(attached_tabstrip_)->count() == | 1238 if (GetModel(attached_tabstrip_)->count() == |
| 1236 static_cast<int>(drag_data_.size())) { | 1239 static_cast<int>(drag_data_.size())) { |
| 1237 // All the tabs in a browser are being dragged but all the tabs weren't | 1240 // All the tabs in a browser are being dragged but all the tabs weren't |
| 1238 // initially being dragged. For this to happen the user would have to | 1241 // initially being dragged. For this to happen the user would have to |
| 1239 // start dragging a set of tabs, the other tabs close, then detach. | 1242 // start dragging a set of tabs, the other tabs close, then detach. |
| 1240 RunMoveLoop(); | 1243 RunMoveLoop(); |
| 1241 return; | 1244 return; |
| 1242 } | 1245 } |
| 1243 | 1246 |
| 1244 // Create a new browser to house the dragged tabs and have the OS run a move | 1247 // Create a new browser to house the dragged tabs and have the OS run a move |
| 1245 // loop. | 1248 // loop. |
| 1246 | 1249 |
| 1247 gfx::Point attached_point = GetAttachedDragPoint(screen_point); | 1250 gfx::Point attached_point = GetAttachedDragPoint(point_in_screen); |
| 1248 | 1251 |
| 1249 // Calculate the bounds for the tabs from the attached_tab_strip. We do this | 1252 // Calculate the bounds for the tabs from the attached_tab_strip. We do this |
| 1250 // so that the tabs don't change size when detached. | 1253 // so that the tabs don't change size when detached. |
| 1251 std::vector<gfx::Rect> drag_bounds = | 1254 std::vector<gfx::Rect> drag_bounds = |
| 1252 CalculateBoundsForDraggedTabs(attached_point.x()); | 1255 CalculateBoundsForDraggedTabs(attached_point.x()); |
| 1253 | 1256 |
| 1254 Browser* browser = CreateBrowserForDrag( | 1257 Browser* browser = CreateBrowserForDrag( |
| 1255 attached_tabstrip_, screen_point, &drag_bounds); | 1258 attached_tabstrip_, point_in_screen, &drag_bounds); |
| 1256 Detach(DONT_RELEASE_CAPTURE); | 1259 Detach(DONT_RELEASE_CAPTURE); |
| 1257 BrowserView* dragged_browser_view = | 1260 BrowserView* dragged_browser_view = |
| 1258 BrowserView::GetBrowserViewForBrowser(browser); | 1261 BrowserView::GetBrowserViewForBrowser(browser); |
| 1259 dragged_browser_view->GetWidget()->SetVisibilityChangedAnimationsEnabled( | 1262 dragged_browser_view->GetWidget()->SetVisibilityChangedAnimationsEnabled( |
| 1260 false); | 1263 false); |
| 1261 Attach(dragged_browser_view->tabstrip(), gfx::Point()); | 1264 Attach(dragged_browser_view->tabstrip(), gfx::Point()); |
| 1262 // TODO: come up with a cleaner way to do this. | 1265 // TODO: come up with a cleaner way to do this. |
| 1263 attached_tabstrip_->SetTabBoundsForDrag(drag_bounds); | 1266 attached_tabstrip_->SetTabBoundsForDrag(drag_bounds); |
| 1264 | 1267 |
| 1265 browser->window()->Show(); | 1268 browser->window()->Show(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1294 // Under chromeos we immediately set the |move_loop_widget_| to NULL. | 1297 // Under chromeos we immediately set the |move_loop_widget_| to NULL. |
| 1295 if (move_loop_widget_) { | 1298 if (move_loop_widget_) { |
| 1296 move_loop_widget_->RemoveObserver(this); | 1299 move_loop_widget_->RemoveObserver(this); |
| 1297 move_loop_widget_ = NULL; | 1300 move_loop_widget_ = NULL; |
| 1298 } | 1301 } |
| 1299 is_dragging_window_ = false; | 1302 is_dragging_window_ = false; |
| 1300 waiting_for_run_loop_to_exit_ = false; | 1303 waiting_for_run_loop_to_exit_ = false; |
| 1301 if (end_run_loop_behavior_ == END_RUN_LOOP_CONTINUE_DRAGGING) { | 1304 if (end_run_loop_behavior_ == END_RUN_LOOP_CONTINUE_DRAGGING) { |
| 1302 end_run_loop_behavior_ = END_RUN_LOOP_STOP_DRAGGING; | 1305 end_run_loop_behavior_ = END_RUN_LOOP_STOP_DRAGGING; |
| 1303 if (tab_strip_to_attach_to_after_exit_) { | 1306 if (tab_strip_to_attach_to_after_exit_) { |
| 1304 gfx::Point screen_point(GetCursorScreenPoint()); | 1307 gfx::Point point_in_screen(GetCursorScreenPoint()); |
| 1305 Detach(DONT_RELEASE_CAPTURE); | 1308 Detach(DONT_RELEASE_CAPTURE); |
| 1306 Attach(tab_strip_to_attach_to_after_exit_, screen_point); | 1309 Attach(tab_strip_to_attach_to_after_exit_, point_in_screen); |
| 1307 // Move the tabs into position. | 1310 // Move the tabs into position. |
| 1308 MoveAttached(screen_point); | 1311 MoveAttached(point_in_screen); |
| 1309 attached_tabstrip_->GetWidget()->Activate(); | 1312 attached_tabstrip_->GetWidget()->Activate(); |
| 1310 tab_strip_to_attach_to_after_exit_ = NULL; | 1313 tab_strip_to_attach_to_after_exit_ = NULL; |
| 1311 } | 1314 } |
| 1312 DCHECK(attached_tabstrip_); | 1315 DCHECK(attached_tabstrip_); |
| 1313 attached_tabstrip_->GetWidget()->SetCapture(attached_tabstrip_); | 1316 attached_tabstrip_->GetWidget()->SetCapture(attached_tabstrip_); |
| 1314 } else if (active_) { | 1317 } else if (active_) { |
| 1315 EndDrag(result == views::Widget::MOVE_LOOP_CANCELED); | 1318 EndDrag(result == views::Widget::MOVE_LOOP_CANCELED); |
| 1316 } | 1319 } |
| 1317 } | 1320 } |
| 1318 | 1321 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1446 } | 1449 } |
| 1447 | 1450 |
| 1448 double sel_width, unselected_width; | 1451 double sel_width, unselected_width; |
| 1449 attached_tabstrip_->GetCurrentTabWidths(&sel_width, &unselected_width); | 1452 attached_tabstrip_->GetCurrentTabWidths(&sel_width, &unselected_width); |
| 1450 return gfx::Rect(tab_strip_point.x(), tab_strip_point.y(), | 1453 return gfx::Rect(tab_strip_point.x(), tab_strip_point.y(), |
| 1451 static_cast<int>(sel_width), | 1454 static_cast<int>(sel_width), |
| 1452 Tab::GetStandardSize().height()); | 1455 Tab::GetStandardSize().height()); |
| 1453 } | 1456 } |
| 1454 | 1457 |
| 1455 gfx::Point TabDragController::GetAttachedDragPoint( | 1458 gfx::Point TabDragController::GetAttachedDragPoint( |
| 1456 const gfx::Point& screen_point) { | 1459 const gfx::Point& point_in_screen) { |
| 1457 DCHECK(attached_tabstrip_); // The tab must be attached. | 1460 DCHECK(attached_tabstrip_); // The tab must be attached. |
| 1458 | 1461 |
| 1459 gfx::Point tab_loc(screen_point); | 1462 gfx::Point tab_loc(point_in_screen); |
| 1460 views::View::ConvertPointToView(NULL, attached_tabstrip_, &tab_loc); | 1463 views::View::ConvertPointToView(NULL, attached_tabstrip_, &tab_loc); |
| 1461 int x = | 1464 int x = |
| 1462 attached_tabstrip_->GetMirroredXInView(tab_loc.x()) - mouse_offset_.x(); | 1465 attached_tabstrip_->GetMirroredXInView(tab_loc.x()) - mouse_offset_.x(); |
| 1463 | 1466 |
| 1464 // TODO: consider caching this. | 1467 // TODO: consider caching this. |
| 1465 std::vector<BaseTab*> attached_tabs; | 1468 std::vector<BaseTab*> attached_tabs; |
| 1466 for (size_t i = 0; i < drag_data_.size(); ++i) | 1469 for (size_t i = 0; i < drag_data_.size(); ++i) |
| 1467 attached_tabs.push_back(drag_data_[i].attached_tab); | 1470 attached_tabs.push_back(drag_data_[i].attached_tab); |
| 1468 int size = attached_tabstrip_->GetSizeNeededForTabs(attached_tabs); | 1471 int size = attached_tabstrip_->GetSizeNeededForTabs(attached_tabs); |
| 1469 int max_x = attached_tabstrip_->width() - size; | 1472 int max_x = attached_tabstrip_->width() - size; |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1687 break; | 1690 break; |
| 1688 | 1691 |
| 1689 default: | 1692 default: |
| 1690 NOTREACHED(); | 1693 NOTREACHED(); |
| 1691 break; | 1694 break; |
| 1692 } | 1695 } |
| 1693 } | 1696 } |
| 1694 // Compel the model to construct a new window for the detached WebContents. | 1697 // Compel the model to construct a new window for the detached WebContents. |
| 1695 views::Widget* widget = source_tabstrip_->GetWidget(); | 1698 views::Widget* widget = source_tabstrip_->GetWidget(); |
| 1696 gfx::Rect window_bounds(widget->GetRestoredBounds()); | 1699 gfx::Rect window_bounds(widget->GetRestoredBounds()); |
| 1697 window_bounds.set_origin(GetWindowCreatePoint(last_screen_point_)); | 1700 window_bounds.set_origin(GetWindowCreatePoint(last_point_in_screen_)); |
| 1698 // When modifying the following if statement, please make sure not to | 1701 // When modifying the following if statement, please make sure not to |
| 1699 // introduce issue listed in http://crbug.com/6223 comment #11. | 1702 // introduce issue listed in http://crbug.com/6223 comment #11. |
| 1700 bool rtl_ui = base::i18n::IsRTL(); | 1703 bool rtl_ui = base::i18n::IsRTL(); |
| 1701 bool has_dock_position = (dock_info_.type() != DockInfo::NONE); | 1704 bool has_dock_position = (dock_info_.type() != DockInfo::NONE); |
| 1702 if (rtl_ui && has_dock_position) { | 1705 if (rtl_ui && has_dock_position) { |
| 1703 // Mirror X axis so the docked tab is aligned using the mouse click as | 1706 // Mirror X axis so the docked tab is aligned using the mouse click as |
| 1704 // the top-right corner. | 1707 // the top-right corner. |
| 1705 window_bounds.set_x(window_bounds.x() - window_bounds.width()); | 1708 window_bounds.set_x(window_bounds.x() - window_bounds.width()); |
| 1706 } | 1709 } |
| 1707 Browser* new_browser = | 1710 Browser* new_browser = |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1816 std::vector<DockDisplayer*>::iterator i = | 1819 std::vector<DockDisplayer*>::iterator i = |
| 1817 std::find(dock_controllers_.begin(), dock_controllers_.end(), | 1820 std::find(dock_controllers_.begin(), dock_controllers_.end(), |
| 1818 controller); | 1821 controller); |
| 1819 if (i != dock_controllers_.end()) | 1822 if (i != dock_controllers_.end()) |
| 1820 dock_controllers_.erase(i); | 1823 dock_controllers_.erase(i); |
| 1821 else | 1824 else |
| 1822 NOTREACHED(); | 1825 NOTREACHED(); |
| 1823 } | 1826 } |
| 1824 | 1827 |
| 1825 void TabDragController::BringWindowUnderPointToFront( | 1828 void TabDragController::BringWindowUnderPointToFront( |
| 1826 const gfx::Point& screen_point) { | 1829 const gfx::Point& point_in_screen) { |
| 1827 // If we're going to dock to another window, bring it to the front. | 1830 // If we're going to dock to another window, bring it to the front. |
| 1828 gfx::NativeWindow window = dock_info_.window(); | 1831 gfx::NativeWindow window = dock_info_.window(); |
| 1829 if (!window) { | 1832 if (!window) { |
| 1830 views::View* dragged_view; | 1833 views::View* dragged_view; |
| 1831 if (view_.get()) | 1834 if (view_.get()) |
| 1832 dragged_view = view_.get(); | 1835 dragged_view = view_.get(); |
| 1833 else | 1836 else |
| 1834 dragged_view = attached_tabstrip_; | 1837 dragged_view = attached_tabstrip_; |
| 1835 gfx::NativeView dragged_native_view = | 1838 gfx::NativeView dragged_native_view = |
| 1836 dragged_view->GetWidget()->GetNativeView(); | 1839 dragged_view->GetWidget()->GetNativeView(); |
| 1837 dock_windows_.insert(dragged_native_view); | 1840 dock_windows_.insert(dragged_native_view); |
| 1838 window = | 1841 window = |
| 1839 DockInfo::GetLocalProcessWindowAtPoint(screen_point, dock_windows_); | 1842 DockInfo::GetLocalProcessWindowAtPoint(point_in_screen, dock_windows_); |
| 1840 dock_windows_.erase(dragged_native_view); | 1843 dock_windows_.erase(dragged_native_view); |
| 1841 } | 1844 } |
| 1842 if (window) { | 1845 if (window) { |
| 1843 views::Widget* widget_window = views::Widget::GetWidgetForNativeView( | 1846 views::Widget* widget_window = views::Widget::GetWidgetForNativeView( |
| 1844 window); | 1847 window); |
| 1845 if (widget_window) | 1848 if (widget_window) |
| 1846 widget_window->StackAtTop(); | 1849 widget_window->StackAtTop(); |
| 1847 else | 1850 else |
| 1848 return; | 1851 return; |
| 1849 | 1852 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1871 if (drag_data_[i - 1].source_model_index + 1 != | 1874 if (drag_data_[i - 1].source_model_index + 1 != |
| 1872 drag_data_[i].source_model_index) { | 1875 drag_data_[i].source_model_index) { |
| 1873 return false; | 1876 return false; |
| 1874 } | 1877 } |
| 1875 } | 1878 } |
| 1876 return true; | 1879 return true; |
| 1877 } | 1880 } |
| 1878 | 1881 |
| 1879 Browser* TabDragController::CreateBrowserForDrag( | 1882 Browser* TabDragController::CreateBrowserForDrag( |
| 1880 TabStrip* source, | 1883 TabStrip* source, |
| 1881 const gfx::Point& screen_point, | 1884 const gfx::Point& point_in_screen, |
| 1882 std::vector<gfx::Rect>* drag_bounds) { | 1885 std::vector<gfx::Rect>* drag_bounds) { |
| 1883 Browser* browser = Browser::Create(drag_data_[0].contents->profile()); | 1886 Browser* browser = Browser::Create(drag_data_[0].contents->profile()); |
| 1884 gfx::Point center(0, source->height() / 2); | 1887 gfx::Point center(0, source->height() / 2); |
| 1885 views::View::ConvertPointToWidget(source, ¢er); | 1888 views::View::ConvertPointToWidget(source, ¢er); |
| 1886 gfx::Rect new_bounds(source->GetWidget()->GetWindowBoundsInScreen()); | 1889 gfx::Rect new_bounds(source->GetWidget()->GetWindowBoundsInScreen()); |
| 1887 new_bounds.set_y(screen_point.y() - center.y()); | 1890 new_bounds.set_y(point_in_screen.y() - center.y()); |
| 1888 switch (GetDetachPosition(screen_point)) { | 1891 switch (GetDetachPosition(point_in_screen)) { |
| 1889 case DETACH_BEFORE: | 1892 case DETACH_BEFORE: |
| 1890 new_bounds.set_x(screen_point.x() - center.x()); | 1893 new_bounds.set_x(point_in_screen.x() - center.x()); |
| 1891 new_bounds.Offset(-mouse_offset_.x(), 0); | 1894 new_bounds.Offset(-mouse_offset_.x(), 0); |
| 1892 break; | 1895 break; |
| 1893 | 1896 |
| 1894 case DETACH_AFTER: { | 1897 case DETACH_AFTER: { |
| 1895 gfx::Point right_edge(source->width(), 0); | 1898 gfx::Point right_edge(source->width(), 0); |
| 1896 views::View::ConvertPointToWidget(source, &right_edge); | 1899 views::View::ConvertPointToWidget(source, &right_edge); |
| 1897 new_bounds.set_x(screen_point.x() - right_edge.x()); | 1900 new_bounds.set_x(point_in_screen.x() - right_edge.x()); |
| 1898 new_bounds.Offset(drag_bounds->back().right() - mouse_offset_.x(), 0); | 1901 new_bounds.Offset(drag_bounds->back().right() - mouse_offset_.x(), 0); |
| 1899 int delta = (*drag_bounds)[0].x(); | 1902 int delta = (*drag_bounds)[0].x(); |
| 1900 for (size_t i = 0; i < drag_bounds->size(); ++i) | 1903 for (size_t i = 0; i < drag_bounds->size(); ++i) |
| 1901 (*drag_bounds)[i].Offset(-delta, 0); | 1904 (*drag_bounds)[i].Offset(-delta, 0); |
| 1902 break; | 1905 break; |
| 1903 } | 1906 } |
| 1904 | 1907 |
| 1905 default: | 1908 default: |
| 1906 break; // Nothing to do for DETACH_ABOVE_OR_BELOW. | 1909 break; // Nothing to do for DETACH_ABOVE_OR_BELOW. |
| 1907 } | 1910 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1921 gfx::Point touch_point; | 1924 gfx::Point touch_point; |
| 1922 bool got_touch_point = widget_window->GetRootWindow()-> | 1925 bool got_touch_point = widget_window->GetRootWindow()-> |
| 1923 gesture_recognizer()->GetLastTouchPointForTarget(widget_window, | 1926 gesture_recognizer()->GetLastTouchPointForTarget(widget_window, |
| 1924 &touch_point); | 1927 &touch_point); |
| 1925 DCHECK(got_touch_point); | 1928 DCHECK(got_touch_point); |
| 1926 return touch_point; | 1929 return touch_point; |
| 1927 } | 1930 } |
| 1928 #endif | 1931 #endif |
| 1929 return gfx::Screen::GetCursorScreenPoint(); | 1932 return gfx::Screen::GetCursorScreenPoint(); |
| 1930 } | 1933 } |
| OLD | NEW |