blob: c9d6b11249ae6ae4b386c429d933da2efb6367b3 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/gtk/manage_passwords_bubble_gtk.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/gtk/gtk_theme_service.h"
#include "chrome/browser/ui/gtk/location_bar_view_gtk.h"
#include "chrome/browser/ui/passwords/manage_passwords_bubble_ui_controller.h"
#include "grit/generated_resources.h"
#include "ui/base/gtk/gtk_hig_constants.h"
#include "ui/base/l10n/l10n_util.h"
namespace {
// Pointer to singleton object (NULL if no bubble is open).
ManagePasswordsBubbleGtk* g_bubble = NULL;
// Need to manually set anchor width and height to ensure that the bubble shows
// in the correct spot the first time it is displayed when no icon is present.
const int kBubbleAnchorWidth = 20;
const int kBubbleAnchorHeight = 25;
} // namespace
// static
void ManagePasswordsBubbleGtk::ShowBubble(content::WebContents* web_contents) {
Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
DCHECK(browser && browser->window() && browser->fullscreen_controller());
LocationBar* location_bar = browser->window()->GetLocationBar();
GtkWidget* anchor = browser->window()->IsFullscreen() ?
GTK_WIDGET(browser->window()->GetNativeWindow()) :
static_cast<LocationBarViewGtk*>(location_bar)->
manage_passwords_icon_widget();
g_bubble = new ManagePasswordsBubbleGtk(anchor,
web_contents,
browser->fullscreen_controller());
}
// static
void ManagePasswordsBubbleGtk::CloseBubble() {
if (g_bubble)
g_bubble->Close();
}
// static
bool ManagePasswordsBubbleGtk::IsShowing() {
return g_bubble != NULL;
}
ManagePasswordsBubbleGtk::ManagePasswordsBubbleGtk(
GtkWidget* anchor,
content::WebContents* web_contents,
FullscreenController* fullscreen_controller)
: web_contents_(web_contents) {
GtkThemeService* theme_service = GtkThemeService::GetFrom(
Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
GtkWidget* bubble_contents_ = gtk_vbox_new(FALSE, ui::kControlSpacing);
gtk_container_set_border_width(GTK_CONTAINER(bubble_contents_),
ui::kContentAreaBorder);
GtkWidget* label = theme_service->BuildLabel(
l10n_util::GetStringUTF8(IDS_SAVE_PASSWORD), ui::kGdkBlack);
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
gtk_box_pack_start(GTK_BOX(bubble_contents_), label, FALSE, FALSE, 0);
GtkWidget* button_container = gtk_hbox_new(FALSE, 0);
GtkWidget* nope_button = gtk_button_new_with_label(l10n_util::GetStringUTF8(
IDS_PASSWORD_MANAGER_CANCEL_BUTTON).c_str());
g_signal_connect(nope_button, "clicked",
G_CALLBACK(OnNotNowButtonClickedThunk), this);
GtkWidget* save_button = gtk_button_new_with_label(
l10n_util::GetStringUTF8(IDS_PASSWORD_MANAGER_SAVE_BUTTON).c_str());
g_signal_connect(save_button, "clicked",
G_CALLBACK(OnSaveButtonClickedThunk), this);
gtk_box_pack_end(GTK_BOX(button_container), save_button, FALSE, FALSE, 4);
gtk_box_pack_end(GTK_BOX(button_container), nope_button, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(bubble_contents_), button_container, FALSE, FALSE,
0);
gtk_widget_grab_focus(save_button);
gfx::Rect rect = gfx::Rect(kBubbleAnchorWidth, kBubbleAnchorHeight);
BubbleGtk::FrameStyle frame_style = gtk_widget_is_toplevel(anchor) ?
BubbleGtk::FIXED_TOP_RIGHT : BubbleGtk::ANCHOR_TOP_RIGHT;
bubble_ = BubbleGtk::Show(anchor,
&rect,
bubble_contents_,
frame_style,
BubbleGtk::MATCH_SYSTEM_THEME |
BubbleGtk::POPUP_WINDOW |
BubbleGtk::GRAB_INPUT,
theme_service,
NULL);
g_signal_connect(bubble_contents_, "destroy",
G_CALLBACK(&OnDestroyThunk), this);
}
ManagePasswordsBubbleGtk::~ManagePasswordsBubbleGtk() {
DCHECK_EQ(g_bubble, this);
// Set singleton pointer to NULL.
g_bubble = NULL;
}
void ManagePasswordsBubbleGtk::Close() {
DCHECK(bubble_);
bubble_->Close();
}
void ManagePasswordsBubbleGtk::OnDestroy(GtkWidget* widget) {
// Listen to the destroy signal and delete this instance when it is caught.
delete this;
}
void ManagePasswordsBubbleGtk::OnSaveButtonClicked(GtkWidget* button) {
ManagePasswordsBubbleUIController::FromWebContents(web_contents_)->
SavePassword();
Close();
}
void ManagePasswordsBubbleGtk::OnNotNowButtonClicked(GtkWidget* button) {
Close();
}