summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/generated_resources.grd2
-rw-r--r--chrome/browser/profiles/avatar_menu_model.cc7
-rw-r--r--chrome/browser/profiles/avatar_menu_model.h4
-rw-r--r--chrome/browser/ui/gtk/avatar_menu_bubble_gtk.cc63
-rw-r--r--chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h5
-rw-r--r--chrome/browser/ui/gtk/browser_titlebar.cc14
6 files changed, 68 insertions, 27 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 3f1a699..f933a48 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -8292,7 +8292,7 @@ The following plug-in is unresponsive: <ph name="PLUGIN_NAME">$1
<!-- Managed User Avatar Menu -->
<message name="IDS_MANAGED_USER_INFO" desc="A text which explains that the user is managed by a custodian.">
- This user is managed by <ph name="CUSTODIAN_NAME">$1<ex>custodian@gmail.com</ex></ph>. Usage and history from this user may be tracked.
+ This user is managed by <ph name="CUSTODIAN_NAME">$1<ex>custodian@gmail.com</ex></ph>. Usage and history from this user may be viewed by the manager.
</message>
<message name="IDS_MANAGED_USER_AVATAR_LABEL" desc="A label for the managed user which is used in the avatar menu and as a label in the titlebar.">
Limited user
diff --git a/chrome/browser/profiles/avatar_menu_model.cc b/chrome/browser/profiles/avatar_menu_model.cc
index 8587b39..e79b00e 100644
--- a/chrome/browser/profiles/avatar_menu_model.cc
+++ b/chrome/browser/profiles/avatar_menu_model.cc
@@ -29,7 +29,9 @@
#include "content/public/browser/site_instance.h"
#include "google_apis/gaia/gaia_urls.h"
#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
#if defined(ENABLE_MANAGED_USERS)
#include "chrome/browser/managed_mode/managed_user_service.h"
@@ -241,6 +243,11 @@ base::string16 AvatarMenuModel::GetManagedUserInformation() const {
return base::string16();
}
+const gfx::Image& AvatarMenuModel::GetManagedUserIcon() const {
+ return ResourceBundle::GetSharedInstance().GetNativeImageNamed(
+ IDR_MANAGED_USER_ICON);
+}
+
void AvatarMenuModel::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
diff --git a/chrome/browser/profiles/avatar_menu_model.h b/chrome/browser/profiles/avatar_menu_model.h
index b591d40..b0db227 100644
--- a/chrome/browser/profiles/avatar_menu_model.h
+++ b/chrome/browser/profiles/avatar_menu_model.h
@@ -95,6 +95,10 @@ class AvatarMenuModel : public content::NotificationObserver {
// string will be returned.
base::string16 GetManagedUserInformation() const;
+ // Returns the icon for the managed user which will be displayed in the
+ // avatar menu.
+ const gfx::Image& GetManagedUserIcon() const;
+
// This model is also used for the always-present Mac system menubar. As the
// last active browser changes, the model needs to update accordingly.
void set_browser(Browser* browser) { browser_ = browser; }
diff --git a/chrome/browser/ui/gtk/avatar_menu_bubble_gtk.cc b/chrome/browser/ui/gtk/avatar_menu_bubble_gtk.cc
index 529583d..d9e4120 100644
--- a/chrome/browser/ui/gtk/avatar_menu_bubble_gtk.cc
+++ b/chrome/browser/ui/gtk/avatar_menu_bubble_gtk.cc
@@ -124,6 +124,17 @@ void AvatarMenuBubbleGtk::OnSwitchProfileLinkClicked(GtkWidget* link) {
OnAvatarMenuModelChanged(avatar_menu_model_.get());
}
+void AvatarMenuBubbleGtk::OnRealize(GtkWidget* parent_widget) {
+ if (!managed_user_info_)
+ return;
+
+ // Use the same background color for the GtkTextView as the background color
+ // of the enclosing widget.
+ GtkStyle* style = gtk_widget_get_style(parent_widget);
+ GdkColor bg_color = style->bg[GTK_STATE_NORMAL];
+ gtk_widget_modify_base(managed_user_info_, GTK_STATE_NORMAL, &bg_color);
+}
+
void AvatarMenuBubbleGtk::InitMenuContents() {
size_t profile_count = avatar_menu_model_->GetNumberOfItems();
GtkWidget* items_vbox = gtk_vbox_new(FALSE, ui::kContentAreaSpacing);
@@ -173,21 +184,41 @@ void AvatarMenuBubbleGtk::InitManagedUserContents() {
gtk_hseparator_new(), TRUE, TRUE, 0);
// Add information about managed users.
- GtkWidget* status_label =
- theme_service_->BuildLabel(std::string(), ui::kGdkBlack);
- char* markup = g_markup_printf_escaped(
- "<span size='small'>%s</span>",
- UTF16ToUTF8(avatar_menu_model_->GetManagedUserInformation()).c_str());
- const int kLabelWidth = 150;
- gtk_widget_set_size_request(status_label, kLabelWidth, -1);
- gtk_label_set_markup(GTK_LABEL(status_label), markup);
- gtk_label_set_line_wrap(GTK_LABEL(status_label), TRUE);
- gtk_misc_set_alignment(GTK_MISC(status_label), 0, 0);
- g_free(markup);
- gtk_box_pack_start(GTK_BOX(inner_contents_), status_label, FALSE, FALSE, 0);
-
- gtk_box_pack_start(GTK_BOX(inner_contents_),
- gtk_hseparator_new(), TRUE, TRUE, 0);
+ managed_user_info_ = gtk_text_view_new();
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(managed_user_info_), FALSE);
+ gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(managed_user_info_), FALSE);
+ GtkTextBuffer* text_buffer =
+ gtk_text_view_get_buffer(GTK_TEXT_VIEW(managed_user_info_));
+ std::string info =
+ UTF16ToUTF8(avatar_menu_model_->GetManagedUserInformation());
+ gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(managed_user_info_), GTK_WRAP_WORD);
+
+ // Insert the managed user icon. Insert it inside a hbox in order to be able
+ // to define a padding around it.
+ GtkTextIter start_iter;
+ gtk_text_buffer_get_start_iter(text_buffer, &start_iter);
+ GtkWidget* icon_box = gtk_hbox_new(FALSE, 0);
+ GdkPixbuf* limited_user_pixbuf =
+ avatar_menu_model_->GetManagedUserIcon().ToGdkPixbuf();
+ GtkWidget* limited_user_img = gtk_image_new_from_pixbuf(limited_user_pixbuf);
+ gtk_box_pack_start(GTK_BOX(icon_box), limited_user_img, FALSE, FALSE, 5);
+ GtkTextChildAnchor* anchor =
+ gtk_text_buffer_create_child_anchor(text_buffer, &start_iter);
+ gtk_text_view_add_child_at_anchor(
+ GTK_TEXT_VIEW(managed_user_info_), icon_box, anchor);
+
+ // Insert the information text.
+ GtkTextIter end_iter;
+ gtk_text_buffer_get_end_iter(text_buffer, &end_iter);
+ GtkTextTag* text_tag = gtk_text_buffer_create_tag(
+ text_buffer, NULL, "size-set", TRUE, "size", 10 * PANGO_SCALE, NULL);
+ gtk_text_buffer_insert_with_tags(
+ text_buffer, &end_iter, info.c_str(), info.size(), text_tag, NULL);
+
+ gtk_box_pack_start(
+ GTK_BOX(inner_contents_), managed_user_info_, FALSE, FALSE, 0);
+ gtk_box_pack_start(
+ GTK_BOX(inner_contents_), gtk_hseparator_new(), TRUE, TRUE, 0);
// The switch profile link.
GtkWidget* switch_profile_link = theme_service_->BuildChromeLinkButton(
@@ -201,6 +232,8 @@ void AvatarMenuBubbleGtk::InitManagedUserContents() {
gtk_container_add(GTK_CONTAINER(link_align), switch_profile_link);
gtk_box_pack_start(GTK_BOX(inner_contents_), link_align, FALSE, FALSE, 0);
+ g_signal_connect(
+ inner_contents_, "realize", G_CALLBACK(OnRealizeThunk), this);
}
void AvatarMenuBubbleGtk::InitContents() {
diff --git a/chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h b/chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h
index f611f68..3c2136bd 100644
--- a/chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h
+++ b/chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h
@@ -51,6 +51,7 @@ class AvatarMenuBubbleGtk : public BubbleDelegateGtk,
GtkRequisition*);
CHROMEGTK_CALLBACK_0(AvatarMenuBubbleGtk, void, OnNewProfileLinkClicked);
CHROMEGTK_CALLBACK_0(AvatarMenuBubbleGtk, void, OnSwitchProfileLinkClicked);
+ CHROMEGTK_CALLBACK_0(AvatarMenuBubbleGtk, void, OnRealize);
// Create all widgets in this bubble.
void InitContents();
@@ -74,6 +75,10 @@ class AvatarMenuBubbleGtk : public BubbleDelegateGtk,
// widgets in the bubble.
GtkWidget* inner_contents_;
+ // A weak pointer to the GtkTextView which holds general information about
+ // managed users.
+ GtkWidget* managed_user_info_;
+
// A weak pointer to the bubble window.
BubbleGtk* bubble_;
diff --git a/chrome/browser/ui/gtk/browser_titlebar.cc b/chrome/browser/ui/gtk/browser_titlebar.cc
index 09a9897..899dead 100644
--- a/chrome/browser/ui/gtk/browser_titlebar.cc
+++ b/chrome/browser/ui/gtk/browser_titlebar.cc
@@ -19,6 +19,7 @@
#include "base/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/managed_mode/managed_user_service.h"
#include "chrome/browser/profiles/avatar_menu_model.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_info_cache.h"
@@ -56,11 +57,6 @@
#include "ui/base/x/active_window_watcher_x.h"
#include "ui/gfx/image/image.h"
-#if defined(ENABLE_MANAGED_USERS)
-#include "chrome/browser/managed_mode/managed_user_service.h"
-#include "chrome/browser/managed_mode/managed_user_service_factory.h"
-#endif
-
using content::WebContents;
namespace {
@@ -820,10 +816,8 @@ void BrowserTitlebar::UpdateAvatar() {
gtk_widget_show_all(avatar_);
-#if defined(ENABLE_MANAGED_USERS)
- ManagedUserService* service = ManagedUserServiceFactory::GetForProfile(
- browser_window_->browser()->profile());
- if (service->ProfileIsManaged()) {
+ Profile* profile = browser_window_->browser()->profile();
+ if (ManagedUserService::ProfileIsManaged(profile)) {
avatar_label_ = gtk_label_new(NULL);
avatar_label_bg_ = gtk_event_box_new();
gtk_container_add(GTK_CONTAINER(avatar_label_bg_), avatar_label_);
@@ -842,7 +836,6 @@ void BrowserTitlebar::UpdateAvatar() {
gtk_widget_hide(titlebar_left_label_frame_);
}
}
-#endif
if (display_avatar_on_left_) {
gtk_container_add(GTK_CONTAINER(titlebar_left_avatar_frame_), avatar_);
@@ -861,7 +854,6 @@ void BrowserTitlebar::UpdateAvatar() {
gfx::Image avatar;
ProfileInfoCache& cache =
g_browser_process->profile_manager()->GetProfileInfoCache();
- Profile* profile = browser_window_->browser()->profile();
size_t index = cache.GetIndexOfProfileWithPath(profile->GetPath());
if (index == std::string::npos)
return;