Remove the ConstrainedWindowViews class
[chromium-blink-merge.git] / chrome / browser / ui / views / constrained_web_dialog_delegate_views.cc
blobcdbca59171acb9195e7251fad983bce790ba14ad
1 // Copyright (c) 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.
5 #include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h"
7 #include "base/utf_string_conversions.h"
8 #include "chrome/browser/ui/views/constrained_window_views.h"
9 #include "chrome/browser/ui/views/unhandled_keyboard_event_handler.h"
10 #include "chrome/browser/ui/web_contents_modal_dialog_manager.h"
11 #include "content/public/browser/native_web_keyboard_event.h"
12 #include "content/public/browser/web_contents.h"
13 #include "content/public/browser/web_contents_view.h"
14 #include "ui/gfx/size.h"
15 #include "ui/views/controls/webview/webview.h"
16 #include "ui/views/view.h"
17 #include "ui/views/widget/widget.h"
18 #include "ui/views/widget/widget_delegate.h"
19 #include "ui/web_dialogs/web_dialog_delegate.h"
20 #include "ui/web_dialogs/web_dialog_ui.h"
22 using content::WebContents;
23 using ui::WebDialogDelegate;
24 using ui::WebDialogWebContentsDelegate;
26 namespace {
28 class ConstrainedWebDialogDelegateViews
29 : public ConstrainedWebDialogDelegateBase {
30 public:
31 ConstrainedWebDialogDelegateViews(
32 content::BrowserContext* browser_context,
33 WebDialogDelegate* delegate,
34 WebDialogWebContentsDelegate* tab_delegate,
35 views::WebView* view)
36 : ConstrainedWebDialogDelegateBase(
37 browser_context, delegate, tab_delegate),
38 view_(view) {}
40 virtual ~ConstrainedWebDialogDelegateViews() {}
42 // WebDialogWebContentsDelegate interface.
43 virtual void CloseContents(WebContents* source) OVERRIDE {
44 window_->Close();
47 // contents::WebContentsDelegate
48 virtual void HandleKeyboardEvent(
49 content::WebContents* source,
50 const content::NativeWebKeyboardEvent& event) OVERRIDE {
51 unhandled_keyboard_event_handler_.HandleKeyboardEvent(
52 event, view_->GetFocusManager());
55 // ConstrainedWebDialogDelegate
56 virtual NativeWebContentsModalDialog GetNativeDialog() OVERRIDE {
57 return window_->GetNativeView();
60 void set_window(views::Widget* window) { window_ = window; }
61 views::Widget* window() const { return window_; }
63 private:
64 // Converts keyboard events on the WebContents to accelerators.
65 UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
67 views::WebView* view_;
68 views::Widget* window_;
70 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViews);
73 } // namespace
75 class ConstrainedWebDialogDelegateViewViews
76 : public views::WebView,
77 public ConstrainedWebDialogDelegate,
78 public views::WidgetDelegate {
79 public:
80 ConstrainedWebDialogDelegateViewViews(
81 content::BrowserContext* browser_context,
82 WebDialogDelegate* delegate,
83 WebDialogWebContentsDelegate* tab_delegate);
84 virtual ~ConstrainedWebDialogDelegateViewViews();
86 // ConstrainedWebDialogDelegate interface
87 virtual const WebDialogDelegate*
88 GetWebDialogDelegate() const OVERRIDE {
89 return impl_->GetWebDialogDelegate();
91 virtual WebDialogDelegate* GetWebDialogDelegate() OVERRIDE {
92 return impl_->GetWebDialogDelegate();
94 virtual void OnDialogCloseFromWebUI() OVERRIDE {
95 return impl_->OnDialogCloseFromWebUI();
97 virtual void ReleaseWebContentsOnDialogClose() OVERRIDE {
98 return impl_->ReleaseWebContentsOnDialogClose();
100 virtual NativeWebContentsModalDialog GetNativeDialog() OVERRIDE {
101 return impl_->window()->GetNativeView();
103 virtual WebContents* GetWebContents() OVERRIDE {
104 return impl_->GetWebContents();
107 // views::WidgetDelegate interface.
108 virtual views::View* GetInitiallyFocusedView() OVERRIDE {
109 return this;
111 virtual bool CanResize() const OVERRIDE { return true; }
112 virtual void WindowClosing() OVERRIDE {
113 if (!impl_->closed_via_webui())
114 GetWebDialogDelegate()->OnDialogClosed(std::string());
116 virtual views::Widget* GetWidget() OVERRIDE {
117 return View::GetWidget();
119 virtual const views::Widget* GetWidget() const OVERRIDE {
120 return View::GetWidget();
122 virtual string16 GetWindowTitle() const OVERRIDE {
123 return impl_->closed_via_webui() ? string16() :
124 GetWebDialogDelegate()->GetDialogTitle();
126 virtual views::View* GetContentsView() OVERRIDE {
127 return this;
129 // TODO(wittman): Remove this override once we move to the new style frame
130 // view on all dialogs.
131 virtual views::NonClientFrameView* CreateNonClientFrameView(
132 views::Widget* widget) OVERRIDE {
133 return CreateConstrainedStyleNonClientFrameView(
134 widget,
135 GetWebContents()->GetBrowserContext());
138 virtual ui::ModalType GetModalType() const OVERRIDE {
139 #if defined(USE_ASH)
140 return ui::MODAL_TYPE_CHILD;
141 #else
142 return views::WidgetDelegate::GetModalType();
143 #endif
146 virtual void OnWidgetMove() OVERRIDE {
147 // We need to check the existence of the widget because when running on
148 // WinXP this could get executed before the widget is entirely created.
149 if (!GetWidget())
150 return;
152 GetWidget()->CenterWindow(
153 GetWidget()->non_client_view()->GetPreferredSize());
154 views::WidgetDelegate::OnWidgetMove();
157 // views::WebView overrides.
158 virtual bool AcceleratorPressed(
159 const ui::Accelerator& accelerator) OVERRIDE {
160 // Pressing ESC closes the dialog.
161 DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.key_code());
162 impl_->window()->Close();
163 return true;
165 virtual gfx::Size GetPreferredSize() OVERRIDE {
166 gfx::Size size;
167 if (!impl_->closed_via_webui())
168 GetWebDialogDelegate()->GetDialogSize(&size);
169 return size;
171 virtual gfx::Size GetMinimumSize() OVERRIDE {
172 // Return an empty size so that we can be made smaller.
173 return gfx::Size();
176 void SetWindow(views::Widget* window) {
177 impl_->set_window(window);
180 views::Widget* GetWindow() {
181 return impl_->window();
184 scoped_ptr<ConstrainedWebDialogDelegateViews> impl_;
186 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews);
189 ConstrainedWebDialogDelegateViewViews::ConstrainedWebDialogDelegateViewViews(
190 content::BrowserContext* browser_context,
191 WebDialogDelegate* delegate,
192 WebDialogWebContentsDelegate* tab_delegate)
193 : views::WebView(browser_context),
194 impl_(new ConstrainedWebDialogDelegateViews(browser_context,
195 delegate,
196 tab_delegate,
197 this)) {
198 SetWebContents(GetWebContents());
200 // Pressing ESC closes the dialog.
201 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
204 ConstrainedWebDialogDelegateViewViews::~ConstrainedWebDialogDelegateViewViews() {
207 ConstrainedWebDialogDelegate* CreateConstrainedWebDialog(
208 content::BrowserContext* browser_context,
209 WebDialogDelegate* delegate,
210 WebDialogWebContentsDelegate* tab_delegate,
211 content::WebContents* web_contents) {
212 ConstrainedWebDialogDelegateViewViews* constrained_delegate =
213 new ConstrainedWebDialogDelegateViewViews(
214 browser_context, delegate, tab_delegate);
215 views::Widget* window =
216 CreateWebContentsModalDialogViews(
217 constrained_delegate,
218 web_contents->GetView()->GetNativeView());
219 WebContentsModalDialogManager* web_contents_modal_dialog_manager =
220 WebContentsModalDialogManager::FromWebContents(web_contents);
221 web_contents_modal_dialog_manager->ShowDialog(window->GetNativeView());
222 constrained_delegate->SetWindow(window);
223 return constrained_delegate;