[gtranslator] Rework the profile managing using the new GtrProfileManager.



commit 0687a12ba2339e1bb6513d7111a6bb2a35356acf
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Tue Feb 16 16:03:39 2010 +0100

    Rework the profile managing using the new GtrProfileManager.

 src/Makefile.am                      |   14 +-
 src/dialogs/gtr-assistant.c          |   17 +-
 src/dialogs/gtr-header-dialog.c      |   14 +-
 src/dialogs/gtr-preferences-dialog.c |  656 ++++++++++++++++++----------------
 src/dialogs/gtr-preferences-dialog.h |   43 +--
 src/dialogs/gtr-profile-dialog.c     |  563 ++++++-----------------------
 src/dialogs/gtr-profile-dialog.h     |   20 +-
 src/gtr-actions-file.c               |   44 ---
 src/gtr-dirs.h                       |    4 +-
 src/gtr-header.c                     |   29 +-
 src/gtr-header.h                     |    4 +
 src/gtr-profile-manager.c            |  161 ++++++---
 src/gtr-profile-manager.h            |   10 +-
 src/gtr-profile.c                    |  376 +++++++-------------
 src/gtr-profile.h                    |   70 ++---
 src/gtr-window.c                     |   10 +
 src/main.c                           |    4 -
 17 files changed, 790 insertions(+), 1249 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 1d57898..7d9440a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -122,7 +122,9 @@ libgtranslator_la_SOURCES = \
 	gtr-header.c \
 	gtr-statusbar.c \
 	gtr-context.c \
-	$(INST_H_FILES) 
+	gtr-profile-manager.h \
+	gtr-profile-manager.c \
+	$(INST_H_FILES)
 
 libgtranslator_la_LIBADD = \
 	$(GTRANSLATOR_LIBS) \
@@ -130,16 +132,6 @@ libgtranslator_la_LIBADD = \
 	toolbareditor/libtoolbareditor.la \
 	plugin-system/libpluginsystem.la \
 	translation-memory/libtranslationmemory.la
-	
-#gtranslator_auto_learn_SOURCES = \
-#	auto-learn.c
-#	
-#gtranslator_auto_translate_SOURCES = \
-#	auto-translate.c
-#	
-#gtranslator_export_learn_buffer_SOURCES = \
-#	export-learn-buffer.c
-#	
 
 gtr-enum-types.h: gtr-enum-types.h.template $(INST_H_FILES) $(GLIB_MKENUMS)
 	$(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template gtr-enum-types.h.template $(INST_H_FILES)) > $@
diff --git a/src/dialogs/gtr-assistant.c b/src/dialogs/gtr-assistant.c
index 66ad88e..8f9120a 100644
--- a/src/dialogs/gtr-assistant.c
+++ b/src/dialogs/gtr-assistant.c
@@ -28,6 +28,7 @@
 #include "gtr-application.h"
 #include "gtr-assistant.h"
 #include "gtr-profile.h"
+#include "gtr-profile-manager.h"
 #include "gtr-utils.h"
 #include "gtr-window.h"
 
@@ -190,10 +191,11 @@ on_assistant_apply (GtkAssistant * assistant)
   GtrAssistant *as = GTR_ASSISTANT (assistant);
   const gchar *po_name;
   GtrProfile *profile;
-  GList *profiles_list;
   gulong close_signal_id;
+  GtrProfileManager *prof_manager;
 
   profile = gtr_profile_new ();
+  prof_manager = gtr_profile_manager_get_default ();
 
   gtr_profile_set_name (profile,
                         gtk_entry_get_text (GTK_ENTRY
@@ -227,16 +229,13 @@ on_assistant_apply (GtkAssistant * assistant)
                             gtk_entry_get_text (GTK_ENTRY
                                                 (as->priv->trans_enc)));
 
-  gtr_profile_set_plurals (profile,
-                           gtk_entry_get_text (GTK_ENTRY
-                                               (as->priv->plural_form)));
-
-  gtr_application_set_active_profile (GTR_APP, profile);
+  gtr_profile_set_plural_forms (profile,
+                                gtk_entry_get_text (GTK_ENTRY (as->priv->plural_form)));
 
-  profiles_list = gtr_application_get_profiles (GTR_APP);
+  /* Add profile to profile manager and save it */
+  gtr_profile_manager_add_profile (prof_manager, profile);
 
-  gtr_application_set_profiles (GTR_APP,
-                                g_list_append (profiles_list, profile));
+  g_object_unref (prof_manager);
 
   close_signal_id = g_signal_connect (as,
                                       "close",
diff --git a/src/dialogs/gtr-header-dialog.c b/src/dialogs/gtr-header-dialog.c
index 8baf324..dedd404 100644
--- a/src/dialogs/gtr-header-dialog.c
+++ b/src/dialogs/gtr-header-dialog.c
@@ -287,17 +287,9 @@ gtr_header_dialog_init (GtrHeaderDialog * dlg)
 
   gtk_container_set_border_width (GTK_CONTAINER (dlg->priv->notebook), 5);
 
-  if (gtr_application_get_profiles (GTR_APP) == NULL)
-    {
-      gtk_widget_set_sensitive (dlg->priv->take_my_options, FALSE);
-    }
-  else
-    {
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
-                                    (dlg->priv->take_my_options),
-                                    gtr_prefs_manager_get_use_profile_values
-                                    ());
-    }
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->priv->take_my_options),
+                                gtr_prefs_manager_get_use_profile_values ());
+
   gtk_text_view_set_editable (GTK_TEXT_VIEW (dlg->priv->prj_comment), TRUE);
 
   gtk_widget_set_sensitive (dlg->priv->pot_date, FALSE);
diff --git a/src/dialogs/gtr-preferences-dialog.c b/src/dialogs/gtr-preferences-dialog.c
index dedc08a..2e0feb8 100644
--- a/src/dialogs/gtr-preferences-dialog.c
+++ b/src/dialogs/gtr-preferences-dialog.c
@@ -30,6 +30,7 @@
 #include "gtr-preferences-dialog.h"
 #include "gtr-prefs-manager.h"
 #include "gtr-profile.h"
+#include "gtr-profile-manager.h"
 #include "gtr-utils.h"
 #include "gtr-plugin-manager.h"
 #include "gtr-profile-dialog.h"
@@ -45,84 +46,84 @@
 #include <string.h>
 #include <gtksourceview/gtksourcestyleschememanager.h>
 
-#define GTR_PREFERENCES_DIALOG_GET_PRIVATE(object)	(G_TYPE_INSTANCE_GET_PRIVATE ( \
-						 	(object),	\
-						 	GTR_TYPE_PREFERENCES_DIALOG,     \
-						 	GtrPreferencesDialogPrivate))
+#define GTR_PREFERENCES_DIALOG_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ( \
+                                                    (object), \
+                                                    GTR_TYPE_PREFERENCES_DIALOG, \
+                                                    GtrPreferencesDialogPrivate))
 
 
 G_DEFINE_TYPE (GtrPreferencesDialog, gtr_preferences_dialog, GTK_TYPE_DIALOG)
-     struct _GtrPreferencesDialogPrivate
-     {
-       GtkWidget *notebook;
-
-       /* Files->General */
-       GtkWidget *warn_if_contains_fuzzy_checkbutton;
-       GtkWidget *delete_compiled_checkbutton;
-
-       /* Files->Autosave */
-       GtkWidget *autosave_checkbutton;
-       GtkWidget *autosave_interval_spinbutton;
-       GtkWidget *autosave_hbox;
-       GtkWidget *create_backup_checkbutton;
-
-       /* Editor->Text display */
-       GtkWidget *highlight_syntax_checkbutton;
-       GtkWidget *visible_whitespace_checkbutton;
-       GtkWidget *use_custom_font_checkbutton;
-       GtkWidget *editor_font_fontbutton;
-       GtkWidget *editor_font_hbox;
-
-       /* Editor->Contents */
-       GtkWidget *unmark_fuzzy_when_changed_checkbutton;
-       GtkWidget *spellcheck_checkbutton;
-
-       /*Profiles */
-       GtkWidget *profile_treeview;
-       GtkWidget *add_button;
-       GtkWidget *edit_button;
-       GtkWidget *delete_button;
-
-       /*Translation Memory */
-       GtkWidget *directory_entry;
-       GtkWidget *search_button;
-       GtkWidget *add_database_button;
-       GtkWidget *add_database_progressbar;
-
-       GtkWidget *use_lang_profile_in_tm;
-       GtkWidget *tm_lang_entry;
-       GtkWidget *missing_words_spinbutton;
-       GtkWidget *sentence_length_spinbutton;
-
-       /*PO header->Personal information */
-       GtkWidget *name_entry;
-       GtkWidget *email_entry;
-
-       /*PO header->Language settings */
-       GtkWidget *language_comboentry;
-       GtkWidget *langcode_comboentry;
-       GtkWidget *charset_comboentry;
-       GtkWidget *encoding_comboentry;
-       GtkWidget *team_email_comboentry;
-       GtkWidget *plurals_entry;
-       GtkWidget *number_plurals_spinbutton;
-
-       /*Inteface */
-       GtkWidget *gdl_combobox;
-       GtkWidget *scheme_color_combobox;
-
-       /*Plugins */
-       GtkWidget *plugins_box;
-     };
-
-     static void setup_profile_pages (GtrPreferencesDialog * dlg);
-
-GtkWidget * gtr_preferences_dialog_get_treeview (GtrPreferencesDialog * dlg)
-{
-  g_return_val_if_fail (GTR_IS_PREFERENCES_DIALOG (dlg), NULL);
 
-  return dlg->priv->profile_treeview;
-}
+struct _GtrPreferencesDialogPrivate
+{
+  GtkWidget *notebook;
+
+  /* Files->General */
+  GtkWidget *warn_if_contains_fuzzy_checkbutton;
+  GtkWidget *delete_compiled_checkbutton;
+
+  /* Files->Autosave */
+  GtkWidget *autosave_checkbutton;
+  GtkWidget *autosave_interval_spinbutton;
+  GtkWidget *autosave_hbox;
+  GtkWidget *create_backup_checkbutton;
+
+  /* Editor->Text display */
+  GtkWidget *highlight_syntax_checkbutton;
+  GtkWidget *visible_whitespace_checkbutton;
+  GtkWidget *use_custom_font_checkbutton;
+  GtkWidget *editor_font_fontbutton;
+  GtkWidget *editor_font_hbox;
+
+  /* Editor->Contents */
+  GtkWidget *unmark_fuzzy_when_changed_checkbutton;
+  GtkWidget *spellcheck_checkbutton;
+
+  /*Profiles */
+  GtkWidget *profile_treeview;
+  GtkWidget *add_button;
+  GtkWidget *edit_button;
+  GtkWidget *delete_button;
+
+  /*Translation Memory */
+  GtkWidget *directory_entry;
+  GtkWidget *search_button;
+  GtkWidget *add_database_button;
+  GtkWidget *add_database_progressbar;
+
+  GtkWidget *use_lang_profile_in_tm;
+  GtkWidget *tm_lang_entry;
+  GtkWidget *missing_words_spinbutton;
+  GtkWidget *sentence_length_spinbutton;
+
+  /*PO header->Personal information */
+  GtkWidget *name_entry;
+  GtkWidget *email_entry;
+
+  /*PO header->Language settings */
+  GtkWidget *language_comboentry;
+  GtkWidget *langcode_comboentry;
+  GtkWidget *charset_comboentry;
+  GtkWidget *encoding_comboentry;
+  GtkWidget *team_email_comboentry;
+  GtkWidget *plurals_entry;
+  GtkWidget *number_plurals_spinbutton;
+
+  /*Inteface */
+  GtkWidget *gdl_combobox;
+  GtkWidget *scheme_color_combobox;
+
+  /*Plugins */
+  GtkWidget *plugins_box;
+};
+
+enum
+{
+  PROFILE_NAME_COLUMN,
+  ACTIVE_PROFILE_COLUMN,
+  PROFILE_COLUMN,
+  PROFILE_N_COLUMNS
+};
 
 /***************Files pages****************/
 
@@ -413,116 +414,302 @@ setup_editor_pages (GtrPreferencesDialog * dlg)
 
 /***************Profile pages****************/
 static void
