1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 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#include "chrome/browser/notifications/balloon.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/notifications/balloon_collection.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/notifications/notification.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/site_instance.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/size.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBalloon::Balloon(const Notification& notification, Profile* profile,
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 BalloonCollection* collection)
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : profile_(profile),
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      notification_(new Notification(notification)),
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      collection_(collection) {
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBalloon::~Balloon() {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Balloon::SetPosition(const gfx::Point& upper_left, bool reposition) {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  position_ = upper_left;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (reposition && balloon_view_.get())
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    balloon_view_->RepositionToBalloon();
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Balloon::SetContentPreferredSize(const gfx::Size& size) {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  collection_->ResizeBalloon(this, size);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Balloon::set_view(BalloonView* balloon_view) {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  balloon_view_.reset(balloon_view);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Balloon::Show() {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  notification_->Display();
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (balloon_view_.get()) {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    balloon_view_->Show(this);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    balloon_view_->RepositionToBalloon();
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Balloon::Update(const Notification& notification) {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  notification_->Close(false);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  notification_.reset(new Notification(notification));
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  notification_->Display();
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (balloon_view_.get()) {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    balloon_view_->Update();
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid Balloon::OnClick() {
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  notification_->Click();
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Balloon::OnClose(bool by_user) {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  notification_->Close(by_user);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  collection_->OnBalloonClosed(this);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid Balloon::CloseByScript() {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A user-initiated close begins with the view and then closes this object;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // we simulate that with a script-initiated close but pass |by_user|=false.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(balloon_view_.get());
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  balloon_view_->Close(false);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
70