Index: chrome/browser/notifications/balloons.h |
diff --git a/chrome/browser/notifications/balloons.h b/chrome/browser/notifications/balloons.h |
new file mode 100755 |
index 0000000000000000000000000000000000000000..04575f0456f062cf2daa21d5ef84b895d1b9a356 |
--- /dev/null |
+++ b/chrome/browser/notifications/balloons.h |
@@ -0,0 +1,196 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Handles the visible notification (or balloons). |
+ |
+#ifndef CHROME_BROWSER_NOTIFICATIONS_BALLOONS_H_ |
+#define CHROME_BROWSER_NOTIFICATIONS_BALLOONS_H_ |
+ |
+#include <deque> |
+#include <vector> |
+ |
+#include "base/basictypes.h" |
+#include "base/gfx/point.h" |
+#include "base/gfx/rect.h" |
+#include "base/gfx/size.h" |
+#include "base/scoped_ptr.h" |
+#include "chrome/browser/notifications/notification.h" |
+ |
+class Balloon; |
+class BalloonView; |
+class Profile; |
+class SiteInstance; |
+ |
+class BalloonCloseListener { |
+ public: |
+ // Called when a balloon is closed. |
+ virtual void OnBalloonClosed(Balloon* source) = 0; |
+}; |
+ |
+class BalloonSpaceChangeListener { |
michaeln
2009/10/10 19:10:51
you probably want virtual empty dtor's on each of
|
+ public: |
+ // Called when there is more or less space for balloons due to |
+ // monitor size changes or balloons disappearing. |
+ virtual void OnBalloonSpaceChanged() = 0; |
+}; |
+ |
+class BalloonCollectionInterface { |
+ public: |
+ virtual ~BalloonCollectionInterface() {} |
+ |
+ // Adds a new balloon for the specified notification. |
+ virtual void Add(const Notification& notification, |
+ Profile* profile, |
+ SiteInstance* site_instance) = 0; |
+ |
+ // Is there room to add another notification? |
+ virtual bool HasSpace() const = 0; |
+}; |
+ |
+typedef std::deque<Balloon*> Balloons; |
+ |
+// Represents a Notification on the screen. |
+class Balloon { |
+ public: |
+ Balloon(const Notification& notification, |
+ Profile* profile, |
+ SiteInstance* site_instance, |
+ BalloonCloseListener* listener); |
+ ~Balloon(); |
+ |
+ const Notification& notification() const { |
+ return notification_; |
+ } |
+ |
+ Profile* profile() const { |
+ return profile_; |
+ } |
+ |
+ SiteInstance* site_instance() const { |
+ return site_instance_; |
+ } |
+ |
+ void SetPosition(const gfx::Point& upper_left, bool reposition); |
+ void SetSize(const gfx::Size& size); |
+ void Show(); |
+ void Close(); |
+ |
+ const gfx::Point& position() const; |
+ const gfx::Size& size() const; |
+ |
+ private: |
+ Profile* profile_; |
+ SiteInstance* site_instance_; |
+ Notification notification_; |
+ BalloonCloseListener* close_listener_; |
+ scoped_ptr<BalloonView> balloon_view_; |
+ gfx::Point position_; |
+ gfx::Size size_; |
+ DISALLOW_COPY_AND_ASSIGN(Balloon); |
+}; |
+ |
+class BalloonCollection : public BalloonCollectionInterface, |
+ public BalloonCloseListener { |
+ public: |
+ explicit BalloonCollection(); |
michaeln
2009/10/10 19:10:51
is explicit needed?
|
+ |
+ BalloonSpaceChangeListener* spaceChangeListener() { return listener_; } |
michaeln
2009/10/10 19:10:51
space_change_listener()
set_space_cache_listener(x
|
+ void set_spaceChangeListener(BalloonSpaceChangeListener* listener) { |
+ listener_ = listener; |
+ } |
+ |
+ // BalloonCollectionInterface overrides |
+ virtual void Add(const Notification& notification, |
+ Profile* profile, |
+ SiteInstance* site_instance); |
+ virtual void ShowAll(); |
+ virtual void HideAll(); |
+ virtual bool HasSpace() const; |
+ |
+ // BalloonCloseListener interface |
+ virtual void OnBalloonClosed(Balloon* source); |
+ |
+ protected: |
+ // Overridable by unit tests. |
+ virtual Balloon* MakeBalloon(const Notification& notification, |
+ Profile* profile, |
+ SiteInstance* site_instance) { |
+ return new Balloon(notification, profile, site_instance, this); |
+ } |
+ |
+ private: |
+ // The number of balloons being displayed. |
+ int count() const { return balloons_.size(); } |
+ |
+ // Calculates layout values for the balloons including |
+ // the scaling, the max/min sizes, and the upper left corner of each. |
+ class Layout { |
+ public: |
+ Layout(); |
+ |
+ // Refresh the work area and balloon placement. |
+ void OnDisplaySettingsChanged(); |
+ |
+ int min_balloon_width() const; |
+ int max_balloon_width() const; |
+ int min_balloon_height() const; |
+ int max_balloon_height() const; |
+ |
+ // Returns both the total length available and the maximum |
+ // allowed per balloon. |
+ // |
+ // The length may be a height or length depending on the way that |
+ // balloons are laid out. |
+ const void GetMaxLengths(int* max_balloon_length, int* total_length) const; |
+ |
+ // Scale the size to count in the system font factor. |
+ int ScaleSize(int size) const; |
+ |
+ // Refresh the cached values for work area and drawing metrics. |
+ // This is done automatically first time and the application should |
+ // call this method to re-acquire metrics after any |
+ // resolution or settings change. |
+ // |
+ // Return true if and only if a metric changed. |
+ bool RefreshSystemMetrics(); |
+ |
+ // Returns the starting value for NextUpperLeftPosition. |
+ gfx::Point GetStartPosition() const; |
+ |
+ // Compute the position for the next balloon. |
+ // Modifies origin. |
+ // Returns the position of the upper left coordinate for the given |
+ // balloon. |
+ gfx::Point NextPosition(const gfx::Size& balloon_size, |
+ gfx::Point* origin) const; |
+ |
+ private: |
+ enum Placement { |
+ HORIZONTALLY_FROM_BOTTOM_LEFT, |
+ HORIZONTALLY_FROM_BOTTOM_RIGHT, |
+ VERTICALLY_FROM_TOP_RIGHT, |
+ VERTICALLY_FROM_BOTTOM_RIGHT |
+ }; |
+ |
+ // Minimum and maximum size of balloon |
+ static const int kBalloonMinWidth = 300; |
+ static const int kBalloonMaxWidth = 300; |
+ static const int kBalloonMinHeight = 90; |
+ static const int kBalloonMaxHeight = 120; |
+ |
+ static Placement placement_; |
+ gfx::Rect work_area_; |
+ double font_scale_factor_; |
+ DISALLOW_COPY_AND_ASSIGN(Layout); |
+ }; |
+ |
+ // Non-owned pointer to an object listening for space changes. |
+ BalloonSpaceChangeListener* listener_; |
+ |
+ Balloons balloons_; |
+ Layout layout_; |
+ DISALLOW_COPY_AND_ASSIGN(BalloonCollection); |
+}; |
+ |
+#endif // CHROME_BROWSER_NOTIFICATIONS_BALLOONS_H_ |