Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(190)

Unified Diff: chrome/browser/ui/gtk/web_intent_picker_gtk.cc

Issue 10827238: [WebIntents, Gtk] "Waiting for Suggestion" dialog (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/gtk/web_intent_picker_gtk.cc
diff --git a/chrome/browser/ui/gtk/web_intent_picker_gtk.cc b/chrome/browser/ui/gtk/web_intent_picker_gtk.cc
index 8f88ffeb6009ec6e4f49d7b85fe177c06e0835e7..81f0f54bf958d3c811fc86b65acee2767fb707c5 100644
--- a/chrome/browser/ui/gtk/web_intent_picker_gtk.cc
+++ b/chrome/browser/ui/gtk/web_intent_picker_gtk.cc
@@ -137,6 +137,62 @@ GtkWidget* CreateStarsWidget(double rating) {
} // namespace
+// Create a new Widget for the "waiting for CWS" display.
+
+class WaitingDialog {
+ public:
+ explicit WaitingDialog(GtkThemeService* theme_service);
+ ~WaitingDialog();
+
+ GtkWidget* widget() const { return widget_.get(); }
+ private:
+ // Initialize the widget.
+ void Init();
+
+ // The actual GtkWidget
+ ui::OwnedWidgetGtk widget_;
+
+ // Waiting throbber.
+ scoped_ptr<ThrobberGtk> throbber_;
+
+ // Weak pointer to theme service.
+ GtkThemeService* theme_service_;
+};
+
+WaitingDialog::WaitingDialog(GtkThemeService* theme_service)
+ : theme_service_(theme_service) {
+ DCHECK(theme_service_);
+ Init();
+}
+
+WaitingDialog::~WaitingDialog() {
+ widget_.Destroy();
+}
+
+void WaitingDialog::Init() {
+ widget_.Own(gtk_hbox_new(FALSE, 0));
+ GtkWidget* hbox = widget_.get();
+
+ // Add the message text.
+ GtkWidget* message_label = theme_service_->BuildLabel(
+ l10n_util::GetStringUTF8(IDS_INTENT_PICKER_NO_SERVICES).c_str(),
+ ui::kGdkBlack);
+ gtk_label_set_line_wrap(GTK_LABEL(message_label), TRUE);
+ gtk_misc_set_alignment(GTK_MISC(message_label), 0, 0);
+ // Set the label width to the size of the main content width minus borders.
+ gtk_util::SetLabelWidth(message_label,
+ kMainContentWidth - 2 * ui::kContentAreaBorder);
+ gtk_box_pack_start(GTK_BOX(hbox), message_label, TRUE, TRUE, 0);
+
+ // Create throbber
+ throbber_.reset(new ThrobberGtk(theme_service_));
+ gtk_box_pack_start(GTK_BOX(hbox), throbber_->widget(), TRUE, TRUE, 0);
+
+ // TODO(groby): use large spinner.
+ // IDR_SPEECH_INPUT_SPINNER
+ // Animate throbber
+ throbber_->Start();
+}
// static
WebIntentPicker* WebIntentPicker::Create(TabContents* tab_contents,
WebIntentPickerDelegate* delegate,
@@ -183,7 +239,8 @@ void WebIntentPickerGtk::Close() {
void WebIntentPickerGtk::SetActionString(const string16& action) {
header_label_text_ = action;
- gtk_label_set_text(GTK_LABEL(header_label_), UTF16ToUTF8(action).c_str());
+ if (header_label_)
+ gtk_label_set_text(GTK_LABEL(header_label_), UTF16ToUTF8(action).c_str());
}
void WebIntentPickerGtk::OnExtensionInstallSuccess(const std::string& id) {
@@ -206,9 +263,14 @@ void WebIntentPickerGtk::OnExtensionInstallFailure(const std::string& id) {
}
void WebIntentPickerGtk::OnModelChanged(WebIntentPickerModel* model) {
+ if (waiting_dialog_.get() && !model->IsWaitingForSuggestions()) {
+ waiting_dialog_.reset();
+ InitMainContents();
+ }
UpdateInstalledServices();
UpdateCWSLabel();
UpdateSuggestedExtensions();
+ SetActionString(header_label_text_);
}
void WebIntentPickerGtk::OnFaviconChanged(WebIntentPickerModel* model,
@@ -332,6 +394,7 @@ void WebIntentPickerGtk::OnPendingAsyncCompleted() {
AddTitle(sub_contents);
// Replace the dialog header.
+ DCHECK(header_label_);
gtk_label_set_text(
GTK_LABEL(header_label_),
l10n_util::GetStringUTF8(IDS_INTENT_PICKER_NO_SERVICES_TITLE).c_str());
@@ -376,12 +439,13 @@ void WebIntentPickerGtk::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
DCHECK_EQ(type, chrome::NOTIFICATION_BROWSER_THEME_CHANGED);
- GtkThemeService* theme_service = GetThemeService(tab_contents_);
- if (theme_service->UsingNativeTheme())
- gtk_util::UndoForceFontSize(header_label_);
- else
- gtk_util::ForceFontSizePixels(header_label_, kHeaderLabelPixelSize);
-
+ if (header_label_) {
+ GtkThemeService* theme_service = GetThemeService(tab_contents_);
+ if (theme_service->UsingNativeTheme())
+ gtk_util::UndoForceFontSize(header_label_);
+ else
+ gtk_util::ForceFontSizePixels(header_label_, kHeaderLabelPixelSize);
+ }
UpdateInstalledServices();
UpdateSuggestedExtensions();
}
@@ -470,8 +534,25 @@ void WebIntentPickerGtk::InitContents() {
gtk_widget_set_size_request(contents_, kMainContentWidth, -1);
+ if (model_ && model_->IsWaitingForSuggestions()) {
+ gtk_util::RemoveAllChildren(contents_);
+ AddCloseButton(contents_);
+ waiting_dialog_.reset(new WaitingDialog(theme_service));
+ gtk_box_pack_start(GTK_BOX(contents_), waiting_dialog_->widget(),
+ TRUE, TRUE, 0);
+ } else {
+ InitMainContents();
+ }
+}
+
+void WebIntentPickerGtk::InitMainContents() {
+ GtkThemeService* theme_service = GetThemeService(tab_contents_);
+
+ gtk_util::RemoveAllChildren(contents_);
+
AddCloseButton(contents_);
GtkWidget* sub_contents = CreateSubContents(contents_);
+
AddTitle(sub_contents);
// Add separation between the installed services list and the app suggestions.
@@ -526,6 +607,8 @@ void WebIntentPickerGtk::InitContents() {
// Throbber, which will be added to the hierarchy when necessary.
throbber_.reset(new ThrobberGtk(theme_service));
+
+ gtk_widget_show_all(contents_);
}
void WebIntentPickerGtk::ResetContents() {
@@ -538,7 +621,7 @@ void WebIntentPickerGtk::ResetContents() {
inline_disposition_tab_contents_.reset(NULL);
// Re-initialize picker widgets and data.
- InitContents();
+ InitMainContents();
UpdateInstalledServices();
UpdateCWSLabel();
UpdateSuggestedExtensions();
@@ -588,6 +671,9 @@ void WebIntentPickerGtk::AddTitle(GtkWidget* containingBox) {
}
void WebIntentPickerGtk::UpdateInstalledServices() {
+ if (!button_vbox_)
+ return;
+
gtk_util::RemoveAllChildren(button_vbox_);
if (model_->GetInstalledServiceCount() == 0) {
@@ -621,6 +707,9 @@ void WebIntentPickerGtk::UpdateInstalledServices() {
}
void WebIntentPickerGtk::UpdateCWSLabel() {
+ if (!button_vbox_)
+ return;
+
gtk_widget_set_visible(gtk_widget_get_parent(button_vbox_),
model_->GetInstalledServiceCount() != 0);
@@ -630,6 +719,9 @@ void WebIntentPickerGtk::UpdateCWSLabel() {
}
void WebIntentPickerGtk::UpdateSuggestedExtensions() {
+ if (!extensions_vbox_)
+ return;
+
GtkThemeService* theme_service = GetThemeService(tab_contents_);
gtk_util::RemoveAllChildren(extensions_vbox_);
@@ -687,10 +779,12 @@ void WebIntentPickerGtk::UpdateSuggestedExtensions() {
void WebIntentPickerGtk::SetWidgetsEnabled(bool enabled) {
gboolean data = enabled;
- gtk_container_foreach(GTK_CONTAINER(button_vbox_), EnableWidgetCallback,
- &data);
- gtk_container_foreach(GTK_CONTAINER(extensions_vbox_), EnableWidgetCallback,
- &data);
+ if (button_vbox_)
+ gtk_container_foreach(GTK_CONTAINER(button_vbox_), EnableWidgetCallback,
+ &data);
+ if (extensions_vbox_)
+ gtk_container_foreach(GTK_CONTAINER(extensions_vbox_), EnableWidgetCallback,
+ &data);
}
GtkWidget* WebIntentPickerGtk::AddThrobberToExtensionAt(size_t index) {

Powered by Google App Engine
This is Rietveld 408576698