-active_toggled_cb (GtkCellRendererToggle * cell_renderer,
-                   gchar * path_str, GtrPreferencesDialog * dlg)
+on_profile_dialog_response_cb (GtrProfileDialog     *profile_dialog,
+                               gint                  response_id,
+                               GtrPreferencesDialog *dlg)
 {
-  GtkTreeIter iter;
-  GtkTreePath *path;
+  GtrProfileManager *prof_manager;
   GtkTreeModel *model;
-  gboolean active;
-  gchar *profile_row;
-  GtrProfile *old_profile_active;
-  GList *l = NULL, *profiles_list = NULL;
-  gchar *filename;
-  gchar *config_folder;
-  GFile *file;
+  GtrProfile *profile;
+  GtrProfile *active_profile;
+  GtkTreeIter iter;
 
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+  g_return_if_fail (model != NULL);
 
-  config_folder = gtr_dirs_get_user_config_dir ();
-  filename = g_build_filename (config_folder, "profiles.xml", NULL);
-  g_free (config_folder);
+  prof_manager = gtr_profile_manager_get_default ();
+  profile = gtr_profile_dialog_get_profile (profile_dialog);
 
-  file = g_file_new_for_path (filename);
-  g_free (filename);
+  /* add new profile */
+  if (response_id == GTK_RESPONSE_ACCEPT)
+    {
+      gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+      gtr_profile_manager_add_profile (prof_manager, profile);
 
-  path = gtk_tree_path_new_from_string (path_str);
+      active_profile = gtr_profile_manager_get_active_profile (prof_manager);
 
-  model =
-    gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
-  g_return_if_fail (model != NULL);
+      gtk_list_store_set (GTK_LIST_STORE (model),
+                          &iter,
+                          PROFILE_NAME_COLUMN, gtr_profile_get_name (profile),
+                          ACTIVE_PROFILE_COLUMN, (profile == active_profile),
+                          PROFILE_COLUMN, profile,
+                          -1);
+    }
+  /* modify profile */
+  else if (response_id == GTK_RESPONSE_YES)
+    {
+      GtkTreeSelection *selection;
 
-  gtk_tree_model_get_iter (model, &iter, path);
+      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+
+      if (gtk_tree_selection_get_selected (selection, &model, &iter))
+        {
+          GtrProfile *old;
+
+          gtk_tree_model_get (model, &iter,
+                              PROFILE_COLUMN, &old,
+                              -1);
+
+          gtr_profile_manager_modify_profile (prof_manager, old, profile);
+          active_profile = gtr_profile_manager_get_active_profile (prof_manager);
+
+          gtk_list_store_set (GTK_LIST_STORE (model),
+                              &iter,
+                              PROFILE_NAME_COLUMN, gtr_profile_get_name (profile),
+                              ACTIVE_PROFILE_COLUMN, (profile == active_profile),
+                              PROFILE_COLUMN, profile,
+                              -1);
+        }
+    }
+
+  g_object_unref (prof_manager);
+  gtk_widget_destroy (GTK_WIDGET (profile_dialog));
+}
+
+static void
+add_button_clicked (GtkWidget *button, GtrPreferencesDialog *dlg)
+{
+  GtrProfileDialog *profile_dialog;
+
+  profile_dialog = gtr_profile_dialog_new (GTK_WIDGET (dlg), NULL);
 
-  gtk_tree_model_get (model, &iter, TOGGLE_COL, &active, -1);
+  g_signal_connect (profile_dialog, "response",
+                    G_CALLBACK (on_profile_dialog_response_cb), dlg);
+
+  gtk_widget_show (GTK_WIDGET (profile_dialog));
+  gtk_window_present (GTK_WINDOW (profile_dialog));
+}
 
-  if (!active)
+static void
+edit_button_clicked (GtkWidget *button, GtrPreferencesDialog *dlg)
+{
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  GtkTreeSelection *selection;
+  GtrProfile *profile;
+
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+  g_return_if_fail (model != NULL);
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+
+  if (gtk_tree_selection_get_selected (selection, &model, &iter))
     {
+      GtrProfileDialog *profile_dialog;
 
-      old_profile_active = gtr_application_get_active_profile (GTR_APP);
+      gtk_tree_model_get (model, &iter, PROFILE_COLUMN, &profile, -1);
 
-      gtk_list_store_set (GTK_LIST_STORE (model),
-                          &iter, TRUE, TOGGLE_COL, -1);
+      profile_dialog = gtr_profile_dialog_new (GTK_WIDGET (dlg), profile);
 
-      gtk_tree_model_get (model, &iter, PROFILE_NAME_COL, &profile_row, -1);
-      profiles_list = gtr_application_get_profiles (GTR_APP);
+      g_signal_connect (profile_dialog, "response",
+                        G_CALLBACK (on_profile_dialog_response_cb), dlg);
 
-      for (l = profiles_list; l; l = l->next)
+      gtk_widget_show (GTK_WIDGET (profile_dialog));
+      gtk_window_present (GTK_WINDOW (profile_dialog));
+    }
+}
+
+static void
+delete_confirm_dialog_cb (GtkWidget *dialog,
+                          gint response_id, GtrPreferencesDialog *dlg)
+{
+  if (response_id == GTK_RESPONSE_YES)
+    {
+      GtkTreeIter iter;
+      GtkTreeModel *model;
+      GtkTreeSelection *selection;
+
+      model = gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+      g_return_if_fail (model != NULL);
+
+      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+
+      if (gtk_tree_selection_get_selected (selection, &model, &iter))
         {
+          GtrProfileManager *prof_manager;
           GtrProfile *profile;
-          profile = (GtrProfile *) l->data;
-          if (!strcmp (gtr_profile_get_name (profile), profile_row))
+
+          gtk_tree_model_get (model, &iter, PROFILE_COLUMN, &profile,
+                              -1);
+
+          if (profile != NULL)
             {
-              gtr_application_set_active_profile (GTR_APP, profile);
+              prof_manager = gtr_profile_manager_get_default ();
+              gtr_profile_manager_remove_profile (prof_manager, profile);
+              g_object_unref (prof_manager);
+
+              gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
             }
         }
     }
 
-  gtk_list_store_clear (GTK_LIST_STORE (model));
-  gtr_preferences_fill_profile_treeview (dlg, model);
-  gtk_tree_path_free (path);
+  gtk_widget_destroy (dialog);
 }
 
-void
-gtr_preferences_fill_profile_treeview (GtrPreferencesDialog *
-                                       dlg, GtkTreeModel * model)
+static void
+delete_button_clicked (GtkWidget *button, GtrPreferencesDialog *dlg)
 {
   GtkTreeIter iter;
+  GtkTreeModel *model;
+  GtkTreeSelection *selection;
+  gboolean active;
+  GtkWidget *dialog;
+
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+  g_return_if_fail (model != NULL);
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+
+  if (gtk_tree_selection_get_selected (selection, &model, &iter))
+    {
+      gtk_tree_model_get (model, &iter, ACTIVE_PROFILE_COLUMN, &active, -1);
+
+      if (active)
+        {
+          dialog = gtk_message_dialog_new (GTK_WINDOW (dlg),
+                                           GTK_DIALOG_MODAL,
+                                           GTK_MESSAGE_ERROR,
+                                           GTK_BUTTONS_CLOSE, NULL);
+
+          gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog),
+                                         _("<span weight=\"bold\" size=\"large\">Impossible to remove the active profile</span>"));
+
+          gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG
+                                                    (dialog),
+                                                    _("Another profile should be selected as active before"));
+
+          gtk_dialog_run (GTK_DIALOG (dialog));
+          gtk_widget_destroy (dialog);
+        }
+      else
+        {
+          dialog = gtk_message_dialog_new (GTK_WINDOW (dlg),
+                                           GTK_DIALOG_MODAL,
+                                           GTK_MESSAGE_QUESTION,
+                                           GTK_BUTTONS_NONE, NULL);
+
+          gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog),
+                                         _("<span weight=\"bold\" size=\"large\">Are you sure you want to delete this profile?</span>"));
+
+          gtk_dialog_add_button (GTK_DIALOG (dialog),
+                                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+
+          gtk_dialog_add_button (GTK_DIALOG (dialog),
+                                 GTK_STOCK_DELETE, GTK_RESPONSE_YES);
+
+          gtk_dialog_run (GTK_DIALOG (dialog));
+
+          g_signal_connect (GTK_DIALOG (dialog), "response",
+                            G_CALLBACK (delete_confirm_dialog_cb), dlg);
+        }
+    }
+}
+
+static void
+active_toggled_cb (GtkCellRendererToggle *cell_renderer,
+                   gchar *path_str, GtrPreferencesDialog *dlg)
+{
+  GtkTreeIter iter, first;
+  GtkTreePath *path;
+  GtkTreeModel *model;
   GtrProfile *active_profile;
-  GList *l = NULL, *profiles_list = NULL;
 
-  gtk_list_store_clear (GTK_LIST_STORE (model));
+  path = gtk_tree_path_new_from_string (path_str);
 
-  profiles_list = gtr_application_get_profiles (GTR_APP);
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
+  g_return_if_fail (model != NULL);
 
+  gtk_tree_model_get_iter (model, &iter, path);
 
-  active_profile = gtr_application_get_active_profile (GTR_APP);
+  gtk_tree_model_get (model, &iter, PROFILE_COLUMN, &active_profile, -1);
 
-  for (l = profiles_list; l; l = l->next)
+  if (active_profile != NULL)
     {
+      GtrProfileManager *prof_manager;
 
-      GtrProfile *profile;
-      const gchar *profile_name;
+      prof_manager = gtr_profile_manager_get_default ();
 
-      profile = (GtrProfile *) l->data;
+      if (gtr_profile_manager_get_active_profile (prof_manager) != active_profile)
+        {
+          gtr_profile_manager_set_active_profile (prof_manager, active_profile);
 
-      profile_name = gtr_profile_get_name (profile);
-      gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+          gtk_tree_model_get_iter_first (model, &first);
+
+          do
+          {
+            gtk_list_store_set (GTK_LIST_STORE (model),
+                                &first,
+                                ACTIVE_PROFILE_COLUMN, FALSE,
+                                -1);
+          } while (gtk_tree_model_iter_next (model, &first));
 
-      if (!strcmp (gtr_profile_get_name (active_profile), profile_name))
-        {
           gtk_list_store_set (GTK_LIST_STORE (model),
                               &iter,
-                              PROFILE_NAME_COL,
-                              profile_name, TOGGLE_COL, TRUE, -1);
-        }
-      else
-        {
-          gtk_list_store_set (GTK_LIST_STORE (model),
-                              &iter, PROFILE_NAME_COL, profile_name, -1);
+                              ACTIVE_PROFILE_COLUMN, TRUE,
+                              -1);
         }
+
+      g_object_unref (prof_manager);
+    }
+
+  gtk_tree_path_free (path);
+}
+
+static void
+fill_profile_treeview (GtrPreferencesDialog *dlg, GtkTreeModel *model)
+{
+  GtrProfileManager *prof_manager;
+  GtkTreeIter iter;
+  GtrProfile *active_profile;
+  GSList *l, *profiles;
+
+  gtk_list_store_clear (GTK_LIST_STORE (model));
+
+  prof_manager = gtr_profile_manager_get_default ();
+  profiles = gtr_profile_manager_get_profiles (prof_manager);
+  active_profile = gtr_profile_manager_get_active_profile (prof_manager);
+
+  for (l = profiles; l != NULL; l = g_slist_next (l))
+    {
+      GtrProfile *profile = GTR_PROFILE (l->data);
+      const gchar *profile_name;
+
+      profile_name = gtr_profile_get_name (profile);
+      gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+
+      gtk_list_store_set (GTK_LIST_STORE (model),
+                          &iter,
+                          PROFILE_NAME_COLUMN, profile_name,
+                          ACTIVE_PROFILE_COLUMN, (profile == active_profile),
+                          PROFILE_COLUMN, profile,
+                          -1);
     }
+
+  g_object_unref (prof_manager);
 }
 
 static void
