| Index: chrome/browser/views/infobars/translate_infobar_base.cc
|
| diff --git a/chrome/browser/views/infobars/translate_infobar_base.cc b/chrome/browser/views/infobars/translate_infobar_base.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..aa89609394fb9cfab46082708e64ab035bc1717f
|
| --- /dev/null
|
| +++ b/chrome/browser/views/infobars/translate_infobar_base.cc
|
| @@ -0,0 +1,179 @@
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/views/infobars/translate_infobar_base.h"
|
| +
|
| +#include "app/resource_bundle.h"
|
| +#include "app/slide_animation.h"
|
| +#include "base/utf_string_conversions.h"
|
| +#include "chrome/browser/translate/translate_infobar_delegate2.h"
|
| +#include "chrome/browser/views/infobars/after_translate_infobar.h"
|
| +#include "chrome/browser/views/infobars/before_translate_infobar.h"
|
| +#include "chrome/browser/views/infobars/translate_message_infobar.h"
|
| +#include "chrome/browser/views/infobars/infobar_button_border.h"
|
| +#include "gfx/canvas.h"
|
| +#include "grit/app_resources.h"
|
| +#include "views/controls/button/menu_button.h"
|
| +#include "views/controls/image_view.h"
|
| +
|
| +TranslateInfoBarBase::TranslateInfoBarBase(
|
| + TranslateInfoBarDelegate2* delegate)
|
| + : InfoBar(delegate),
|
| + normal_background_(InfoBarDelegate::PAGE_ACTION_TYPE),
|
| + error_background_(InfoBarDelegate::ERROR_TYPE) {
|
| + icon_ = new views::ImageView;
|
| + SkBitmap* image = delegate->GetIcon();
|
| + if (image)
|
| + icon_->SetImage(image);
|
| + AddChildView(icon_);
|
| +
|
| + TranslateInfoBarDelegate2::BackgroundAnimationType animation =
|
| + delegate->background_animation_type();
|
| + if (animation != TranslateInfoBarDelegate2::NONE) {
|
| + background_color_animation_.reset(new SlideAnimation(this));
|
| + background_color_animation_->SetTweenType(Tween::LINEAR);
|
| + background_color_animation_->SetSlideDuration(500);
|
| + if (animation == TranslateInfoBarDelegate2::NORMAL_TO_ERROR) {
|
| + background_color_animation_->Show();
|
| + } else {
|
| + DCHECK_EQ(TranslateInfoBarDelegate2::ERROR_TO_NORMAL, animation);
|
| + // Hide() runs the animation in reverse.
|
| + background_color_animation_->Reset(1.0);
|
| + background_color_animation_->Hide();
|
| + }
|
| + }
|
| +}
|
| +
|
| +TranslateInfoBarBase::~TranslateInfoBarBase() {
|
| +}
|
| +
|
| +// Overridden from views::View:
|
| +void TranslateInfoBarBase::Layout() {
|
| + // Layout the close button.
|
| + InfoBar::Layout();
|
| +
|
| + // Layout the icon on left of bar.
|
| + gfx::Size icon_ps = icon_->GetPreferredSize();
|
| + icon_->SetBounds(InfoBar::kHorizontalPadding, InfoBar::OffsetY(this, icon_ps),
|
| + icon_ps.width(), icon_ps.height());
|
| +}
|
| +
|
| +views::Label* TranslateInfoBarBase::CreateLabel(const string16& text) {
|
| + views::Label* label = new views::Label(UTF16ToWideHack(text),
|
| + ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::MediumFont));
|
| + label->SetColor(SK_ColorBLACK);
|
| + label->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| + return label;
|
| +}
|
| +
|
| +void TranslateInfoBarBase::PaintBackground(gfx::Canvas* canvas) {
|
| + // If we're not animating, simply paint the background for the current state.
|
| + if (background_color_animation_ == NULL ||
|
| + !background_color_animation_->is_animating()) {
|
| + GetBackground().Paint(canvas, this);
|
| + return;
|
| + }
|
| +
|
| + FadeBackground(canvas, 1.0 - background_color_animation_->GetCurrentValue(),
|
| + normal_background_);
|
| + FadeBackground(canvas, background_color_animation_->GetCurrentValue(),
|
| + error_background_);
|
| +}
|
| +
|
| +void TranslateInfoBarBase::AnimationProgressed(const Animation* animation) {
|
| + if (background_color_animation_.get() == animation)
|
| + SchedulePaint(); // That'll trigger a PaintBackgroud.
|
| + else
|
| + InfoBar::AnimationProgressed(animation);
|
| +}
|
| +
|
| +views::MenuButton* TranslateInfoBarBase::CreateMenuButton(
|
| + const string16& text,
|
| + bool normal_has_border,
|
| + views::ViewMenuDelegate* menu_delegate) {
|
| + // Don't use text to instantiate MenuButton because we need to set font before
|
| + // setting text so that the button will resize to fit the entire text.
|
| + views::MenuButton* menu_button =
|
| + new views::MenuButton(NULL, std::wstring(), menu_delegate, true);
|
| + menu_button->set_border(new InfoBarButtonBorder);
|
| + menu_button->set_menu_marker(ResourceBundle::GetSharedInstance().
|
| + GetBitmapNamed(IDR_INFOBARBUTTON_MENU_DROPARROW));
|
| + if (normal_has_border) {
|
| + menu_button->SetNormalHasBorder(true); // Normal button state has border.
|
| + // Disable animation during state change.
|
| + menu_button->SetAnimationDuration(0);
|
| + }
|
| + // Set font colors for different states.
|
| + menu_button->SetEnabledColor(SK_ColorBLACK);
|
| + menu_button->SetHighlightColor(SK_ColorBLACK);
|
| + menu_button->SetHoverColor(SK_ColorBLACK);
|
| +
|
| + // Set font then text, then size button to fit text.
|
| + menu_button->SetFont(ResourceBundle::GetSharedInstance().GetFont(
|
| + ResourceBundle::MediumFont));
|
| + menu_button->SetText(UTF16ToWideHack(text));
|
| + menu_button->ClearMaxTextSize();
|
| + menu_button->SizeToPreferredSize();
|
| + return menu_button;
|
| +}
|
| +
|
| +gfx::Point TranslateInfoBarBase::DetermineMenuPosition(
|
| + views::MenuButton* menu_button) {
|
| + gfx::Rect lb = menu_button->GetLocalBounds(true);
|
| + gfx::Point menu_position(lb.origin());
|
| + menu_position.Offset(2, lb.height() - 3);
|
| + if (base::i18n::IsRTL())
|
| + menu_position.Offset(lb.width() - 4, 0);
|
| +
|
| + View::ConvertPointToScreen(menu_button, &menu_position);
|
| +#if defined(OS_WIN)
|
| + int left_bound = GetSystemMetrics(SM_XVIRTUALSCREEN);
|
| + if (menu_position.x() < left_bound)
|
| + menu_position.set_x(left_bound);
|
| +#endif
|
| + return menu_position;
|
| +}
|
| +
|
| +TranslateInfoBarDelegate2* TranslateInfoBarBase::GetDelegate() const {
|
| + return static_cast<TranslateInfoBarDelegate2*>(delegate());
|
| +}
|
| +
|
| +const InfoBarBackground& TranslateInfoBarBase::GetBackground() const {
|
| + return GetDelegate()->IsError() ? error_background_ : normal_background_;
|
| +}
|
| +
|
| +void TranslateInfoBarBase::FadeBackground(gfx::Canvas* canvas,
|
| + double animation_value,
|
| + const InfoBarBackground& background) {
|
| + // Draw the background into an offscreen buffer with alpha value per animation
|
| + // value, then blend it back into the current canvas.
|
| + canvas->saveLayerAlpha(NULL, static_cast<int>(animation_value * 255),
|
| + SkCanvas::kARGB_NoClipLayer_SaveFlag);
|
| + canvas->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode);
|
| + background.Paint(canvas, this);
|
| + canvas->restore();
|
| +}
|
| +
|
| +// TranslateInfoBarDelegate views specific method:
|
| +InfoBar* TranslateInfoBarDelegate2::CreateInfoBar() {
|
| + TranslateInfoBarBase* infobar = NULL;
|
| + switch (type_) {
|
| + case BEFORE_TRANSLATE:
|
| + infobar = new BeforeTranslateInfoBar(this);
|
| + break;
|
| + case AFTER_TRANSLATE:
|
| + infobar = new AfterTranslateInfoBar(this);
|
| + break;
|
| + case TRANSLATING:
|
| + case TRANSLATION_ERROR:
|
| + infobar = new TranslateMessageInfoBar(this);
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| + // Set |infobar_view_| so that the model can notify the infobar when it
|
| + // changes.
|
| + infobar_view_ = infobar;
|
| + return infobar;
|
| +}
|
|
|