diff options
author | dewittj@chromium.org <dewittj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-06 09:40:31 +0000 |
---|---|---|
committer | dewittj@chromium.org <dewittj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-06 09:40:31 +0000 |
commit | 5539b7393da3a29e0b804ce1588d729f00b0ba46 (patch) | |
tree | 0666172b20cc408c220375d0cbbc0343c96ef7eb /ui/message_center | |
parent | 186abb370fb3dc5ee34bd480fee6d70c4854cd76 (diff) | |
download | chromium_src-5539b7393da3a29e0b804ce1588d729f00b0ba46.zip chromium_src-5539b7393da3a29e0b804ce1588d729f00b0ba46.tar.gz chromium_src-5539b7393da3a29e0b804ce1588d729f00b0ba46.tar.bz2 |
Pull out and test BoundedScrollView.
Part of an effort to increase reliability of message center.
BUG=NONE
Review URL: https://codereview.chromium.org/138793008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@249315 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/message_center')
-rw-r--r-- | ui/message_center/message_center.gyp | 9 | ||||
-rw-r--r-- | ui/message_center/views/bounded_scroll_view.cc | 53 | ||||
-rw-r--r-- | ui/message_center/views/bounded_scroll_view.h | 34 | ||||
-rw-r--r-- | ui/message_center/views/bounded_scroll_view_unittest.cc | 107 | ||||
-rw-r--r-- | ui/message_center/views/message_center_view.cc | 67 |
5 files changed, 202 insertions, 68 deletions
diff --git a/ui/message_center/message_center.gyp b/ui/message_center/message_center.gyp index e05b78b..7c19556 100644 --- a/ui/message_center/message_center.gyp +++ b/ui/message_center/message_center.gyp @@ -73,6 +73,8 @@ 'notifier_settings.h', 'views/bounded_label.cc', 'views/bounded_label.h', + 'views/bounded_scroll_view.cc', + 'views/bounded_scroll_view.h', 'views/constants.h', 'views/message_bubble_base.cc', 'views/message_bubble_base.h', @@ -117,6 +119,7 @@ 'dependencies': [ '../events/events.gyp:events', '../views/views.gyp:views', + '../compositor/compositor.gyp:compositor', ], }, { 'sources/': [ @@ -133,11 +136,6 @@ 'views/message_popup_bubble.h', ], }], - ['toolkit_views==1', { - 'dependencies': [ - '../compositor/compositor.gyp:compositor', - ], - }], ['notifications==0', { # Android and iOS. 'sources/': [ # Exclude everything except dummy impl. @@ -220,6 +218,7 @@ ], 'sources': [ 'views/bounded_label_unittest.cc', + 'views/bounded_scroll_view_unittest.cc', 'views/message_center_view_unittest.cc', 'views/message_popup_collection_unittest.cc', 'views/notifier_settings_view_unittest.cc', diff --git a/ui/message_center/views/bounded_scroll_view.cc b/ui/message_center/views/bounded_scroll_view.cc new file mode 100644 index 0000000..7170105 --- /dev/null +++ b/ui/message_center/views/bounded_scroll_view.cc @@ -0,0 +1,53 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/message_center/views/bounded_scroll_view.h" + +#include <algorithm> + +#include "ui/gfx/insets.h" +#include "ui/gfx/size.h" +#include "ui/message_center/message_center_style.h" +#include "ui/views/background.h" +#include "ui/views/controls/scrollbar/overlay_scroll_bar.h" + +namespace message_center { + +BoundedScrollView::BoundedScrollView(int min_height, int max_height) + : min_height_(min_height), max_height_(max_height) { + set_notify_enter_exit_on_child(true); + set_background( + views::Background::CreateSolidBackground(kMessageCenterBackgroundColor)); + SetVerticalScrollBar(new views::OverlayScrollBar(false)); +} + +gfx::Size BoundedScrollView::GetPreferredSize() { + gfx::Size size = contents()->GetPreferredSize(); + size.SetToMax(gfx::Size(size.width(), min_height_)); + size.SetToMin(gfx::Size(size.width(), max_height_)); + gfx::Insets insets = GetInsets(); + size.Enlarge(insets.width(), insets.height()); + return size; +} + +int BoundedScrollView::GetHeightForWidth(int width) { + gfx::Insets insets = GetInsets(); + width = std::max(0, width - insets.width()); + int height = contents()->GetHeightForWidth(width) + insets.height(); + return std::min(std::max(height, min_height_), max_height_); +} + +void BoundedScrollView::Layout() { + int content_width = width(); + int content_height = contents()->GetHeightForWidth(content_width); + if (content_height > height()) { + content_width = std::max(content_width - GetScrollBarWidth(), 0); + content_height = contents()->GetHeightForWidth(content_width); + } + if (contents()->bounds().size() != gfx::Size(content_width, content_height)) + contents()->SetBounds(0, 0, content_width, content_height); + views::ScrollView::Layout(); +} + +} // namespace diff --git a/ui/message_center/views/bounded_scroll_view.h b/ui/message_center/views/bounded_scroll_view.h new file mode 100644 index 0000000..d3bb82d --- /dev/null +++ b/ui/message_center/views/bounded_scroll_view.h @@ -0,0 +1,34 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_MESSAGE_CENTER_VIEWS_BOUNDED_SCROLL_VIEW_H_ +#define UI_MESSAGE_CENTER_VIEWS_BOUNDED_SCROLL_VIEW_H_ + +#include "ui/gfx/size.h" +#include "ui/message_center/message_center_export.h" +#include "ui/views/controls/scroll_view.h" + +namespace message_center { + +// A custom scroll view whose height has a minimum and maximum value and whose +// scroll bar disappears when not needed. +class MESSAGE_CENTER_EXPORT BoundedScrollView : public views::ScrollView { + public: + BoundedScrollView(int min_height, int max_height); + + // Overridden from views::View: + virtual gfx::Size GetPreferredSize() OVERRIDE; + virtual int GetHeightForWidth(int width) OVERRIDE; + virtual void Layout() OVERRIDE; + + private: + int min_height_; + int max_height_; + + DISALLOW_COPY_AND_ASSIGN(BoundedScrollView); +}; + +} // namespace message_center + +#endif // UI_MESSAGE_CENTER_VIEWS_BOUNDED_SCROLL_VIEW_H_ diff --git a/ui/message_center/views/bounded_scroll_view_unittest.cc b/ui/message_center/views/bounded_scroll_view_unittest.cc new file mode 100644 index 0000000..590114d --- /dev/null +++ b/ui/message_center/views/bounded_scroll_view_unittest.cc @@ -0,0 +1,107 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/message_center/views/bounded_scroll_view.h" + +#include "base/memory/scoped_ptr.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/size.h" +#include "ui/views/test/test_views.h" + +namespace message_center { + +namespace test { + +const int kMinHeight = 50; +const int kMaxHeight = 100; + +const int kWidth = 100; + +class BoundedScrollViewTest : public testing::Test { + public: + BoundedScrollViewTest() {} + virtual ~BoundedScrollViewTest() {} + + virtual void SetUp() OVERRIDE { + scroller_.reset( + new message_center::BoundedScrollView(kMinHeight, kMaxHeight)); + } + + virtual void TearDown() OVERRIDE { scroller_.reset(); } + + protected: + message_center::BoundedScrollView* scroller() { return scroller_.get(); } + + private: + scoped_ptr<message_center::BoundedScrollView> scroller_; +}; + +TEST_F(BoundedScrollViewTest, NormalSizeContentTest) { + const int kNormalContentHeight = 75; + scroller()->SetContents( + new views::StaticSizedView(gfx::Size(kWidth, kNormalContentHeight))); + + EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), + scroller()->GetPreferredSize()); + + scroller()->SizeToPreferredSize(); + scroller()->Layout(); + + EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), + scroller()->contents()->size()); + EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), scroller()->size()); +} + +TEST_F(BoundedScrollViewTest, ShortContentTest) { + const int kShortContentHeight = 10; + scroller()->SetContents( + new views::StaticSizedView(gfx::Size(kWidth, kShortContentHeight))); + + EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroller()->GetPreferredSize()); + + scroller()->SizeToPreferredSize(); + scroller()->Layout(); + + EXPECT_EQ(gfx::Size(kWidth, kShortContentHeight), + scroller()->contents()->size()); + EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroller()->size()); +} + +TEST_F(BoundedScrollViewTest, TallContentTest) { + const int kTallContentHeight = 1000; + scroller()->SetContents( + new views::StaticSizedView(gfx::Size(kWidth, kTallContentHeight))); + + EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroller()->GetPreferredSize()); + + scroller()->SizeToPreferredSize(); + scroller()->Layout(); + + EXPECT_EQ(gfx::Size(kWidth, kTallContentHeight), + scroller()->contents()->size()); + EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroller()->size()); +} + +TEST_F(BoundedScrollViewTest, NeedsScrollBarTest) { + // Create a view that will be much taller than it is high. + scroller()->SetContents(new views::ProportionallySizedView(1000)); + + // Without any width, it will default to 0,0 but be overridden by min height. + scroller()->SizeToPreferredSize(); + EXPECT_EQ(gfx::Size(0, kMinHeight), scroller()->GetPreferredSize()); + + gfx::Size new_size(kWidth, scroller()->GetHeightForWidth(kWidth)); + scroller()->SetSize(new_size); + scroller()->Layout(); + + int scroll_bar_width = scroller()->GetScrollBarWidth(); + int expected_width = kWidth - scroll_bar_width; + EXPECT_EQ(scroller()->contents()->size().width(), expected_width); + EXPECT_EQ(scroller()->contents()->size().height(), 1000 * expected_width); + EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroller()->size()); +} + +} // namespace test + +} // namespace message_center diff --git a/ui/message_center/views/message_center_view.cc b/ui/message_center/views/message_center_view.cc index 1031bc0..8c7fc5f 100644 --- a/ui/message_center/views/message_center_view.cc +++ b/ui/message_center/views/message_center_view.cc @@ -25,6 +25,7 @@ #include "ui/message_center/message_center_tray.h" #include "ui/message_center/message_center_types.h" #include "ui/message_center/message_center_util.h" +#include "ui/message_center/views/bounded_scroll_view.h" #include "ui/message_center/views/message_center_button_bar.h" #include "ui/message_center/views/message_view.h" #include "ui/message_center/views/message_view_context_menu_controller.h" @@ -36,8 +37,6 @@ #include "ui/views/border.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/label.h" -#include "ui/views/controls/scroll_view.h" -#include "ui/views/controls/scrollbar/overlay_scroll_bar.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/widget/widget.h" @@ -56,63 +55,6 @@ const int kDefaultAnimationDurationMs = 120; const int kDefaultFrameRateHz = 60; } // namespace -// BoundedScrollView /////////////////////////////////////////////////////////// - -// A custom scroll view whose height has a minimum and maximum value and whose -// scroll bar disappears when not needed. -class BoundedScrollView : public views::ScrollView { - public: - BoundedScrollView(int min_height, int max_height); - - // Overridden from views::View: - virtual gfx::Size GetPreferredSize() OVERRIDE; - virtual int GetHeightForWidth(int width) OVERRIDE; - virtual void Layout() OVERRIDE; - - private: - int min_height_; - int max_height_; - - DISALLOW_COPY_AND_ASSIGN(BoundedScrollView); -}; - -BoundedScrollView::BoundedScrollView(int min_height, int max_height) - : min_height_(min_height), - max_height_(max_height) { - set_notify_enter_exit_on_child(true); - set_background( - views::Background::CreateSolidBackground(kMessageCenterBackgroundColor)); - SetVerticalScrollBar(new views::OverlayScrollBar(false)); -} - -gfx::Size BoundedScrollView::GetPreferredSize() { - gfx::Size size = contents()->GetPreferredSize(); - size.SetToMax(gfx::Size(size.width(), min_height_)); - size.SetToMin(gfx::Size(size.width(), max_height_)); - gfx::Insets insets = GetInsets(); - size.Enlarge(insets.width(), insets.height()); - return size; -} - -int BoundedScrollView::GetHeightForWidth(int width) { - gfx::Insets insets = GetInsets(); - width = std::max(0, width - insets.width()); - int height = contents()->GetHeightForWidth(width) + insets.height(); - return std::min(std::max(height, min_height_), max_height_); -} - -void BoundedScrollView::Layout() { - int content_width = width(); - int content_height = contents()->GetHeightForWidth(content_width); - if (content_height > height()) { - content_width = std::max(content_width - GetScrollBarWidth(), 0); - content_height = contents()->GetHeightForWidth(content_width); - } - if (contents()->bounds().size() != gfx::Size(content_width, content_height)) - contents()->SetBounds(0, 0, content_width, content_height); - views::ScrollView::Layout(); -} - class NoNotificationMessageView : public views::View { public: NoNotificationMessageView(); @@ -296,7 +238,7 @@ void MessageListView::AddNotificationAt(MessageView* view, int i) { } void MessageListView::RemoveNotificationAt(int i) { - views::View* child = child_at(GetActualIndex(i)); + views::View* child = child_at(i); if (GetContentsBounds().IsEmpty()) { delete child; } else { @@ -312,8 +254,7 @@ void MessageListView::RemoveNotificationAt(int i) { } void MessageListView::UpdateNotificationAt(MessageView* view, int i) { - int actual_index = GetActualIndex(i); - views::View* child = child_at(actual_index); + views::View* child = child_at(i); if (animator_.get()) animator_->StopAnimatingView(child); gfx::Rect old_bounds = child->bounds(); @@ -322,7 +263,7 @@ void MessageListView::UpdateNotificationAt(MessageView* view, int i) { if (deleted_when_done_.find(child) != deleted_when_done_.end()) deleted_when_done_.erase(child); delete child; - AddChildViewAt(view, actual_index); + AddChildViewAt(view, i); view->SetBounds(old_bounds.x(), old_bounds.y(), old_bounds.width(), view->GetHeightForWidth(old_bounds.width())); DoUpdateIfPossible(); |