diff options
-rw-r--r-- | shell/ChangeLog | 10 | ||||
-rw-r--r-- | shell/e-shell-settings-dialog.c | 111 |
2 files changed, 114 insertions, 7 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog index 4e2e94ac8b..ced37c0b2d 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,13 @@ +2002-03-29 Ettore Perazzoli <ettore@ximian.com> + + * e-shell-settings-dialog.c: Add type "Page". + (page_new): New helper function. + (page_free): New helper function. + (compare_page_func): Callback for sorting a GList of pages. + (sort_page_list): New helper function. + (load_pages): Create the pages, sort them, add them sorted. Now + we have a priority field that overrides alphabetical sorting. + 2002-03-26 Ettore Perazzoli <ettore@ximian.com> * e-component-info.c: New. diff --git a/shell/e-shell-settings-dialog.c b/shell/e-shell-settings-dialog.c index 76cf594ea4..31896cb073 100644 --- a/shell/e-shell-settings-dialog.c +++ b/shell/e-shell-settings-dialog.c @@ -44,12 +44,81 @@ static EMultiConfigDialogClass *parent_class = NULL; +/* Page handling. */ + +struct _Page { + char *title; + char *description; + GdkPixbuf *icon; + int priority; + EConfigPage *page_widget; +}; +typedef struct _Page Page; + +static Page * +page_new (const char *title, + const char *description, + GdkPixbuf *icon, + int priority, + EConfigPage *page_widget) +{ + Page *page; + + if (icon != NULL) + gdk_pixbuf_ref (icon); + + page = g_new (Page, 1); + page->title = g_strdup (title); + page->description = g_strdup (description); + page->icon = icon; + page->priority = priority; + page->page_widget = page_widget; + + return page; +} + +static void +page_free (Page *page) +{ + g_free (page->title); + g_free (page->description); + + if (page->icon != NULL) + gdk_pixbuf_unref (page->icon); + + g_free (page); +} + +static int +compare_page_func (const void *a, + const void *b) +{ + const Page *page_a; + const Page *page_b; + + page_a = (const Page *) a; + page_b = (const Page *) b; + + if (page_a->priority == page_b->priority) + return strcmp (page_a->title, page_b->title); + + return page_a->priority - page_b->priority; +} + +static GList * +sort_page_list (GList *list) +{ + return g_list_sort (list, compare_page_func); +} + static void load_pages (EShellSettingsDialog *dialog) { OAF_ServerInfoList *control_list; CORBA_Environment ev; GSList *language_list; + GList *page_list; + GList *p; int i; CORBA_exception_init (&ev); @@ -63,19 +132,23 @@ load_pages (EShellSettingsDialog *dialog) language_list = e_get_language_list (); + page_list = NULL; for (i = 0; i < control_list->_length; i ++) { CORBA_Object corba_object; OAF_ServerInfo *info; const char *title; const char *description; const char *icon_path; + const char *priority_string; + int priority; GdkPixbuf *icon; info = & control_list->_buffer[i]; - title = oaf_server_info_prop_lookup (info, "evolution:config_item:title", language_list); - description = oaf_server_info_prop_lookup (info, "evolution:config_item:description", language_list); - icon_path = oaf_server_info_prop_lookup (info, "evolution:config_item:icon_name", NULL); + title = oaf_server_info_prop_lookup (info, "evolution:config_item:title", language_list); + description = oaf_server_info_prop_lookup (info, "evolution:config_item:description", language_list); + icon_path = oaf_server_info_prop_lookup (info, "evolution:config_item:icon_name", NULL); + priority_string = oaf_server_info_prop_lookup (info, "evolution:config_item:priority", NULL); if (icon_path == NULL) { icon = NULL; @@ -91,11 +164,20 @@ load_pages (EShellSettingsDialog *dialog) } } + if (priority_string == NULL) + priority = 0xffff; + else + priority = atoi (priority_string); + corba_object = oaf_activate_from_id ((char *) info->iid, 0, NULL, &ev); + if (! BONOBO_EX (&ev)) { - e_multi_config_dialog_add_page (E_MULTI_CONFIG_DIALOG (dialog), - title, description, icon, - E_CONFIG_PAGE (e_corba_config_page_new_from_objref (corba_object))); + Page *page; + + page = page_new (title, description, icon, priority, + E_CONFIG_PAGE (e_corba_config_page_new_from_objref (corba_object))); + + page_list = g_list_prepend (page_list, page); } else { g_warning ("Cannot activate %s -- %s", info->iid, BONOBO_EX_ID (&ev)); } @@ -104,9 +186,24 @@ load_pages (EShellSettingsDialog *dialog) gdk_pixbuf_unref (icon); } - CORBA_free (control_list); + page_list = sort_page_list (page_list); + for (p = page_list; p != NULL; p = p->next) { + Page *page; + + page = (Page *) p->data; + + e_multi_config_dialog_add_page (E_MULTI_CONFIG_DIALOG (dialog), + page->title, + page->description, + page->icon, + page->page_widget); + page_free (page); + } + + g_list_free (page_list); e_free_language_list (language_list); + CORBA_free (control_list); CORBA_exception_free (&ev); } |