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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/views/location_bar/suggested_text_view.h" 6 7 #include "chrome/browser/autocomplete/autocomplete_edit.h" 8 #include "chrome/browser/instant/instant_controller.h" 9 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" 10 #include "ui/base/animation/multi_animation.h" 11 #include "ui/gfx/canvas.h" 12 #include "ui/gfx/color_utils.h" 13 14 SuggestedTextView::SuggestedTextView(AutocompleteEditModel* edit_model) 15 : edit_model_(edit_model), 16 bg_color_(0) { 17 } 18 19 SuggestedTextView::~SuggestedTextView() { 20 } 21 22 void SuggestedTextView::StartAnimation() { 23 StopAnimation(); 24 25 animation_.reset(CreateAnimation()); 26 animation_->Start(); 27 UpdateBackgroundColor(); 28 } 29 30 void SuggestedTextView::StopAnimation() { 31 if (animation_.get()) { 32 // Reset the delegate so that we don't attempt to commit in AnimationEnded. 33 animation_->set_delegate(NULL); 34 animation_.reset(NULL); 35 SetColor(LocationBarView::GetColor(ToolbarModel::NONE, 36 LocationBarView::DEEMPHASIZED_TEXT)); 37 SchedulePaint(); 38 } 39 } 40 41 void SuggestedTextView::OnPaintBackground(gfx::Canvas* canvas) { 42 if (!animation_.get() || animation_->GetCurrentValue() == 0) 43 return; 44 45 // TODO(sky): these numbers need to come from the edit. 46 canvas->FillRectInt(bg_color_, 0, 2, width(), height() - 5); 47 } 48 49 void SuggestedTextView::AnimationEnded(const ui::Animation* animation) { 50 edit_model_->CommitSuggestedText(false); 51 } 52 53 void SuggestedTextView::AnimationProgressed(const ui::Animation* animation) { 54 UpdateBackgroundColor(); 55 56 SkColor fg_color = LocationBarView::GetColor( 57 ToolbarModel::NONE, LocationBarView::DEEMPHASIZED_TEXT); 58 SkColor sel_fg_color = LocationBarView::GetColor( 59 ToolbarModel::NONE, LocationBarView::SELECTED_TEXT); 60 SetColor(color_utils::AlphaBlend( 61 sel_fg_color, fg_color, 62 ui::Tween::ValueBetween(animation->GetCurrentValue(), 0, 255))); 63 64 SchedulePaint(); 65 } 66 67 void SuggestedTextView::AnimationCanceled(const ui::Animation* animation) { 68 } 69 70 ui::Animation* SuggestedTextView::CreateAnimation() { 71 ui::MultiAnimation::Parts parts; 72 parts.push_back(ui::MultiAnimation::Part( 73 InstantController::kAutoCommitPauseTimeMS, ui::Tween::ZERO)); 74 parts.push_back(ui::MultiAnimation::Part( 75 InstantController::kAutoCommitFadeInTimeMS, ui::Tween::EASE_IN)); 76 ui::MultiAnimation* animation = new ui::MultiAnimation(parts); 77 animation->set_delegate(this); 78 animation->set_continuous(false); 79 return animation; 80 } 81 82 void SuggestedTextView::UpdateBackgroundColor() { 83 if (!animation_.get()) { 84 // Background only painted while animating. 85 return; 86 } 87 88 double value = animation_->GetCurrentValue(); 89 SkColor bg_color = LocationBarView::GetColor(ToolbarModel::NONE, 90 LocationBarView::BACKGROUND); 91 #if defined(OS_WIN) 92 SkColor s_color = color_utils::GetSysSkColor(COLOR_HIGHLIGHT); 93 #else 94 // TODO(sky): fix me. 95 NOTIMPLEMENTED(); 96 SkColor s_color = SK_ColorLTGRAY; 97 #endif 98 bg_color_ = color_utils::AlphaBlend(s_color, bg_color, 99 ui::Tween::ValueBetween(value, 0, 255)); 100 } 101