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

#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/services/view_manager/public/cpp/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
