15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/examples/scroll_view_example.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/background.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/radio_button.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace examples {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollView's content, which draws gradient color on background.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(oshima): add child views as well.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScrollViewExample::ScrollableView : public View {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScrollableView() {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetColor(SK_ColorRED, SK_ColorCYAN);
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AddChildView(new LabelButton(NULL, ASCIIToUTF16("Button")));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(new RadioButton(ASCIIToUTF16("Radio Button"), 0));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gfx::Size(width(), height());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetColor(SkColor from, SkColor to) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_background(Background::CreateVerticalGradientBackground(from, to));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PlaceChildY(int index, int y) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    View* view = child_at(index);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size size = view->GetPreferredSize();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view->SetBounds(0, y, size.width(), size.height());
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PlaceChildY(0, 0);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PlaceChildY(1, height() / 2);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SizeToPreferredSize();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScrollableView);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollViewExample::ScrollViewExample() : ExampleBase("Scroll View") {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollViewExample::~ScrollViewExample() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScrollViewExample::CreateExampleView(View* container) {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wide_ = new LabelButton(this, ASCIIToUTF16("Wide"));
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  tall_ = new LabelButton(this, ASCIIToUTF16("Tall"));
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  big_square_ = new LabelButton(this, ASCIIToUTF16("Big Square"));
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  small_square_ = new LabelButton(this, ASCIIToUTF16("Small Square"));
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scroll_to_ = new LabelButton(this, ASCIIToUTF16("Scroll to"));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollable_ = new ScrollableView();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scroll_view_ = new ScrollView();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scroll_view_->SetContents(scrollable_);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollable_->SetBounds(0, 0, 1000, 100);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollable_->SetColor(SK_ColorYELLOW, SK_ColorCYAN);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout* layout = new GridLayout(container);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container->SetLayoutManager(layout);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add scroll view.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* column_set = layout->AddColumnSet(0);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(1, 0);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(scroll_view_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add control buttons.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set = layout->AddColumnSet(1);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; i++) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GridLayout::USE_PREF, 0, 0);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, 1);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(wide_);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(tall_);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(big_square_);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(small_square_);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(scroll_to_);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScrollViewExample::ButtonPressed(Button* sender, const ui::Event& event) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == wide_) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollable_->SetBounds(0, 0, 1000, 100);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollable_->SetColor(SK_ColorYELLOW, SK_ColorCYAN);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == tall_) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollable_->SetBounds(0, 0, 100, 1000);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollable_->SetColor(SK_ColorRED, SK_ColorCYAN);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == big_square_) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollable_->SetBounds(0, 0, 1000, 1000);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollable_->SetColor(SK_ColorRED, SK_ColorGREEN);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == small_square_) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollable_->SetBounds(0, 0, 100, 100);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollable_->SetColor(SK_ColorYELLOW, SK_ColorGREEN);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == scroll_to_) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scroll_view_->contents()->ScrollRectToVisible(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::Rect(20, 500, 1000, 500));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scroll_view_->Layout();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace examples
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
118