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