| 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 "ui/views/view.h" | 5 #include "ui/views/view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 if (source != root) | 617 if (source != root) |
| 618 source->ConvertPointForAncestor(root, point); | 618 source->ConvertPointForAncestor(root, point); |
| 619 } | 619 } |
| 620 | 620 |
| 621 if (target != root) | 621 if (target != root) |
| 622 target->ConvertPointFromAncestor(root, point); | 622 target->ConvertPointFromAncestor(root, point); |
| 623 | 623 |
| 624 // API defines NULL |source| as returning the point in screen coordinates. | 624 // API defines NULL |source| as returning the point in screen coordinates. |
| 625 if (!source) { | 625 if (!source) { |
| 626 *point = point->Subtract( | 626 *point = point->Subtract( |
| 627 root->GetWidget()->GetClientAreaBoundsInScreen().origin()); | 627 root->GetWidget()->GetClientAreaBoundsInScreen().OffsetFromOrigin()); |
| 628 } | 628 } |
| 629 } | 629 } |
| 630 | 630 |
| 631 // static | 631 // static |
| 632 void View::ConvertPointToWidget(const View* src, gfx::Point* p) { | 632 void View::ConvertPointToWidget(const View* src, gfx::Point* p) { |
| 633 DCHECK(src); | 633 DCHECK(src); |
| 634 DCHECK(p); | 634 DCHECK(p); |
| 635 | 635 |
| 636 src->ConvertPointForAncestor(NULL, p); | 636 src->ConvertPointForAncestor(NULL, p); |
| 637 } | 637 } |
| 638 | 638 |
| 639 // static | 639 // static |
| 640 void View::ConvertPointFromWidget(const View* dest, gfx::Point* p) { | 640 void View::ConvertPointFromWidget(const View* dest, gfx::Point* p) { |
| 641 DCHECK(dest); | 641 DCHECK(dest); |
| 642 DCHECK(p); | 642 DCHECK(p); |
| 643 | 643 |
| 644 dest->ConvertPointFromAncestor(NULL, p); | 644 dest->ConvertPointFromAncestor(NULL, p); |
| 645 } | 645 } |
| 646 | 646 |
| 647 // static | 647 // static |
| 648 void View::ConvertPointToScreen(const View* src, gfx::Point* p) { | 648 void View::ConvertPointToScreen(const View* src, gfx::Point* p) { |
| 649 DCHECK(src); | 649 DCHECK(src); |
| 650 DCHECK(p); | 650 DCHECK(p); |
| 651 | 651 |
| 652 // If the view is not connected to a tree, there's nothing we can do. | 652 // If the view is not connected to a tree, there's nothing we can do. |
| 653 const Widget* widget = src->GetWidget(); | 653 const Widget* widget = src->GetWidget(); |
| 654 if (widget) { | 654 if (widget) { |
| 655 ConvertPointToWidget(src, p); | 655 ConvertPointToWidget(src, p); |
| 656 gfx::Rect r = widget->GetClientAreaBoundsInScreen(); | 656 *p = p->Add(widget->GetClientAreaBoundsInScreen().OffsetFromOrigin()); |
| 657 p->SetPoint(p->x() + r.x(), p->y() + r.y()); | |
| 658 } | 657 } |
| 659 } | 658 } |
| 660 | 659 |
| 661 // static | 660 // static |
| 662 void View::ConvertPointFromScreen(const View* dst, gfx::Point* p) { | 661 void View::ConvertPointFromScreen(const View* dst, gfx::Point* p) { |
| 663 DCHECK(dst); | 662 DCHECK(dst); |
| 664 DCHECK(p); | 663 DCHECK(p); |
| 665 | 664 |
| 666 const views::Widget* widget = dst->GetWidget(); | 665 const views::Widget* widget = dst->GetWidget(); |
| 667 if (!widget) | 666 if (!widget) |
| 668 return; | 667 return; |
| 669 const gfx::Rect r = widget->GetClientAreaBoundsInScreen(); | 668 *p = p->Add(-widget->GetClientAreaBoundsInScreen().OffsetFromOrigin()); |
| 670 p->Offset(-r.x(), -r.y()); | |
| 671 views::View::ConvertPointFromWidget(dst, p); | 669 views::View::ConvertPointFromWidget(dst, p); |
| 672 } | 670 } |
| 673 | 671 |
| 674 gfx::Rect View::ConvertRectToParent(const gfx::Rect& rect) const { | 672 gfx::Rect View::ConvertRectToParent(const gfx::Rect& rect) const { |
| 675 gfx::Rect x_rect = rect; | 673 gfx::Rect x_rect = rect; |
| 676 GetTransform().TransformRect(&x_rect); | 674 GetTransform().TransformRect(&x_rect); |
| 677 x_rect.Offset(GetMirroredPosition()); | 675 x_rect.Offset(GetMirroredPosition().OffsetFromOrigin()); |
| 678 return x_rect; | 676 return x_rect; |
| 679 } | 677 } |
| 680 | 678 |
| 681 gfx::Rect View::ConvertRectToWidget(const gfx::Rect& rect) const { | 679 gfx::Rect View::ConvertRectToWidget(const gfx::Rect& rect) const { |
| 682 gfx::Rect x_rect = rect; | 680 gfx::Rect x_rect = rect; |
| 683 for (const View* v = this; v; v = v->parent_) | 681 for (const View* v = this; v; v = v->parent_) |
| 684 x_rect = v->ConvertRectToParent(x_rect); | 682 x_rect = v->ConvertRectToParent(x_rect); |
| 685 return x_rect; | 683 return x_rect; |
| 686 } | 684 } |
| 687 | 685 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 718 // we paint our view in its mirrored position if need be. | 716 // we paint our view in its mirrored position if need be. |
| 719 gfx::Rect clip_rect = bounds(); | 717 gfx::Rect clip_rect = bounds(); |
| 720 clip_rect.Inset(clip_insets_); | 718 clip_rect.Inset(clip_insets_); |
| 721 if (parent_) | 719 if (parent_) |
| 722 clip_rect.set_x(parent_->GetMirroredXForRect(clip_rect)); | 720 clip_rect.set_x(parent_->GetMirroredXForRect(clip_rect)); |
| 723 if (!canvas->ClipRect(clip_rect)) | 721 if (!canvas->ClipRect(clip_rect)) |
| 724 return; | 722 return; |
| 725 | 723 |
| 726 // Non-empty clip, translate the graphics such that 0,0 corresponds to | 724 // Non-empty clip, translate the graphics such that 0,0 corresponds to |
| 727 // where this view is located (related to its parent). | 725 // where this view is located (related to its parent). |
| 728 canvas->Translate(GetMirroredPosition()); | 726 canvas->Translate(GetMirroredPosition().OffsetFromOrigin()); |
| 729 canvas->Transform(GetTransform()); | 727 canvas->Transform(GetTransform()); |
| 730 | 728 |
| 731 PaintCommon(canvas); | 729 PaintCommon(canvas); |
| 732 } | 730 } |
| 733 | 731 |
| 734 ui::ThemeProvider* View::GetThemeProvider() const { | 732 ui::ThemeProvider* View::GetThemeProvider() const { |
| 735 const Widget* widget = GetWidget(); | 733 const Widget* widget = GetWidget(); |
| 736 return widget ? widget->GetThemeProvider() : NULL; | 734 return widget ? widget->GetThemeProvider() : NULL; |
| 737 } | 735 } |
| 738 | 736 |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 } | 1032 } |
| 1035 | 1033 |
| 1036 int View::OnPerformDrop(const ui::DropTargetEvent& event) { | 1034 int View::OnPerformDrop(const ui::DropTargetEvent& event) { |
| 1037 return ui::DragDropTypes::DRAG_NONE; | 1035 return ui::DragDropTypes::DRAG_NONE; |
| 1038 } | 1036 } |
| 1039 | 1037 |
| 1040 void View::OnDragDone() { | 1038 void View::OnDragDone() { |
| 1041 } | 1039 } |
| 1042 | 1040 |
| 1043 // static | 1041 // static |
| 1044 bool View::ExceededDragThreshold(int delta_x, int delta_y) { | 1042 bool View::ExceededDragThreshold(const gfx::Vector2d& delta) { |
| 1045 return (abs(delta_x) > GetHorizontalDragThreshold() || | 1043 return (abs(delta.x()) > GetHorizontalDragThreshold() || |
| 1046 abs(delta_y) > GetVerticalDragThreshold()); | 1044 abs(delta.y()) > GetVerticalDragThreshold()); |
| 1047 } | 1045 } |
| 1048 | 1046 |
| 1049 // Scrolling ------------------------------------------------------------------- | 1047 // Scrolling ------------------------------------------------------------------- |
| 1050 | 1048 |
| 1051 void View::ScrollRectToVisible(const gfx::Rect& rect) { | 1049 void View::ScrollRectToVisible(const gfx::Rect& rect) { |
| 1052 // We must take RTL UI mirroring into account when adjusting the position of | 1050 // We must take RTL UI mirroring into account when adjusting the position of |
| 1053 // the region. | 1051 // the region. |
| 1054 if (parent_) { | 1052 if (parent_) { |
| 1055 gfx::Rect scroll_rect(rect); | 1053 gfx::Rect scroll_rect(rect); |
| 1056 scroll_rect.Offset(GetMirroredX(), y()); | 1054 scroll_rect.Offset(GetMirroredX(), y()); |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1520 return; | 1518 return; |
| 1521 | 1519 |
| 1522 { | 1520 { |
| 1523 // If the View we are about to paint requested the canvas to be flipped, we | 1521 // If the View we are about to paint requested the canvas to be flipped, we |
| 1524 // should change the transform appropriately. | 1522 // should change the transform appropriately. |
| 1525 // The canvas mirroring is undone once the View is done painting so that we | 1523 // The canvas mirroring is undone once the View is done painting so that we |
| 1526 // don't pass the canvas with the mirrored transform to Views that didn't | 1524 // don't pass the canvas with the mirrored transform to Views that didn't |
| 1527 // request the canvas to be flipped. | 1525 // request the canvas to be flipped. |
| 1528 ScopedCanvas scoped(canvas); | 1526 ScopedCanvas scoped(canvas); |
| 1529 if (FlipCanvasOnPaintForRTLUI()) { | 1527 if (FlipCanvasOnPaintForRTLUI()) { |
| 1530 canvas->Translate(gfx::Point(width(), 0)); | 1528 canvas->Translate(gfx::Vector2d(width(), 0)); |
| 1531 canvas->Scale(-1, 1); | 1529 canvas->Scale(-1, 1); |
| 1532 } | 1530 } |
| 1533 | 1531 |
| 1534 OnPaint(canvas); | 1532 OnPaint(canvas); |
| 1535 } | 1533 } |
| 1536 | 1534 |
| 1537 PaintChildren(canvas); | 1535 PaintChildren(canvas); |
| 1538 } | 1536 } |
| 1539 | 1537 |
| 1540 // Tree operations ------------------------------------------------------------- | 1538 // Tree operations ------------------------------------------------------------- |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1932 } | 1930 } |
| 1933 return !!context_menu_controller || result; | 1931 return !!context_menu_controller || result; |
| 1934 } | 1932 } |
| 1935 | 1933 |
| 1936 bool View::ProcessMouseDragged(const ui::MouseEvent& event, | 1934 bool View::ProcessMouseDragged(const ui::MouseEvent& event, |
| 1937 DragInfo* drag_info) { | 1935 DragInfo* drag_info) { |
| 1938 // Copy the field, that way if we're deleted after drag and drop no harm is | 1936 // Copy the field, that way if we're deleted after drag and drop no harm is |
| 1939 // done. | 1937 // done. |
| 1940 ContextMenuController* context_menu_controller = context_menu_controller_; | 1938 ContextMenuController* context_menu_controller = context_menu_controller_; |
| 1941 const bool possible_drag = drag_info->possible_drag; | 1939 const bool possible_drag = drag_info->possible_drag; |
| 1942 if (possible_drag && ExceededDragThreshold( | 1940 if (possible_drag && |
| 1943 drag_info->start_pt.x() - event.x(), | 1941 ExceededDragThreshold(drag_info->start_pt - event.location())) { |
| 1944 drag_info->start_pt.y() - event.y())) { | |
| 1945 if (!drag_controller_ || | 1942 if (!drag_controller_ || |
| 1946 drag_controller_->CanStartDragForView( | 1943 drag_controller_->CanStartDragForView( |
| 1947 this, drag_info->start_pt, event.location())) | 1944 this, drag_info->start_pt, event.location())) |
| 1948 DoDrag(event, drag_info->start_pt); | 1945 DoDrag(event, drag_info->start_pt); |
| 1949 } else { | 1946 } else { |
| 1950 if (OnMouseDragged(event)) | 1947 if (OnMouseDragged(event)) |
| 1951 return true; | 1948 return true; |
| 1952 // Fall through to return value based on context menu controller. | 1949 // Fall through to return value based on context menu controller. |
| 1953 } | 1950 } |
| 1954 // WARNING: we may have been deleted. | 1951 // WARNING: we may have been deleted. |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2129 gfx::Point widget_location(event.location()); | 2126 gfx::Point widget_location(event.location()); |
| 2130 ConvertPointToWidget(this, &widget_location); | 2127 ConvertPointToWidget(this, &widget_location); |
| 2131 GetWidget()->RunShellDrag(this, data, widget_location, drag_operations); | 2128 GetWidget()->RunShellDrag(this, data, widget_location, drag_operations); |
| 2132 return true; | 2129 return true; |
| 2133 #else | 2130 #else |
| 2134 return false; | 2131 return false; |
| 2135 #endif // !defined(OS_MACOSX) | 2132 #endif // !defined(OS_MACOSX) |
| 2136 } | 2133 } |
| 2137 | 2134 |
| 2138 } // namespace views | 2135 } // namespace views |
| OLD | NEW |