-setup_profile_pages (GtrPreferencesDialog * dlg)
+setup_profile_pages (GtrPreferencesDialog *dlg)
 {
 
   GtkTreeViewColumn *name_column, *toggle_column;
   GtkCellRenderer *text_renderer, *toggle_renderer;
   GtkListStore *model;
 
-  model =
-    gtk_list_store_new (N_COLUMNS_PROFILES, G_TYPE_STRING, G_TYPE_BOOLEAN);
+  model = gtk_list_store_new (PROFILE_N_COLUMNS,
+                              G_TYPE_STRING,
+                              G_TYPE_BOOLEAN,
+                              G_TYPE_POINTER);
 
   gtk_tree_view_set_model (GTK_TREE_VIEW (dlg->priv->profile_treeview),
                            GTK_TREE_MODEL (model));
@@ -535,19 +722,22 @@ setup_profile_pages (GtrPreferencesDialog * dlg)
   g_signal_connect (toggle_renderer,
                     "toggled", G_CALLBACK (active_toggled_cb), dlg);
 
-  g_object_set (toggle_renderer,
-                "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
+  gtk_cell_renderer_toggle_set_activatable (GTK_CELL_RENDERER_TOGGLE (toggle_renderer),
+                                            TRUE);
+  gtk_cell_renderer_toggle_set_radio (GTK_CELL_RENDERER_TOGGLE (toggle_renderer),
+                                      TRUE);
 
   name_column = gtk_tree_view_column_new_with_attributes (_("Profile"),
                                                           text_renderer,
                                                           "text",
-                                                          PROFILE_NAME_COL,
+                                                          PROFILE_NAME_COLUMN,
                                                           NULL);
 
   toggle_column = gtk_tree_view_column_new_with_attributes (_("Active"),
                                                             toggle_renderer,
                                                             "active",
-                                                            TOGGLE_COL, NULL);
+                                                            ACTIVE_PROFILE_COLUMN,
+                                                            NULL);
 
   gtk_tree_view_column_set_resizable (toggle_column, TRUE);
   gtk_tree_view_column_set_resizable (name_column, TRUE);
@@ -556,9 +746,9 @@ setup_profile_pages (GtrPreferencesDialog * dlg)
   gtk_tree_view_append_column (GTK_TREE_VIEW (dlg->priv->profile_treeview),
                                toggle_column);
 
-  g_object_set (name_column, "expand", TRUE, NULL);
+  gtk_tree_view_column_set_expand (name_column, TRUE);
 
-  gtr_preferences_fill_profile_treeview (dlg, GTK_TREE_MODEL (model));
+  fill_profile_treeview (dlg, GTK_TREE_MODEL (model));
 }
 
 /***************Interface pages****************/
@@ -659,7 +849,7 @@ response_filechooser_cb (GtkDialog * dialog,
 }
 
 static void
-on_search_button_pulsed (GtkButton * button, gpointer data)
+on_search_button_clicked (GtkButton * button, gpointer data)
 {
   GtkWidget *filechooser;
   GtrPreferencesDialog *dlg;
@@ -781,7 +971,7 @@ destroy_idle_data (gpointer data)
 }
 
 static void
-on_add_database_button_pulsed (GtkButton * button, GtrPreferencesDialog * dlg)
+on_add_database_button_clicked (GtkButton * button, GtrPreferencesDialog * dlg)
 {
   GFile *dir;
   const gchar *dir_name;
@@ -878,6 +1068,7 @@ directory_entry_changed (GObject * gobject,
 static void
 setup_tm_pages (GtrPreferencesDialog * dlg)
 {
+  GtrProfileManager *prof_manager;
   GtrProfile *profile;
   const gchar *language_code;
   const gchar *filename = NULL;
@@ -887,7 +1078,8 @@ setup_tm_pages (GtrPreferencesDialog * dlg)
                                 gtr_prefs_manager_get_restrict_to_filename
                                 ());
 
-  profile = gtr_application_get_active_profile (GTR_APP);
+  prof_manager = gtr_profile_manager_get_default ();
+  profile = gtr_profile_manager_get_active_profile (prof_manager);
 
   if (profile != NULL)
     {
@@ -896,6 +1088,7 @@ setup_tm_pages (GtrPreferencesDialog * dlg)
 
       gtk_entry_set_text (GTK_ENTRY (dlg->priv->tm_lang_entry), filename);
     }
+  g_object_unref (prof_manager);
 
   if (filename != NULL)
     gtr_prefs_manager_set_filename_restriction (filename);
@@ -911,7 +1104,7 @@ setup_tm_pages (GtrPreferencesDialog * dlg)
                              gtr_prefs_manager_get_max_length_diff ());
 
   g_signal_connect (GTK_BUTTON (dlg->priv->search_button), "clicked",
-                    G_CALLBACK (on_search_button_pulsed), dlg);
+                    G_CALLBACK (on_search_button_clicked), dlg);
 
   g_signal_connect (dlg->priv->directory_entry, "notify::text",
                     G_CALLBACK (directory_entry_changed), dlg);
@@ -920,7 +1113,7 @@ setup_tm_pages (GtrPreferencesDialog * dlg)
                     G_CALLBACK (tm_lang_entry_changed), dlg);
 
   g_signal_connect (GTK_BUTTON (dlg->priv->add_database_button), "clicked",
-                    G_CALLBACK (on_add_database_button_pulsed), dlg);
+                    G_CALLBACK (on_add_database_button_clicked), dlg);
 
   g_signal_connect (GTK_TOGGLE_BUTTON (dlg->priv->use_lang_profile_in_tm),
                     "toggled",
@@ -971,173 +1164,6 @@ dialog_response_handler (GtkDialog * dlg, gint res_id)
 }
 
 static void
-add_button_pulsed (GtkWidget * button, GtrPreferencesDialog * dlg)
-{
-  GtrProfile *profile;
-  profile = gtr_profile_new ();
-  gtr_show_profile_dialog (dlg, profile, NEW_PROFILE);
-}
-
-static void
-edit_button_pulsed (GtkWidget * button, GtrPreferencesDialog * dlg)
-{
-  GtkTreeIter iter;
-  GtkTreeModel *model;
-  GtkTreeSelection *selection;
-  gchar *profile_row;
-  const gchar *old_profile_name;
-  GtrProfile *edited_profile = NULL;
-  GtrProfile *active_profile;
-  GList *profiles_list = NULL, *l = NULL;
-
-  model =
-    gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
-  g_return_if_fail (model != NULL);
-
-  selection =
-    gtk_tree_view_get_selection (GTK_TREE_VIEW (dlg->priv->profile_treeview));
-
-  if (gtk_tree_selection_get_selected (selection, &model, &iter))
-    {
-
-      gtk_tree_model_get (model, &iter, PROFILE_NAME_COL, &profile_row, -1);
-
-      profiles_list = gtr_application_get_profiles (GTR_APP);
-      active_profile = gtr_application_get_active_profile (GTR_APP);
-
-      for (l = profiles_list; l; l = l->next)
-        {
-          GtrProfile *profile;
-          profile = (GtrProfile *) l->data;
-          if (!strcmp (gtr_profile_get_name (profile), profile_row))
-            {
-              old_profile_name = gtr_profile_get_name (profile);
-              edited_profile = profile;
-            }
-        }
-      gtr_show_profile_dialog (dlg, edited_profile, EDIT_PROFILE);
-    }
-}
-
-static void
-delete_confirm_dialog_cb (GtkWidget * dialog,
-                          gint response_id, GtrPreferencesDialog * dlg)
-{
-  GtkTreeIter iter;
-  GtkTreeModel *model;
-  GtkTreeSelection *selection;
-  gchar *profile_row;
-  GList *profiles_list = NULL, *l = NULL;
-  GList *new_list = NULL;
-
-  if (response_id == GTK_RESPONSE_YES)
-    {
-      model =
-        gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
-      g_return_if_fail (model != NULL);
-
-      selection =
-        gtk_tree_view_get_selection (GTK_TREE_VIEW
-                                     (dlg->priv->profile_treeview));
-
-      if (gtk_tree_selection_get_selected (selection, &model, &iter))
-        {
-
-          gtk_tree_model_get (model, &iter, PROFILE_NAME_COL, &profile_row,
-                              -1);
-
-          profiles_list = gtr_application_get_profiles (GTR_APP);
-
-          for (l = profiles_list; l; l = l->next)
-            {
-              GtrProfile *profile;
-              profile = (GtrProfile *) l->data;
-              if (!strcmp (gtr_profile_get_name (profile), profile_row))
-                {
-                  new_list = g_list_remove (profiles_list, profile);
-                  gtr_application_set_profiles (GTR_APP, new_list);
-                }
-            }
-          gtr_preferences_fill_profile_treeview (dlg, model);
-        }
-      gtk_widget_destroy (dialog);
-    }
-  else
-    {
-      gtk_widget_destroy (dialog);
-    }
-}
-
-static void
-delete_button_pulsed (GtkWidget * button, GtrPreferencesDialog * dlg)
-{
-  GtkTreeIter iter;
-  GtkTreeModel *model;
-  GtkTreeSelection *selection;
-  gchar *profile_row;
-  GtrProfile *active_profile;
-  GtkWidget *dialog;
-
-  model =
-    gtk_tree_view_get_model (GTK_TREE_VIEW (dlg->priv->profile_treeview));
-  g_return_if_fail (model != NULL);
-
-  selection =
-    gtk_tree_view_get_selection (GTK_TREE_VIEW (dlg->priv->profile_treeview));
-
-  if (gtk_tree_selection_get_selected (selection, &model, &iter))
-    {
-
-      gtk_tree_model_get (model, &iter, PROFILE_NAME_COL, &profile_row, -1);
-
-      active_profile = gtr_application_get_active_profile (GTR_APP);
-
-      if (!strcmp (gtr_profile_get_name (active_profile), profile_row))
-        {
-
-          dialog = gtk_message_dialog_new (GTK_WINDOW (dlg),
-                                           GTK_DIALOG_MODAL,
-                                           GTK_MESSAGE_ERROR,
-                                           GTK_BUTTONS_CLOSE, NULL);
-
-          gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog),
-                                         _
-                                         ("<span weight=\"bold\" size=\"large\">Impossible to remove the active profile</span>"));
-
-          gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG
-                                                    (dialog),
-                                                    _
-                                                    ("Another profile should be selected as active before"));
-
-          gtk_dialog_run (GTK_DIALOG (dialog));
-          gtk_widget_destroy (dialog);
-        }
-      else
-        {
-          dialog = gtk_message_dialog_new (GTK_WINDOW (dlg),
-                                           GTK_DIALOG_MODAL,
-                                           GTK_MESSAGE_QUESTION,
-                                           GTK_BUTTONS_NONE, NULL);
-
-          gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog),
-                                         _
-                                         ("<span weight=\"bold\" size=\"large\">Are you sure you want to delete this profile?</span>"));
-
-          gtk_dialog_add_button (GTK_DIALOG (dialog),
-                                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
-
-          gtk_dialog_add_button (GTK_DIALOG (dialog),
-                                 GTK_STOCK_DELETE, GTK_RESPONSE_YES);
-
-          gtk_dialog_run (GTK_DIALOG (dialog));
-
-          g_signal_connect (GTK_DIALOG (dialog), "response",
-                            G_CALLBACK (delete_confirm_dialog_cb), dlg);
-        }
-    }
-}
-
-static void
 gtr_preferences_dialog_init (GtrPreferencesDialog * dlg)
 {
   gboolean ret;
@@ -1251,13 +1277,13 @@ gtr_preferences_dialog_init (GtrPreferencesDialog * dlg)
   gtk_container_set_border_width (GTK_CONTAINER (dlg->priv->notebook), 5);
 
   g_signal_connect (dlg->priv->add_button,
-                    "clicked", G_CALLBACK (add_button_pulsed), dlg);
+                    "clicked", G_CALLBACK (add_button_clicked), dlg);
 
   g_signal_connect (dlg->priv->delete_button,
-                    "clicked", G_CALLBACK (delete_button_pulsed), dlg);
+                    "clicked", G_CALLBACK (delete_button_clicked), dlg);
 
   g_signal_connect (dlg->priv->edit_button,
-                    "clicked", G_CALLBACK (edit_button_pulsed), dlg);
+                    "clicked", G_CALLBACK (edit_button_clicked), dlg);
 
   setup_files_pages (dlg);
   setup_editor_pages (dlg);
diff --git a/src/dialogs/gtr-preferences-dialog.h b/src/dialogs/gtr-preferences-dialog.h
index e3872b8..edbccec 100644
--- a/src/dialogs/gtr-preferences-dialog.h
+++ b/src/dialogs/gtr-preferences-dialog.h
@@ -23,32 +23,22 @@
 #include <glib-object.h>
 #include <gtk/gtk.h>
 
-#include "gtr-application.h"
 #include "gtr-window.h"
 
