1 // Copyright (c) 2012 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/examples_window_with_content.h" 6 7 #include <string> 8 9 #include "base/memory/scoped_vector.h" 10 #include "base/strings/utf_string_conversions.h" 11 #include "content/public/browser/browser_context.h" 12 #include "ui/base/models/combobox_model.h" 13 #include "ui/base/ui_base_paths.h" 14 #include "ui/views/background.h" 15 #include "ui/views/controls/combobox/combobox.h" 16 #include "ui/views/controls/label.h" 17 #include "ui/views/examples/bubble_example.h" 18 #include "ui/views/examples/button_example.h" 19 #include "ui/views/examples/checkbox_example.h" 20 #include "ui/views/examples/combobox_example.h" 21 #include "ui/views/examples/double_split_view_example.h" 22 #include "ui/views/examples/label_example.h" 23 #include "ui/views/examples/link_example.h" 24 #include "ui/views/examples/menu_example.h" 25 #include "ui/views/examples/message_box_example.h" 26 #include "ui/views/examples/multiline_example.h" 27 #include "ui/views/examples/progress_bar_example.h" 28 #include "ui/views/examples/radio_button_example.h" 29 #include "ui/views/examples/scroll_view_example.h" 30 #include "ui/views/examples/single_split_view_example.h" 31 #include "ui/views/examples/slider_example.h" 32 #include "ui/views/examples/tabbed_pane_example.h" 33 #include "ui/views/examples/table_example.h" 34 #include "ui/views/examples/text_example.h" 35 #include "ui/views/examples/textfield_example.h" 36 #include "ui/views/examples/throbber_example.h" 37 #include "ui/views/examples/tree_view_example.h" 38 #include "ui/views/examples/webview_example.h" 39 #include "ui/views/examples/widget_example.h" 40 #include "ui/views/layout/fill_layout.h" 41 #include "ui/views/layout/grid_layout.h" 42 #include "ui/views/widget/widget.h" 43 #include "ui/views/widget/widget_delegate.h" 44 45 namespace views { 46 namespace examples { 47 48 // Model for the examples that are being added via AddExample(). 49 class ComboboxModelExampleList : public ui::ComboboxModel { 50 public: 51 ComboboxModelExampleList() {} 52 virtual ~ComboboxModelExampleList() {} 53 54 // Overridden from ui::ComboboxModel: 55 virtual int GetItemCount() const OVERRIDE { return example_list_.size(); } 56 virtual string16 GetItemAt(int index) OVERRIDE { 57 return UTF8ToUTF16(example_list_[index]->example_title()); 58 } 59 60 View* GetItemViewAt(int index) { 61 return example_list_[index]->example_view(); 62 } 63 64 void AddExample(ExampleBase* example) { 65 example_list_.push_back(example); 66 } 67 68 private: 69 ScopedVector<ExampleBase> example_list_; 70 71 DISALLOW_COPY_AND_ASSIGN(ComboboxModelExampleList); 72 }; 73 74 class ExamplesWindowContents : public WidgetDelegateView, 75 public ComboboxListener { 76 public: 77 ExamplesWindowContents(Operation operation, 78 content::BrowserContext* browser_context) 79 : combobox_(new Combobox(&combobox_model_)), 80 example_shown_(new View), 81 status_label_(new Label), 82 operation_(operation), 83 browser_context_(browser_context) { 84 instance_ = this; 85 combobox_->set_listener(this); 86 } 87 virtual ~ExamplesWindowContents() { 88 // Delete |combobox_| first as it references |combobox_model_|. 89 delete combobox_; 90 combobox_ = NULL; 91 } 92 93 // Prints a message in the status area, at the bottom of the window. 94 void SetStatus(const std::string& status) { 95 status_label_->SetText(UTF8ToUTF16(status)); 96 } 97 98 static ExamplesWindowContents* instance() { return instance_; } 99 100 private: 101 // Overridden from WidgetDelegateView: 102 virtual bool CanResize() const OVERRIDE { return true; } 103 virtual bool CanMaximize() const OVERRIDE { return true; } 104 virtual string16 GetWindowTitle() const OVERRIDE { 105 return ASCIIToUTF16("Views Examples"); 106 } 107 virtual View* GetContentsView() OVERRIDE { return this; } 108 virtual void WindowClosing() OVERRIDE { 109 instance_ = NULL; 110 if (operation_ == QUIT_ON_CLOSE) 111 base::MessageLoopForUI::current()->Quit(); 112 } 113 114 // Overridden from View: 115 virtual void ViewHierarchyChanged( 116 const ViewHierarchyChangedDetails& details) OVERRIDE { 117 if (details.is_add && details.child == this) 118 InitExamplesWindow(); 119 } 120 121 // Overridden from ComboboxListener: 122 virtual void OnSelectedIndexChanged(Combobox* combobox) OVERRIDE { 123 DCHECK_EQ(combobox, combobox_); 124 DCHECK(combobox->selected_index() < combobox_model_.GetItemCount()); 125 example_shown_->RemoveAllChildViews(false); 126 example_shown_->AddChildView(combobox_model_.GetItemViewAt( 127 combobox->selected_index())); 128 SetStatus(std::string()); 129 Layout(); 130 SchedulePaint(); 131 } 132 133 // Creates the layout within the examples window. 134 void InitExamplesWindow() { 135 AddExamples(); 136 137 set_background(Background::CreateStandardPanelBackground()); 138 GridLayout* layout = new GridLayout(this); 139 SetLayoutManager(layout); 140 ColumnSet* column_set = layout->AddColumnSet(0); 141 column_set->AddPaddingColumn(0, 5); 142 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, 143 GridLayout::USE_PREF, 0, 0); 144 column_set->AddPaddingColumn(0, 5); 145 layout->AddPaddingRow(0, 5); 146 layout->StartRow(0 /* no expand */, 0); 147 layout->AddView(combobox_); 148 149 if (combobox_model_.GetItemCount() > 0) { 150 layout->StartRow(1, 0); 151 example_shown_->SetLayoutManager(new FillLayout()); 152 example_shown_->AddChildView(combobox_model_.GetItemViewAt(0)); 153 layout->AddView(example_shown_); 154 } 155 156 layout->StartRow(0 /* no expand */, 0); 157 layout->AddView(status_label_); 158 layout->AddPaddingRow(0, 5); 159 } 160 161 // Adds all the individual examples to the combobox model. 162 void AddExamples() { 163 // Please keep this list in alphabetical order! 164 combobox_model_.AddExample(new BubbleExample); 165 combobox_model_.AddExample(new ButtonExample); 166 combobox_model_.AddExample(new CheckboxExample); 167 combobox_model_.AddExample(new ComboboxExample); 168 combobox_model_.AddExample(new DoubleSplitViewExample); 169 combobox_model_.AddExample(new LabelExample); 170 combobox_model_.AddExample(new LinkExample); 171 combobox_model_.AddExample(new MenuExample); 172 combobox_model_.AddExample(new MessageBoxExample); 173 combobox_model_.AddExample(new MultilineExample); 174 combobox_model_.AddExample(new ProgressBarExample); 175 combobox_model_.AddExample(new RadioButtonExample); 176 combobox_model_.AddExample(new ScrollViewExample); 177 combobox_model_.AddExample(new SingleSplitViewExample); 178 combobox_model_.AddExample(new SliderExample); 179 combobox_model_.AddExample(new TabbedPaneExample); 180 combobox_model_.AddExample(new TableExample); 181 combobox_model_.AddExample(new TextExample); 182 combobox_model_.AddExample(new TextfieldExample); 183 combobox_model_.AddExample(new ThrobberExample); 184 combobox_model_.AddExample(new TreeViewExample); 185 combobox_model_.AddExample(new WebViewExample(browser_context_)); 186 combobox_model_.AddExample(new WidgetExample); 187 } 188 189 static ExamplesWindowContents* instance_; 190 ComboboxModelExampleList combobox_model_; 191 Combobox* combobox_; 192 View* example_shown_; 193 Label* status_label_; 194 const Operation operation_; 195 content::BrowserContext* browser_context_; 196 197 DISALLOW_COPY_AND_ASSIGN(ExamplesWindowContents); 198 }; 199 200 // static 201 ExamplesWindowContents* ExamplesWindowContents::instance_ = NULL; 202 203 void ShowExamplesWindowWithContent(Operation operation, 204 content::BrowserContext* browser_context, 205 gfx::NativeView window_context) { 206 if (ExamplesWindowContents::instance()) { 207 ExamplesWindowContents::instance()->GetWidget()->Activate(); 208 } else { 209 Widget* widget = new Widget; 210 Widget::InitParams params; 211 params.delegate = new ExamplesWindowContents(operation, browser_context); 212 params.context = window_context; 213 params.bounds = gfx::Rect(0, 0, 850, 300); 214 params.top_level = true; 215 widget->Init(params); 216 widget->Show(); 217 } 218 } 219 220 void LogStatus(const std::string& string) { 221 ExamplesWindowContents::instance()->SetStatus(string); 222 } 223 224 } // namespace examples 225 } // namespace views 226