| 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 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 } | 92 } |
| 93 | 93 |
| 94 // Creation and lifetime ------------------------------------------------------- | 94 // Creation and lifetime ------------------------------------------------------- |
| 95 | 95 |
| 96 View::View() | 96 View::View() |
| 97 : enabled_(true), | 97 : enabled_(true), |
| 98 id_(0), | 98 id_(0), |
| 99 group_(-1), | 99 group_(-1), |
| 100 focusable_(false), | 100 focusable_(false), |
| 101 accessibility_focusable_(false), | 101 accessibility_focusable_(false), |
| 102 is_parent_owned_(true), | 102 parent_owned_(true), |
| 103 parent_(NULL), | 103 parent_(NULL), |
| 104 is_visible_(true), | 104 visible_(true), |
| 105 registered_for_visible_bounds_notification_(false), | 105 registered_for_visible_bounds_notification_(false), |
| 106 clip_x_(0.0), | 106 clip_x_(0.0), |
| 107 clip_y_(0.0), | 107 clip_y_(0.0), |
| 108 needs_layout_(true), | 108 needs_layout_(true), |
| 109 flip_canvas_on_paint_for_rtl_ui_(false), | 109 flip_canvas_on_paint_for_rtl_ui_(false), |
| 110 #if !defined(COMPOSITOR_2) | 110 #if !defined(COMPOSITOR_2) |
| 111 texture_id_(0), // TODO(sadrul): 0 can be a valid texture id. | 111 texture_id_(0), // TODO(sadrul): 0 can be a valid texture id. |
| 112 #endif | 112 #endif |
| 113 texture_needs_updating_(true), | 113 texture_needs_updating_(true), |
| 114 accelerator_registration_delayed_(false), | 114 accelerator_registration_delayed_(false), |
| 115 accelerator_focus_manager_(NULL), | 115 accelerator_focus_manager_(NULL), |
| 116 registered_accelerator_count_(0), | 116 registered_accelerator_count_(0), |
| 117 next_focusable_view_(NULL), | 117 next_focusable_view_(NULL), |
| 118 previous_focusable_view_(NULL), | 118 previous_focusable_view_(NULL), |
| 119 context_menu_controller_(NULL), | 119 context_menu_controller_(NULL), |
| 120 drag_controller_(NULL) { | 120 drag_controller_(NULL) { |
| 121 } | 121 } |
| 122 | 122 |
| 123 View::~View() { | 123 View::~View() { |
| 124 if (parent_) | 124 if (parent_) |
| 125 parent_->RemoveChildView(this); | 125 parent_->RemoveChildView(this); |
| 126 | 126 |
| 127 int c = static_cast<int>(children_.size()); | 127 int c = static_cast<int>(children_.size()); |
| 128 while (--c >= 0) { | 128 while (--c >= 0) { |
| 129 children_[c]->SetParent(NULL); | 129 children_[c]->parent_ = NULL; |
| 130 if (children_[c]->IsParentOwned()) | 130 if (children_[c]->parent_owned()) |
| 131 delete children_[c]; | 131 delete children_[c]; |
| 132 } | 132 } |
| 133 | 133 |
| 134 #if defined(OS_WIN) | 134 #if defined(OS_WIN) |
| 135 if (native_view_accessibility_win_.get()) | 135 if (native_view_accessibility_win_.get()) |
| 136 native_view_accessibility_win_->set_view(NULL); | 136 native_view_accessibility_win_->set_view(NULL); |
| 137 #endif | 137 #endif |
| 138 } | 138 } |
| 139 | 139 |
| 140 // Tree operations ------------------------------------------------------------- | 140 // Tree operations ------------------------------------------------------------- |
| 141 | 141 |
| 142 const Widget* View::GetWidget() const { | 142 const Widget* View::GetWidget() const { |
| 143 // The root view holds a reference to this view hierarchy's Widget. | 143 // The root view holds a reference to this view hierarchy's Widget. |
| 144 return parent_ ? parent_->GetWidget() : NULL; | 144 return parent_ ? parent_->GetWidget() : NULL; |
| 145 } | 145 } |
| 146 | 146 |
| 147 Widget* View::GetWidget() { | 147 Widget* View::GetWidget() { |
| 148 return const_cast<Widget*>(const_cast<const View*>(this)->GetWidget()); | 148 return const_cast<Widget*>(const_cast<const View*>(this)->GetWidget()); |
| 149 } | 149 } |
| 150 | 150 |
| 151 const Window* View::GetWindow() const { |
| 152 const Widget* widget = GetWidget(); |
| 153 return widget ? widget->GetContainingWindow() : NULL; |
| 154 } |
| 155 |
| 156 Window* View::GetWindow() { |
| 157 return const_cast<Window*>(const_cast<const View*>(this)->GetWindow()); |
| 158 } |
| 159 |
| 151 void View::AddChildView(View* view) { | 160 void View::AddChildView(View* view) { |
| 152 AddChildViewAt(view, child_count()); | 161 AddChildViewAt(view, child_count()); |
| 153 } | 162 } |
| 154 | 163 |
| 155 void View::AddChildViewAt(View* view, int index) { | 164 void View::AddChildViewAt(View* view, int index) { |
| 156 CHECK(view != this) << "You cannot add a view as its own child"; | 165 CHECK(view != this) << "You cannot add a view as its own child"; |
| 157 | 166 |
| 158 // Remove the view from its current parent if any. | 167 // Remove the view from its current parent if any. |
| 159 if (view->parent()) | 168 if (view->parent()) |
| 160 view->parent()->RemoveChildView(view); | 169 view->parent()->RemoveChildView(view); |
| 161 | 170 |
| 162 // Sets the prev/next focus views. | 171 // Sets the prev/next focus views. |
| 163 InitFocusSiblings(view, index); | 172 InitFocusSiblings(view, index); |
| 164 | 173 |
| 165 // Let's insert the view. | 174 // Let's insert the view. |
| 166 children_.insert(children_.begin() + index, view); | 175 children_.insert(children_.begin() + index, view); |
| 167 view->SetParent(this); | 176 view->parent_ = this; |
| 168 | 177 |
| 169 for (View* p = this; p; p = p->parent()) | 178 for (View* p = this; p; p = p->parent()) |
| 170 p->ViewHierarchyChangedImpl(false, true, this, view); | 179 p->ViewHierarchyChangedImpl(false, true, this, view); |
| 171 | 180 |
| 172 view->PropagateAddNotifications(this, view); | 181 view->PropagateAddNotifications(this, view); |
| 173 UpdateTooltip(); | 182 UpdateTooltip(); |
| 174 if (GetWidget()) | 183 if (GetWidget()) |
| 175 RegisterChildrenForVisibleBoundsNotification(view); | 184 RegisterChildrenForVisibleBoundsNotification(view); |
| 176 | 185 |
| 177 if (layout_manager_.get()) | 186 if (layout_manager_.get()) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 206 return false; | 215 return false; |
| 207 } | 216 } |
| 208 | 217 |
| 209 int View::GetIndexOf(const View* view) const { | 218 int View::GetIndexOf(const View* view) const { |
| 210 ViewVector::const_iterator it = std::find(children_.begin(), children_.end(), | 219 ViewVector::const_iterator it = std::find(children_.begin(), children_.end(), |
| 211 view); | 220 view); |
| 212 return it != children_.end() ? it - children_.begin() : -1; | 221 return it != children_.end() ? it - children_.begin() : -1; |
| 213 } | 222 } |
| 214 | 223 |
| 215 // TODO(beng): remove | 224 // TODO(beng): remove |
| 216 const Window* View::GetWindow() const { | |
| 217 const Widget* widget = GetWidget(); | |
| 218 return widget ? widget->GetContainingWindow() : NULL; | |
| 219 } | |
| 220 | |
| 221 // TODO(beng): remove | |
| 222 Window* View::GetWindow() { | |
| 223 return const_cast<Window*>(const_cast<const View*>(this)->GetWindow()); | |
| 224 } | |
| 225 | |
| 226 // TODO(beng): remove | |
| 227 bool View::ContainsNativeView(gfx::NativeView native_view) const { | 225 bool View::ContainsNativeView(gfx::NativeView native_view) const { |
| 228 for (int i = 0, count = child_count(); i < count; ++i) { | 226 for (int i = 0, count = child_count(); i < count; ++i) { |
| 229 if (GetChildViewAt(i)->ContainsNativeView(native_view)) | 227 if (GetChildViewAt(i)->ContainsNativeView(native_view)) |
| 230 return true; | 228 return true; |
| 231 } | 229 } |
| 232 return false; | 230 return false; |
| 233 } | 231 } |
| 234 | 232 |
| 235 // Size and disposition -------------------------------------------------------- | 233 // Size and disposition -------------------------------------------------------- |
| 236 | 234 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 gfx::Size View::GetMinimumSize() { | 343 gfx::Size View::GetMinimumSize() { |
| 346 return GetPreferredSize(); | 344 return GetPreferredSize(); |
| 347 } | 345 } |
| 348 | 346 |
| 349 int View::GetHeightForWidth(int w) { | 347 int View::GetHeightForWidth(int w) { |
| 350 if (layout_manager_.get()) | 348 if (layout_manager_.get()) |
| 351 return layout_manager_->GetPreferredHeightForWidth(this, w); | 349 return layout_manager_->GetPreferredHeightForWidth(this, w); |
| 352 return GetPreferredSize().height(); | 350 return GetPreferredSize().height(); |
| 353 } | 351 } |
| 354 | 352 |
| 355 void View::SetVisible(bool flag) { | |
| 356 if (flag != is_visible_) { | |
| 357 // If the tab is currently visible, schedule paint to | |
| 358 // refresh parent | |
| 359 if (IsVisible()) | |
| 360 SchedulePaint(); | |
| 361 else | |
| 362 ResetTexture(); | |
| 363 | |
| 364 is_visible_ = flag; | |
| 365 | |
| 366 // This notifies all sub-views recursively. | |
| 367 PropagateVisibilityNotifications(this, flag); | |
| 368 | |
| 369 // If we are newly visible, schedule paint. | |
| 370 if (IsVisible()) | |
| 371 SchedulePaint(); | |
| 372 } | |
| 373 } | |
| 374 | |
| 375 bool View::IsVisible() const { | |
| 376 return is_visible_; | |
| 377 } | |
| 378 | |
| 379 bool View::IsVisibleInRootView() const { | |
| 380 return IsVisible() && parent() ? parent()->IsVisibleInRootView() : false; | |
| 381 } | |
| 382 | |
| 383 void View::SetEnabled(bool state) { | |
| 384 if (enabled_ != state) { | |
| 385 enabled_ = state; | |
| 386 SchedulePaint(); | |
| 387 } | |
| 388 } | |
| 389 | |
| 390 bool View::IsEnabled() const { | |
| 391 return enabled_; | |
| 392 } | |
| 393 | |
| 394 // Transformations ------------------------------------------------------------- | 353 // Transformations ------------------------------------------------------------- |
| 395 | 354 |
| 396 const ui::Transform& View::GetTransform() const { | 355 const ui::Transform& View::GetTransform() const { |
| 397 static const ui::Transform* no_op = new ui::Transform; | 356 static const ui::Transform* no_op = new ui::Transform; |
| 398 if (transform_.get()) | 357 if (transform_.get()) |
| 399 return *transform_.get(); | 358 return *transform_.get(); |
| 400 return *no_op; | 359 return *no_op; |
| 401 } | 360 } |
| 402 | 361 |
| 403 void View::SetTransform(const ui::Transform& transform) { | 362 void View::SetTransform(const ui::Transform& transform) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 if (layout_manager_.get()) | 446 if (layout_manager_.get()) |
| 488 layout_manager_->Uninstalled(this); | 447 layout_manager_->Uninstalled(this); |
| 489 | 448 |
| 490 layout_manager_.reset(layout_manager); | 449 layout_manager_.reset(layout_manager); |
| 491 if (layout_manager_.get()) | 450 if (layout_manager_.get()) |
| 492 layout_manager_->Installed(this); | 451 layout_manager_->Installed(this); |
| 493 } | 452 } |
| 494 | 453 |
| 495 // Attributes ------------------------------------------------------------------ | 454 // Attributes ------------------------------------------------------------------ |
| 496 | 455 |
| 456 void View::SetVisible(bool flag) { |
| 457 if (flag != visible_) { |
| 458 // If the tab is currently visible, schedule paint to |
| 459 // refresh parent |
| 460 if (visible()) |
| 461 SchedulePaint(); |
| 462 else |
| 463 ResetTexture(); |
| 464 |
| 465 visible_ = flag; |
| 466 |
| 467 // This notifies all sub-views recursively. |
| 468 PropagateVisibilityNotifications(this, flag); |
| 469 |
| 470 // If we are newly visible, schedule paint. |
| 471 if (visible()) |
| 472 SchedulePaint(); |
| 473 } |
| 474 } |
| 475 |
| 476 bool View::IsVisibleInRootView() const { |
| 477 return visible() && parent() ? parent()->IsVisibleInRootView() : false; |
| 478 } |
| 479 |
| 480 bool View::IsEnabled() const { |
| 481 return enabled_; |
| 482 } |
| 483 |
| 484 void View::SetEnabled(bool enabled) { |
| 485 if (enabled_ != enabled) { |
| 486 enabled_ = enabled; |
| 487 SchedulePaint(); |
| 488 } |
| 489 } |
| 490 |
| 497 std::string View::GetClassName() const { | 491 std::string View::GetClassName() const { |
| 498 return kViewClassName; | 492 return kViewClassName; |
| 499 } | 493 } |
| 500 | 494 |
| 501 View* View::GetAncestorWithClassName(const std::string& name) { | 495 View* View::GetAncestorWithClassName(const std::string& name) { |
| 502 for (View* view = this; view; view = view->parent()) { | 496 for (View* view = this; view; view = view->parent()) { |
| 503 if (view->GetClassName() == name) | 497 if (view->GetClassName() == name) |
| 504 return view; | 498 return view; |
| 505 } | 499 } |
| 506 return NULL; | 500 return NULL; |
| 507 } | 501 } |
| 508 | 502 |
| 509 const View* View::GetViewByID(int id) const { | 503 const View* View::GetViewByID(int id) const { |
| 510 if (id == id_) | 504 if (id == id_) |
| 511 return const_cast<View*>(this); | 505 return const_cast<View*>(this); |
| 512 | 506 |
| 513 for (int i = 0, count = child_count(); i < count; ++i) { | 507 for (int i = 0, count = child_count(); i < count; ++i) { |
| 514 const View* view = GetChildViewAt(i)->GetViewByID(id); | 508 const View* view = GetChildViewAt(i)->GetViewByID(id); |
| 515 if (view) | 509 if (view) |
| 516 return view; | 510 return view; |
| 517 } | 511 } |
| 518 return NULL; | 512 return NULL; |
| 519 } | 513 } |
| 520 | 514 |
| 521 View* View::GetViewByID(int id) { | 515 View* View::GetViewByID(int id) { |
| 522 return const_cast<View*>(const_cast<const View*>(this)->GetViewByID(id)); | 516 return const_cast<View*>(const_cast<const View*>(this)->GetViewByID(id)); |
| 523 } | 517 } |
| 524 | 518 |
| 525 void View::SetID(int id) { | 519 void View::set_group(int group) { |
| 526 id_ = id; | 520 DCHECK(group_ == -1 || group_ == group); |
| 527 } | 521 group_ = group; |
| 528 | |
| 529 int View::GetID() const { | |
| 530 return id_; | |
| 531 } | |
| 532 | |
| 533 void View::SetGroup(int gid) { | |
| 534 // Don't change the group id once it's set. | |
| 535 DCHECK(group_ == -1 || group_ == gid); | |
| 536 group_ = gid; | |
| 537 } | |
| 538 | |
| 539 int View::GetGroup() const { | |
| 540 return group_; | |
| 541 } | 522 } |
| 542 | 523 |
| 543 bool View::IsGroupFocusTraversable() const { | 524 bool View::IsGroupFocusTraversable() const { |
| 544 return true; | 525 return true; |
| 545 } | 526 } |
| 546 | 527 |
| 547 void View::GetViewsWithGroup(int group_id, std::vector<View*>* out) { | 528 void View::GetViewsInGroup(int group, std::vector<View*>* out) { |
| 548 if (group_ == group_id) | 529 if (group_ == group) |
| 549 out->push_back(this); | 530 out->push_back(this); |
| 550 | 531 |
| 551 for (int i = 0, count = child_count(); i < count; ++i) | 532 for (int i = 0, count = child_count(); i < count; ++i) |
| 552 GetChildViewAt(i)->GetViewsWithGroup(group_id, out); | 533 GetChildViewAt(i)->GetViewsInGroup(group, out); |
| 553 } | 534 } |
| 554 | 535 |
| 555 View* View::GetSelectedViewForGroup(int group_id) { | 536 View* View::GetSelectedViewForGroup(int group) { |
| 556 std::vector<View*> views; | 537 std::vector<View*> views; |
| 557 GetWidget()->GetRootView()->GetViewsWithGroup(group_id, &views); | 538 GetWidget()->GetRootView()->GetViewsInGroup(group, &views); |
| 558 return views.empty() ? NULL : views[0]; | 539 return views.empty() ? NULL : views[0]; |
| 559 } | 540 } |
| 560 | 541 |
| 561 // Coordinate conversion ------------------------------------------------------- | 542 // Coordinate conversion ------------------------------------------------------- |
| 562 | 543 |
| 563 // static | 544 // static |
| 564 void View::ConvertPointToView(const View* src, | 545 void View::ConvertPointToView(const View* src, |
| 565 const View* dst, | 546 const View* dst, |
| 566 gfx::Point* point) { | 547 gfx::Point* point) { |
| 567 ConvertPointToView(src, dst, point, true); | 548 ConvertPointToView(src, dst, point, true); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 return x_rect; | 586 return x_rect; |
| 606 } | 587 } |
| 607 | 588 |
| 608 // Painting -------------------------------------------------------------------- | 589 // Painting -------------------------------------------------------------------- |
| 609 | 590 |
| 610 void View::SchedulePaint() { | 591 void View::SchedulePaint() { |
| 611 SchedulePaintInRect(GetLocalBounds()); | 592 SchedulePaintInRect(GetLocalBounds()); |
| 612 } | 593 } |
| 613 | 594 |
| 614 void View::SchedulePaintInRect(const gfx::Rect& rect) { | 595 void View::SchedulePaintInRect(const gfx::Rect& rect) { |
| 615 if (!IsVisible()) | 596 if (!visible()) |
| 616 return; | 597 return; |
| 617 | 598 |
| 618 if (parent_) { | 599 if (parent_) { |
| 619 // Translate the requested paint rect to the parent's coordinate system | 600 // Translate the requested paint rect to the parent's coordinate system |
| 620 // then pass this notification up to the parent. | 601 // then pass this notification up to the parent. |
| 621 gfx::Rect paint_rect = ConvertRectToParent(rect); | 602 gfx::Rect paint_rect = ConvertRectToParent(rect); |
| 622 paint_rect.Offset(GetMirroredPosition()); | 603 paint_rect.Offset(GetMirroredPosition()); |
| 623 parent_->SchedulePaintInRect(paint_rect); | 604 parent_->SchedulePaintInRect(paint_rect); |
| 624 } | 605 } |
| 625 } | 606 } |
| 626 | 607 |
| 627 void View::Paint(gfx::Canvas* canvas) { | 608 void View::Paint(gfx::Canvas* canvas) { |
| 628 if (!IsVisible()) | 609 if (!visible()) |
| 629 return; | 610 return; |
| 630 | 611 |
| 631 ScopedCanvas scoped_canvas(NULL); | 612 ScopedCanvas scoped_canvas(NULL); |
| 632 scoped_ptr<gfx::Canvas> texture_canvas; | 613 scoped_ptr<gfx::Canvas> texture_canvas; |
| 633 gfx::Rect texture_rect; | 614 gfx::Rect texture_rect; |
| 634 | 615 |
| 635 #if !defined(COMPOSITOR_2) | 616 #if !defined(COMPOSITOR_2) |
| 636 if (use_acceleration_when_possible && | 617 if (use_acceleration_when_possible && |
| 637 transform_.get() && transform_->HasChange()) { | 618 transform_.get() && transform_->HasChange()) { |
| 638 // This view has a transformation. So this maintains its own canvas. | 619 // This view has a transformation. So this maintains its own canvas. |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 use_acceleration_when_possible = use; | 720 use_acceleration_when_possible = use; |
| 740 } | 721 } |
| 741 | 722 |
| 742 // Input ----------------------------------------------------------------------- | 723 // Input ----------------------------------------------------------------------- |
| 743 | 724 |
| 744 View* View::GetEventHandlerForPoint(const gfx::Point& point) { | 725 View* View::GetEventHandlerForPoint(const gfx::Point& point) { |
| 745 // Walk the child Views recursively looking for the View that most | 726 // Walk the child Views recursively looking for the View that most |
| 746 // tightly encloses the specified point. | 727 // tightly encloses the specified point. |
| 747 for (int i = child_count() - 1; i >= 0; --i) { | 728 for (int i = child_count() - 1; i >= 0; --i) { |
| 748 View* child = GetChildViewAt(i); | 729 View* child = GetChildViewAt(i); |
| 749 if (!child->IsVisible()) | 730 if (!child->visible()) |
| 750 continue; | 731 continue; |
| 751 | 732 |
| 752 gfx::Point point_in_child_coords(point); | 733 gfx::Point point_in_child_coords(point); |
| 753 View::ConvertPointToView(this, child, &point_in_child_coords); | 734 View::ConvertPointToView(this, child, &point_in_child_coords); |
| 754 if (child->HitTest(point_in_child_coords)) | 735 if (child->HitTest(point_in_child_coords)) |
| 755 return child->GetEventHandlerForPoint(point_in_child_coords); | 736 return child->GetEventHandlerForPoint(point_in_child_coords); |
| 756 } | 737 } |
| 757 return this; | 738 return this; |
| 758 } | 739 } |
| 759 | 740 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 | 891 |
| 911 View* View::GetPreviousFocusableView() { | 892 View* View::GetPreviousFocusableView() { |
| 912 return previous_focusable_view_; | 893 return previous_focusable_view_; |
| 913 } | 894 } |
| 914 | 895 |
| 915 void View::SetNextFocusableView(View* view) { | 896 void View::SetNextFocusableView(View* view) { |
| 916 view->previous_focusable_view_ = this; | 897 view->previous_focusable_view_ = this; |
| 917 next_focusable_view_ = view; | 898 next_focusable_view_ = view; |
| 918 } | 899 } |
| 919 | 900 |
| 920 void View::SetFocusable(bool focusable) { | |
| 921 focusable_ = focusable; | |
| 922 } | |
| 923 | |
| 924 bool View::IsFocusableInRootView() const { | 901 bool View::IsFocusableInRootView() const { |
| 925 return IsFocusable() && IsVisibleInRootView(); | 902 return IsFocusable() && IsVisibleInRootView(); |
| 926 } | 903 } |
| 927 | 904 |
| 928 bool View::IsAccessibilityFocusableInRootView() const { | 905 bool View::IsAccessibilityFocusableInRootView() const { |
| 929 return (focusable_ || accessibility_focusable_) && IsEnabled() && | 906 return (focusable_ || accessibility_focusable_) && IsEnabled() && |
| 930 IsVisibleInRootView(); | 907 IsVisibleInRootView(); |
| 931 } | 908 } |
| 932 | 909 |
| 933 void View::set_accessibility_focusable(bool accessibility_focusable) { | 910 void View::set_accessibility_focusable(bool accessibility_focusable) { |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 | 1120 |
| 1144 for (int i = 0, count = child_count(); i < count; ++i) { | 1121 for (int i = 0, count = child_count(); i < count; ++i) { |
| 1145 View* child = GetChildViewAt(i); | 1122 View* child = GetChildViewAt(i); |
| 1146 child->PaintComposite(compositor); | 1123 child->PaintComposite(compositor); |
| 1147 } | 1124 } |
| 1148 | 1125 |
| 1149 compositor->RestoreTransform(); | 1126 compositor->RestoreTransform(); |
| 1150 } | 1127 } |
| 1151 #else | 1128 #else |
| 1152 void View::PaintComposite() { | 1129 void View::PaintComposite() { |
| 1153 if (!IsVisible()) | 1130 if (!visible()) |
| 1154 return; | 1131 return; |
| 1155 | 1132 |
| 1156 if (texture_.get()) { | 1133 if (texture_.get()) { |
| 1157 // TODO: if dirty_region doesn't itersect bounds, return. | 1134 // TODO: if dirty_region doesn't itersect bounds, return. |
| 1158 ui::Transform transform; | 1135 ui::Transform transform; |
| 1159 GetTransformRelativeTo(NULL, &transform); | 1136 GetTransformRelativeTo(NULL, &transform); |
| 1160 texture_->Draw(transform); | 1137 texture_->Draw(transform); |
| 1161 } | 1138 } |
| 1162 | 1139 |
| 1163 for (int i = 0, count = child_count(); i < count; ++i) | 1140 for (int i = 0, count = child_count(); i < count; ++i) |
| 1164 GetChildViewAt(i)->PaintComposite(); | 1141 GetChildViewAt(i)->PaintComposite(); |
| 1165 } | 1142 } |
| 1166 | 1143 |
| 1167 void View::PaintToTexture(const gfx::Rect& dirty_region) { | 1144 void View::PaintToTexture(const gfx::Rect& dirty_region) { |
| 1168 if (!IsVisible()) | 1145 if (!visible()) |
| 1169 return; | 1146 return; |
| 1170 | 1147 |
| 1171 if (ShouldPaintToTexture() && texture_needs_updating_) { | 1148 if (ShouldPaintToTexture() && texture_needs_updating_) { |
| 1172 texture_clip_rect_ = dirty_region; | 1149 texture_clip_rect_ = dirty_region; |
| 1173 Paint(NULL); | 1150 Paint(NULL); |
| 1174 texture_clip_rect_.SetRect(0, 0, 0, 0); | 1151 texture_clip_rect_.SetRect(0, 0, 0, 0); |
| 1175 } else { | 1152 } else { |
| 1176 // Forward to all children as a descendant may be dirty and have a texture. | 1153 // Forward to all children as a descendant may be dirty and have a texture. |
| 1177 for (int i = child_count() - 1; i >= 0; --i) { | 1154 for (int i = child_count() - 1; i >= 0; --i) { |
| 1178 View* child_view = GetChildViewAt(i); | 1155 View* child_view = GetChildViewAt(i); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1205 return false; | 1182 return false; |
| 1206 } | 1183 } |
| 1207 | 1184 |
| 1208 void View::GetHitTestMask(gfx::Path* mask) const { | 1185 void View::GetHitTestMask(gfx::Path* mask) const { |
| 1209 DCHECK(mask); | 1186 DCHECK(mask); |
| 1210 } | 1187 } |
| 1211 | 1188 |
| 1212 // Focus ----------------------------------------------------------------------- | 1189 // Focus ----------------------------------------------------------------------- |
| 1213 | 1190 |
| 1214 bool View::IsFocusable() const { | 1191 bool View::IsFocusable() const { |
| 1215 return focusable_ && IsEnabled() && IsVisible(); | 1192 return focusable_ && IsEnabled() && visible(); |
| 1216 } | 1193 } |
| 1217 | 1194 |
| 1218 void View::OnFocus() { | 1195 void View::OnFocus() { |
| 1219 // TODO(beng): Investigate whether it's possible for us to move this to | 1196 // TODO(beng): Investigate whether it's possible for us to move this to |
| 1220 // Focus(). | 1197 // Focus(). |
| 1221 // By default, we clear the native focus. This ensures that no visible native | 1198 // By default, we clear the native focus. This ensures that no visible native |
| 1222 // view as the focus and that we still receive keyboard inputs. | 1199 // view as the focus and that we still receive keyboard inputs. |
| 1223 FocusManager* focus_manager = GetFocusManager(); | 1200 FocusManager* focus_manager = GetFocusManager(); |
| 1224 if (focus_manager) | 1201 if (focus_manager) |
| 1225 focus_manager->ClearNativeFocus(); | 1202 focus_manager->ClearNativeFocus(); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1312 if (prev_focusable) | 1289 if (prev_focusable) |
| 1313 prev_focusable->next_focusable_view_ = next_focusable; | 1290 prev_focusable->next_focusable_view_ = next_focusable; |
| 1314 if (next_focusable) | 1291 if (next_focusable) |
| 1315 next_focusable->previous_focusable_view_ = prev_focusable; | 1292 next_focusable->previous_focusable_view_ = prev_focusable; |
| 1316 } | 1293 } |
| 1317 | 1294 |
| 1318 if (GetWidget()) | 1295 if (GetWidget()) |
| 1319 UnregisterChildrenForVisibleBoundsNotification(view); | 1296 UnregisterChildrenForVisibleBoundsNotification(view); |
| 1320 view->ResetTexture(); | 1297 view->ResetTexture(); |
| 1321 view->PropagateRemoveNotifications(this); | 1298 view->PropagateRemoveNotifications(this); |
| 1322 view->SetParent(NULL); | 1299 view->parent_ = NULL; |
| 1323 | 1300 |
| 1324 if (delete_removed_view && view->IsParentOwned()) | 1301 if (delete_removed_view && view->parent_owned()) |
| 1325 view_to_be_deleted.reset(view); | 1302 view_to_be_deleted.reset(view); |
| 1326 | 1303 |
| 1327 children_.erase(i); | 1304 children_.erase(i); |
| 1328 } | 1305 } |
| 1329 | 1306 |
| 1330 if (update_tool_tip) | 1307 if (update_tool_tip) |
| 1331 UpdateTooltip(); | 1308 UpdateTooltip(); |
| 1332 | 1309 |
| 1333 if (layout_manager_.get()) | 1310 if (layout_manager_.get()) |
| 1334 layout_manager_->ViewRemoved(this, view); | 1311 layout_manager_->ViewRemoved(this, view); |
| 1335 } | 1312 } |
| 1336 | 1313 |
| 1337 void View::SetParent(View* parent) { | |
| 1338 if (parent != parent_) | |
| 1339 parent_ = parent; | |
| 1340 } | |
| 1341 | |
| 1342 void View::PropagateRemoveNotifications(View* parent) { | 1314 void View::PropagateRemoveNotifications(View* parent) { |
| 1343 for (int i = 0, count = child_count(); i < count; ++i) | 1315 for (int i = 0, count = child_count(); i < count; ++i) |
| 1344 GetChildViewAt(i)->PropagateRemoveNotifications(parent); | 1316 GetChildViewAt(i)->PropagateRemoveNotifications(parent); |
| 1345 | 1317 |
| 1346 for (View* v = this; v; v = v->parent()) | 1318 for (View* v = this; v; v = v->parent()) |
| 1347 v->ViewHierarchyChangedImpl(true, false, parent, this); | 1319 v->ViewHierarchyChangedImpl(true, false, parent, this); |
| 1348 } | 1320 } |
| 1349 | 1321 |
| 1350 void View::PropagateAddNotifications(View* parent, View* child) { | 1322 void View::PropagateAddNotifications(View* parent, View* child) { |
| 1351 for (int i = 0, count = child_count(); i < count; ++i) | 1323 for (int i = 0, count = child_count(); i < count; ++i) |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1403 UnregisterAccelerators(true); | 1375 UnregisterAccelerators(true); |
| 1404 VisibilityChanged(starting_from, is_visible); | 1376 VisibilityChanged(starting_from, is_visible); |
| 1405 } | 1377 } |
| 1406 | 1378 |
| 1407 void View::BoundsChanged(const gfx::Rect& previous_bounds) { | 1379 void View::BoundsChanged(const gfx::Rect& previous_bounds) { |
| 1408 #if !defined(COMPOSITOR_2) | 1380 #if !defined(COMPOSITOR_2) |
| 1409 if (canvas_.get()) | 1381 if (canvas_.get()) |
| 1410 canvas_.reset(gfx::Canvas::CreateCanvas(width(), height(), false)); | 1382 canvas_.reset(gfx::Canvas::CreateCanvas(width(), height(), false)); |
| 1411 #endif | 1383 #endif |
| 1412 | 1384 |
| 1413 if (IsVisible()) { | 1385 if (visible()) { |
| 1414 if (parent_) { | 1386 if (parent_) { |
| 1415 // Paint the old bounds. | 1387 // Paint the old bounds. |
| 1416 if (base::i18n::IsRTL()) { | 1388 if (base::i18n::IsRTL()) { |
| 1417 gfx::Rect paint_rect = previous_bounds; | 1389 gfx::Rect paint_rect = previous_bounds; |
| 1418 paint_rect.set_x(parent()->GetMirroredXForRect(paint_rect)); | 1390 paint_rect.set_x(parent()->GetMirroredXForRect(paint_rect)); |
| 1419 parent_->SchedulePaintInRect(paint_rect); | 1391 parent_->SchedulePaintInRect(paint_rect); |
| 1420 } else { | 1392 } else { |
| 1421 parent_->SchedulePaintInRect(previous_bounds); | 1393 parent_->SchedulePaintInRect(previous_bounds); |
| 1422 } | 1394 } |
| 1423 | 1395 |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1851 result.append(GetChildViewAt(i)->PrintViewGraph(false)); | 1823 result.append(GetChildViewAt(i)->PrintViewGraph(false)); |
| 1852 | 1824 |
| 1853 if (first) | 1825 if (first) |
| 1854 result.append("}\n"); | 1826 result.append("}\n"); |
| 1855 | 1827 |
| 1856 return result; | 1828 return result; |
| 1857 } | 1829 } |
| 1858 #endif | 1830 #endif |
| 1859 | 1831 |
| 1860 } // namespace views | 1832 } // namespace views |
| OLD | NEW |