| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_ICON_LABEL_BUBBLE_VIEW_H_ | 5 #ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_ICON_LABEL_BUBBLE_VIEW_H_ |
| 6 #define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_ICON_LABEL_BUBBLE_VIEW_H_ | 6 #define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_ICON_LABEL_BUBBLE_VIEW_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/strings/string16.h" | 11 #include "base/strings/string16.h" |
| 12 #include "ui/gfx/geometry/insets.h" | 12 #include "ui/gfx/geometry/insets.h" |
| 13 #include "ui/gfx/geometry/size.h" | 13 #include "ui/gfx/geometry/size.h" |
| 14 #include "ui/views/animation/ink_drop_host_view.h" | 14 #include "ui/views/animation/ink_drop_host_view.h" |
| 15 #include "ui/views/animation/ink_drop_observer.h" |
| 16 #include "ui/views/controls/button/custom_button.h" |
| 15 #include "ui/views/controls/label.h" | 17 #include "ui/views/controls/label.h" |
| 18 #include "ui/views/widget/widget_observer.h" |
| 16 | 19 |
| 17 namespace gfx { | 20 namespace gfx { |
| 18 class Canvas; | |
| 19 class FontList; | 21 class FontList; |
| 20 class ImageSkia; | 22 class ImageSkia; |
| 21 } | 23 } |
| 22 | 24 |
| 23 namespace views { | 25 namespace views { |
| 24 class ImageView; | 26 class ImageView; |
| 25 class Label; | 27 class InkDropContainerView; |
| 26 } | 28 } |
| 27 | 29 |
| 28 // View used to draw a bubble, containing an icon and a label. We use this as a | 30 // View used to draw a bubble, containing an icon and a label. We use this as a |
| 29 // base for the classes that handle the location icon (including the EV bubble), | 31 // base for the classes that handle the location icon (including the EV bubble), |
| 30 // tab-to-search UI, and content settings. | 32 // tab-to-search UI, and content settings. |
| 31 class IconLabelBubbleView : public views::InkDropHostView { | 33 class IconLabelBubbleView : public views::InkDropObserver, |
| 34 public views::CustomButton, |
| 35 public views::ButtonListener, |
| 36 public views::WidgetObserver { |
| 32 public: | 37 public: |
| 33 static constexpr int kTrailingPaddingPreMd = 2; | 38 static constexpr int kTrailingPaddingPreMd = 2; |
| 34 | 39 |
| 35 IconLabelBubbleView(const gfx::FontList& font_list, bool elide_in_middle); | 40 IconLabelBubbleView(const gfx::FontList& font_list, bool elide_in_middle); |
| 36 ~IconLabelBubbleView() override; | 41 ~IconLabelBubbleView() override; |
| 37 | 42 |
| 43 // views::InkDropObserver: |
| 44 void InkDropAnimationStarted() override; |
| 45 |
| 46 // views::ButtonListener: |
| 47 void ButtonPressed(Button* sender, const ui::Event& event) override; |
| 48 |
| 38 void SetLabel(const base::string16& label); | 49 void SetLabel(const base::string16& label); |
| 39 void SetImage(const gfx::ImageSkia& image); | 50 void SetImage(const gfx::ImageSkia& image); |
| 40 | 51 |
| 41 const views::ImageView* GetImageView() const { return image_; } | 52 const views::ImageView* GetImageView() const { return image_; } |
| 42 views::ImageView* GetImageView() { return image_; } | 53 views::ImageView* GetImageView() { return image_; } |
| 43 | 54 |
| 44 protected: | 55 protected: |
| 45 static constexpr int kOpenTimeMS = 150; | 56 static constexpr int kOpenTimeMS = 150; |
| 46 | 57 |
| 47 views::ImageView* image() { return image_; } | 58 views::ImageView* image() { return image_; } |
| 48 const views::ImageView* image() const { return image_; } | 59 const views::ImageView* image() const { return image_; } |
| 49 views::Label* label() { return label_; } | 60 views::Label* label() { return label_; } |
| 50 const views::Label* label() const { return label_; } | 61 const views::Label* label() const { return label_; } |
| 62 const views::InkDropContainerView* ink_drop_container() const { |
| 63 return ink_drop_container_; |
| 64 } |
| 51 | 65 |
| 52 void set_next_element_interior_padding(int padding) { | 66 void set_next_element_interior_padding(int padding) { |
| 53 next_element_interior_padding_ = padding; | 67 next_element_interior_padding_ = padding; |
| 54 } | 68 } |
| 55 | 69 |
| 56 // Gets the color for displaying text. | 70 // Gets the color for displaying text. |
| 57 virtual SkColor GetTextColor() const = 0; | 71 virtual SkColor GetTextColor() const = 0; |
| 58 | 72 |
| 59 // Returns true when the label should be visible. | 73 // Returns true when the label should be visible. |
| 60 virtual bool ShouldShowLabel() const; | 74 virtual bool ShouldShowLabel() const; |
| 61 | 75 |
| 62 // Returns a multiplier used to calculate the actual width of the view based | 76 // Returns a multiplier used to calculate the actual width of the view based |
| 63 // on its desired width. This ranges from 0 for a zero-width view to 1 for a | 77 // on its desired width. This ranges from 0 for a zero-width view to 1 for a |
| 64 // full-width view and can be used to animate the width of the view. | 78 // full-width view and can be used to animate the width of the view. |
| 65 virtual double WidthMultiplier() const; | 79 virtual double WidthMultiplier() const; |
| 66 | 80 |
| 67 // Returns true when animation is in progress and is shrinking. | 81 // Returns true when animation is in progress and is shrinking. |
| 68 virtual bool IsShrinking() const; | 82 virtual bool IsShrinking() const; |
| 69 | 83 |
| 70 // The view has been activated by a user gesture such as spacebar. Returns | 84 // The view has been activated by a user gesture such as spacebar. Returns |
| 71 // true if some handling was performed. | 85 // true if some handling was performed. |
| 72 virtual bool OnActivate(const ui::Event& event); | 86 virtual bool OnActivate(const ui::Event& event); |
| 73 | 87 |
| 88 // Returns true if the bubble anchored to the icon is shown. This is to |
| 89 // prevent the bubble from reshowing on a mouse release. |
| 90 virtual bool IsBubbleShown() const; |
| 91 |
| 74 // views::InkDropHostView: | 92 // views::InkDropHostView: |
| 75 gfx::Size GetPreferredSize() const override; | 93 gfx::Size GetPreferredSize() const override; |
| 76 void Layout() override; | 94 void Layout() override; |
| 95 bool OnMousePressed(const ui::MouseEvent& event) override; |
| 96 void OnGestureEvent(ui::GestureEvent* event) override; |
| 77 bool OnKeyPressed(const ui::KeyEvent& event) override; | 97 bool OnKeyPressed(const ui::KeyEvent& event) override; |
| 78 bool OnKeyReleased(const ui::KeyEvent& event) override; | 98 bool OnKeyReleased(const ui::KeyEvent& event) override; |
| 79 void GetAccessibleNodeData(ui::AXNodeData* node_data) override; | 99 void GetAccessibleNodeData(ui::AXNodeData* node_data) override; |
| 80 void OnNativeThemeChanged(const ui::NativeTheme* native_theme) override; | 100 void OnNativeThemeChanged(const ui::NativeTheme* native_theme) override; |
| 81 void AddInkDropLayer(ui::Layer* ink_drop_layer) override; | 101 void AddInkDropLayer(ui::Layer* ink_drop_layer) override; |
| 82 void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override; | 102 void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override; |
| 103 std::unique_ptr<views::InkDrop> CreateInkDrop() override; |
| 83 std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight() | 104 std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight() |
| 84 const override; | 105 const override; |
| 106 std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override; |
| 85 SkColor GetInkDropBaseColor() const override; | 107 SkColor GetInkDropBaseColor() const override; |
| 86 | 108 |
| 109 // views::CustomButton: |
| 110 bool IsTriggerableEvent(const ui::Event& event) override; |
| 111 void OnClickCanceled(const ui::Event& event) override; |
| 112 |
| 113 // views::WidgetObserver: |
| 114 void OnWidgetDestroying(views::Widget* widget) override; |
| 115 void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override; |
| 116 |
| 87 const gfx::FontList& font_list() const { return label_->font_list(); } | 117 const gfx::FontList& font_list() const { return label_->font_list(); } |
| 88 | 118 |
| 89 SkColor GetParentBackgroundColor() const; | 119 SkColor GetParentBackgroundColor() const; |
| 90 | 120 |
| 91 gfx::Size GetSizeForLabelWidth(int label_width) const; | 121 gfx::Size GetSizeForLabelWidth(int label_width) const; |
| 92 | 122 |
| 123 // Returns the maximum size for the label width. The value ignores |
| 124 // WidthMultiplier(). |
| 125 gfx::Size GetMaxSizeForLabelWidth(int label_width) const; |
| 126 |
| 93 private: | 127 private: |
| 128 // A view that draws the separator. |
| 129 class SeparatorView : public views::View { |
| 130 public: |
| 131 explicit SeparatorView(IconLabelBubbleView* owner); |
| 132 |
| 133 // views::View: |
| 134 void OnPaint(gfx::Canvas* canvas) override; |
| 135 bool CanProcessEventsWithinSubtree() const override; |
| 136 |
| 137 // Updates the opacity based on the ink drop's state. |
| 138 void UpdateOpacity(); |
| 139 |
| 140 private: |
| 141 // Weak. |
| 142 IconLabelBubbleView* owner_; |
| 143 }; |
| 144 |
| 94 // Amount of padding from the leading edge of the view to the leading edge of | 145 // Amount of padding from the leading edge of the view to the leading edge of |
| 95 // the image, and from the trailing edge of the label (or image, if the label | 146 // the image, and from the trailing edge of the label (or image, if the label |
| 96 // is invisible) to the trailing edge of the view. | 147 // is invisible) to the trailing edge of the view. |
| 97 int GetOuterPadding() const; | 148 int GetOuterPadding() const; |
| 98 | 149 |
| 99 // Spacing between the image and the label. | 150 // Spacing between the image and the label. |
| 100 int GetInternalSpacing() const; | 151 int GetInternalSpacing() const; |
| 101 | 152 |
| 102 // Padding after the separator. | 153 // Padding after the separator. |
| 103 int GetPostSeparatorPadding() const; | 154 int GetPostSeparatorPadding() const; |
| 104 | 155 |
| 105 float GetScaleFactor() const; | 156 float GetScaleFactor() const; |
| 106 | 157 |
| 107 // views::View: | 158 // views::View: |
| 108 const char* GetClassName() const override; | 159 const char* GetClassName() const override; |
| 109 void OnPaint(gfx::Canvas* canvas) override; | |
| 110 | 160 |
| 111 // The contents of the bubble. | 161 // The contents of the bubble. |
| 112 views::ImageView* image_; | 162 views::ImageView* image_; |
| 113 views::Label* label_; | 163 views::Label* label_; |
| 164 views::InkDropContainerView* ink_drop_container_; |
| 165 std::unique_ptr<SeparatorView> separator_view_; |
| 114 | 166 |
| 115 // The padding of the element that will be displayed after |this|. This value | 167 // The padding of the element that will be displayed after |this|. This value |
| 116 // is relevant for calculating the amount of space to reserve after the | 168 // is relevant for calculating the amount of space to reserve after the |
| 117 // separator. | 169 // separator. |
| 118 int next_element_interior_padding_ = 0; | 170 int next_element_interior_padding_ = 0; |
| 119 | 171 |
| 172 // This is used to check if the bubble was showing in the last mouse press |
| 173 // event. If this is true then the IsTriggerableEvent() will return false to |
| 174 // prevent the bubble from reshowing. This flag is necessary because the |
| 175 // bubble gets dismissed before the button handles the mouse release event. |
| 176 bool suppress_button_release_; |
| 177 |
| 120 DISALLOW_COPY_AND_ASSIGN(IconLabelBubbleView); | 178 DISALLOW_COPY_AND_ASSIGN(IconLabelBubbleView); |
| 121 }; | 179 }; |
| 122 | 180 |
| 123 #endif // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_ICON_LABEL_BUBBLE_VIEW_H_ | 181 #endif // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_ICON_LABEL_BUBBLE_VIEW_H_ |
| OLD | NEW |