Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / gtk / avatar_menu_bubble_gtk.h
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_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 AvatarMenu;
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 AvatarMenuObserver,
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   // AvatarMenuObserver implementation.
40   virtual void OnAvatarMenuChanged(
41       AvatarMenu* avatar_menu) 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<AvatarMenu> avatar_menu_;
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_