| 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/infobars/infobar_container.h" | 5 #if defined(TOOLKIT_VIEWS) // TODO(pkasting): Port non-views to use this. |
| 6 | 6 |
| 7 #include "chrome/browser/tab_contents/infobar_container.h" |
| 8 |
| 9 #include "chrome/browser/tab_contents/infobar.h" |
| 7 #include "chrome/browser/tab_contents/infobar_delegate.h" | 10 #include "chrome/browser/tab_contents/infobar_delegate.h" |
| 8 #include "chrome/browser/ui/views/infobars/infobar.h" | 11 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 9 #include "content/browser/tab_contents/tab_contents.h" | |
| 10 #include "content/common/notification_details.h" | 12 #include "content/common/notification_details.h" |
| 11 #include "content/common/notification_source.h" | 13 #include "content/common/notification_source.h" |
| 12 #include "ui/base/animation/slide_animation.h" | 14 #include "ui/base/animation/slide_animation.h" |
| 13 | 15 |
| 14 InfoBarContainer::Delegate::~Delegate() { | 16 InfoBarContainer::Delegate::~Delegate() { |
| 15 } | 17 } |
| 16 | 18 |
| 17 InfoBarContainer::InfoBarContainer(Delegate* delegate) | 19 InfoBarContainer::InfoBarContainer(Delegate* delegate) |
| 18 : delegate_(delegate), | 20 : delegate_(delegate), |
| 19 tab_contents_(NULL), | 21 tab_contents_(NULL), |
| 20 top_arrow_target_height_(InfoBar::kDefaultArrowTargetHeight) { | 22 top_arrow_target_height_(InfoBar::kDefaultArrowTargetHeight) { |
| 21 } | 23 } |
| 22 | 24 |
| 23 InfoBarContainer::~InfoBarContainer() { | 25 InfoBarContainer::~InfoBarContainer() { |
| 24 // RemoveAllInfoBarsForDestruction() should have already cleared our infobars. | 26 // RemoveAllInfoBarsForDestruction() should have already cleared our infobars. |
| 25 DCHECK(infobars_.empty()); | 27 DCHECK(infobars_.empty()); |
| 26 } | 28 } |
| 27 | 29 |
| 28 void InfoBarContainer::ChangeTabContents(TabContents* contents) { | 30 void InfoBarContainer::ChangeTabContents(TabContentsWrapper* contents) { |
| 29 registrar_.RemoveAll(); | 31 registrar_.RemoveAll(); |
| 30 | 32 |
| 31 while (!infobars_.empty()) { | 33 while (!infobars_.empty()) { |
| 32 InfoBar* infobar = infobars_.front(); | 34 InfoBar* infobar = infobars_.front(); |
| 33 // NULL the container pointer first so that if the infobar is currently | 35 // NULL the container pointer first so that if the infobar is currently |
| 34 // animating, OnInfoBarAnimated() won't get called; we'll manually trigger | 36 // animating, OnInfoBarStateChanged() won't get called; we'll manually |
| 35 // this once for the whole set of changes below. This also prevents | 37 // trigger this once for the whole set of changes below. This also prevents |
| 36 // InfoBar::MaybeDelete() from calling RemoveInfoBar() a second time if the | 38 // InfoBar::MaybeDelete() from calling RemoveInfoBar() a second time if the |
| 37 // infobar happens to be at zero height (dunno if this can actually happen). | 39 // infobar happens to be at zero height (dunno if this can actually happen). |
| 38 infobar->set_container(NULL); | 40 infobar->set_container(NULL); |
| 39 RemoveInfoBar(infobar); | 41 RemoveInfoBar(infobar); |
| 40 } | 42 } |
| 41 | 43 |
| 42 tab_contents_ = contents; | 44 tab_contents_ = contents; |
| 43 if (tab_contents_) { | 45 if (tab_contents_) { |
| 44 Source<TabContents> tc_source(tab_contents_); | 46 Source<TabContents> tc_source(tab_contents_->tab_contents()); |
| 45 registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_ADDED, | 47 registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_ADDED, |
| 46 tc_source); | 48 tc_source); |
| 47 registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, | 49 registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, |
| 48 tc_source); | 50 tc_source); |
| 49 registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REPLACED, | 51 registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REPLACED, |
| 50 tc_source); | 52 tc_source); |
| 51 | 53 |
| 52 for (size_t i = 0; i < tab_contents_->infobar_count(); ++i) { | 54 for (size_t i = 0; i < tab_contents_->infobar_count(); ++i) { |
| 53 // As when we removed the infobars above, we prevent callbacks to | 55 // As when we removed the infobars above, we prevent callbacks to |
| 54 // OnInfoBarAnimated() for each infobar. | 56 // OnInfoBarAnimated() for each infobar. |
| 55 AddInfoBar(tab_contents_->GetInfoBarDelegateAt(i)->CreateInfoBar(), false, | 57 AddInfoBar( |
| 56 NO_CALLBACK); | 58 tab_contents_->GetInfoBarDelegateAt(i)->CreateInfoBar(tab_contents_), |
| 59 false, NO_CALLBACK); |
| 57 } | 60 } |
| 58 } | 61 } |
| 59 | 62 |
| 60 // Now that everything is up to date, signal the delegate to re-layout. | 63 // Now that everything is up to date, signal the delegate to re-layout. |
| 61 OnInfoBarStateChanged(false); | 64 OnInfoBarStateChanged(false); |
| 62 } | 65 } |
| 63 | 66 |
| 64 int InfoBarContainer::GetVerticalOverlap(int* total_height) { | 67 int InfoBarContainer::GetVerticalOverlap(int* total_height) { |
| 65 // Our |total_height| is the sum of the preferred heights of the InfoBars | 68 // Our |total_height| is the sum of the preferred heights of the InfoBars |
| 66 // contained within us plus the |vertical_overlap|. | 69 // contained within us plus the |vertical_overlap|. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 // and at worst disastrous to call that. | 116 // and at worst disastrous to call that. |
| 114 delegate_ = NULL; | 117 delegate_ = NULL; |
| 115 ChangeTabContents(NULL); | 118 ChangeTabContents(NULL); |
| 116 } | 119 } |
| 117 | 120 |
| 118 void InfoBarContainer::Observe(NotificationType type, | 121 void InfoBarContainer::Observe(NotificationType type, |
| 119 const NotificationSource& source, | 122 const NotificationSource& source, |
| 120 const NotificationDetails& details) { | 123 const NotificationDetails& details) { |
| 121 switch (type.value) { | 124 switch (type.value) { |
| 122 case NotificationType::TAB_CONTENTS_INFOBAR_ADDED: | 125 case NotificationType::TAB_CONTENTS_INFOBAR_ADDED: |
| 123 AddInfoBar(Details<InfoBarDelegate>(details)->CreateInfoBar(), true, | 126 AddInfoBar( |
| 124 WANT_CALLBACK); | 127 Details<InfoBarDelegate>(details)->CreateInfoBar(tab_contents_), true, |
| 128 WANT_CALLBACK); |
| 125 break; | 129 break; |
| 126 | 130 |
| 127 case NotificationType::TAB_CONTENTS_INFOBAR_REMOVED: | 131 case NotificationType::TAB_CONTENTS_INFOBAR_REMOVED: |
| 128 RemoveInfoBar(Details<InfoBarDelegate>(details).ptr(), true); | 132 RemoveInfoBar(Details<InfoBarDelegate>(details).ptr(), true); |
| 129 break; | 133 break; |
| 130 | 134 |
| 131 case NotificationType::TAB_CONTENTS_INFOBAR_REPLACED: { | 135 case NotificationType::TAB_CONTENTS_INFOBAR_REPLACED: { |
| 132 typedef std::pair<InfoBarDelegate*, InfoBarDelegate*> InfoBarPair; | 136 typedef std::pair<InfoBarDelegate*, InfoBarDelegate*> InfoBarPair; |
| 133 InfoBarPair* infobar_pair = Details<InfoBarPair>(details).ptr(); | 137 InfoBarPair* infobar_pair = Details<InfoBarPair>(details).ptr(); |
| 134 RemoveInfoBar(infobar_pair->first, false); | 138 RemoveInfoBar(infobar_pair->first, false); |
| 135 AddInfoBar(infobar_pair->second->CreateInfoBar(), false, WANT_CALLBACK); | 139 AddInfoBar(infobar_pair->second->CreateInfoBar(tab_contents_), false, |
| 140 WANT_CALLBACK); |
| 136 break; | 141 break; |
| 137 } | 142 } |
| 138 | 143 |
| 139 default: | 144 default: |
| 140 NOTREACHED(); | 145 NOTREACHED(); |
| 141 break; | 146 break; |
| 142 } | 147 } |
| 143 } | 148 } |
| 144 | 149 |
| 145 void InfoBarContainer::RemoveInfoBar(InfoBarDelegate* delegate, | 150 void InfoBarContainer::RemoveInfoBar(InfoBarDelegate* delegate, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 const_cast<const InfoBar*>(infobars_.front())->animation(); | 194 const_cast<const InfoBar*>(infobars_.front())->animation(); |
| 190 if ((infobar_index > 1) || first_infobar_animation->IsShowing()) | 195 if ((infobar_index > 1) || first_infobar_animation->IsShowing()) |
| 191 return InfoBar::kDefaultArrowTargetHeight; | 196 return InfoBar::kDefaultArrowTargetHeight; |
| 192 // When the first infobar is animating closed, we animate the second infobar's | 197 // When the first infobar is animating closed, we animate the second infobar's |
| 193 // arrow target height from the default to the top target height. Note that | 198 // arrow target height from the default to the top target height. Note that |
| 194 // the animation values here are going from 1.0 -> 0.0 as the top bar closes. | 199 // the animation values here are going from 1.0 -> 0.0 as the top bar closes. |
| 195 return top_arrow_target_height_ + static_cast<int>( | 200 return top_arrow_target_height_ + static_cast<int>( |
| 196 (InfoBar::kDefaultArrowTargetHeight - top_arrow_target_height_) * | 201 (InfoBar::kDefaultArrowTargetHeight - top_arrow_target_height_) * |
| 197 first_infobar_animation->GetCurrentValue()); | 202 first_infobar_animation->GetCurrentValue()); |
| 198 } | 203 } |
| 204 |
| 205 #endif // TOOLKIT_VIEWS |
| OLD | NEW |