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