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