1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/ui/views/location_bar/content_setting_image_view.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/command_line.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/content_setting_bubble_model.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/content_setting_image_model.h"
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/views/content_setting_bubble_contents.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/chrome_switches.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "third_party/skia/include/core/SkShader.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas_skia.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/skia_util.h"
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "views/border.h"
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace {
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Animation parameters.
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst int kOpenTimeMs = 150;
27201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst int kFullOpenedTimeMs = 3200;
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst int kMoveTimeMs = kFullOpenedTimeMs + 2 * kOpenTimeMs;
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst int kFrameRateHz = 60;
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Colors for the animated box.
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst SkColor kTopBoxColor = SkColorSetRGB(0xff, 0xf8, 0xd4);
32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst SkColor kBottomBoxColor = SkColorSetRGB(0xff, 0xe6, 0xaf);
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst SkColor kBorderColor = SkColorSetRGB(0xe9, 0xb9, 0x66);
34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Corner radius of the animated box.
35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst SkScalar kBoxCornerRadius = 2;
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Margins for animated box.
37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst int kTextMarginPixels = 4;
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst int kIconLeftMargin = 4;
39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// The fraction of the animation we'll spend animating the string into view, and
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// then again animating it closed -  total animation (slide out, show, then
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// slide in) is 1.0.
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst double kAnimatingFraction = kOpenTimeMs * 1.0 / kMoveTimeMs;
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochContentSettingImageView::ContentSettingImageView(
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ContentSettingsType content_type,
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LocationBarView* parent,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Profile* profile)
513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    : ui::LinearAnimation(kMoveTimeMs, kFrameRateHz, NULL),
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      content_setting_image_model_(
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          ContentSettingImageModel::CreateContentSettingImageModel(
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              content_type)),
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      parent_(parent),
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_(profile),
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      bubble_(NULL),
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      animation_in_progress_(false),
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      text_size_(0),
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      visible_text_size_(0) {
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SetHorizontalAlignment(ImageView::LEADING);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochContentSettingImageView::~ContentSettingImageView() {
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (bubble_)
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bubble_->Close();
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid ContentSettingImageView::UpdateFromTabContents(TabContents* tab_contents) {
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  content_setting_image_model_->UpdateFromTabContents(tab_contents);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!content_setting_image_model_->is_visible()) {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SetVisible(false);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetImage(ResourceBundle::GetSharedInstance().GetBitmapNamed(
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_setting_image_model_->get_icon()));
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetTooltipText(UTF8ToWide(content_setting_image_model_->get_tooltip()));
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetVisible(true);
79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
80201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabSpecificContentSettings* content_settings = tab_contents ?
81201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      tab_contents->GetTabSpecificContentSettings() : NULL;
82201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!content_settings || content_settings->IsBlockageIndicated(
83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      content_setting_image_model_->get_content_settings_type()))
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The content blockage was not yet indicated to the user. Start indication
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // animation and clear "not yet shown" flag.
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  content_settings->SetBlockageHasBeenIndicated(
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      content_setting_image_model_->get_content_settings_type());
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int animated_string_id =
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      content_setting_image_model_->explanatory_string_id();
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Check if the animation is enabled and if the string for animation is
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // available.
953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (CommandLine::ForCurrentProcess()->HasSwitch(
963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      switches::kDisableBlockContentAnimation) || !animated_string_id)
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Do not start animation if already in progress.
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!animation_in_progress_) {
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    animation_in_progress_ = true;
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Initialize animated string. It will be cleared when animation is
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // completed.
1043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    animated_text_ = l10n_util::GetStringUTF16(animated_string_id);
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    text_size_ = ResourceBundle::GetSharedInstance().GetFont(
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        ResourceBundle::MediumFont).GetStringWidth(animated_text_);
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    text_size_ += 2 * kTextMarginPixels + kIconLeftMargin;
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (border())
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      border()->GetInsets(&saved_insets_);
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Start();
111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochgfx::Size ContentSettingImageView::GetPreferredSize() {
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  gfx::Size preferred_size(views::ImageView::GetPreferredSize());
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // When view is animated visible_text_size_ > 0, it is 0 otherwise.
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  preferred_size.set_width(preferred_size.width() + visible_text_size_);
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return preferred_size;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ContentSettingImageView::OnMousePressed(const views::MouseEvent& event) {
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We want to show the bubble on mouse release; that is the standard behavior
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for buttons.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ContentSettingImageView::OnMouseReleased(const views::MouseEvent& event) {
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!HitTest(event.location()))
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* tab_contents = parent_->GetTabContentsWrapper()->tab_contents();
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!tab_contents)
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Prerender does not have a bubble.
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ContentSettingsType content_settings_type =
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_setting_image_model_->get_content_settings_type();
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (content_settings_type == CONTENT_SETTINGS_TYPE_PRERENDER)
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect screen_bounds(GetImageBounds());
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point origin(screen_bounds.origin());
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View::ConvertPointToScreen(this, &origin);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  screen_bounds.set_origin(origin);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ContentSettingBubbleContents* bubble_contents =
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new ContentSettingBubbleContents(
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          ContentSettingBubbleModel::CreateContentSettingBubbleModel(
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen              tab_contents, profile_, content_settings_type),
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          profile_, tab_contents);
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bubble_ = Bubble::Show(GetWidget(), screen_bounds, BubbleBorder::TOP_RIGHT,
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         bubble_contents, this);
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bubble_contents->set_bubble(bubble_);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ContentSettingImageView::VisibilityChanged(View* starting_from,
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                bool is_visible) {
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!is_visible && bubble_)
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bubble_->Close();
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ContentSettingImageView::OnPaint(gfx::Canvas* canvas) {
162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  gfx::Insets current_insets;
163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (border())
164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    border()->GetInsets(&current_insets);
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // During the animation we draw a border, an icon and the text. The text area
166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // is changing in size during the animation, giving the appearance of the text
167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // sliding out and then back in. When the text completely slid out the yellow
168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // border is no longer painted around the icon. |visible_text_size_| is 0 when
169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // animation is stopped.
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int necessary_left_margin = std::min(kIconLeftMargin, visible_text_size_);
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (necessary_left_margin != current_insets.left() - saved_insets_.left()) {
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // In the non-animated state borders' left() is 0, in the animated state it
173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // is the kIconLeftMargin, so we need to animate border reduction when it
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // starts to disappear.
175201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    views::Border* empty_border = views::Border::CreateEmptyBorder(
176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        saved_insets_.top(),
177201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        saved_insets_.left() + necessary_left_margin,
178201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        saved_insets_.bottom(),
179201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        saved_insets_.right());
180201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    set_border(empty_border);
181201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
182201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Paint an icon with possibly non-empty left border.
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  views::ImageView::OnPaint(canvas);
184201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (animation_in_progress_) {
185201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Paint text to the right of the icon.
186201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    canvas->DrawStringInt(animated_text_,
188201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        rb.GetFont(ResourceBundle::MediumFont), SK_ColorBLACK,
189201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        GetImageBounds().right() + kTextMarginPixels, y(),
190201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        width() - GetImageBounds().width(), height(),
191201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        gfx::Canvas::TEXT_ALIGN_LEFT | gfx::Canvas::TEXT_VALIGN_MIDDLE);
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ContentSettingImageView::OnPaintBackground(gfx::Canvas* canvas) {
196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!animation_in_progress_) {
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    views::ImageView::OnPaintBackground(canvas);
198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Paint yellow gradient background if in animation mode.
201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const int kEdgeThickness = 1;
202201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SkPaint paint;
203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  paint.setShader(gfx::CreateGradientShader(kEdgeThickness,
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                  height() - (2 * kEdgeThickness),
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  kTopBoxColor, kBottomBoxColor));
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SkSafeUnref(paint.getShader());
207201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SkRect color_rect;
208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  color_rect.iset(0, 0, width() - 1, height() - 1);
209201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  canvas->AsCanvasSkia()->drawRoundRect(color_rect, kBoxCornerRadius,
210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                        kBoxCornerRadius, paint);
211201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SkPaint outer_paint;
212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  outer_paint.setStyle(SkPaint::kStroke_Style);
213201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  outer_paint.setColor(kBorderColor);
214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  color_rect.inset(SkIntToScalar(kEdgeThickness),
215201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                   SkIntToScalar(kEdgeThickness));
216201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  canvas->AsCanvasSkia()->drawRoundRect(color_rect, kBoxCornerRadius,
217201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                        kBoxCornerRadius, outer_paint);
218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
219201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ContentSettingImageView::BubbleClosing(Bubble* bubble,
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            bool closed_by_escape) {
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bubble_ = NULL;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ContentSettingImageView::CloseOnEscape() {
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool ContentSettingImageView::FadeInOnShow() {
230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid ContentSettingImageView::AnimateToState(double state) {
234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (state >= 1.0) {
235201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Animaton is over, clear the variables.
236201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    animation_in_progress_ = false;
237201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    visible_text_size_ = 0;
238201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else if (state < kAnimatingFraction) {
239201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    visible_text_size_ = static_cast<int>(text_size_ * state /
240201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                          kAnimatingFraction);
241201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else if (state > (1.0 - kAnimatingFraction)) {
242201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    visible_text_size_ = static_cast<int>(text_size_ * (1.0 - state) /
243201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                          kAnimatingFraction);
244201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
245201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    visible_text_size_ = text_size_;
246201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
247201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  parent_->Layout();
248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  parent_->SchedulePaint();
249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
251