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
3// found in the LICENSE file.
4
5#include "ui/views/examples/scroll_view_example.h"
6
7#include "base/strings/stringprintf.h"
8#include "base/strings/utf_string_conversions.h"
9#include "ui/views/background.h"
10#include "ui/views/controls/button/label_button.h"
11#include "ui/views/controls/button/radio_button.h"
12#include "ui/views/layout/grid_layout.h"
13#include "ui/views/view.h"
14
15using base::ASCIIToUTF16;
16
17namespace views {
18namespace examples {
19
20// ScrollView's content, which draws gradient color on background.
21// TODO(oshima): add child views as well.
22class ScrollViewExample::ScrollableView : public View {
23 public:
24  ScrollableView() {
25    SetColor(SK_ColorRED, SK_ColorCYAN);
26    AddChildView(new LabelButton(NULL, ASCIIToUTF16("Button")));
27    AddChildView(new RadioButton(ASCIIToUTF16("Radio Button"), 0));
28  }
29
30  virtual gfx::Size GetPreferredSize() const OVERRIDE {
31    return gfx::Size(width(), height());
32  }
33
34  void SetColor(SkColor from, SkColor to) {
35    set_background(Background::CreateVerticalGradientBackground(from, to));
36  }
37
38  void PlaceChildY(int index, int y) {
39    View* view = child_at(index);
40    gfx::Size size = view->GetPreferredSize();
41    view->SetBounds(0, y, size.width(), size.height());
42  }
43
44  virtual void Layout() OVERRIDE {
45    PlaceChildY(0, 0);
46    PlaceChildY(1, height() / 2);
47    SizeToPreferredSize();
48  }
49
50 private:
51  DISALLOW_COPY_AND_ASSIGN(ScrollableView);
52};
53
54ScrollViewExample::ScrollViewExample() : ExampleBase("Scroll View") {
55}
56
57ScrollViewExample::~ScrollViewExample() {
58}
59
60void ScrollViewExample::CreateExampleView(View* container) {
61  wide_ = new LabelButton(this, ASCIIToUTF16("Wide"));
62  tall_ = new LabelButton(this, ASCIIToUTF16("Tall"));
63  big_square_ = new LabelButton(this, ASCIIToUTF16("Big Square"));
64  small_square_ = new LabelButton(this, ASCIIToUTF16("Small Square"));
65  scroll_to_ = new LabelButton(this, ASCIIToUTF16("Scroll to"));
66  scrollable_ = new ScrollableView();
67  scroll_view_ = new ScrollView();
68  scroll_view_->SetContents(scrollable_);
69  scrollable_->SetBounds(0, 0, 1000, 100);
70  scrollable_->SetColor(SK_ColorYELLOW, SK_ColorCYAN);
71
72  GridLayout* layout = new GridLayout(container);
73  container->SetLayoutManager(layout);
74
75  // Add scroll view.
76  ColumnSet* column_set = layout->AddColumnSet(0);
77  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
78                        GridLayout::USE_PREF, 0, 0);
79  layout->StartRow(1, 0);
80  layout->AddView(scroll_view_);
81
82  // Add control buttons.
83  column_set = layout->AddColumnSet(1);
84  for (int i = 0; i < 5; i++) {
85    column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
86                          GridLayout::USE_PREF, 0, 0);
87  }
88  layout->StartRow(0, 1);
89  layout->AddView(wide_);
90  layout->AddView(tall_);
91  layout->AddView(big_square_);
92  layout->AddView(small_square_);
93  layout->AddView(scroll_to_);
94}
95
96void ScrollViewExample::ButtonPressed(Button* sender, const ui::Event& event) {
97  if (sender == wide_) {
98    scrollable_->SetBounds(0, 0, 1000, 100);
99    scrollable_->SetColor(SK_ColorYELLOW, SK_ColorCYAN);
100  } else if (sender == tall_) {
101    scrollable_->SetBounds(0, 0, 100, 1000);
102    scrollable_->SetColor(SK_ColorRED, SK_ColorCYAN);
103  } else if (sender == big_square_) {
104    scrollable_->SetBounds(0, 0, 1000, 1000);
105    scrollable_->SetColor(SK_ColorRED, SK_ColorGREEN);
106  } else if (sender == small_square_) {
107    scrollable_->SetBounds(0, 0, 100, 100);
108    scrollable_->SetColor(SK_ColorYELLOW, SK_ColorGREEN);
109  } else if (sender == scroll_to_) {
110    scroll_view_->contents()->ScrollRectToVisible(
111        gfx::Rect(20, 500, 1000, 500));
112  }
113  scroll_view_->Layout();
114}
115
116}  // namespace examples
117}  // namespace views
118