OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "ui/views/bubble/bubble_delegate.h" | 5 #include "ui/views/bubble/bubble_dialog_delegate.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 #include "ui/accessibility/ax_view_state.h" | 8 #include "ui/accessibility/ax_view_state.h" |
9 #include "ui/base/resource/resource_bundle.h" | 9 #include "ui/base/resource/resource_bundle.h" |
10 #include "ui/gfx/color_utils.h" | 10 #include "ui/gfx/color_utils.h" |
11 #include "ui/gfx/geometry/rect.h" | 11 #include "ui/gfx/geometry/rect.h" |
12 #include "ui/native_theme/native_theme.h" | 12 #include "ui/native_theme/native_theme.h" |
13 #include "ui/views/bubble/bubble_frame_view.h" | 13 #include "ui/views/bubble/bubble_frame_view.h" |
14 #include "ui/views/focus/view_storage.h" | 14 #include "ui/views/focus/view_storage.h" |
15 #include "ui/views/layout/layout_constants.h" | 15 #include "ui/views/layout/layout_constants.h" |
16 #include "ui/views/widget/widget.h" | 16 #include "ui/views/widget/widget.h" |
17 #include "ui/views/widget/widget_observer.h" | 17 #include "ui/views/widget/widget_observer.h" |
18 #include "ui/views/window/dialog_client_view.h" | |
18 | 19 |
19 #if defined(OS_WIN) | 20 #if defined(OS_WIN) |
20 #include "ui/base/win/shell.h" | 21 #include "ui/base/win/shell.h" |
21 #endif | 22 #endif |
22 | 23 |
23 namespace views { | 24 namespace views { |
24 | 25 |
25 namespace { | 26 namespace { |
26 | 27 |
27 // Create a widget to host the bubble. | 28 // Create a widget to host the bubble. |
28 Widget* CreateBubbleWidget(BubbleDelegateView* bubble) { | 29 Widget* CreateBubbleWidget(BubbleDialogDelegateView* bubble) { |
29 Widget* bubble_widget = new Widget(); | 30 Widget* bubble_widget = new Widget(); |
30 Widget::InitParams bubble_params(Widget::InitParams::TYPE_BUBBLE); | 31 Widget::InitParams bubble_params(Widget::InitParams::TYPE_BUBBLE); |
31 bubble_params.delegate = bubble; | 32 bubble_params.delegate = bubble; |
32 bubble_params.opacity = Widget::InitParams::TRANSLUCENT_WINDOW; | 33 bubble_params.opacity = Widget::InitParams::TRANSLUCENT_WINDOW; |
33 bubble_params.accept_events = bubble->accept_events(); | 34 bubble_params.accept_events = bubble->accept_events(); |
34 if (bubble->parent_window()) | 35 if (bubble->parent_window()) |
35 bubble_params.parent = bubble->parent_window(); | 36 bubble_params.parent = bubble->parent_window(); |
36 else if (bubble->anchor_widget()) | 37 else if (bubble->anchor_widget()) |
37 bubble_params.parent = bubble->anchor_widget()->GetNativeView(); | 38 bubble_params.parent = bubble->anchor_widget()->GetNativeView(); |
38 bubble_params.activatable = bubble->CanActivate() ? | 39 bubble_params.activatable = bubble->CanActivate() |
39 Widget::InitParams::ACTIVATABLE_YES : Widget::InitParams::ACTIVATABLE_NO; | 40 ? Widget::InitParams::ACTIVATABLE_YES |
41 : Widget::InitParams::ACTIVATABLE_NO; | |
40 bubble->OnBeforeBubbleWidgetInit(&bubble_params, bubble_widget); | 42 bubble->OnBeforeBubbleWidgetInit(&bubble_params, bubble_widget); |
41 bubble_widget->Init(bubble_params); | 43 bubble_widget->Init(bubble_params); |
42 if (bubble_params.parent) | 44 if (bubble_params.parent) |
43 bubble_widget->StackAbove(bubble_params.parent); | 45 bubble_widget->StackAbove(bubble_params.parent); |
44 return bubble_widget; | 46 return bubble_widget; |
45 } | 47 } |
46 | 48 |
47 } // namespace | 49 } // namespace |
48 | 50 |
49 // static | 51 // static |
50 const char BubbleDelegateView::kViewClassName[] = "BubbleDelegateView"; | 52 const char BubbleDialogDelegateView::kViewClassName[] = |
53 "BubbleDialogDelegateView"; | |
51 | 54 |
52 BubbleDelegateView::BubbleDelegateView() | 55 BubbleDialogDelegateView::BubbleDialogDelegateView() |
msw
2016/02/22 21:43:56
nit: reorder to match decl (ditto for other ctor)
Evan Stade
2016/02/22 22:58:23
Done.
| |
53 : BubbleDelegateView(nullptr, BubbleBorder::TOP_LEFT) {} | 56 : BubbleDialogDelegateView(nullptr, BubbleBorder::TOP_LEFT) {} |
54 | 57 |
55 BubbleDelegateView::BubbleDelegateView(View* anchor_view, | 58 BubbleDialogDelegateView::BubbleDialogDelegateView(View* anchor_view, |
56 BubbleBorder::Arrow arrow) | 59 BubbleBorder::Arrow arrow) |
57 : close_on_esc_(true), | 60 : close_on_esc_(true), |
58 close_on_deactivate_(true), | 61 close_on_deactivate_(true), |
59 anchor_view_storage_id_(ViewStorage::GetInstance()->CreateStorageID()), | 62 anchor_view_storage_id_(ViewStorage::GetInstance()->CreateStorageID()), |
60 anchor_widget_(NULL), | 63 anchor_widget_(NULL), |
61 arrow_(arrow), | 64 arrow_(arrow), |
62 shadow_(BubbleBorder::SMALL_SHADOW), | 65 shadow_(BubbleBorder::SMALL_SHADOW), |
63 color_explicitly_set_(false), | 66 color_explicitly_set_(false), |
64 margins_(kPanelVertMargin, | 67 margins_(kPanelVertMargin, |
65 kPanelHorizMargin, | 68 kPanelHorizMargin, |
66 kPanelVertMargin, | 69 kPanelVertMargin, |
67 kPanelHorizMargin), | 70 kPanelHorizMargin), |
68 accept_events_(true), | 71 accept_events_(true), |
69 border_accepts_events_(true), | 72 border_accepts_events_(true), |
70 adjust_if_offscreen_(true), | 73 adjust_if_offscreen_(true), |
71 parent_window_(NULL), | 74 parent_window_(NULL), |
72 close_reason_(CloseReason::UNKNOWN) { | 75 close_reason_(CloseReason::UNKNOWN) { |
73 if (anchor_view) | 76 if (anchor_view) |
74 SetAnchorView(anchor_view); | 77 SetAnchorView(anchor_view); |
75 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); | 78 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); |
76 UpdateColorsFromTheme(GetNativeTheme()); | 79 UpdateColorsFromTheme(GetNativeTheme()); |
77 } | 80 } |
78 | 81 |
79 BubbleDelegateView::~BubbleDelegateView() { | 82 BubbleDialogDelegateView::~BubbleDialogDelegateView() { |
80 if (GetWidget()) | 83 if (GetWidget()) |
81 GetWidget()->RemoveObserver(this); | 84 GetWidget()->RemoveObserver(this); |
82 SetLayoutManager(NULL); | 85 SetLayoutManager(NULL); |
83 SetAnchorView(NULL); | 86 SetAnchorView(NULL); |
84 } | 87 } |
85 | 88 |
86 // static | 89 // static |
87 Widget* BubbleDelegateView::CreateBubble(BubbleDelegateView* bubble_delegate) { | 90 Widget* BubbleDialogDelegateView::CreateBubble( |
91 BubbleDialogDelegateView* bubble_delegate) { | |
88 bubble_delegate->Init(); | 92 bubble_delegate->Init(); |
89 // Get the latest anchor widget from the anchor view at bubble creation time. | 93 // Get the latest anchor widget from the anchor view at bubble creation time. |
90 bubble_delegate->SetAnchorView(bubble_delegate->GetAnchorView()); | 94 bubble_delegate->SetAnchorView(bubble_delegate->GetAnchorView()); |
91 Widget* bubble_widget = CreateBubbleWidget(bubble_delegate); | 95 Widget* bubble_widget = CreateBubbleWidget(bubble_delegate); |
92 | 96 |
93 #if defined(OS_WIN) | 97 #if defined(OS_WIN) |
94 // If glass is enabled, the bubble is allowed to extend outside the bounds of | 98 // If glass is enabled, the bubble is allowed to extend outside the bounds of |
95 // the parent frame and let DWM handle compositing. If not, then we don't | 99 // the parent frame and let DWM handle compositing. If not, then we don't |
96 // want to allow the bubble to extend the frame because it will be clipped. | 100 // want to allow the bubble to extend the frame because it will be clipped. |
97 bubble_delegate->set_adjust_if_offscreen(ui::win::IsAeroGlassEnabled()); | 101 bubble_delegate->set_adjust_if_offscreen(ui::win::IsAeroGlassEnabled()); |
98 #elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX) | 102 #elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_MACOSX) |
99 // Linux clips bubble windows that extend outside their parent window bounds. | 103 // Linux clips bubble windows that extend outside their parent window bounds. |
100 // Mac never adjusts. | 104 // Mac never adjusts. |
101 bubble_delegate->set_adjust_if_offscreen(false); | 105 bubble_delegate->set_adjust_if_offscreen(false); |
102 #endif | 106 #endif |
103 | 107 |
104 bubble_delegate->SizeToContents(); | 108 bubble_delegate->SizeToContents(); |
105 bubble_widget->AddObserver(bubble_delegate); | 109 bubble_widget->AddObserver(bubble_delegate); |
106 return bubble_widget; | 110 return bubble_widget; |
107 } | 111 } |
108 | 112 |
109 BubbleDelegateView* BubbleDelegateView::AsBubbleDelegate() { | 113 bool BubbleDialogDelegateView::ShouldShowCloseButton() const { |
110 return this; | |
111 } | |
112 | |
113 bool BubbleDelegateView::ShouldShowCloseButton() const { | |
114 return false; | 114 return false; |
115 } | 115 } |
116 | 116 |
117 View* BubbleDelegateView::GetContentsView() { | 117 ClientView* BubbleDialogDelegateView::CreateClientView(Widget* widget) { |
118 return this; | 118 DialogClientView* client = new DialogClientView(widget, GetContentsView()); |
119 client->set_button_row_insets(gfx::Insets()); | |
msw
2016/02/22 21:43:56
Why do we want empty insets here?
Evan Stade
2016/02/22 22:58:23
Dialogs don't inset the client view at all. Bubble
msw
2016/02/22 23:24:57
Acknowledged.
| |
120 return client; | |
119 } | 121 } |
120 | 122 |
121 NonClientFrameView* BubbleDelegateView::CreateNonClientFrameView( | 123 NonClientFrameView* BubbleDialogDelegateView::CreateNonClientFrameView( |
122 Widget* widget) { | 124 Widget* widget) { |
123 BubbleFrameView* frame = new BubbleFrameView( | 125 BubbleFrameView* frame = new BubbleFrameView( |
124 gfx::Insets(kPanelVertMargin, kPanelHorizMargin, 0, kPanelHorizMargin), | 126 gfx::Insets(kPanelVertMargin, kPanelHorizMargin, 0, kPanelHorizMargin), |
125 margins()); | 127 margins()); |
126 // Note: In CreateBubble, the call to SizeToContents() will cause | 128 // Note: In CreateBubble, the call to SizeToContents() will cause |
127 // the relayout that this call requires. | 129 // the relayout that this call requires. |
128 frame->SetTitleFontList(GetTitleFontList()); | 130 frame->SetTitleFontList(GetTitleFontList()); |
129 frame->SetFootnoteView(CreateFootnoteView()); | 131 frame->SetFootnoteView(CreateFootnoteView()); |
130 | 132 |
131 BubbleBorder::Arrow adjusted_arrow = arrow(); | 133 BubbleBorder::Arrow adjusted_arrow = arrow(); |
132 if (base::i18n::IsRTL()) | 134 if (base::i18n::IsRTL()) |
133 adjusted_arrow = BubbleBorder::horizontal_mirror(adjusted_arrow); | 135 adjusted_arrow = BubbleBorder::horizontal_mirror(adjusted_arrow); |
134 frame->SetBubbleBorder(scoped_ptr<BubbleBorder>( | 136 frame->SetBubbleBorder(scoped_ptr<BubbleBorder>( |
135 new BubbleBorder(adjusted_arrow, shadow(), color()))); | 137 new BubbleBorder(adjusted_arrow, shadow(), color()))); |
136 return frame; | 138 return frame; |
137 } | 139 } |
138 | 140 |
139 void BubbleDelegateView::GetAccessibleState(ui::AXViewState* state) { | 141 void BubbleDialogDelegateView::GetAccessibleState(ui::AXViewState* state) { |
140 state->role = ui::AX_ROLE_DIALOG; | 142 state->role = ui::AX_ROLE_DIALOG; |
141 } | 143 } |
142 | 144 |
143 const char* BubbleDelegateView::GetClassName() const { | 145 const char* BubbleDialogDelegateView::GetClassName() const { |
144 return kViewClassName; | 146 return kViewClassName; |
145 } | 147 } |
146 | 148 |
147 void BubbleDelegateView::OnWidgetClosing(Widget* widget) { | 149 void BubbleDialogDelegateView::OnWidgetClosing(Widget* widget) { |
148 DCHECK(GetBubbleFrameView()); | 150 DCHECK(GetBubbleFrameView()); |
149 if (widget == GetWidget() && close_reason_ == CloseReason::UNKNOWN && | 151 if (widget == GetWidget() && close_reason_ == CloseReason::UNKNOWN && |
150 GetBubbleFrameView()->close_button_clicked()) { | 152 GetBubbleFrameView()->close_button_clicked()) { |
151 close_reason_ = CloseReason::CLOSE_BUTTON; | 153 close_reason_ = CloseReason::CLOSE_BUTTON; |
152 } | 154 } |
153 } | 155 } |
154 | 156 |
155 void BubbleDelegateView::OnWidgetDestroying(Widget* widget) { | 157 void BubbleDialogDelegateView::OnWidgetDestroying(Widget* widget) { |
156 if (anchor_widget() == widget) | 158 if (anchor_widget() == widget) |
157 SetAnchorView(NULL); | 159 SetAnchorView(NULL); |
158 } | 160 } |
159 | 161 |
160 void BubbleDelegateView::OnWidgetVisibilityChanging(Widget* widget, | 162 void BubbleDialogDelegateView::OnWidgetVisibilityChanging(Widget* widget, |
161 bool visible) { | 163 bool visible) { |
162 #if defined(OS_WIN) | 164 #if defined(OS_WIN) |
163 // On Windows we need to handle this before the bubble is visible or hidden. | 165 // On Windows we need to handle this before the bubble is visible or hidden. |
164 // Please see the comment on the OnWidgetVisibilityChanging function. On | 166 // Please see the comment on the OnWidgetVisibilityChanging function. On |
165 // other platforms it is fine to handle it after the bubble is shown/hidden. | 167 // other platforms it is fine to handle it after the bubble is shown/hidden. |
166 HandleVisibilityChanged(widget, visible); | 168 HandleVisibilityChanged(widget, visible); |
167 #endif | 169 #endif |
168 } | 170 } |
169 | 171 |
170 void BubbleDelegateView::OnWidgetVisibilityChanged(Widget* widget, | 172 void BubbleDialogDelegateView::OnWidgetVisibilityChanged(Widget* widget, |
171 bool visible) { | 173 bool visible) { |
172 #if !defined(OS_WIN) | 174 #if !defined(OS_WIN) |
173 HandleVisibilityChanged(widget, visible); | 175 HandleVisibilityChanged(widget, visible); |
174 #endif | 176 #endif |
175 } | 177 } |
176 | 178 |
177 void BubbleDelegateView::OnWidgetActivationChanged(Widget* widget, | 179 void BubbleDialogDelegateView::OnWidgetActivationChanged(Widget* widget, |
178 bool active) { | 180 bool active) { |
179 if (close_on_deactivate() && widget == GetWidget() && !active) { | 181 if (close_on_deactivate() && widget == GetWidget() && !active) { |
180 if (close_reason_ == CloseReason::UNKNOWN) | 182 if (close_reason_ == CloseReason::UNKNOWN) |
181 close_reason_ = CloseReason::DEACTIVATION; | 183 close_reason_ = CloseReason::DEACTIVATION; |
182 GetWidget()->Close(); | 184 GetWidget()->Close(); |
183 } | 185 } |
184 } | 186 } |
185 | 187 |
186 void BubbleDelegateView::OnWidgetBoundsChanged(Widget* widget, | 188 void BubbleDialogDelegateView::OnWidgetBoundsChanged( |
187 const gfx::Rect& new_bounds) { | 189 Widget* widget, |
190 const gfx::Rect& new_bounds) { | |
188 if (GetBubbleFrameView() && anchor_widget() == widget) | 191 if (GetBubbleFrameView() && anchor_widget() == widget) |
189 SizeToContents(); | 192 SizeToContents(); |
190 } | 193 } |
191 | 194 |
192 View* BubbleDelegateView::GetAnchorView() const { | 195 View* BubbleDialogDelegateView::GetAnchorView() const { |
193 return ViewStorage::GetInstance()->RetrieveView(anchor_view_storage_id_); | 196 return ViewStorage::GetInstance()->RetrieveView(anchor_view_storage_id_); |
194 } | 197 } |
195 | 198 |
196 gfx::Rect BubbleDelegateView::GetAnchorRect() const { | 199 gfx::Rect BubbleDialogDelegateView::GetAnchorRect() const { |
197 if (!GetAnchorView()) | 200 if (!GetAnchorView()) |
198 return anchor_rect_; | 201 return anchor_rect_; |
199 | 202 |
200 anchor_rect_ = GetAnchorView()->GetBoundsInScreen(); | 203 anchor_rect_ = GetAnchorView()->GetBoundsInScreen(); |
201 anchor_rect_.Inset(anchor_view_insets_); | 204 anchor_rect_.Inset(anchor_view_insets_); |
202 return anchor_rect_; | 205 return anchor_rect_; |
203 } | 206 } |
204 | 207 |
205 void BubbleDelegateView::OnBeforeBubbleWidgetInit(Widget::InitParams* params, | 208 void BubbleDialogDelegateView::OnBeforeBubbleWidgetInit( |
206 Widget* widget) const { | 209 Widget::InitParams* params, |
207 } | 210 Widget* widget) const {} |
208 | 211 |
209 scoped_ptr<View> BubbleDelegateView::CreateFootnoteView() { | 212 void BubbleDialogDelegateView::UseCompactMargins() { |
210 return nullptr; | |
211 } | |
212 | |
213 void BubbleDelegateView::UseCompactMargins() { | |
214 const int kCompactMargin = 6; | 213 const int kCompactMargin = 6; |
215 margins_.Set(kCompactMargin, kCompactMargin, kCompactMargin, kCompactMargin); | 214 margins_.Set(kCompactMargin, kCompactMargin, kCompactMargin, kCompactMargin); |
216 } | 215 } |
217 | 216 |
218 void BubbleDelegateView::SetAlignment(BubbleBorder::BubbleAlignment alignment) { | 217 void BubbleDialogDelegateView::SetAlignment( |
218 BubbleBorder::BubbleAlignment alignment) { | |
219 GetBubbleFrameView()->bubble_border()->set_alignment(alignment); | 219 GetBubbleFrameView()->bubble_border()->set_alignment(alignment); |
220 SizeToContents(); | 220 SizeToContents(); |
221 } | 221 } |
222 | 222 |
223 void BubbleDelegateView::SetArrowPaintType( | 223 void BubbleDialogDelegateView::SetArrowPaintType( |
224 BubbleBorder::ArrowPaintType paint_type) { | 224 BubbleBorder::ArrowPaintType paint_type) { |
225 GetBubbleFrameView()->bubble_border()->set_paint_arrow(paint_type); | 225 GetBubbleFrameView()->bubble_border()->set_paint_arrow(paint_type); |
226 SizeToContents(); | 226 SizeToContents(); |
227 } | 227 } |
228 | 228 |
229 void BubbleDelegateView::OnAnchorBoundsChanged() { | 229 void BubbleDialogDelegateView::OnAnchorBoundsChanged() { |
230 SizeToContents(); | 230 SizeToContents(); |
231 } | 231 } |
232 | 232 |
233 bool BubbleDelegateView::AcceleratorPressed( | 233 bool BubbleDialogDelegateView::AcceleratorPressed( |
234 const ui::Accelerator& accelerator) { | 234 const ui::Accelerator& accelerator) { |
235 if (!close_on_esc() || accelerator.key_code() != ui::VKEY_ESCAPE) | 235 if (!close_on_esc() || accelerator.key_code() != ui::VKEY_ESCAPE) |
236 return false; | 236 return false; |
237 close_reason_ = CloseReason::ESCAPE; | 237 close_reason_ = CloseReason::ESCAPE; |
238 GetWidget()->Close(); | 238 GetWidget()->Close(); |
239 return true; | 239 return true; |
240 } | 240 } |
241 | 241 |
242 void BubbleDelegateView::OnNativeThemeChanged(const ui::NativeTheme* theme) { | 242 void BubbleDialogDelegateView::OnNativeThemeChanged( |
243 const ui::NativeTheme* theme) { | |
243 UpdateColorsFromTheme(theme); | 244 UpdateColorsFromTheme(theme); |
244 } | 245 } |
245 | 246 |
246 void BubbleDelegateView::Init() {} | 247 void BubbleDialogDelegateView::Init() {} |
247 | 248 |
248 void BubbleDelegateView::SetAnchorView(View* anchor_view) { | 249 void BubbleDialogDelegateView::SetAnchorView(View* anchor_view) { |
249 // When the anchor view gets set the associated anchor widget might | 250 // When the anchor view gets set the associated anchor widget might |
250 // change as well. | 251 // change as well. |
251 if (!anchor_view || anchor_widget() != anchor_view->GetWidget()) { | 252 if (!anchor_view || anchor_widget() != anchor_view->GetWidget()) { |
252 if (anchor_widget()) { | 253 if (anchor_widget()) { |
253 anchor_widget_->RemoveObserver(this); | 254 anchor_widget_->RemoveObserver(this); |
254 anchor_widget_ = NULL; | 255 anchor_widget_ = NULL; |
255 } | 256 } |
256 if (anchor_view) { | 257 if (anchor_view) { |
257 anchor_widget_ = anchor_view->GetWidget(); | 258 anchor_widget_ = anchor_view->GetWidget(); |
258 if (anchor_widget_) | 259 if (anchor_widget_) |
259 anchor_widget_->AddObserver(this); | 260 anchor_widget_->AddObserver(this); |
260 } | 261 } |
261 } | 262 } |
262 | 263 |
263 // Remove the old storage item and set the new (if there is one). | 264 // Remove the old storage item and set the new (if there is one). |
264 ViewStorage* view_storage = ViewStorage::GetInstance(); | 265 ViewStorage* view_storage = ViewStorage::GetInstance(); |
265 if (view_storage->RetrieveView(anchor_view_storage_id_)) | 266 if (view_storage->RetrieveView(anchor_view_storage_id_)) |
266 view_storage->RemoveView(anchor_view_storage_id_); | 267 view_storage->RemoveView(anchor_view_storage_id_); |
267 if (anchor_view) | 268 if (anchor_view) |
268 view_storage->StoreView(anchor_view_storage_id_, anchor_view); | 269 view_storage->StoreView(anchor_view_storage_id_, anchor_view); |
269 | 270 |
270 // Do not update anchoring for NULL views; this could indicate that our | 271 // Do not update anchoring for NULL views; this could indicate that our |
271 // NativeWindow is being destroyed, so it would be dangerous for us to update | 272 // NativeWindow is being destroyed, so it would be dangerous for us to update |
272 // our anchor bounds at that point. (It's safe to skip this, since if we were | 273 // our anchor bounds at that point. (It's safe to skip this, since if we were |
273 // to update the bounds when |anchor_view| is NULL, the bubble won't move.) | 274 // to update the bounds when |anchor_view| is NULL, the bubble won't move.) |
274 if (anchor_view && GetWidget()) | 275 if (anchor_view && GetWidget()) |
275 OnAnchorBoundsChanged(); | 276 OnAnchorBoundsChanged(); |
276 } | 277 } |
277 | 278 |
278 void BubbleDelegateView::SetAnchorRect(const gfx::Rect& rect) { | 279 void BubbleDialogDelegateView::SetAnchorRect(const gfx::Rect& rect) { |
279 anchor_rect_ = rect; | 280 anchor_rect_ = rect; |
280 if (GetWidget()) | 281 if (GetWidget()) |
281 OnAnchorBoundsChanged(); | 282 OnAnchorBoundsChanged(); |
282 } | 283 } |
283 | 284 |
284 void BubbleDelegateView::SizeToContents() { | 285 void BubbleDialogDelegateView::SizeToContents() { |
285 GetWidget()->SetBounds(GetBubbleBounds()); | 286 GetWidget()->SetBounds(GetBubbleBounds()); |
286 } | 287 } |
287 | 288 |
288 BubbleFrameView* BubbleDelegateView::GetBubbleFrameView() const { | 289 BubbleFrameView* BubbleDialogDelegateView::GetBubbleFrameView() const { |
289 const NonClientView* view = | 290 const NonClientView* view = |
290 GetWidget() ? GetWidget()->non_client_view() : NULL; | 291 GetWidget() ? GetWidget()->non_client_view() : NULL; |
291 return view ? static_cast<BubbleFrameView*>(view->frame_view()) : NULL; | 292 return view ? static_cast<BubbleFrameView*>(view->frame_view()) : NULL; |
292 } | 293 } |
293 | 294 |
294 gfx::Rect BubbleDelegateView::GetBubbleBounds() { | 295 gfx::Rect BubbleDialogDelegateView::GetBubbleBounds() { |
295 // The argument rect has its origin at the bubble's arrow anchor point; | 296 // The argument rect has its origin at the bubble's arrow anchor point; |
296 // its size is the preferred size of the bubble's client view (this view). | 297 // its size is the preferred size of the bubble's client view (this view). |
297 bool anchor_minimized = anchor_widget() && anchor_widget()->IsMinimized(); | 298 bool anchor_minimized = anchor_widget() && anchor_widget()->IsMinimized(); |
298 return GetBubbleFrameView()->GetUpdatedWindowBounds(GetAnchorRect(), | 299 return GetBubbleFrameView()->GetUpdatedWindowBounds( |
299 GetPreferredSize(), adjust_if_offscreen_ && !anchor_minimized); | 300 GetAnchorRect(), GetWidget()->client_view()->GetPreferredSize(), |
301 adjust_if_offscreen_ && !anchor_minimized); | |
300 } | 302 } |
301 | 303 |
302 const gfx::FontList& BubbleDelegateView::GetTitleFontList() const { | 304 const gfx::FontList& BubbleDialogDelegateView::GetTitleFontList() const { |
303 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 305 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
304 return rb.GetFontList(ui::ResourceBundle::MediumFont); | 306 return rb.GetFontList(ui::ResourceBundle::MediumFont); |
305 } | 307 } |
306 | 308 |
307 | 309 void BubbleDialogDelegateView::UpdateColorsFromTheme( |
308 void BubbleDelegateView::UpdateColorsFromTheme(const ui::NativeTheme* theme) { | 310 const ui::NativeTheme* theme) { |
309 if (!color_explicitly_set_) | 311 if (!color_explicitly_set_) |
310 color_ = theme->GetSystemColor(ui::NativeTheme::kColorId_BubbleBackground); | 312 color_ = theme->GetSystemColor(ui::NativeTheme::kColorId_BubbleBackground); |
311 set_background(Background::CreateSolidBackground(color())); | 313 set_background(Background::CreateSolidBackground(color())); |
312 BubbleFrameView* frame_view = GetBubbleFrameView(); | 314 BubbleFrameView* frame_view = GetBubbleFrameView(); |
313 if (frame_view) | 315 if (frame_view) |
314 frame_view->bubble_border()->set_background_color(color()); | 316 frame_view->bubble_border()->set_background_color(color()); |
315 } | 317 } |
316 | 318 |
317 void BubbleDelegateView::HandleVisibilityChanged(Widget* widget, bool visible) { | 319 void BubbleDialogDelegateView::HandleVisibilityChanged(Widget* widget, |
320 bool visible) { | |
318 if (widget == GetWidget() && anchor_widget() && | 321 if (widget == GetWidget() && anchor_widget() && |
319 anchor_widget()->GetTopLevelWidget()) { | 322 anchor_widget()->GetTopLevelWidget()) { |
320 if (visible) | 323 if (visible) |
321 anchor_widget()->GetTopLevelWidget()->DisableInactiveRendering(); | 324 anchor_widget()->GetTopLevelWidget()->DisableInactiveRendering(); |
322 else | 325 else |
323 anchor_widget()->GetTopLevelWidget()->EnableInactiveRendering(); | 326 anchor_widget()->GetTopLevelWidget()->EnableInactiveRendering(); |
324 } | 327 } |
325 | 328 |
326 // Fire AX_EVENT_ALERT for bubbles marked as AX_ROLE_ALERT_DIALOG; this | 329 // Fire AX_EVENT_ALERT for bubbles marked as AX_ROLE_ALERT_DIALOG; this |
327 // instructs accessibility tools to read the bubble in its entirety rather | 330 // instructs accessibility tools to read the bubble in its entirety rather |
328 // than just its title and initially focused view. See | 331 // than just its title and initially focused view. See |
329 // http://crbug.com/474622 for details. | 332 // http://crbug.com/474622 for details. |
330 if (widget == GetWidget() && visible) { | 333 if (widget == GetWidget() && visible) { |
331 ui::AXViewState state; | 334 ui::AXViewState state; |
332 GetAccessibleState(&state); | 335 GetAccessibleState(&state); |
333 if (state.role == ui::AX_ROLE_ALERT_DIALOG) | 336 if (state.role == ui::AX_ROLE_ALERT_DIALOG) |
334 NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); | 337 NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); |
335 } | 338 } |
336 } | 339 } |
337 | 340 |
338 } // namespace views | 341 } // namespace views |
OLD | NEW |