| 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 20 matching lines...) Expand all Loading... |
| 31 #include "ui/views/widget/native_widget_private.h" | 31 #include "ui/views/widget/native_widget_private.h" |
| 32 #include "ui/views/widget/root_view.h" | 32 #include "ui/views/widget/root_view.h" |
| 33 #include "ui/views/widget/tooltip_manager.h" | 33 #include "ui/views/widget/tooltip_manager.h" |
| 34 #include "ui/views/widget/widget.h" | 34 #include "ui/views/widget/widget.h" |
| 35 | 35 |
| 36 #if defined(OS_WIN) | 36 #if defined(OS_WIN) |
| 37 #include "base/win/scoped_gdi_object.h" | 37 #include "base/win/scoped_gdi_object.h" |
| 38 #include "ui/views/accessibility/native_view_accessibility_win.h" | 38 #include "ui/views/accessibility/native_view_accessibility_win.h" |
| 39 #endif | 39 #endif |
| 40 | 40 |
| 41 #if defined(ENABLE_DIP) | |
| 42 #include "ui/gfx/monitor.h" | |
| 43 #include "ui/gfx/screen.h" | |
| 44 #endif | |
| 45 | |
| 46 namespace { | 41 namespace { |
| 47 | 42 |
| 48 // Whether to use accelerated compositing when necessary (e.g. when a view has a | 43 // Whether to use accelerated compositing when necessary (e.g. when a view has a |
| 49 // transformation). | 44 // transformation). |
| 50 #if defined(USE_AURA) | 45 #if defined(USE_AURA) |
| 51 bool use_acceleration_when_possible = true; | 46 bool use_acceleration_when_possible = true; |
| 52 #else | 47 #else |
| 53 bool use_acceleration_when_possible = false; | 48 bool use_acceleration_when_possible = false; |
| 54 #endif | 49 #endif |
| 55 | 50 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 78 }; | 73 }; |
| 79 | 74 |
| 80 // Returns the top view in |view|'s hierarchy. | 75 // Returns the top view in |view|'s hierarchy. |
| 81 const views::View* GetHierarchyRoot(const views::View* view) { | 76 const views::View* GetHierarchyRoot(const views::View* view) { |
| 82 const views::View* root = view; | 77 const views::View* root = view; |
| 83 while (root && root->parent()) | 78 while (root && root->parent()) |
| 84 root = root->parent(); | 79 root = root->parent(); |
| 85 return root; | 80 return root; |
| 86 } | 81 } |
| 87 | 82 |
| 88 // Converts the rect in DIP coordinates in DIP to pixel coordinates. | |
| 89 gfx::Rect ConvertRectToPixel(const views::View* view, | |
| 90 const gfx::Rect& rect_in_dip) { | |
| 91 #if defined(ENABLE_DIP) | |
| 92 // If we don't know in which monitor the window is in, just assume | |
| 93 // it's in normal density for now. | |
| 94 // TODO(oshima): Re-compute layer_'s bounds when the window is | |
| 95 // attached to root window. | |
| 96 if (view->GetWidget() && view->GetWidget()->GetNativeView()) { | |
| 97 gfx::Monitor monitor = gfx::Screen::GetMonitorNearestWindow( | |
| 98 view->GetWidget()->GetNativeView()); | |
| 99 return gfx::Rect(rect_in_dip.Scale(monitor.device_scale_factor())); | |
| 100 } | |
| 101 #endif | |
| 102 return rect_in_dip; | |
| 103 } | |
| 104 | |
| 105 } // namespace | 83 } // namespace |
| 106 | 84 |
| 107 namespace views { | 85 namespace views { |
| 108 | 86 |
| 109 // static | 87 // static |
| 110 ViewsDelegate* ViewsDelegate::views_delegate = NULL; | 88 ViewsDelegate* ViewsDelegate::views_delegate = NULL; |
| 111 | 89 |
| 112 // static | 90 // static |
| 113 const char View::kViewClassName[] = "views/View"; | 91 const char View::kViewClassName[] = "views/View"; |
| 114 | 92 |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 x_rect = v->ConvertRectToParent(x_rect); | 681 x_rect = v->ConvertRectToParent(x_rect); |
| 704 return x_rect; | 682 return x_rect; |
| 705 } | 683 } |
| 706 | 684 |
| 707 // Painting -------------------------------------------------------------------- | 685 // Painting -------------------------------------------------------------------- |
| 708 | 686 |
| 709 void View::SchedulePaint() { | 687 void View::SchedulePaint() { |
| 710 SchedulePaintInRect(GetLocalBounds()); | 688 SchedulePaintInRect(GetLocalBounds()); |
| 711 } | 689 } |
| 712 | 690 |
| 713 void View::SchedulePaintInRect(const gfx::Rect& rect_in_dip) { | 691 void View::SchedulePaintInRect(const gfx::Rect& rect) { |
| 714 if (!visible_ || !painting_enabled_) | 692 if (!visible_ || !painting_enabled_) |
| 715 return; | 693 return; |
| 716 | 694 |
| 717 if (layer()) { | 695 if (layer()) { |
| 718 layer()->SchedulePaint(ConvertRectToPixel(this, rect_in_dip)); | 696 layer()->SchedulePaint(rect); |
| 719 } else if (parent_) { | 697 } else if (parent_) { |
| 720 // Translate the requested paint rect to the parent's coordinate system | 698 // Translate the requested paint rect to the parent's coordinate system |
| 721 // then pass this notification up to the parent. | 699 // then pass this notification up to the parent. |
| 722 parent_->SchedulePaintInRect(ConvertRectToParent(rect_in_dip)); | 700 parent_->SchedulePaintInRect(ConvertRectToParent(rect)); |
| 723 } | 701 } |
| 724 } | 702 } |
| 725 | 703 |
| 726 void View::Paint(gfx::Canvas* canvas) { | 704 void View::Paint(gfx::Canvas* canvas) { |
| 727 TRACE_EVENT0("views", "View::Paint"); | 705 TRACE_EVENT0("views", "View::Paint"); |
| 728 | 706 |
| 729 ScopedCanvas scoped_canvas(canvas); | 707 ScopedCanvas scoped_canvas(canvas); |
| 730 | 708 |
| 731 // Paint this View and its children, setting the clip rect to the bounds | 709 // Paint this View and its children, setting the clip rect to the bounds |
| 732 // of this View and translating the origin to the local bounds' top left | 710 // of this View and translating the origin to the local bounds' top left |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1250 } else { | 1228 } else { |
| 1251 for (int i = 0, count = child_count(); i < count; ++i) { | 1229 for (int i = 0, count = child_count(); i < count; ++i) { |
| 1252 gfx::Point new_offset(offset.x() + child_at(i)->GetMirroredX(), | 1230 gfx::Point new_offset(offset.x() + child_at(i)->GetMirroredX(), |
| 1253 offset.y() + child_at(i)->y()); | 1231 offset.y() + child_at(i)->y()); |
| 1254 child_at(i)->UpdateChildLayerBounds(new_offset); | 1232 child_at(i)->UpdateChildLayerBounds(new_offset); |
| 1255 } | 1233 } |
| 1256 } | 1234 } |
| 1257 } | 1235 } |
| 1258 | 1236 |
| 1259 void View::OnPaintLayer(gfx::Canvas* canvas) { | 1237 void View::OnPaintLayer(gfx::Canvas* canvas) { |
| 1260 #if defined(ENABLE_DIP) | |
| 1261 scoped_ptr<ScopedCanvas> scoped_canvas; | |
| 1262 if (layer() && GetWidget() && GetWidget()->GetNativeView()) { | |
| 1263 scoped_canvas.reset(new ScopedCanvas(canvas)); | |
| 1264 float scale = | |
| 1265 gfx::Screen::GetMonitorNearestWindow(GetWidget()->GetNativeView()). | |
| 1266 device_scale_factor(); | |
| 1267 canvas->sk_canvas()->scale(SkFloatToScalar(scale), SkFloatToScalar(scale)); | |
| 1268 } | |
| 1269 #endif | |
| 1270 | |
| 1271 if (!layer() || !layer()->fills_bounds_opaquely()) | 1238 if (!layer() || !layer()->fills_bounds_opaquely()) |
| 1272 canvas->DrawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); | 1239 canvas->DrawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); |
| 1273 PaintCommon(canvas); | 1240 PaintCommon(canvas); |
| 1274 } | 1241 } |
| 1275 | 1242 |
| 1276 void View::ReorderLayers() { | 1243 void View::ReorderLayers() { |
| 1277 View* v = this; | 1244 View* v = this; |
| 1278 while (v && !v->layer()) | 1245 while (v && !v->layer()) |
| 1279 v = v->parent(); | 1246 v = v->parent(); |
| 1280 | 1247 |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1761 void View::RemoveDescendantToNotify(View* view) { | 1728 void View::RemoveDescendantToNotify(View* view) { |
| 1762 DCHECK(view && descendants_to_notify_.get()); | 1729 DCHECK(view && descendants_to_notify_.get()); |
| 1763 Views::iterator i(std::find( | 1730 Views::iterator i(std::find( |
| 1764 descendants_to_notify_->begin(), descendants_to_notify_->end(), view)); | 1731 descendants_to_notify_->begin(), descendants_to_notify_->end(), view)); |
| 1765 DCHECK(i != descendants_to_notify_->end()); | 1732 DCHECK(i != descendants_to_notify_->end()); |
| 1766 descendants_to_notify_->erase(i); | 1733 descendants_to_notify_->erase(i); |
| 1767 if (descendants_to_notify_->empty()) | 1734 if (descendants_to_notify_->empty()) |
| 1768 descendants_to_notify_.reset(); | 1735 descendants_to_notify_.reset(); |
| 1769 } | 1736 } |
| 1770 | 1737 |
| 1771 void View::SetLayerBounds(const gfx::Rect& bounds_in_dip) { | 1738 void View::SetLayerBounds(const gfx::Rect& bounds) { |
| 1772 layer()->SetBounds(ConvertRectToPixel(this, bounds_in_dip)); | 1739 layer()->SetBounds(bounds); |
| 1773 } | 1740 } |
| 1774 | 1741 |
| 1775 // Transformations ------------------------------------------------------------- | 1742 // Transformations ------------------------------------------------------------- |
| 1776 | 1743 |
| 1777 bool View::GetTransformRelativeTo(const View* ancestor, | 1744 bool View::GetTransformRelativeTo(const View* ancestor, |
| 1778 ui::Transform* transform) const { | 1745 ui::Transform* transform) const { |
| 1779 const View* p = this; | 1746 const View* p = this; |
| 1780 | 1747 |
| 1781 while (p && p != ancestor) { | 1748 while (p && p != ancestor) { |
| 1782 transform->ConcatTransform(p->GetTransform()); | 1749 transform->ConcatTransform(p->GetTransform()); |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2105 | 2072 |
| 2106 // Message the RootView to do the drag and drop. That way if we're removed | 2073 // Message the RootView to do the drag and drop. That way if we're removed |
| 2107 // the RootView can detect it and avoid calling us back. | 2074 // the RootView can detect it and avoid calling us back. |
| 2108 gfx::Point widget_location(event.location()); | 2075 gfx::Point widget_location(event.location()); |
| 2109 ConvertPointToWidget(this, &widget_location); | 2076 ConvertPointToWidget(this, &widget_location); |
| 2110 GetWidget()->RunShellDrag(this, data, widget_location, drag_operations); | 2077 GetWidget()->RunShellDrag(this, data, widget_location, drag_operations); |
| 2111 #endif // !defined(OS_MACOSX) | 2078 #endif // !defined(OS_MACOSX) |
| 2112 } | 2079 } |
| 2113 | 2080 |
| 2114 } // namespace views | 2081 } // namespace views |
| OLD | NEW |