From c470087c9b5663a64c338fadee3594d261ab65f3 Mon Sep 17 00:00:00 2001 From: Iain Holmes Date: Fri, 29 Jun 2001 18:34:53 +0000 Subject: Configure My Evolution svn path=/trunk/; revision=10604 --- my-evolution/ChangeLog | 41 + my-evolution/Makefile.am | 5 +- my-evolution/e-summary-calendar.c | 6 + my-evolution/e-summary-calendar.h | 14 + my-evolution/e-summary-factory.c | 12 +- my-evolution/e-summary-mail.c | 82 +- my-evolution/e-summary-mail.h | 1 + my-evolution/e-summary-preferences.c | 1009 +++++++++++++++++++++ my-evolution/e-summary-preferences.h | 15 + my-evolution/e-summary-rdf.c | 94 +- my-evolution/e-summary-rdf.h | 2 + my-evolution/e-summary-weather.c | 215 ++++- my-evolution/e-summary-weather.h | 5 + my-evolution/e-summary.c | 24 + my-evolution/e-summary.h | 30 +- my-evolution/main.c | 2 + my-evolution/metar.c | 63 +- my-evolution/metar.h | 1 + my-evolution/my-evolution.glade | 1590 ++++++++++++++++++++++++++++++++++ 19 files changed, 3158 insertions(+), 53 deletions(-) create mode 100644 my-evolution/e-summary-preferences.c create mode 100644 my-evolution/e-summary-preferences.h create mode 100644 my-evolution/my-evolution.glade diff --git a/my-evolution/ChangeLog b/my-evolution/ChangeLog index 63f8467d96..deb7798445 100644 --- a/my-evolution/ChangeLog +++ b/my-evolution/ChangeLog @@ -1,3 +1,44 @@ +2001-06-29 Iain Holmes + + * e-summary-preferences.c: Do everything preferences related. + + * my-evolution.glade: Glade file for the preferences box. + + * e-summary-calendar.c (e_summary_calendar_reconfigure): Stub for later + + * e-summary-calendar.h: Some enums for settings. + + * e-summary-mail.c (folder_gen_html): Change the prototype so it + doesn't work as a hash table foreach function. + (new_folder_cb): Fix typo in comment :) + Create a list of folders we display. + (remove_folder_cb): Remove the folder from the display folder list. + (maybe_add_to_shown): Hash table foreach function to create a display + folder list. + (e_summary_mail_reconfigure): Recreate the mail HTML. + + * e-summary-rdf.c (tree_walk): Obey preferences. + (e_summary_rdf_update): Separate the updating and downloading logic. + (e_summary_rdf_init): Start an updating timeout. + (e_summary_rdf_reconfigure): Recreate the RDF html. + + * e-summary-weather.c (e_summary_weather_update): Separate the updating + and downloading logic. + (e_summary_weather_init): Start timeout. + (e_summary_weather_code_to_name): Convert code to location name. + (e_summary_weather_ctree_fill): Fill a CTree with the location data. + (e_summary_weather_reconfigure): Regenerate the HTML. + + * e-summary.c (e_summary_init): Create the preferences. + (e_summary_reconfigure): Reconfigure the whole summary. + + * metar.c: Obey preferences. + +2001-06-27 Iain Holmes + + * e-summary-factory.c: Add the pixmaps to the menus. + Add a new menu item for the configuration stuff. + 2001-06-27 Ettore Perazzoli * component-factory.c (factory_fn): Pass NULL as the diff --git a/my-evolution/Makefile.am b/my-evolution/Makefile.am index 22af538ec0..af1b39fc10 100644 --- a/my-evolution/Makefile.am +++ b/my-evolution/Makefile.am @@ -12,7 +12,6 @@ INCLUDES = \ $(GNOME_VFS_CFLAGS) \ $(GTKHTML_CFLAGS) \ -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \ -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ -DEVOLUTION_DATADIR=\""$(datadir)"\" \ -DG_LOG_DOMAIN=\"evolution-executive-summary\" @@ -41,6 +40,7 @@ evolution_executive_summary_SOURCES = \ e-summary-factory.h \ e-summary-mail.c \ e-summary-mail.h \ + e-summary-preferences.c \ e-summary-rdf.h \ e-summary-rdf.c \ e-summary-type.h \ @@ -73,6 +73,9 @@ oafdir = $(datadir)/oaf oaf_in_files = GNOME_Evolution_Summary.oaf.in oaf_DATA = $(oaf_in_files:.oaf.in=.oaf) +gladedir = $(datadir)/evolution/glade +glade_DATA = my-evolution.glade + @XML_I18N_MERGE_OAF_RULE@ EXTRA_DIST = $(oaf_in_files) $(oaf_DATA) $(Location_DATA) diff --git a/my-evolution/e-summary-calendar.c b/my-evolution/e-summary-calendar.c index 2e2a1b5199..3bc2b21f46 100644 --- a/my-evolution/e-summary-calendar.c +++ b/my-evolution/e-summary-calendar.c @@ -284,3 +284,9 @@ e_summary_calendar_init (ESummary *summary) e_summary_add_protocol_listener (summary, "calendar", e_summary_calendar_protocol, calendar); } + +void +e_summary_calendar_reconfigure (ESummary *summary) +{ + +} diff --git a/my-evolution/e-summary-calendar.h b/my-evolution/e-summary-calendar.h index d485be3b7c..5cf3fd936f 100644 --- a/my-evolution/e-summary-calendar.h +++ b/my-evolution/e-summary-calendar.h @@ -11,8 +11,22 @@ #include "e-summary-type.h" +typedef enum _ESummaryCalendarDays { + E_SUMMARY_CALENDAR_ONE_DAY, + E_SUMMARY_CALENDAR_FIVE_DAYS, + E_SUMMARY_CALENDAR_ONE_WEEK, + E_SUMMARY_CALENDAR_ONE_MONTH +} ESummaryCalendarDays; + +typedef enum _ESummaryCalendarNumTasks { + E_SUMMARY_CALENDAR_ALL_TASKS, + E_SUMMARY_CALENDAR_TODAYS_TASKS +} ESummaryCalendarNumTasks; + typedef struct _ESummaryCalendar ESummaryCalendar; const char *e_summary_calendar_get_html (ESummary *summary); void e_summary_calendar_init (ESummary *summary); +void e_summary_calendar_reconfigure (ESummary *summary); + #endif diff --git a/my-evolution/e-summary-factory.c b/my-evolution/e-summary-factory.c index 1a85519584..b7dde3c861 100644 --- a/my-evolution/e-summary-factory.c +++ b/my-evolution/e-summary-factory.c @@ -16,20 +16,24 @@ #include #include "e-util/e-gui-utils.h" + #include "e-summary.h" #include "e-summary-factory.h" +#include "e-summary-preferences.h" +#include "evolution-shell-component-utils.h" /* For E_PIXMAP */ BonoboUIVerb verbs[] = { BONOBO_UI_VERB ("PrintMyEvolution", e_summary_print), + BONOBO_UI_VERB ("ToolsSettings", e_summary_configure), BONOBO_UI_VERB_END }; -#if 0 + static EPixmap pixmaps [] = { - E_PIXMAP ("/menu/File/Print/Print", "print.xpm"), + E_PIXMAP ("/commands/Print", "print.xpm"), + E_PIXMAP ("/commands/ToolsSettings", "configure_16_mail.xpm"), E_PIXMAP_END }; -#endif static void control_activate (BonoboControl *control, @@ -47,7 +51,7 @@ control_activate (BonoboControl *control, bonobo_ui_util_set_ui (ui_component, EVOLUTION_DATADIR, "my-evolution.xml", "my-evolution"); -/* e_pixmaps_update (ui_component, pixmaps); */ + e_pixmaps_update (ui_component, pixmaps); bonobo_ui_component_thaw (ui_component, NULL); } diff --git a/my-evolution/e-summary-mail.c b/my-evolution/e-summary-mail.c index c5a2e54819..f8a3f68f7e 100644 --- a/my-evolution/e-summary-mail.c +++ b/my-evolution/e-summary-mail.c @@ -26,6 +26,7 @@ struct _ESummaryMail { BonoboListener *listener; GHashTable *folders; + GList *shown; ESummaryMailMode mode; char *html; @@ -63,12 +64,9 @@ make_pretty_foldername (const char *foldername) } static void -folder_gen_html (gpointer key, - gpointer value, - gpointer user_data) +folder_gen_html (ESummaryMailFolder *folder, + GString *string) { - GString *string = user_data; - ESummaryMailFolder *folder = value; char *str, *pretty_name, *uri; pretty_name = make_pretty_foldername (folder->name); @@ -86,6 +84,7 @@ e_summary_mail_generate_html (ESummary *summary) { ESummaryMail *mail; GString *string; + GList *p; mail = summary->mail; string = g_string_new ("
Mail summary" "
"); - g_hash_table_foreach (mail->folders, folder_gen_html, string); + for (p = mail->shown; p; p = p->next) { + folder_gen_html (p->data, string); + } g_string_append (string, "
"); mail->html = string->str; @@ -134,6 +135,7 @@ new_folder_cb (EvolutionStorageListener *listener, { ESummaryMail *mail; ESummaryMailFolder *mail_folder; + GList *p; /* Don't care about none mail */ if (strcmp (folder->type, "mail") != 0 || @@ -150,6 +152,19 @@ new_folder_cb (EvolutionStorageListener *listener, mail_folder->unread = -1; g_hash_table_insert (mail->folders, mail_folder->path, mail_folder); + + /* Are we supposed to display this folder? */ + for (p = summary->preferences->display_folders; p; p = p->next) { + char *uri; + + uri = g_strconcat ("file://", p->data, NULL); + if (strcmp (uri, mail_folder->path) == 0) { + mail->shown = g_list_prepend (mail->shown, mail_folder); + } + + g_free (uri); + } + e_summary_mail_get_info (mail, mail_folder->path, mail->listener); } @@ -160,6 +175,7 @@ remove_folder_cb (EvolutionStorageListener *listener, { ESummaryMail *mail; ESummaryMailFolder *mail_folder; + GList *p; mail = summary->mail; mail_folder = g_hash_table_lookup (mail->folders, path); @@ -167,7 +183,17 @@ remove_folder_cb (EvolutionStorageListener *listener, return; } + /* Check if we're displaying it, because we can't display it if it + doesn't exist :) */ + for (p = mail->shown; p; p = p->next) { + if (p->data == mail_folder) { + mail->shown = g_list_remove_link (mail->shown, p); + g_list_free (p); + } + } + g_hash_table_remove (mail->folders, path); + g_free (mail_folder->name); g_free (mail_folder->path); g_free (mail_folder); } @@ -274,3 +300,47 @@ e_summary_mail_init (ESummary *summary, e_summary_add_protocol_listener (summary, "mail", e_summary_mail_protocol, mail); return; } + +static void +maybe_add_to_shown (gpointer key, + gpointer value, + gpointer user_data) +{ + ESummary *summary = user_data; + ESummaryMailFolder *folder = value; + ESummaryMail *mail = summary->mail; + GList *p; + + /* Are we supposed to display this folder? */ + for (p = summary->preferences->display_folders; p; p = p->next) { + char *uri; + + uri = g_strconcat ("file://", p->data, NULL); + if (strcmp (uri, folder->path) == 0) { + mail->shown = g_list_prepend (mail->shown, folder); + } + + g_free (uri); + } +} + +void +e_summary_mail_reconfigure (ESummary *summary) +{ + ESummaryMail *mail; + GList *old; + + g_return_if_fail (summary != NULL); + g_return_if_fail (IS_E_SUMMARY (summary)); + + mail = summary->mail; + old = mail->shown; + mail->shown = NULL; + g_hash_table_foreach (mail->folders, maybe_add_to_shown, summary); + e_summary_mail_generate_html (summary); + + /* Free the old list */ + g_list_free (old); + + e_summary_draw (summary); +} diff --git a/my-evolution/e-summary-mail.h b/my-evolution/e-summary-mail.h index 858a3cbbae..67090b4271 100644 --- a/my-evolution/e-summary-mail.h +++ b/my-evolution/e-summary-mail.h @@ -23,4 +23,5 @@ typedef struct _ESummaryMail ESummaryMail; const char *e_summary_mail_get_html (ESummary *summary); void e_summary_mail_init (ESummary *summary, GNOME_Evolution_Shell corba_shell); +void e_summary_mail_reconfigure (ESummary *summary); #endif diff --git a/my-evolution/e-summary-preferences.c b/my-evolution/e-summary-preferences.c new file mode 100644 index 0000000000..939c31ba26 --- /dev/null +++ b/my-evolution/e-summary-preferences.c @@ -0,0 +1,1009 @@ +/* + * e-summary-preferences.c: + * + * Copyright (C) 2001 Ximian, Inc + * + * Authors: Iain Holmes + */ + +#include "e-summary.h" +#include "e-summary-preferences.h" + +#include + +#include +#include +#include + +#include +#include +static void +make_initial_mail_list (ESummaryPrefs *prefs) +{ + char *evolution_dir; + GList *folders; + + evolution_dir = gnome_util_prepend_user_home ("evolution/local"); + + folders = g_list_append (NULL, g_strconcat (evolution_dir, "/Inbox", NULL)); + folders = g_list_append (folders, g_strconcat (evolution_dir, "/Outbox", NULL)); + + g_free (evolution_dir); + prefs->display_folders = folders; +} + +static void +make_initial_rdf_list (ESummaryPrefs *prefs) +{ + GList *rdfs; + + rdfs = g_list_prepend (NULL, g_strdup ("http://news.gnome.org/gnome-news/rdf")); + + prefs->rdf_urls = rdfs; +} + +static void +make_initial_weather_list (ESummaryPrefs *prefs) +{ + GList *stations; + + stations = g_list_prepend (NULL, g_strdup ("EGAA")); + stations = g_list_prepend (stations, g_strdup ("EGAC")); + stations = g_list_prepend (stations, g_strdup ("ENBR")); + + prefs->stations = stations; +} + +/* Load the prefs off disk */ + +static char * +vector_from_str_list (GList *strlist) +{ + char *vector; + GString *str; + + g_return_val_if_fail (strlist != NULL, NULL); + + str = g_string_new (""); + for (; strlist; strlist = strlist->next) { + g_string_append (str, strlist->data); + + /* No space at end */ + if (strlist->next) { + g_string_append (str, " "); + } + } + + vector = str->str; + g_string_free (str, FALSE); + + return vector; +} + +static GList * +str_list_from_vector (const char *vector) +{ + GList *strlist = NULL; + char **tokens; + + tokens = g_strsplit (vector, " ", 8196); + + if (tokens == NULL) { + return NULL; + } + + for (; *tokens; tokens++) { + strlist = g_list_prepend (strlist, g_strdup (*tokens)); + } + + g_strfreev (tokens); + + strlist = g_list_reverse (strlist); + return strlist; +} + +gboolean +e_summary_preferences_restore (ESummaryPrefs *prefs) +{ + char *evolution_dir, *key; + char *vector; + + g_return_val_if_fail (prefs != NULL, FALSE); + + evolution_dir = gnome_util_prepend_user_home ("evolution/config/my-evolution"); + if (g_file_exists (evolution_dir) == FALSE) { + g_free (evolution_dir); + return FALSE; + } + + key = g_strdup_printf ("=%s=/Mail/", evolution_dir); + gnome_config_push_prefix (key); + g_free (key); + + vector = gnome_config_get_string ("display_folders"); + prefs->display_folders = str_list_from_vector (vector); + g_free (vector); + + prefs->show_full_path = gnome_config_get_bool ("show_full_path=FALSE"); + + gnome_config_pop_prefix (); + key = g_strdup_printf ("=%s=/RDF/", evolution_dir); + gnome_config_push_prefix (key); + g_free (key); + + vector = gnome_config_get_string ("rdf_urls"); + prefs->rdf_urls = str_list_from_vector (vector); + g_free (vector); + + prefs->rdf_refresh_time = gnome_config_get_int ("rdf_refresh_time=600"); + prefs->limit = gnome_config_get_int ("limit=10"); + prefs->wipe_trackers = gnome_config_get_bool ("wipe_trackers=True"); + + gnome_config_pop_prefix (); + key = g_strdup_printf ("=%s=/Weather/", evolution_dir); + gnome_config_push_prefix (key); + g_free (key); + + vector = gnome_config_get_string ("stations"); + prefs->stations = str_list_from_vector (vector); + g_free (vector); + + prefs->units = gnome_config_get_int ("units"); + prefs->weather_refresh_time = gnome_config_get_int ("weather_refresh_time"); + + gnome_config_pop_prefix (); + key = g_strdup_printf ("=%s=/Schedule", evolution_dir); + gnome_config_push_prefix (key); + g_free (key); + + prefs->days = gnome_config_get_int ("days"); + prefs->show_tasks = gnome_config_get_int ("show_tasks"); + + gnome_config_pop_prefix (); + g_free (evolution_dir); + return TRUE; +} + +/* Write prefs to disk */ +void +e_summary_preferences_save (ESummaryPrefs *prefs) +{ + char *evolution_dir, *key; + char *vector; + + g_return_if_fail (prefs != NULL); + + evolution_dir = gnome_util_prepend_user_home ("evolution/config/my-evolution"); + key = g_strdup_printf ("=%s=/Mail/", evolution_dir); + gnome_config_push_prefix (key); + g_free (key); + + vector = vector_from_str_list (prefs->display_folders); + gnome_config_set_string ("display_folders", vector); + g_free (vector); + + gnome_config_set_bool ("show_full_path", prefs->show_full_path); + + gnome_config_pop_prefix (); + key = g_strdup_printf ("=%s=/RDF/", evolution_dir); + gnome_config_push_prefix (key); + g_free (key); + + vector = vector_from_str_list (prefs->rdf_urls); + gnome_config_set_string ("rdf_urls", vector); + g_free (vector); + + gnome_config_set_int ("rdf_refresh_time", prefs->rdf_refresh_time); + gnome_config_set_int ("limit", prefs->limit); + gnome_config_set_bool ("wipe_trackers", prefs->wipe_trackers); + + gnome_config_pop_prefix (); + key = g_strdup_printf ("=%s=/Weather/", evolution_dir); + gnome_config_push_prefix (key); + g_free (key); + + vector = vector_from_str_list (prefs->stations); + gnome_config_set_string ("stations", vector); + g_free (vector); + + gnome_config_set_int ("units", prefs->units); + gnome_config_set_int ("weather_refresh_time", prefs->weather_refresh_time); + + gnome_config_pop_prefix (); + key = g_strdup_printf ("=%s=/Schedule", evolution_dir); + gnome_config_push_prefix (key); + g_free (key); + + gnome_config_set_int ("days", prefs->days); + gnome_config_set_int ("show_tasks", prefs->show_tasks); + + gnome_config_pop_prefix (); + g_free (evolution_dir); +} + +static void +free_str_list (GList *list) +{ + for (; list; list = list->next) { + g_free (list->data); + } +} + +void +e_summary_preferences_free (ESummaryPrefs *prefs) +{ + if (prefs->display_folders) { + free_str_list (prefs->display_folders); + g_list_free (prefs->display_folders); + } + + if (prefs->rdf_urls) { + free_str_list (prefs->rdf_urls); + g_list_free (prefs->rdf_urls); + } + + if (prefs->stations) { + free_str_list (prefs->stations); + g_list_free (prefs->stations); + } + + g_free (prefs); +} + +static GList * +copy_str_list (GList *list) +{ + GList *list_copy = NULL; + + for (; list; list = list->next) { + list_copy = g_list_prepend (list_copy, g_strdup (list->data)); + } + + list_copy = g_list_reverse (list_copy); + return list_copy; +} + +ESummaryPrefs * +e_summary_preferences_copy (ESummaryPrefs *prefs) +{ + ESummaryPrefs *prefs_copy; + + prefs_copy = g_new (ESummaryPrefs, 1); + + prefs_copy->display_folders = copy_str_list (prefs->display_folders); + prefs_copy->show_full_path = prefs->show_full_path; + + prefs_copy->rdf_urls = copy_str_list (prefs->rdf_urls); + prefs_copy->rdf_refresh_time = prefs->rdf_refresh_time; + prefs_copy->limit = prefs->limit; + prefs_copy->wipe_trackers = prefs->wipe_trackers; + + prefs_copy->stations = copy_str_list (prefs->stations); + prefs_copy->units = prefs->units; + prefs_copy->weather_refresh_time = prefs->weather_refresh_time; + + prefs_copy->days = prefs->days; + prefs_copy->show_tasks = prefs->show_tasks; + + return prefs_copy; +} + +void +e_summary_preferences_init (ESummary *summary) +{ + ESummaryPrefs *prefs; + + g_return_if_fail (summary != NULL); + g_return_if_fail (IS_E_SUMMARY (summary)); + + summary->preferences = g_new0 (ESummaryPrefs, 1); + summary->old_prefs = NULL; + + if (e_summary_preferences_restore (summary->preferences) == TRUE) { + return; + } + + prefs = summary->preferences; + /* Defaults */ + + /* Mail */ + make_initial_mail_list (prefs); + + /* RDF */ + make_initial_rdf_list (prefs); + prefs->rdf_refresh_time = 600; + prefs->limit = 10; + prefs->wipe_trackers = FALSE; + + /* Weather */ + make_initial_weather_list (prefs); + prefs->units = UNITS_METRIC; + prefs->weather_refresh_time = 600; + + prefs->days = E_SUMMARY_CALENDAR_ONE_DAY; + prefs->show_tasks = E_SUMMARY_CALENDAR_ALL_TASKS; +} + +struct _MailPage { + GtkWidget *all, *shown; + GtkWidget *fullpath; + GtkWidget *add, *remove; +}; + +struct _RDFPage { + GtkWidget *all, *shown; + GtkWidget *refresh, *limit, *wipe_trackers; + GtkWidget *add, *remove; + GtkWidget *new_url; +}; + +struct _WeatherPage { + GtkWidget *all, *shown; + GtkWidget *refresh, *imperial, *metric; + GtkWidget *add, *remove; + + GtkCTreeNode *selected_node; +}; + +struct _CalendarPage { + GtkWidget *one, *five, *week, *month; + GtkWidget *all, *today; +}; + +typedef struct _PropertyData { + ESummary *summary; + GnomePropertyBox *box; + GladeXML *xml; + + struct _MailPage *mail; + struct _RDFPage *rdf; + struct _WeatherPage *weather; + struct _CalendarPage *calendar; +} PropertyData; + +static char *rdfs[] = { + "http://news.gnome.org/gnome-news/rdf", + "http://advogato.org/rss/articles.xml", + "http://www.appwatch.com/appwatch.rdf", + "http://barrapunto.com/barrapunto.rdf", + "http://barrapunto.com/gnome.rdf", + "http://www.bsdtoday.com/backend/bt.rdf", + "http://beyond2000.com/b2k.rdf", + "http://www.newsisfree.com/export.php3?_f=rss91&_w=f&_i=1443", + "http://www.cnn.com/cnn.rss", + "http://www.dictionary.com/wordoftheday/wotd.rss", + "http://www.dvdreview.com/rss/newschannel.rss", + "http://freshmeat.net/backend/fm.rdf", + "http://headlines.internet.com/internetnews/prod-news/news.rss", + "http://www.kde.org/news/kdenews.rdf", + "http://www.kuro5hin.org/backend.rdf", + "http://linuxgames.com/bin/mynetscape.pl", + "http://linux.com/mrn/jobs/latest_jobs.rss", + "http://www.linuxplanet.com/rss", + "http://linuxtoday.com/backend/my-netscape.rdf", + "http://lwn.net/headlines/rss", + "http://www.linux.com/mrn/front_page.rss", + "http://morons.org/morons.rss", + "http://www.mozilla.org/news.rdf", + "http://www.mozillazine.org/contents.rdf", + "http://www.fool.com/about/headlines/rss_headlines.asp", + "http://www.newsforge.com/newsforge.rss", + "http://www.nanotechnews.com/nano/rdf", + "http://www.perl.com/pace/news.rss", + "http://www.pigdog.org/pigdog.rdf", + "http://www.python.org/channews.rdf", + "http://www.quotationspage.com/data/mqotd.rss", + "http://www.salon.com/feed/RDF/salon_use.rdf", + "http://www.scriptingnews.userland.com/xml/scriptingnews2.xml", + "http://www.securityfocus.com/topnews-rss.html", + "http://www.segfault.org/stories.xml", + "http://www.slashdot.org/slashdot.rdf", + "http://www.theregister.co.uk/tonys/slashdot.org", + "http://www.thinkgeek.com/thinkgeek.rdf", + "http://www.tomalak.org/recentTodaysLinks.xml", + "http://www.webreference.com/webreference.rdf", + "http://www.zope.org/SiteIndex/news.rss", + NULL +}; + +static void +fill_rdf_all_clist (GtkCList *clist) +{ + int i; + + for (i = 0; rdfs[i]; i++) { + char *text[1]; + + text[0] = rdfs[i]; + gtk_clist_append (clist, text); + } +} + +static void +fill_rdf_shown_clist (GtkCList *clist, + PropertyData *pd) +{ + GList *p; + + for (p = pd->summary->preferences->rdf_urls; p; p = p->next) { + char *text[1]; + + text[0] = p->data; + gtk_clist_append (clist, text); + } +} + +static void +fill_weather_all_ctree (GtkCTree *ctree) +{ + e_summary_weather_ctree_fill (ctree); +} + +static void +fill_weather_shown_clist (GtkCList *clist, + PropertyData *pd) +{ + GList *p; + + for (p = pd->summary->preferences->stations; p; p = p->next) { + char *text[1]; + char *pretty; + + pretty = (char *) e_summary_weather_code_to_name (p->data); + + text[0] = pretty; + gtk_clist_append (clist, text); + } +} + +static void +fill_mail_shown_clist (GtkCList *clist, + PropertyData *pd) +{ + GList *p; + + for (p = pd->summary->preferences->display_folders; p; p = p->next) { + char *text[1]; + + text[0] = p->data; + gtk_clist_append (clist, text); + } +} + +static void +mail_shown_select_row_cb (GtkCList *clist, + int row, + int column, + GdkEvent *event, + PropertyData *pd) +{ + gtk_widget_set_sensitive (pd->mail->remove, TRUE); +} + +static void +mail_shown_unselect_row_cb (GtkCList *clist, + int row, + int column, + GdkEvent *event, + PropertyData *pd) +{ + if (clist->selection == NULL) { + gtk_widget_set_sensitive (pd->mail->remove, FALSE); + } +} + +static void +mail_add_clicked_cb (GtkButton *button, + PropertyData *pd) +{ + +} + +static void +mail_remove_clicked_cb (GtkButton *button, + PropertyData *pd) +{ + int row; + GList *p; + + row = GPOINTER_TO_INT (GTK_CLIST (pd->mail->shown)->selection->data); + p = g_list_nth (pd->summary->preferences->display_folders, row); + + gtk_clist_remove (GTK_CLIST (pd->mail->shown), row); + pd->summary->preferences->display_folders = g_list_remove_link (pd->summary->preferences->display_folders, p); + g_free (p->data); + g_list_free (p); + + gnome_property_box_changed (pd->box); +} + +static void +mail_show_full_path_toggled_cb (GtkToggleButton *tb, + PropertyData *pd) +{ + pd->summary->preferences->show_full_path = gtk_toggle_button_get_active (tb); +} + +static void +rdf_all_select_row_cb (GtkCList *clist, + int row, + int column, + GdkEvent *event, + PropertyData *pd) +{ + gtk_widget_set_sensitive (pd->rdf->add, TRUE); +} + +static void +rdf_all_unselect_row_cb (GtkCList *clist, + int row, + int column, + GdkEvent *event, + PropertyData *pd) +{ + if (GTK_CLIST (pd->rdf->all)->selection == NULL) { + gtk_widget_set_sensitive (pd->rdf->add, FALSE); + } +} + +static void +rdf_shown_select_row_cb (GtkCList *clist, + int row, + int column, + GdkEvent *event, + PropertyData *pd) +{ + gtk_widget_set_sensitive (pd->rdf->remove, TRUE); +} + +static void +rdf_shown_unselect_row_cb (GtkCList *clist, + int row, + int column, + GdkEvent *event, + PropertyData *pd) +{ + if (GTK_CLIST (pd->rdf->shown)->selection == NULL) { + gtk_widget_set_sensitive (pd->rdf->remove, FALSE); + } +} + +static void +rdf_wipe_trackers_toggled_cb (GtkToggleButton *tb, + PropertyData *pd) +{ + pd->summary->preferences->wipe_trackers = gtk_toggle_button_get_active (tb); + + gnome_property_box_changed (pd->box); +} + +static void +rdf_add_clicked_cb (GtkButton *button, + PropertyData *pd) +{ + GList *p; + char *url, *text[1]; + int row; + + row = GPOINTER_TO_INT (GTK_CLIST (pd->rdf->all)->selection->data); + gtk_clist_get_text (GTK_CLIST (pd->rdf->all), row, 0, &url); + + text[0] = url; + + for (p = pd->summary->preferences->rdf_urls; p; p = p->next) { + if (strcmp (p->data, url) == 0) { + /* Found it already */ + return; + } + } + + pd->summary->preferences->rdf_urls = g_list_prepend (pd->summary->preferences->rdf_urls, g_strdup (url)); + gtk_clist_prepend (GTK_CLIST (pd->rdf->shown), text); + + gnome_property_box_changed (pd->box); +} + +static void +rdf_remove_clicked_cb (GtkButton *button, + PropertyData *pd) +{ + GList *p; + int row; + + row = GPOINTER_TO_INT (GTK_CLIST (pd->rdf->shown)->selection->data); + gtk_clist_remove (GTK_CLIST (pd->rdf->shown), row); + + p = g_list_nth (pd->summary->preferences->rdf_urls, row); + pd->summary->preferences->rdf_urls = g_list_remove_link (pd->summary->preferences->rdf_urls, p); + g_free (p->data); + g_list_free (p); + + gnome_property_box_changed (pd->box); +} + +static void +rdf_new_url_clicked_cb (GtkButton *button, + PropertyData *pd) +{ + +} + +static void +rdf_refresh_value_changed_cb (GtkAdjustment *adj, + PropertyData *pd) +{ + pd->summary->preferences->rdf_refresh_time = (int) adj->value; + gnome_property_box_changed (pd->box); +} + +static void +rdf_limit_value_changed_cb (GtkAdjustment *adj, + PropertyData *pd) +{ + pd->summary->preferences->limit = (int) adj->value; + gnome_property_box_changed (pd->box); +} + +static void +weather_all_select_row_cb (GtkCTree *ctree, + GtkCTreeNode *row, + int column, + PropertyData *pd) +{ + gtk_widget_set_sensitive (pd->weather->add, TRUE); + pd->weather->selected_node = row; +} + +static void +weather_all_unselect_row_cb (GtkCList *clist, + GtkCTreeNode *row, + int column, + PropertyData *pd) +{ + if (clist->selection == NULL) { + gtk_widget_set_sensitive (pd->weather->add, FALSE); + } + pd->weather->selected_node = NULL; +} + +static void +weather_shown_select_row_cb (GtkCList *clist, + int row, + int column, + GdkEvent *event, + PropertyData *pd) +{ + gtk_widget_set_sensitive (pd->weather->remove, TRUE); +} + +static void +weather_shown_unselect_row_cb (GtkCList *clist, + int row, + int column, + GdkEvent *event, + PropertyData *pd) +{ + if (clist->selection == NULL) { + gtk_widget_set_sensitive (pd->weather->remove, FALSE); + } +} + +static void +weather_add_clicked_cb (GtkButton *button, + PropertyData *pd) +{ + ESummaryWeatherLocation *location; + GList *p; + char *text[1]; + + location = gtk_ctree_node_get_row_data (GTK_CTREE (pd->weather->all), pd->weather->selected_node); + + for (p = pd->summary->preferences->stations; p; p = p->next) { + if (strcmp (location->code, p->data) == 0) { + return; /* Already have it */ + } + } + + pd->summary->preferences->stations = g_list_prepend (pd->summary->preferences->stations, g_strdup (location->code)); + text[0] = location->name; + gtk_clist_prepend (GTK_CLIST (pd->weather->shown), text); + + gnome_property_box_changed (pd->box); +} + +static void +weather_remove_clicked_cb (GtkButton *button, + PropertyData *pd) +{ + int row; + GList *p; + + row = GPOINTER_TO_INT (GTK_CLIST (pd->weather->shown)->selection->data); + p = g_list_nth (pd->summary->preferences->stations, row); + gtk_clist_remove (GTK_CLIST (pd->weather->shown), row); + + pd->summary->preferences->stations = g_list_remove_link (pd->summary->preferences->stations, p); + g_free (p->data); + g_list_free (p); + + gnome_property_box_changed (pd->box); +} + +static void +weather_refresh_value_changed_cb (GtkAdjustment *adj, + PropertyData *pd) +{ + pd->summary->preferences->weather_refresh_time = (int) adj->value; + gnome_property_box_changed (pd->box); +} + +static void +weather_metric_toggled_cb (GtkToggleButton *tb, + PropertyData *pd) +{ + if (gtk_toggle_button_get_active (tb) == FALSE) { + return; + } + + pd->summary->preferences->units = UNITS_METRIC; + gnome_property_box_changed (pd->box); +} + +static void +weather_imperial_toggled_cb (GtkToggleButton *tb, + PropertyData *pd) +{ + if (gtk_toggle_button_get_active (tb) == FALSE) { + return; + } + + pd->summary->preferences->units = UNITS_IMPERIAL; + gnome_property_box_changed (pd->box); +} + +static gboolean +make_property_dialog (PropertyData *pd) +{ + struct _MailPage *mail; + struct _RDFPage *rdf; + struct _WeatherPage *weather; + struct _CalendarPage *calendar; + + /* Mail */ + mail = pd->mail = g_new (struct _MailPage, 1); + + /* I think this should be a fancy bonobo thingy */ + mail->all = glade_xml_get_widget (pd->xml, "clist2"); + g_return_val_if_fail (mail->all != NULL, FALSE); + + mail->shown = glade_xml_get_widget (pd->xml, "clist1"); + g_return_val_if_fail (mail->shown != NULL, FALSE); + fill_mail_shown_clist (GTK_CLIST (mail->shown), pd); + gtk_signal_connect (GTK_OBJECT (mail->shown), "select-row", + GTK_SIGNAL_FUNC (mail_shown_select_row_cb), pd); + gtk_signal_connect (GTK_OBJECT (mail->shown), "unselect-row", + GTK_SIGNAL_FUNC (mail_shown_unselect_row_cb), pd); + + mail->fullpath = glade_xml_get_widget (pd->xml, "checkbutton1"); + g_return_val_if_fail (mail->fullpath != NULL, FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mail->fullpath), + pd->summary->preferences->show_full_path); + gtk_signal_connect (GTK_OBJECT (mail->fullpath), "toggled", + GTK_SIGNAL_FUNC (mail_show_full_path_toggled_cb), pd); + + mail->add = glade_xml_get_widget (pd->xml, "button4"); + g_return_val_if_fail (mail->add != NULL, FALSE); + gtk_signal_connect (GTK_OBJECT (mail->add), "clicked", + GTK_SIGNAL_FUNC (mail_add_clicked_cb), pd); + + mail->remove = glade_xml_get_widget (pd->xml, "button5"); + g_return_val_if_fail (mail->remove != NULL, FALSE); + gtk_signal_connect (GTK_OBJECT (mail->remove), "clicked", + GTK_SIGNAL_FUNC (mail_remove_clicked_cb), pd); + + /* RDF */ + rdf = pd->rdf = g_new (struct _RDFPage, 1); + rdf->all = glade_xml_get_widget (pd->xml, "clist6"); + g_return_val_if_fail (rdf->all != NULL, FALSE); + gtk_signal_connect (GTK_OBJECT (rdf->all), "select-row", + GTK_SIGNAL_FUNC (rdf_all_select_row_cb), pd); + gtk_signal_connect (GTK_OBJECT (rdf->all), "unselect-row", + GTK_SIGNAL_FUNC (rdf_all_unselect_row_cb), pd); + fill_rdf_all_clist (GTK_CLIST (rdf->all)); + + rdf->shown = glade_xml_get_widget (pd->xml, "clist5"); + g_return_val_if_fail (rdf->shown != NULL, FALSE); + gtk_signal_connect (GTK_OBJECT (rdf->shown), "select-row", + GTK_SIGNAL_FUNC (rdf_shown_select_row_cb), pd); + gtk_signal_connect (GTK_OBJECT (rdf->shown), "unselect-row", + GTK_SIGNAL_FUNC (rdf_shown_unselect_row_cb), pd); + fill_rdf_shown_clist (GTK_CLIST (rdf->shown), pd); + + rdf->refresh = glade_xml_get_widget (pd->xml, "spinbutton1"); + g_return_val_if_fail (rdf->refresh != NULL, FALSE); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (rdf->refresh), + (float) pd->summary->preferences->rdf_refresh_time); + gtk_signal_connect (GTK_OBJECT (GTK_SPIN_BUTTON (rdf->refresh)->adjustment), "value_changed", + GTK_SIGNAL_FUNC (rdf_refresh_value_changed_cb), pd); + + rdf->limit = glade_xml_get_widget (pd->xml, "spinbutton4"); + g_return_val_if_fail (rdf->limit != NULL, FALSE); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (rdf->limit), + (float) pd->summary->preferences->limit); + gtk_signal_connect (GTK_OBJECT (GTK_SPIN_BUTTON (rdf->limit)->adjustment), "value_changed", + GTK_SIGNAL_FUNC (rdf_limit_value_changed_cb), pd); + + rdf->wipe_trackers = glade_xml_get_widget (pd->xml, "checkbutton2"); + g_return_val_if_fail (rdf->wipe_trackers != NULL, FALSE); + gtk_signal_connect (GTK_OBJECT (rdf->wipe_trackers), "toggled", + GTK_SIGNAL_FUNC (rdf_wipe_trackers_toggled_cb), pd); + rdf->add = glade_xml_get_widget (pd->xml, "button9"); + g_return_val_if_fail (rdf->add != NULL, FALSE); + + gtk_widget_set_sensitive (rdf->add, FALSE); + gtk_signal_connect (GTK_OBJECT (rdf->add), "clicked", + GTK_SIGNAL_FUNC (rdf_add_clicked_cb), pd); + + rdf->remove = glade_xml_get_widget (pd->xml, "button10"); + g_return_val_if_fail (rdf->remove != NULL, FALSE); + + gtk_widget_set_sensitive (rdf->remove, FALSE); + gtk_signal_connect (GTK_OBJECT (rdf->remove), "clicked", + GTK_SIGNAL_FUNC (rdf_remove_clicked_cb), pd); + + rdf->new_url = glade_xml_get_widget (pd->xml, "button11"); + g_return_val_if_fail (rdf->new_url != NULL, FALSE); + gtk_signal_connect (GTK_OBJECT (rdf->new_url), "clicked", + GTK_SIGNAL_FUNC (rdf_new_url_clicked_cb), pd); + + /* Weather */ + weather = pd->weather = g_new (struct _WeatherPage, 1); + weather->all = glade_xml_get_widget (pd->xml, "ctree1"); + g_return_val_if_fail (weather->all != NULL, FALSE); + fill_weather_all_ctree (GTK_CTREE (weather->all)); + gtk_signal_connect (GTK_OBJECT (weather->all), "tree-select-row", + GTK_SIGNAL_FUNC (weather_all_select_row_cb), pd); + gtk_signal_connect (GTK_OBJECT (weather->all), "tree-unselect-row", + GTK_SIGNAL_FUNC (weather_all_unselect_row_cb), pd); + + weather->shown = glade_xml_get_widget (pd->xml, "clist3"); + g_return_val_if_fail (weather->shown != NULL, FALSE); + fill_weather_shown_clist (GTK_CLIST (weather->shown), pd); + gtk_signal_connect (GTK_OBJECT (weather->shown), "select-row", + GTK_SIGNAL_FUNC (weather_shown_select_row_cb), pd); + gtk_signal_connect (GTK_OBJECT (weather->shown), "unselect-row", + GTK_SIGNAL_FUNC (weather_shown_unselect_row_cb), pd); + + weather->refresh = glade_xml_get_widget (pd->xml, "spinbutton5"); + g_return_val_if_fail (weather->refresh != NULL, FALSE); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (weather->refresh), + (float) pd->summary->preferences->weather_refresh_time); + gtk_signal_connect (GTK_OBJECT (GTK_SPIN_BUTTON (weather->refresh)->adjustment), + "value-changed", + GTK_SIGNAL_FUNC (weather_refresh_value_changed_cb), + pd); + + weather->metric = glade_xml_get_widget (pd->xml, "radiobutton7"); + g_return_val_if_fail (weather->metric != NULL, FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (weather->metric), (pd->summary->preferences->units == UNITS_METRIC)); + gtk_signal_connect (GTK_OBJECT (weather->metric), "toggled", + GTK_SIGNAL_FUNC (weather_metric_toggled_cb), pd); + + weather->imperial = glade_xml_get_widget (pd->xml, "radiobutton8"); + g_return_val_if_fail (weather->imperial != NULL, FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (weather->imperial), (pd->summary->preferences->units == UNITS_IMPERIAL)); + gtk_signal_connect (GTK_OBJECT (weather->imperial), "toggled", + GTK_SIGNAL_FUNC (weather_imperial_toggled_cb), pd); + + weather->add = glade_xml_get_widget (pd->xml, "button6"); + g_return_val_if_fail (weather->add != NULL, FALSE); + gtk_signal_connect (GTK_OBJECT (weather->add), "clicked", + GTK_SIGNAL_FUNC (weather_add_clicked_cb), pd); + + weather->remove = glade_xml_get_widget (pd->xml, "button7"); + g_return_val_if_fail (weather->remove != NULL, FALSE); + gtk_signal_connect (GTK_OBJECT (weather->remove), "clicked", + GTK_SIGNAL_FUNC (weather_remove_clicked_cb), pd); + + /* Calendar */ + calendar = pd->calendar = g_new (struct _CalendarPage, 1); + calendar->one = glade_xml_get_widget (pd->xml, "radiobutton3"); + g_return_val_if_fail (calendar->one != NULL, FALSE); + calendar->five = glade_xml_get_widget (pd->xml, "radiobutton4"); + g_return_val_if_fail (calendar->five != NULL, FALSE); + calendar->week = glade_xml_get_widget (pd->xml, "radiobutton5"); + g_return_val_if_fail (calendar->week != NULL, FALSE); + calendar->month = glade_xml_get_widget (pd->xml, "radiobutton6"); + g_return_val_if_fail (calendar->month != NULL, FALSE); + calendar->all = glade_xml_get_widget (pd->xml, "radiobutton1"); + g_return_val_if_fail (calendar->all != NULL, FALSE); + calendar->today = glade_xml_get_widget (pd->xml, "radiobutton2"); + g_return_val_if_fail (calendar->today != NULL, FALSE); + + return TRUE; +} + +static void +free_property_dialog (PropertyData *pd) +{ + if (pd->rdf) { + g_free (pd->rdf); + } + if (pd->mail) { + g_free (pd->mail); + } + if (pd->weather) { + g_free (pd->weather); + } + if (pd->calendar) { + g_free (pd->calendar); + } + + if (pd->xml) { + gtk_object_unref (GTK_OBJECT (pd->xml)); + } + if (pd->summary) { + gtk_object_unref (GTK_OBJECT (pd->summary)); + } + + g_free (pd); +} + +static void +property_box_clicked_cb (GnomeDialog *dialog, + int page_num, + PropertyData *pd) +{ + if (page_num == -1) { + e_summary_reconfigure (pd->summary); + e_summary_preferences_free (pd->summary->old_prefs); + pd->summary->old_prefs = NULL; + } +} + +static void +property_box_destroy_cb (GtkObject *object, + PropertyData *pd) +{ + free_property_dialog (pd); +} + +void +e_summary_configure (GtkWidget *widget, + ESummary *summary) +{ + PropertyData *pd; + + if (summary->prefs_window != NULL) { + gdk_window_raise (summary->prefs_window->window); + gdk_window_show (summary->prefs_window->window); + return; + } + + pd = g_new0 (PropertyData, 1); + + gtk_object_ref (GTK_OBJECT (summary)); + pd->summary = summary; + + if (summary->old_prefs != NULL) { + e_summary_preferences_free (summary->old_prefs); + } + + summary->old_prefs = e_summary_preferences_copy (summary->preferences); + + pd->xml = glade_xml_new (EVOLUTION_GLADEDIR "/my-evolution.glade", NULL); + g_assert (pd->xml != NULL); /* Fixme: Nice GUI to explain what happened */ + pd->box = GNOME_PROPERTY_BOX (glade_xml_get_widget (pd->xml, "dialog1")); + if (make_property_dialog (pd) == FALSE) { + g_warning ("Missing some part of XML file"); + free_property_dialog (pd); + return; + } + + gtk_signal_connect (GTK_OBJECT (pd->box), "apply", + GTK_SIGNAL_FUNC (property_box_clicked_cb), pd); + gtk_signal_connect (GTK_OBJECT (pd->box), "destroy", + GTK_SIGNAL_FUNC (property_box_destroy_cb), pd); + gtk_widget_show (GTK_WIDGET (pd->box)); +} + diff --git a/my-evolution/e-summary-preferences.h b/my-evolution/e-summary-preferences.h new file mode 100644 index 0000000000..b271e0c55c --- /dev/null +++ b/my-evolution/e-summary-preferences.h @@ -0,0 +1,15 @@ +/* + * e-summary-preferences.h + * + * Copyright (C) 2001 Ximian, Inc + * + * Authors: Iain Holmes + */ + +gboolean e_summary_preferences_restore (ESummaryPrefs *prefs); +void e_summary_preferences_save (ESummaryPrefs *prefs); +void e_summary_preferences_free (ESummaryPrefs *prefs); +ESummaryPrefs *e_summary_preferences_copy (ESummaryPrefs *prefs); +void e_summary_configure (GtkWidget *widget, + ESummary *summary); +void e_summary_preferences_init (ESummary *summary); diff --git a/my-evolution/e-summary-rdf.c b/my-evolution/e-summary-rdf.c index 96ee50c11d..0980640542 100644 --- a/my-evolution/e-summary-rdf.c +++ b/my-evolution/e-summary-rdf.c @@ -11,7 +11,10 @@ #include #endif +#include #include +#include + #include #include @@ -23,6 +26,7 @@ struct _ESummaryRDF { GList *rdfs; char *html; + guint32 timeout; }; typedef struct _RDF { @@ -39,7 +43,6 @@ typedef struct _RDF { } RDF; int xmlSubstituteEntitiesDefaultValue = 1; -static int wipe_trackers = FALSE; char * e_summary_rdf_get_html (ESummary *summary) @@ -147,25 +150,35 @@ tree_walk (xmlNodePtr root, xmlNodePtr channel = NULL; xmlNodePtr image = NULL; xmlNodePtr item[16]; + gboolean wipe_trackers; int items = 0; - int limit = 10; + int limit; int i; char *t, *u; char *tmp; + if (r->summary->preferences == NULL) { + limit = 10; + wipe_trackers = FALSE; + } else { + limit = r->summary->preferences->limit; + g_print ("Limit: %d\n", limit); + wipe_trackers = r->summary->preferences->wipe_trackers; + } + /* FIXME: Need arrows */ if (r->shown == FALSE) { char *p; /* FIXME: Hash table & UID */ - p = g_strdup_printf ("(+) ", r); + p = g_strdup_printf ("(+)", GPOINTER_TO_INT (r)); g_string_append (html, p); g_free (p); } else { char *p; /* FIXME: Hash table & UID */ - p = g_strdup_printf ("(-)", r); + p = g_strdup_printf ("(-)", GPOINTER_TO_INT (r)); g_string_append (html, p); g_free (p); } @@ -387,6 +400,22 @@ open_callback (GnomeVFSAsyncHandle *handle, (GnomeVFSAsyncReadCallback) read_callback, r); } +static gboolean +e_summary_rdf_update (ESummary *summary) +{ + GList *r; + + for (r = summary->rdf->rdfs; r; r = r->next) { + RDF *rdf = r->data; + + gnome_vfs_async_open (&rdf->handle, rdf->uri, + GNOME_VFS_OPEN_READ, + (GnomeVFSAsyncOpenCallback) open_callback, rdf); + } + + return TRUE; +} + static void e_summary_rdf_add_uri (ESummary *summary, const char *uri) @@ -398,9 +427,6 @@ e_summary_rdf_add_uri (ESummary *summary, r->uri = g_strdup (uri); r->shown = TRUE; summary->rdf->rdfs = g_list_prepend (summary->rdf->rdfs, r); - - gnome_vfs_async_open (&r->handle, r->uri, GNOME_VFS_OPEN_READ, - (GnomeVFSAsyncOpenCallback) open_callback, r); } static void @@ -426,15 +452,67 @@ e_summary_rdf_protocol (ESummary *summary, void e_summary_rdf_init (ESummary *summary) { + ESummaryPrefs *prefs; ESummaryRDF *rdf; + int timeout; g_return_if_fail (summary != NULL); g_return_if_fail (IS_E_SUMMARY (summary)); + prefs = summary->preferences; rdf = g_new0 (ESummaryRDF, 1); summary->rdf = rdf; e_summary_add_protocol_listener (summary, "rdf", e_summary_rdf_protocol, rdf); - e_summary_rdf_add_uri (summary, "http://news.gnome.org/gnome-news/rdf"); + if (prefs == NULL) { + e_summary_rdf_add_uri (summary, "http://news.gnome.org/gnome-news/rdf"); + timeout = 600; + } else { + GList *p; + + for (p = prefs->rdf_urls; p; p = p->next) { + e_summary_rdf_add_uri (summary, p->data); + } + timeout = prefs->rdf_refresh_time; + } + + e_summary_rdf_update (summary); + rdf->timeout = gtk_timeout_add (timeout * 1000, + (GtkFunction) e_summary_rdf_update, summary); + return; } + +void +e_summary_rdf_reconfigure (ESummary *summary) +{ + ESummaryRDF *rdf; + GList *old, *p; + + g_return_if_fail (summary != NULL); + g_return_if_fail (IS_E_SUMMARY (summary)); + + rdf = summary->rdf; + + /* Stop timeout */ + gtk_timeout_remove (rdf->timeout); + + for (old = rdf->rdfs; old; old = old->next) { + RDF *r; + + r = old->data; + g_free (r->uri); + g_free (r->html); + xmlFree (r->cache); + g_free (r); + } + g_list_free (rdf->rdfs); + rdf->rdfs = NULL; + + for (p = summary->preferences->rdf_urls; p; p = p->next) { + e_summary_rdf_add_uri (summary, p->data); + } + + rdf->timeout = gtk_timeout_add (summary->preferences->rdf_refresh_time * 1000, (GtkFunction) e_summary_rdf_update, summary); + e_summary_rdf_update (summary); +} diff --git a/my-evolution/e-summary-rdf.h b/my-evolution/e-summary-rdf.h index cc0fec9e3d..329bdd8bb6 100644 --- a/my-evolution/e-summary-rdf.h +++ b/my-evolution/e-summary-rdf.h @@ -15,4 +15,6 @@ typedef struct _ESummaryRDF ESummaryRDF; char *e_summary_rdf_get_html (ESummary *summary); void e_summary_rdf_init (ESummary *summary); +void e_summary_rdf_reconfigure (ESummary *summary); + #endif diff --git a/my-evolution/e-summary-weather.c b/my-evolution/e-summary-weather.c index 4019dcd263..ebe6158e95 100644 --- a/my-evolution/e-summary-weather.c +++ b/my-evolution/e-summary-weather.c @@ -11,6 +11,9 @@ #endif #include +#include +#include + #include #include #include @@ -27,6 +30,7 @@ struct _ESummaryWeather { GList *weathers; char *html; + guint32 timeout; }; static GHashTable *locations_hash = NULL; @@ -283,22 +287,33 @@ open_callback (GnomeVFSAsyncHandle *handle, (GnomeVFSAsyncReadCallback) read_callback, w); } +static void +e_summary_weather_update (ESummary *summary) +{ + GList *w; + + for (w = summary->weather->weathers; w; w = w->next) { + char *uri; + Weather *weather = w->data; + + uri = g_strdup_printf ("http://weather.noaa.gov/cgi-bin/mgetmetar.pl?cccc=%s", weather->location); + + gnome_vfs_async_open (&weather->handle, uri, GNOME_VFS_OPEN_READ, + (GnomeVFSAsyncOpenCallback) open_callback, weather); + g_free (uri); + } +} + static void e_summary_weather_add_location (ESummary *summary, const char *location) { Weather *w; - char *uri; w = g_new0 (Weather, 1); w->summary = summary; w->location = g_strdup (location); summary->weather->weathers = g_list_prepend (summary->weather->weathers, w); - - uri = g_strdup_printf ("http://weather.noaa.gov/cgi-bin/mgetmetar.pl?cccc=%s", location); - gnome_vfs_async_open (&w->handle, uri, GNOME_VFS_OPEN_READ, - (GnomeVFSAsyncOpenCallback) open_callback, w); - g_free (uri); } static gboolean @@ -332,7 +347,7 @@ e_summary_weather_init_locations (void) region_name_key = g_strconcat (regions[iregions], "/name", NULL); states_key = g_strconcat (regions[iregions], "/states", NULL); region_name = gnome_config_get_string (region_name_key); - + gnome_config_get_vector (states_key, &nstates, &states); for (istates = nstates - 1; istates >= 0; istates--) { @@ -361,14 +376,14 @@ e_summary_weather_init_locations (void) g_hash_table_insert (locations_hash, g_strdup (locdata[1]), location); - + g_strfreev (locdata); } - + g_free (iter_key); g_free (iter_val); } - + g_free (state_name); g_free (state_path); g_free (state_name_key); @@ -397,7 +412,9 @@ e_summary_weather_protocol (ESummary *summary, void e_summary_weather_init (ESummary *summary) { + ESummaryPrefs *prefs; ESummaryWeather *weather; + int timeout; g_return_if_fail (summary != NULL); g_return_if_fail (IS_E_SUMMARY (summary)); @@ -406,13 +423,185 @@ e_summary_weather_init (ESummary *summary) return; } + prefs = summary->preferences; weather = g_new0 (ESummaryWeather, 1); summary->weather = weather; e_summary_add_protocol_listener (summary, "weather", e_summary_weather_protocol, weather); - e_summary_weather_add_location (summary, "ENBR"); - e_summary_weather_add_location (summary, "EGAC"); - e_summary_weather_add_location (summary, "EGAA"); + if (prefs == NULL) { + e_summary_weather_add_location (summary, "ENBR"); + e_summary_weather_add_location (summary, "EGAC"); + e_summary_weather_add_location (summary, "EGAA"); + timeout = 600; + } else { + GList *p; + + for (p = prefs->stations; p; p = p->next) { + e_summary_weather_add_location (summary, p->data); + } + timeout = prefs->weather_refresh_time; + } + + e_summary_weather_update (summary); + + weather->timeout = gtk_timeout_add (timeout * 1000, + (GtkFunction) e_summary_weather_update, + summary); return; } + +const char * +e_summary_weather_code_to_name (const char *code) +{ + ESummaryWeatherLocation *location; + + if (locations_hash == NULL) { + if (e_summary_weather_init_locations () == FALSE) { + return code; + } + } + + location = g_hash_table_lookup (locations_hash, code); + if (location == NULL) { + return code; + } else { + return location->name; + } +} + +void +e_summary_weather_ctree_fill (GtkCTree *tree) +{ + GtkCTreeNode *region, *state, *location, *pref_loc_root; + char *key, *path; + int nregions, iregions; + char **regions, *pp[1]; + + path = g_strdup (EVOLUTION_DATADIR "/evolution/Locations"); + + key = g_strdup_printf ("=%s=/", path); + g_free (path); + + gnome_config_push_prefix (key); + g_free (key); + + pp[0] = _("Regions"); + pref_loc_root = gtk_ctree_insert_node (tree, NULL, NULL, pp, 0, + NULL, NULL, NULL, NULL, + FALSE, TRUE); + + gnome_config_get_vector ("Main/regions", &nregions, ®ions); + region = NULL; + for (iregions = nregions - 1; iregions >= 0; iregions--) { + int nstates, istates; + char **states; + char *region_name; + char *region_name_key; + char *states_key; + + region_name_key = g_strconcat (regions[iregions], "/name", NULL); + states_key = g_strconcat (regions[iregions], "/states", NULL); + region_name = gnome_config_get_string (region_name_key); + + pp[0] = region_name; + region = gtk_ctree_insert_node (tree, pref_loc_root, + region, pp, 0, NULL, + NULL, NULL, NULL, + FALSE, FALSE); + + gnome_config_get_vector (states_key, &nstates, &states); + + state = NULL; + for (istates = nstates - 1; istates >= 0; istates--) { + void *iter; + char *iter_key, *iter_val; + char *state_path, *state_name_key, *state_name; + + state_path = g_strconcat (regions[iregions], "_", states[istates], "/", NULL); + state_name_key = g_strconcat (state_path, "name", NULL); + state_name = gnome_config_get_string (state_name_key); + + pp[0] = state_name; + state = gtk_ctree_insert_node (tree, region, + state, pp, 0, + NULL, NULL, + NULL, NULL, + FALSE, FALSE); + + location = NULL; + iter = gnome_config_init_iterator (state_path); + + while ((iter = gnome_config_iterator_next (iter, &iter_key, &iter_val)) != NULL) { + if (strstr (iter_key, "loc") != NULL) { + char **locdata; + int nlocdata; + ESummaryWeatherLocation *w_location; + + gnome_config_make_vector (iter_val, + &nlocdata, + &locdata); + g_return_if_fail (nlocdata == 4); + + pp[0] = locdata[0]; + location = gtk_ctree_insert_node (tree, state, location, pp, 0, + NULL, NULL, NULL, NULL, FALSE, TRUE); + w_location = g_hash_table_lookup (locations_hash, locdata[1]); + gtk_ctree_node_set_row_data (tree, location, w_location); + g_strfreev (locdata); + } + + g_free (iter_key); + g_free (iter_val); + } + + g_free (state_name); + g_free (state_path); + g_free (state_name_key); + } + + g_strfreev (states); + g_free (region_name); + g_free (region_name_key); + g_free (states_key); + } + + g_strfreev (regions); + gnome_config_pop_prefix (); + + return; +} + +void +e_summary_weather_reconfigure (ESummary *summary) +{ + ESummaryWeather *weather; + GList *old, *p; + + g_return_if_fail (summary != NULL); + g_return_if_fail (IS_E_SUMMARY (summary)); + + weather = summary->weather; + + /* Stop timeout so it doesn't occur while we're changing stuff*/ + gtk_timeout_remove (weather->timeout); + + for (old = weather->weathers; old; old = old->next) { + Weather *w; + + w = old->data; + g_free (w->location); + g_free (w->html); + g_free (w->metar); + g_free (w); + } + g_list_free (weather->weathers); + weather->weathers = NULL; + for (p = summary->preferences->stations; p; p = p->next) { + e_summary_weather_add_location (summary, p->data); + } + + weather->timeout = gtk_timeout_add (summary->preferences->weather_refresh_time * 1000, + (GtkFunction) e_summary_weather_update, summary); + e_summary_weather_update (summary); +} diff --git a/my-evolution/e-summary-weather.h b/my-evolution/e-summary-weather.h index d771a05aa8..290efc6aa8 100644 --- a/my-evolution/e-summary-weather.h +++ b/my-evolution/e-summary-weather.h @@ -7,6 +7,7 @@ #define __E_SUMMARY_WEATHER_H__ #include +#include #include "e-summary-type.h" typedef struct _ESummaryWeather ESummaryWeather; @@ -125,4 +126,8 @@ typedef time_t ESummaryWeatherUpdate; char *e_summary_weather_get_html (ESummary *summary); void e_summary_weather_init (ESummary *summary); +void e_summary_weather_reconfigure (ESummary *summary); +void e_summary_weather_ctree_fill (GtkCTree *tree); +const char *e_summary_weather_code_to_name (const char *code); + #endif diff --git a/my-evolution/e-summary.c b/my-evolution/e-summary.c index 920f2ad334..5a0dcbd0b9 100644 --- a/my-evolution/e-summary.c +++ b/my-evolution/e-summary.c @@ -33,6 +33,7 @@ #include #include "e-summary.h" +#include "e-summary-preferences.h" #include "my-evolution-html.h" #include "Mail.h" @@ -358,6 +359,9 @@ e_summary_init (ESummary *summary) TRUE, TRUE, 0); priv->protocol_hash = NULL; + + summary->prefs_window = NULL; + e_summary_preferences_init (summary); } E_MAKE_TYPE (e_summary, "ESummary", ESummary, e_summary_class_init, @@ -547,3 +551,23 @@ e_summary_unset_message (ESummary *summary) GNOME_Evolution_ShellView_unsetMessage (svi, &ev); CORBA_exception_free (&ev); } + +void +e_summary_reconfigure (ESummary *summary) +{ + if (summary->mail != NULL) { + e_summary_mail_reconfigure (summary); + } + + if (summary->rdf != NULL) { + e_summary_rdf_reconfigure (summary); + } + + if (summary->weather != NULL) { + e_summary_weather_reconfigure (summary); + } + + if (summary->calendar != NULL) { + e_summary_calendar_reconfigure (summary); + } +} diff --git a/my-evolution/e-summary.h b/my-evolution/e-summary.h index 43c1440c0f..45d1905678 100644 --- a/my-evolution/e-summary.h +++ b/my-evolution/e-summary.h @@ -26,14 +26,40 @@ typedef struct _ESummaryPrivate ESummaryPrivate; typedef struct _ESummaryClass ESummaryClass; +typedef struct _ESummaryPrefs ESummaryPrefs; typedef void (* ESummaryProtocolListener) (ESummary *summary, const char *uri, void *closure); +struct _ESummaryPrefs { + + /* Mail */ + GList *display_folders; + gboolean show_full_path; + + /* RDF */ + GList *rdf_urls; + int rdf_refresh_time; + int limit; + gboolean wipe_trackers; + + /* Weather */ + GList *stations; + ESummaryWeatherUnits units; + int weather_refresh_time; + + /* Schedule */ + ESummaryCalendarDays days; + ESummaryCalendarNumTasks show_tasks; +}; + struct _ESummary { GtkVBox parent; + ESummaryPrefs *preferences; + ESummaryPrefs *old_prefs; + ESummaryMail *mail; ESummaryCalendar *calendar; ESummaryRDF *rdf; @@ -42,6 +68,8 @@ struct _ESummary { ESummaryPrivate *priv; GNOME_Evolution_ShellView shell_view_interface; + + GtkWidget *prefs_window; }; struct _ESummaryClass { @@ -63,5 +91,5 @@ void e_summary_add_protocol_listener (ESummary *summary, const char *protocol, ESummaryProtocolListener listener, void *closure); - +void e_summary_reconfigure (ESummary *summary); #endif diff --git a/my-evolution/main.c b/my-evolution/main.c index d8c6160486..f13e76434c 100644 --- a/my-evolution/main.c +++ b/my-evolution/main.c @@ -30,6 +30,7 @@ #endif #include +#include #include "component-factory.h" @@ -56,6 +57,7 @@ main (int argc, gconf_init (argc, argv, NULL); #endif + glade_gnome_init (); gnome_vfs_init (); /* Start our component */ diff --git a/my-evolution/metar.c b/my-evolution/metar.c index 353593da79..ee99816e00 100644 --- a/my-evolution/metar.c +++ b/my-evolution/metar.c @@ -142,8 +142,15 @@ char * weather_temp_string (Weather *w) { char *temp; + ESummaryWeatherUnits units; - temp = g_strdup_printf ("%.1f%s", w->temp, TEMP_UNIT_STR (w->units)); + if (w->summary->preferences == NULL) { + units = UNITS_METRIC; + } else { + units = w->summary->preferences->units; + } + + temp = g_strdup_printf ("%.1f%s", w->temp, TEMP_UNIT_STR (units)); return temp; } @@ -437,12 +444,15 @@ metar_tok_pres (gchar *tokp, static inline gint calc_humidity(gdouble temp, - gdouble dewp) + gdouble dewp, + ESummaryWeatherUnits units) { gdouble esat, esurf; - temp = TEMP_F_TO_C(temp); - dewp = TEMP_F_TO_C(dewp); + if (units == UNITS_IMPERIAL) { + temp = TEMP_F_TO_C(temp); + dewp = TEMP_F_TO_C(dewp); + } esat = 6.11 * pow(10.0, (7.5 * temp) / (237.7 + temp)); esurf = 6.11 * pow(10.0, (7.5 * dewp) / (237.7 + dewp)); @@ -454,22 +464,35 @@ gboolean metar_tok_temp (gchar *tokp, Weather *w) { - gchar *ptemp, *pdew, *psep; - - if (regexec(&metar_re[TEMP_RE], tokp, 0, NULL, 0) == REG_NOMATCH) - return FALSE; - - psep = strchr(tokp, '/'); - *psep = 0; - ptemp = tokp; - pdew = psep + 1; - - w->temp = (*ptemp == 'M') ? TEMP_C_TO_F(-atoi(ptemp+1)) : - TEMP_C_TO_F(atoi(ptemp)); - w->dew = (*pdew == 'M') ? TEMP_C_TO_F(-atoi(pdew+1)) : - TEMP_C_TO_F(atoi(pdew)); - w->humidity = calc_humidity(w->temp, w->dew); - return TRUE; + ESummaryWeatherUnits units; + gchar *ptemp, *pdew, *psep; + + if (regexec(&metar_re[TEMP_RE], tokp, 0, NULL, 0) == REG_NOMATCH) + return FALSE; + + if (w->summary->preferences == NULL) { + units = UNITS_METRIC; + } else { + units = w->summary->preferences->units; + } + + psep = strchr(tokp, '/'); + *psep = 0; + ptemp = tokp; + pdew = psep + 1; + + if (units == UNITS_IMPERIAL) { + w->temp = (*ptemp == 'M') ? TEMP_C_TO_F(-atoi(ptemp+1)) : + TEMP_C_TO_F(atoi(ptemp)); + w->dew = (*pdew == 'M') ? TEMP_C_TO_F(-atoi(pdew+1)) : + TEMP_C_TO_F(atoi(pdew)); + } else { + w->temp = (*ptemp == 'M') ? -atoi(ptemp+1) : atoi(ptemp); + w->dew = (*pdew == 'M') ? -atoi(pdew+1) : atoi (pdew); + } + + w->humidity = calc_humidity(w->temp, w->dew, units); + return TRUE; } gboolean diff --git a/my-evolution/metar.h b/my-evolution/metar.h index ae9b1644d6..cbbb8f9550 100644 --- a/my-evolution/metar.h +++ b/my-evolution/metar.h @@ -27,6 +27,7 @@ enum { const char *weather_sky_string (Weather *w); char *weather_temp_string (Weather *w); const char *weather_conditions_string (Weather *w); +const char *weather_wind_direction_string (Weather *w); void metar_init_re (void); gboolean metar_tok_time (char *token, diff --git a/my-evolution/my-evolution.glade b/my-evolution/my-evolution.glade new file mode 100644 index 0000000000..5093984ca7 --- /dev/null +++ b/my-evolution/my-evolution.glade @@ -0,0 +1,1590 @@ + + + + + Project1 + project1 + + src + pixmaps + C + True + True + + + + GnomePropertyBox + dialog1 + 592 + GTK_WIN_POS_NONE + False + False + False + False + + + GtkNotebook + GnomePropertyBox:notebook + notebook2 + True + True + True + GTK_POS_TOP + False + 2 + 2 + False + + 0 + True + True + + + + GtkVBox + vbox3 + False + 0 + + + GtkTable + table1 + 8 + 2 + 3 + False + 0 + 0 + + 0 + True + True + + + + GtkLabel + label9 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + 1 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkLabel + label10 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 2 + 3 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkAlignment + alignment1 + 8 + 0.5 + 0.5 + 1 + 0 + + 1 + 2 + 1 + 2 + 0 + 0 + False + False + False + False + False + False + + + + GtkVBox + vbox4 + False + 8 + + + GtkButton + button4 + False + True + + GTK_RELIEF_NORMAL + + 0 + False + False + + + + + GtkButton + button5 + False + True + + GTK_RELIEF_NORMAL + + 0 + False + False + + + + + + + GtkLabel + label11 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 1 + 2 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkScrolledWindow + scrolledwindow1 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_UPDATE_CONTINUOUS + GTK_UPDATE_CONTINUOUS + + 2 + 3 + 1 + 2 + 0 + 0 + True + True + False + False + True + True + + + + GtkCList + clist1 + 100 + 150 + True + 1 + 80 + GTK_SELECTION_EXTENDED + False + GTK_SHADOW_IN + + + GtkLabel + CList:title + label12 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + + + GtkScrolledWindow + scrolledwindow2 + 100 + 150 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_UPDATE_CONTINUOUS + GTK_UPDATE_CONTINUOUS + + 0 + 1 + 1 + 2 + 0 + 0 + True + True + False + False + True + True + + + + GtkCList + clist2 + True + 1 + 80 + GTK_SELECTION_EXTENDED + False + GTK_SHADOW_IN + + + GtkLabel + CList:title + label13 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + + + + GtkCheckButton + checkbutton1 + 3 + True + + False + True + + 0 + False + False + + + + + + GtkLabel + Notebook:tab + label5 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + GtkVBox + vbox6 + False + 0 + + + GtkTable + table3 + 8 + 2 + 3 + False + 0 + 0 + + 0 + True + True + + + + GtkLabel + label19 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + 1 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkLabel + label20 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 2 + 3 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkAlignment + alignment3 + 8 + 0.5 + 0.5 + 1 + 0 + + 1 + 2 + 1 + 2 + 0 + 0 + False + False + False + False + False + False + + + + GtkVBox + vbox7 + False + 8 + + + GtkButton + button9 + False + True + + GTK_RELIEF_NORMAL + + 0 + False + False + + + + + GtkButton + button10 + False + True + + GTK_RELIEF_NORMAL + + 0 + False + False + + + + + + + GtkLabel + label21 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 1 + 2 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkScrolledWindow + scrolledwindow5 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_UPDATE_CONTINUOUS + GTK_UPDATE_CONTINUOUS + + 2 + 3 + 1 + 2 + 0 + 0 + True + True + False + False + True + True + + + + GtkCList + clist5 + 100 + 150 + True + 1 + 80 + GTK_SELECTION_EXTENDED + False + GTK_SHADOW_IN + + + GtkLabel + CList:title + label22 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + + + GtkScrolledWindow + scrolledwindow6 + 100 + 150 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_UPDATE_CONTINUOUS + GTK_UPDATE_CONTINUOUS + + 0 + 1 + 1 + 2 + 0 + 0 + True + True + False + False + True + True + + + + GtkCList + clist6 + True + 1 + 80 + GTK_SELECTION_EXTENDED + False + GTK_SHADOW_IN + + + GtkLabel + CList:title + label23 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + + + + GtkFrame + frame2 + 3 + + 0 + GTK_SHADOW_ETCHED_IN + + 0 + False + False + + + + GtkTable + table4 + 3 + 2 + 5 + False + 3 + 3 + + + GtkLabel + label25 + + GTK_JUSTIFY_LEFT + False + 0 + 0.5 + 0 + 0 + + 0 + 1 + 0 + 1 + 0 + 0 + False + False + False + False + True + False + + + + + GtkLabel + label29 + + GTK_JUSTIFY_LEFT + False + 0 + 0.5 + 0 + 0 + + 0 + 1 + 1 + 2 + 0 + 0 + False + False + False + False + True + False + + + + + GtkSpinButton + spinbutton1 + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 + 0 + 1e+06 + 1 + 10 + 10 + + 1 + 2 + 0 + 1 + 0 + 0 + False + False + False + False + True + False + + + + + GtkSpinButton + spinbutton4 + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 + 0 + 100 + 1 + 10 + 10 + + 1 + 3 + 1 + 2 + 0 + 0 + False + False + False + False + True + False + + + + + GtkCheckButton + checkbutton2 + True + + False + True + + 4 + 5 + 1 + 2 + 0 + 0 + False + False + False + False + True + False + + + + + GtkButton + button11 + True + + GTK_RELIEF_NORMAL + + 3 + 5 + 0 + 1 + 0 + 0 + True + False + False + False + True + False + + + + + + + + GtkLabel + Notebook:tab + label6 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + GtkVBox + vbox8 + False + 0 + + + GtkTable + table2 + 8 + 2 + 3 + False + 0 + 0 + + 0 + True + True + + + + GtkLabel + label14 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + 1 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkLabel + label15 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 2 + 3 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkAlignment + alignment2 + 8 + 0.5 + 0.5 + 1 + 0 + + 1 + 2 + 1 + 2 + 0 + 0 + False + False + False + False + False + False + + + + GtkVBox + vbox5 + False + 8 + + + GtkButton + button6 + False + True + + GTK_RELIEF_NORMAL + + 0 + False + False + + + + + GtkButton + button7 + False + True + + GTK_RELIEF_NORMAL + + 0 + False + False + + + + + + + GtkLabel + label16 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 1 + 2 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkScrolledWindow + scrolledwindow3 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_UPDATE_CONTINUOUS + GTK_UPDATE_CONTINUOUS + + 2 + 3 + 1 + 2 + 0 + 0 + True + True + False + False + True + True + + + + GtkCList + clist3 + 100 + 150 + True + 1 + 80 + GTK_SELECTION_EXTENDED + False + GTK_SHADOW_IN + + + GtkLabel + CList:title + label17 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + + + GtkScrolledWindow + scrolledwindow4 + 100 + 150 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_UPDATE_CONTINUOUS + GTK_UPDATE_CONTINUOUS + + 0 + 1 + 1 + 2 + 0 + 0 + True + True + False + False + True + True + + + + GtkCTree + ctree1 + True + 1 + 80 + GTK_SELECTION_SINGLE + False + GTK_SHADOW_IN + + + GtkLabel + CTree:title + label39 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + + + + GtkFrame + frame3 + 3 + + 0 + GTK_SHADOW_ETCHED_IN + + 0 + False + False + + + + GtkVBox + vbox11 + 3 + False + 0 + + + GtkHBox + hbox4 + False + 3 + + 0 + False + False + + + + GtkLabel + label37 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GtkRadioButton + radiobutton7 + True + + False + True + + 0 + False + False + + + + + GtkRadioButton + radiobutton8 + True + + False + True + + 0 + False + False + + + + + + GtkHBox + hbox5 + False + 3 + + 0 + True + True + + + + GtkLabel + label38 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + 0 + False + False + + + + + GtkSpinButton + spinbutton5 + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 + 0 + 1e+06 + 1 + 10 + 10 + + 0 + False + False + + + + + + + + + GtkLabel + Notebook:tab + label7 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + GtkVBox + vbox9 + False + 0 + + + GtkFrame + frame4 + 3 + + 0 + GTK_SHADOW_ETCHED_IN + + 0 + False + False + + + + GtkVBox + vbox10 + 3 + False + 3 + + + GtkLabel + label32 + + GTK_JUSTIFY_LEFT + False + 7.45058e-09 + 0.5 + 3 + 0 + + 0 + False + True + + + + + GtkTable + table5 + 3 + 4 + 3 + False + 3 + 3 + + 0 + True + True + + + + GtkRadioButton + radiobutton3 + True + + False + True + + 0 + 1 + 0 + 1 + 0 + 0 + False + False + False + False + False + False + + + + + GtkRadioButton + radiobutton5 + True + + False + True + + 0 + 1 + 2 + 3 + 0 + 0 + False + False + False + False + True + False + + + + + GtkRadioButton + radiobutton6 + True + + False + True + + 0 + 1 + 3 + 4 + 0 + 0 + False + False + False + False + True + False + + + + + GtkRadioButton + radiobutton4 + True + + False + True + + 0 + 1 + 1 + 2 + 0 + 0 + False + False + False + False + False + False + + + + + GnomePixmap + pixmap2 + workweekview.xpm + + 1 + 2 + 1 + 2 + 0 + 0 + False + False + False + False + True + True + + + + + GnomePixmap + pixmap3 + weekview.xpm + + 1 + 2 + 2 + 3 + 0 + 0 + False + False + False + False + True + True + + + + + GnomePixmap + pixmap4 + monthview.xpm + + 1 + 2 + 3 + 4 + 0 + 0 + False + False + False + False + True + True + + + + + GnomePixmap + pixmap1 + dayview.xpm + + 1 + 2 + 0 + 1 + 0 + 0 + False + False + False + False + False + True + + + + + GtkLabel + label33 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 2 + 3 + 0 + 1 + 0 + 0 + True + False + False + False + True + False + + + + + GtkLabel + label34 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 2 + 3 + 1 + 2 + 0 + 0 + True + False + False + False + True + False + + + + + GtkLabel + label35 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 2 + 3 + 2 + 3 + 0 + 0 + True + False + False + False + True + False + + + + + GtkLabel + label36 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 2 + 3 + 3 + 4 + 0 + 0 + True + False + False + False + True + False + + + + + + + + GtkFrame + frame5 + 3 + + 0 + GTK_SHADOW_ETCHED_IN + + 0 + False + False + + + + GtkHBox + hbox3 + False + 0 + + + GtkRadioButton + radiobutton1 + True + + False + True + + 0 + False + False + + + + + GtkRadioButton + radiobutton2 + True + + False + True + + 0 + False + False + + + + + + + + GtkLabel + Notebook:tab + label8 + + GTK_JUSTIFY_CENTER + False + 0.5 + 0.5 + 0 + 0 + + + + + -- cgit v1.2.3