172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian 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#include "chrome/browser/notifications/balloon_collection_impl.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/notifications/balloon.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/notifications/balloon_view.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBalloon* BalloonCollectionImpl::MakeBalloon(const Notification& notification,
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            Profile* profile) {
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Balloon* balloon = new Balloon(notification, profile, this);
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  balloon->set_view(new BalloonViewImpl(this));
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size size(layout_.min_balloon_width(), layout_.min_balloon_height());
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  balloon->set_content_size(size);
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return balloon;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint BalloonCollectionImpl::Layout::InterBalloonMargin() const {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return 3;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint BalloonCollectionImpl::Layout::HorizontalEdgeMargin() const {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return 2;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint BalloonCollectionImpl::Layout::VerticalEdgeMargin() const {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return 0;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BalloonCollectionImpl::PositionBalloons(bool reposition) {
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PositionBalloonsInternal(reposition);
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BalloonCollectionImpl::DidProcessMessage(const MSG& msg) {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (msg.message) {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WM_MOUSEMOVE:
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WM_MOUSELEAVE:
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case WM_NCMOUSELEAVE:
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HandleMouseMoveEvent();
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BalloonCollectionImpl::IsCursorInBalloonCollection() const {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DWORD pos = GetMessagePos();
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point cursor(pos);
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return GetBalloonsBoundingBox().Contains(cursor);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenvoid BalloonCollectionImpl::SetPositionPreference(
533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    PositionPreference position) {
543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (position == DEFAULT_POSITION)
553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    position = LOWER_RIGHT;
563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // All positioning schemes are vertical, and windows
583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // uses the normal screen orientation.
593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (position == UPPER_RIGHT)
603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    layout_.set_placement(Layout::VERTICALLY_FROM_TOP_RIGHT);
613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  else if (position == UPPER_LEFT)
623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    layout_.set_placement(Layout::VERTICALLY_FROM_TOP_LEFT);
633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  else if (position == LOWER_LEFT)
643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    layout_.set_placement(Layout::VERTICALLY_FROM_BOTTOM_LEFT);
653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  else if (position == LOWER_RIGHT)
663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    layout_.set_placement(Layout::VERTICALLY_FROM_BOTTOM_RIGHT);
673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  else
683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    NOTREACHED();
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  PositionBalloons(true);
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBalloonCollection* BalloonCollection::Create() {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new BalloonCollectionImpl();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77