1// Copyright 2014 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 "mojo/examples/window_manager/debug_panel.h" 6 7#include "base/strings/stringprintf.h" 8#include "base/strings/utf_string_conversions.h" 9#include "mojo/services/public/cpp/view_manager/view.h" 10#include "mojo/views/native_widget_view_manager.h" 11#include "ui/gfx/text_constants.h" 12#include "ui/views/background.h" 13#include "ui/views/controls/button/blue_button.h" 14#include "ui/views/controls/button/radio_button.h" 15#include "ui/views/widget/widget.h" 16 17namespace mojo { 18namespace examples { 19 20namespace { 21 22const int kControlBorderInset = 5; 23const int kNavigationTargetGroupId = 1; 24 25} // namespace 26 27DebugPanel::DebugPanel(Delegate* delegate, View* view) 28 : delegate_(delegate), 29 view_(view), 30 navigation_target_label_(new views::Label( 31 base::ASCIIToUTF16("Navigation target:"))), 32 navigation_target_new_(new views::RadioButton( 33 base::ASCIIToUTF16("New window"), kNavigationTargetGroupId)), 34 navigation_target_source_(new views::RadioButton( 35 base::ASCIIToUTF16("Source window"), kNavigationTargetGroupId)), 36 navigation_target_default_(new views::RadioButton( 37 base::ASCIIToUTF16("Default"), kNavigationTargetGroupId)), 38 colored_square_(new views::BlueButton( 39 this, base::ASCIIToUTF16("Local nav test"))), 40 close_last_(new views::BlueButton( 41 this, base::ASCIIToUTF16("Close last window"))), 42 cross_app_(new views::BlueButton( 43 this, base::ASCIIToUTF16("Cross-app nav test"))) { 44 navigation_target_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 45 navigation_target_default_->SetChecked(true); 46 47 views::WidgetDelegateView* widget_delegate = new views::WidgetDelegateView(); 48 widget_delegate->GetContentsView()->set_background( 49 views::Background::CreateSolidBackground(0xFFDDDDDD)); 50 widget_delegate->GetContentsView()->AddChildView(navigation_target_label_); 51 widget_delegate->GetContentsView()->AddChildView(navigation_target_default_); 52 widget_delegate->GetContentsView()->AddChildView(navigation_target_new_); 53 widget_delegate->GetContentsView()->AddChildView(navigation_target_source_); 54 widget_delegate->GetContentsView()->AddChildView(colored_square_); 55 widget_delegate->GetContentsView()->AddChildView(close_last_); 56 widget_delegate->GetContentsView()->AddChildView(cross_app_); 57 widget_delegate->GetContentsView()->SetLayoutManager(this); 58 59 views::Widget* widget = new views::Widget(); 60 views::Widget::InitParams params( 61 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 62 params.native_widget = new NativeWidgetViewManager(widget, view); 63 params.delegate = widget_delegate; 64 params.bounds = gfx::Rect(view->bounds().size()); 65 widget->Init(params); 66 widget->Show(); 67} 68 69DebugPanel::~DebugPanel() { 70} 71 72gfx::Size DebugPanel::GetPreferredSize(const views::View* view) const { 73 return gfx::Size(); 74} 75 76Target DebugPanel::navigation_target() const { 77 if (navigation_target_new_->checked()) 78 return TARGET_NEW_NODE; 79 if (navigation_target_source_->checked()) 80 return TARGET_SOURCE_NODE; 81 return TARGET_DEFAULT; 82} 83 84void DebugPanel::Layout(views::View* view) { 85 int y = kControlBorderInset; 86 int w = view->width() - kControlBorderInset * 2; 87 88 navigation_target_label_->SetBounds( 89 kControlBorderInset, y, w, 90 navigation_target_label_->GetPreferredSize().height()); 91 y += navigation_target_label_->height(); 92 93 views::RadioButton* radios[] = { 94 navigation_target_default_, 95 navigation_target_new_, 96 navigation_target_source_, 97 }; 98 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(radios); ++i) { 99 radios[i]->SetBounds(kControlBorderInset, y, w, 100 radios[i]->GetPreferredSize().height()); 101 y += radios[i]->height(); 102 } 103 104 y += kControlBorderInset; 105 views::Button* buttons[] = { 106 colored_square_, 107 close_last_, 108 cross_app_, 109 }; 110 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(buttons); ++i) { 111 buttons[i]->SetBounds(kControlBorderInset, y, w, 112 buttons[i]->GetPreferredSize().height()); 113 y += buttons[i]->height(); 114 } 115} 116 117void DebugPanel::ButtonPressed(views::Button* sender, const ui::Event& event) { 118 if (sender == colored_square_) { 119 Navigate("mojo://mojo_embedded_app/"); 120 } else if (sender == close_last_) { 121 delegate_->CloseTopWindow(); 122 } else if (sender == cross_app_) { 123 Navigate("http://www.aaronboodman.com/z_dropbox/test.html"); 124 } 125} 126 127void DebugPanel::Navigate(const std::string& url) { 128 URLRequestPtr request(URLRequest::New()); 129 request->url = url; 130 delegate_->RequestNavigate(view_->id(), TARGET_NEW_NODE, request.Pass()); 131} 132 133} // namespace examples 134} // namespace mojo 135