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