OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/views/browser_bubble.h" | 5 #include "chrome/browser/views/browser_bubble.h" |
6 | 6 |
7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "chrome/browser/views/frame/browser_view.h" |
8 #include "views/widget/root_view.h" | 9 #include "views/widget/root_view.h" |
9 | 10 |
10 BrowserBubble::BrowserBubble(views::View* view, views::Widget* frame, | 11 BrowserBubble::BrowserBubble(views::View* view, views::Widget* frame, |
11 const gfx::Point& origin) | 12 const gfx::Point& origin) |
12 : frame_(frame), | 13 : frame_(frame), |
13 view_(view), | 14 view_(view), |
14 visible_(false), | 15 visible_(false), |
15 delegate_(NULL) { | 16 delegate_(NULL), |
| 17 attached_(false) { |
| 18 frame_native_view_ = frame_->GetNativeView(); |
16 gfx::Size size = view->GetPreferredSize(); | 19 gfx::Size size = view->GetPreferredSize(); |
17 bounds_.SetRect(origin.x(), origin.y(), size.width(), size.height()); | 20 bounds_.SetRect(origin.x(), origin.y(), size.width(), size.height()); |
18 InitPopup(); | 21 InitPopup(); |
19 } | 22 } |
20 | 23 |
21 BrowserBubble::~BrowserBubble() { | 24 BrowserBubble::~BrowserBubble() { |
22 DestroyPopup(); | 25 DCHECK(!attached_); |
| 26 popup_->CloseNow(); |
| 27 // Don't call DetachFromBrowser from here. It needs to talk to the |
| 28 // BrowserView to deregister itself, and if BrowserBubble is owned |
| 29 // by a child of BrowserView, then it's possible that this stack frame |
| 30 // is a descendant of BrowserView's destructor, which leads to problems. |
| 31 // In that case, Detach doesn't need to get called anyway since BrowserView |
| 32 // will do the necessary cleanup. |
| 33 } |
| 34 |
| 35 void BrowserBubble::DetachFromBrowser() { |
| 36 DCHECK(attached_); |
| 37 if (!attached_) |
| 38 return; |
| 39 attached_ = false; |
| 40 BrowserView* browser_view = |
| 41 BrowserView::GetBrowserViewForNativeWindow(frame_native_view_); |
| 42 if (browser_view) |
| 43 browser_view->DetachBrowserBubble(this); |
| 44 } |
| 45 |
| 46 void BrowserBubble::AttachToBrowser() { |
| 47 DCHECK(!attached_); |
| 48 if (attached_) |
| 49 return; |
| 50 BrowserView* browser_view = |
| 51 BrowserView::GetBrowserViewForNativeWindow(frame_native_view_); |
| 52 DCHECK(browser_view); |
| 53 if (browser_view) { |
| 54 browser_view->AttachBrowserBubble(this); |
| 55 attached_ = true; |
| 56 } |
23 } | 57 } |
24 | 58 |
25 void BrowserBubble::BrowserWindowMoved() { | 59 void BrowserBubble::BrowserWindowMoved() { |
26 if (delegate_) | 60 if (delegate_) |
27 delegate_->BubbleBrowserWindowMoved(this); | 61 delegate_->BubbleBrowserWindowMoved(this); |
28 else | 62 else |
29 Hide(); | 63 Hide(); |
30 } | 64 } |
31 | 65 |
32 void BrowserBubble::BrowserWindowClosed() { | 66 void BrowserBubble::BrowserWindowClosed() { |
33 if (delegate_) | 67 if (delegate_) |
34 delegate_->BubbleBrowserWindowClosed(this); | 68 delegate_->BubbleBrowserWindowClosed(this); |
35 else | 69 else |
36 Hide(); | 70 Hide(); |
37 } | 71 } |
38 | 72 |
39 void BrowserBubble::SetBounds(int x, int y, int w, int h) { | 73 void BrowserBubble::SetBounds(int x, int y, int w, int h) { |
40 // If the UI layout is RTL, we need to mirror the position of the bubble | 74 // If the UI layout is RTL, we need to mirror the position of the bubble |
41 // relative to the parent. | 75 // relative to the parent. |
42 if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) { | 76 if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) { |
43 gfx::Rect frame_bounds; | 77 gfx::Rect frame_bounds; |
44 frame_->GetBounds(&frame_bounds, false); | 78 frame_->GetBounds(&frame_bounds, false); |
45 x = frame_bounds.width() - x - w; | 79 x = frame_bounds.width() - x - w; |
46 } | 80 } |
47 bounds_.SetRect(x, y, w, h); | 81 bounds_.SetRect(x, y, w, h); |
48 Reposition(); | 82 Reposition(); |
49 } | 83 } |
50 | 84 |
| 85 void BrowserBubble::MoveTo(int x, int y) { |
| 86 SetBounds(x, y, bounds_.width(), bounds_.height()); |
| 87 } |
| 88 |
51 void BrowserBubble::Reposition() { | 89 void BrowserBubble::Reposition() { |
52 gfx::Point top_left; | 90 gfx::Point top_left; |
53 views::View::ConvertPointToScreen(frame_->GetRootView(), &top_left); | 91 views::View::ConvertPointToScreen(frame_->GetRootView(), &top_left); |
54 MovePopup(top_left.x() + bounds_.x(), | 92 MovePopup(top_left.x() + bounds_.x(), |
55 top_left.y() + bounds_.y(), | 93 top_left.y() + bounds_.y(), |
56 bounds_.width(), | 94 bounds_.width(), |
57 bounds_.height()); | 95 bounds_.height()); |
58 } | 96 } |
| 97 |
| 98 void BrowserBubble::ResizeToView() { |
| 99 gfx::Size size = view_->GetPreferredSize(); |
| 100 SetBounds(bounds_.x(), bounds_.y(), size.width(), size.height()); |
| 101 } |
| 102 |
OLD | NEW |