| 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/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 1119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1130 | 1130 |
| 1131 if (!detach_into_browser_) { | 1131 if (!detach_into_browser_) { |
| 1132 // Remove ourselves as the delegate now that the dragged WebContents is | 1132 // Remove ourselves as the delegate now that the dragged WebContents is |
| 1133 // being inserted back into a Browser. | 1133 // being inserted back into a Browser. |
| 1134 for (size_t i = 0; i < drag_data_.size(); ++i) { | 1134 for (size_t i = 0; i < drag_data_.size(); ++i) { |
| 1135 drag_data_[i].contents->SetDelegate(NULL); | 1135 drag_data_[i].contents->SetDelegate(NULL); |
| 1136 drag_data_[i].original_delegate = NULL; | 1136 drag_data_[i].original_delegate = NULL; |
| 1137 } | 1137 } |
| 1138 | 1138 |
| 1139 // Return the WebContents to normalcy. | 1139 // Return the WebContents to normalcy. |
| 1140 source_dragged_contents()->SetCapturingContents(false); | 1140 source_dragged_contents()->DecrementCapturerCount(); |
| 1141 } | 1141 } |
| 1142 | 1142 |
| 1143 // Inserting counts as a move. We don't want the tabs to jitter when the | 1143 // Inserting counts as a move. We don't want the tabs to jitter when the |
| 1144 // user moves the tab immediately after attaching it. | 1144 // user moves the tab immediately after attaching it. |
| 1145 last_move_screen_loc_ = point_in_screen.x(); | 1145 last_move_screen_loc_ = point_in_screen.x(); |
| 1146 | 1146 |
| 1147 // Figure out where to insert the tab based on the bounds of the dragged | 1147 // Figure out where to insert the tab based on the bounds of the dragged |
| 1148 // representation and the ideal bounds of the other Tabs already in the | 1148 // representation and the ideal bounds of the other Tabs already in the |
| 1149 // strip. ("ideal bounds" are stable even if the Tabs' actual bounds are | 1149 // strip. ("ideal bounds" are stable even if the Tabs' actual bounds are |
| 1150 // changing due to animation). | 1150 // changing due to animation). |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1219 attached_tabstrip_->ReleaseDragController(); | 1219 attached_tabstrip_->ReleaseDragController(); |
| 1220 if (release_capture == RELEASE_CAPTURE) | 1220 if (release_capture == RELEASE_CAPTURE) |
| 1221 attached_tabstrip_->GetWidget()->ReleaseCapture(); | 1221 attached_tabstrip_->GetWidget()->ReleaseCapture(); |
| 1222 } | 1222 } |
| 1223 | 1223 |
| 1224 mouse_move_direction_ = kMovedMouseLeft | kMovedMouseRight; | 1224 mouse_move_direction_ = kMovedMouseLeft | kMovedMouseRight; |
| 1225 | 1225 |
| 1226 // Prevent the WebContents HWND from being hidden by any of the model | 1226 // Prevent the WebContents HWND from being hidden by any of the model |
| 1227 // operations performed during the drag. | 1227 // operations performed during the drag. |
| 1228 if (!detach_into_browser_) | 1228 if (!detach_into_browser_) |
| 1229 source_dragged_contents()->SetCapturingContents(true); | 1229 source_dragged_contents()->IncrementCapturerCount(); |
| 1230 | 1230 |
| 1231 std::vector<gfx::Rect> drag_bounds = CalculateBoundsForDraggedTabs(0); | 1231 std::vector<gfx::Rect> drag_bounds = CalculateBoundsForDraggedTabs(0); |
| 1232 TabStripModel* attached_model = GetModel(attached_tabstrip_); | 1232 TabStripModel* attached_model = GetModel(attached_tabstrip_); |
| 1233 std::vector<TabRendererData> tab_data; | 1233 std::vector<TabRendererData> tab_data; |
| 1234 for (size_t i = 0; i < drag_data_.size(); ++i) { | 1234 for (size_t i = 0; i < drag_data_.size(); ++i) { |
| 1235 tab_data.push_back(drag_data_[i].attached_tab->data()); | 1235 tab_data.push_back(drag_data_[i].attached_tab->data()); |
| 1236 int index = attached_model->GetIndexOfWebContents(drag_data_[i].contents); | 1236 int index = attached_model->GetIndexOfWebContents(drag_data_[i].contents); |
| 1237 DCHECK_NE(-1, index); | 1237 DCHECK_NE(-1, index); |
| 1238 | 1238 |
| 1239 // Hide the tab so that the user doesn't see it animate closed. | 1239 // Hide the tab so that the user doesn't see it animate closed. |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1653 GetModel(source_tabstrip_)->SetSelectionFromModel(initial_selection_model_); | 1653 GetModel(source_tabstrip_)->SetSelectionFromModel(initial_selection_model_); |
| 1654 | 1654 |
| 1655 // If we're not attached to any TabStrip, or attached to some other TabStrip, | 1655 // If we're not attached to any TabStrip, or attached to some other TabStrip, |
| 1656 // we need to restore the bounds of the original TabStrip's frame, in case | 1656 // we need to restore the bounds of the original TabStrip's frame, in case |
| 1657 // it has been hidden. | 1657 // it has been hidden. |
| 1658 if (restore_frame && !restore_bounds_.IsEmpty()) | 1658 if (restore_frame && !restore_bounds_.IsEmpty()) |
| 1659 source_tabstrip_->GetWidget()->SetBounds(restore_bounds_); | 1659 source_tabstrip_->GetWidget()->SetBounds(restore_bounds_); |
| 1660 | 1660 |
| 1661 if (detach_into_browser_ && source_tabstrip_) | 1661 if (detach_into_browser_ && source_tabstrip_) |
| 1662 source_tabstrip_->GetWidget()->Activate(); | 1662 source_tabstrip_->GetWidget()->Activate(); |
| 1663 |
| 1664 // Return the WebContents to normalcy. If the tab was attached to a |
| 1665 // TabStrip before the revert, the decrement has already occurred. |
| 1666 // If the tab was destroyed, don't attempt to dereference the |
| 1667 // WebContents pointer. |
| 1668 if (!detach_into_browser_ && !attached_tabstrip_ && source_dragged_contents()) |
| 1669 source_dragged_contents()->DecrementCapturerCount(); |
| 1663 } | 1670 } |
| 1664 | 1671 |
| 1665 void TabDragController::ResetSelection(TabStripModel* model) { | 1672 void TabDragController::ResetSelection(TabStripModel* model) { |
| 1666 DCHECK(model); | 1673 DCHECK(model); |
| 1667 ui::ListSelectionModel selection_model; | 1674 ui::ListSelectionModel selection_model; |
| 1668 bool has_one_valid_tab = false; | 1675 bool has_one_valid_tab = false; |
| 1669 for (size_t i = 0; i < drag_data_.size(); ++i) { | 1676 for (size_t i = 0; i < drag_data_.size(); ++i) { |
| 1670 // |contents| is NULL if a tab was deleted out from under us. | 1677 // |contents| is NULL if a tab was deleted out from under us. |
| 1671 if (drag_data_[i].contents) { | 1678 if (drag_data_[i].contents) { |
| 1672 int index = model->GetIndexOfWebContents(drag_data_[i].contents); | 1679 int index = model->GetIndexOfWebContents(drag_data_[i].contents); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1798 item.add_types = drag_data_[i].pinned ? TabStripModel::ADD_PINNED | 1805 item.add_types = drag_data_[i].pinned ? TabStripModel::ADD_PINNED |
| 1799 : TabStripModel::ADD_NONE; | 1806 : TabStripModel::ADD_NONE; |
| 1800 contentses.push_back(item); | 1807 contentses.push_back(item); |
| 1801 }; | 1808 }; |
| 1802 | 1809 |
| 1803 Browser* new_browser = | 1810 Browser* new_browser = |
| 1804 GetModel(source_tabstrip_)->delegate()->CreateNewStripWithContents( | 1811 GetModel(source_tabstrip_)->delegate()->CreateNewStripWithContents( |
| 1805 contentses, window_bounds, dock_info_, widget->IsMaximized()); | 1812 contentses, window_bounds, dock_info_, widget->IsMaximized()); |
| 1806 ResetSelection(new_browser->tab_strip_model()); | 1813 ResetSelection(new_browser->tab_strip_model()); |
| 1807 new_browser->window()->Show(); | 1814 new_browser->window()->Show(); |
| 1815 |
| 1816 // Return the WebContents to normalcy. |
| 1817 if (!detach_into_browser_) |
| 1818 source_dragged_contents()->DecrementCapturerCount(); |
| 1808 } | 1819 } |
| 1809 | 1820 |
| 1810 CleanUpHiddenFrame(); | 1821 CleanUpHiddenFrame(); |
| 1811 } | 1822 } |
| 1812 | 1823 |
| 1813 void TabDragController::ResetDelegates() { | 1824 void TabDragController::ResetDelegates() { |
| 1814 DCHECK(!detach_into_browser_); | 1825 DCHECK(!detach_into_browser_); |
| 1815 for (size_t i = 0; i < drag_data_.size(); ++i) { | 1826 for (size_t i = 0; i < drag_data_.size(); ++i) { |
| 1816 if (drag_data_[i].contents && | 1827 if (drag_data_[i].contents && |
| 1817 drag_data_[i].contents->GetDelegate() == this) { | 1828 drag_data_[i].contents->GetDelegate() == this) { |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2041 gfx::Vector2d TabDragController::GetWindowOffset( | 2052 gfx::Vector2d TabDragController::GetWindowOffset( |
| 2042 const gfx::Point& point_in_screen) { | 2053 const gfx::Point& point_in_screen) { |
| 2043 TabStrip* owning_tabstrip = (attached_tabstrip_ && detach_into_browser_) ? | 2054 TabStrip* owning_tabstrip = (attached_tabstrip_ && detach_into_browser_) ? |
| 2044 attached_tabstrip_ : source_tabstrip_; | 2055 attached_tabstrip_ : source_tabstrip_; |
| 2045 views::View* toplevel_view = owning_tabstrip->GetWidget()->GetContentsView(); | 2056 views::View* toplevel_view = owning_tabstrip->GetWidget()->GetContentsView(); |
| 2046 | 2057 |
| 2047 gfx::Point point = point_in_screen; | 2058 gfx::Point point = point_in_screen; |
| 2048 views::View::ConvertPointFromScreen(toplevel_view, &point); | 2059 views::View::ConvertPointFromScreen(toplevel_view, &point); |
| 2049 return point.OffsetFromOrigin(); | 2060 return point.OffsetFromOrigin(); |
| 2050 } | 2061 } |
| OLD | NEW |