1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Handles the visible notification (or balloons).
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_NOTIFICATIONS_BALLOON_H_
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_NOTIFICATIONS_BALLOON_H_
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/point.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/size.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Balloon;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BalloonCollection;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BalloonHost;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Notification;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SiteInstance;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Interface for a view that displays a balloon.
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BalloonView {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~BalloonView() { }
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Show the view on the screen.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Show(Balloon* balloon) = 0;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notify that the content of notification has chagned.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Update() = 0;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reposition the view to match the position of its balloon.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RepositionToBalloon() = 0;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the view.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Close(bool by_user) = 0;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The total size of the view.
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual gfx::Size GetSize() const = 0;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The host for the view's contents.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual BalloonHost* GetHost() const = 0;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Represents a Notification on the screen.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Balloon {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Balloon(const Notification& notification,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          Profile* profile,
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          BalloonCollection* collection);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~Balloon();
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const Notification& notification() const { return *notification_.get(); }
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile() const { return profile_; }
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point GetPosition() const {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return position_.Add(offset_);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPosition(const gfx::Point& upper_left, bool reposition);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const gfx::Point& offset() { return offset_;}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_offset(const gfx::Point& offset) { offset_ = offset; }
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void add_offset(const gfx::Point& offset) { offset_ = offset_.Add(offset); }
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const gfx::Size& content_size() const { return content_size_; }
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_content_size(const gfx::Size& size) { content_size_ = size; }
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  const BalloonCollection* collection() const { return collection_; }
723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const gfx::Size& min_scrollbar_size() const { return min_scrollbar_size_; }
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_min_scrollbar_size(const gfx::Size& size) {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    min_scrollbar_size_ = size;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Request a new content size for this balloon.  This will get passed
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the balloon collection for checking against available space and
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // min/max restrictions.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetContentPreferredSize(const gfx::Size& size);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Provides a view for this balloon.  Ownership transfers
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to this object.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_view(BalloonView* balloon_view);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the balloon view associated with the balloon.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BalloonView* view() const {
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return balloon_view_.get();
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the viewing size for the balloon (content + frame).
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size GetViewSize() const { return balloon_view_->GetSize(); }
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Shows the balloon.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Show();
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notify that the content of notification has changed.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Update(const Notification& notification);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Called when the balloon is clicked by the user.
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void OnClick();
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when the balloon is closed, either by user (through the UI)
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or by a script.
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnClose(bool by_user);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by script to cause the balloon to close.
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CloseByScript();
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Non-owned pointer to the profile.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The notification being shown in this balloon.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Notification> notification_;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The collection that this balloon belongs to.  Non-owned pointer.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BalloonCollection* collection_;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The actual UI element for the balloon.
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<BalloonView> balloon_view_;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Position and size of the balloon on the screen.
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point position_;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size content_size_;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Temporary offset for balloons that need to be positioned in a non-standard
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // position for keeping the close buttons under the mouse cursor.
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point offset_;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Smallest size for this balloon where scrollbars will be shown.
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size min_scrollbar_size_;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(Balloon);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_NOTIFICATIONS_BALLOON_H_
139