Index: chrome/browser/views/tabs/dragged_tab_controller.cc |
diff --git a/chrome/browser/views/tabs/dragged_tab_controller.cc b/chrome/browser/views/tabs/dragged_tab_controller.cc |
index 3a4ee2575a11ff228e5d24e58eb1ab4aa1fffa65..f3f2fffb7c8d5f2aa498da81ed390f32bbb2d649 100644 |
--- a/chrome/browser/views/tabs/dragged_tab_controller.cc |
+++ b/chrome/browser/views/tabs/dragged_tab_controller.cc |
@@ -20,10 +20,11 @@ |
#include "chrome/browser/tabs/tab_strip_model.h" |
#include "chrome/browser/metrics/user_metrics.h" |
#include "chrome/browser/views/frame/browser_view.h" |
+#include "chrome/browser/views/tabs/base_tab_renderer.h" |
+#include "chrome/browser/views/tabs/base_tab_strip.h" |
#include "chrome/browser/views/tabs/browser_tab_strip_controller.h" |
#include "chrome/browser/views/tabs/dragged_tab_view.h" |
#include "chrome/browser/views/tabs/native_view_photobooth.h" |
-#include "chrome/browser/views/tabs/tab.h" |
#include "chrome/browser/views/tabs/tab_strip.h" |
#include "chrome/common/notification_service.h" |
#include "gfx/canvas.h" |
@@ -178,7 +179,7 @@ class DockView : public views::View { |
DISALLOW_COPY_AND_ASSIGN(DockView); |
}; |
-gfx::Point ConvertScreenPointToTabStripPoint(TabStrip* tabstrip, |
+gfx::Point ConvertScreenPointToTabStripPoint(BaseTabStrip* tabstrip, |
const gfx::Point& screen_point) { |
gfx::Point tabstrip_topleft; |
views::View::ConvertPointToScreen(tabstrip, &tabstrip_topleft); |
@@ -311,12 +312,12 @@ class DraggedTabController::DockDisplayer : public AnimationDelegate { |
/////////////////////////////////////////////////////////////////////////////// |
// DraggedTabController, public: |
-DraggedTabController::DraggedTabController(Tab* source_tab, |
- TabStrip* source_tabstrip) |
+DraggedTabController::DraggedTabController(BaseTabRenderer* source_tab, |
+ BaseTabStrip* source_tabstrip) |
: dragged_contents_(NULL), |
original_delegate_(NULL), |
source_tabstrip_(source_tabstrip), |
- source_model_index_(source_tabstrip->GetModelIndexOfTab(source_tab)), |
+ source_model_index_(source_tabstrip->GetModelIndexOfBaseTab(source_tab)), |
attached_tabstrip_(NULL), |
attached_tab_(NULL), |
offset_to_width_ratio_(0), |
@@ -343,7 +344,7 @@ DraggedTabController::~DraggedTabController() { |
SetDraggedContents(NULL); // This removes our observer. |
} |
-void DraggedTabController::CaptureDragInfo(Tab* tab, |
+void DraggedTabController::CaptureDragInfo(views::View* tab, |
const gfx::Point& mouse_offset) { |
if (tab->width() > 0) { |
offset_to_width_ratio_ = static_cast<float>(mouse_offset.x()) / |
@@ -505,7 +506,7 @@ void DraggedTabController::InitWindowCreatePoint() { |
// first_tab based on source_tabstrip_, not attached_tabstrip_. Otherwise, |
// the window_create_point_ is not in the correct coordinate system. Please |
// refer to http://crbug.com/6223 comment #15 for detailed information. |
- Tab* first_tab = source_tabstrip_->GetTabAtTabDataIndex(0); |
+ views::View* first_tab = source_tabstrip_->base_tab_at_tab_index(0); |
views::View::ConvertPointToWidget(first_tab, &first_source_tab_point_); |
UpdateWindowCreatePoint(); |
} |
@@ -619,12 +620,12 @@ void DraggedTabController::ContinueDragging() { |
#if defined(OS_CHROMEOS) |
// We don't allow detaching in chrome os. |
- TabStrip* target_tabstrip = source_tabstrip_; |
+ BaseTabStrip* target_tabstrip = source_tabstrip_; |
#else |
// Determine whether or not we have dragged over a compatible TabStrip in |
// another browser window. If we have, we should attach to it and start |
// dragging within it. |
- TabStrip* target_tabstrip = GetTabStripForPoint(screen_point); |
+ BaseTabStrip* target_tabstrip = GetTabStripForPoint(screen_point); |
#endif |
if (target_tabstrip != attached_tabstrip_) { |
// Make sure we're fully detached from whatever TabStrip we're attached to |
@@ -653,15 +654,33 @@ void DraggedTabController::MoveAttachedTab(const gfx::Point& screen_point) { |
DCHECK(!view_.get()); |
gfx::Point dragged_view_point = GetAttachedTabDragPoint(screen_point); |
- |
TabStripModel* attached_model = GetModel(attached_tabstrip_); |
int from_index = attached_model->GetIndexOfTabContents(dragged_contents_); |
+ if (attached_tabstrip_->type() == BaseTabStrip::HORIZONTAL_TAB_STRIP) { |
+ MoveAttachedTabHorizontalTabStrip(screen_point, attached_model, |
+ dragged_view_point, from_index); |
+ } else { |
+ MoveAttachedTabVerticalTabStrip(screen_point, attached_model, |
+ dragged_view_point, from_index); |
+ } |
+ attached_tab_->SchedulePaint(); |
+ attached_tab_->SetX(dragged_view_point.x()); |
+ attached_tab_->SetY(dragged_view_point.y()); |
+ attached_tab_->SchedulePaint(); |
+} |
+ |
+void DraggedTabController::MoveAttachedTabHorizontalTabStrip( |
+ const gfx::Point& screen_point, |
+ TabStripModel* model, |
+ const gfx::Point& dragged_view_point, |
+ int from_index) { |
+ TabStrip* tab_strip = static_cast<TabStrip*>(attached_tabstrip_); |
// Determine the horizontal move threshold. This is dependent on the width |
// of tabs. The smaller the tabs compared to the standard size, the smaller |
// the threshold. |
double unselected, selected; |
- attached_tabstrip_->GetCurrentTabWidths(&unselected, &selected); |
+ tab_strip->GetCurrentTabWidths(&unselected, &selected); |
double ratio = unselected / Tab::GetStandardSize().width(); |
int threshold = static_cast<int>(ratio * kHorizontalMoveThreshold); |
@@ -670,20 +689,23 @@ void DraggedTabController::MoveAttachedTab(const gfx::Point& screen_point) { |
// jitter). |
if (abs(screen_point.x() - last_move_screen_x_) > threshold) { |
gfx::Point dragged_view_screen_point(dragged_view_point); |
- views::View::ConvertPointToScreen(attached_tabstrip_, |
- &dragged_view_screen_point); |
+ views::View::ConvertPointToScreen(tab_strip, &dragged_view_screen_point); |
gfx::Rect bounds = GetDraggedViewTabStripBounds(dragged_view_screen_point); |
int to_index = GetInsertionIndexForDraggedBounds(bounds, true); |
to_index = NormalizeIndexToAttachedTabStrip(to_index); |
if (from_index != to_index) { |
last_move_screen_x_ = screen_point.x(); |
- attached_model->MoveTabContentsAt(from_index, to_index, true); |
+ model->MoveTabContentsAt(from_index, to_index, true); |
} |
} |
- attached_tab_->SchedulePaint(); |
- attached_tab_->SetX(dragged_view_point.x()); |
- attached_tab_->SetY(dragged_view_point.y()); |
- attached_tab_->SchedulePaint(); |
+} |
+ |
+void DraggedTabController::MoveAttachedTabVerticalTabStrip( |
+ const gfx::Point& screen_point, |
+ TabStripModel* model, |
+ const gfx::Point& dragged_view_point, |
+ int from_index) { |
+ // TODO(sky): implement me. |
} |
void DraggedTabController::MoveDetachedTab(const gfx::Point& screen_point) { |
@@ -718,7 +740,7 @@ DockInfo DraggedTabController::GetDockInfoAtPoint( |
return info; |
} |
-TabStrip* DraggedTabController::GetTabStripForPoint( |
+BaseTabStrip* DraggedTabController::GetTabStripForPoint( |
const gfx::Point& screen_point) { |
gfx::NativeView dragged_view = NULL; |
if (view_.get()) { |
@@ -738,14 +760,15 @@ TabStrip* DraggedTabController::GetTabStripForPoint( |
!browser->browser()->SupportsWindowFeature(Browser::FEATURE_TABSTRIP)) |
return NULL; |
- TabStrip* other_tabstrip = browser->tabstrip()->AsTabStrip(); |
+ BaseTabStrip* other_tabstrip = browser->tabstrip(); |
if (!other_tabstrip->controller()->IsCompatibleWith(source_tabstrip_)) |
return NULL; |
return GetTabStripIfItContains(other_tabstrip, screen_point); |
} |
-TabStrip* DraggedTabController::GetTabStripIfItContains( |
- TabStrip* tabstrip, const gfx::Point& screen_point) const { |
+BaseTabStrip* DraggedTabController::GetTabStripIfItContains( |
+ BaseTabStrip* tabstrip, const gfx::Point& screen_point) const { |
+ // TODO(sky): this likely needs to be adjusted for vertical tabs. |
static const int kVerticalDetachMagnetism = 15; |
// Make sure the specified screen point is actually within the bounds of the |
// specified tabstrip... |
@@ -764,7 +787,7 @@ TabStrip* DraggedTabController::GetTabStripIfItContains( |
return NULL; |
} |
-void DraggedTabController::Attach(TabStrip* attached_tabstrip, |
+void DraggedTabController::Attach(BaseTabStrip* attached_tabstrip, |
const gfx::Point& screen_point) { |
DCHECK(!attached_tabstrip_); // We should already have detached by the time |
// we get here. |
@@ -778,7 +801,7 @@ void DraggedTabController::Attach(TabStrip* attached_tabstrip, |
// And we don't need the dragged view. |
view_.reset(); |
- Tab* tab = GetTabMatchingDraggedContents(attached_tabstrip_); |
+ BaseTabRenderer* tab = GetTabMatchingDraggedContents(attached_tabstrip_); |
if (!tab) { |
// There is no Tab in |attached_tabstrip| that corresponds to the dragged |
@@ -878,8 +901,8 @@ int DraggedTabController::GetInsertionIndexForDraggedBounds( |
attached_tabstrip_->MirroredLeftPointForRect(adjusted_bounds)); |
int index = -1; |
- for (int i = 0; i < attached_tabstrip_->GetTabCount(); ++i) { |
- gfx::Rect ideal_bounds = attached_tabstrip_->GetIdealBounds(i); |
+ for (int i = 0; i < attached_tabstrip_->tab_count(); ++i) { |
+ const gfx::Rect& ideal_bounds = attached_tabstrip_->ideal_bounds(i); |
gfx::Rect left_half = ideal_bounds; |
left_half.set_width(left_half.width() / 2); |
gfx::Rect right_half = ideal_bounds; |
@@ -919,13 +942,18 @@ gfx::Rect DraggedTabController::GetDraggedViewTabStripBounds( |
return gfx::Rect(client_point.x(), client_point.y(), |
attached_tab_->width(), attached_tab_->height()); |
} |
- // attached_tab_ is NULL when inserting into a new tabstrip. |
- double sel_width, unselected_width; |
- attached_tabstrip_->GetCurrentTabWidths(&sel_width, &unselected_width); |
+ if (attached_tabstrip_->type() == BaseTabStrip::HORIZONTAL_TAB_STRIP) { |
+ // attached_tab_ is NULL when inserting into a new tabstrip. |
+ double sel_width, unselected_width; |
+ static_cast<TabStrip*>(attached_tabstrip_)->GetCurrentTabWidths( |
+ &sel_width, &unselected_width); |
+ return gfx::Rect(client_point.x(), client_point.y(), |
+ static_cast<int>(sel_width), |
+ Tab::GetStandardSize().height()); |
+ } |
// TODO(sky): this needs to adjust based on orientation of the tab strip. |
return gfx::Rect(client_point.x(), client_point.y(), |
- static_cast<int>(sel_width), |
- Tab::GetStandardSize().height()); |
+ 0, Tab::GetStandardSize().height()); |
} |
gfx::Point DraggedTabController::GetAttachedTabDragPoint( |
@@ -950,11 +978,12 @@ gfx::Point DraggedTabController::GetAttachedTabDragPoint( |
return gfx::Point(x, y); |
} |
-Tab* DraggedTabController::GetTabMatchingDraggedContents( |
- TabStrip* tabstrip) const { |
- int model_index = GetModel(tabstrip)->GetIndexOfTabContents(dragged_contents_); |
+BaseTabRenderer* DraggedTabController::GetTabMatchingDraggedContents( |
+ BaseTabStrip* tabstrip) const { |
+ int model_index = |
+ GetModel(tabstrip)->GetIndexOfTabContents(dragged_contents_); |
return model_index == TabStripModel::kNoTab ? |
- NULL : tabstrip->GetTabAtModelIndex(model_index); |
+ NULL : tabstrip->GetBaseTabAtModelIndex(model_index); |
} |
void DraggedTabController::EndDragImpl(EndDragType type) { |