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_strip.h" | 5 #include "chrome/browser/ui/views/tabs/tab_strip.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <windowsx.h> | 8 #include <windowsx.h> |
9 #endif | 9 #endif |
10 | 10 |
(...skipping 29 matching lines...) Expand all Loading... |
40 #include "ui/gfx/animation/throb_animation.h" | 40 #include "ui/gfx/animation/throb_animation.h" |
41 #include "ui/gfx/canvas.h" | 41 #include "ui/gfx/canvas.h" |
42 #include "ui/gfx/display.h" | 42 #include "ui/gfx/display.h" |
43 #include "ui/gfx/image/image_skia.h" | 43 #include "ui/gfx/image/image_skia.h" |
44 #include "ui/gfx/image/image_skia_operations.h" | 44 #include "ui/gfx/image/image_skia_operations.h" |
45 #include "ui/gfx/path.h" | 45 #include "ui/gfx/path.h" |
46 #include "ui/gfx/screen.h" | 46 #include "ui/gfx/screen.h" |
47 #include "ui/gfx/size.h" | 47 #include "ui/gfx/size.h" |
48 #include "ui/views/controls/image_view.h" | 48 #include "ui/views/controls/image_view.h" |
49 #include "ui/views/mouse_watcher_view_host.h" | 49 #include "ui/views/mouse_watcher_view_host.h" |
| 50 #include "ui/views/rect_based_targeting_utils.h" |
50 #include "ui/views/view_model_utils.h" | 51 #include "ui/views/view_model_utils.h" |
51 #include "ui/views/widget/root_view.h" | 52 #include "ui/views/widget/root_view.h" |
52 #include "ui/views/widget/widget.h" | 53 #include "ui/views/widget/widget.h" |
53 #include "ui/views/window/non_client_view.h" | 54 #include "ui/views/window/non_client_view.h" |
54 | 55 |
55 #if defined(OS_WIN) | 56 #if defined(OS_WIN) |
56 #include "ui/gfx/win/hwnd_util.h" | 57 #include "ui/gfx/win/hwnd_util.h" |
57 #include "ui/views/widget/monitor_win.h" | 58 #include "ui/views/widget/monitor_win.h" |
58 #include "win8/util/win8_util.h" | 59 #include "win8/util/win8_util.h" |
59 #endif | 60 #endif |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE { | 249 virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE { |
249 tab_->set_dragging(false); | 250 tab_->set_dragging(false); |
250 } | 251 } |
251 | 252 |
252 private: | 253 private: |
253 Tab* tab_; | 254 Tab* tab_; |
254 | 255 |
255 DISALLOW_COPY_AND_ASSIGN(ResetDraggingStateDelegate); | 256 DISALLOW_COPY_AND_ASSIGN(ResetDraggingStateDelegate); |
256 }; | 257 }; |
257 | 258 |
258 // If |dest| contains the point |point_in_source| the event handler from |dest| | 259 // If |dest| intersects the rect |rect_in_source| the event handler from |dest| |
259 // is returned. Otherwise NULL is returned. | 260 // is returned. Otherwise NULL is returned. |
260 views::View* ConvertPointToViewAndGetEventHandler( | 261 views::View* ConvertRectToViewAndGetEventHandler( |
261 views::View* source, | 262 views::View* source, |
262 views::View* dest, | 263 views::View* dest, |
263 const gfx::Point& point_in_source) { | 264 const gfx::Rect& rect_in_source) { |
264 gfx::Point dest_point(point_in_source); | 265 gfx::Rect dest_rect(rect_in_source); |
265 views::View::ConvertPointToTarget(source, dest, &dest_point); | 266 views::View::ConvertRectToTarget(source, dest, &dest_rect); |
266 return dest->HitTestPoint(dest_point) ? | 267 return dest->HitTestRect(dest_rect) ? |
267 dest->GetEventHandlerForPoint(dest_point) : NULL; | 268 dest->GetEventHandlerForRect(dest_rect) : NULL; |
268 } | 269 } |
269 | 270 |
270 // Gets a tooltip handler for |point_in_source| from |dest|. Note that |dest| | 271 // Gets a tooltip handler for |point_in_source| from |dest|. Note that |dest| |
271 // should return NULL if it does not contain the point. | 272 // should return NULL if it does not contain the point. |
272 views::View* ConvertPointToViewAndGetTooltipHandler( | 273 views::View* ConvertPointToViewAndGetTooltipHandler( |
273 views::View* source, | 274 views::View* source, |
274 views::View* dest, | 275 views::View* dest, |
275 const gfx::Point& point_in_source) { | 276 const gfx::Point& point_in_source) { |
276 gfx::Point dest_point(point_in_source); | 277 gfx::Point dest_point(point_in_source); |
277 views::View::ConvertPointToTarget(source, dest, &dest_point); | 278 views::View::ConvertPointToTarget(source, dest, &dest_point); |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
904 | 905 |
905 bool TabStrip::IsTabStripCloseable() const { | 906 bool TabStrip::IsTabStripCloseable() const { |
906 return !IsDragSessionActive(); | 907 return !IsDragSessionActive(); |
907 } | 908 } |
908 | 909 |
909 void TabStrip::UpdateLoadingAnimations() { | 910 void TabStrip::UpdateLoadingAnimations() { |
910 controller_->UpdateLoadingAnimations(); | 911 controller_->UpdateLoadingAnimations(); |
911 } | 912 } |
912 | 913 |
913 bool TabStrip::IsPositionInWindowCaption(const gfx::Point& point) { | 914 bool TabStrip::IsPositionInWindowCaption(const gfx::Point& point) { |
914 views::View* v = GetEventHandlerForPoint(point); | 915 return IsRectInWindowCaption(gfx::Rect(point, gfx::Size(1, 1))); |
| 916 } |
| 917 |
| 918 bool TabStrip::IsRectInWindowCaption(const gfx::Rect& rect) { |
| 919 views::View* v = GetEventHandlerForRect(rect); |
915 | 920 |
916 // If there is no control at this location, claim the hit was in the title | 921 // If there is no control at this location, claim the hit was in the title |
917 // bar to get a move action. | 922 // bar to get a move action. |
918 if (v == this) | 923 if (v == this) |
919 return true; | 924 return true; |
920 | 925 |
921 // Check to see if the point is within the non-button parts of the new tab | 926 // Check to see if the rect intersects the non-button parts of the new tab |
922 // button. The button has a non-rectangular shape, so if it's not in the | 927 // button. The button has a non-rectangular shape, so if it's not in the |
923 // visual portions of the button we treat it as a click to the caption. | 928 // visual portions of the button we treat it as a click to the caption. |
924 gfx::Point point_in_newtab_coords(point); | 929 gfx::Rect rect_in_newtab_coords(rect); |
925 View::ConvertPointToTarget(this, newtab_button_, &point_in_newtab_coords); | 930 View::ConvertRectToTarget(this, newtab_button_, &rect_in_newtab_coords); |
926 if (newtab_button_->GetLocalBounds().Contains(point_in_newtab_coords) && | 931 if (newtab_button_->GetLocalBounds().Intersects(rect_in_newtab_coords) && |
927 !newtab_button_->HitTestPoint(point_in_newtab_coords)) { | 932 !newtab_button_->HitTestRect(rect_in_newtab_coords)) |
928 return true; | 933 return true; |
929 } | |
930 | 934 |
931 // All other regions, including the new Tab button, should be considered part | 935 // All other regions, including the new Tab button, should be considered part |
932 // of the containing Window's client area so that regular events can be | 936 // of the containing Window's client area so that regular events can be |
933 // processed for them. | 937 // processed for them. |
934 return false; | 938 return false; |
935 } | 939 } |
936 | 940 |
937 void TabStrip::SetBackgroundOffset(const gfx::Point& offset) { | 941 void TabStrip::SetBackgroundOffset(const gfx::Point& offset) { |
938 for (int i = 0; i < tab_count(); ++i) | 942 for (int i = 0; i < tab_count(); ++i) |
939 tab_at(i)->set_background_offset(offset); | 943 tab_at(i)->set_background_offset(offset); |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 | 1419 |
1416 controller()->PerformDrop(drop_before, drop_index, url); | 1420 controller()->PerformDrop(drop_before, drop_index, url); |
1417 | 1421 |
1418 return GetDropEffect(event); | 1422 return GetDropEffect(event); |
1419 } | 1423 } |
1420 | 1424 |
1421 void TabStrip::GetAccessibleState(ui::AccessibleViewState* state) { | 1425 void TabStrip::GetAccessibleState(ui::AccessibleViewState* state) { |
1422 state->role = ui::AccessibilityTypes::ROLE_PAGETABLIST; | 1426 state->role = ui::AccessibilityTypes::ROLE_PAGETABLIST; |
1423 } | 1427 } |
1424 | 1428 |
1425 views::View* TabStrip::GetEventHandlerForPoint(const gfx::Point& point) { | 1429 views::View* TabStrip::GetEventHandlerForRect(const gfx::Rect& rect) { |
| 1430 if (!views::UsePointBasedTargeting(rect)) |
| 1431 return View::GetEventHandlerForRect(rect); |
| 1432 |
1426 if (!touch_layout_.get()) { | 1433 if (!touch_layout_.get()) { |
1427 // Return any view that isn't a Tab or this TabStrip immediately. We don't | 1434 // Return any view that isn't a Tab or this TabStrip immediately. We don't |
1428 // want to interfere. | 1435 // want to interfere. |
1429 views::View* v = View::GetEventHandlerForPoint(point); | 1436 views::View* v = View::GetEventHandlerForRect(rect); |
1430 if (v && v != this && strcmp(v->GetClassName(), Tab::kViewClassName)) | 1437 if (v && v != this && strcmp(v->GetClassName(), Tab::kViewClassName)) |
1431 return v; | 1438 return v; |
1432 | 1439 |
1433 views::View* tab = FindTabHitByPoint(point); | 1440 views::View* tab = FindTabHitByPoint(rect.CenterPoint()); |
1434 if (tab) | 1441 if (tab) |
1435 return tab; | 1442 return tab; |
1436 } else { | 1443 } else { |
1437 if (newtab_button_->visible()) { | 1444 if (newtab_button_->visible()) { |
1438 views::View* view = | 1445 views::View* view = |
1439 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); | 1446 ConvertRectToViewAndGetEventHandler(this, newtab_button_, rect); |
1440 if (view) | 1447 if (view) |
1441 return view; | 1448 return view; |
1442 } | 1449 } |
1443 Tab* tab = FindTabForEvent(point); | 1450 Tab* tab = FindTabForEvent(rect.CenterPoint()); |
1444 if (tab) | 1451 if (tab) |
1445 return ConvertPointToViewAndGetEventHandler(this, tab, point); | 1452 return ConvertRectToViewAndGetEventHandler(this, tab, rect); |
1446 } | 1453 } |
1447 return this; | 1454 return this; |
1448 } | 1455 } |
1449 | 1456 |
1450 views::View* TabStrip::GetTooltipHandlerForPoint(const gfx::Point& point) { | 1457 views::View* TabStrip::GetTooltipHandlerForPoint(const gfx::Point& point) { |
1451 if (!HitTestPoint(point)) | 1458 if (!HitTestPoint(point)) |
1452 return NULL; | 1459 return NULL; |
1453 | 1460 |
1454 if (!touch_layout_.get()) { | 1461 if (!touch_layout_.get()) { |
1455 // Return any view that isn't a Tab or this TabStrip immediately. We don't | 1462 // Return any view that isn't a Tab or this TabStrip immediately. We don't |
(...skipping 1256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2712 if (!adjust_layout_) | 2719 if (!adjust_layout_) |
2713 return false; | 2720 return false; |
2714 | 2721 |
2715 #if !defined(OS_CHROMEOS) | 2722 #if !defined(OS_CHROMEOS) |
2716 if (ui::GetDisplayLayout() != ui::LAYOUT_TOUCH) | 2723 if (ui::GetDisplayLayout() != ui::LAYOUT_TOUCH) |
2717 return false; | 2724 return false; |
2718 #endif | 2725 #endif |
2719 | 2726 |
2720 return true; | 2727 return true; |
2721 } | 2728 } |
OLD | NEW |