Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: chrome/browser/ui/views/infobars/infobars.cc

Issue 4767001: Make TabContents own its infobar delegates.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/infobars/infobars.h" 5 #include "chrome/browser/views/infobars/infobars.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "app/resource_bundle.h" 8 #include "app/resource_bundle.h"
9 #include "app/slide_animation.h" 9 #include "app/slide_animation.h"
10 #if defined(OS_WIN) 10 #if defined(OS_WIN)
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 void InfoBar::Layout() { 136 void InfoBar::Layout() {
137 gfx::Size button_ps = close_button_->GetPreferredSize(); 137 gfx::Size button_ps = close_button_->GetPreferredSize();
138 close_button_->SetBounds(width() - kHorizontalPadding - button_ps.width(), 138 close_button_->SetBounds(width() - kHorizontalPadding - button_ps.width(),
139 OffsetY(this, button_ps), button_ps.width(), 139 OffsetY(this, button_ps), button_ps.width(),
140 button_ps.height()); 140 button_ps.height());
141 } 141 }
142 142
143 void InfoBar::ViewHierarchyChanged(bool is_add, views::View* parent, 143 void InfoBar::ViewHierarchyChanged(bool is_add, views::View* parent,
144 views::View* child) { 144 views::View* child) {
145 if (child == this) { 145 if (child == this) {
146 if (is_add) { 146 if (is_add)
147 InfoBarAdded(); 147 InfoBarAdded();
148 } else { 148 else
149 InfoBarRemoved(); 149 InfoBarRemoved();
150 }
151 } 150 }
152 151
153 if (GetWidget() && GetWidget()->IsAccessibleWidget()) { 152 if (GetWidget() && GetWidget()->IsAccessibleWidget()) {
154 // For accessibility, make the close button the last child view. 153 // For accessibility, make the close button the last child view.
155 if (parent == this && child != close_button_ && 154 if (parent == this && child != close_button_ &&
156 HasChildView(close_button_) && 155 HasChildView(close_button_) &&
157 GetChildViewAt(GetChildViewCount() - 1) != close_button_) { 156 GetChildViewAt(GetChildViewCount() - 1) != close_button_) {
158 RemoveChildView(close_button_); 157 RemoveChildView(close_button_);
159 AddChildView(close_button_); 158 AddChildView(close_button_);
160 } 159 }
(...skipping 20 matching lines...) Expand all
181 } 180 }
182 181
183 int InfoBar::OffsetY(views::View* parent, const gfx::Size prefsize) { 182 int InfoBar::OffsetY(views::View* parent, const gfx::Size prefsize) {
184 return CenterY(prefsize) - 183 return CenterY(prefsize) -
185 (static_cast<int>(target_height_) - parent->height()); 184 (static_cast<int>(target_height_) - parent->height());
186 } 185 }
187 186
188 // InfoBar, views::ButtonListener implementation: ------------------ 187 // InfoBar, views::ButtonListener implementation: ------------------
189 188
190 void InfoBar::ButtonPressed(views::Button* sender, const views::Event& event) { 189 void InfoBar::ButtonPressed(views::Button* sender, const views::Event& event) {
191 if (sender == close_button_) { 190 if ((sender == close_button_) && delegate_) {
192 if (delegate_) 191 delegate_->InfoBarDismissed();
193 delegate_->InfoBarDismissed();
194 RemoveInfoBar(); 192 RemoveInfoBar();
195 } 193 }
196 } 194 }
197 195
198 // InfoBar, views::FocusChangeListener implementation: ------------------ 196 // InfoBar, views::FocusChangeListener implementation: ------------------
199 197
200 void InfoBar::FocusWillChange(View* focused_before, View* focused_now) { 198 void InfoBar::FocusWillChange(View* focused_before, View* focused_now) {
201 // This will trigger some screen readers to read the entire contents of this 199 // This will trigger some screen readers to read the entire contents of this
202 // infobar. 200 // infobar.
203 if (focused_before && focused_now && 201 if (focused_before && focused_now &&
204 !this->IsParentOf(focused_before) && this->IsParentOf(focused_now)) { 202 !this->IsParentOf(focused_before) && this->IsParentOf(focused_now)) {
205 NotifyAccessibilityEvent(AccessibilityTypes::EVENT_ALERT); 203 NotifyAccessibilityEvent(AccessibilityTypes::EVENT_ALERT);
206 } 204 }
207 } 205 }
208 206
209 // InfoBar, AnimationDelegate implementation: ---------------------------------- 207 // InfoBar, AnimationDelegate implementation: ----------------------------------
210 208
211 void InfoBar::AnimationProgressed(const Animation* animation) { 209 void InfoBar::AnimationProgressed(const Animation* animation) {
212 if (container_) 210 if (container_)
213 container_->InfoBarAnimated(true); 211 container_->InfoBarAnimated(true);
214 } 212 }
215 213
216 void InfoBar::AnimationEnded(const Animation* animation) { 214 void InfoBar::AnimationEnded(const Animation* animation) {
217 if (container_) { 215 if (container_) {
218 container_->InfoBarAnimated(false); 216 container_->InfoBarAnimated(false);
219
220 if (!animation_->IsShowing()) 217 if (!animation_->IsShowing())
221 Close(); 218 Close();
222 } 219 }
223 } 220 }
224 221
225 // InfoBar, private: ----------------------------------------------------------- 222 // InfoBar, private: -----------------------------------------------------------
226 223
227 void InfoBar::AnimateOpen() { 224 void InfoBar::AnimateOpen() {
228 animation_->Show(); 225 animation_->Show();
229 } 226 }
230 227
231 void InfoBar::Open() { 228 void InfoBar::Open() {
232 // Set the animation value to 1.0 so that GetPreferredSize() returns the right 229 // Set the animation value to 1.0 so that GetPreferredSize() returns the right
233 // size. 230 // size.
234 animation_->Reset(1.0); 231 animation_->Reset(1.0);
235 if (container_) 232 if (container_)
236 container_->InfoBarAnimated(false); 233 container_->InfoBarAnimated(false);
237 } 234 }
238 235
239 void InfoBar::AnimateClose() { 236 void InfoBar::AnimateClose() {
237 delegate_ = NULL;
240 bool restore_focus = true; 238 bool restore_focus = true;
241 #if defined(OS_WIN) 239 #if defined(OS_WIN)
242 // Do not restore focus (and active state with it) on Windows if some other 240 // Do not restore focus (and active state with it) on Windows if some other
243 // top-level window became active. 241 // top-level window became active.
244 if (GetWidget() && 242 if (GetWidget() &&
245 !win_util::DoesWindowBelongToActiveWindow(GetWidget()->GetNativeView())) { 243 !win_util::DoesWindowBelongToActiveWindow(GetWidget()->GetNativeView())) {
246 restore_focus = false; 244 restore_focus = false;
247 } 245 }
248 #endif // defined(OS_WIN) 246 #endif // defined(OS_WIN)
249 DestroyFocusTracker(restore_focus); 247 DestroyFocusTracker(restore_focus);
250 animation_->Hide(); 248 animation_->Hide();
251 } 249 }
252 250
253 void InfoBar::Close() { 251 void InfoBar::Close() {
252 delegate_ = NULL;
254 GetParent()->RemoveChildView(this); 253 GetParent()->RemoveChildView(this);
255 // Note that we only tell the delegate we're closed here, and not when we're
256 // simply destroyed (by virtue of a tab switch or being moved from window to
257 // window), since this action can cause the delegate to destroy itself.
258 if (delegate_) {
259 delegate_->InfoBarClosed();
260 delegate_ = NULL;
261 }
262 } 254 }
263 255
264 void InfoBar::InfoBarAdded() { 256 void InfoBar::InfoBarAdded() {
265 // The container_ pointer must be set before adding to the view hierarchy. 257 // The container_ pointer must be set before adding to the view hierarchy.
266 DCHECK(container_); 258 DCHECK(container_);
267 #if defined(OS_WIN) 259 #if defined(OS_WIN)
268 // When we're added to a view hierarchy within a widget, we create an 260 // When we're added to a view hierarchy within a widget, we create an
269 // external focus tracker to track what was focused in case we obtain 261 // external focus tracker to track what was focused in case we obtain
270 // focus so that we can restore focus when we're removed. 262 // focus so that we can restore focus when we're removed.
271 views::Widget* widget = GetWidget(); 263 views::Widget* widget = GetWidget();
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 AddChildView(link_); 387 AddChildView(link_);
396 } 388 }
397 389
398 LinkInfoBar::~LinkInfoBar() { 390 LinkInfoBar::~LinkInfoBar() {
399 } 391 }
400 392
401 // LinkInfoBar, views::LinkController implementation: -------------------------- 393 // LinkInfoBar, views::LinkController implementation: --------------------------
402 394
403 void LinkInfoBar::LinkActivated(views::Link* source, int event_flags) { 395 void LinkInfoBar::LinkActivated(views::Link* source, int event_flags) {
404 DCHECK(source == link_); 396 DCHECK(source == link_);
405 if (GetDelegate()->LinkClicked( 397 if (delegate() && GetDelegate()->LinkClicked(
406 event_utils::DispositionFromEventFlags(event_flags))) { 398 event_utils::DispositionFromEventFlags(event_flags)))
407 RemoveInfoBar(); 399 RemoveInfoBar();
408 }
409 } 400 }
410 401
411 // LinkInfoBar, views::View overrides: ----------------------------------------- 402 // LinkInfoBar, views::View overrides: -----------------------------------------
412 403
413 void LinkInfoBar::Layout() { 404 void LinkInfoBar::Layout() {
414 // Layout the close button. 405 // Layout the close button.
415 InfoBar::Layout(); 406 InfoBar::Layout();
416 407
417 // Layout the icon. 408 // Layout the icon.
418 gfx::Size icon_ps = icon_->GetPreferredSize(); 409 gfx::Size icon_ps = icon_->GetPreferredSize();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 // LinkInfoBar, private: ------------------------------------------------------- 445 // LinkInfoBar, private: -------------------------------------------------------
455 446
456 LinkInfoBarDelegate* LinkInfoBar::GetDelegate() { 447 LinkInfoBarDelegate* LinkInfoBar::GetDelegate() {
457 return delegate()->AsLinkInfoBarDelegate(); 448 return delegate()->AsLinkInfoBarDelegate();
458 } 449 }
459 450
460 // ConfirmInfoBar, public: ----------------------------------------------------- 451 // ConfirmInfoBar, public: -----------------------------------------------------
461 452
462 ConfirmInfoBar::ConfirmInfoBar(ConfirmInfoBarDelegate* delegate) 453 ConfirmInfoBar::ConfirmInfoBar(ConfirmInfoBarDelegate* delegate)
463 : AlertInfoBar(delegate), 454 : AlertInfoBar(delegate),
455 cached_buttons_(delegate->GetButtons()),
464 ok_button_(NULL), 456 ok_button_(NULL),
465 cancel_button_(NULL), 457 cancel_button_(NULL),
466 link_(NULL), 458 link_(NULL),
467 initialized_(false) { 459 initialized_(false) {
468 ok_button_ = new views::NativeButton(this, 460 ok_button_ = new views::NativeButton(this,
469 UTF16ToWideHack(delegate->GetButtonLabel( 461 UTF16ToWideHack(delegate->GetButtonLabel(
470 ConfirmInfoBarDelegate::BUTTON_OK))); 462 ConfirmInfoBarDelegate::BUTTON_OK)));
471 ok_button_->SetAccessibleName(ok_button_->label()); 463 ok_button_->SetAccessibleName(ok_button_->label());
472 if (delegate->GetButtons() & ConfirmInfoBarDelegate::BUTTON_OK_DEFAULT) 464 if (delegate->GetButtons() & ConfirmInfoBarDelegate::BUTTON_OK_DEFAULT)
473 ok_button_->SetAppearsAsDefault(true); 465 ok_button_->SetAppearsAsDefault(true);
(...skipping 21 matching lines...) Expand all
495 delete link_; 487 delete link_;
496 } 488 }
497 } 489 }
498 490
499 // ConfirmInfoBar, views::LinkController implementation: ----------------------- 491 // ConfirmInfoBar, views::LinkController implementation: -----------------------
500 492
501 void ConfirmInfoBar::LinkActivated(views::Link* source, int event_flags) { 493 void ConfirmInfoBar::LinkActivated(views::Link* source, int event_flags) {
502 DCHECK(source == link_); 494 DCHECK(source == link_);
503 DCHECK(link_->IsVisible()); 495 DCHECK(link_->IsVisible());
504 DCHECK(!link_->GetText().empty()); 496 DCHECK(!link_->GetText().empty());
505 if (GetDelegate()->LinkClicked( 497 if (delegate() && GetDelegate()->LinkClicked(
506 event_utils::DispositionFromEventFlags(event_flags))) { 498 event_utils::DispositionFromEventFlags(event_flags)))
507 RemoveInfoBar(); 499 RemoveInfoBar();
508 }
509 } 500 }
510 501
511 // ConfirmInfoBar, views::View overrides: -------------------------------------- 502 // ConfirmInfoBar, views::View overrides: --------------------------------------
512 503
513 void ConfirmInfoBar::Layout() { 504 void ConfirmInfoBar::Layout() {
514 // First layout right aligned items (from right to left) in order to determine 505 // First layout right aligned items (from right to left) in order to determine
515 // the space avalable, then layout the left aligned items. 506 // the space avalable, then layout the left aligned items.
516 507
517 // Layout the close button. 508 // Layout the close button.
518 InfoBar::Layout(); 509 InfoBar::Layout();
519 510
520 // Layout the cancel and OK buttons. 511 // Layout the cancel and OK buttons.
521 int available_width = AlertInfoBar::GetAvailableWidth(); 512 int available_width = AlertInfoBar::GetAvailableWidth();
522 int ok_button_width = 0; 513 int ok_button_width = 0;
523 int cancel_button_width = 0; 514 int cancel_button_width = 0;
524 gfx::Size ok_ps = ok_button_->GetPreferredSize(); 515 gfx::Size ok_ps = ok_button_->GetPreferredSize();
525 gfx::Size cancel_ps = cancel_button_->GetPreferredSize(); 516 gfx::Size cancel_ps = cancel_button_->GetPreferredSize();
526 517
527 if (GetDelegate()->GetButtons() & ConfirmInfoBarDelegate::BUTTON_OK) { 518 // Cache the button set so that once the delegate goes away we can still
519 // Layout() (e.g. in the case of AnimateClose()).
520 if (delegate())
521 cached_buttons_ = GetDelegate()->GetButtons();
522 if (cached_buttons_ & ConfirmInfoBarDelegate::BUTTON_OK)
528 ok_button_width = ok_ps.width(); 523 ok_button_width = ok_ps.width();
529 } else { 524 else
530 ok_button_->SetVisible(false); 525 ok_button_->SetVisible(false);
531 } 526 if (cached_buttons_ & ConfirmInfoBarDelegate::BUTTON_CANCEL)
532 if (GetDelegate()->GetButtons() & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
533 cancel_button_width = cancel_ps.width(); 527 cancel_button_width = cancel_ps.width();
534 } else { 528 else
535 cancel_button_->SetVisible(false); 529 cancel_button_->SetVisible(false);
536 }
537 530
538 cancel_button_->SetBounds(available_width - cancel_button_width, 531 cancel_button_->SetBounds(available_width - cancel_button_width,
539 OffsetY(this, cancel_ps), cancel_ps.width(), 532 OffsetY(this, cancel_ps), cancel_ps.width(),
540 cancel_ps.height()); 533 cancel_ps.height());
541 int spacing = cancel_button_width > 0 ? kButtonButtonSpacing : 0; 534 int spacing = cancel_button_width > 0 ? kButtonButtonSpacing : 0;
542 ok_button_->SetBounds(cancel_button_->x() - spacing - ok_button_width, 535 ok_button_->SetBounds(cancel_button_->x() - spacing - ok_button_width,
543 OffsetY(this, ok_ps), ok_ps.width(), ok_ps.height()); 536 OffsetY(this, ok_ps), ok_ps.width(), ok_ps.height());
544 537
545 // Layout the icon and label. 538 // Layout the icon and label.
546 AlertInfoBar::Layout(); 539 AlertInfoBar::Layout();
(...skipping 11 matching lines...) Expand all
558 views::View* child) { 551 views::View* child) {
559 if (is_add && child == this && !initialized_) { 552 if (is_add && child == this && !initialized_) {
560 Init(); 553 Init();
561 initialized_ = true; 554 initialized_ = true;
562 } 555 }
563 InfoBar::ViewHierarchyChanged(is_add, parent, child); 556 InfoBar::ViewHierarchyChanged(is_add, parent, child);
564 } 557 }
565 558
566 // ConfirmInfoBar, views::ButtonListener implementation: --------------- 559 // ConfirmInfoBar, views::ButtonListener implementation: ---------------
567 560
568 void ConfirmInfoBar::ButtonPressed( 561 void ConfirmInfoBar::ButtonPressed(views::Button* sender,
569 views::Button* sender, const views::Event& event) { 562 const views::Event& event) {
570 InfoBar::ButtonPressed(sender, event); 563 InfoBar::ButtonPressed(sender, event);
564 if (!GetDelegate())
565 return;
571 if (sender == ok_button_) { 566 if (sender == ok_button_) {
572 if (GetDelegate()->Accept()) 567 if (GetDelegate()->Accept())
573 RemoveInfoBar(); 568 RemoveInfoBar();
574 } else if (sender == cancel_button_) { 569 } else if (sender == cancel_button_) {
575 if (GetDelegate()->Cancel()) 570 if (GetDelegate()->Cancel())
576 RemoveInfoBar(); 571 RemoveInfoBar();
577 } 572 }
578 } 573 }
579 574
580 // ConfirmInfoBar, InfoBar overrides: ------------------------------------------ 575 // ConfirmInfoBar, InfoBar overrides: ------------------------------------------
(...skipping 24 matching lines...) Expand all
605 600
606 InfoBar* LinkInfoBarDelegate::CreateInfoBar() { 601 InfoBar* LinkInfoBarDelegate::CreateInfoBar() {
607 return new LinkInfoBar(this); 602 return new LinkInfoBar(this);
608 } 603 }
609 604
610 // ConfirmInfoBarDelegate, InfoBarDelegate overrides: -------------------------- 605 // ConfirmInfoBarDelegate, InfoBarDelegate overrides: --------------------------
611 606
612 InfoBar* ConfirmInfoBarDelegate::CreateInfoBar() { 607 InfoBar* ConfirmInfoBarDelegate::CreateInfoBar() {
613 return new ConfirmInfoBar(this); 608 return new ConfirmInfoBar(this);
614 } 609 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698