1// Copyright (c) 2011 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 "chrome/browser/ui/webui/constrained_html_ui.h"
6
7#include "chrome/browser/profiles/profile.h"
8#include "chrome/browser/ui/gtk/constrained_window_gtk.h"
9#include "chrome/browser/ui/gtk/gtk_util.h"
10#include "chrome/browser/ui/views/tab_contents/tab_contents_container.h"
11#include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h"
12#include "chrome/browser/ui/webui/html_dialog_ui.h"
13#include "content/browser/tab_contents/tab_contents.h"
14#include "ui/gfx/rect.h"
15#include "views/widget/widget_gtk.h"
16
17// ConstrainedHtmlDelegateGtk works with ConstrainedWindowGtk to present
18// a TabContents in a ContraintedHtmlUI.
19class ConstrainedHtmlDelegateGtk : public views::WidgetGtk,
20                                   public ConstrainedHtmlUIDelegate,
21                                   public ConstrainedWindowDelegate,
22                                   public HtmlDialogTabContentsDelegate {
23 public:
24  ConstrainedHtmlDelegateGtk(Profile* profile,
25                             HtmlDialogUIDelegate* delegate);
26  ~ConstrainedHtmlDelegateGtk();
27
28  // ConstrainedHtmlUIDelegate interface.
29  virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate();
30  virtual void OnDialogClose();
31  virtual bool GetBackgroundColor(GdkColor* color) {
32    *color = gtk_util::kGdkWhite;
33    return true;
34  }
35
36  // ConstrainedWindowGtkDelegate implementation.
37  virtual GtkWidget* GetWidgetRoot() {
38    return GetNativeView();
39  }
40  virtual GtkWidget* GetFocusWidget() {
41    return html_tab_contents_.GetContentNativeView();
42  }
43  virtual void DeleteDelegate() {
44    html_delegate_->OnWindowClosed();
45    html_delegate_->OnDialogClosed("");
46    tab_container_->ChangeTabContents(NULL);
47  }
48  virtual bool ShouldHaveBorderPadding() const {
49    return false;
50  }
51
52  // HtmlDialogTabContentsDelegate interface.
53  void MoveContents(TabContents* source, const gfx::Rect& pos) {}
54  void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
55
56  void set_window(ConstrainedWindow* window) {
57    window_ = window;
58  }
59
60 private:
61  TabContents html_tab_contents_;
62  TabContentsContainer* tab_container_;
63
64  HtmlDialogUIDelegate* html_delegate_;
65
66  // The constrained window that owns |this|.  Saved so we can close it later.
67  ConstrainedWindow* window_;
68};
69
70ConstrainedHtmlDelegateGtk::ConstrainedHtmlDelegateGtk(
71    Profile* profile,
72    HtmlDialogUIDelegate* delegate)
73    : views::WidgetGtk(views::WidgetGtk::TYPE_CHILD),
74      HtmlDialogTabContentsDelegate(profile),
75      html_tab_contents_(profile, NULL, MSG_ROUTING_NONE, NULL, NULL),
76      tab_container_(NULL),
77      html_delegate_(delegate),
78      window_(NULL) {
79  CHECK(delegate);
80  html_tab_contents_.set_delegate(this);
81
82  // Set |this| as a property so the ConstrainedHtmlUI can retrieve it.
83  ConstrainedHtmlUI::GetPropertyAccessor().SetProperty(
84      html_tab_contents_.property_bag(), this);
85  html_tab_contents_.controller().LoadURL(delegate->GetDialogContentURL(),
86                                          GURL(),
87                                          PageTransition::START_PAGE);
88
89  Init(NULL, gfx::Rect());
90
91  tab_container_ = new TabContentsContainer;
92  SetContentsView(tab_container_);
93  tab_container_->ChangeTabContents(&html_tab_contents_);
94
95  gfx::Size dialog_size;
96  html_delegate_->GetDialogSize(&dialog_size);
97  gtk_widget_set_size_request(GetWidgetRoot(),
98                              dialog_size.width(),
99                              dialog_size.height());
100}
101
102ConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() {
103}
104
105HtmlDialogUIDelegate* ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() {
106  return html_delegate_;
107}
108
109void ConstrainedHtmlDelegateGtk::OnDialogClose() {
110  window_->CloseConstrainedWindow();
111}
112
113// static
114ConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog(
115    Profile* profile,
116    HtmlDialogUIDelegate* delegate,
117    TabContents* container) {
118  ConstrainedHtmlDelegateGtk* constrained_delegate =
119      new ConstrainedHtmlDelegateGtk(profile, delegate);
120  ConstrainedWindow* constrained_window =
121      container->CreateConstrainedDialog(constrained_delegate);
122  constrained_delegate->set_window(constrained_window);
123  return constrained_window;
124}
125