Index: chrome/browser/ui/views/notifications/balloon_view_views.cc |
diff --git a/chrome/browser/ui/views/notifications/balloon_view_views.cc b/chrome/browser/ui/views/notifications/balloon_view_views.cc |
index 94716980799b62d26ce1ebfb5661158d4ef435e3..de68d647e0c7bb36aabb5135625608ec5e0e0b45 100644 |
--- a/chrome/browser/ui/views/notifications/balloon_view_views.cc |
+++ b/chrome/browser/ui/views/notifications/balloon_view_views.cc |
@@ -87,6 +87,11 @@ const SkColor kControlBarSeparatorLineColor = SkColorSetRGB(180, 180, 180); |
} // namespace |
+// static |
+int BalloonView::GetHorizontalMargin() { |
+ return kLeftMargin + kRightMargin + kLeftShadowWidth + kRightShadowWidth; |
+} |
+ |
BalloonViewImpl::BalloonViewImpl(BalloonCollection* collection) |
: balloon_(NULL), |
collection_(collection), |
@@ -207,9 +212,7 @@ void BalloonViewImpl::RepositionToBalloon() { |
DCHECK(balloon_); |
if (!kAnimateEnabled) { |
- frame_container_->SetBounds( |
- gfx::Rect(balloon_->GetPosition().x(), balloon_->GetPosition().y(), |
- GetTotalWidth(), GetTotalHeight())); |
+ frame_container_->SetBounds(GetBoundsForFrameContainer()); |
gfx::Rect contents_rect = GetContentsRectangle(); |
html_container_->SetBounds(contents_rect); |
html_contents_->SetPreferredSize(contents_rect.size()); |
@@ -220,9 +223,7 @@ void BalloonViewImpl::RepositionToBalloon() { |
return; |
} |
- anim_frame_end_ = gfx::Rect( |
- balloon_->GetPosition().x(), balloon_->GetPosition().y(), |
- GetTotalWidth(), GetTotalHeight()); |
+ anim_frame_end_ = GetBoundsForFrameContainer(); |
anim_frame_start_ = frame_container_->GetClientAreaBoundsInScreen(); |
animation_.reset(new ui::SlideAnimation(this)); |
animation_->Show(); |
@@ -241,18 +242,8 @@ void BalloonViewImpl::AnimationProgressed(const ui::Animation* animation) { |
DCHECK(animation == animation_.get()); |
// Linear interpolation from start to end position. |
- double e = animation->GetCurrentValue(); |
- double s = (1.0 - e); |
- |
- gfx::Rect frame_position( |
- static_cast<int>(s * anim_frame_start_.x() + |
- e * anim_frame_end_.x()), |
- static_cast<int>(s * anim_frame_start_.y() + |
- e * anim_frame_end_.y()), |
- static_cast<int>(s * anim_frame_start_.width() + |
- e * anim_frame_end_.width()), |
- static_cast<int>(s * anim_frame_start_.height() + |
- e * anim_frame_end_.height())); |
+ gfx::Rect frame_position(animation_->CurrentValueBetween( |
+ anim_frame_start_, anim_frame_end_)); |
frame_container_->SetBounds(frame_position); |
gfx::Path path; |
@@ -336,7 +327,6 @@ void BalloonViewImpl::Show(Balloon* balloon) { |
// |
// We don't let the OS manage the RTL layout of these widgets, because |
// this code is already taking care of correctly reversing the layout. |
- gfx::Rect contents_rect = GetContentsRectangle(); |
#if defined(OS_CHROMEOS) && defined(USE_AURA) |
html_contents_.reset(new chromeos::BalloonViewHost(balloon)); |
#else |
@@ -348,19 +338,22 @@ void BalloonViewImpl::Show(Balloon* balloon) { |
html_container_ = new views::Widget; |
views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); |
- params.bounds = contents_rect; |
html_container_->Init(params); |
html_container_->SetContentsView(html_contents_->view()); |
- gfx::Rect balloon_rect(x(), y(), GetTotalWidth(), GetTotalHeight()); |
frame_container_ = new views::Widget; |
params.delegate = this; |
params.transparent = true; |
- params.bounds = balloon_rect; |
+ params.bounds = GetBoundsForFrameContainer(); |
frame_container_->Init(params); |
frame_container_->SetContentsView(this); |
frame_container_->StackAboveWidget(html_container_); |
+ // GetContentsRectangle() is calculated relative to |frame_container_|. Make |
+ // sure |frame_container_| has bounds before we ask for |
+ // GetContentsRectangle(). |
+ html_container_->SetBounds(GetContentsRectangle()); |
+ |
// SetAlwaysOnTop should be called after StackAboveWidget because otherwise |
// the top-most flag will be removed. |
html_container_->SetAlwaysOnTop(true); |
@@ -463,6 +456,11 @@ gfx::Point BalloonViewImpl::GetContentsOffset() const { |
kTopShadowWidth + kTopMargin); |
} |
+gfx::Rect BalloonViewImpl::GetBoundsForFrameContainer() const { |
+ return gfx::Rect(balloon_->GetPosition().x(), balloon_->GetPosition().y(), |
+ GetTotalWidth(), GetTotalHeight()); |
+} |
+ |
int BalloonViewImpl::GetShelfHeight() const { |
// TODO(johnnyg): add scaling here. |
int max_button_height = std::max(std::max( |