-enum
-{
-  PROFILE_NAME_COL,
-  TOGGLE_COL,
-  N_COLUMNS_PROFILES
-};
-
 G_BEGIN_DECLS
-/*
- * Type checking and casting macros
- */
+
+/* Type checking and casting macros */
 #define GTR_TYPE_PREFERENCES_DIALOG		(gtr_preferences_dialog_get_type ())
 #define GTR_PREFERENCES_DIALOG(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), GTR_TYPE_PREFERENCES_DIALOG, GtrPreferencesDialog))
-#define GTR_PREFERENCES_DIALOG_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), GTR_TYPE_PREFERENCES_DIALOG, GtrPreferencesDialogClass))
+#define GTR_PREFERENCES_DIALOG_CLASS(k)	        (G_TYPE_CHECK_CLASS_CAST((k), GTR_TYPE_PREFERENCES_DIALOG, GtrPreferencesDialogClass))
 #define GTR_IS_PREFERENCES_DIALOG(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), GTR_TYPE_PREFERENCES_DIALOG))
 #define GTR_IS_PREFERENCES_DIALOG_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), GTR_TYPE_PREFERENCES_DIALOG))
 #define GTR_PREFERENCES_DIALOG_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), GTR_TYPE_PREFERENCES_DIALOG, GtrPreferencesDialogClass))
+
 /* Private structure type */
 typedef struct _GtrPreferencesDialogPrivate GtrPreferencesDialogPrivate;
 
-/*
- * Main object structure
- */
+/* Main object structure */
 typedef struct _GtrPreferencesDialog GtrPreferencesDialog;
 
 struct _GtrPreferencesDialog
@@ -59,9 +49,7 @@ struct _GtrPreferencesDialog
   GtrPreferencesDialogPrivate *priv;
 };
 
-/*
- * Class definition
- */
+/* Class definition */
 typedef struct _GtrPreferencesDialogClass GtrPreferencesDialogClass;
 
 struct _GtrPreferencesDialogClass
@@ -69,22 +57,11 @@ struct _GtrPreferencesDialogClass
   GtkDialogClass parent_class;
 };
 
-/*
- * Public methods
- */
-GType
-gtr_preferences_dialog_get_type (void)
-  G_GNUC_CONST;
-
-     GType gtr_preferences_dialog_register_type (GTypeModule * module);
-
-     void gtr_show_preferences_dialog (GtrWindow * window);
+/* Public methods */
+GType           gtr_preferences_dialog_get_type         (void)G_GNUC_CONST;
 
-GtkWidget * gtr_preferences_dialog_get_treeview (GtrPreferencesDialog * dlg);
-
-     void
-       gtr_preferences_fill_profile_treeview
-       (GtrPreferencesDialog * dlg, GtkTreeModel * model);
+void            gtr_show_preferences_dialog             (GtrWindow *window);
 
 G_END_DECLS
+
 #endif /* __PREFERENCES_DIALOG_H__ */
diff --git a/src/dialogs/gtr-profile-dialog.c b/src/dialogs/gtr-profile-dialog.c
index 7a94a0f..df44ea4 100644
--- a/src/dialogs/gtr-profile-dialog.c
+++ b/src/dialogs/gtr-profile-dialog.c
@@ -16,329 +16,57 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  * Authors:
- *   Pablo Sanxiao <psanxiao gmail com> 
+ *   Pablo Sanxiao <psanxiao gmail com>
+ *   Ignacio Casal Quinteiro <icq gnome org>
  */
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
-#include "gtr-application.h"
 #include "gtr-dirs.h"
 #include "gtr-profile-dialog.h"
-#include "gtr-preferences-dialog.h"
 #include "gtr-profile.h"
 #include "gtr-utils.h"
 
 #include <string.h>
 #include <glib.h>
 #include <glib/gi18n.h>
-#include <glib-object.h>
 #include <gtk/gtk.h>
-#include <libxml/tree.h>
 
 
 #define GTR_PROFILE_DIALOG_GET_PRIVATE(object)	(G_TYPE_INSTANCE_GET_PRIVATE ( \
-						 	(object),	\
-						 	GTR_TYPE_PROFILE_DIALOG,     \
-						 	GtrProfileDialogPrivate))
+                                                 (object), \
+                                                 GTR_TYPE_PROFILE_DIALOG, \
+                                                 GtrProfileDialogPrivate))
 
 G_DEFINE_TYPE (GtrProfileDialog, gtr_profile_dialog, GTK_TYPE_DIALOG)
-     struct _GtrProfileDialogPrivate
-     {
-       GtkWidget *main_box;
 
-       GtkWidget *profile_name_entry;
-
-       GtkWidget *author_name_entry;
-       GtkWidget *author_email_entry;
-
-       GtkWidget *language_name_entry;
-       GtkWidget *language_code_entry;
-       GtkWidget *charset_entry;
-       GtkWidget *encoding_entry;
-       GtkWidget *language_email_entry;
-       GtkWidget *plurals_forms_entry;
-
-       GtrPreferencesDialog *prefs_dlg;
-
-       GtrProfile *new_profile;
-       GtrProfile *old_profile;
-     };
-
-     static void gtr_profile_dialog_finalize (GObject * object)
-{
-  G_OBJECT_CLASS (gtr_profile_dialog_parent_class)->finalize (object);
-}
-
-static void
-gtr_profile_dialog_class_init (GtrProfileDialogClass * klass)
-{
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-  g_type_class_add_private (klass, sizeof (GtrProfileDialogPrivate));
-
-  object_class->finalize = gtr_profile_dialog_finalize;
-}
-
-/***************PROFILES****************/
-static void
-profile_name_entry_changed (GObject * gobject,
-                            GParamSpec * arg1, GtrProfileDialog * profile_dlg)
-{
-  const gchar *text;
-
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->profile_name_entry)); */
-
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
-
-  if (text)
-    gtr_profile_set_name (profile_dlg->priv->new_profile, (gchar *) text);
-}
-
-static void
-author_name_entry_changed (GObject * gobject,
-                           GParamSpec * arg1, GtrProfileDialog * profile_dlg)
-{
-  const gchar *text;
-
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->author_name_entry)); */
-
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
-
-  if (text)
-    gtr_profile_set_author_name (profile_dlg->priv->new_profile,
-                                 (gchar *) text);
-}
-
-static void
-author_email_entry_changed (GObject * gobject,
-                            GParamSpec * arg1, GtrProfileDialog * profile_dlg)
-{
-  const gchar *text;
-
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->author_email_entry)); */
-
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
-
-  if (text)
-    gtr_profile_set_author_email (profile_dlg->priv->new_profile,
-                                  (gchar *) text);
-}
-
-static void
-language_name_entry_changed (GObject * gobject,
-                             GParamSpec * arg1,
-                             GtrProfileDialog * profile_dlg)
-{
-  const gchar *text;
-
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->profile_name_entry)); */
-
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
-
-  if (text)
-    gtr_profile_set_language_name (profile_dlg->priv->new_profile,
-                                   (gchar *) text);
-}
-
-static void
-language_code_entry_changed (GObject * gobject,
-                             GParamSpec * arg1,
-                             GtrProfileDialog * profile_dlg)
-{
-  const gchar *text;
-
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->profile_name_entry)); */
-
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
-
-  if (text)
-    gtr_profile_set_language_code (profile_dlg->priv->new_profile,
-                                   (gchar *) text);
-}
-
-static void
-charset_entry_changed (GObject * gobject,
-                       GParamSpec * arg1, GtrProfileDialog * profile_dlg)
-{
-  const gchar *text;
-
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->profile_name_entry)); */
-
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
-
-  if (text)
-    gtr_profile_set_charset (profile_dlg->priv->new_profile, (gchar *) text);
-}
-
-static void
-encoding_entry_changed (GObject * gobject,
-                        GParamSpec * arg1, GtrProfileDialog * profile_dlg)
-{
-  const gchar *text;
-
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->profile_name_entry)); */
-
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
-
-  if (text)
-    gtr_profile_set_encoding (profile_dlg->priv->new_profile, (gchar *) text);
-}
-
-static void
-group_email_entry_changed (GObject * gobject,
-                           GParamSpec * arg1, GtrProfileDialog * profile_dlg)
-{
-  const gchar *text;
-
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->profile_name_entry)); */
-
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
-
-  if (text)
-    gtr_profile_set_group_email (profile_dlg->priv->new_profile,
-                                 (gchar *) text);
-}
-
-static void
-plurals_entry_changed (GObject * gobject,
-                       GParamSpec * arg1, GtrProfileDialog * profile_dlg)
+struct _GtrProfileDialogPrivate
 {
-  const gchar *text;
+  GtkWidget *main_box;
 
-  /*g_return_if_fail (GTK_ENTRY (gobject) == GTK_ENTRY (dlg->priv->profile_name_entry)); */
+  GtkWidget *profile_name_entry;
 
-  text = gtk_entry_get_text (GTK_ENTRY (gobject));
+  GtkWidget *author_name_entry;
+  GtkWidget *author_email_entry;
 
-  if (text)
-    gtr_profile_set_plurals (profile_dlg->priv->new_profile, (gchar *) text);
-}
+  GtkWidget *language_name_entry;
+  GtkWidget *language_code_entry;
+  GtkWidget *charset_entry;
+  GtkWidget *encoding_entry;
+  GtkWidget *language_email_entry;
+  GtkWidget *plural_forms_entry;
+};
 
 static void
-save_new_profile (GtkWidget * widget, GtrProfileDialog * profile_dlg)
+gtr_profile_dialog_class_init (GtrProfileDialogClass *klass)
 {
-  GList *profiles_list = NULL, *l = NULL;
-  GtrPreferencesDialog *dlg;
-  gboolean profile_exists;
-  GtkWidget *treeview;
-  GtkTreeModel *model;
-  profile_exists = FALSE;
-
-  profiles_list = gtr_application_get_profiles (GTR_APP);
-
-  for (l = profiles_list; l; l = l->next)
-    {
-      GtrProfile *profile_in_list;
-      profile_in_list = (GtrProfile *) l->data;
-      if (!strcmp (gtr_profile_get_name (profile_in_list),
-                   gtr_profile_get_name (profile_dlg->priv->new_profile)))
-        profile_exists = TRUE;
-    }
-
-  if (profile_exists)
-    {
-      GtkWidget *dialog;
-      dialog =
-        gtk_message_dialog_new (GTK_WINDOW
-                                (gtk_widget_get_ancestor
-                                 (widget, GTK_TYPE_DIALOG)), GTK_DIALOG_MODAL,
-                                GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, NULL);
-
-      gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog),
-                                     _
-                                     ("<span weight=\"bold\" size=\"large\">The profile name already exists</span>"));
-
-      gtk_dialog_run (GTK_DIALOG (dialog));
-      gtk_widget_destroy (dialog);
-    }
-  else
-    {
-      /*
-       * Add new profile to profiles list in memory
-       */
-      if (profiles_list == NULL)
-        {
-          GList *initial_list = NULL;
-          initial_list =
-            g_list_append (profiles_list, profile_dlg->priv->new_profile);
-          gtr_application_set_active_profile (GTR_APP,
-                                              profile_dlg->priv->new_profile);
-          gtr_application_set_profiles (GTR_APP, initial_list);
-        }
-      else
-        {
-          profiles_list =
-            g_list_append (profiles_list, profile_dlg->priv->new_profile);
-        }
-    }
-
-  /*
-   *Reload the preferences dialog
-   */
-  dlg = profile_dlg->priv->prefs_dlg;
-
-  treeview = gtr_preferences_dialog_get_treeview (dlg);
-
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
-  g_return_if_fail (GTK_IS_LIST_STORE (model));
-
-  gtr_preferences_fill_profile_treeview (dlg, model);
-
-  gtk_widget_destroy (gtk_widget_get_ancestor (widget, GTK_TYPE_DIALOG));
-}
-
-static void
-save_modified_profile (GtkWidget * widget, GtrProfileDialog * profile_dlg)
-{
-  GtkWidget *treeview;
-  GtkTreeModel *model;
-
-  g_return_if_fail (GTR_IS_PREFERENCES_DIALOG (profile_dlg->priv->prefs_dlg));
-
-  treeview =
-    gtr_preferences_dialog_get_treeview (profile_dlg->priv->prefs_dlg);
-
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
-  g_return_if_fail (GTK_IS_LIST_STORE (model));
-
-  gtr_preferences_fill_profile_treeview (profile_dlg->priv->prefs_dlg, model);
-  gtk_widget_destroy (gtk_widget_get_ancestor (widget, GTK_TYPE_DIALOG));
-}
-
-static void
-destroy_without_changes (GtkWidget * widget, GtrProfileDialog * dlg)
-{
-  gtr_profile_set_name (dlg->priv->new_profile,
-                        gtr_profile_get_name (dlg->priv->old_profile));
-  gtr_profile_set_author_name (dlg->priv->new_profile,
-                               gtr_profile_get_author_name
-                               (dlg->priv->old_profile));
-  gtr_profile_set_author_email (dlg->priv->new_profile,
-                                gtr_profile_get_author_email
-                                (dlg->priv->old_profile));
-  gtr_profile_set_language_name (dlg->priv->new_profile,
-                                 gtr_profile_get_language_name
-                                 (dlg->priv->old_profile));
-  gtr_profile_set_language_code (dlg->priv->new_profile,
-                                 gtr_profile_get_language_code
-                                 (dlg->priv->old_profile));
-  gtr_profile_set_charset (dlg->priv->new_profile,
-                           gtr_profile_get_charset (dlg->priv->old_profile));
-  gtr_profile_set_encoding (dlg->priv->new_profile,
-                            gtr_profile_get_encoding
-                            (dlg->priv->old_profile));
-  gtr_profile_set_group_email (dlg->priv->new_profile,
-                               gtr_profile_get_group_email (dlg->priv->
-                                                            old_profile));
-  gtr_profile_set_plurals (dlg->priv->new_profile,
-                           gtr_profile_get_plurals (dlg->priv->old_profile));
-
-  gtk_widget_destroy (gtk_widget_get_ancestor (widget, GTK_TYPE_DIALOG));
+  g_type_class_add_private (klass, sizeof (GtrProfileDialogPrivate));
 }
 
 static void
