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

Unified Diff: chrome/browser/views/tabs/dragged_tab_controller.cc

Issue 126006: Review Request: fix issue 6223 -- issues on drag/drop tab (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/views/tabs/dragged_tab_controller.cc
===================================================================
--- chrome/browser/views/tabs/dragged_tab_controller.cc (revision 18213)
+++ chrome/browser/views/tabs/dragged_tab_controller.cc (working copy)
@@ -9,6 +9,7 @@
#include "app/animation.h"
#include "app/gfx/canvas.h"
+#include "app/l10n_util.h"
#include "app/resource_bundle.h"
#include "chrome/browser/browser_window.h"
#include "chrome/browser/extensions/extension_function_dispatcher.h"
@@ -70,14 +71,31 @@
SkBitmap* high_icon = rb.GetBitmapNamed(IDR_DOCK_HIGH);
SkBitmap* wide_icon = rb.GetBitmapNamed(IDR_DOCK_WIDE);
+ bool rtl_ui = l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT;
+ if (rtl_ui) {
+ // Flip canvas to draw the mirrored tab images for RTL UI.
+ canvas->save();
+ canvas->TranslateInt(width(), 0);
+ canvas->ScaleInt(-1, 1);
+ }
+ int x_of_active_tab = -1;
+ int x_of_inactive_tab = -1;
switch (type_) {
case DockInfo::LEFT_OF_WINDOW:
case DockInfo::LEFT_HALF:
- canvas->DrawBitmapInt(*high_icon,
- width() / 2 - high_icon->width() - kTabSpacing / 2,
- (height() - high_icon->height()) / 2);
+ if (!rtl_ui) {
+ x_of_active_tab = width() / 2 - high_icon->width() - kTabSpacing / 2;
+ x_of_inactive_tab = width() / 2 + kTabSpacing / 2;
+ } else {
+ // Adjust x axis for RTL UI after flippping canvas.
+ x_of_active_tab = width() / 2 + kTabSpacing / 2;
+ x_of_inactive_tab = width() / 2 - high_icon->width() -
+ kTabSpacing / 2;
+ }
+ canvas->DrawBitmapInt(*high_icon, x_of_active_tab,
+ (height() - high_icon->height()) / 2);
if (type_ == DockInfo::LEFT_OF_WINDOW) {
- DrawBitmapWithAlpha(canvas, *high_icon, width() / 2 + kTabSpacing / 2,
+ DrawBitmapWithAlpha(canvas, *high_icon, x_of_inactive_tab,
(height() - high_icon->height()) / 2);
}
break;
@@ -85,12 +103,20 @@
case DockInfo::RIGHT_OF_WINDOW:
case DockInfo::RIGHT_HALF:
- canvas->DrawBitmapInt(*high_icon, width() / 2 + kTabSpacing / 2,
+ if (!rtl_ui) {
+ x_of_active_tab = width() / 2 + kTabSpacing / 2;
+ x_of_inactive_tab = width() / 2 - high_icon->width() -
+ kTabSpacing / 2;
+ } else {
+ // Adjust x axis for RTL UI after flippping canvas.
+ x_of_active_tab = width() / 2 - high_icon->width() - kTabSpacing / 2;
+ x_of_inactive_tab = width() / 2 + kTabSpacing / 2;
+ }
+ canvas->DrawBitmapInt(*high_icon, x_of_active_tab,
(height() - high_icon->height()) / 2);
if (type_ == DockInfo::RIGHT_OF_WINDOW) {
- DrawBitmapWithAlpha(canvas, *high_icon,
- width() / 2 - high_icon->width() - kTabSpacing / 2,
- (height() - high_icon->height()) / 2);
+ DrawBitmapWithAlpha(canvas, *high_icon, x_of_inactive_tab,
+ (height() - high_icon->height()) / 2);
}
break;
@@ -121,6 +147,8 @@
NOTREACHED();
break;
}
+ if (rtl_ui)
+ canvas->restore();
}
private:
@@ -301,6 +329,7 @@
void DraggedTabController::CaptureDragInfo(const gfx::Point& mouse_offset) {
start_screen_point_ = GetCursorScreenPoint();
mouse_offset_ = mouse_offset;
+ InitWindowCreatePoint();
}
void DraggedTabController::Drag() {
@@ -461,7 +490,14 @@
void DraggedTabController::InitWindowCreatePoint() {
window_create_point_.SetPoint(mouse_offset_.x(), mouse_offset_.y());
- Tab* first_tab = attached_tabstrip_->GetTabAt(0);
+ // window_create_point_ is only used in CompleteDrag() (through
+ // GetWindowCreatePoint() to get the start point of the docked window) when
+ // the attached_tabstrip_ is NULL and all the window's related bound
+ // information are obtained from source_tabstrip_. So, we need to get the
+ // 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_->GetTabAt(0);
views::View::ConvertPointToWidget(first_tab, &window_create_point_);
}
@@ -688,7 +724,6 @@
void DraggedTabController::Attach(TabStrip* attached_tabstrip,
const gfx::Point& screen_point) {
attached_tabstrip_ = attached_tabstrip;
- InitWindowCreatePoint();
attached_tabstrip_->GenerateIdealBounds();
// We don't need the photo-booth while we're attached.
@@ -1051,6 +1086,15 @@
gfx::Rect window_bounds(
GetWindowCreatePoint(),
gfx::Size(browser_rect.width(), browser_rect.height()));
+ // When modifying the following if statement, please make sure not to
+ // introduce issue listed in http://crbug.com/6223 comment #11.
+ bool rtl_ui = (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT);
+ bool has_dock_position = (dock_info_.type() != DockInfo::NONE);
+ if (rtl_ui && has_dock_position) {
+ // Mirror X axis so the docked tab is aligned using the mouse click as
+ // the top-right corner.
+ window_bounds.set_x(window_bounds.x() - window_bounds.width());
+ }
Browser* new_browser =
source_tabstrip_->model()->delegate()->CreateNewStripWithContents(
dragged_contents_, window_bounds, dock_info_);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698