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.
19 class 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();
GetBackgroundColor(GdkColor * color)31 virtual bool GetBackgroundColor(GdkColor* color) {
32 *color = gtk_util::kGdkWhite;
33 return true;
34 }
35
36 // ConstrainedWindowGtkDelegate implementation.
GetWidgetRoot()37 virtual GtkWidget* GetWidgetRoot() {
38 return GetNativeView();
39 }
GetFocusWidget()40 virtual GtkWidget* GetFocusWidget() {
41 return html_tab_contents_.GetContentNativeView();
42 }
DeleteDelegate()43 virtual void DeleteDelegate() {
44 html_delegate_->OnWindowClosed();
45 html_delegate_->OnDialogClosed("");
46 tab_container_->ChangeTabContents(NULL);
47 }
ShouldHaveBorderPadding() const48 virtual bool ShouldHaveBorderPadding() const {
49 return false;
50 }
51
52 // HtmlDialogTabContentsDelegate interface.
MoveContents(TabContents * source,const gfx::Rect & pos)53 void MoveContents(TabContents* source, const gfx::Rect& pos) {}
HandleKeyboardEvent(const NativeWebKeyboardEvent & event)54 void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
55
set_window(ConstrainedWindow * window)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
ConstrainedHtmlDelegateGtk(Profile * profile,HtmlDialogUIDelegate * delegate)70 ConstrainedHtmlDelegateGtk::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
~ConstrainedHtmlDelegateGtk()102 ConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() {
103 }
104
GetHtmlDialogUIDelegate()105 HtmlDialogUIDelegate* ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() {
106 return html_delegate_;
107 }
108
OnDialogClose()109 void ConstrainedHtmlDelegateGtk::OnDialogClose() {
110 window_->CloseConstrainedWindow();
111 }
112
113 // static
CreateConstrainedHtmlDialog(Profile * profile,HtmlDialogUIDelegate * delegate,TabContents * container)114 ConstrainedWindow* 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