Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

mlview-settings-management.c

Go to the documentation of this file.
00001 
00015 #include <sys/stat.h>
00016 
00017 #include <libxml/tree.h>
00018 #include <libxml/parser.h>
00019 
00020 #include "mlview-settings-management.h"
00021 #include "mlview-file-descriptor.h"
00022 #include "mlview-app-context.h"
00023 #include "mlview-parsing-utils.h"
00024 
00025 #define MLVIEW_SETTINGS_DIALOG_DEFAULT_WIDTH 500
00026 #define MLVIEW_SETTINGS_DIALOG_DEFAULT_HEIGHT 300
00027 #define MLVIEW_SETTINGS_DIALOG_MAIN_PANED_PROPORTION 30
00028 
00029 #define MLVIEW_SETTINGS_PERSONAL_SETTINGS_DIR_NAME ".mlview"
00030 #define MLVIEW_SETTINGS_PERSONAL_SETTINGS_FILE_NAME "settings.xml"
00031 
00032 #define PRIVATE(object) (object)->private
00033 
00034 struct _MlViewSettingsEntryPrivate{
00035         /*The displayed name of this entry.*/
00036         gchar * name ;
00037 
00038         /*A custom structure that holds the data of the settings. Each apps nows how to deal with it.*/
00039         gpointer * settings ; /*Do not delete it !! it belongs to the apps !!!*/
00040 
00041         /*The widget to display in the settings dialog box*/
00042         GtkWidget * settings_widget ;
00043 
00044         /*The children of the settings_widget. Can be NULL*/
00045         gpointer settings_widgets_structure ;/*Do not delete it !!!*/
00046 
00047         /*A stucture that contains all the handlers need to perform load/update/notify tasks on the settings entry*/
00048         MlViewSettingsEntryHandlers * handlers ;/*Do not delete it !! there are functions pointers ...*/
00049         
00050         /*is used by the settings manager. 
00051          *Is the root node of the settings entries tree.
00052          */
00053         GtkCTreeNode * parent_visual_node ;
00054 } ;
00055 
00056 
00057 struct _MlViewSettingsManagerPrivate{
00058         /*the list of the settings entries*/
00059         GList * settings_entries ;
00060         /*an hash table of the entries type. To ensure the uniqueness of the entries types*/
00061         GHashTable * settings_entries_map ;
00062         GnomeDialog *settings_dialog ; /*the root property window*/
00063         GtkHPaned *paned_widget ;
00064         GtkCTree * settings_entries_tree ;
00065         GtkCTreeNode *current_selected_node ; /*FIXME: consider this field in init and destroy*/
00066         GtkNotebook *settings_notebook ;
00067         xmlDoc * settings_xml_doc ; /*the xml dom that holds the settings*/
00068         MlViewAppContext * app_context ;
00069 };
00070 
00071 /*====================================================================
00072  *declaration of the private functions used and defined in this file
00073  *==================================t=================================*/
00074 
00075 static void tree_selected_row_cb(GtkCTree *a_tree, GList *a_node, gint a_column, gpointer a_data) ;
00076 static gboolean mlview_settings_entry_free_flat_struct(GNode *a_node, gpointer *a_entry) ;
00077 static gboolean mlview_settings_manager_call_handlers_for_post_processing(GNode *a_node, gpointer a_user_data) ;
00078 static void mlview_settings_manager_do_post_edition_processing(MlViewSettingsManager *a_manager) ;
00079 static void mlview_settings_manager_do_pre_edition_processing(MlViewSettingsManager *a_manager) ;
00080 static gboolean mlview_settings_manager_call_handlers_for_pre_processing(GNode *a_node, gpointer a_user_data) ;
00081 static gchar * mlview_settings_manager_get_user_settings_dir(void) ;
00082 static gchar * mlview_settings_manager_get_user_settings_file_name(void) ;
00083 static gboolean mlview_settings_manager_home_dir_is_valid(void) ;
00084 static gboolean mlview_settings_manager_personal_settings_dir_exists(void) ;
00085 static gint mlview_settings_manager_create_personal_settings_dir(void) ;
00086 
00087 static xmlDoc * mlview_settings_manager_create_personal_settings_xml_docs(void) ;
00088 static gboolean mlview_settings_manager_call_handlers_to_notify_settings_loading_from_xml_doc(GNode *a_node, 
00089                                                                                               gpointer a_user_data) ;
00090 /*========================================================================*/
00091 
00092 
00093 static gboolean
00094 mlview_settings_entry_free_flat_struct(GNode *a_node, gpointer *a_entry)
00095 {
00096         MlViewSettingsEntry *entry ;
00097 
00098         g_return_val_if_fail(a_node != NULL, FALSE) ;
00099         g_return_val_if_fail(a_entry != NULL, FALSE) ;
00100         
00101         entry = a_node->data ;
00102         if(entry && entry->private && entry->private->name)
00103                 g_free(entry->private->name) ;
00104         return FALSE ;
00105 }
00106 
00120 MlViewSettingsEntry * 
00121 mlview_settings_entry_new(gchar * a_name,
00122                           gpointer a_settings_struct,
00123                           GtkWidget *a_settings_widget,
00124                           gpointer a_settings_widget_structure)
00125 
00126 {
00127         MlViewSettingsEntry * result ;
00128         g_return_val_if_fail(a_name != NULL, NULL) ;
00129         g_return_val_if_fail(a_settings_widget != NULL, NULL) ;
00130 
00131         result = g_malloc0(sizeof(MlViewSettingsEntry)) ;
00132         result->tree_node = g_node_new(result) ;
00133         result->private = g_malloc0(sizeof(MlViewSettingsEntryPrivate)) ;
00134 
00135         result->private->name = g_strdup(a_name) ;
00136         result->private->settings = a_settings_struct ;
00137         result->private->settings_widget = a_settings_widget ;
00138         result->private->settings_widgets_structure = a_settings_widget_structure ;
00139         result->private->handlers = g_malloc0(sizeof(MlViewSettingsEntryHandlers)) ;
00140 
00141         return result ;
00142 }
00143 
00144 
00152 gchar * 
00153 mlview_settings_entry_get_name(MlViewSettingsEntry *a_settings_entry)
00154 {
00155         g_return_val_if_fail(a_settings_entry != NULL, NULL) ;
00156         g_return_val_if_fail(a_settings_entry->private != NULL, NULL) ;
00157         
00158         return a_settings_entry->private->name ;
00159 }
00160 
00161 
00170 void 
00171 mlview_settings_entry_set_name(MlViewSettingsEntry *a_settings_entry, gchar * a_name)
00172 {
00173         g_return_if_fail(a_settings_entry != NULL) ;
00174         g_return_if_fail(a_settings_entry->private != NULL) ;
00175 
00176         a_settings_entry->private->name = g_strdup(a_name) ;
00177 }
00178 
00179 
00180 
00188 void * 
00189 mlview_settings_entry_get_settings (MlViewSettingsEntry * a_settings_entry)
00190 {
00191         g_return_val_if_fail(a_settings_entry != NULL, NULL) ;
00192         g_return_val_if_fail(a_settings_entry->private != NULL, NULL) ;
00193 
00194         return a_settings_entry->private->settings ;
00195 }
00196 
00197 
00206 void 
00207 mlview_settings_entry_set_settings (MlViewSettingsEntry * a_settings_entry, void * a_settings)
00208 {
00209         g_return_if_fail(a_settings_entry != NULL) ;
00210         g_return_if_fail(a_settings_entry->private != NULL) ;
00211 
00212         a_settings_entry->private->settings = a_settings ;
00213 }
00214 
00215 
00223 GtkWidget * 
00224 mlview_settings_entry_get_settings_widget(MlViewSettingsEntry * a_settings_entry)
00225 {
00226         g_return_val_if_fail(a_settings_entry != NULL, NULL) ;
00227         g_return_val_if_fail(a_settings_entry->private != NULL, NULL) ;
00228 
00229         return a_settings_entry->private->settings_widget ;
00230 }
00231 
00232 
00240 void * 
00241 mlview_settings_entry_get_settings_widgets_struct(MlViewSettingsEntry * a_settings_entry)
00242 {
00243         g_return_val_if_fail(a_settings_entry != NULL, NULL) ;
00244         g_return_val_if_fail(a_settings_entry->private != NULL, NULL) ;
00245 
00246         return a_settings_entry->private->settings_widgets_structure ;
00247 }
00248 
00249 
00257 MlViewSettingsEntryHandlers * 
00258 mlview_settings_entry_get_handlers(MlViewSettingsEntry * a_settings_entry)
00259 {
00260         g_return_val_if_fail(a_settings_entry != NULL, NULL) ;
00261         g_return_val_if_fail(a_settings_entry->private != NULL, NULL) ;
00262         
00263         return a_settings_entry->private->handlers ;
00264 }
00265 
00274 void 
00275 mlview_settings_entry_set_handlers (MlViewSettingsEntry * a_settings_entry, MlViewSettingsEntryHandlers *a_handlers)
00276 {
00277         g_return_if_fail(a_settings_entry != NULL) ;
00278         g_return_if_fail(a_settings_entry->private != NULL) ;
00279 
00280         a_settings_entry->private->handlers = a_handlers ;
00281 }
00282 
00283 
00284 
00285 
00293 void
00294 mlview_settings_add_child_entry (MlViewSettingsEntry *a_parent_entry, MlViewSettingsEntry *a_child_entry)
00295 {
00296         g_return_if_fail(a_parent_entry != NULL) ;
00297         g_return_if_fail(a_child_entry != NULL) ;
00298 
00299         g_node_append(a_parent_entry->tree_node, a_child_entry->tree_node) ;
00300 }
00301 
00302 
00311 void
00312 mlview_settings_add_previous_sibling_entry(MlViewSettingsEntry *a_parent_entry,
00313                                            MlViewSettingsEntry *a_sibling_entry,
00314                                            MlViewSettingsEntry *a_node)
00315 {
00316         g_return_if_fail(a_parent_entry != NULL) ;
00317         g_return_if_fail(a_sibling_entry != NULL) ;
00318         g_return_if_fail(a_node != NULL) ;
00319 
00320         g_node_insert_before(a_parent_entry->tree_node,
00321                              a_sibling_entry->tree_node,
00322                              a_node->tree_node) ;       
00323 }
00324 
00331 MlViewSettingsEntry * 
00332 mlview_settings_unlink_entry(MlViewSettingsEntry * a_entry)
00333 {
00334         g_return_val_if_fail(a_entry != NULL, NULL) ;
00335 
00336         g_node_unlink(a_entry->tree_node) ;
00337 
00338         if(a_entry->tree_node != NULL && a_entry->tree_node->parent != NULL)
00339                 return a_entry ;
00340         return NULL ;
00341 }
00342 
00349 void 
00350 mlview_settings_entry_destroy(MlViewSettingsEntry * a_settings_entry)
00351 {
00352         g_return_if_fail(a_settings_entry != NULL) ;
00353         
00354         g_node_traverse(a_settings_entry->tree_node,
00355                         G_PRE_ORDER,G_TRAVERSE_ALL,-1,
00356                         (GNodeTraverseFunc)mlview_settings_entry_free_flat_struct,a_settings_entry) ;
00357         g_node_destroy(a_settings_entry->tree_node) ;
00358 }
00359 
00360 
00368 void
00369 mlview_settings_entry_entry_set_handlers(MlViewSettingsEntry *a_settings_entry,
00370                                          MlViewSettingsEntryHandlers *a_handlers)
00371 {
00372         g_return_if_fail(a_settings_entry != NULL) ;
00373         g_return_if_fail(a_settings_entry->private != NULL) ;
00374 
00375         a_settings_entry->private->handlers = a_handlers ;
00376 }
00377 
00378 /*=======================================================
00379  *MlViewSettingsManager methods and helper functions
00380  *=======================================================*/
00381 
00382 static void
00383 tree_selected_row_cb(GtkCTree *a_tree, GList *a_node, 
00384                      gint a_column, gpointer a_data)
00385 {
00386         MlViewSettingsEntry * entry ;
00387         MlViewSettingsManager * manager=a_data ;
00388         gint notebook_page_num ;
00389 
00390         g_return_if_fail(a_tree != NULL) ;
00391         g_return_if_fail(a_node != NULL) ;
00392         g_return_if_fail(a_data != NULL) ;
00393         g_return_if_fail(manager != NULL) ;
00394 
00395         entry = gtk_ctree_node_get_row_data(a_tree, GTK_CTREE_NODE(a_node)) ;
00396 
00397         g_return_if_fail(entry != NULL) ;
00398         g_return_if_fail(entry->private != NULL) ;
00399         g_return_if_fail(manager->private != NULL) ;
00400 
00401         if(entry->private->settings_widget == NULL  ||  manager->private->settings_notebook == NULL)
00402                 return ;
00403 
00404         notebook_page_num = gtk_notebook_page_num(manager->private->settings_notebook, entry->private->settings_widget) ;
00405 
00406         if(notebook_page_num == -1)
00407                 return ;
00408         gtk_notebook_set_page(manager->private->settings_notebook,notebook_page_num) ;
00409 }
00410 
00411 
00412 MlViewSettingsManager * 
00413 mlview_settings_manager_new (MlViewAppContext *a_app_context)
00414 {
00415         MlViewSettingsManager *result ; 
00416 
00417         result = g_malloc0(sizeof(MlViewSettingsManager)) ;
00418 
00419         result->private = g_malloc0(sizeof(MlViewSettingsManagerPrivate)) ;
00420 
00421         result->private->settings_entries_map = g_hash_table_new(g_direct_hash, g_direct_equal) ;
00422         result->private->app_context = a_app_context ;
00423 
00424         /*Create the settings dialog window*/
00425         result->private->settings_dialog = GNOME_DIALOG (gnome_dialog_new (_("MlView XML Editor Settings"),
00426                                                                            GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL)) ;
00427         
00428         gtk_window_set_wmclass (GTK_WINDOW (result->private->settings_dialog),
00429                                 "editor-settings-dialog", "MlView") ;
00430 
00431         gnome_dialog_close_hides (result->private->settings_dialog, TRUE) ;
00432         gtk_window_set_policy (GTK_WINDOW (result->private->settings_dialog), FALSE, TRUE, FALSE) ;
00433         gtk_widget_set_usize (GTK_WIDGET (result->private->settings_dialog),
00434                               MLVIEW_SETTINGS_DIALOG_DEFAULT_WIDTH,
00435                               MLVIEW_SETTINGS_DIALOG_DEFAULT_HEIGHT) ;
00436 
00437         /*create the main paned widget of the settiings dialog*/
00438         result->private->paned_widget = GTK_HPANED(gtk_hpaned_new()) ;
00439 
00440         /*the right side notebook that holds the settings edition views/widgets*/
00441         result->private->settings_notebook = GTK_NOTEBOOK(gtk_notebook_new()) ;
00442         gtk_notebook_set_show_tabs(result->private->settings_notebook, FALSE) ;
00443         
00444         /*the left side settings choice tree*/
00445         result->private->settings_entries_tree = GTK_CTREE(gtk_ctree_new(1,0)) ;
00446         gtk_signal_connect(GTK_OBJECT(result->private->settings_entries_tree),
00447                            "tree-select-row",
00448                            GTK_SIGNAL_FUNC(tree_selected_row_cb),
00449                            result) ;
00450 
00451         /*Pack the widgets*/
00452         gtk_box_pack_start(GTK_BOX(result->private->settings_dialog->vbox),
00453                            GTK_WIDGET(result->private->paned_widget),TRUE,TRUE,0) ;
00454         gtk_paned_add1(GTK_PANED(result->private->paned_widget),
00455                        GTK_WIDGET(result->private->settings_entries_tree)) ;
00456         gtk_paned_add2(GTK_PANED(result->private->paned_widget),
00457                        GTK_WIDGET(result->private->settings_notebook)) ;
00458 
00459         gtk_widget_show_all(GTK_WIDGET(result->private->paned_widget)) ;
00460 
00461         return result ;
00462 }
00463 
00471 GnomeDialog *  
00472 mlview_settings_manager_get_settings_dialog(MlViewSettingsManager *a_manager)
00473 {
00474         g_return_val_if_fail(a_manager != NULL, NULL) ;
00475         g_return_val_if_fail(a_manager->private != NULL,NULL) ;
00476 
00477         return a_manager->private->settings_dialog ;
00478 }
00479 
00480 
00489 void
00490 mlview_settings_manager_set_settings_dialog_proportions(MlViewSettingsManager *a_manager,
00491                                                         guint a_percentage)
00492 {
00493         guint separator_position ;/*the GtkPaned separator position.*/
00494         GtkWidget * top_level_widget ;
00495         
00496         g_return_if_fail(a_manager != NULL) ;
00497         g_return_if_fail(a_percentage <= 100) ;
00498         g_return_if_fail(a_manager->private != NULL) ;
00499         g_return_if_fail(a_manager->private->paned_widget != NULL) ;
00500         g_return_if_fail(a_manager->private->settings_dialog != NULL) ;
00501 
00502         top_level_widget = gtk_widget_get_toplevel(GTK_WIDGET(a_manager->private->settings_dialog)) ;
00503         if(top_level_widget == NULL) return ;
00504 
00505         separator_position = top_level_widget->allocation.width * a_percentage / 100 ;  
00506         gtk_paned_set_position(GTK_PANED(a_manager->private->paned_widget), separator_position) ;
00507 
00508         gtk_widget_show_all(GTK_WIDGET(a_manager->private->settings_dialog)) ;
00509 }
00510 
00511 
00521 gint
00522 mlview_settings_manager_install_settings(MlViewSettingsManager *a_settings_manager,
00523                                          MlViewSettingsEntry *a_entry)
00524 {
00525         MlViewSettingsEntry *cur_entry ;
00526         gchar * text[2] ;
00527 
00528         g_return_val_if_fail(a_settings_manager != NULL, -2) ;
00529         g_return_val_if_fail(a_entry != NULL, -2) ;
00530         g_return_val_if_fail(a_entry->tree_node != NULL, -3) ;
00531         g_return_val_if_fail(a_settings_manager->private != NULL, -3) ;
00532         g_return_val_if_fail(a_settings_manager->private->settings_entries_map != NULL, -3) ;
00533 
00534         /*first check if this an entry of the same type does not exist already*/
00535         if(g_hash_table_lookup(a_settings_manager->private->settings_entries_map, a_entry) != NULL)
00536                 return -1  ;
00537 
00538         text[1]=0 ;
00539         cur_entry = a_entry ;
00540 
00541         while(cur_entry){
00542                 GtkCTreeNode * visual_node ;
00543                 text[0] = cur_entry->private->name ;
00544                 visual_node = gtk_ctree_insert_node(a_settings_manager->private->settings_entries_tree,
00545                                                     cur_entry->private->parent_visual_node, /*Hack: cur_entry->private->parent_visual_node
00546                                                                                              *is NULL at the level 0
00547                                                                                              *of the tree.As we go down in the tree (level > 0)
00548                                                                                              *this pointer is set to the parent node of the current level.
00549                                                                                              *Look at the doc of GtkCTree widget and it method 
00550                                                                                              *gtk_ctree_insert_node to understand.
00551                                                                                              */
00552                                                     NULL,text,0,
00553                                                     NULL,NULL,NULL,NULL,
00554                                                     FALSE,TRUE) ;
00555                 g_return_val_if_fail(visual_node != NULL, -1) ;
00556                 gtk_ctree_node_set_row_data(a_settings_manager->private->settings_entries_tree,
00557                                             visual_node, cur_entry) ;
00558 
00559                 if(cur_entry->tree_node->children){
00560                         MlViewSettingsEntry *child_entry ;
00561 
00562                         child_entry = cur_entry->tree_node->data ;
00563                         child_entry->private->parent_visual_node = visual_node ;
00564                         mlview_settings_manager_install_settings(a_settings_manager, child_entry) ;
00565                         child_entry->private->parent_visual_node = NULL ;
00566                 }
00567 
00568                 /*get the settings edition view and pack it into the right side notebook*/
00569                 if(cur_entry->private
00570                    && cur_entry->private->settings_widget 
00571                    && a_settings_manager->private->settings_notebook){
00572                         gtk_notebook_append_page(a_settings_manager->private->settings_notebook,
00573                                                  cur_entry->private->settings_widget,NULL) ;
00574                 }
00575 
00576                 if(cur_entry->tree_node->next)
00577                         cur_entry = cur_entry->tree_node->next->data ;
00578                 else
00579                         cur_entry = NULL ;
00580         }
00581         a_settings_manager->private->settings_entries = g_list_prepend(a_settings_manager->private->settings_entries, a_entry) ;
00582         g_hash_table_insert(a_settings_manager->private->settings_entries_map,
00583                             a_entry, 
00584                             a_settings_manager->private->settings_entries);
00585         return 0 ;
00586 }
00587 
00591 MlViewSettingsEntry *
00592 mlview_settings_manager_uninstall_settings(MlViewSettingsManager *a_settings_manager,
00593                                            MlViewSettingsEntry *a_entry)
00594 {
00595         GList * entries_list_element=NULL ;
00596         GtkCTreeNode * visual_node=NULL ;
00597 
00598         g_return_val_if_fail(a_settings_manager != NULL, NULL) ;
00599         g_return_val_if_fail(a_entry != NULL, NULL) ;
00600         
00601         if((entries_list_element = g_hash_table_lookup(a_settings_manager->private->settings_entries_map, a_entry)) == NULL)
00602                 return NULL ;
00603 
00604         /*first, remove the settings entry from the visual tree.*/
00605         visual_node = gtk_ctree_find_by_row_data(a_settings_manager->private->settings_entries_tree,
00606                                                  NULL,entries_list_element->data) ;
00607         gtk_ctree_remove_node(a_settings_manager->private->settings_entries_tree,
00608                               visual_node) ;
00609         /*removed the settings from the visual tree*/
00610         
00611         /*now, remove the settings from the entries linked list*/
00612         a_settings_manager->private->settings_entries = g_list_remove_link(a_settings_manager->private->settings_entries,
00613                                                                                entries_list_element) ;
00614         /*now, remove the settings from the hash table*/
00615         g_hash_table_remove(a_settings_manager->private->settings_entries_map, a_entry) ;
00616 
00617         return a_entry ;
00618 }
00619 
00620 
00628 void 
00629 mlview_settings_manager_edit_settings_interactive (MlViewSettingsManager *a_manager)
00630 {
00631         GnomeDialog * dialog ;
00632         gint button ;
00633 
00634         dialog = mlview_settings_manager_get_settings_dialog (a_manager) ;
00635 
00636         g_return_if_fail (dialog != NULL) ;
00637         
00638         gtk_widget_realize (GTK_WIDGET (dialog)) ;
00639         mlview_settings_manager_set_settings_dialog_proportions (a_manager, MLVIEW_SETTINGS_DIALOG_MAIN_PANED_PROPORTION) ;
00640         mlview_settings_manager_do_pre_edition_processing (a_manager) ;
00641 
00642         mlview_app_context_set_window_icon (PRIVATE (a_manager)->app_context, GTK_WIDGET (dialog)) ;
00643         button = gnome_dialog_run (dialog) ;
00644 
00645         switch (button) {
00646         case 0:/*OK Button*/
00647                 mlview_settings_manager_do_post_edition_processing(a_manager) ;
00648                 gnome_dialog_close(dialog) ;
00649                 break ;
00650         case 1:/*CANCEL Button*/
00651                 gnome_dialog_close(dialog) ;
00652                 break ;
00653         case -1:/*dialog close via Window manager*/
00654                 gnome_dialog_close(dialog) ;
00655                 break ;
00656         default :/*Just in case ...*/
00657                 gnome_dialog_close(dialog) ;
00658                 break ;
00659         }
00660 }
00661 
00662 
00672 gint
00673 mlview_settings_manager_create_personal_settings_file (xmlDoc ** a_xml_doc)
00674 {
00675         gchar * settings_file ;
00676         xmlDoc * xml_doc ;
00677         MlViewFileDescriptor * file_desc=NULL ;
00678 
00679         *a_xml_doc = NULL ;
00680         if(mlview_settings_manager_home_dir_is_valid () == FALSE)
00681                 return -1 ;
00682 
00683         if(mlview_settings_manager_personal_settings_dir_exists() == FALSE)
00684                 mlview_settings_manager_create_personal_settings_dir() ;
00685 
00686         if(mlview_settings_manager_personal_settings_file_exists())
00687                 return 0 ;
00688         
00689         settings_file = mlview_settings_manager_get_user_settings_file_name () ;
00690         file_desc = mlview_file_descriptor_new(settings_file) ;
00691         
00692         if(mlview_file_descriptor_create_file (file_desc, S_IWUSR | S_IRUSR)) {
00693                 mlview_file_descriptor_destroy(file_desc) ;
00694                 g_free(settings_file) ;
00695                 return -1 ;
00696         }
00697         
00698         xml_doc = mlview_settings_manager_create_personal_settings_xml_docs() ;
00699         xmlIndentTreeOutput=1 ;
00700         xmlSaveFormatFile(settings_file, xml_doc, 2) ;
00701         *a_xml_doc = xml_doc ;
00702 
00703         mlview_file_descriptor_destroy(file_desc) ;
00704         g_free(settings_file) ;
00705 
00706         return 0 ;
00707 }
00708 
00709 
00715 xmlDoc *
00716 mlview_settings_manager_load_settings_from_disk(MlViewSettingsManager *a_manager)
00717 {
00718         gchar * settings_file ;
00719         xmlDoc * result ;
00720 
00721         g_return_val_if_fail(a_manager != NULL, NULL) ;
00722         g_return_val_if_fail(a_manager->private != NULL, NULL) ;
00723         g_return_val_if_fail(a_manager->private != NULL, NULL) ;
00724         
00725         if(! mlview_settings_manager_personal_settings_file_exists () )
00726                 return NULL ;
00727         settings_file = mlview_settings_manager_get_user_settings_file_name () ;
00728         result = xmlParseFile(settings_file) ;
00729         
00730         a_manager->private->settings_xml_doc = result ;
00731         return result ;
00732 }
00733 
00742 void
00743 mlview_settings_manager_save_settings_to_disk (MlViewSettingsManager *a_manager)
00744 {
00745         gchar * settings_file_name ;
00746 
00747         g_return_if_fail(a_manager != NULL) ;
00748         g_return_if_fail(a_manager->private != NULL) ;
00749         g_return_if_fail(a_manager->private != NULL) ;
00750         
00751         if ( !PRIVATE (a_manager)->settings_xml_doc )
00752                 return ;
00753 
00754         settings_file_name = mlview_settings_manager_get_user_settings_file_name () ;
00755 
00756         mlview_parsing_utils_save_xml_doc (PRIVATE (a_manager)->settings_xml_doc,
00757                                            settings_file_name,
00758                                            PRIVATE (a_manager)->app_context ) ;
00759         
00760 }
00761 
00762 
00767 gboolean
00768 mlview_settings_manager_personal_settings_file_exists(void)
00769 {
00770         gboolean is_writeable ;
00771         gint error ;
00772         gchar * settings_file ;
00773         MlViewFileDescriptor * file_desc ;
00774         
00775         if(mlview_settings_manager_personal_settings_dir_exists() == FALSE)
00776                 return FALSE ;
00777         settings_file = mlview_settings_manager_get_user_settings_file_name () ;
00778         file_desc = mlview_file_descriptor_new(settings_file) ;
00779         g_free(settings_file) ;
00780 
00781         error = mlview_file_descriptor_is_writeable(file_desc, &is_writeable) ;
00782         mlview_file_descriptor_destroy(file_desc) ;
00783 
00784         if(!error  &&  (is_writeable == TRUE))
00785                 return TRUE ;
00786         return FALSE ;
00787 }
00788 
00789 
00795 void 
00796 mlview_settings_manager_post_settings_install_init(MlViewSettingsManager *a_manager, xmlDoc * a_settings_doc)
00797 {
00798         MlViewSettingsEntry * settings_entry ;
00799         GList * list ;
00800 
00801         g_return_if_fail(a_manager != NULL) ;
00802         g_return_if_fail(a_manager->private != NULL) ;
00803         g_return_if_fail(a_manager->private->settings_entries != NULL) ;
00804         g_return_if_fail(a_settings_doc != NULL) ;
00805 
00806         list = g_list_first(a_manager->private->settings_entries) ;
00807         if(list == NULL)
00808                 return ;
00809 
00810         a_manager->private->settings_xml_doc = a_settings_doc ;
00811         /*walk thru the list of settings entry and call their appropriate callbacks.*/
00812         settings_entry = list->data ;
00813         while(settings_entry){
00814                 g_node_traverse(settings_entry->tree_node,
00815                                 G_POST_ORDER, G_TRAVERSE_ALL, -1,
00816                                 mlview_settings_manager_call_handlers_to_notify_settings_loading_from_xml_doc,
00817                                 a_settings_doc) ;
00818                 list = g_list_next(list) ;
00819                 settings_entry = (list != NULL)?list->data:NULL ;
00820         }
00821 }
00822 
00823 
00824 
00825 
00826 /*
00827  *private helper functions used by the exported functions of this file.
00828  */
00829 
00830 
00838 static void
00839 mlview_settings_manager_do_post_edition_processing(MlViewSettingsManager *a_manager)
00840 {
00841         MlViewSettingsEntry * settings_entry ;
00842         GList * list ;
00843 
00844         g_return_if_fail(a_manager != NULL) ;
00845         g_return_if_fail(a_manager->private != NULL) ;
00846         g_return_if_fail(a_manager->private->settings_entries != NULL) ;
00847 
00848         list = g_list_first(a_manager->private->settings_entries) ;
00849         if(list == NULL)
00850                 return ;
00851 
00852         /*walk thru the list of settings entry and call their appropriate callbacks.*/
00853         settings_entry = list->data ;
00854         while(settings_entry){
00855                 g_node_traverse(settings_entry->tree_node,
00856                                 G_POST_ORDER, G_TRAVERSE_ALL, -1,
00857                                 mlview_settings_manager_call_handlers_for_post_processing,
00858                                 settings_entry) ;
00859                 list = g_list_next(list) ;
00860                 settings_entry = (list != NULL)?list->data:NULL ;
00861         }
00862 
00863         /*Save the new settings on disk. 
00864          *FIXME: maybe some optims could be done
00865          *so that we don't save the settings if they have not been modified for example.*/
00866         mlview_settings_manager_save_settings_to_disk (a_manager) ;
00867 }
00868 
00869 
00881 static gboolean
00882 mlview_settings_manager_call_handlers_for_post_processing(GNode *a_node, gpointer a_user_data)
00883 {
00884         MlViewSettingsEntry * settings_entry ;
00885         MlViewSettingsEntryHandlers * handlers ;
00886 
00887         g_return_val_if_fail(a_node != NULL, FALSE) ;
00888         settings_entry = a_node->data ;
00889         g_return_val_if_fail(settings_entry != NULL, FALSE) ;
00890 
00891         handlers = mlview_settings_entry_get_handlers(settings_entry) ;
00892         if(handlers){
00893                 if(handlers->get_settings_from_settings_widget){
00894                         handlers->get_settings_from_settings_widget(settings_entry) ;
00895                 }
00896                 if(handlers->notify_settings_changed)
00897                         handlers->notify_settings_changed(settings_entry, handlers->settings_changed_notifier_data) ;
00898         }
00899         return FALSE ;
00900 }
00901 
00906 static gboolean
00907 mlview_settings_manager_call_handlers_to_notify_settings_loading_from_xml_doc(GNode *a_node, gpointer a_user_data)
00908 {
00909 
00910         MlViewSettingsEntry * settings_entry ;
00911         MlViewSettingsEntryHandlers * handlers ;
00912         xmlDoc * xml_doc ;
00913 
00914         g_return_val_if_fail(a_node != NULL, FALSE) ;           
00915         settings_entry = a_node->data ;
00916         g_return_val_if_fail(settings_entry != NULL, FALSE) ;
00917         xml_doc = a_user_data ;
00918         g_return_val_if_fail(xml_doc != NULL, FALSE) ;
00919 
00920         handlers = mlview_settings_entry_get_handlers(settings_entry) ;
00921         if(handlers){
00922                 if(handlers->load_settings_from_xml_doc_into_settings_entry)
00923                         handlers->load_settings_from_xml_doc_into_settings_entry(settings_entry, xml_doc) ;
00924         }
00925         return FALSE ;
00926 }
00927 
00932 static void
00933 mlview_settings_manager_do_pre_edition_processing(MlViewSettingsManager *a_manager)
00934 {
00935         MlViewSettingsEntry * settings_entry ;
00936         GList * list ;
00937 
00938         g_return_if_fail(a_manager != NULL) ;
00939         g_return_if_fail(a_manager->private != NULL) ;
00940         g_return_if_fail(a_manager->private->settings_entries != NULL) ;
00941 
00942         list = g_list_first(a_manager->private->settings_entries) ;
00943         if(list == NULL)
00944                 return ;
00945 
00946         /*walk thru the list of settings entry and call their appropriate callbacks.*/
00947         settings_entry = list->data ;
00948         while(settings_entry){          
00949                 g_node_traverse(settings_entry->tree_node,
00950                                 G_POST_ORDER, G_TRAVERSE_ALL, -1,
00951                                 mlview_settings_manager_call_handlers_for_pre_processing,
00952                                 settings_entry) ;
00953                 list = g_list_next(list) ;
00954                 settings_entry = (list != NULL)?list->data:NULL ;
00955         }
00956 }
00957 
00969 static gboolean
00970 mlview_settings_manager_call_handlers_for_pre_processing(GNode *a_node, gpointer a_user_data)
00971 {
00972         MlViewSettingsEntry * settings_entry ;
00973         MlViewSettingsEntryHandlers * handlers ;
00974 
00975         g_return_val_if_fail(a_node != NULL, FALSE) ;
00976         settings_entry = a_node->data ;
00977         g_return_val_if_fail(settings_entry != NULL, FALSE) ;
00978 
00979         handlers = mlview_settings_entry_get_handlers(settings_entry) ; 
00980         if(handlers){
00981                 if(handlers->set_settings_to_settings_widget)
00982                         handlers->set_settings_to_settings_widget(settings_entry) ;
00983                 }
00984         return FALSE ;
00985 }
00986 
00991 static gchar * 
00992 mlview_settings_manager_get_user_settings_dir(void)
00993 {
00994         gchar * home_dir, * settings_dir ;
00995         
00996         home_dir = getenv("HOME") ;
00997         g_return_val_if_fail(home_dir != NULL, NULL) ;
00998         
00999         settings_dir = g_strconcat(home_dir, "/",MLVIEW_SETTINGS_PERSONAL_SETTINGS_DIR_NAME,NULL) ;
01000         g_return_val_if_fail(settings_dir != NULL, NULL) ;
01001         
01002         
01003         return settings_dir ;
01004 }
01005 
01010 static gchar * 
01011 mlview_settings_manager_get_user_settings_file_name (void)
01012 {
01013 
01014         gchar * settings_dir, *settings_file ;
01015 
01016         settings_dir = mlview_settings_manager_get_user_settings_dir () ;
01017         g_return_val_if_fail (settings_dir != NULL, NULL) ;
01018 
01019         settings_file = g_strconcat (settings_dir,"/",MLVIEW_SETTINGS_PERSONAL_SETTINGS_FILE_NAME, NULL) ;
01020         g_free (settings_dir) ;
01021         g_return_val_if_fail (settings_file != NULL, NULL) ;
01022         
01023         return settings_file ;
01024 }
01025 
01026 
01031 static gboolean
01032 mlview_settings_manager_home_dir_is_valid(void)
01033 {
01034         gchar * home_dir=NULL ;
01035         gboolean is_dir, is_writeable ;
01036 
01037         MlViewFileDescriptor * file_desc=NULL ;
01038 
01039         home_dir = getenv("HOME") ;
01040         g_return_val_if_fail(home_dir != NULL, FALSE) ;
01041 
01042         file_desc = mlview_file_descriptor_new(home_dir) ;
01043         home_dir = NULL ;
01044 
01045         /*test home dir validity*/
01046         mlview_file_descriptor_is_dir(file_desc, &is_dir) ;
01047         mlview_file_descriptor_is_writeable(file_desc, &is_writeable) ;
01048 
01049         mlview_file_descriptor_destroy(file_desc) ;
01050         file_desc = NULL ;
01051 
01052         if(is_dir == FALSE  ||  is_writeable == FALSE){
01053                 return FALSE ;
01054         }
01055 
01056         return TRUE ;
01057 }
01058 
01063 static gboolean
01064 mlview_settings_manager_personal_settings_dir_exists(void)
01065 {
01066         gchar * home_dir=NULL, *settings_dir=NULL ;
01067         gboolean is_dir, result;
01068 
01069         MlViewFileDescriptor * file_desc=NULL ;
01070         
01071         if (mlview_settings_manager_home_dir_is_valid () == FALSE)
01072                 return FALSE ;
01073 
01074         home_dir = getenv ("HOME") ;
01075         settings_dir = g_strconcat(home_dir,"/",
01076                                    MLVIEW_SETTINGS_PERSONAL_SETTINGS_DIR_NAME, 
01077                                    NULL) ;
01078         home_dir = NULL ;
01079         file_desc = mlview_file_descriptor_new (settings_dir) ;
01080 
01081         if (file_desc == NULL) {
01082                 if (settings_dir) g_free (settings_dir) ;
01083                 return FALSE ;
01084         }
01085         
01086         result = (!mlview_file_descriptor_is_dir(file_desc, &is_dir) || is_dir == TRUE)?TRUE:FALSE ;
01087         
01088         if (settings_dir) g_free (settings_dir) ;
01089         mlview_file_descriptor_destroy (file_desc) ;
01090         
01091         return result ;
01092 }
01093 
01094 
01095 
01096 
01102 static gint
01103 mlview_settings_manager_create_personal_settings_dir (void)
01104 {
01105         gchar * home_dir=NULL, *settings_dir=NULL;
01106 
01107         MlViewFileDescriptor * file_desc=NULL ;
01108         
01109         if(mlview_settings_manager_personal_settings_dir_exists () == TRUE)
01110                 return 0 ;
01111         
01112         home_dir = getenv ("HOME") ;
01113         settings_dir = g_strconcat (home_dir,"/",
01114                                     MLVIEW_SETTINGS_PERSONAL_SETTINGS_DIR_NAME,
01115                                     NULL) ;
01116 
01117         file_desc = mlview_file_descriptor_new (settings_dir) ;
01118         if (file_desc == NULL) {
01119                 mlview_file_descriptor_destroy (file_desc) ;
01120                 g_free (settings_dir) ;
01121                 return -1 ;
01122         }
01123         
01124         if (mlview_file_descriptor_create_directory (file_desc, S_IRWXU)) {
01125                 mlview_file_descriptor_destroy (file_desc) ;
01126                 g_free (settings_dir) ;
01127                 return -1 ;
01128         }
01129 
01130         mlview_file_descriptor_destroy (file_desc) ;
01131                 g_free (settings_dir) ;
01132         return 0 ;
01133 }
01134 
01135 
01139 static xmlDoc *
01140 mlview_settings_manager_create_personal_settings_xml_docs (void)
01141 {
01142         xmlDoc * result ;
01143         xmlNs * namespace ;
01144         xmlNode * node, *root ;
01145 
01146         result = xmlNewDoc ("1.0") ;
01147 
01148         /*create the root node (mlviewSettings)*/
01149         root = xmlNewNode (NULL, "Settings") ;
01150         namespace = xmlNewNs (root, "http://www.gnome-mlview.org","gMlView") ;
01151         xmlSetNs (root, namespace) ;
01152         xmlDocSetRootElement (result, root) ;
01153 
01154         /*Set the tree view settings*/
01155         node = xmlNewNode (namespace, "TreeView") ;
01156         xmlSetProp (node, "nodeExpansionLevel", "2") ;  
01157         xmlAddChild (root, node) ;
01158 
01159         /*set the validation settings*/
01160         node = xmlNewNode (namespace, "Validation") ;
01161         xmlSetProp (node, "turnOn", "true") ;
01162         xmlAddChild (root, node) ;
01163         return result ;
01164 }
01165 
01166 
01167 /*
01168  *Settings management utils functions:
01169  */
01170 
01174 gint 
01175 mlview_settings_management_get_settings_xml_nodes (xmlXPathObject **a_xpath_object, 
01176                                                   gchar * a_xpath_expression, 
01177                                                   xmlDoc * a_xml_doc)
01178 {
01179         xmlXPathContext * xpath_context=NULL ;
01180         xmlXPathObject * xpath_object=NULL ;
01181         xmlNode * node ;
01182 
01183         *a_xpath_object = NULL ;
01184 
01185         g_return_val_if_fail(a_xpath_object != NULL, -3) ;
01186         g_return_val_if_fail(a_xpath_expression != NULL, -3) ;
01187         g_return_val_if_fail(a_xml_doc != NULL, -3) ;
01188 
01189         
01190         /*Let the xpath evaluator know about the MlView namespace*/
01191         xpath_context = xmlXPathNewContext(a_xml_doc) ;
01192         xmlXPathRegisterNs(xpath_context, "gMlView","http://www.gnome-mlview.org") ;
01193 
01194         /*set the default node to the doc root node*/
01195         node = xmlDocGetRootElement(a_xml_doc) ;
01196         g_return_val_if_fail(node != NULL, -2) ;
01197         xpath_context->node = node ;
01198 
01199         xpath_object = xmlXPathEval(a_xpath_expression, xpath_context) ;
01200 
01201         if(xpath_context)
01202                 xmlXPathFreeContext(xpath_context) ;
01203 
01204         if(!xpath_object)
01205                 return -1 ;
01206         *a_xpath_object = xpath_object ;
01207         return 0 ;
01208 }
01209 
01210 
01214 void 
01215 mlview_settings_manager_destroy(MlViewSettingsManager *a_manager)
01216 {
01217         g_return_if_fail(a_manager != NULL) ;
01218         g_return_if_fail(a_manager->private != NULL) ;
01219 
01220         if(a_manager->private->settings_entries){
01221                 g_list_free(a_manager->private->settings_entries) ;
01222                 a_manager->private->settings_entries = NULL ;
01223         }
01224         if(a_manager->private->settings_entries_map){
01225                 g_hash_table_destroy(a_manager->private->settings_entries_map) ;
01226                 a_manager->private->settings_entries_map = NULL ;
01227         }
01228         if(a_manager->private->settings_xml_doc){
01229                 xmlFreeDoc(a_manager->private->settings_xml_doc) ;
01230                 a_manager->private->settings_xml_doc = NULL ;
01231         }
01232         if(a_manager->private->settings_dialog){
01233                 gtk_widget_destroy(GTK_WIDGET(a_manager->private->settings_dialog)) ;
01234                 a_manager->private->settings_dialog = NULL ;
01235         }
01236         if(a_manager->private){
01237                 g_free(a_manager->private) ;
01238                 a_manager->private = NULL ;
01239         }
01240 }

Generated on Sat Jul 6 09:57:35 2002 for Gnome-MlView by doxygen1.2.16