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_GTK_NOTIFICATIONS_BALLOON_VIEW_GTK_H_
      8 #define CHROME_BROWSER_UI_GTK_NOTIFICATIONS_BALLOON_VIEW_GTK_H_
      9 #pragma once
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "chrome/browser/notifications/balloon.h"
     14 #include "chrome/browser/ui/gtk/menu_gtk.h"
     15 #include "chrome/browser/ui/gtk/notifications/balloon_view_host_gtk.h"
     16 #include "content/common/notification_observer.h"
     17 #include "content/common/notification_registrar.h"
     18 #include "ui/base/animation/animation_delegate.h"
     19 #include "ui/base/gtk/gtk_signal.h"
     20 #include "ui/gfx/point.h"
     21 #include "ui/gfx/rect.h"
     22 #include "ui/gfx/size.h"
     23 
     24 class BalloonCollection;
     25 class CustomDrawButton;
     26 class GtkThemeService;
     27 class MenuGtk;
     28 class NotificationDetails;
     29 class NotificationOptionsMenuModel;
     30 class NotificationSource;
     31 
     32 namespace ui {
     33 class SlideAnimation;
     34 }
     35 
     36 // A balloon view is the UI component for desktop notification toasts.
     37 // It draws a border, and within the border an HTML renderer.
     38 class BalloonViewImpl : public BalloonView,
     39                         public MenuGtk::Delegate,
     40                         public NotificationObserver,
     41                         public ui::AnimationDelegate {
     42  public:
     43   explicit BalloonViewImpl(BalloonCollection* collection);
     44   virtual ~BalloonViewImpl();
     45 
     46   // BalloonView interface.
     47   virtual void Show(Balloon* balloon);
     48   virtual void Update();
     49   virtual void RepositionToBalloon();
     50   virtual void Close(bool by_user);
     51   virtual gfx::Size GetSize() const;
     52   virtual BalloonHost* GetHost() const;
     53 
     54   // MenuGtk::Delegate interface.
     55   virtual void StoppedShowing();
     56 
     57  private:
     58   // NotificationObserver interface.
     59   virtual void Observe(NotificationType type,
     60                        const NotificationSource& source,
     61                        const NotificationDetails& details);
     62 
     63   // ui::AnimationDelegate interface.
     64   virtual void AnimationProgressed(const ui::Animation* animation);
     65 
     66   // Do the delayed close work.  The balloon and all view components will be
     67   // destroyed at this time, so it shouldn't be called while still processing
     68   // an event that relies on them.
     69   void DelayedClose(bool by_user);
     70 
     71   // The height of the balloon's shelf.
     72   // The shelf is where is close button is located.
     73   int GetShelfHeight() const;
     74 
     75   // The width and height that the frame should be.  If the balloon inside
     76   // changes size, this will not be the same as the actual frame size until
     77   // RepositionToBalloon() has been called and the animation completes.
     78   int GetDesiredTotalWidth() const;
     79   int GetDesiredTotalHeight() const;
     80 
     81   // Where the balloon contents should be placed with respect to the top left
     82   // of the frame.
     83   gfx::Point GetContentsOffset() const;
     84 
     85   // Where the balloon contents should be in screen coordinates.
     86   gfx::Rect GetContentsRectangle() const;
     87 
     88   CHROMEGTK_CALLBACK_1(BalloonViewImpl, gboolean, OnContentsExpose,
     89                        GdkEventExpose*);
     90   CHROMEGTK_CALLBACK_0(BalloonViewImpl, void, OnCloseButton);
     91   CHROMEGTK_CALLBACK_1(BalloonViewImpl, gboolean, OnExpose, GdkEventExpose*);
     92   CHROMEGTK_CALLBACK_1(BalloonViewImpl, void, OnOptionsMenuButton,
     93                        GdkEventButton*);
     94   CHROMEGTK_CALLBACK_0(BalloonViewImpl, gboolean, OnDestroy);
     95 
     96   // Non-owned pointer to the balloon which owns this object.
     97   Balloon* balloon_;
     98 
     99   GtkThemeService* theme_service_;
    100 
    101   // The window that contains the frame of the notification.
    102   GtkWidget* frame_container_;
    103 
    104   // The widget that contains the shelf.
    105   GtkWidget* shelf_;
    106 
    107   // The hbox within the shelf that contains the buttons.
    108   GtkWidget* hbox_;
    109 
    110   // The window that contains the contents of the notification.
    111   GtkWidget* html_container_;
    112 
    113   // The renderer of the HTML contents.
    114   scoped_ptr<BalloonViewHost> html_contents_;
    115 
    116   // The following factory is used to call methods at a later time.
    117   ScopedRunnableMethodFactory<BalloonViewImpl> method_factory_;
    118 
    119   // Close button.
    120   scoped_ptr<CustomDrawButton> close_button_;
    121 
    122   // An animation to move the balloon on the screen as its position changes.
    123   scoped_ptr<ui::SlideAnimation> animation_;
    124   gfx::Rect anim_frame_start_;
    125   gfx::Rect anim_frame_end_;
    126 
    127   // The options menu.
    128   scoped_ptr<MenuGtk> options_menu_;
    129   scoped_ptr<NotificationOptionsMenuModel> options_menu_model_;
    130   // The button to open the options menu.
    131   scoped_ptr<CustomDrawButton> options_menu_button_;
    132 
    133   NotificationRegistrar notification_registrar_;
    134 
    135   // Is the menu currently showing?
    136   bool menu_showing_;
    137 
    138   // Is there a pending system-initiated close?
    139   bool pending_close_;
    140 
    141   DISALLOW_COPY_AND_ASSIGN(BalloonViewImpl);
    142 };
    143 
    144 #endif  // CHROME_BROWSER_UI_GTK_NOTIFICATIONS_BALLOON_VIEW_GTK_H_
    145