OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/views/bubble/bubble.h" | 5 #include "chrome/browser/ui/views/bubble/bubble.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "chrome/browser/ui/views/bubble/border_contents.h" | 9 #include "chrome/browser/ui/views/bubble/border_contents.h" |
10 #include "content/common/notification_service.h" | 10 #include "content/common/notification_service.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 // Also fade in/out the bubble border window. | 114 // Also fade in/out the bubble border window. |
115 border_->SetOpacity(opacity); | 115 border_->SetOpacity(opacity); |
116 border_->border_contents()->SchedulePaint(); | 116 border_->border_contents()->SchedulePaint(); |
117 #else | 117 #else |
118 NOTIMPLEMENTED(); | 118 NOTIMPLEMENTED(); |
119 #endif | 119 #endif |
120 } | 120 } |
121 | 121 |
122 Bubble::Bubble() | 122 Bubble::Bubble() |
123 : | 123 : |
| 124 #if defined(OS_WIN) |
| 125 views::WidgetWin(new views::Widget), |
| 126 #elif defined(TOOLKIT_USES_GTK) |
| 127 views::WidgetGtk(new views::Widget), |
| 128 #endif |
124 #if defined(TOOLKIT_USES_GTK) | 129 #if defined(TOOLKIT_USES_GTK) |
125 border_contents_(NULL), | 130 border_contents_(NULL), |
126 #elif defined(OS_WIN) | 131 #elif defined(OS_WIN) |
127 border_(NULL), | 132 border_(NULL), |
128 #endif | 133 #endif |
129 delegate_(NULL), | 134 delegate_(NULL), |
130 show_status_(kOpen), | 135 show_status_(kOpen), |
131 fade_away_on_close_(false), | 136 fade_away_on_close_(false), |
132 #if defined(OS_LINUX) | 137 #if defined(TOOLKIT_USES_GTK) |
133 type_(views::Widget::InitParams::TYPE_WINDOW), | 138 type_(views::Widget::InitParams::TYPE_WINDOW), |
134 #endif | 139 #endif |
135 #if defined(OS_CHROMEOS) | 140 #if defined(OS_CHROMEOS) |
136 show_while_screen_is_locked_(false), | 141 show_while_screen_is_locked_(false), |
137 #endif | 142 #endif |
138 arrow_location_(BubbleBorder::NONE), | 143 arrow_location_(BubbleBorder::NONE), |
139 contents_(NULL) { | 144 contents_(NULL) { |
140 } | 145 } |
141 | 146 |
142 #if defined(OS_CHROMEOS) | 147 #if defined(OS_CHROMEOS) |
143 Bubble::Bubble(views::Widget::InitParams::Type type, | 148 Bubble::Bubble(views::Widget::InitParams::Type type, |
144 bool show_while_screen_is_locked) | 149 bool show_while_screen_is_locked) |
145 : border_contents_(NULL), | 150 : views::WidgetGtk(new views::Widget), |
| 151 border_contents_(NULL), |
146 delegate_(NULL), | 152 delegate_(NULL), |
147 show_status_(kOpen), | 153 show_status_(kOpen), |
148 fade_away_on_close_(false), | 154 fade_away_on_close_(false), |
149 type_(type), | 155 type_(type), |
150 show_while_screen_is_locked_(show_while_screen_is_locked), | 156 show_while_screen_is_locked_(show_while_screen_is_locked), |
151 arrow_location_(BubbleBorder::NONE), | 157 arrow_location_(BubbleBorder::NONE), |
152 contents_(NULL) { | 158 contents_(NULL) { |
153 } | 159 } |
154 #endif | 160 #endif |
155 | 161 |
156 Bubble::~Bubble() { | 162 Bubble::~Bubble() { |
157 } | 163 } |
158 | 164 |
159 void Bubble::InitBubble(views::Widget* parent, | 165 void Bubble::InitBubble(views::Widget* parent, |
160 const gfx::Rect& position_relative_to, | 166 const gfx::Rect& position_relative_to, |
161 BubbleBorder::ArrowLocation arrow_location, | 167 BubbleBorder::ArrowLocation arrow_location, |
162 views::View* contents, | 168 views::View* contents, |
163 BubbleDelegate* delegate) { | 169 BubbleDelegate* delegate) { |
164 delegate_ = delegate; | 170 delegate_ = delegate; |
165 position_relative_to_ = position_relative_to; | 171 position_relative_to_ = position_relative_to; |
166 arrow_location_ = arrow_location; | 172 arrow_location_ = arrow_location; |
167 contents_ = contents; | 173 contents_ = contents; |
168 | 174 |
169 // Create the main window. | 175 // Create the main window. |
170 #if defined(OS_WIN) | 176 #if defined(OS_WIN) |
171 views::Window* parent_window = parent->GetWindow(); | 177 views::Window* parent_window = parent->GetContainingWindow(); |
172 if (parent_window) | 178 if (parent_window) |
173 parent_window->DisableInactiveRendering(); | 179 parent_window->DisableInactiveRendering(); |
174 set_window_style(WS_POPUP | WS_CLIPCHILDREN); | 180 set_window_style(WS_POPUP | WS_CLIPCHILDREN); |
175 int extended_style = WS_EX_TOOLWINDOW; | 181 int extended_style = WS_EX_TOOLWINDOW; |
176 // During FadeIn we need to turn on the layered window style to deal with | 182 // During FadeIn we need to turn on the layered window style to deal with |
177 // transparency. This flag needs to be reset after fading in is complete. | 183 // transparency. This flag needs to be reset after fading in is complete. |
178 bool fade_in = delegate_ && delegate_->FadeInOnShow(); | 184 bool fade_in = delegate_ && delegate_->FadeInOnShow(); |
179 if (fade_in) | 185 if (fade_in) |
180 extended_style |= WS_EX_LAYERED; | 186 extended_style |= WS_EX_LAYERED; |
181 set_window_ex_style(extended_style); | 187 set_window_ex_style(extended_style); |
182 | 188 |
183 DCHECK(!border_); | 189 DCHECK(!border_); |
184 border_ = new BorderWidgetWin(); | 190 border_ = new BorderWidgetWin(); |
185 | 191 |
186 if (fade_in) { | 192 if (fade_in) { |
187 border_->SetOpacity(0); | 193 border_->SetOpacity(0); |
188 SetOpacity(0); | 194 GetWidget()->SetOpacity(0); |
189 } | 195 } |
190 | 196 |
191 border_->InitBorderWidgetWin(CreateBorderContents(), parent->GetNativeView()); | 197 border_->InitBorderWidgetWin(CreateBorderContents(), parent->GetNativeView()); |
192 border_->border_contents()->SetBackgroundColor(kBackgroundColor); | 198 border_->border_contents()->SetBackgroundColor(kBackgroundColor); |
193 | 199 |
194 // We make the BorderWidgetWin the owner of the Bubble HWND, so that the | 200 // We make the BorderWidgetWin the owner of the Bubble HWND, so that the |
195 // latter is displayed on top of the former. | 201 // latter is displayed on top of the former. |
196 views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); | 202 views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); |
197 params.parent = border_->GetNativeView(); | 203 params.parent = border_->GetNativeView(); |
| 204 params.native_widget = this; |
198 GetWidget()->Init(params); | 205 GetWidget()->Init(params); |
199 | 206 |
200 SetWindowText(GetNativeView(), delegate_->accessible_name().c_str()); | 207 SetWindowText(GetNativeView(), delegate_->accessible_name().c_str()); |
201 #elif defined(TOOLKIT_USES_GTK) | 208 #elif defined(TOOLKIT_USES_GTK) |
202 views::Widget::InitParams params(type_); | 209 views::Widget::InitParams params(type_); |
203 params.transparent = true; | 210 params.transparent = true; |
204 params.parent_widget = parent; | 211 params.parent_widget = parent; |
205 // TODO(beng): Figure out how to make this implicit or set via InitParams. | 212 params.native_widget = this; |
206 make_transient_to_parent(); | |
207 GetWidget()->Init(params); | 213 GetWidget()->Init(params); |
208 #if defined(OS_CHROMEOS) | 214 #if defined(OS_CHROMEOS) |
209 { | 215 { |
210 vector<int> params; | 216 vector<int> params; |
211 params.push_back(show_while_screen_is_locked_ ? 1 : 0); | 217 params.push_back(show_while_screen_is_locked_ ? 1 : 0); |
212 chromeos::WmIpc::instance()->SetWindowType( | 218 chromeos::WmIpc::instance()->SetWindowType( |
213 GetNativeView(), | 219 GetNativeView(), |
214 chromeos::WM_IPC_WINDOW_CHROME_INFO_BUBBLE, | 220 chromeos::WM_IPC_WINDOW_CHROME_INFO_BUBBLE, |
215 ¶ms); | 221 ¶ms); |
216 } | 222 } |
217 #endif | 223 #endif |
218 #endif | 224 #endif |
219 | 225 |
220 // Create a View to hold the contents of the main window. | 226 // Create a View to hold the contents of the main window. |
221 views::View* contents_view = new views::View; | 227 views::View* contents_view = new views::View; |
222 // We add |contents_view| to ourselves before the AddChildView() call below so | 228 // We add |contents_view| to ourselves before the AddChildView() call below so |
223 // that when |contents| gets added, it will already have a widget, and thus | 229 // that when |contents| gets added, it will already have a widget, and thus |
224 // any NativeButtons it creates in ViewHierarchyChanged() will be functional | 230 // any NativeButtons it creates in ViewHierarchyChanged() will be functional |
225 // (e.g. calling SetChecked() on checkboxes is safe). | 231 // (e.g. calling SetChecked() on checkboxes is safe). |
226 SetContentsView(contents_view); | 232 GetWidget()->SetContentsView(contents_view); |
227 // Adding |contents| as a child has to be done before we call | 233 // Adding |contents| as a child has to be done before we call |
228 // contents->GetPreferredSize() below, since some supplied views don't | 234 // contents->GetPreferredSize() below, since some supplied views don't |
229 // actually initialize themselves until they're added to a hierarchy. | 235 // actually initialize themselves until they're added to a hierarchy. |
230 contents_view->AddChildView(contents); | 236 contents_view->AddChildView(contents); |
231 | 237 |
232 // Calculate and set the bounds for all windows and views. | 238 // Calculate and set the bounds for all windows and views. |
233 gfx::Rect window_bounds; | 239 gfx::Rect window_bounds; |
234 | 240 |
235 #if defined(OS_WIN) | 241 #if defined(OS_WIN) |
236 // Initialize and position the border window. | 242 // Initialize and position the border window. |
(...skipping 18 matching lines...) Expand all Loading... |
255 &contents_bounds, &window_bounds); | 261 &contents_bounds, &window_bounds); |
256 // This new view must be added before |contents| so it will paint under it. | 262 // This new view must be added before |contents| so it will paint under it. |
257 contents_view->AddChildViewAt(border_contents_, 0); | 263 contents_view->AddChildViewAt(border_contents_, 0); |
258 | 264 |
259 // |contents_view| has no layout manager, so we have to explicitly position | 265 // |contents_view| has no layout manager, so we have to explicitly position |
260 // its children. | 266 // its children. |
261 border_contents_->SetBoundsRect( | 267 border_contents_->SetBoundsRect( |
262 gfx::Rect(gfx::Point(), window_bounds.size())); | 268 gfx::Rect(gfx::Point(), window_bounds.size())); |
263 contents->SetBoundsRect(contents_bounds); | 269 contents->SetBoundsRect(contents_bounds); |
264 #endif | 270 #endif |
265 SetBounds(window_bounds); | 271 GetWidget()->SetBounds(window_bounds); |
266 | 272 |
267 // Register the Escape accelerator for closing. | 273 // Register the Escape accelerator for closing. |
268 GetFocusManager()->RegisterAccelerator( | 274 GetWidget()->GetFocusManager()->RegisterAccelerator( |
269 views::Accelerator(ui::VKEY_ESCAPE, false, false, false), this); | 275 views::Accelerator(ui::VKEY_ESCAPE, false, false, false), this); |
270 | 276 |
271 // Done creating the bubble. | 277 // Done creating the bubble. |
272 NotificationService::current()->Notify(NotificationType::INFO_BUBBLE_CREATED, | 278 NotificationService::current()->Notify(NotificationType::INFO_BUBBLE_CREATED, |
273 Source<Bubble>(this), | 279 Source<Bubble>(this), |
274 NotificationService::NoDetails()); | 280 NotificationService::NoDetails()); |
275 | 281 |
276 // Show the window. | 282 // Show the window. |
277 #if defined(OS_WIN) | 283 #if defined(OS_WIN) |
278 border_->ShowWindow(SW_SHOW); | 284 border_->ShowWindow(SW_SHOW); |
279 ShowWindow(SW_SHOW); | 285 ShowWindow(SW_SHOW); |
280 if (fade_in) | 286 if (fade_in) |
281 FadeIn(); | 287 FadeIn(); |
282 #elif defined(TOOLKIT_USES_GTK) | 288 #elif defined(TOOLKIT_USES_GTK) |
283 views::WidgetGtk::Show(); | 289 GetWidget()->Show(); |
284 #endif | 290 #endif |
285 } | 291 } |
286 | 292 |
287 BorderContents* Bubble::CreateBorderContents() { | 293 BorderContents* Bubble::CreateBorderContents() { |
288 return new BorderContents(); | 294 return new BorderContents(); |
289 } | 295 } |
290 | 296 |
291 void Bubble::SizeToContents() { | 297 void Bubble::SizeToContents() { |
292 gfx::Rect window_bounds; | 298 gfx::Rect window_bounds; |
293 | 299 |
294 #if defined(OS_WIN) | 300 #if defined(OS_WIN) |
295 // Initialize and position the border window. | 301 // Initialize and position the border window. |
296 window_bounds = border_->SizeAndGetBounds(position_relative_to_, | 302 window_bounds = border_->SizeAndGetBounds(position_relative_to_, |
297 arrow_location_, | 303 arrow_location_, |
298 contents_->GetPreferredSize()); | 304 contents_->GetPreferredSize()); |
299 #else | 305 #else |
300 gfx::Rect contents_bounds; | 306 gfx::Rect contents_bounds; |
301 border_contents_->SizeAndGetBounds(position_relative_to_, | 307 border_contents_->SizeAndGetBounds(position_relative_to_, |
302 arrow_location_, false, contents_->GetPreferredSize(), | 308 arrow_location_, false, contents_->GetPreferredSize(), |
303 &contents_bounds, &window_bounds); | 309 &contents_bounds, &window_bounds); |
304 // |contents_view| has no layout manager, so we have to explicitly position | 310 // |contents_view| has no layout manager, so we have to explicitly position |
305 // its children. | 311 // its children. |
306 border_contents_->SetBoundsRect( | 312 border_contents_->SetBoundsRect( |
307 gfx::Rect(gfx::Point(), window_bounds.size())); | 313 gfx::Rect(gfx::Point(), window_bounds.size())); |
308 contents_->SetBoundsRect(contents_bounds); | 314 contents_->SetBoundsRect(contents_bounds); |
309 #endif | 315 #endif |
310 SetBounds(window_bounds); | 316 GetWidget()->SetBounds(window_bounds); |
311 } | 317 } |
312 | 318 |
313 #if defined(OS_WIN) | 319 #if defined(OS_WIN) |
314 void Bubble::OnActivate(UINT action, BOOL minimized, HWND window) { | 320 void Bubble::OnActivate(UINT action, BOOL minimized, HWND window) { |
315 // The popup should close when it is deactivated. | 321 // The popup should close when it is deactivated. |
316 if (action == WA_INACTIVE) { | 322 if (action == WA_INACTIVE) { |
317 Close(); | 323 GetWidget()->Close(); |
318 } else if (action == WA_ACTIVE) { | 324 } else if (action == WA_ACTIVE) { |
319 DCHECK(GetRootView()->has_children()); | 325 DCHECK(GetWidget()->GetRootView()->has_children()); |
320 GetRootView()->GetChildViewAt(0)->RequestFocus(); | 326 GetWidget()->GetRootView()->GetChildViewAt(0)->RequestFocus(); |
321 } | 327 } |
322 } | 328 } |
323 #elif defined(TOOLKIT_USES_GTK) | 329 #elif defined(TOOLKIT_USES_GTK) |
324 void Bubble::IsActiveChanged() { | 330 void Bubble::IsActiveChanged() { |
325 if (!IsActive()) | 331 if (!GetWidget()->IsActive()) |
326 Close(); | 332 GetWidget()->Close(); |
327 } | 333 } |
328 #endif | 334 #endif |
329 | 335 |
330 void Bubble::DoClose(bool closed_by_escape) { | 336 void Bubble::DoClose(bool closed_by_escape) { |
331 if (show_status_ == kClosed) | 337 if (show_status_ == kClosed) |
332 return; | 338 return; |
333 | 339 |
334 GetFocusManager()->UnregisterAccelerator( | 340 GetWidget()->GetFocusManager()->UnregisterAccelerator( |
335 views::Accelerator(ui::VKEY_ESCAPE, false, false, false), this); | 341 views::Accelerator(ui::VKEY_ESCAPE, false, false, false), this); |
336 if (delegate_) | 342 if (delegate_) |
337 delegate_->BubbleClosing(this, closed_by_escape); | 343 delegate_->BubbleClosing(this, closed_by_escape); |
338 show_status_ = kClosed; | 344 show_status_ = kClosed; |
339 #if defined(OS_WIN) | 345 #if defined(OS_WIN) |
340 border_->Close(); | 346 border_->Close(); |
| 347 #endif |
| 348 #if defined(OS_WIN) |
341 WidgetWin::Close(); | 349 WidgetWin::Close(); |
342 #elif defined(TOOLKIT_USES_GTK) | 350 #elif defined(TOOLKIT_USES_GTK) |
343 WidgetGtk::Close(); | 351 WidgetGtk::Close(); |
344 #endif | 352 #endif |
345 } | 353 } |
346 | 354 |
347 void Bubble::FadeIn() { | 355 void Bubble::FadeIn() { |
348 Fade(true); // |fade_in|. | 356 Fade(true); // |fade_in|. |
349 } | 357 } |
350 | 358 |
(...skipping 23 matching lines...) Expand all Loading... |
374 animation_->Hide(); | 382 animation_->Hide(); |
375 } | 383 } |
376 | 384 |
377 bool Bubble::AcceleratorPressed(const views::Accelerator& accelerator) { | 385 bool Bubble::AcceleratorPressed(const views::Accelerator& accelerator) { |
378 if (!delegate_ || delegate_->CloseOnEscape()) { | 386 if (!delegate_ || delegate_->CloseOnEscape()) { |
379 DoClose(true); | 387 DoClose(true); |
380 return true; | 388 return true; |
381 } | 389 } |
382 return false; | 390 return false; |
383 } | 391 } |
OLD | NEW |