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..5b7c8069ce7efee1dc2196ff99365ab142f64d19 100644 |
--- a/chrome/browser/ui/gtk/web_intent_picker_gtk.cc |
+++ b/chrome/browser/ui/gtk/web_intent_picker_gtk.cc |
@@ -137,6 +137,67 @@ 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() { |
+ const int kDialogSpacing = 30; |
+ |
+ widget_.Own(gtk_vbox_new(FALSE, 0)); |
+ GtkWidget* vbox = widget_.get(); |
+ |
+ // Create throbber |
+ ThrobberGtk* throbber = new ThrobberGtk(theme_service_); |
+ GtkWidget* throbber_alignment = gtk_alignment_new(0.5, 0.5, 0, 0); |
+ gtk_alignment_set_padding(GTK_ALIGNMENT(throbber_alignment), kDialogSpacing, |
+ kMainContentPixelSize, 0, 0); |
+ gtk_container_add(GTK_CONTAINER(throbber_alignment), throbber->widget()); |
+ gtk_box_pack_start(GTK_BOX(vbox), throbber_alignment, TRUE, TRUE, 0); |
+ |
+ // Add the message text. |
+ GtkWidget* message_label = theme_service_->BuildLabel( |
+ l10n_util::GetStringUTF8(IDS_INTENT_PICKER_WAIT_FOR_CWS).c_str(), |
+ ui::kGdkBlack); |
+ |
+ GtkWidget* label_alignment = gtk_alignment_new(0.5, 0.5, 0, 0); |
+ gtk_alignment_set_padding(GTK_ALIGNMENT(label_alignment), |
+ kMainContentPixelSize, kDialogSpacing, 0, 0); |
+ gtk_container_add(GTK_CONTAINER(label_alignment), message_label); |
+ gtk_box_pack_start(GTK_BOX(vbox), label_alignment, TRUE, TRUE, 0); |
+ |
+ // TODO(groby): use IDR_SPEECH_INPUT_SPINNER. Pending fix for ThrobberGtk. |
+ // Animate throbber |
+ throbber->Start(); |
+} |
// static |
WebIntentPicker* WebIntentPicker::Create(TabContents* tab_contents, |
WebIntentPickerDelegate* delegate, |
@@ -183,7 +244,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 +268,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 +399,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 +444,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 +539,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() { |
Greg Billock
2012/08/10 18:46:57
What's the difference between InitContents and Ini
groby-ooo-7-16
2012/08/10 18:57:27
InitContents: Just initializes contents_
It curre
|
+ 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 +612,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 +626,7 @@ void WebIntentPickerGtk::ResetContents() { |
inline_disposition_tab_contents_.reset(NULL); |
// Re-initialize picker widgets and data. |
- InitContents(); |
+ InitMainContents(); |
UpdateInstalledServices(); |
UpdateCWSLabel(); |
UpdateSuggestedExtensions(); |
@@ -588,6 +676,9 @@ void WebIntentPickerGtk::AddTitle(GtkWidget* containingBox) { |
} |
void WebIntentPickerGtk::UpdateInstalledServices() { |
+ if (!button_vbox_) |
+ return; |
+ |
gtk_util::RemoveAllChildren(button_vbox_); |
if (model_->GetInstalledServiceCount() == 0) { |
@@ -621,6 +712,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 +724,9 @@ void WebIntentPickerGtk::UpdateCWSLabel() { |
} |
void WebIntentPickerGtk::UpdateSuggestedExtensions() { |
+ if (!extensions_vbox_) |
+ return; |
+ |
GtkThemeService* theme_service = GetThemeService(tab_contents_); |
gtk_util::RemoveAllChildren(extensions_vbox_); |
@@ -687,10 +784,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) { |