// 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 #include #include #include #include "base/macros.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/models/combobox_model.h" #include "ui/base/ui_base_paths.h" #include "ui/views/background.h" #include "ui/views/controls/combobox/combobox.h" #include "ui/views/controls/label.h" #include "ui/views/examples/ax_example.h" #include "ui/views/examples/box_layout_example.h" #include "ui/views/examples/bubble_example.h" #include "ui/views/examples/button_example.h" #include "ui/views/examples/button_sticker_sheet.h" #include "ui/views/examples/checkbox_example.h" #include "ui/views/examples/combobox_example.h" #include "ui/views/examples/dialog_example.h" #include "ui/views/examples/flex_layout_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/multiline_example.h" #include "ui/views/examples/native_theme_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/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/toggle_button_example.h" #include "ui/views/examples/tree_view_example.h" #include "ui/views/examples/vector_example.h" #include "ui/views/examples/widget_example.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 { using ExampleVector = std::vector>; namespace { // Creates the default set of examples. ExampleVector CreateExamples() { ExampleVector examples; examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); examples.push_back(std::make_unique()); return examples; } struct ExampleTitleCompare { bool operator()(const std::unique_ptr& a, const std::unique_ptr& b) { return a->example_title() < b->example_title(); } }; ExampleVector GetExamplesToShow(ExampleVector extra) { ExampleVector examples = CreateExamples(); std::move(extra.begin(), extra.end(), std::back_inserter(examples)); std::sort(examples.begin(), examples.end(), ExampleTitleCompare()); for (auto& example : examples) example->CreateExampleView(example->example_view()); return examples; } } // namespace // Model for the examples that are being added via AddExample(). class ComboboxModelExampleList : public ui::ComboboxModel { public: ComboboxModelExampleList() = default; ~ComboboxModelExampleList() override = default; void SetExamples(ExampleVector examples) { example_list_ = std::move(examples); } // ui::ComboboxModel: int GetItemCount() const override { return example_list_.size(); } base::string16 GetItemAt(int index) override { return base::UTF8ToUTF16(example_list_[index]->example_title()); } View* GetItemViewAt(int index) { return example_list_[index]->example_view(); } private: ExampleVector example_list_; DISALLOW_COPY_AND_ASSIGN(ComboboxModelExampleList); }; class ExamplesWindowContents : public WidgetDelegateView, public ComboboxListener { public: ExamplesWindowContents(base::OnceClosure on_close, ExampleVector examples) : on_close_(std::move(on_close)) { auto combobox_model = std::make_unique(); combobox_model_ = combobox_model.get(); combobox_model_->SetExamples(std::move(examples)); auto combobox = std::make_unique(std::move(combobox_model)); instance_ = this; combobox->set_listener(this); SetBackground(CreateThemedSolidBackground( this, ui::NativeTheme::kColorId_DialogBackground)); GridLayout* layout = SetLayoutManager(std::make_unique()); 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); combobox_ = layout->AddView(std::move(combobox)); if (combobox_model_->GetItemCount() > 0) { layout->StartRow(1, 0); auto example_shown = std::make_unique(); example_shown->SetLayoutManager(std::make_unique()); example_shown->AddChildView(combobox_model_->GetItemViewAt(0)); example_shown_ = layout->AddView(std::move(example_shown)); } layout->StartRow(0 /* no expand */, 0); status_label_ = layout->AddView(std::make_unique