[empathy] Update cc-empathy-accounts-panel for latest gnome-control-center



commit de35a9afcc8b6c6273ae01876919a14c6179c5a5
Author: Danielle Madeley <danielle madeley collabora co uk>
Date:   Fri Jul 16 11:55:21 2010 +1000

    Update cc-empathy-accounts-panel for latest gnome-control-center

 data/empathy-accounts.desktop.in.in |    1 +
 src/Makefile.am                     |    2 -
 src/cc-empathy-accounts-page.c      |  264 -----------------------------------
 src/cc-empathy-accounts-page.h      |   55 -------
 src/cc-empathy-accounts-panel.c     |  171 +++++++++++++++++------
 src/cc-empathy-accounts-panel.h     |    2 +-
 6 files changed, 130 insertions(+), 365 deletions(-)
---
diff --git a/data/empathy-accounts.desktop.in.in b/data/empathy-accounts.desktop.in.in
index 778b6bc..d9ebdf6 100644
--- a/data/empathy-accounts.desktop.in.in
+++ b/data/empathy-accounts.desktop.in.in
@@ -8,6 +8,7 @@ StartupNotify=true
 Terminal=false
 Type=Application
 Categories=GNOME;GTK;Settings;DesktopSettings;
+X-GNOME-Settings-Panel=empathy-accounts
 X-GNOME-Bugzilla-Bugzilla=GNOME
 X-GNOME-Bugzilla-Product=empathy
 X-GNOME-Bugzilla-Component=General
diff --git a/src/Makefile.am b/src/Makefile.am
index 0a4f6b3..8800aee 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -59,8 +59,6 @@ ccmodules_LTLIBRARIES = libempathy-accounts-panel.la
 
 libempathy_accounts_panel_la_SOURCES =				\
 	empathy-accounts-module.c				\
-	cc-empathy-accounts-page.c				\
-	cc-empathy-accounts-page.h				\
 	cc-empathy-accounts-panel.c				\
 	cc-empathy-accounts-panel.h				\
 	$(NULL)
diff --git a/src/cc-empathy-accounts-panel.c b/src/cc-empathy-accounts-panel.c
index e22dc0c..d62b3d2 100644
--- a/src/cc-empathy-accounts-panel.c
+++ b/src/cc-empathy-accounts-panel.c
@@ -26,90 +26,170 @@
 #include <gio/gio.h>
 #include <glib/gi18n-lib.h>
 
+#include <telepathy-glib/telepathy-glib.h>
 #include <gconf/gconf-client.h>
 
+#include <libempathy/empathy-utils.h>
+#include <libempathy/empathy-connection-managers.h>
+#include <libempathy-gtk/empathy-ui-utils.h>
 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT
 #include <libempathy/empathy-debug.h>
 
+#include "empathy-accounts-common.h"
+#include "empathy-account-assistant.h"
+#include "empathy-accounts-dialog.h"
+
 #include "cc-empathy-accounts-panel.h"
-#include "cc-empathy-accounts-page.h"
 
 #define CC_EMPATHY_ACCOUNTS_PANEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_EMPATHY_ACCOUNTS_PANEL, CcEmpathyAccountsPanelPrivate))
 
 struct CcEmpathyAccountsPanelPrivate
 {
-  CcPage *empathy_accounts_page;
+  /* the original window holding the dialog content; it needs to be retained and
+   * destroyed in our finalize(), since it invalidates its children (even if
+   * they've already been reparented by the time it is destroyed) */
+  GtkWidget *accounts_window;
+
+  GtkWidget *assistant;
 };
 
 G_DEFINE_DYNAMIC_TYPE (CcEmpathyAccountsPanel, cc_empathy_accounts_panel, CC_TYPE_PANEL)
 
 static void
-setup_panel (CcEmpathyAccountsPanel *panel)
+panel_pack_with_accounts_dialog (CcEmpathyAccountsPanel *panel)
 {
-  panel->priv->empathy_accounts_page = cc_empathy_accounts_page_new ();
+  GtkWidget *content;
+  GtkWidget *action_area;
+
+  if (panel->priv->accounts_window != NULL)
+    {
+      gtk_widget_destroy (panel->priv->accounts_window);
+      gtk_container_remove (GTK_CONTAINER (panel),
+          gtk_bin_get_child (GTK_BIN (panel)));
+    }
 
-  gtk_container_add (GTK_CONTAINER (panel),
-      GTK_WIDGET (panel->priv->empathy_accounts_page));
+    panel->priv->accounts_window = empathy_accounts_dialog_show (NULL, NULL);
+    gtk_widget_hide (panel->priv->accounts_window);
 
-  gtk_widget_show (GTK_WIDGET (panel->priv->empathy_accounts_page));
+    content = gtk_dialog_get_content_area (
+        GTK_DIALOG (panel->priv->accounts_window));
+    action_area = gtk_dialog_get_action_area (
+        GTK_DIALOG (panel->priv->accounts_window));
+    gtk_widget_set_no_show_all (action_area, TRUE);
+    gtk_widget_hide (action_area);
 
-  g_object_set (panel,
-      "current-page", panel->priv->empathy_accounts_page,
-      NULL);
+    gtk_widget_reparent (content, GTK_WIDGET (panel));
 }
 
 static void
