- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / gtk / avatar_menu_button_gtk.cc
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 #include "chrome/browser/ui/gtk/avatar_menu_button_gtk.h"
6
7 #include "base/i18n/rtl.h"
8 #include "chrome/app/chrome_command_ids.h"
9 #include "chrome/browser/command_updater.h"
10 #include "chrome/browser/profiles/profile_metrics.h"
11 #include "chrome/browser/profiles/profile_info_util.h"
12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/browser_commands.h"
14 #include "chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h"
15 #include "chrome/browser/ui/gtk/bubble/bubble_gtk.h"
16 #include "ui/gfx/gtk_util.h"
17
18 AvatarMenuButtonGtk::AvatarMenuButtonGtk(Browser* browser)
19     : image_(NULL),
20       browser_(browser),
21       frame_style_(BubbleGtk::ANCHOR_TOP_LEFT),
22       is_gaia_picture_(false),
23       old_height_(0) {
24   GtkWidget* event_box = gtk_event_box_new();
25   image_ = gtk_image_new();
26   gtk_container_add(GTK_CONTAINER(event_box), image_);
27
28   g_signal_connect(event_box, "button-press-event",
29                    G_CALLBACK(OnButtonPressedThunk), this);
30   g_signal_connect(event_box, "size-allocate",
31                    G_CALLBACK(OnSizeAllocateThunk), this);
32
33   gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box), FALSE);
34
35   widget_.Own(event_box);
36 }
37
38 AvatarMenuButtonGtk::~AvatarMenuButtonGtk() {
39 }
40
41 void AvatarMenuButtonGtk::SetIcon(const gfx::Image& image,
42                                   bool is_gaia_picture) {
43   icon_.reset(new gfx::Image(image));
44   is_gaia_picture_ = is_gaia_picture;
45   UpdateButtonIcon();
46 }
47
48 gboolean AvatarMenuButtonGtk::OnButtonPressed(GtkWidget* widget,
49                                               GdkEventButton* event) {
50   if (event->button != 1)
51     return FALSE;
52
53   ShowAvatarBubble();
54   ProfileMetrics::LogProfileOpenMethod(ProfileMetrics::ICON_AVATAR_BUBBLE);
55   return TRUE;
56 }
57
58 void AvatarMenuButtonGtk::OnSizeAllocate(GtkWidget* widget,
59                                          GtkAllocation* allocation) {
60   if (allocation->height != old_height_)
61     UpdateButtonIcon();
62 }
63
64 void AvatarMenuButtonGtk::ShowAvatarBubble() {
65   DCHECK(chrome::IsCommandEnabled(browser_, IDC_SHOW_AVATAR_MENU));
66   // Only show the avatar bubble if the avatar button is in the title bar.
67   if (gtk_widget_get_parent_window(widget_.get()))
68     new AvatarMenuBubbleGtk(browser_, widget_.get(), frame_style_, NULL);
69 }
70
71 void AvatarMenuButtonGtk::UpdateButtonIcon() {
72   if (!icon_.get())
73     return;
74
75   GtkAllocation allocation;
76   gtk_widget_get_allocation(widget(), &allocation);
77   old_height_ = allocation.height;
78
79   // GAIA images are square; use kWidth for both destination height and width
80   // since old_height_ is often not usable (typically a value of 1 which, after
81   // subtracting border, tries to resize the profile image to a size of -1).
82   gfx::Image icon = profiles::GetAvatarIconForTitleBar(
83       *icon_, is_gaia_picture_,
84       profiles::kAvatarIconWidth, profiles::kAvatarIconWidth);
85   gtk_image_set_from_pixbuf(GTK_IMAGE(image_), icon.ToGdkPixbuf());
86   gtk_misc_set_alignment(GTK_MISC(image_), 0.0, 1.0);
87   gtk_widget_set_size_request(image_, -1, 0);
88 }