// 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, Shell* shell, 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, shell, view);
  params.delegate = widget_delegate;
  params.bounds = gfx::Rect(0, 0, view->bounds().width, view->bounds().height);
  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(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(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://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