-cc_empathy_accounts_panel_active_changed (CcPanel *self,
-    gboolean is_active)
+account_assistant_closed_cb (GtkWidget *widget,
+    gpointer user_data)
 {
-  DEBUG ("%s: active = %i", G_STRLOC, is_active);
+  CcEmpathyAccountsPanel *panel = CC_EMPATHY_ACCOUNTS_PANEL (user_data);
+
+  if (empathy_accounts_dialog_is_creating (
+      EMPATHY_ACCOUNTS_DIALOG (panel->priv->accounts_window)))
+    {
+      empathy_account_dialog_cancel (
+        EMPATHY_ACCOUNTS_DIALOG (panel->priv->accounts_window));
+    }
+
+  gtk_widget_set_sensitive (GTK_WIDGET (panel), TRUE);
+  panel->priv->assistant = NULL;
+}
+
+static void
+connection_managers_prepare (GObject *source,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  EmpathyConnectionManagers *cm_mgr = EMPATHY_CONNECTION_MANAGERS (source);
+  TpAccountManager *account_mgr;
+  CcEmpathyAccountsPanel *panel = CC_EMPATHY_ACCOUNTS_PANEL (user_data);
+
+  account_mgr = TP_ACCOUNT_MANAGER (g_object_get_data (G_OBJECT (cm_mgr),
+      "account-manager"));
+
+  if (!empathy_connection_managers_prepare_finish (cm_mgr, result, NULL))
+    goto out;
+
+  panel_pack_with_accounts_dialog (panel);
+
+  empathy_accounts_import (account_mgr, cm_mgr);
 
-  if (!is_active)
+  if (!empathy_accounts_has_non_salut_accounts (account_mgr))
     {
-      /* why doesn't control-center call active-changed on the Page? */
-      cc_empathy_accounts_page_destroy_dialogs (
-          CC_EMPATHY_ACCOUNTS_PAGE (
-            CC_EMPATHY_ACCOUNTS_PANEL (self)->priv->empathy_accounts_page));
+      GtkWindow *parent;
+
+      parent = empathy_get_toplevel_window (GTK_WIDGET (panel));
+      panel->priv->assistant = empathy_account_assistant_show (parent, cm_mgr);
+
+      gtk_widget_set_sensitive (GTK_WIDGET (panel), FALSE);
+
+      tp_g_signal_connect_object (panel->priv->assistant, "hide",
+        G_CALLBACK (account_assistant_closed_cb),
+        panel, 0);
     }
 
-  CC_PANEL_CLASS (cc_empathy_accounts_panel_parent_class)->active_changed (
-      self, is_active);
+out:
+  /* remove ref from active_changed() */
+  g_object_unref (account_mgr);
+  g_object_unref (cm_mgr);
 }
 
