summaryrefslogtreecommitdiffstats
path: root/ui/message_center
diff options
context:
space:
mode:
authordewittj@chromium.org <dewittj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-06 09:40:31 +0000
committerdewittj@chromium.org <dewittj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-06 09:40:31 +0000
commit5539b7393da3a29e0b804ce1588d729f00b0ba46 (patch)
tree0666172b20cc408c220375d0cbbc0343c96ef7eb /ui/message_center
parent186abb370fb3dc5ee34bd480fee6d70c4854cd76 (diff)
downloadchromium_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.gyp9
-rw-r--r--ui/message_center/views/bounded_scroll_view.cc53
-rw-r--r--ui/message_center/views/bounded_scroll_view.h34
-rw-r--r--ui/message_center/views/bounded_scroll_view_unittest.cc107
-rw-r--r--ui/message_center/views/message_center_view.cc67
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();