diff options
Diffstat (limited to 'src/empathy-new-chatroom-dialog.c')
-rw-r--r-- | src/empathy-new-chatroom-dialog.c | 654 |
1 files changed, 299 insertions, 355 deletions
diff --git a/src/empathy-new-chatroom-dialog.c b/src/empathy-new-chatroom-dialog.c index b4d1c2105..efff2da01 100644 --- a/src/empathy-new-chatroom-dialog.c +++ b/src/empathy-new-chatroom-dialog.c @@ -88,157 +88,8 @@ enum COL_COUNT }; -static void new_chatroom_dialog_response_cb (GtkWidget *widget, - gint response, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_destroy_cb (GtkWidget *widget, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_model_setup (EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_model_add_columns ( - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_update_widgets ( - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_account_changed_cb (GtkComboBox *combobox, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_account_ready_cb ( - EmpathyAccountChooser *combobox, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_roomlist_destroy_cb ( - EmpathyTpRoomlist *room_list, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_new_room_cb (EmpathyTpRoomlist *room_list, - EmpathyChatroom *chatroom, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_listing_cb (EmpathyTpRoomlist *room_list, - gpointer unused, - EmpathyNewChatroomDialog *dialog); -static void start_listing_error_cb (EmpathyTpRoomlist *room_list, - GError *error, - EmpathyNewChatroomDialog *dialog); -static void stop_listing_error_cb (EmpathyTpRoomlist *room_list, - GError *error, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_model_clear (EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_model_row_activated_cb (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_model_selection_changed ( - GtkTreeSelection *selection, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_join (EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_entry_changed_cb (GtkWidget *entry, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_browse_start (EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_browse_stop (EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_entry_server_activate_cb (GtkWidget *widget, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_expander_browse_activate_cb (GtkWidget *widget, - EmpathyNewChatroomDialog *dialog); -static gboolean new_chatroom_dialog_entry_server_focus_out_cb ( - GtkWidget *widget, - GdkEventFocus *event, - EmpathyNewChatroomDialog *dialog); -static void new_chatroom_dialog_button_close_error_clicked_cb ( - GtkButton *button, - EmpathyNewChatroomDialog *dialog); - static EmpathyNewChatroomDialog *dialog_p = NULL; - -void -empathy_new_chatroom_dialog_show (GtkWindow *parent) -{ - EmpathyNewChatroomDialog *dialog; - GtkBuilder *gui; - GtkSizeGroup *size_group; - gchar *filename; - - if (dialog_p) - { - gtk_window_present (GTK_WINDOW (dialog_p->window)); - return; - } - - dialog_p = dialog = g_new0 (EmpathyNewChatroomDialog, 1); - - filename = empathy_file_lookup ("empathy-new-chatroom-dialog.ui", "src"); - gui = empathy_builder_get_file (filename, - "new_chatroom_dialog", &dialog->window, - "table_grid", &dialog->table_grid, - "label_account", &dialog->label_account, - "label_server", &dialog->label_server, - "label_room", &dialog->label_room, - "entry_server", &dialog->entry_server, - "entry_room", &dialog->entry_room, - "treeview", &dialog->treeview, - "button_join", &dialog->button_join, - "expander_browse", &dialog->expander_browse, - "hbox_expander", &dialog->hbox_expander, - "label_error_message", &dialog->label_error_message, - "viewport_error", &dialog->viewport_error, - NULL); - g_free (filename); - - empathy_builder_connect (gui, dialog, - "new_chatroom_dialog", "response", new_chatroom_dialog_response_cb, - "new_chatroom_dialog", "destroy", new_chatroom_dialog_destroy_cb, - "entry_server", "changed", new_chatroom_dialog_entry_changed_cb, - "entry_server", "activate", new_chatroom_dialog_entry_server_activate_cb, - "entry_server", "focus-out-event", new_chatroom_dialog_entry_server_focus_out_cb, - "entry_room", "changed", new_chatroom_dialog_entry_changed_cb, - "expander_browse", "activate", new_chatroom_dialog_expander_browse_activate_cb, - "button_close_error", "clicked", new_chatroom_dialog_button_close_error_clicked_cb, - NULL); - - g_object_unref (gui); - - g_object_add_weak_pointer (G_OBJECT (dialog->window), (gpointer) &dialog_p); - - /* Label alignment */ - size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - - gtk_size_group_add_widget (size_group, dialog->label_account); - gtk_size_group_add_widget (size_group, dialog->label_server); - gtk_size_group_add_widget (size_group, dialog->label_room); - - g_object_unref (size_group); - - /* Set up chatrooms treeview */ - new_chatroom_dialog_model_setup (dialog); - - /* Add throbber */ - dialog->throbber = gtk_spinner_new (); - gtk_box_pack_start (GTK_BOX (dialog->hbox_expander), dialog->throbber, - TRUE, TRUE, 0); - - dialog->gsettings = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA); - - /* Account chooser for custom */ - dialog->account_chooser = empathy_account_chooser_new (); - empathy_account_chooser_set_filter ( - EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser), - empathy_account_chooser_filter_supports_chatrooms, NULL); - gtk_grid_attach (GTK_GRID (dialog->table_grid), dialog->account_chooser, - 1, 0, 1, 1); - gtk_widget_show (dialog->account_chooser); - - g_signal_connect (EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser), "ready", - G_CALLBACK (new_chatroom_dialog_account_ready_cb), dialog); - g_signal_connect (GTK_COMBO_BOX (dialog->account_chooser), "changed", - G_CALLBACK (new_chatroom_dialog_account_changed_cb), dialog); - new_chatroom_dialog_account_changed_cb ( - GTK_COMBO_BOX (dialog->account_chooser), dialog); - - if (parent) - { - gtk_window_set_transient_for (GTK_WINDOW (dialog->window), - GTK_WINDOW (parent)); - } - - gtk_widget_show (dialog->window); -} - static void new_chatroom_dialog_store_last_account (GSettings *gsettings, EmpathyAccountChooser *account_chooser) @@ -258,6 +109,35 @@ new_chatroom_dialog_store_last_account (GSettings *gsettings, } static void +new_chatroom_dialog_join (EmpathyNewChatroomDialog *dialog) +{ + EmpathyAccountChooser *account_chooser; + TpAccount *account; + const gchar *room; + const gchar *server = NULL; + gchar *room_name = NULL; + + room = gtk_entry_get_text (GTK_ENTRY (dialog->entry_room)); + server = gtk_entry_get_text (GTK_ENTRY (dialog->entry_server)); + + account_chooser = EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser); + account = empathy_account_chooser_get_account (account_chooser); + + if (!EMP_STR_EMPTY (server)) + room_name = g_strconcat (room, "@", server, NULL); + else + room_name = g_strdup (room); + + g_strstrip (room_name); + + DEBUG ("Requesting channel for '%s'", room_name); + + empathy_join_muc (account, room_name, empathy_get_current_action_time ()); + + g_free (room_name); +} + +static void new_chatroom_dialog_response_cb (GtkWidget *widget, gint response, EmpathyNewChatroomDialog *dialog) @@ -293,46 +173,6 @@ new_chatroom_dialog_destroy_cb (GtkWidget *widget, } static void -new_chatroom_dialog_model_setup (EmpathyNewChatroomDialog *dialog) -{ - GtkTreeView *view; - GtkListStore *store; - GtkTreeSelection *selection; - - /* View */ - view = GTK_TREE_VIEW (dialog->treeview); - - g_signal_connect (view, "row-activated", - G_CALLBACK (new_chatroom_dialog_model_row_activated_cb), dialog); - - /* Store/Model */ - store = gtk_list_store_new (COL_COUNT, - G_TYPE_STRING, /* Invite */ - G_TYPE_STRING, /* Password */ - G_TYPE_STRING, /* Name */ - G_TYPE_STRING, /* Room */ - G_TYPE_STRING, /* Member count */ - G_TYPE_INT, /* Member count int */ - G_TYPE_STRING); /* Tool tip */ - - dialog->model = GTK_TREE_MODEL (store); - gtk_tree_view_set_model (view, dialog->model); - gtk_tree_view_set_tooltip_column (view, COL_TOOLTIP); - gtk_tree_view_set_search_column (view, COL_NAME); - - /* Selection */ - selection = gtk_tree_view_get_selection (view); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), - COL_NAME, GTK_SORT_ASCENDING); - - g_signal_connect (selection, "changed", - G_CALLBACK (new_chatroom_dialog_model_selection_changed), dialog); - - /* Columns */ - new_chatroom_dialog_model_add_columns (dialog); -} - -static void new_chatroom_dialog_model_add_columns (EmpathyNewChatroomDialog *dialog) { GtkTreeView *view; @@ -393,6 +233,81 @@ new_chatroom_dialog_model_add_columns (EmpathyNewChatroomDialog *dialog) } static void +new_chatroom_dialog_model_row_activated_cb (GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column, + EmpathyNewChatroomDialog *dialog) +{ + gtk_widget_activate (dialog->button_join); +} + +static void +new_chatroom_dialog_model_selection_changed (GtkTreeSelection *selection, + EmpathyNewChatroomDialog *dialog) +{ + GtkTreeModel *model; + GtkTreeIter iter; + gchar *room = NULL; + gchar *server = NULL; + + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) + return; + + gtk_tree_model_get (model, &iter, COL_ROOM, &room, -1); + server = strstr (room, "@"); + if (server) + { + *server = '\0'; + server++; + } + + gtk_entry_set_text (GTK_ENTRY (dialog->entry_server), server ? server : ""); + gtk_entry_set_text (GTK_ENTRY (dialog->entry_room), room ? room : ""); + + g_free (room); +} + +static void +new_chatroom_dialog_model_setup (EmpathyNewChatroomDialog *dialog) +{ + GtkTreeView *view; + GtkListStore *store; + GtkTreeSelection *selection; + + /* View */ + view = GTK_TREE_VIEW (dialog->treeview); + + g_signal_connect (view, "row-activated", + G_CALLBACK (new_chatroom_dialog_model_row_activated_cb), dialog); + + /* Store/Model */ + store = gtk_list_store_new (COL_COUNT, + G_TYPE_STRING, /* Invite */ + G_TYPE_STRING, /* Password */ + G_TYPE_STRING, /* Name */ + G_TYPE_STRING, /* Room */ + G_TYPE_STRING, /* Member count */ + G_TYPE_INT, /* Member count int */ + G_TYPE_STRING); /* Tool tip */ + + dialog->model = GTK_TREE_MODEL (store); + gtk_tree_view_set_model (view, dialog->model); + gtk_tree_view_set_tooltip_column (view, COL_TOOLTIP); + gtk_tree_view_set_search_column (view, COL_NAME); + + /* Selection */ + selection = gtk_tree_view_get_selection (view); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), + COL_NAME, GTK_SORT_ASCENDING); + + g_signal_connect (selection, "changed", + G_CALLBACK (new_chatroom_dialog_model_selection_changed), dialog); + + /* Columns */ + new_chatroom_dialog_model_add_columns (dialog); +} + +static void update_join_button_sensitivity (EmpathyNewChatroomDialog *dialog) { const gchar *room; @@ -505,101 +420,6 @@ new_chatroom_dialog_account_ready_cb (EmpathyAccountChooser *combobox, } static void -new_chatroom_dialog_account_changed_cb (GtkComboBox *combobox, - EmpathyNewChatroomDialog *dialog) -{ - EmpathyAccountChooser *account_chooser; - gboolean listing = FALSE; - gboolean expanded = FALSE; - TpConnection *connection; - TpCapabilities *caps; - - if (dialog->room_list) - { - g_object_unref (dialog->room_list); - dialog->room_list = NULL; - } - - gtk_spinner_stop (GTK_SPINNER (dialog->throbber)); - gtk_widget_hide (dialog->throbber); - new_chatroom_dialog_model_clear (dialog); - - if (dialog->account != NULL) - { - g_signal_handler_disconnect (dialog->account, dialog->status_changed_id); - g_object_unref (dialog->account); - } - - account_chooser = EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser); - dialog->account = empathy_account_chooser_dup_account (account_chooser); - connection = empathy_account_chooser_get_connection (account_chooser); - if (dialog->account == NULL) - goto out; - - dialog->status_changed_id = g_signal_connect (dialog->account, - "status-changed", G_CALLBACK (account_status_changed_cb), dialog); - - /* empathy_account_chooser_filter_supports_chatrooms ensures that the - * account has a connection and CAPABILITIES has been prepared. */ - g_assert (connection != NULL); - g_assert (tp_proxy_is_prepared (connection, - TP_CONNECTION_FEATURE_CAPABILITIES)); - caps = tp_connection_get_capabilities (connection); - - if (tp_capabilities_supports_room_list (caps, NULL)) - { - /* Roomlist channels are supported */ - dialog->room_list = empathy_tp_roomlist_new (dialog->account); - } - else - { - dialog->room_list = NULL; - } - - if (dialog->room_list) - { - g_signal_connect (dialog->room_list, "destroy", - G_CALLBACK (new_chatroom_dialog_roomlist_destroy_cb), dialog); - g_signal_connect (dialog->room_list, "new-room", - G_CALLBACK (new_chatroom_dialog_new_room_cb), dialog); - g_signal_connect (dialog->room_list, "notify::is-listing", - G_CALLBACK (new_chatroom_dialog_listing_cb), dialog); - g_signal_connect (dialog->room_list, "error::start", - G_CALLBACK (start_listing_error_cb), dialog); - g_signal_connect (dialog->room_list, "error::stop", - G_CALLBACK (stop_listing_error_cb), dialog); - - expanded = gtk_expander_get_expanded ( - GTK_EXPANDER (dialog->expander_browse)); - if (expanded) - { - gtk_widget_hide (dialog->viewport_error); - gtk_widget_set_sensitive (dialog->treeview, TRUE); - new_chatroom_dialog_browse_start (dialog); - } - - listing = empathy_tp_roomlist_is_listing (dialog->room_list); - if (listing) - { - gtk_spinner_start (GTK_SPINNER (dialog->throbber)); - gtk_widget_show (dialog->throbber); - } - } - - gtk_widget_set_sensitive (dialog->expander_browse, dialog->room_list != NULL); - -out: - new_chatroom_dialog_update_widgets (dialog); -} - -static void -new_chatroom_dialog_button_close_error_clicked_cb (GtkButton *button, - EmpathyNewChatroomDialog *dialog) -{ - gtk_widget_hide (dialog->viewport_error); -} - -static void new_chatroom_dialog_roomlist_destroy_cb (EmpathyTpRoomlist *room_list, EmpathyNewChatroomDialog *dialog) { @@ -656,28 +476,6 @@ new_chatroom_dialog_new_room_cb (EmpathyTpRoomlist *room_list, } static void -start_listing_error_cb (EmpathyTpRoomlist *room_list, - GError *error, - EmpathyNewChatroomDialog *dialog) -{ - gtk_label_set_text (GTK_LABEL (dialog->label_error_message), - _("Could not start room listing")); - gtk_widget_show_all (dialog->viewport_error); - gtk_widget_set_sensitive (dialog->treeview, FALSE); -} - -static void -stop_listing_error_cb (EmpathyTpRoomlist *room_list, - GError *error, - EmpathyNewChatroomDialog *dialog) -{ - gtk_label_set_text (GTK_LABEL (dialog->label_error_message), - _("Could not stop room listing")); - gtk_widget_show_all (dialog->viewport_error); - gtk_widget_set_sensitive (dialog->treeview, FALSE); -} - -static void new_chatroom_dialog_listing_cb (EmpathyTpRoomlist *room_list, gpointer unused, EmpathyNewChatroomDialog *dialog) @@ -700,6 +498,28 @@ new_chatroom_dialog_listing_cb (EmpathyTpRoomlist *room_list, } static void +start_listing_error_cb (EmpathyTpRoomlist *room_list, + GError *error, + EmpathyNewChatroomDialog *dialog) +{ + gtk_label_set_text (GTK_LABEL (dialog->label_error_message), + _("Could not start room listing")); + gtk_widget_show_all (dialog->viewport_error); + gtk_widget_set_sensitive (dialog->treeview, FALSE); +} + +static void +stop_listing_error_cb (EmpathyTpRoomlist *room_list, + GError *error, + EmpathyNewChatroomDialog *dialog) +{ + gtk_label_set_text (GTK_LABEL (dialog->label_error_message), + _("Could not stop room listing")); + gtk_widget_show_all (dialog->viewport_error); + gtk_widget_set_sensitive (dialog->treeview, FALSE); +} + +static void new_chatroom_dialog_model_clear (EmpathyNewChatroomDialog *dialog) { GtkListStore *store; @@ -709,67 +529,106 @@ new_chatroom_dialog_model_clear (EmpathyNewChatroomDialog *dialog) } static void -new_chatroom_dialog_model_row_activated_cb (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - EmpathyNewChatroomDialog *dialog) +new_chatroom_dialog_browse_start (EmpathyNewChatroomDialog *dialog) { - gtk_widget_activate (dialog->button_join); + new_chatroom_dialog_model_clear (dialog); + if (dialog->room_list) + empathy_tp_roomlist_start (dialog->room_list); } static void -new_chatroom_dialog_model_selection_changed (GtkTreeSelection *selection, +new_chatroom_dialog_account_changed_cb (GtkComboBox *combobox, EmpathyNewChatroomDialog *dialog) { - GtkTreeModel *model; - GtkTreeIter iter; - gchar *room = NULL; - gchar *server = NULL; - - if (!gtk_tree_selection_get_selected (selection, &model, &iter)) - return; + EmpathyAccountChooser *account_chooser; + gboolean listing = FALSE; + gboolean expanded = FALSE; + TpConnection *connection; + TpCapabilities *caps; - gtk_tree_model_get (model, &iter, COL_ROOM, &room, -1); - server = strstr (room, "@"); - if (server) + if (dialog->room_list) { - *server = '\0'; - server++; + g_object_unref (dialog->room_list); + dialog->room_list = NULL; } - gtk_entry_set_text (GTK_ENTRY (dialog->entry_server), server ? server : ""); - gtk_entry_set_text (GTK_ENTRY (dialog->entry_room), room ? room : ""); + gtk_spinner_stop (GTK_SPINNER (dialog->throbber)); + gtk_widget_hide (dialog->throbber); + new_chatroom_dialog_model_clear (dialog); - g_free (room); -} + if (dialog->account != NULL) + { + g_signal_handler_disconnect (dialog->account, dialog->status_changed_id); + g_object_unref (dialog->account); + } -static void -new_chatroom_dialog_join (EmpathyNewChatroomDialog *dialog) -{ - EmpathyAccountChooser *account_chooser; - TpAccount *account; - const gchar *room; - const gchar *server = NULL; - gchar *room_name = NULL; + account_chooser = EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser); + dialog->account = empathy_account_chooser_dup_account (account_chooser); + connection = empathy_account_chooser_get_connection (account_chooser); + if (dialog->account == NULL) + goto out; - room = gtk_entry_get_text (GTK_ENTRY (dialog->entry_room)); - server = gtk_entry_get_text (GTK_ENTRY (dialog->entry_server)); + dialog->status_changed_id = g_signal_connect (dialog->account, + "status-changed", G_CALLBACK (account_status_changed_cb), dialog); - account_chooser = EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser); - account = empathy_account_chooser_get_account (account_chooser); + /* empathy_account_chooser_filter_supports_chatrooms ensures that the + * account has a connection and CAPABILITIES has been prepared. */ + g_assert (connection != NULL); + g_assert (tp_proxy_is_prepared (connection, + TP_CONNECTION_FEATURE_CAPABILITIES)); + caps = tp_connection_get_capabilities (connection); - if (!EMP_STR_EMPTY (server)) - room_name = g_strconcat (room, "@", server, NULL); + if (tp_capabilities_supports_room_list (caps, NULL)) + { + /* Roomlist channels are supported */ + dialog->room_list = empathy_tp_roomlist_new (dialog->account); + } else - room_name = g_strdup (room); + { + dialog->room_list = NULL; + } - g_strstrip (room_name); + if (dialog->room_list) + { + g_signal_connect (dialog->room_list, "destroy", + G_CALLBACK (new_chatroom_dialog_roomlist_destroy_cb), dialog); + g_signal_connect (dialog->room_list, "new-room", + G_CALLBACK (new_chatroom_dialog_new_room_cb), dialog); + g_signal_connect (dialog->room_list, "notify::is-listing", + G_CALLBACK (new_chatroom_dialog_listing_cb), dialog); + g_signal_connect (dialog->room_list, "error::start", + G_CALLBACK (start_listing_error_cb), dialog); + g_signal_connect (dialog->room_list, "error::stop", + G_CALLBACK (stop_listing_error_cb), dialog); - DEBUG ("Requesting channel for '%s'", room_name); + expanded = gtk_expander_get_expanded ( + GTK_EXPANDER (dialog->expander_browse)); + if (expanded) + { + gtk_widget_hide (dialog->viewport_error); + gtk_widget_set_sensitive (dialog->treeview, TRUE); + new_chatroom_dialog_browse_start (dialog); + } - empathy_join_muc (account, room_name, empathy_get_current_action_time ()); + listing = empathy_tp_roomlist_is_listing (dialog->room_list); + if (listing) + { + gtk_spinner_start (GTK_SPINNER (dialog->throbber)); + gtk_widget_show (dialog->throbber); + } + } - g_free (room_name); + gtk_widget_set_sensitive (dialog->expander_browse, dialog->room_list != NULL); + +out: + new_chatroom_dialog_update_widgets (dialog); +} + +static void +new_chatroom_dialog_button_close_error_clicked_cb (GtkButton *button, + EmpathyNewChatroomDialog *dialog) +{ + gtk_widget_hide (dialog->viewport_error); } static void @@ -785,14 +644,6 @@ new_chatroom_dialog_entry_changed_cb (GtkWidget *entry, } static void -new_chatroom_dialog_browse_start (EmpathyNewChatroomDialog *dialog) -{ - new_chatroom_dialog_model_clear (dialog); - if (dialog->room_list) - empathy_tp_roomlist_start (dialog->room_list); -} - -static void new_chatroom_dialog_browse_stop (EmpathyNewChatroomDialog *dialog) { if (dialog->room_list) @@ -840,3 +691,96 @@ new_chatroom_dialog_entry_server_focus_out_cb (GtkWidget *widget, return FALSE; } + +void +empathy_new_chatroom_dialog_show (GtkWindow *parent) +{ + EmpathyNewChatroomDialog *dialog; + GtkBuilder *gui; + GtkSizeGroup *size_group; + gchar *filename; + + if (dialog_p) + { + gtk_window_present (GTK_WINDOW (dialog_p->window)); + return; + } + + dialog_p = dialog = g_new0 (EmpathyNewChatroomDialog, 1); + + filename = empathy_file_lookup ("empathy-new-chatroom-dialog.ui", "src"); + gui = empathy_builder_get_file (filename, + "new_chatroom_dialog", &dialog->window, + "table_grid", &dialog->table_grid, + "label_account", &dialog->label_account, + "label_server", &dialog->label_server, + "label_room", &dialog->label_room, + "entry_server", &dialog->entry_server, + "entry_room", &dialog->entry_room, + "treeview", &dialog->treeview, + "button_join", &dialog->button_join, + "expander_browse", &dialog->expander_browse, + "hbox_expander", &dialog->hbox_expander, + "label_error_message", &dialog->label_error_message, + "viewport_error", &dialog->viewport_error, + NULL); + g_free (filename); + + empathy_builder_connect (gui, dialog, + "new_chatroom_dialog", "response", new_chatroom_dialog_response_cb, + "new_chatroom_dialog", "destroy", new_chatroom_dialog_destroy_cb, + "entry_server", "changed", new_chatroom_dialog_entry_changed_cb, + "entry_server", "activate", new_chatroom_dialog_entry_server_activate_cb, + "entry_server", "focus-out-event", new_chatroom_dialog_entry_server_focus_out_cb, + "entry_room", "changed", new_chatroom_dialog_entry_changed_cb, + "expander_browse", "activate", new_chatroom_dialog_expander_browse_activate_cb, + "button_close_error", "clicked", new_chatroom_dialog_button_close_error_clicked_cb, + NULL); + + g_object_unref (gui); + + g_object_add_weak_pointer (G_OBJECT (dialog->window), (gpointer) &dialog_p); + + /* Label alignment */ + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + gtk_size_group_add_widget (size_group, dialog->label_account); + gtk_size_group_add_widget (size_group, dialog->label_server); + gtk_size_group_add_widget (size_group, dialog->label_room); + + g_object_unref (size_group); + + /* Set up chatrooms treeview */ + new_chatroom_dialog_model_setup (dialog); + + /* Add throbber */ + dialog->throbber = gtk_spinner_new (); + gtk_box_pack_start (GTK_BOX (dialog->hbox_expander), dialog->throbber, + TRUE, TRUE, 0); + + dialog->gsettings = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA); + + /* Account chooser for custom */ + dialog->account_chooser = empathy_account_chooser_new (); + empathy_account_chooser_set_filter ( + EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser), + empathy_account_chooser_filter_supports_chatrooms, NULL); + gtk_grid_attach (GTK_GRID (dialog->table_grid), dialog->account_chooser, + 1, 0, 1, 1); + gtk_widget_show (dialog->account_chooser); + + g_signal_connect (EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser), "ready", + G_CALLBACK (new_chatroom_dialog_account_ready_cb), dialog); + g_signal_connect (GTK_COMBO_BOX (dialog->account_chooser), "changed", + G_CALLBACK (new_chatroom_dialog_account_changed_cb), dialog); + new_chatroom_dialog_account_changed_cb ( + GTK_COMBO_BOX (dialog->account_chooser), dialog); + + if (parent) + { + gtk_window_set_transient_for (GTK_WINDOW (dialog->window), + GTK_WINDOW (parent)); + } + + gtk_widget_show (dialog->window); +} |