Home | History | Annotate | Download | only in gtk
      1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_UI_GTK_AVATAR_MENU_BUBBLE_GTK_H_
      6 #define CHROME_BROWSER_UI_GTK_AVATAR_MENU_BUBBLE_GTK_H_
      7 
      8 #include <gtk/gtk.h>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/compiler_specific.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/scoped_vector.h"
     14 #include "chrome/browser/profiles/avatar_menu_model_observer.h"
     15 #include "chrome/browser/ui/gtk/avatar_menu_item_gtk.h"
     16 #include "chrome/browser/ui/gtk/bubble/bubble_gtk.h"
     17 #include "ui/base/gtk/gtk_signal.h"
     18 
     19 class AvatarMenuModel;
     20 class Browser;
     21 class GtkThemeService;
     22 
     23 // This bubble is displayed when the user clicks on the avatar button.
     24 // It displays a list of profiles and allows users to switch between profiles.
     25 class AvatarMenuBubbleGtk : public BubbleDelegateGtk,
     26                             public AvatarMenuModelObserver,
     27                             public AvatarMenuItemGtk::Delegate {
     28  public:
     29   AvatarMenuBubbleGtk(Browser* browser,
     30                       GtkWidget* anchor,
     31                       BubbleGtk::FrameStyle arrow,
     32                       const gfx::Rect* rect);
     33   virtual ~AvatarMenuBubbleGtk();
     34 
     35   // BubbleDelegateGtk implementation.
     36   virtual void BubbleClosing(BubbleGtk* bubble,
     37                              bool closed_by_escape) OVERRIDE;
     38 
     39   // AvatarMenuModelObserver implementation.
     40   virtual void OnAvatarMenuModelChanged(
     41       AvatarMenuModel* avatar_menu_model) OVERRIDE;
     42 
     43   // AvatarMenuItemGtk::Delegate implementation.
     44   virtual void OpenProfile(size_t profile_index) OVERRIDE;
     45   virtual void EditProfile(size_t profile_index) OVERRIDE;
     46 
     47  private:
     48   // Notified when |contents_| is destroyed so we can delete our instance.
     49   CHROMEGTK_CALLBACK_0(AvatarMenuBubbleGtk, void, OnDestroy);
     50   CHROMEGTK_CALLBACK_1(AvatarMenuBubbleGtk, void, OnSizeRequest,
     51                        GtkRequisition*);
     52   CHROMEGTK_CALLBACK_0(AvatarMenuBubbleGtk, void, OnNewProfileLinkClicked);
     53   CHROMEGTK_CALLBACK_0(AvatarMenuBubbleGtk, void, OnSwitchProfileLinkClicked);
     54 
     55   // Create all widgets in this bubble.
     56   void InitContents();
     57 
     58   // Create the menu contents for a normal profile.
     59   void InitMenuContents();
     60 
     61   // Create the managed user specific contents of the menu.
     62   void InitManagedUserContents();
     63 
     64   // Close the bubble and set bubble_ to NULL.
     65   void CloseBubble();
     66 
     67   // A model of all the profile information to be displayed in the menu.
     68   scoped_ptr<AvatarMenuModel> avatar_menu_model_;
     69 
     70   // A weak pointer to the parent widget of all widgets in the bubble.
     71   GtkWidget* contents_;
     72 
     73   // A weak pointer to the only child widget of |contents_| which contains all
     74   // widgets in the bubble.
     75   GtkWidget* inner_contents_;
     76 
     77   // A weak pointer to the bubble window.
     78   BubbleGtk* bubble_;
     79 
     80   // A weak pointer to the theme service.
     81   GtkThemeService* theme_service_;
     82 
     83   // A weak pointer to the new profile link to keep its theme information
     84   // updated.
     85   GtkWidget* new_profile_link_;
     86 
     87   // A vector of all profile items in the menu.
     88   ScopedVector<AvatarMenuItemGtk> items_;
     89 
     90   // The minimum width to display the bubble. This is used to prevent the bubble
     91   // from automatically reducing its size when hovering over a profile item.
     92   int minimum_width_;
     93 
     94   // Is set to true if the managed user has clicked on Switch Users.
     95   bool switching_;
     96 
     97   DISALLOW_COPY_AND_ASSIGN(AvatarMenuBubbleGtk);
     98 };
     99 
    100 #endif  // CHROME_BROWSER_UI_GTK_AVATAR_MENU_BUBBLE_GTK_H_
    101