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 // Handles the visible notification (or balloons). 6 7 #ifndef CHROME_BROWSER_NOTIFICATIONS_BALLOON_H_ 8 #define CHROME_BROWSER_NOTIFICATIONS_BALLOON_H_ 9 10 #include "base/basictypes.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "ui/gfx/point.h" 13 #include "ui/gfx/rect.h" 14 #include "ui/gfx/size.h" 15 16 class Balloon; 17 class BalloonCollection; 18 class BalloonHost; 19 class Notification; 20 class Profile; 21 22 // Interface for a view that displays a balloon. 23 class BalloonView { 24 public: ~BalloonView()25 virtual ~BalloonView() {} 26 27 // Show the view on the screen. 28 virtual void Show(Balloon* balloon) = 0; 29 30 // Notify that the content of notification has chagned. 31 virtual void Update() = 0; 32 33 // Reposition the view to match the position of its balloon. 34 virtual void RepositionToBalloon() = 0; 35 36 // Close the view. 37 virtual void Close(bool by_user) = 0; 38 39 // The total size of the view. 40 virtual gfx::Size GetSize() const = 0; 41 42 // The host for the view's contents. May be NULL if an implementation does 43 // not have a host associated with it (i.e. does not do html rendering). 44 virtual BalloonHost* GetHost() const = 0; 45 46 // Returns the horizontal margin the content is inset by. 47 static int GetHorizontalMargin(); 48 }; 49 50 // Represents a Notification on the screen. 51 class Balloon { 52 public: 53 Balloon(const Notification& notification, 54 Profile* profile, 55 BalloonCollection* collection); 56 virtual ~Balloon(); 57 notification()58 const Notification& notification() const { return *notification_.get(); } profile()59 Profile* profile() const { return profile_; } 60 GetPosition()61 gfx::Point GetPosition() const { 62 return position_ + offset_; 63 } 64 void SetPosition(const gfx::Point& upper_left, bool reposition); 65 offset()66 const gfx::Vector2d& offset() const { return offset_; } set_offset(const gfx::Vector2d & offset)67 void set_offset(const gfx::Vector2d& offset) { offset_ = offset; } add_offset(const gfx::Vector2d & offset)68 void add_offset(const gfx::Vector2d& offset) { offset_.Add(offset); } 69 content_size()70 const gfx::Size& content_size() const { return content_size_; } set_content_size(const gfx::Size & size)71 void set_content_size(const gfx::Size& size) { content_size_ = size; } 72 collection()73 const BalloonCollection* collection() const { return collection_; } 74 min_scrollbar_size()75 const gfx::Size& min_scrollbar_size() const { return min_scrollbar_size_; } set_min_scrollbar_size(const gfx::Size & size)76 void set_min_scrollbar_size(const gfx::Size& size) { 77 min_scrollbar_size_ = size; 78 } 79 80 // Request a new content size for this balloon. This will get passed 81 // to the balloon collection for checking against available space and 82 // min/max restrictions. 83 void ResizeDueToAutoResize(const gfx::Size& size); 84 85 // Provides a view for this balloon. Ownership transfers to this object. 86 void set_view(BalloonView* balloon_view); 87 88 // Returns the balloon view associated with the balloon. balloon_view()89 BalloonView* balloon_view() const { return balloon_view_.get(); } 90 91 // Returns the viewing size for the balloon (content + frame). GetViewSize()92 gfx::Size GetViewSize() const { return balloon_view_->GetSize(); } 93 94 // Shows the balloon. 95 virtual void Show(); 96 97 // Notify that the content of notification has changed. 98 virtual void Update(const Notification& notification); 99 100 // Called when the balloon is clicked by the user. 101 virtual void OnClick(); 102 103 // Called when the user clicks a button in the balloon. 104 virtual void OnButtonClick(int button_index); 105 106 // Called when the balloon is closed, either by user (through the UI) 107 // or by a script. 108 virtual void OnClose(bool by_user); 109 110 // Called by script to cause the balloon to close. 111 virtual void CloseByScript(); 112 113 // Returns the ID of the extension that created this balloon's notification. 114 std::string GetExtensionId(); 115 116 private: 117 // Non-owned pointer to the profile. 118 Profile* profile_; 119 120 // The notification being shown in this balloon. 121 scoped_ptr<Notification> notification_; 122 123 // The collection that this balloon belongs to. Non-owned pointer. 124 BalloonCollection* collection_; 125 126 // The actual UI element for the balloon. 127 scoped_ptr<BalloonView> balloon_view_; 128 129 // Position and size of the balloon on the screen. 130 gfx::Point position_; 131 gfx::Size content_size_; 132 133 // Temporary offset for balloons that need to be positioned in a non-standard 134 // position for keeping the close buttons under the mouse cursor. 135 gfx::Vector2d offset_; 136 137 // Smallest size for this balloon where scrollbars will be shown. 138 gfx::Size min_scrollbar_size_; 139 140 DISALLOW_COPY_AND_ASSIGN(Balloon); 141 }; 142 143 #endif // CHROME_BROWSER_NOTIFICATIONS_BALLOON_H_ 144