1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_CONTENT_SETTING_IMAGE_VIEW_H_ 6 #define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_CONTENT_SETTING_IMAGE_VIEW_H_ 7 8 #include "base/memory/scoped_ptr.h" 9 #include "components/content_settings/core/common/content_settings_types.h" 10 #include "ui/gfx/animation/animation_delegate.h" 11 #include "ui/gfx/animation/slide_animation.h" 12 #include "ui/views/painter.h" 13 #include "ui/views/view.h" 14 #include "ui/views/widget/widget_observer.h" 15 16 class ContentSettingImageModel; 17 class LocationBarView; 18 19 namespace content { 20 class WebContents; 21 } 22 23 namespace gfx { 24 class FontList; 25 } 26 27 namespace views { 28 class ImageView; 29 class Label; 30 } 31 32 // The ContentSettingImageView displays an icon and optional text label for 33 // various content settings affordances in the location bar (i.e. plugin 34 // blocking, geolocation). 35 class ContentSettingImageView : public gfx::AnimationDelegate, 36 public views::View, 37 public views::WidgetObserver { 38 public: 39 ContentSettingImageView(ContentSettingsType content_type, 40 LocationBarView* parent, 41 const gfx::FontList& font_list, 42 SkColor text_color, 43 SkColor parent_background_color); 44 virtual ~ContentSettingImageView(); 45 46 // Updates the decoration from the shown WebContents. 47 void Update(content::WebContents* web_contents); 48 49 private: 50 // Number of milliseconds spent animating open; also the time spent animating 51 // closed. 52 static const int kOpenTimeMS; 53 54 // The total animation time, including open and close as well as an 55 // intervening "stay open" period. 56 static const int kAnimationDurationMS; 57 58 // Amount of padding at the edges of the bubble. If |by_icon| is true, this 59 // is the padding next to the icon; otherwise it's the padding next to the 60 // label. (We increase padding next to the label by the amount of padding 61 // "built in" to the icon in order to make the bubble appear to have 62 // symmetrical padding.) 63 static int GetBubbleOuterPadding(bool by_icon); 64 65 // gfx::AnimationDelegate: 66 virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE; 67 virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; 68 virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE; 69 70 // views::View: 71 virtual gfx::Size GetPreferredSize() const OVERRIDE; 72 virtual void Layout() OVERRIDE; 73 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 74 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; 75 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 76 virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; 77 78 // views::WidgetObserver: 79 virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE; 80 background_showing()81 bool background_showing() const { 82 return slide_animator_.is_animating() || pause_animation_; 83 } 84 85 int GetTotalSpacingWhileAnimating() const; 86 void OnClick(); 87 88 LocationBarView* parent_; // Weak, owns us. 89 scoped_ptr<ContentSettingImageModel> content_setting_image_model_; 90 scoped_ptr<views::Painter> background_painter_; 91 views::ImageView* icon_; 92 views::Label* text_label_; 93 gfx::SlideAnimation slide_animator_; 94 bool pause_animation_; 95 double pause_animation_state_; 96 views::Widget* bubble_widget_; 97 98 DISALLOW_COPY_AND_ASSIGN(ContentSettingImageView); 99 }; 100 101 #endif // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_CONTENT_SETTING_IMAGE_VIEW_H_ 102