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 15 using base::ASCIIToUTF16; 16 17 namespace views { 18 namespace examples { 19 20 // ScrollView's content, which draws gradient color on background. 21 // TODO(oshima): add child views as well. 22 class 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 54 ScrollViewExample::ScrollViewExample() : ExampleBase("Scroll View") { 55 } 56 57 ScrollViewExample::~ScrollViewExample() { 58 } 59 60 void 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 96 void 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