Home | History | Annotate | Download | only in notifications
      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 
     28 namespace views {
     29 class ButtonListener;
     30 class ImageButton;
     31 class ImagePainter;
     32 class TextButton;
     33 class WidgetWin;
     34 class Menu2;
     35 }  // namespace views
     36 
     37 class BalloonCollection;
     38 class NotificationDetails;
     39 class NotificationOptionsMenuModel;
     40 class NotificationSource;
     41 
     42 namespace ui {
     43 class 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.
     48 class 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