Home | History | Annotate | Download | only in location_bar
      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