-gtr_profile_dialog_init (GtrProfileDialog * dlg)
+gtr_profile_dialog_init (GtrProfileDialog *dlg)
 {
   gboolean ret;
   GtkWidget *error_widget;
@@ -350,13 +78,22 @@ gtr_profile_dialog_init (GtrProfileDialog * dlg)
 
   dlg->priv = GTR_PROFILE_DIALOG_GET_PRIVATE (dlg);
 
+  gtk_dialog_add_buttons (GTK_DIALOG (dlg),
+                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                          NULL);
+
   gtk_window_set_title (GTK_WINDOW (dlg), _("Gtranslator Profile"));
   gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
   gtk_dialog_set_has_separator (GTK_DIALOG (dlg), FALSE);
   gtk_window_set_destroy_with_parent (GTK_WINDOW (dlg), TRUE);
+  gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
 
+  /* HIG defaults */
   gtk_container_set_border_width (GTK_CONTAINER (dlg), 5);
-  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dlg)->vbox), 2);
+  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dlg)->vbox), 2); /* 2 * 5 + 2 = 12 */
+  gtk_container_set_border_width (GTK_CONTAINER
+                                  (GTK_DIALOG (dlg)->action_area), 5);
+  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dlg)->action_area), 4);
 
   path = gtr_dirs_get_ui_file ("gtr-profile-dialog.ui");
   ret = gtr_utils_get_ui_objects (path,
@@ -381,7 +118,7 @@ gtr_profile_dialog_init (GtrProfileDialog * dlg)
                                   "team_email_entry",
                                   &dlg->priv->language_email_entry,
                                   "plurals_entry",
-                                  &dlg->priv->plurals_forms_entry, NULL);
+                                  &dlg->priv->plural_forms_entry, NULL);
   g_free (path);
 
   if (!ret)
@@ -393,188 +130,116 @@ gtr_profile_dialog_init (GtrProfileDialog * dlg)
       return;
     }
 
-  gtk_widget_set_tooltip_text (dlg->priv->plurals_forms_entry,
-                               _("Example: nplurals=2; plural=(n != 1);"));
-
   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox),
                       dlg->priv->main_box, FALSE, FALSE, 0);
-  gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
-
 }
 
-void
-gtr_show_profile_dialog (GtrPreferencesDialog * dialog,
-                         GtrProfile * profile, gint action)
+static void
+fill_entries (GtrProfileDialog *dlg, GtrProfile *profile)
 {
-  static GtrProfileDialog *dlg = NULL;
-  GtkButton *ok_button, *cancel_button;
-  GtrProfile *old_profile;
+  if (gtr_profile_get_name (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->profile_name_entry),
+                        gtr_profile_get_name (profile));
 
-  old_profile = gtr_profile_new ();
+  if (gtr_profile_get_author_name (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->author_name_entry),
+                        gtr_profile_get_author_name (profile));
 
-  cancel_button = GTK_BUTTON (gtk_button_new_from_stock (GTK_STOCK_CANCEL));
-  gtk_widget_show (GTK_WIDGET (cancel_button));
-  ok_button = GTK_BUTTON (gtk_button_new_from_stock (GTK_STOCK_OK));
-  gtk_widget_show (GTK_WIDGET (ok_button));
+  if (gtr_profile_get_author_email (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->author_email_entry),
+                        gtr_profile_get_author_email (profile));
 
-  g_return_if_fail (GTR_IS_PREFERENCES_DIALOG (dialog));
+  if (gtr_profile_get_language_name (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->language_name_entry),
+                        gtr_profile_get_language_name (profile));
 
-  if (dlg == NULL)
-    {
-      dlg = g_object_new (GTR_TYPE_PROFILE_DIALOG, NULL);
-      g_signal_connect (dlg,
-                        "destroy", G_CALLBACK (gtk_widget_destroyed), &dlg);
-      gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dlg)->action_area),
-                         GTK_WIDGET (cancel_button));
+  if (gtr_profile_get_language_code (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->language_code_entry),
+                        gtr_profile_get_language_code (profile));
 
-      gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dlg)->action_area),
-                         GTK_WIDGET (ok_button));
+  if (gtr_profile_get_charset (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->charset_entry),
+                        gtr_profile_get_charset (profile));
 
-      dlg->priv->prefs_dlg = dialog;
+  if (gtr_profile_get_encoding (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->encoding_entry),
+                        gtr_profile_get_encoding (profile));
 
-      gtk_widget_show (GTK_WIDGET (dlg));
-    }
+  if (gtr_profile_get_group_email (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->language_email_entry),
+                        gtr_profile_get_group_email (profile));
 
-  if (GTK_WINDOW (dialog) != gtk_window_get_transient_for (GTK_WINDOW (dlg)))
-    {
-      gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (dialog));
-    }
+  if (gtr_profile_get_plural_forms (profile) != NULL)
+    gtk_entry_set_text (GTK_ENTRY (dlg->priv->plural_forms_entry),
+                        gtr_profile_get_plural_forms (profile));
+}
 
-  if (gtr_profile_get_name (profile) != NULL)
-    {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->
-                           priv->profile_name_entry),
-                          gtr_profile_get_name (profile));
-      gtr_profile_set_name (old_profile, gtr_profile_get_name (profile));
-    }
+GtrProfileDialog *
+gtr_profile_dialog_new (GtkWidget  *parent,
+                        GtrProfile *profile)
+{
+  GtrProfileDialog *dlg;
 
-  if (gtr_profile_get_author_name (profile) != NULL)
-    {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->priv->author_name_entry),
-                          gtr_profile_get_author_name (profile));
-      gtr_profile_set_author_name (old_profile,
-                                   gtr_profile_get_author_name (profile));
-    }
+  dlg = g_object_new (GTR_TYPE_PROFILE_DIALOG, NULL);
 
-  if (gtr_profile_get_author_email (profile) != NULL)
+  if (profile != NULL)
     {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->
-                           priv->author_email_entry),
-                          gtr_profile_get_author_email (profile));
-      gtr_profile_set_author_email (old_profile,
-                                    gtr_profile_get_author_email (profile));
-    }
+      fill_entries (dlg, profile);
 
-  if (gtr_profile_get_language_name (profile) != NULL)
-    {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->
-                           priv->language_name_entry),
-                          gtr_profile_get_language_name (profile));
-      gtr_profile_set_language_name (old_profile,
-                                     gtr_profile_get_language_name (profile));
+      /* We distinguish in the preferences dialog if we are modifying
+         or adding a new profile depending on the response */
+      gtk_dialog_add_button (GTK_DIALOG (dlg),
+                             GTK_STOCK_OK, GTK_RESPONSE_YES);
     }
-
-  if (gtr_profile_get_language_code (profile) != NULL)
+  else
     {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->
-                           priv->language_code_entry),
-                          gtr_profile_get_language_code (profile));
-      gtr_profile_set_language_code (old_profile,
-                                     gtr_profile_get_language_code (profile));
+      gtk_dialog_add_button (GTK_DIALOG (dlg),
+                             GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
     }
 
-  if (gtr_profile_get_charset (profile) != NULL)
+  if (GTK_WINDOW (parent) != gtk_window_get_transient_for (GTK_WINDOW (dlg)))
     {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->priv->charset_entry),
-                          gtr_profile_get_charset (profile));
-      gtr_profile_set_charset (old_profile,
-                               gtr_profile_get_charset (profile));
+      gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (parent));
     }
 
-  if (gtr_profile_get_encoding (profile) != NULL)
-    {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->priv->encoding_entry),
-                          gtr_profile_get_encoding (profile));
-      gtr_profile_set_encoding (old_profile,
-                                gtr_profile_get_encoding (profile));
-    }
+  return dlg;
+}
 
-  if (gtr_profile_get_group_email (profile) != NULL)
-    {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->
-                           priv->language_email_entry),
-                          gtr_profile_get_group_email (profile));
-      gtr_profile_set_group_email (old_profile,
-                                   gtr_profile_get_group_email (profile));
-    }
+GtrProfile *
+gtr_profile_dialog_get_profile (GtrProfileDialog *dlg)
+{
+  GtrProfile *profile;
 
-  if (gtr_profile_get_plurals (profile) != NULL)
-    {
-      gtk_entry_set_text (GTK_ENTRY
-                          (GTR_PROFILE_DIALOG (dlg)->
-                           priv->plurals_forms_entry),
-                          gtr_profile_get_plurals (profile));
-      gtr_profile_set_plurals (old_profile,
-                               gtr_profile_get_plurals (profile));
-    }
+  g_return_val_if_fail (GTR_IS_PROFILE_DIALOG (dlg), NULL);
 
-  dlg->priv->old_profile = old_profile;
-  dlg->priv->new_profile = profile;
-
-  /* Connect entry signals */
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->profile_name_entry,
-                    "notify::text", G_CALLBACK (profile_name_entry_changed),
-                    dlg);
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->author_name_entry,
-                    "notify::text", G_CALLBACK (author_name_entry_changed),
-                    dlg);
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->author_email_entry,
-                    "notify::text", G_CALLBACK (author_email_entry_changed),
-                    dlg);
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->language_name_entry,
-                    "notify::text", G_CALLBACK (language_name_entry_changed),
-                    dlg);
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->language_code_entry,
-                    "notify::text", G_CALLBACK (language_code_entry_changed),
-                    dlg);
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->charset_entry,
-                    "notify::text", G_CALLBACK (charset_entry_changed), dlg);
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->encoding_entry,
-                    "notify::text", G_CALLBACK (encoding_entry_changed), dlg);
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->language_email_entry,
-                    "notify::text", G_CALLBACK (group_email_entry_changed),
-                    dlg);
-  g_signal_connect (GTR_PROFILE_DIALOG (dlg)->priv->plurals_forms_entry,
-                    "notify::text", G_CALLBACK (plurals_entry_changed), dlg);
-
-  /*
-   * Connect signals to dialog buttons.
-   */
-
-  g_signal_connect (cancel_button,
-                    "clicked", G_CALLBACK (destroy_without_changes), dlg);
-
-  if (action == NEW_PROFILE)
-    {
-      g_signal_connect (ok_button,
-                        "clicked", G_CALLBACK (save_new_profile), dlg);
-    }
-  else
-    {
-      if (action == EDIT_PROFILE)
-        {
-          g_signal_connect (ok_button,
-                            "clicked",
-                            G_CALLBACK (save_modified_profile), dlg);
-        }
-    }
+  profile = gtr_profile_new ();
+
+  gtr_profile_set_name (profile,
+                        gtk_entry_get_text (GTK_ENTRY (dlg->priv->profile_name_entry)));
+
+  gtr_profile_set_author_name (profile,
+                               gtk_entry_get_text (GTK_ENTRY (dlg->priv->author_name_entry)));
+
+  gtr_profile_set_author_email (profile,
+                                gtk_entry_get_text (GTK_ENTRY (dlg->priv->author_email_entry)));
+
+  gtr_profile_set_language_name (profile,
+                                 gtk_entry_get_text (GTK_ENTRY (dlg->priv->language_name_entry)));
+
+  gtr_profile_set_language_code (profile,
+                                 gtk_entry_get_text (GTK_ENTRY (dlg->priv->language_code_entry)));
+
+  gtr_profile_set_charset (profile,
+                           gtk_entry_get_text (GTK_ENTRY (dlg->priv->charset_entry)));
+
+  gtr_profile_set_encoding (profile,
+                            gtk_entry_get_text (GTK_ENTRY (dlg->priv->encoding_entry)));
+
+  gtr_profile_set_group_email (profile,
+                               gtk_entry_get_text (GTK_ENTRY (dlg->priv->language_email_entry)));
+
+  gtr_profile_set_plural_forms (profile,
+                                gtk_entry_get_text (GTK_ENTRY (dlg->priv->plural_forms_entry)));
 
