content_setting_image_view.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// Use of this source code is governed by a BSD-style license that can be
3674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// found in the LICENSE file.
4674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
5674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_CONTENT_SETTING_IMAGE_VIEW_H_
6674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_CONTENT_SETTING_IMAGE_VIEW_H_
7674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
8674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "base/memory/scoped_ptr.h"
9674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "chrome/common/content_settings_types.h"
10674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "ui/gfx/animation/animation_delegate.h"
11674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "ui/gfx/animation/slide_animation.h"
12674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "ui/views/painter.h"
13674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "ui/views/view.h"
14674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "ui/views/widget/widget_observer.h"
15674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
16674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenclass ContentSettingImageModel;
17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenclass LocationBarView;
18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogennamespace content {
20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenclass WebContents;
21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogennamespace gfx {
24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenclass FontList;
25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogennamespace views {
28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenclass ImageView;
29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenclass Label;
30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// The ContentSettingImageView displays an icon and optional text label for
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// various content settings affordances in the location bar (i.e. plugin
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// blocking, geolocation).
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenclass ContentSettingImageView : public gfx::AnimationDelegate,
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                public views::View,
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                                public views::WidgetObserver {
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public:
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  ContentSettingImageView(ContentSettingsType content_type,
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                          LocationBarView* parent,
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                          const gfx::FontList& font_list,
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                          SkColor text_color,
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                          SkColor parent_background_color);
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual ~ContentSettingImageView();
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // Updates the decoration from the shown WebContents.
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  void Update(content::WebContents* web_contents);
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private:
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // Number of milliseconds spent animating open; also the time spent animating
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // closed.
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  static const int kOpenTimeMS;
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // The total animation time, including open and close as well as an
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // intervening "stay open" period.
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  static const int kAnimationDurationMS;
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // Amount of padding at the edges of the bubble.  If |by_icon| is true, this
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // is the padding next to the icon; otherwise it's the padding next to the
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // label.  (We increase padding next to the label by the amount of padding
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // "built in" to the icon in order to make the bubble appear to have
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // symmetrical padding.)
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  static int GetBubbleOuterPadding(bool by_icon);
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // gfx::AnimationDelegate:
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual void AnimationCanceled(const gfx::Animation* animation) OVERRIDE;
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // views::View:
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual gfx::Size GetPreferredSize() const OVERRIDE;
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual void Layout() OVERRIDE;
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE;
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // views::WidgetObserver:
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  bool background_showing() const {
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    return slide_animator_.is_animating() || pause_animation_;
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  }
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  int GetTotalSpacingWhileAnimating() const;
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  void OnClick();
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  LocationBarView* parent_;  // Weak, owns us.
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  scoped_ptr<ContentSettingImageModel> content_setting_image_model_;
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  scoped_ptr<views::Painter> background_painter_;
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  views::ImageView* icon_;
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  views::Label* text_label_;
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  gfx::SlideAnimation slide_animator_;
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  bool pause_animation_;
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  double pause_animation_state_;
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  views::Widget* bubble_widget_;
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  DISALLOW_COPY_AND_ASSIGN(ContentSettingImageView);
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen};
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#endif  // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_CONTENT_SETTING_IMAGE_VIEW_H_
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen