普通文本  |  135行  |  4.68 KB

// Copyright 2014 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 "mojo/examples/window_manager/debug_panel.h"

#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/services/public/cpp/view_manager/view.h"
#include "mojo/views/native_widget_view_manager.h"
#include "ui/gfx/text_constants.h"
#include "ui/views/background.h"
#include "ui/views/controls/button/blue_button.h"
#include "ui/views/controls/button/radio_button.h"
#include "ui/views/widget/widget.h"

namespace mojo {
namespace examples {

namespace {

const int kControlBorderInset = 5;
const int kNavigationTargetGroupId = 1;

}  // namespace

DebugPanel::DebugPanel(Delegate* delegate, View* view)
    : delegate_(delegate),
      view_(view),
      navigation_target_label_(new views::Label(
          base::ASCIIToUTF16("Navigation target:"))),
      navigation_target_new_(new views::RadioButton(
          base::ASCIIToUTF16("New window"), kNavigationTargetGroupId)),
      navigation_target_source_(new views::RadioButton(
          base::ASCIIToUTF16("Source window"), kNavigationTargetGroupId)),
      navigation_target_default_(new views::RadioButton(
          base::ASCIIToUTF16("Default"), kNavigationTargetGroupId)),
      colored_square_(new views::BlueButton(
          this, base::ASCIIToUTF16("Local nav test"))),
      close_last_(new views::BlueButton(
          this, base::ASCIIToUTF16("Close last window"))),
      cross_app_(new views::BlueButton(
          this, base::ASCIIToUTF16("Cross-app nav test"))) {
  navigation_target_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
  navigation_target_default_->SetChecked(true);

  views::WidgetDelegateView* widget_delegate = new views::WidgetDelegateView();
  widget_delegate->GetContentsView()->set_background(
      views::Background::CreateSolidBackground(0xFFDDDDDD));
  widget_delegate->GetContentsView()->AddChildView(navigation_target_label_);
  widget_delegate->GetContentsView()->AddChildView(navigation_target_default_);
  widget_delegate->GetContentsView()->AddChildView(navigation_target_new_);
  widget_delegate->GetContentsView()->AddChildView(navigation_target_source_);
  widget_delegate->GetContentsView()->AddChildView(colored_square_);
  widget_delegate->GetContentsView()->AddChildView(close_last_);
  widget_delegate->GetContentsView()->AddChildView(cross_app_);
  widget_delegate->GetContentsView()->SetLayoutManager(this);

  views::Widget* widget = new views::Widget();
  views::Widget::InitParams params(
      views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
  params.native_widget = new NativeWidgetViewManager(widget, view);
  params.delegate = widget_delegate;
  params.bounds = gfx::Rect(view->bounds().size());
  widget->Init(params);
  widget->Show();
}

DebugPanel::~DebugPanel() {
}

gfx::Size DebugPanel::GetPreferredSize(const views::View* view) const {
  return gfx::Size();
}

Target DebugPanel::navigation_target() const {
  if (navigation_target_new_->checked())
    return TARGET_NEW_NODE;
  if (navigation_target_source_->checked())
    return TARGET_SOURCE_NODE;
  return TARGET_DEFAULT;
}

void DebugPanel::Layout(views::View* view) {
  int y = kControlBorderInset;
  int w = view->width() - kControlBorderInset * 2;

  navigation_target_label_->SetBounds(
      kControlBorderInset, y, w,
      navigation_target_label_->GetPreferredSize().height());
  y += navigation_target_label_->height();

  views::RadioButton* radios[] = {
    navigation_target_default_,
    navigation_target_new_,
    navigation_target_source_,
  };
  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(radios); ++i) {
    radios[i]->SetBounds(kControlBorderInset, y, w,
                         radios[i]->GetPreferredSize().height());
    y += radios[i]->height();
  }

  y += kControlBorderInset;
  views::Button* buttons[] = {
    colored_square_,
    close_last_,
    cross_app_,
  };
  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(buttons); ++i) {
    buttons[i]->SetBounds(kControlBorderInset, y, w,
                          buttons[i]->GetPreferredSize().height());
    y += buttons[i]->height();
  }
}

void DebugPanel::ButtonPressed(views::Button* sender, const ui::Event& event) {
  if (sender == colored_square_) {
    Navigate("mojo://mojo_embedded_app/");
  } else if (sender == close_last_) {
    delegate_->CloseTopWindow();
  } else if (sender == cross_app_) {
    Navigate("http://www.aaronboodman.com/z_dropbox/test.html");
  }
}

void DebugPanel::Navigate(const std::string& url) {
  URLRequestPtr request(URLRequest::New());
  request->url = url;
  delegate_->RequestNavigate(view_->id(), TARGET_NEW_NODE, request.Pass());
}

}  // namespace examples
}  // namespace mojo