+  return profile;
 }
diff --git a/src/dialogs/gtr-profile-dialog.h b/src/dialogs/gtr-profile-dialog.h
index fba4de0..0b25ce6 100644
--- a/src/dialogs/gtr-profile-dialog.h
+++ b/src/dialogs/gtr-profile-dialog.h
@@ -27,14 +27,8 @@
 #include <gtk/gtk.h>
 
 #include "gtr-profile.h"
-#include "gtr-window.h"
-#include "gtr-preferences-dialog.h"
 
-enum
-{
-  NEW_PROFILE,
-  EDIT_PROFILE
-};
+G_BEGIN_DECLS
 
 /*
  * Type checking and casting macros
@@ -75,13 +69,13 @@ struct _GtrProfileDialogClass
 /*
  * Public methods
  */
-GType
-gtr_profile_dialog_get_type (void)
-  G_GNUC_CONST;
+GType               gtr_profile_dialog_get_type         (void) G_GNUC_CONST;
+
+GtrProfileDialog   *gtr_profile_dialog_new              (GtkWidget  *parent,
+                                                         GtrProfile *profile);
 
-     GType gtr_profile_dialog_register_type (GTypeModule * module);
+GtrProfile         *gtr_profile_dialog_get_profile      (GtrProfileDialog *dlg);
 
-     void gtr_show_profile_dialog (GtrPreferencesDialog *
-                                   dialog, GtrProfile * profile, gint action);
+G_END_DECLS
 
 #endif
diff --git a/src/gtr-actions-file.c b/src/gtr-actions-file.c
index 289e24b..ab67894 100644
--- a/src/gtr-actions-file.c
+++ b/src/gtr-actions-file.c
@@ -37,7 +37,6 @@
 #include "gtr-file-dialogs.h"
 #include "gtr-notebook.h"
 #include "gtr-po.h"
-#include "gtr-profile.h"
 #include "gtr-statusbar.h"
 #include "gtr-tab.h"
 #include "gtr-utils.h"
@@ -741,49 +740,6 @@ close_all_documents (GtrWindow * window, gboolean logout_mode)
 void
 gtr_file_quit (GtkAction * action, GtrWindow * window)
 {
-  GList *profiles_list = NULL;
-  gchar *config_folder;
-  gchar *filename, *filename_temp;
-  GFile *file, *file_temp;
-  gint r;
-
-  config_folder = gtr_dirs_get_user_config_dir ();
-  filename = g_build_filename (config_folder, "profiles.xml", NULL);
-  g_free (config_folder);
-  filename_temp = g_build_filename (g_get_tmp_dir (), "profiles.xml", NULL);
-
-  file = g_file_new_for_path (filename);
-  file_temp = g_file_new_for_path (filename_temp);
-
-  profiles_list = gtr_application_get_profiles (GTR_APP);
-
-  if (profiles_list != NULL)
-    {
-      if (g_file_query_exists (file_temp, NULL))
-        {
-          r = gtr_profile_save_profiles_in_xml (filename_temp);
-        }
-      else
-        {
-          g_file_create (file_temp, G_FILE_CREATE_NONE, NULL, NULL);
-          r = gtr_profile_save_profiles_in_xml (filename_temp);
-        }
-      if (r != -1)
-        {
-          g_file_move (file_temp,
-                       file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, NULL);
-        }
-      else
-        {
-          g_warning (_
-                     ("Failed to write profile data into profiles file '%s'"),
-                     filename);
-        }
-    }
-
-  g_object_unref (file_temp);
-  g_object_unref (file);
-
   g_object_set_data (G_OBJECT (window),
                      GTR_IS_CLOSING_ALL, GINT_TO_POINTER (1));
 
diff --git a/src/gtr-dirs.h b/src/gtr-dirs.h
index 71f2247..276b576 100644
--- a/src/gtr-dirs.h
+++ b/src/gtr-dirs.h
@@ -26,7 +26,9 @@
 
 #include <glib.h>
 
-G_BEGIN_DECLS gchar * gtr_dirs_get_user_config_dir (void);
+G_BEGIN_DECLS
+
+gchar *gtr_dirs_get_user_config_dir (void);
 
 gchar *gtr_dirs_get_user_cache_dir (void);
 
diff --git a/src/gtr-header.c b/src/gtr-header.c
index 39ac129..fc4f5ca 100644
--- a/src/gtr-header.c
+++ b/src/gtr-header.c
@@ -26,6 +26,7 @@
 #include "gtr-header.h"
 #include "gtr-prefs-manager.h"
 #include "gtr-profile.h"
+#include "gtr-profile-manager.h"
 #include "gtr-utils.h"
 
 #include <glib.h>
@@ -71,12 +72,16 @@ parse_nplurals (GtrHeader * header)
   if (gtr_prefs_manager_get_use_profile_values () || !plural_forms)
     {
       const gchar *plural_form = NULL;
+      GtrProfileManager *prof_manager;
       GtrProfile *profile;
 
-      profile = gtr_application_get_active_profile (GTR_APP);
+      /* TODO: Manage this also per document */
+      prof_manager = gtr_profile_manager_get_default ();
+      profile = gtr_profile_manager_get_active_profile (prof_manager);
+      g_object_unref (prof_manager);
 
       if (profile)
-        plural_form = gtr_profile_get_plurals (profile);
+        plural_form = gtr_profile_get_plural_forms (profile);
       else if (!plural_forms)
         return;
 
@@ -493,11 +498,11 @@ gtr_header_get_nplurals (GtrHeader * header)
 }
 
 static void
-set_profile_values (GtrHeader * header)
+set_profile_values (GtrHeader *header, GtrProfileManager *prof_manager)
 {
   GtrProfile *active_profile;
 
-  active_profile = gtr_application_get_active_profile (GTR_APP);
+  active_profile = gtr_profile_manager_get_active_profile (prof_manager);
 
   if (gtr_prefs_manager_get_use_profile_values () && active_profile != NULL)
     {
@@ -513,7 +518,7 @@ set_profile_values (GtrHeader * header)
       gtr_header_set_encoding (header,
                                gtr_profile_get_encoding (active_profile));
       gtr_header_set_plural_forms (header,
-                                   gtr_profile_get_plurals (active_profile));
+                                   gtr_profile_get_plural_forms (active_profile));
     }
 }
 
@@ -538,7 +543,8 @@ update_po_date (GtrHeader * header)
 }
 
 static void
-update_comments (GtrHeader * header, const gchar * comments)
+update_comments (GtrHeader *header, const gchar *comments,
+                 GtrProfileManager *prof_manager)
 {
   GtrProfile *active_profile;
   GString *new_comments;
@@ -549,7 +555,7 @@ update_comments (GtrHeader * header, const gchar * comments)
   gchar *current_year;
   gint i;
 
-  active_profile = gtr_application_get_active_profile (GTR_APP);
+  active_profile = gtr_profile_manager_get_active_profile (prof_manager);
   current_year = gtr_utils_get_current_year ();
 
   /* Save the previous translator to update the header's comment */
@@ -637,10 +643,13 @@ add_default_comments (GtrHeader * header)
 void
 gtr_header_update_header (GtrHeader * header)
 {
+  GtrProfileManager *prof_manager;
   const gchar *comments;
 
+  prof_manager = gtr_profile_manager_get_default ();
+
   /* If needed update the header with the profile values */
-  set_profile_values (header);
+  set_profile_values (header, prof_manager);
 
   /* Update the po date */
   update_po_date (header);
@@ -649,7 +658,9 @@ gtr_header_update_header (GtrHeader * header)
   comments = gtr_header_get_comments (header);
 
   if (comments != NULL)
-    update_comments (header, comments);
+    update_comments (header, comments, prof_manager);
   else
     add_default_comments (header);
+
+  g_object_unref (prof_manager);
 }
diff --git a/src/gtr-header.h b/src/gtr-header.h
index 8b41970..27c587f 100644
--- a/src/gtr-header.h
+++ b/src/gtr-header.h
@@ -29,6 +29,8 @@
 
 #include "gtr-msg.h"
 
+G_BEGIN_DECLS
+
 /*
  * Utility Macros
  */
@@ -125,4 +127,6 @@ gtr_header_get_type (void)
 
      void gtr_header_update_header (GtrHeader * header);
 
+G_END_DECLS
+
 #endif /* __HEADER_H__ */
diff --git a/src/gtr-profile-manager.c b/src/gtr-profile-manager.c
index fcaf774..5e54250 100644
--- a/src/gtr-profile-manager.c
+++ b/src/gtr-profile-manager.c
@@ -211,58 +211,6 @@ load_profiles (GtrProfileManager *manager)
 }
 
 static void
-gtr_profile_manager_init (GtrProfileManager *manager)
-{
-  manager->priv = GTR_PROFILE_MANAGER_GET_PRIVATE (manager);
-
-  manager->priv->profiles = NULL;
-  manager->priv->active_profile = NULL;
-
-  load_profiles (manager);
-}
-
-GtrProfileManager *
-gtr_profile_manager_get_default ()
-{
-  static GtrProfileManager *manager = NULL;
-
-  if (manager == NULL)
-    {
-      manager = g_object_new (GTR_TYPE_PROFILE_MANAGER, NULL);
-      return manager;
-    }
-
-  return g_object_ref (manager);
-}
-
-GSList *
-gtr_profile_manager_get_profiles (GtrProfileManager *manager)
-{
-  g_return_val_if_fail (GTR_IS_PROFILE_MANAGER (manager), NULL);
-
-  return manager->priv->profiles;
-}
-
-GtrProfile *
-gtr_profile_manager_get_active_profile (GtrProfileManager *manager)
-{
-  g_return_val_if_fail (GTR_IS_PROFILE_MANAGER (manager), NULL);
-
-  return manager->priv->active_profile;
-}
-
-void
-gtr_profile_manager_add_profile (GtrProfileManager *manager,
-                                 GtrProfile        *profile)
-{
-  g_return_if_fail (GTR_IS_PROFILE_MANAGER (manager));
-  g_return_if_fail (profile != NULL);
-
-  manager->priv->profiles = g_slist_append (manager->priv->profiles,
-                                            profile);
-}
-
-static void
 save_profile (GtrProfileManager *manager,
               GtrProfile        *profile,
               xmlNodePtr         parent)
@@ -294,8 +242,8 @@ save_profile (GtrProfileManager *manager,
                    (const xmlChar *)gtr_profile_get_plural_forms (profile));
 }
 
-void
-gtr_profile_manager_save (GtrProfileManager *manager)
+static void
+save_profiles (GtrProfileManager *manager)
 {
   xmlDocPtr  doc;
   xmlNodePtr root;
@@ -335,3 +283,108 @@ gtr_profile_manager_save (GtrProfileManager *manager)
 
   xmlFreeDoc (doc);
 }
