1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Use of this source code is governed by a BSD-style license that can be 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// found in the LICENSE file. 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant#include "ui/views/examples/widget_example.h" 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "base/strings/utf_string_conversions.h" 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ui/views/background.h" 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ui/views/controls/button/label_button.h" 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ui/views/controls/label.h" 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ui/views/layout/box_layout.h" 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ui/views/view.h" 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ui/views/widget/widget.h" 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ui/views/window/dialog_delegate.h" 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantusing base::ASCIIToUTF16; 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace views { 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace examples { 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 2183e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clownamespace { 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 23b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clowclass DialogExample : public DialogDelegateView { 24b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow public: 25b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow DialogExample(); 26b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow virtual ~DialogExample(); 27b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow virtual base::string16 GetWindowTitle() const OVERRIDE; 28b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow virtual View* CreateExtraView() OVERRIDE; 29b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow virtual View* CreateTitlebarExtraView() OVERRIDE; 30b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow virtual View* CreateFootnoteView() OVERRIDE; 31b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow}; 32b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 33b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall ClowDialogExample::DialogExample() { 34b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow set_background(Background::CreateSolidBackground(SK_ColorGRAY)); 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant SetLayoutManager(new BoxLayout(BoxLayout::kVertical, 10, 10, 10)); 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant AddChildView(new Label(ASCIIToUTF16("Dialog contents label!"))); 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantDialogExample::~DialogExample() {} 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbase::string16 DialogExample::GetWindowTitle() const { 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return ASCIIToUTF16("Dialog Widget Example"); 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantView* DialogExample::CreateExtraView() { 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant LabelButton* button = new LabelButton(NULL, ASCIIToUTF16("Extra button!")); 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant button->SetStyle(Button::STYLE_BUTTON); 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return button; 49b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow} 50b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 51b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall ClowView* DialogExample::CreateTitlebarExtraView() { 52b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow Label* label = new Label(ASCIIToUTF16("Extra view!")); 53b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow label->SetEnabledColor(SK_ColorBLUE); 54b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow return label; 55b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow} 56b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 57b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall ClowView* DialogExample::CreateFootnoteView() { 58b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow return new Label(ASCIIToUTF16("Footnote label!")); 59b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow} 60b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} // namespace 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantWidgetExample::WidgetExample() : ExampleBase("Widget") { 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantWidgetExample::~WidgetExample() { 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid WidgetExample::CreateExampleView(View* container) { 70b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow container->SetLayoutManager(new BoxLayout(BoxLayout::kHorizontal, 0, 0, 10)); 71b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow BuildButton(container, "Popup widget", POPUP); 72b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow BuildButton(container, "Dialog widget", DIALOG); 73b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow#if defined(OS_LINUX) 74b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow // Windows does not support TYPE_CONTROL top-level widgets. 75b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow BuildButton(container, "Child widget", CHILD); 76b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow#endif 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid WidgetExample::BuildButton(View* container, 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const std::string& label, 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int tag) { 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant LabelButton* button = new LabelButton(this, ASCIIToUTF16(label)); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant button->SetFocusable(true); 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant button->set_tag(tag); 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant container->AddChildView(button); 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 87b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 88b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clowvoid WidgetExample::ShowWidget(View* sender, Widget::InitParams params) { 89b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow // Setup shared Widget heirarchy and bounds parameters. 90b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow params.parent = sender->GetWidget()->GetNativeView(); 91b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow params.bounds = gfx::Rect(sender->GetBoundsInScreen().CenterPoint(), 92b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow gfx::Size(300, 200)); 93b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 94b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow Widget* widget = new Widget(); 95b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow widget->Init(params); 96b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 97b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow // If the Widget has no contents by default, add a view with a 'Close' button. 98b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow if (!widget->GetContentsView()) { 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant View* contents = new View(); 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant contents->SetLayoutManager(new BoxLayout(BoxLayout::kHorizontal, 0, 0, 0)); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant contents->set_background(Background::CreateSolidBackground(SK_ColorGRAY)); 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant BuildButton(contents, "Close", CLOSE_WIDGET); 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant widget->SetContentsView(contents); 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant widget->Show(); 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 108b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 109b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clowvoid WidgetExample::ButtonPressed(Button* sender, const ui::Event& event) { 110b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow switch (sender->tag()) { 111b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow case POPUP: 112b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow ShowWidget(sender, Widget::InitParams(Widget::InitParams::TYPE_POPUP)); 113b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow break; 114b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow case DIALOG: { 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant DialogDelegate::CreateDialogWidget(new DialogExample(), NULL, 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant sender->GetWidget()->GetNativeView())->Show(); 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case CHILD: 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ShowWidget(sender, Widget::InitParams(Widget::InitParams::TYPE_CONTROL)); 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant break; 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant case CLOSE_WIDGET: 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant sender->GetWidget()->Close(); 124b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow break; 125b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow } 126b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow} 127b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow 128b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow} // namespace examples 129b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow} // namespace views 130b30abdd07a6c6374f4716b7e3a2e343f5db77961Marshall Clow