1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/views/infobars/translate_infobar_base.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/translate/translate_infobar_delegate.h"
9 #include "chrome/browser/translate/translate_tab_helper.h"
10 #include "chrome/browser/ui/views/infobars/after_translate_infobar.h"
11 #include "chrome/browser/ui/views/infobars/before_translate_infobar.h"
12 #include "chrome/browser/ui/views/infobars/translate_message_infobar.h"
13 #include "components/infobars/core/infobar.h"
14 #include "grit/theme_resources.h"
15 #include "ui/base/resource/resource_bundle.h"
16 #include "ui/gfx/animation/slide_animation.h"
17 #include "ui/gfx/canvas.h"
18 #include "ui/views/controls/button/menu_button.h"
19 #include "ui/views/controls/label.h"
22 // TranslateInfoBarDelegate ---------------------------------------------------
25 scoped_ptr
<infobars::InfoBar
> TranslateInfoBarDelegate::CreateInfoBar(
26 scoped_ptr
<TranslateInfoBarDelegate
> delegate
) {
27 if (delegate
->translate_step() ==
28 translate::TRANSLATE_STEP_BEFORE_TRANSLATE
) {
29 return scoped_ptr
<infobars::InfoBar
>(
30 new BeforeTranslateInfoBar(delegate
.Pass()));
32 if (delegate
->translate_step() ==
33 translate::TRANSLATE_STEP_AFTER_TRANSLATE
) {
34 return scoped_ptr
<infobars::InfoBar
>(
35 new AfterTranslateInfoBar(delegate
.Pass()));
37 return scoped_ptr
<infobars::InfoBar
>(
38 new TranslateMessageInfoBar(delegate
.Pass()));
42 // TranslateInfoBarBase -------------------------------------------------------
45 const int TranslateInfoBarBase::kButtonInLabelSpacing
= 5;
47 void TranslateInfoBarBase::UpdateLanguageButtonText(
48 views::MenuButton
* button
,
49 const base::string16
& text
) {
51 button
->SetText(text
);
52 button
->ClearMaxTextSize();
53 button
->SizeToPreferredSize();
58 TranslateInfoBarBase::TranslateInfoBarBase(
59 scoped_ptr
<TranslateInfoBarDelegate
> delegate
)
60 : InfoBarView(delegate
.PassAs
<infobars::InfoBarDelegate
>()),
61 error_background_(infobars::InfoBarDelegate::WARNING_TYPE
) {
64 TranslateInfoBarBase::~TranslateInfoBarBase() {
67 void TranslateInfoBarBase::ViewHierarchyChanged(
68 const ViewHierarchyChangedDetails
& details
) {
69 if (details
.is_add
&& (details
.child
== this) &&
70 (background_color_animation_
== NULL
)) {
71 background_color_animation_
.reset(new gfx::SlideAnimation(this));
72 background_color_animation_
->SetTweenType(gfx::Tween::LINEAR
);
73 background_color_animation_
->SetSlideDuration(500);
74 TranslateInfoBarDelegate::BackgroundAnimationType animation
=
75 GetDelegate()->background_animation_type();
76 if (animation
== TranslateInfoBarDelegate::NORMAL_TO_ERROR
) {
77 background_color_animation_
->Show();
78 } else if (animation
== TranslateInfoBarDelegate::ERROR_TO_NORMAL
) {
79 // Hide() runs the animation in reverse.
80 background_color_animation_
->Reset(1.0);
81 background_color_animation_
->Hide();
85 // This must happen after adding all other children so InfoBarView can ensure
86 // the close button is the last child.
87 InfoBarView::ViewHierarchyChanged(details
);
90 TranslateInfoBarDelegate
* TranslateInfoBarBase::GetDelegate() {
91 return delegate()->AsTranslateInfoBarDelegate();
94 void TranslateInfoBarBase::OnPaintBackground(gfx::Canvas
* canvas
) {
95 // We need to set the separator color for |error_background_| like
96 // InfoBarView::Layout() does for the normal background.
97 const infobars::InfoBarContainer::Delegate
* delegate
= container_delegate();
99 error_background_
.set_separator_color(delegate
->GetInfoBarSeparatorColor());
101 // If we're not animating, simply paint the background for the current state.
102 if (!background_color_animation_
->is_animating()) {
103 GetBackground().Paint(canvas
, this);
107 FadeBackground(canvas
, 1.0 - background_color_animation_
->GetCurrentValue(),
109 FadeBackground(canvas
, background_color_animation_
->GetCurrentValue(),
113 void TranslateInfoBarBase::AnimationProgressed(
114 const gfx::Animation
* animation
) {
115 if (animation
== background_color_animation_
.get())
116 SchedulePaint(); // That'll trigger a PaintBackgroud.
118 InfoBarView::AnimationProgressed(animation
);
121 const views::Background
& TranslateInfoBarBase::GetBackground() {
122 return GetDelegate()->is_error() ? error_background_
: *background();
125 void TranslateInfoBarBase::FadeBackground(gfx::Canvas
* canvas
,
126 double animation_value
,
127 const views::Background
& background
) {
128 // Draw the background into an offscreen buffer with alpha value per animation
129 // value, then blend it back into the current canvas.
130 canvas
->SaveLayerAlpha(static_cast<int>(animation_value
* 255));
131 background
.Paint(canvas
, this);