172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file.
44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Draws the view for the balloons.
64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_NOTIFICATIONS_BALLOON_VIEW_H_
84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_NOTIFICATIONS_BALLOON_VIEW_H_
94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/basictypes.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/task.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/notifications/balloon.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/notifications/balloon_view_host.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_delegate.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/path.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/point.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/size.h"
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/button/menu_button.h"
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/label.h"
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/menu/view_menu_delegate.h"
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/view.h"
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/widget/widget_delegate.h"
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views {
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ButtonListener;
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ImageButton;
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ImagePainter;
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass TextButton;
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass WidgetWin;
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Menu2;
354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}  // namespace views
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BalloonCollection;
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass NotificationDetails;
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass NotificationOptionsMenuModel;
404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass NotificationSource;
413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace ui {
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass SlideAnimation;
443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// A balloon view is the UI component for a desktop notification toasts.
474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// It draws a border, and within the border an HTML renderer.
484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BalloonViewImpl : public BalloonView,
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public views::View,
504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public views::ViewMenuDelegate,
514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public views::WidgetDelegate,
524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public views::ButtonListener,
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        public NotificationObserver,
543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                        public ui::AnimationDelegate {
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  explicit BalloonViewImpl(BalloonCollection* collection);
574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ~BalloonViewImpl();
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // BalloonView interface.
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Show(Balloon* balloon) OVERRIDE;
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Update() OVERRIDE;
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RepositionToBalloon() OVERRIDE;
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Close(bool by_user) OVERRIDE;
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual gfx::Size GetSize() const OVERRIDE;
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual BalloonHost* GetHost() const OVERRIDE;
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // views::View interface.
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual gfx::Size GetPreferredSize() OVERRIDE;
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // views::ViewMenuDelegate interface.
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE;
754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // views::WidgetDelegate interface.
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnDisplayChanged() OVERRIDE;
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnWorkAreaChanged() OVERRIDE;
794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // views::ButtonListener interface.
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ButtonPressed(
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      views::Button* sender, const views::Event&) OVERRIDE;
834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // NotificationObserver interface.
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void Observe(NotificationType type,
864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                       const NotificationSource& source,
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationDetails& details) OVERRIDE;
884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // ui::AnimationDelegate interface.
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE;
914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Launches the options menu at screen coordinates |pt|.
934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void RunOptionsMenu(const gfx::Point& pt);
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Initializes the options menu.
964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void CreateOptionsMenu();
974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Masks the contents to fit within the frame.
994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void GetContentsMask(const gfx::Rect& contents_rect, gfx::Path* path) const;
1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Masks the frame for the rounded corners of the shadow-bubble.
1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void GetFrameMask(const gfx::Rect&, gfx::Path* path) const;
1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Adjust the contents window size to be appropriate for the frame.
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SizeContentsWindow();
1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Do the delayed close work.
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void DelayedClose(bool by_user);
1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The height of the balloon's shelf.
1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The shelf is where is close button is located.
1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetShelfHeight() const;
1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The height of the part of the frame around the balloon.
1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetBalloonFrameHeight() const;
1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetTotalWidth() const;
1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int GetTotalHeight() const;
1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect GetCloseButtonBounds() const;
1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect GetOptionsButtonBounds() const;
1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect GetLabelBounds() const;
1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Where the balloon contents should be placed with respect to the top left
1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // of the frame.
1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Point GetContentsOffset() const;
1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Where the balloon contents should be in screen coordinates.
1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect GetContentsRectangle() const;
1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Non-owned pointer to the balloon which owns this object.
1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Balloon* balloon_;
1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Non-owned pointer to the balloon collection this is a part of.
1354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BalloonCollection* collection_;
1364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The window that contains the frame of the notification.
1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Pointer owned by the View subclass.
1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Widget* frame_container_;
1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The window that contains the contents of the notification.
1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Pointer owned by the View subclass.
1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Widget* html_container_;
1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The renderer of the HTML contents.
1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<BalloonViewHost> html_contents_;
1474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The following factory is used to call methods at a later time.
1494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ScopedRunnableMethodFactory<BalloonViewImpl> method_factory_;
1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Pointer to sub-view is owned by the View sub-class.
1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::ImageButton* close_button_;
1534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Pointer to sub-view is owned by View class.
1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Label* source_label_;
1564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // An animation to move the balloon on the screen as its position changes.
1583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_ptr<ui::SlideAnimation> animation_;
1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect anim_frame_start_;
1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect anim_frame_end_;
1614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The options menu.
1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<NotificationOptionsMenuModel> options_menu_model_;
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<views::Menu2> options_menu_menu_;
1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::MenuButton* options_menu_button_;
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  NotificationRegistrar notification_registrar_;
1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(BalloonViewImpl);
1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif  // CHROME_BROWSER_UI_VIEWS_NOTIFICATIONS_BALLOON_VIEW_H_
173