// Copyright (c) 2012 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/views/examples/examples_window.h" #include #include "base/memory/scoped_vector.h" #include "base/utf_string_conversions.h" #include "ui/base/models/combobox_model.h" #include "ui/base/ui_base_paths.h" #include "ui/views/controls/button/text_button.h" #include "ui/views/controls/combobox/combobox.h" #include "ui/views/controls/label.h" #include "ui/views/controls/tabbed_pane/tabbed_pane.h" #include "ui/views/examples/bubble_example.h" #include "ui/views/examples/button_example.h" #include "ui/views/examples/combobox_example.h" #include "ui/views/examples/double_split_view_example.h" #include "ui/views/examples/label_example.h" #include "ui/views/examples/link_example.h" #include "ui/views/examples/menu_example.h" #include "ui/views/examples/message_box_example.h" #include "ui/views/examples/native_theme_button_example.h" #include "ui/views/examples/native_theme_checkbox_example.h" #include "ui/views/examples/progress_bar_example.h" #include "ui/views/examples/radio_button_example.h" #include "ui/views/examples/scroll_view_example.h" #include "ui/views/examples/single_split_view_example.h" #include "ui/views/examples/slider_example.h" #include "ui/views/examples/tabbed_pane_example.h" #include "ui/views/examples/table_example.h" #include "ui/views/examples/text_example.h" #include "ui/views/examples/textfield_example.h" #include "ui/views/examples/throbber_example.h" #include "ui/views/examples/tree_view_example.h" #include "ui/views/examples/widget_example.h" #include "ui/views/focus/accelerator_handler.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/layout/grid_layout.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_delegate.h" namespace views { namespace examples { // Model for the examples that are being added via AddExample(). class ComboboxModelExampleList : public ui::ComboboxModel { public: ComboboxModelExampleList() {} virtual ~ComboboxModelExampleList() {} // Overridden from ui::ComboboxModel: virtual int GetItemCount() const OVERRIDE { return example_list_.size(); } virtual string16 GetItemAt(int index) OVERRIDE { return UTF8ToUTF16(example_list_[index]->example_title()); } View* GetItemViewAt(int index) { return example_list_[index]->example_view(); } void AddExample(ExampleBase* example) { example_list_.push_back(example); } private: ScopedVector example_list_; DISALLOW_COPY_AND_ASSIGN(ComboboxModelExampleList); }; class ExamplesWindowContents : public WidgetDelegateView, public ComboboxListener { public: ExamplesWindowContents(Operation operation) : combobox_(new Combobox(&combobox_model_)), example_shown_(new View), status_label_(new Label), operation_(operation) { instance_ = this; combobox_->set_listener(this); } virtual ~ExamplesWindowContents() {} // Prints a message in the status area, at the bottom of the window. void SetStatus(const std::string& status) { status_label_->SetText(UTF8ToUTF16(status)); } static ExamplesWindowContents* instance() { return instance_; } private: // Overridden from WidgetDelegateView: virtual bool CanResize() const OVERRIDE { return true; } virtual bool CanMaximize() const OVERRIDE { return true; } virtual string16 GetWindowTitle() const OVERRIDE { return ASCIIToUTF16("Views Examples"); } virtual View* GetContentsView() OVERRIDE { return this; } virtual void WindowClosing() OVERRIDE { instance_ = NULL; if (operation_ == QUIT_ON_CLOSE) MessageLoopForUI::current()->Quit(); } // Overridden from View: virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child) OVERRIDE { if (is_add && child == this) InitExamplesWindow(); } // Overridden from ComboboxListener: virtual void OnSelectedIndexChanged(Combobox* combobox) OVERRIDE { DCHECK_EQ(combobox, combobox_); DCHECK(combobox->selected_index() < combobox_model_.GetItemCount()); example_shown_->RemoveAllChildViews(false); example_shown_->AddChildView(combobox_model_.GetItemViewAt( combobox->selected_index())); example_shown_->RequestFocus(); SetStatus(std::string()); Layout(); } // Creates the layout within the examples window. void InitExamplesWindow() { AddExamples(); set_background(Background::CreateStandardPanelBackground()); GridLayout* layout = new GridLayout(this); SetLayoutManager(layout); ColumnSet* column_set = layout->AddColumnSet(0); column_set->AddPaddingColumn(0, 5); column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, GridLayout::USE_PREF, 0, 0); column_set->AddPaddingColumn(0, 5); layout->AddPaddingRow(0, 5); layout->StartRow(0 /* no expand */, 0); layout->AddView(combobox_); if (combobox_model_.GetItemCount() > 0) { layout->StartRow(1, 0); example_shown_->SetLayoutManager(new FillLayout()); example_shown_->AddChildView(combobox_model_.GetItemViewAt(0)); layout->AddView(example_shown_); } layout->StartRow(0 /* no expand */, 0); layout->AddView(status_label_); layout->AddPaddingRow(0, 5); } // Adds all the individual examples to the combobox model. void AddExamples() { // Please keep this list in alphabetical order! combobox_model_.AddExample(new BubbleExample); combobox_model_.AddExample(new ButtonExample); combobox_model_.AddExample(new ComboboxExample); combobox_model_.AddExample(new DoubleSplitViewExample); combobox_model_.AddExample(new LabelExample); combobox_model_.AddExample(new LinkExample); combobox_model_.AddExample(new MenuExample); combobox_model_.AddExample(new MessageBoxExample); combobox_model_.AddExample(new NativeThemeButtonExample); combobox_model_.AddExample(new NativeThemeCheckboxExample); combobox_model_.AddExample(new ProgressBarExample); combobox_model_.AddExample(new RadioButtonExample); combobox_model_.AddExample(new ScrollViewExample); combobox_model_.AddExample(new SingleSplitViewExample); combobox_model_.AddExample(new SliderExample); combobox_model_.AddExample(new TabbedPaneExample); combobox_model_.AddExample(new TableExample); combobox_model_.AddExample(new TextExample); combobox_model_.AddExample(new TextfieldExample); combobox_model_.AddExample(new ThrobberExample); combobox_model_.AddExample(new TreeViewExample); combobox_model_.AddExample(new WidgetExample); } static ExamplesWindowContents* instance_; ComboboxModelExampleList combobox_model_; Combobox* combobox_; View* example_shown_; Label* status_label_; const Operation operation_; DISALLOW_COPY_AND_ASSIGN(ExamplesWindowContents); }; // static ExamplesWindowContents* ExamplesWindowContents::instance_ = NULL; void ShowExamplesWindow(Operation operation) { if (ExamplesWindowContents::instance()) { ExamplesWindowContents::instance()->GetWidget()->Activate(); } else { Widget::CreateWindowWithBounds(new ExamplesWindowContents(operation), gfx::Rect(0, 0, 850, 300))->Show(); } } void LogStatus(const std::string& string) { ExamplesWindowContents::instance()->SetStatus(string); } } // namespace examples } // namespace views