| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "views/view.h" | 5 #include "views/view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #ifndef NDEBUG | 8 #ifndef NDEBUG |
| 9 #include <iostream> | 9 #include <iostream> |
| 10 #endif | 10 #endif |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 | 279 |
| 280 gfx::Rect View::GetVisibleBounds() { | 280 gfx::Rect View::GetVisibleBounds() { |
| 281 if (!IsVisibleInRootView()) | 281 if (!IsVisibleInRootView()) |
| 282 return gfx::Rect(); | 282 return gfx::Rect(); |
| 283 gfx::Rect vis_bounds(0, 0, width(), height()); | 283 gfx::Rect vis_bounds(0, 0, width(), height()); |
| 284 gfx::Rect ancestor_bounds; | 284 gfx::Rect ancestor_bounds; |
| 285 View* view = this; | 285 View* view = this; |
| 286 int root_x = 0; | 286 int root_x = 0; |
| 287 int root_y = 0; | 287 int root_y = 0; |
| 288 while (view != NULL && !vis_bounds.IsEmpty()) { | 288 while (view != NULL && !vis_bounds.IsEmpty()) { |
| 289 root_x += view->GetX(APPLY_MIRRORING_TRANSFORMATION); | 289 root_x += view->GetMirroredX(); |
| 290 root_y += view->y(); | 290 root_y += view->y(); |
| 291 vis_bounds.Offset(view->GetX(APPLY_MIRRORING_TRANSFORMATION), view->y()); | 291 vis_bounds.Offset(view->GetMirroredX(), view->y()); |
| 292 View* ancestor = view->GetParent(); | 292 View* ancestor = view->GetParent(); |
| 293 if (ancestor != NULL) { | 293 if (ancestor != NULL) { |
| 294 ancestor_bounds.SetRect(0, 0, ancestor->width(), | 294 ancestor_bounds.SetRect(0, 0, ancestor->width(), |
| 295 ancestor->height()); | 295 ancestor->height()); |
| 296 vis_bounds = vis_bounds.Intersect(ancestor_bounds); | 296 vis_bounds = vis_bounds.Intersect(ancestor_bounds); |
| 297 } else if (!view->GetWidget()) { | 297 } else if (!view->GetWidget()) { |
| 298 // If the view has no Widget, we're not visible. Return an empty rect. | 298 // If the view has no Widget, we're not visible. Return an empty rect. |
| 299 return gfx::Rect(); | 299 return gfx::Rect(); |
| 300 } | 300 } |
| 301 view = ancestor; | 301 view = ancestor; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 SchedulePaint(); | 371 SchedulePaint(); |
| 372 } | 372 } |
| 373 } | 373 } |
| 374 | 374 |
| 375 bool View::IsEnabled() const { | 375 bool View::IsEnabled() const { |
| 376 return enabled_; | 376 return enabled_; |
| 377 } | 377 } |
| 378 | 378 |
| 379 // RTL positioning ------------------------------------------------------------- | 379 // RTL positioning ------------------------------------------------------------- |
| 380 | 380 |
| 381 gfx::Rect View::GetBounds(PositionMirroringSettings settings) const { | 381 gfx::Rect View::GetMirroredBounds() const { |
| 382 gfx::Rect bounds(bounds_); | 382 gfx::Rect bounds(bounds_); |
| 383 | 383 bounds.set_x(GetMirroredX()); |
| 384 // If the parent uses an RTL UI layout and if we are asked to transform the | |
| 385 // bounds to their mirrored position if necessary, then we should shift the | |
| 386 // rectangle appropriately. | |
| 387 if (settings == APPLY_MIRRORING_TRANSFORMATION) | |
| 388 bounds.set_x(MirroredX()); | |
| 389 | |
| 390 return bounds; | 384 return bounds; |
| 391 } | 385 } |
| 392 | 386 |
| 393 // y(), width() and height() are agnostic to the RTL UI layout of the | 387 gfx::Point View::GetMirroredPosition() const { |
| 394 // parent view. x(), on the other hand, is not. | 388 return gfx::Point(GetMirroredX(), y()); |
| 395 int View::GetX(PositionMirroringSettings settings) const { | |
| 396 return settings == IGNORE_MIRRORING_TRANSFORMATION ? x() : MirroredX(); | |
| 397 } | 389 } |
| 398 | 390 |
| 399 gfx::Point View::GetPosition() const { | 391 int View::GetMirroredX() const { |
| 400 return gfx::Point(GetX(APPLY_MIRRORING_TRANSFORMATION), y()); | 392 View* parent = GetParent(); |
| 393 return parent ? parent->GetMirroredXForRect(bounds_) : x(); |
| 401 } | 394 } |
| 402 | 395 |
| 403 int View::MirroredX() const { | 396 int View::GetMirroredXForRect(const gfx::Rect& bounds) const { |
| 404 View* parent = GetParent(); | 397 return base::i18n::IsRTL() ? |
| 405 return parent ? parent->MirroredLeftPointForRect(bounds_) : x(); | 398 (width() - bounds.x() - bounds.width()) : bounds.x(); |
| 406 } | 399 } |
| 407 | 400 |
| 408 int View::MirroredLeftPointForRect(const gfx::Rect& bounds) const { | 401 int View::GetMirroredXInView(int x) const { |
| 409 return base::i18n::IsRTL() ? | 402 return base::i18n::IsRTL() ? width() - x : x; |
| 410 (width() - bounds.x() - bounds.width()) : bounds.x(); | 403 } |
| 404 |
| 405 int View::GetMirroredXWithWidthInView(int x, int w) const { |
| 406 return base::i18n::IsRTL() ? width() - x - w : x; |
| 411 } | 407 } |
| 412 | 408 |
| 413 // Layout ---------------------------------------------------------------------- | 409 // Layout ---------------------------------------------------------------------- |
| 414 | 410 |
| 415 void View::Layout() { | 411 void View::Layout() { |
| 416 needs_layout_ = false; | 412 needs_layout_ = false; |
| 417 | 413 |
| 418 // If we have a layout manager, let it handle the layout for us. | 414 // If we have a layout manager, let it handle the layout for us. |
| 419 if (layout_manager_.get()) { | 415 if (layout_manager_.get()) { |
| 420 layout_manager_->Layout(this); | 416 layout_manager_->Layout(this); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 ConvertPointToView(src, dst, point, true); | 524 ConvertPointToView(src, dst, point, true); |
| 529 } | 525 } |
| 530 | 526 |
| 531 // static | 527 // static |
| 532 void View::ConvertPointToWidget(const View* src, gfx::Point* p) { | 528 void View::ConvertPointToWidget(const View* src, gfx::Point* p) { |
| 533 DCHECK(src); | 529 DCHECK(src); |
| 534 DCHECK(p); | 530 DCHECK(p); |
| 535 | 531 |
| 536 gfx::Point offset; | 532 gfx::Point offset; |
| 537 for (const View* v = src; v; v = v->GetParent()) { | 533 for (const View* v = src; v; v = v->GetParent()) { |
| 538 offset.set_x(offset.x() + v->GetX(APPLY_MIRRORING_TRANSFORMATION)); | 534 offset.set_x(offset.x() + v->GetMirroredX()); |
| 539 offset.set_y(offset.y() + v->y()); | 535 offset.set_y(offset.y() + v->y()); |
| 540 } | 536 } |
| 541 p->SetPoint(p->x() + offset.x(), p->y() + offset.y()); | 537 p->SetPoint(p->x() + offset.x(), p->y() + offset.y()); |
| 542 } | 538 } |
| 543 | 539 |
| 544 // static | 540 // static |
| 545 void View::ConvertPointFromWidget(const View* dest, gfx::Point* p) { | 541 void View::ConvertPointFromWidget(const View* dest, gfx::Point* p) { |
| 546 gfx::Point t; | 542 gfx::Point t; |
| 547 ConvertPointToWidget(dest, &t); | 543 ConvertPointToWidget(dest, &t); |
| 548 p->SetPoint(p->x() - t.x(), p->y() - t.y()); | 544 p->SetPoint(p->x() - t.x(), p->y() - t.y()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 566 // Painting -------------------------------------------------------------------- | 562 // Painting -------------------------------------------------------------------- |
| 567 | 563 |
| 568 void View::SchedulePaint(const gfx::Rect& r, bool urgent) { | 564 void View::SchedulePaint(const gfx::Rect& r, bool urgent) { |
| 569 if (!IsVisible()) | 565 if (!IsVisible()) |
| 570 return; | 566 return; |
| 571 | 567 |
| 572 if (parent_) { | 568 if (parent_) { |
| 573 // Translate the requested paint rect to the parent's coordinate system | 569 // Translate the requested paint rect to the parent's coordinate system |
| 574 // then pass this notification up to the parent. | 570 // then pass this notification up to the parent. |
| 575 gfx::Rect paint_rect = r; | 571 gfx::Rect paint_rect = r; |
| 576 paint_rect.Offset(GetPosition()); | 572 paint_rect.Offset(GetMirroredPosition()); |
| 577 parent_->SchedulePaint(paint_rect, urgent); | 573 parent_->SchedulePaint(paint_rect, urgent); |
| 578 } | 574 } |
| 579 } | 575 } |
| 580 | 576 |
| 581 void View::SchedulePaint() { | 577 void View::SchedulePaint() { |
| 582 SchedulePaint(GetContentsBounds(), false); | 578 SchedulePaint(GetContentsBounds(), false); |
| 583 } | 579 } |
| 584 | 580 |
| 585 void View::Paint(gfx::Canvas* canvas) { | 581 void View::Paint(gfx::Canvas* canvas) { |
| 586 PaintBackground(canvas); | 582 PaintBackground(canvas); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 // We're going to modify the canvas, save it's state first. | 615 // We're going to modify the canvas, save it's state first. |
| 620 canvas->Save(); | 616 canvas->Save(); |
| 621 | 617 |
| 622 // Paint this View and its children, setting the clip rect to the bounds | 618 // Paint this View and its children, setting the clip rect to the bounds |
| 623 // of this View and translating the origin to the local bounds' top left | 619 // of this View and translating the origin to the local bounds' top left |
| 624 // point. | 620 // point. |
| 625 // | 621 // |
| 626 // Note that the X (or left) position we pass to ClipRectInt takes into | 622 // Note that the X (or left) position we pass to ClipRectInt takes into |
| 627 // consideration whether or not the view uses a right-to-left layout so that | 623 // consideration whether or not the view uses a right-to-left layout so that |
| 628 // we paint our view in its mirrored position if need be. | 624 // we paint our view in its mirrored position if need be. |
| 629 if (canvas->ClipRectInt(MirroredX(), y(), width(), height())) { | 625 if (canvas->ClipRectInt(GetMirroredX(), y(), width(), height())) { |
| 630 // Non-empty clip, translate the graphics such that 0,0 corresponds to | 626 // Non-empty clip, translate the graphics such that 0,0 corresponds to |
| 631 // where this view is located (related to its parent). | 627 // where this view is located (related to its parent). |
| 632 canvas->TranslateInt(MirroredX(), y()); | 628 canvas->TranslateInt(GetMirroredX(), y()); |
| 633 | 629 |
| 634 // If the View we are about to paint requested the canvas to be flipped, we | 630 // If the View we are about to paint requested the canvas to be flipped, we |
| 635 // should change the transform appropriately. | 631 // should change the transform appropriately. |
| 636 canvas->Save(); | 632 canvas->Save(); |
| 637 if (FlipCanvasOnPaintForRTLUI()) { | 633 if (FlipCanvasOnPaintForRTLUI()) { |
| 638 canvas->TranslateInt(width(), 0); | 634 canvas->TranslateInt(width(), 0); |
| 639 canvas->ScaleInt(-1, 1); | 635 canvas->ScaleInt(-1, 1); |
| 640 } | 636 } |
| 641 | 637 |
| 642 Paint(canvas); | 638 Paint(canvas); |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 | 954 |
| 959 // Scrolling ------------------------------------------------------------------- | 955 // Scrolling ------------------------------------------------------------------- |
| 960 | 956 |
| 961 void View::ScrollRectToVisible(const gfx::Rect& rect) { | 957 void View::ScrollRectToVisible(const gfx::Rect& rect) { |
| 962 View* parent = GetParent(); | 958 View* parent = GetParent(); |
| 963 | 959 |
| 964 // We must take RTL UI mirroring into account when adjusting the position of | 960 // We must take RTL UI mirroring into account when adjusting the position of |
| 965 // the region. | 961 // the region. |
| 966 if (parent) { | 962 if (parent) { |
| 967 gfx::Rect scroll_rect(rect); | 963 gfx::Rect scroll_rect(rect); |
| 968 scroll_rect.Offset(GetX(APPLY_MIRRORING_TRANSFORMATION), y()); | 964 scroll_rect.Offset(GetMirroredX(), y()); |
| 969 parent->ScrollRectToVisible(scroll_rect); | 965 parent->ScrollRectToVisible(scroll_rect); |
| 970 } | 966 } |
| 971 } | 967 } |
| 972 | 968 |
| 973 int View::GetPageScrollIncrement(ScrollView* scroll_view, | 969 int View::GetPageScrollIncrement(ScrollView* scroll_view, |
| 974 bool is_horizontal, bool is_positive) { | 970 bool is_horizontal, bool is_positive) { |
| 975 return 0; | 971 return 0; |
| 976 } | 972 } |
| 977 | 973 |
| 978 int View::GetLineScrollIncrement(ScrollView* scroll_view, | 974 int View::GetLineScrollIncrement(ScrollView* scroll_view, |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1332 const View* dst, | 1328 const View* dst, |
| 1333 gfx::Point* point, | 1329 gfx::Point* point, |
| 1334 bool try_other_direction) { | 1330 bool try_other_direction) { |
| 1335 // src can be NULL | 1331 // src can be NULL |
| 1336 DCHECK(dst); | 1332 DCHECK(dst); |
| 1337 DCHECK(point); | 1333 DCHECK(point); |
| 1338 | 1334 |
| 1339 const View* v; | 1335 const View* v; |
| 1340 gfx::Point offset; | 1336 gfx::Point offset; |
| 1341 | 1337 |
| 1342 for (v = dst; v && v != src; v = v->GetParent()) { | 1338 for (v = dst; v && v != src; v = v->GetParent()) |
| 1343 offset.SetPoint(offset.x() + v->GetX(APPLY_MIRRORING_TRANSFORMATION), | 1339 offset.SetPoint(offset.x() + v->GetMirroredX(), offset.y() + v->y()); |
| 1344 offset.y() + v->y()); | |
| 1345 } | |
| 1346 | 1340 |
| 1347 // The source was not found. The caller wants a conversion | 1341 // The source was not found. The caller wants a conversion |
| 1348 // from a view to a transitive parent. | 1342 // from a view to a transitive parent. |
| 1349 if (src && v == NULL && try_other_direction) { | 1343 if (src && v == NULL && try_other_direction) { |
| 1350 gfx::Point p; | 1344 gfx::Point p; |
| 1351 // note: try_other_direction is force to FALSE so we don't | 1345 // note: try_other_direction is force to FALSE so we don't |
| 1352 // end up in an infinite recursion should both src and dst | 1346 // end up in an infinite recursion should both src and dst |
| 1353 // are not parented. | 1347 // are not parented. |
| 1354 ConvertPointToView(dst, src, &p, false); | 1348 ConvertPointToView(dst, src, &p, false); |
| 1355 // since the src and dst are inverted, p should also be negated | 1349 // since the src and dst are inverted, p should also be negated |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1574 OSExchangeData data; | 1568 OSExchangeData data; |
| 1575 WriteDragData(press_pt, &data); | 1569 WriteDragData(press_pt, &data); |
| 1576 | 1570 |
| 1577 // Message the RootView to do the drag and drop. That way if we're removed | 1571 // Message the RootView to do the drag and drop. That way if we're removed |
| 1578 // the RootView can detect it and avoid calling us back. | 1572 // the RootView can detect it and avoid calling us back. |
| 1579 RootView* root_view = GetRootView(); | 1573 RootView* root_view = GetRootView(); |
| 1580 root_view->StartDragForViewFromMouseEvent(this, data, drag_operations); | 1574 root_view->StartDragForViewFromMouseEvent(this, data, drag_operations); |
| 1581 } | 1575 } |
| 1582 | 1576 |
| 1583 } // namespace views | 1577 } // namespace views |
| OLD | NEW |