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(¤t_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