1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Draws the view for the balloons. 6 7#ifndef CHROME_BROWSER_UI_VIEWS_NOTIFICATIONS_BALLOON_VIEW_H_ 8#define CHROME_BROWSER_UI_VIEWS_NOTIFICATIONS_BALLOON_VIEW_H_ 9#pragma once 10 11#include "base/basictypes.h" 12#include "base/memory/scoped_ptr.h" 13#include "base/task.h" 14#include "chrome/browser/notifications/balloon.h" 15#include "chrome/browser/ui/views/notifications/balloon_view_host.h" 16#include "content/common/notification_registrar.h" 17#include "ui/base/animation/animation_delegate.h" 18#include "ui/gfx/path.h" 19#include "ui/gfx/point.h" 20#include "ui/gfx/rect.h" 21#include "ui/gfx/size.h" 22#include "views/controls/button/menu_button.h" 23#include "views/controls/label.h" 24#include "views/controls/menu/view_menu_delegate.h" 25#include "views/view.h" 26#include "views/widget/widget_delegate.h" 27 28namespace views { 29class ButtonListener; 30class ImageButton; 31class ImagePainter; 32class TextButton; 33class WidgetWin; 34class Menu2; 35} // namespace views 36 37class BalloonCollection; 38class NotificationDetails; 39class NotificationOptionsMenuModel; 40class NotificationSource; 41 42namespace ui { 43class SlideAnimation; 44} 45 46// A balloon view is the UI component for a desktop notification toasts. 47// It draws a border, and within the border an HTML renderer. 48class BalloonViewImpl : public BalloonView, 49 public views::View, 50 public views::ViewMenuDelegate, 51 public views::WidgetDelegate, 52 public views::ButtonListener, 53 public NotificationObserver, 54 public ui::AnimationDelegate { 55 public: 56 explicit BalloonViewImpl(BalloonCollection* collection); 57 ~BalloonViewImpl(); 58 59 // BalloonView interface. 60 virtual void Show(Balloon* balloon) OVERRIDE; 61 virtual void Update() OVERRIDE; 62 virtual void RepositionToBalloon() OVERRIDE; 63 virtual void Close(bool by_user) OVERRIDE; 64 virtual gfx::Size GetSize() const OVERRIDE; 65 virtual BalloonHost* GetHost() const OVERRIDE; 66 67 private: 68 // views::View interface. 69 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 70 virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; 71 virtual gfx::Size GetPreferredSize() OVERRIDE; 72 73 // views::ViewMenuDelegate interface. 74 virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE; 75 76 // views::WidgetDelegate interface. 77 virtual void OnDisplayChanged() OVERRIDE; 78 virtual void OnWorkAreaChanged() OVERRIDE; 79 80 // views::ButtonListener interface. 81 virtual void ButtonPressed( 82 views::Button* sender, const views::Event&) OVERRIDE; 83 84 // NotificationObserver interface. 85 virtual void Observe(NotificationType type, 86 const NotificationSource& source, 87 const NotificationDetails& details) OVERRIDE; 88 89 // ui::AnimationDelegate interface. 90 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; 91 92 // Launches the options menu at screen coordinates |pt|. 93 void RunOptionsMenu(const gfx::Point& pt); 94 95 // Initializes the options menu. 96 void CreateOptionsMenu(); 97 98 // Masks the contents to fit within the frame. 99 void GetContentsMask(const gfx::Rect& contents_rect, gfx::Path* path) const; 100 101 // Masks the frame for the rounded corners of the shadow-bubble. 102 void GetFrameMask(const gfx::Rect&, gfx::Path* path) const; 103 104 // Adjust the contents window size to be appropriate for the frame. 105 void SizeContentsWindow(); 106 107 // Do the delayed close work. 108 void DelayedClose(bool by_user); 109 110 // The height of the balloon's shelf. 111 // The shelf is where is close button is located. 112 int GetShelfHeight() const; 113 114 // The height of the part of the frame around the balloon. 115 int GetBalloonFrameHeight() const; 116 117 int GetTotalWidth() const; 118 int GetTotalHeight() const; 119 120 gfx::Rect GetCloseButtonBounds() const; 121 gfx::Rect GetOptionsButtonBounds() const; 122 gfx::Rect GetLabelBounds() const; 123 124 // Where the balloon contents should be placed with respect to the top left 125 // of the frame. 126 gfx::Point GetContentsOffset() const; 127 128 // Where the balloon contents should be in screen coordinates. 129 gfx::Rect GetContentsRectangle() const; 130 131 // Non-owned pointer to the balloon which owns this object. 132 Balloon* balloon_; 133 134 // Non-owned pointer to the balloon collection this is a part of. 135 BalloonCollection* collection_; 136 137 // The window that contains the frame of the notification. 138 // Pointer owned by the View subclass. 139 views::Widget* frame_container_; 140 141 // The window that contains the contents of the notification. 142 // Pointer owned by the View subclass. 143 views::Widget* html_container_; 144 145 // The renderer of the HTML contents. 146 scoped_ptr<BalloonViewHost> html_contents_; 147 148 // The following factory is used to call methods at a later time. 149 ScopedRunnableMethodFactory<BalloonViewImpl> method_factory_; 150 151 // Pointer to sub-view is owned by the View sub-class. 152 views::ImageButton* close_button_; 153 154 // Pointer to sub-view is owned by View class. 155 views::Label* source_label_; 156 157 // An animation to move the balloon on the screen as its position changes. 158 scoped_ptr<ui::SlideAnimation> animation_; 159 gfx::Rect anim_frame_start_; 160 gfx::Rect anim_frame_end_; 161 162 // The options menu. 163 scoped_ptr<NotificationOptionsMenuModel> options_menu_model_; 164 scoped_ptr<views::Menu2> options_menu_menu_; 165 views::MenuButton* options_menu_button_; 166 167 NotificationRegistrar notification_registrar_; 168 169 DISALLOW_COPY_AND_ASSIGN(BalloonViewImpl); 170}; 171 172#endif // CHROME_BROWSER_UI_VIEWS_NOTIFICATIONS_BALLOON_VIEW_H_ 173