-static GObject *
-cc_empathy_accounts_panel_constructor (GType type,
-    guint n_construct_properties,
-    GObjectConstructParam *construct_properties)
+static void
+account_manager_ready_for_accounts_cb (GObject *source_object,
+    GAsyncResult *result,
+    gpointer user_data)
 {
-  CcEmpathyAccountsPanel *empathy_accounts_panel;
+  TpAccountManager *account_mgr = TP_ACCOUNT_MANAGER (source_object);
+  CcEmpathyAccountsPanel *panel = CC_EMPATHY_ACCOUNTS_PANEL (user_data);
+  GError *error = NULL;
 
-  empathy_accounts_panel = CC_EMPATHY_ACCOUNTS_PANEL (
-      G_OBJECT_CLASS (cc_empathy_accounts_panel_parent_class)->constructor (
-          type, n_construct_properties, construct_properties));
+  if (!tp_account_manager_prepare_finish (account_mgr, result, &error))
+    {
+      g_warning ("Failed to prepare account manager: %s", error->message);
+      g_error_free (error);
+      return;
+    }
 
-  g_object_set (empathy_accounts_panel,
-      "display-name", _("Messaging and VoIP Accounts"),
-      "id", "empathy-accounts.desktop",
-      NULL);
+  if (empathy_accounts_has_non_salut_accounts (account_mgr))
+    {
+      panel_pack_with_accounts_dialog (panel);
 
-  setup_panel (empathy_accounts_panel);
+      /* remove ref from active_changed() */
+      g_object_unref (account_mgr);
+    }
+  else
+    {
+      EmpathyConnectionManagers *cm_mgr;
 
-  return G_OBJECT (empathy_accounts_panel);
+      cm_mgr = empathy_connection_managers_dup_singleton ();
+
+      g_object_set_data_full (G_OBJECT (cm_mgr), "account-manager",
+          g_object_ref (account_mgr), (GDestroyNotify) g_object_unref);
+
+      empathy_connection_managers_prepare_async (cm_mgr,
+          connection_managers_prepare, panel);
+    }
 }
 
 static void
 cc_empathy_accounts_panel_finalize (GObject *object)
 {
-  CcEmpathyAccountsPanel *empathy_accounts_panel;
+  CcEmpathyAccountsPanel *panel;
 
   g_return_if_fail (object != NULL);
   g_return_if_fail (CC_IS_EMPATHY_ACCOUNTS_PANEL (object));
 
-  empathy_accounts_panel = CC_EMPATHY_ACCOUNTS_PANEL (object);
+  panel = CC_EMPATHY_ACCOUNTS_PANEL (object);
+
+  g_return_if_fail (panel->priv != NULL);
 
-  g_return_if_fail (empathy_accounts_panel->priv != NULL);
+  gtk_widget_destroy (panel->priv->accounts_window);
 
-  g_object_unref (empathy_accounts_panel->priv->empathy_accounts_page);
+  if (panel->priv->assistant != NULL)
+    gtk_widget_destroy (panel->priv->assistant);
 
   G_OBJECT_CLASS (cc_empathy_accounts_panel_parent_class)->finalize (object);
 }
@@ -117,12 +197,8 @@ cc_empathy_accounts_panel_finalize (GObject *object)
 static void
 cc_empathy_accounts_panel_class_init (CcEmpathyAccountsPanelClass *klass)
 {
-  CcPanelClass *panel_class = CC_PANEL_CLASS (klass);
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  panel_class->active_changed = cc_empathy_accounts_panel_active_changed;
-
-  object_class->constructor = cc_empathy_accounts_panel_constructor;
   object_class->finalize = cc_empathy_accounts_panel_finalize;
 
   g_type_class_add_private (klass, sizeof (CcEmpathyAccountsPanelPrivate));
@@ -137,15 +213,24 @@ static void
 cc_empathy_accounts_panel_init (CcEmpathyAccountsPanel *panel)
 {
   GConfClient *client;
+  TpAccountManager *account_manager;
 
   panel->priv = CC_EMPATHY_ACCOUNTS_PANEL_GET_PRIVATE (panel);
 
+  empathy_gtk_init ();
+
   client = gconf_client_get_default ();
   gconf_client_add_dir (client, "/desktop/gnome/peripherals/empathy_accounts",
       GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
   gconf_client_add_dir (client, "/desktop/gnome/interface",
       GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
   g_object_unref (client);
+
+  /* unref'd in final endpoint callbacks */
+  account_manager = tp_account_manager_dup ();
+
+  tp_account_manager_prepare_async (account_manager, NULL,
+      account_manager_ready_for_accounts_cb, panel);
 }
 
 void
@@ -156,6 +241,6 @@ cc_empathy_accounts_panel_register (GIOModule *module)
   bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 
   cc_empathy_accounts_panel_register_type (G_TYPE_MODULE (module));
-  g_io_extension_point_implement (CC_PANEL_EXTENSION_POINT_NAME,
+  g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
       CC_TYPE_EMPATHY_ACCOUNTS_PANEL, "empathy-accounts", 10);
 }
diff --git a/src/cc-empathy-accounts-panel.h b/src/cc-empathy-accounts-panel.h
index 86e303e..4217b58 100644
--- a/src/cc-empathy-accounts-panel.h
+++ b/src/cc-empathy-accounts-panel.h
@@ -22,7 +22,7 @@
 #define __CC_EMPATHY_ACCOUNTS_PANEL_H
 
 #include <gtk/gtk.h>
-#include <libgnome-control-center-extension/cc-panel.h>
+#include <libgnome-control-center/cc-panel.h>
 
 G_BEGIN_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]