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
00036 gchar * name ;
00037
00038
00039 gpointer * settings ;
00040
00041
00042 GtkWidget * settings_widget ;
00043
00044
00045 gpointer settings_widgets_structure ;
00046
00047
00048 MlViewSettingsEntryHandlers * handlers ;
00049
00050
00051
00052
00053 GtkCTreeNode * parent_visual_node ;
00054 } ;
00055
00056
00057 struct _MlViewSettingsManagerPrivate{
00058
00059 GList * settings_entries ;
00060
00061 GHashTable * settings_entries_map ;
00062 GnomeDialog *settings_dialog ;
00063 GtkHPaned *paned_widget ;
00064 GtkCTree * settings_entries_tree ;
00065 GtkCTreeNode *current_selected_node ;
00066 GtkNotebook *settings_notebook ;
00067 xmlDoc * settings_xml_doc ;
00068 MlViewAppContext * app_context ;
00069 };
00070
00071
00072
00073
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
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
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
00438 result->private->paned_widget = GTK_HPANED(gtk_hpaned_new()) ;
00439
00440
00441 result->private->settings_notebook = GTK_NOTEBOOK(gtk_notebook_new()) ;
00442 gtk_notebook_set_show_tabs(result->private->settings_notebook, FALSE) ;
00443
00444
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
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 ;
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
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,
00546
00547
00548
00549
00550
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
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
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
00610
00611
00612 a_settings_manager->private->settings_entries = g_list_remove_link(a_settings_manager->private->settings_entries,
00613 entries_list_element) ;
00614
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:
00647 mlview_settings_manager_do_post_edition_processing(a_manager) ;
00648 gnome_dialog_close(dialog) ;
00649 break ;
00650 case 1:
00651 gnome_dialog_close(dialog) ;
00652 break ;
00653 case -1:
00654 gnome_dialog_close(dialog) ;
00655 break ;
00656 default :
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
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
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
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
00864
00865
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
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
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
01149 root = xmlNewNode (NULL, "Settings") ;
01150 namespace = xmlNewNs (root, "http:
01151 xmlSetNs (root, namespace) ;
01152 xmlDocSetRootElement (result, root) ;
01153
01154
01155 node = xmlNewNode (namespace, "TreeView") ;
01156 xmlSetProp (node, "nodeExpansionLevel", "2") ;
01157 xmlAddChild (root, node) ;
01158
01159
01160 node = xmlNewNode (namespace, "Validation") ;
01161 xmlSetProp (node, "turnOn", "true") ;
01162 xmlAddChild (root, node) ;
01163 return result ;
01164 }
01165
01166
01167
01168
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
01191 xpath_context = xmlXPathNewContext(a_xml_doc) ;
01192 xmlXPathRegisterNs(xpath_context, "gMlView","http://www.gnome-mlview.org") ;
01193
01194
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 }