OLD | NEW |
| (Empty) |
1 // Copyright 2012 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_web_dialog_delegate_base.h" | |
6 | |
7 #include <gdk/gdk.h> | |
8 #include <gtk/gtk.h> | |
9 | |
10 #include "chrome/browser/ui/gtk/constrained_window_gtk.h" | |
11 #include "components/web_modal/web_contents_modal_dialog_manager.h" | |
12 #include "content/public/browser/notification_source.h" | |
13 #include "content/public/browser/render_view_host.h" | |
14 #include "content/public/browser/web_contents.h" | |
15 #include "content/public/browser/web_contents_view.h" | |
16 #include "ui/base/gtk/gtk_hig_constants.h" | |
17 #include "ui/base/gtk/gtk_signal.h" | |
18 #include "ui/gfx/size.h" | |
19 #include "ui/web_dialogs/web_dialog_delegate.h" | |
20 #include "ui/web_dialogs/web_dialog_ui.h" | |
21 | |
22 using content::WebContents; | |
23 using ui::WebDialogDelegate; | |
24 using ui::WebDialogWebContentsDelegate; | |
25 using web_modal::WebContentsModalDialogManager; | |
26 | |
27 namespace { | |
28 | |
29 class ConstrainedWebDialogDelegateGtk | |
30 : public ConstrainedWebDialogDelegateBase { | |
31 public: | |
32 ConstrainedWebDialogDelegateGtk( | |
33 content::BrowserContext* browser_context, | |
34 WebDialogDelegate* delegate, | |
35 WebDialogWebContentsDelegate* tab_delegate) | |
36 : ConstrainedWebDialogDelegateBase( | |
37 browser_context, delegate, tab_delegate), | |
38 window_(NULL) {} | |
39 | |
40 // WebDialogWebContentsDelegate interface. | |
41 virtual void CloseContents(WebContents* source) OVERRIDE { | |
42 gtk_widget_destroy(window_); | |
43 } | |
44 | |
45 void set_window(GtkWidget* window) { window_ = window; } | |
46 GtkWidget* window() const { return window_; } | |
47 | |
48 private: | |
49 GtkWidget* window_; | |
50 | |
51 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateGtk); | |
52 }; | |
53 | |
54 void SetBackgroundColor(GtkWidget* widget, const GdkColor &color) { | |
55 gtk_widget_modify_base(widget, GTK_STATE_NORMAL, &color); | |
56 gtk_widget_modify_fg(widget, GTK_STATE_NORMAL, &color); | |
57 gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color); | |
58 } | |
59 | |
60 } // namespace | |
61 | |
62 class ConstrainedWebDialogDelegateViewGtk | |
63 : public ConstrainedWebDialogDelegate { | |
64 public: | |
65 ConstrainedWebDialogDelegateViewGtk( | |
66 content::BrowserContext* browser_context, | |
67 WebDialogDelegate* delegate, | |
68 WebDialogWebContentsDelegate* tab_delegate); | |
69 | |
70 virtual ~ConstrainedWebDialogDelegateViewGtk() {} | |
71 | |
72 // ConstrainedWebDialogDelegate interface | |
73 virtual const WebDialogDelegate* | |
74 GetWebDialogDelegate() const OVERRIDE { | |
75 return impl_->GetWebDialogDelegate(); | |
76 } | |
77 virtual WebDialogDelegate* GetWebDialogDelegate() OVERRIDE { | |
78 return impl_->GetWebDialogDelegate(); | |
79 } | |
80 virtual void OnDialogCloseFromWebUI() OVERRIDE { | |
81 return impl_->OnDialogCloseFromWebUI(); | |
82 } | |
83 virtual void ReleaseWebContentsOnDialogClose() OVERRIDE { | |
84 return impl_->ReleaseWebContentsOnDialogClose(); | |
85 } | |
86 virtual web_modal::NativeWebContentsModalDialog GetNativeDialog() OVERRIDE { | |
87 return impl_->window(); | |
88 } | |
89 virtual WebContents* GetWebContents() OVERRIDE { | |
90 return impl_->GetWebContents(); | |
91 } | |
92 | |
93 void SetWindow(GtkWidget* window) { | |
94 impl_->set_window(window); | |
95 } | |
96 | |
97 GtkWidget* GetWindow() { | |
98 return impl_->window(); | |
99 } | |
100 | |
101 private: | |
102 CHROMEGTK_CALLBACK_0(ConstrainedWebDialogDelegateViewGtk, void, OnDestroy); | |
103 | |
104 scoped_ptr<ConstrainedWebDialogDelegateGtk> impl_; | |
105 | |
106 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewGtk); | |
107 }; | |
108 | |
109 ConstrainedWebDialogDelegateViewGtk::ConstrainedWebDialogDelegateViewGtk( | |
110 content::BrowserContext* browser_context, | |
111 WebDialogDelegate* delegate, | |
112 WebDialogWebContentsDelegate* tab_delegate) | |
113 : impl_(new ConstrainedWebDialogDelegateGtk( | |
114 browser_context, | |
115 delegate, | |
116 tab_delegate)) { | |
117 gfx::Size dialog_size; | |
118 delegate->GetDialogSize(&dialog_size); | |
119 GtkWidget* contents = | |
120 GTK_WIDGET(GetWebContents()->GetView()->GetNativeView()); | |
121 gtk_widget_set_size_request(contents, | |
122 dialog_size.width(), | |
123 dialog_size.height()); | |
124 | |
125 gtk_widget_show_all(contents); | |
126 | |
127 g_signal_connect(contents, "destroy", G_CALLBACK(OnDestroyThunk), this); | |
128 } | |
129 | |
130 void ConstrainedWebDialogDelegateViewGtk::OnDestroy(GtkWidget* widget) { | |
131 if (!impl_->closed_via_webui()) | |
132 GetWebDialogDelegate()->OnDialogClosed(std::string()); | |
133 delete this; | |
134 } | |
135 | |
136 ConstrainedWebDialogDelegate* CreateConstrainedWebDialog( | |
137 content::BrowserContext* browser_context, | |
138 WebDialogDelegate* delegate, | |
139 WebDialogWebContentsDelegate* tab_delegate, | |
140 content::WebContents* web_contents) { | |
141 ConstrainedWebDialogDelegateViewGtk* constrained_delegate = | |
142 new ConstrainedWebDialogDelegateViewGtk( | |
143 browser_context, delegate, tab_delegate); | |
144 GtkWidget* window = | |
145 CreateWebContentsModalDialogGtk( | |
146 constrained_delegate->GetWebContents()->GetView()->GetNativeView(), | |
147 constrained_delegate->GetWebContents()->GetView()-> | |
148 GetContentNativeView()); | |
149 SetBackgroundColor(window, ui::kGdkWhite); | |
150 constrained_delegate->SetWindow(window); | |
151 | |
152 WebContentsModalDialogManager* web_contents_modal_dialog_manager = | |
153 WebContentsModalDialogManager::FromWebContents(web_contents); | |
154 web_contents_modal_dialog_manager->ShowDialog(window); | |
155 | |
156 return constrained_delegate; | |
157 } | |
OLD | NEW |