+
+static void
+gtr_profile_manager_init (GtrProfileManager *manager)
+{
+  manager->priv = GTR_PROFILE_MANAGER_GET_PRIVATE (manager);
+
+  manager->priv->profiles = NULL;
+  manager->priv->active_profile = NULL;
+
+  load_profiles (manager);
+}
+
+GtrProfileManager *
+gtr_profile_manager_get_default ()
+{
+  static GtrProfileManager *manager = NULL;
+
+  if (manager == NULL)
+    {
+      manager = g_object_new (GTR_TYPE_PROFILE_MANAGER, NULL);
+      return manager;
+    }
+
+  return g_object_ref (manager);
+}
+
+GSList *
+gtr_profile_manager_get_profiles (GtrProfileManager *manager)
+{
+  g_return_val_if_fail (GTR_IS_PROFILE_MANAGER (manager), NULL);
+
+  return manager->priv->profiles;
+}
+
+GtrProfile *
+gtr_profile_manager_get_active_profile (GtrProfileManager *manager)
+{
+  g_return_val_if_fail (GTR_IS_PROFILE_MANAGER (manager), NULL);
+
+  return manager->priv->active_profile;
+}
+
+void
+gtr_profile_manager_set_active_profile (GtrProfileManager *manager,
+                                        GtrProfile        *profile)
+{
+  g_return_if_fail (GTR_IS_PROFILE_MANAGER (manager));
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+
+  manager->priv->active_profile = profile;
+  save_profiles (manager);
+}
+
+void
+gtr_profile_manager_add_profile (GtrProfileManager *manager,
+                                 GtrProfile        *profile)
+{
+  g_return_if_fail (GTR_IS_PROFILE_MANAGER (manager));
+  g_return_if_fail (profile != NULL);
+
+  if (manager->priv->profiles == NULL)
+    manager->priv->active_profile = profile;
+
+  manager->priv->profiles = g_slist_append (manager->priv->profiles,
+                                            profile);
+
+  save_profiles (manager);
+}
+
+void
+gtr_profile_manager_remove_profile (GtrProfileManager *manager,
+                                    GtrProfile        *profile)
+{
+  g_return_if_fail (GTR_IS_PROFILE_MANAGER (manager));
+  g_return_if_fail (profile != NULL);
+
+  manager->priv->profiles = g_slist_remove (manager->priv->profiles,
+                                            profile);
+
+  save_profiles (manager);
+}
+
+void
+gtr_profile_manager_modify_profile (GtrProfileManager *manager,
+                                    GtrProfile        *old_profile,
+                                    GtrProfile        *new_profile)
+{
+  GSList *p;
+
+  g_return_if_fail (GTR_IS_PROFILE_MANAGER (manager));
+  g_return_if_fail (old_profile != NULL);
+  g_return_if_fail (new_profile != NULL);
+
+  p = g_slist_find (manager->priv->profiles,
+                    old_profile);
+
+  p->data = new_profile;
+
+  if (manager->priv->active_profile == old_profile)
+    manager->priv->active_profile = new_profile;
+
+  g_object_unref (old_profile);
+
+  save_profiles (manager);
+}
diff --git a/src/gtr-profile-manager.h b/src/gtr-profile-manager.h
index 3f1ae03..a655399 100644
--- a/src/gtr-profile-manager.h
+++ b/src/gtr-profile-manager.h
@@ -59,10 +59,18 @@ GSList                *gtr_profile_manager_get_profiles       (GtrProfileManager
 
 GtrProfile            *gtr_profile_manager_get_active_profile (GtrProfileManager *manager);
 
+void                   gtr_profile_manager_set_active_profile (GtrProfileManager *manager,
+                                                               GtrProfile        *profile);
+
 void                   gtr_profile_manager_add_profile        (GtrProfileManager *manager,
                                                                GtrProfile        *profile);
 
-void                   gtr_profile_manager_save               (GtrProfileManager *manager);
+void                   gtr_profile_manager_remove_profile     (GtrProfileManager *manager,
+                                                               GtrProfile        *profile);
+
+void                   gtr_profile_manager_modify_profile     (GtrProfileManager *manager,
+                                                               GtrProfile        *old_profile,
+                                                               GtrProfile        *new_profile);
 
 G_END_DECLS
 
diff --git a/src/gtr-profile.c b/src/gtr-profile.c
index c13673c..23f3141 100644
--- a/src/gtr-profile.c
+++ b/src/gtr-profile.c
@@ -1,12 +1,12 @@
 /*
  * (C) 2008 	Pablo Sanxiao <psanxiao gmail com>
  *		Igalia
- *	
+ *
  * gtranslator is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 3 of the License, or   
  * (at your option) any later version.
- *    
+ *
  * gtranslator is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
@@ -18,6 +18,7 @@
  *
  * Authors:
  *   Pablo Sanxiao <psanxiao gmail com>
+ *   Ignacio Casal Quinteiro <icq gnome org>
  */
 
 #include "gtr-application.h"
@@ -26,78 +27,50 @@
 #include "gtr-utils.h"
 
 #include <glib.h>
-#include <glib-object.h>
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-#ifdef G_OS_WIN32
-#define SAVE_DATADIR DATADIR
-#undef DATADIR
-#include <winsock2.h>
-#define DATADIR SAVE_DATADIR
-#undef SAVE_DATADIR
-#else
-#include <sys/socket.h>
-#endif
-
 
 #define GTR_PROFILE_GET_PRIVATE(object)	(G_TYPE_INSTANCE_GET_PRIVATE ( \
-					 	(object),	\
-					 	GTR_TYPE_PROFILE,     \
-					 	GtrProfilePrivate))
+                                         (object), \
+                                         GTR_TYPE_PROFILE, \
+                                         GtrProfilePrivate))
 
 G_DEFINE_TYPE (GtrProfile, gtr_profile, G_TYPE_OBJECT)
-     struct _GtrProfilePrivate
-     {
-       /* 
-        * Identify the profile
-        */
-       gchar *name;
-
-       /*
-        * Translator's information
-        */
-       gchar *author_name;
-       gchar *author_email;
-
-       /*
-        * Complete language name
-        */
-       gchar *language_name;
-
-       /*
-        * Language code. Example: "en" -> English
-        */
-       gchar *language_code;
-
-       /*
-        * Set of characters. Example: UTF-8
-        */
-       gchar *charset;
-
-       /*
-        * Encoding. Example: 8 bits
-        */
-       gchar *encoding;
-
-       /*
-        * Email of the group of translation
-        */
-       gchar *group_email;
-
-       /*
-        * Plural forms
-        */
-       gchar *plurals;
-     };
-
-     static void gtr_profile_init (GtrProfile * profile)
+
+struct _GtrProfilePrivate
+{
+  /* Identify the profile */
+  gchar *name;
+
+  /* Translator's information */
+  gchar *author_name;
+  gchar *author_email;
+
+  /* Complete language name */
+  gchar *language_name;
+
+  /* Language code. Example: "en" -> English */
+  gchar *language_code;
+
+  /* Set of characters. Example: UTF-8 */
+  gchar *charset;
+
+  /* Encoding. Example: 8 bits */
+  gchar *encoding;
+
+  /* Email of the group of translation */
+  gchar *group_email;
+
+  /* Plural forms */
+  gchar *plural_forms;
+};
+
+static void
+gtr_profile_init (GtrProfile *profile)
 {
   profile->priv = GTR_PROFILE_GET_PRIVATE (profile);
 }
 
 static void
-gtr_profile_finalize (GObject * object)
+gtr_profile_finalize (GObject *object)
 {
   GtrProfile *profile = GTR_PROFILE (object);
 
@@ -109,13 +82,13 @@ gtr_profile_finalize (GObject * object)
   g_free (profile->priv->charset);
   g_free (profile->priv->encoding);
   g_free (profile->priv->group_email);
-  g_free (profile->priv->plurals);
+  g_free (profile->priv->plural_forms);
 
   G_OBJECT_CLASS (gtr_profile_parent_class)->finalize (object);
 }
 
 static void
