blob: ed45ebec198c1c1ff6a0b6770f703a2327e01879 [file] [log] [blame] [edit]
// 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/widget_example.h"
#include "base/utf_string_conversions.h"
#include "ui/views/controls/button/text_button.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/layout_manager.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
namespace views {
namespace examples {
namespace {
// A layout manager that layouts a single child at
// the center of the host view.
class CenterLayout : public LayoutManager {
public:
CenterLayout() {}
virtual ~CenterLayout() {}
// Overridden from LayoutManager:
virtual void Layout(View* host) {
View* child = host->child_at(0);
gfx::Size size = child->GetPreferredSize();
child->SetBounds((host->width() - size.width()) / 2,
(host->height() - size.height()) / 2,
size.width(), size.height());
}
virtual gfx::Size GetPreferredSize(View* host) {
return gfx::Size();
}
private:
DISALLOW_COPY_AND_ASSIGN(CenterLayout);
};
} // namespace
WidgetExample::WidgetExample() : ExampleBase("Widget") {
}
WidgetExample::~WidgetExample() {
}
void WidgetExample::CreateExampleView(View* container) {
container->SetLayoutManager(
new BoxLayout(BoxLayout::kHorizontal, 0, 0, 2));
BuildButton(container, "Create a popup widget", POPUP);
BuildButton(container, "Create a transparent popup widget",
TRANSPARENT_POPUP);
#if defined(OS_LINUX)
View* vert_container = new View();
container->AddChildView(vert_container);
vert_container->SetLayoutManager(
new BoxLayout(BoxLayout::kVertical, 0, 0, 20));
BuildButton(vert_container, "Create a child widget", CHILD);
BuildButton(vert_container, "Create a transparent child widget",
TRANSPARENT_CHILD);
#endif
}
void WidgetExample::BuildButton(View* container,
const std::string& label,
int tag) {
TextButton* button = new TextButton(this, ASCIIToUTF16(label));
button->set_tag(tag);
container->AddChildView(button);
}
void WidgetExample::InitWidget(Widget* widget, bool transparent) {
// Add view/native buttons to close the popup widget.
TextButton* close_button = new TextButton(
this, ASCIIToUTF16("Close"));
close_button->set_tag(CLOSE_WIDGET);
// TODO(oshima): support transparent native view.
NativeTextButton* native_button = new NativeTextButton(
this, ASCIIToUTF16("Native Close"));
native_button->set_tag(CLOSE_WIDGET);
View* button_container = new View();
button_container->SetLayoutManager(
new BoxLayout(BoxLayout::kHorizontal, 0, 0, 1));
button_container->AddChildView(close_button);
button_container->AddChildView(native_button);
View* widget_container = new View();
widget_container->SetLayoutManager(new CenterLayout);
widget_container->AddChildView(button_container);
widget->SetContentsView(widget_container);
if (!transparent) {
widget_container->set_background(
Background::CreateStandardPanelBackground());
}
// Show the widget.
widget->Show();
}
#if defined(OS_LINUX)
void WidgetExample::CreateChild(View* parent, bool transparent) {
Widget* widget = new Widget;
// Compute where to place the child widget.
// We'll place it at the center of the root widget.
Widget* parent_widget = parent->GetWidget();
gfx::Rect bounds = parent_widget->GetClientAreaBoundsInScreen();
// Child widget is 200x200 square.
bounds.SetRect((bounds.width() - 200) / 2, (bounds.height() - 200) / 2,
200, 200);
// Initialize the child widget with the computed bounds.
Widget::InitParams params(Widget::InitParams::TYPE_CONTROL);
params.transparent = transparent;
params.parent_widget = parent_widget;
widget->Init(params);
InitWidget(widget, transparent);
}
#endif
void WidgetExample::CreatePopup(View* parent, bool transparent) {
Widget* widget = new Widget;
// Compute where to place the popup widget.
// We'll place it right below the create button.
gfx::Point point = parent->GetMirroredPosition();
// The position in point is relative to the parent. Make it absolute.
View::ConvertPointToScreen(parent, &point);
// Add the height of create_button_.
point.Offset(0, parent->size().height());
// Initialize the popup widget with the computed bounds.
Widget::InitParams params(Widget::InitParams::TYPE_POPUP);
params.transparent = transparent;
params.parent_widget = parent->GetWidget();
params.bounds = gfx::Rect(point.x(), point.y(), 200, 300);
widget->Init(params);
InitWidget(widget, transparent);
}
void WidgetExample::ButtonPressed(Button* sender, const ui::Event& event) {
switch (sender->tag()) {
case POPUP:
CreatePopup(sender, false);
break;
case TRANSPARENT_POPUP:
CreatePopup(sender, true);
break;
#if defined(OS_LINUX)
case CHILD:
CreateChild(sender, false);
break;
case TRANSPARENT_CHILD:
CreateChild(sender, true);
break;
#endif
case CLOSE_WIDGET:
sender->GetWidget()->Close();
break;
}
}
} // namespace examples
} // namespace views