-gtr_profile_class_init (GtrProfileClass * klass)
+gtr_profile_class_init (GtrProfileClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
@@ -131,281 +104,176 @@ gtr_profile_class_init (GtrProfileClass * klass)
 GtrProfile *
 gtr_profile_new (void)
 {
-  GtrProfile *profile;
-
-  profile = g_object_new (GTR_TYPE_PROFILE, NULL);
-
-  return profile;
+  return g_object_new (GTR_TYPE_PROFILE, NULL);
 }
 
 const gchar *
-gtr_profile_get_name (GtrProfile * profile)
+gtr_profile_get_name (GtrProfile *profile)
 {
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
+
   return profile->priv->name;
 }
 
 void
-gtr_profile_set_name (GtrProfile * profile, const gchar * data)
+gtr_profile_set_name (GtrProfile  *profile,
+                      const gchar *data)
 {
-  if (profile->priv->name)
-    g_free (profile->priv->name);
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
+
+  g_free (profile->priv->name);
   profile->priv->name = g_strdup (data);
 }
 
 const gchar *
-gtr_profile_get_author_name (GtrProfile * profile)
+gtr_profile_get_author_name (GtrProfile *profile)
 {
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
+
   return profile->priv->author_name;
 }
 
 void
-gtr_profile_set_author_name (GtrProfile * profile, const gchar * data)
+gtr_profile_set_author_name (GtrProfile  *profile,
+                             const gchar *data)
 {
-  if (profile->priv->author_name)
-    g_free (profile->priv->author_name);
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
+
+  g_free (profile->priv->author_name);
   profile->priv->author_name = g_strdup (data);
 }
 
 const gchar *
-gtr_profile_get_author_email (GtrProfile * profile)
+gtr_profile_get_author_email (GtrProfile *profile)
 {
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
+
   return profile->priv->author_email;
 }
 
 void
-gtr_profile_set_author_email (GtrProfile * profile, const gchar * data)
+gtr_profile_set_author_email (GtrProfile  *profile,
+                              const gchar *data)
 {
-  if (profile->priv->author_email)
-    g_free (profile->priv->author_email);
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
+
+  g_free (profile->priv->author_email);
   profile->priv->author_email = g_strdup (data);
 }
 
 const gchar *
-gtr_profile_get_language_name (GtrProfile * profile)
+gtr_profile_get_language_name (GtrProfile *profile)
 {
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
+
   return profile->priv->language_name;
 }
 
 void
-gtr_profile_set_language_name (GtrProfile * profile, const gchar * data)
+gtr_profile_set_language_name (GtrProfile  *profile,
+                               const gchar *data)
 {
-  if (profile->priv->language_name)
-    g_free (profile->priv->language_name);
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
+
+  g_free (profile->priv->language_name);
   profile->priv->language_name = g_strdup (data);
 }
 
 const gchar *
-gtr_profile_get_language_code (GtrProfile * profile)
+gtr_profile_get_language_code (GtrProfile *profile)
 {
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
+
   return profile->priv->language_code;
 }
 
 void
-gtr_profile_set_language_code (GtrProfile * profile, const gchar * data)
+gtr_profile_set_language_code (GtrProfile  *profile,
+                               const gchar *data)
 {
-  if (profile->priv->language_code)
-    g_free (profile->priv->language_code);
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
+
+  g_free (profile->priv->language_code);
   profile->priv->language_code = g_strdup (data);
 }
 
 const gchar *
-gtr_profile_get_charset (GtrProfile * profile)
+gtr_profile_get_charset (GtrProfile *profile)
 {
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
+
   return profile->priv->charset;
 }
 
 void
-gtr_profile_set_charset (GtrProfile * profile, const gchar * data)
+gtr_profile_set_charset (GtrProfile  *profile,
+                         const gchar *data)
 {
-  if (profile->priv->charset)
-    g_free (profile->priv->charset);
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
+
+  g_free (profile->priv->charset);
   profile->priv->charset = g_strdup (data);
 }
 
 const gchar *
-gtr_profile_get_encoding (GtrProfile * profile)
+gtr_profile_get_encoding (GtrProfile *profile)
 {
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
+
   return profile->priv->encoding;
 }
 
 void
-gtr_profile_set_encoding (GtrProfile * profile, const gchar * data)
+gtr_profile_set_encoding (GtrProfile  *profile,
+                          const gchar *data)
 {
-  if (profile->priv->encoding)
-    g_free (profile->priv->encoding);
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
+
+  g_free (profile->priv->encoding);
   profile->priv->encoding = g_strdup (data);
 }
 
 const gchar *
-gtr_profile_get_group_email (GtrProfile * profile)
+gtr_profile_get_group_email (GtrProfile *profile)
 {
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
+
   return profile->priv->group_email;
 }
 
 void
-gtr_profile_set_group_email (GtrProfile * profile, const gchar * data)
+gtr_profile_set_group_email (GtrProfile  *profile,
+                             const gchar *data)
 {
-  if (profile->priv->group_email)
-    g_free (profile->priv->group_email);
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
+
+  g_free (profile->priv->group_email);
   profile->priv->group_email = g_strdup (data);
 }
 
 const gchar *
-gtr_profile_get_plurals (GtrProfile * profile)
+gtr_profile_get_plural_forms (GtrProfile *profile)
 {
-  return profile->priv->plurals;
-}
+  g_return_val_if_fail (GTR_IS_PROFILE (profile), NULL);
 
-void
-gtr_profile_set_plurals (GtrProfile * profile, const gchar * data)
-{
-  if (profile->priv->plurals)
-    g_free (profile->priv->plurals);
-  profile->priv->plurals = g_strdup (data);
+  return profile->priv->plural_forms;
 }
 
-/**
- * gtr_profile_xml_new_entry:
- * @doc: a #xmlDocPtr.
- * @profile: a #GtrProfile object.
- *
- * This function create a new #xmlNodePtr entry into #xmlDocPtr.
- *
- */
 void
-gtr_profile_xml_new_entry (xmlDocPtr doc, GtrProfile * profile)
-{
-  xmlNodePtr root;
-  xmlNodePtr profile_node;
-
-  root = xmlDocGetRootElement (doc);
-  profile_node = xmlNewChild (root, NULL, (const xmlChar *)"profile", NULL);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"profile_name", (const xmlChar *)profile->priv->name);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"author_name",
-                   (const xmlChar *)profile->priv->author_name);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"author_email",
-                   (const xmlChar *)profile->priv->author_email);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"language_name",
-                   (const xmlChar *)profile->priv->language_name);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"language_code",
-                   (const xmlChar *)profile->priv->language_code);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"charset", (const xmlChar *)profile->priv->charset);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"encoding", (const xmlChar *)profile->priv->encoding);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"group_email",
-                   (const xmlChar *)profile->priv->group_email);
-  xmlNewTextChild (profile_node, NULL, (const xmlChar *)"plurals", (const xmlChar *)profile->priv->plurals);
-}
-
-/**
- * gtr_profile_xml_get_entry:
- * @child: a #xmlNodePtr.
- *
- * This function get the values of the #xmlNodePtr and save them into
- * a #GtrProfile object.
- *
- * Returns: a #GtrProfile object.
- */
-GtrProfile *
-gtr_profile_xml_get_entry (xmlNodePtr child)
+gtr_profile_set_plural_forms (GtrProfile  *profile,
+                              const gchar *data)
 {
-  xmlNodePtr node;
-  GtrProfile *profile;
-
-  profile = gtr_profile_new ();
-
-  node = child->xmlChildrenNode;
-
-  profile->priv->name = (gchar *)xmlNodeGetContent (node);
-  node = node->next;
-  profile->priv->author_name = (gchar *)xmlNodeGetContent (node);
-  node = node->next;
-  profile->priv->author_email = (gchar *)xmlNodeGetContent (node);
-  node = node->next;
-  profile->priv->language_name = (gchar *)xmlNodeGetContent (node);
-  node = node->next;
-  profile->priv->language_code = (gchar *)xmlNodeGetContent (node);
-  node = node->next;
-  profile->priv->charset = (gchar *)xmlNodeGetContent (node);
-  node = node->next;
-  profile->priv->encoding = (gchar *)xmlNodeGetContent (node);
-  node = node->next;
-  profile->priv->group_email = (gchar *)xmlNodeGetContent (node);
-  node = node->next;
-  profile->priv->plurals = (gchar *)xmlNodeGetContent (node);
-
-  return profile;
-}
-
-/**
- * gtr_profile_get_profiles_from_xml_file:
- * @filename: a filename path.
- *
- * This function get the profiles saved in a xml file
- * and return a #GList of #GtrProfile objects.
- *
- * returns: a #GList
- */
-GList *
-gtr_profile_get_profiles_from_xml_file (gchar * filename)
-{
-  GList *profiles_list = NULL;
-  GtrProfile *profile;
-  xmlNodePtr root, child, active;
-  xmlDocPtr doc;
-  gchar *active_profile;
-  GList *l;
-
-  doc = gtr_xml_open_file (filename);
-
-  root = xmlDocGetRootElement (doc);
-  child = root->xmlChildrenNode;
-  active = child->xmlChildrenNode;
-
-  active_profile = (gchar *)xmlNodeGetContent (active);
-  child = child->next;
-
-  while (child != NULL)
-    {
-      profile = gtr_profile_xml_get_entry (child);
-      profiles_list = g_list_append (profiles_list, profile);
-      child = child->next;
-    }
-
-  for (l = profiles_list; l; l = l->next)
-    {
-      GtrProfile *profile;
-      profile = (GtrProfile *) l->data;
-      if (!strcmp (gtr_profile_get_name (profile), active_profile))
-        gtr_application_set_active_profile (GTR_APP, profile);
-    }
-
-  return profiles_list;
-}
-
-gint
-gtr_profile_save_profiles_in_xml (gchar * filename)
-{
-
-  xmlNodePtr root;
-  xmlDocPtr doc;
-  GList *profiles_list, *l;
-  GtrProfile *active_profile;
-
-  doc = gtr_xml_new_doc ("list_of_profiles");
-
-  profiles_list = gtr_application_get_profiles (GTR_APP);
-  active_profile = gtr_application_get_active_profile (GTR_APP);
-
-  root = xmlDocGetRootElement (doc);
-
-  xmlNewChild (root, NULL, (const xmlChar *)"active", (const xmlChar *)gtr_profile_get_name (active_profile));
-
-  for (l = profiles_list; l; l = l->next)
-    {
-      GtrProfile *profile;
-      profile = (GtrProfile *) l->data;
-      gtr_profile_xml_new_entry (doc, profile);
-    }
+  g_return_if_fail (GTR_IS_PROFILE (profile));
+  g_return_if_fail (data != NULL);
 
-  return xmlSaveFile (filename, doc);
+  g_free (profile->priv->plural_forms);
+  profile->priv->plural_forms = g_strdup (data);
 }
diff --git a/src/gtr-profile.h b/src/gtr-profile.h
index 78cd73b..7772b0b 100644
--- a/src/gtr-profile.h
+++ b/src/gtr-profile.h
@@ -25,7 +25,6 @@
 
 #include <glib.h>
 #include <glib-object.h>
-#include <libxml/tree.h>
 
 /*
  * Utility Macros
@@ -66,55 +65,44 @@ struct _GtrProfileClass
 /*
  * Public methods
  */
-GType
-gtr_profile_get_type (void)
-  G_GNUC_CONST;
+GType                 gtr_profile_get_type            (void)G_GNUC_CONST;
 
-     GType gtr_profile_register_type (GTypeModule * module);
+GtrProfile           *gtr_profile_new                 (void);
 
-     GtrProfile *gtr_profile_new (void);
+const gchar          *gtr_profile_get_name            (GtrProfile  *profile);
+void                  gtr_profile_set_name            (GtrProfile  *profile,
+                                                       const gchar *data);
 
-     const gchar *gtr_profile_get_name (GtrProfile * profile);
-     void gtr_profile_set_name (GtrProfile * profile, const gchar * data);
+const gchar          *gtr_profile_get_author_name     (GtrProfile  *profile);
+void                  gtr_profile_set_author_name     (GtrProfile  *profile,
+                                                       const gchar *data);
 
-     const gchar *gtr_profile_get_author_name (GtrProfile * profile);
-     void
-       gtr_profile_set_author_name (GtrProfile * profile, const gchar * data);
+const gchar          *gtr_profile_get_author_email    (GtrProfile  *profile);
+void                  gtr_profile_set_author_email    (GtrProfile  *profile,
+                                                       const gchar *data);
 
-     const gchar *gtr_profile_get_author_email (GtrProfile * profile);
-     void
-       gtr_profile_set_author_email (GtrProfile * profile,
-                                     const gchar * data);
+const gchar          *gtr_profile_get_language_name   (GtrProfile  *profile);
+void                  gtr_profile_set_language_name   (GtrProfile  *profile,
+                                                       const gchar *data);
 
-     const gchar *gtr_profile_get_language_name (GtrProfile * profile);
-     void
-       gtr_profile_set_language_name (GtrProfile * profile,
-                                      const gchar * data);
+const gchar          *gtr_profile_get_language_code   (GtrProfile  *profile);
+void                  gtr_profile_set_language_code   (GtrProfile  *profile,
+                                                       const gchar *data);
 
-     const gchar *gtr_profile_get_language_code (GtrProfile * profile);
-     void
-       gtr_profile_set_language_code (GtrProfile * profile,
-                                      const gchar * data);
+const gchar          *gtr_profile_get_charset         (GtrProfile  *profile);
+void                  gtr_profile_set_charset         (GtrProfile  *profile,
+                                                       const gchar *data);
 
-     const gchar *gtr_profile_get_charset (GtrProfile * profile);
-     void gtr_profile_set_charset (GtrProfile * profile, const gchar * data);
+const gchar          *gtr_profile_get_encoding        (GtrProfile  *profile);
+void                  gtr_profile_set_encoding        (GtrProfile  *profile,
+                                                       const gchar *data);
 
-     const gchar *gtr_profile_get_encoding (GtrProfile * profile);
-     void gtr_profile_set_encoding (GtrProfile * profile, const gchar * data);
+const gchar          *gtr_profile_get_group_email     (GtrProfile  *profile);
+void                  gtr_profile_set_group_email     (GtrProfile  *profile,
+                                                       const gchar *data);
 
-     const gchar *gtr_profile_get_group_email (GtrProfile * profile);
-     void
-       gtr_profile_set_group_email (GtrProfile * profile, const gchar * data);
-
-     const gchar *gtr_profile_get_plurals (GtrProfile * profile);
-     void gtr_profile_set_plurals (GtrProfile * profile, const gchar * data);
-
-     void gtr_profile_xml_new_entry (xmlDocPtr doc, GtrProfile * profile);
-     GtrProfile *gtr_profile_xml_get_entry (xmlNodePtr child);
-
-     GList *gtr_profile_get_profiles_from_xml_file (gchar * filename);
-
-gint
-gtr_profile_save_profiles_in_xml (gchar * filename);
+const gchar          *gtr_profile_get_plural_forms    (GtrProfile  *profile);
+void                  gtr_profile_set_plural_forms    (GtrProfile  *profile,
+                                                       const gchar *data);
 
 #endif /* __PROFILE_H__ */
diff --git a/src/gtr-window.c b/src/gtr-window.c
index 41f07a4..d754b58 100644
--- a/src/gtr-window.c
+++ b/src/gtr-window.c
@@ -37,6 +37,7 @@
 #include "gtr-statusbar.h"
 #include "gtr-utils.h"
 #include "gtr-window.h"
+#include "gtr-profile-manager.h"
 
 #include "egg-toolbars-model.h"
 #include "egg-toolbar-editor.h"
@@ -103,6 +104,8 @@ struct _GtrWindowPrivate
   gint height;
   GdkWindowState window_state;
 
+  GtrProfileManager *prof_manager;
+
   gboolean destroy_has_run : 1;
 };
 
@@ -1532,6 +1535,7 @@ gtr_window_init (GtrWindow * window)
   window->priv = GTR_WINDOW_GET_PRIVATE (window);
 
   window->priv->destroy_has_run = FALSE;
+  window->priv->prof_manager = gtr_profile_manager_get_default ();
 
   gtr_window_draw (window);
 
@@ -1607,6 +1611,12 @@ gtr_window_dispose (GObject * object)
       priv->action_group = NULL;
     }
 
+  if (priv->prof_manager != NULL)
+    {
+      g_object_unref (priv->prof_manager);
+      priv->prof_manager = NULL;
+    }
+
   /* Now that there have broken some reference loops,
    * force collection again.
    */
diff --git a/src/main.c b/src/main.c
index 8ef58bf..3d84067 100644
--- a/src/main.c
+++ b/src/main.c
@@ -223,10 +223,6 @@ main (gint argc, gchar * argv[])
   GtrWindow *window;
   GSList *file_list = NULL;
   GOptionContext *context;
-  gchar *filename;
-  gchar *config_folder;
-  GList *profiles_list = NULL;
-  GFile *file;
   gchar *pixmaps_dir;
   gchar **uris;
 



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