Index: addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in =================================================================== RCS file: /cvs/gnome/evolution/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in,v retrieving revision 1.25 diff -u -p -r1.25 GNOME_Evolution_Addressbook.server.in.in --- addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in 5 Feb 2006 23:46:25 -0000 1.25 +++ addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in 12 Sep 2006 05:58:32 -0000 @@ -44,6 +44,8 @@ _value="Evolution Address Book component"/> + + @@ -92,7 +94,9 @@ - + + + @@ -113,7 +117,9 @@ - + + + Index: addressbook/gui/component/addressbook-component.c =================================================================== RCS file: /cvs/gnome/evolution/addressbook/gui/component/addressbook-component.c,v retrieving revision 1.147 diff -u -p -r1.147 addressbook-component.c --- addressbook/gui/component/addressbook-component.c 17 Aug 2006 09:14:59 -0000 1.147 +++ addressbook/gui/component/addressbook-component.c 12 Sep 2006 05:58:32 -0000 @@ -215,7 +215,29 @@ impl__get_userCreatableItems (PortableSe CORBA_Environment *ev) { GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc (); + GList *name=NULL, *verb=NULL, *accel=NULL, *ptr=NULL; + char *parse_filename=NULL; + char *accel_contact, *accel_book, *accel_list; + int index; + char *home = g_get_home_dir(); + char *user_path = g_build_filename (home, ".evolution", "ui", NULL); + e_toolbar_copy_file ("evolution-uci.xml"); + parse_filename = g_build_filename (user_path, "evolution-uci.xml", NULL); + e_xml_parse_shortcuts_file (parse_filename, &name, &verb, &accel); + + ptr = g_list_find_custom (verb, "NewContact", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_contact = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewContactList", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_list = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewAddressbook", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_book = g_list_nth_data (accel, index); + list->_length = 3; list->_maximum = list->_length; list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length); @@ -226,7 +248,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[0].description = _("New Contact"); list->_buffer[0].menuDescription = _("_Contact"); list->_buffer[0].tooltip = _("Create a new contact"); - list->_buffer[0].menuShortcut = 'c'; + list->_buffer[0].menuShortcut = accel_contact; list->_buffer[0].iconName = "stock_contact"; list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -234,7 +256,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[1].description = _("New Contact List"); list->_buffer[1].menuDescription = _("Contact _List"); list->_buffer[1].tooltip = _("Create a new contact list"); - list->_buffer[1].menuShortcut = 'l'; + list->_buffer[1].menuShortcut = accel_list; list->_buffer[1].iconName = "stock_contact-list"; list->_buffer[1].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -242,7 +264,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[2].description = _("New Address Book"); list->_buffer[2].menuDescription = _("Address _Book"); list->_buffer[2].tooltip = _("Create a new address book"); - list->_buffer[2].menuShortcut = '\0'; + list->_buffer[2].menuShortcut = accel_book; list->_buffer[2].iconName = "stock_addressbook"; list->_buffer[2].type = GNOME_Evolution_CREATABLE_FOLDER; Index: addressbook/gui/component/addressbook-view.c =================================================================== RCS file: /cvs/gnome/evolution/addressbook/gui/component/addressbook-view.c,v retrieving revision 1.48 diff -u -p -r1.48 addressbook-view.c --- addressbook/gui/component/addressbook-view.c 15 Jun 2006 09:59:54 -0000 1.48 +++ addressbook/gui/component/addressbook-view.c 12 Sep 2006 05:58:32 -0000 @@ -47,6 +47,10 @@ #include "misc/e-task-bar.h" #include "misc/e-info-label.h" +#include +#include + +#include #include "e-util/e-icon-factory.h" #include "e-util/e-util-private.h" @@ -656,9 +660,8 @@ control_activate (BonoboControl *con bonobo_ui_component_freeze (uic, NULL); - xmlfile = g_build_filename (EVOLUTION_UIDIR, - "evolution-addressbook.xml", - NULL); + xmlfile = e_toolbar_copy_file ("evolution-addressbook.xml"); + bonobo_ui_util_set_ui (uic, PREFIX, xmlfile, "evolution-addressbook", NULL); @@ -1333,7 +1336,9 @@ addressbook_view_init (AddressbookView * gtk_widget_show (priv->info_widget); priv->selector = e_source_selector_new (priv->source_list); - + gtk_tree_view_set_enable_search ((GtkTreeView *)priv->selector, + gconf_client_get_bool (priv->gconf_client, "/apps/evolution/shell/view_defaults/side_bar_search", NULL)); + g_signal_connect (priv->selector, "drag-motion", G_CALLBACK (selector_tree_drag_motion), view); g_signal_connect (priv->selector, "drag-leave", G_CALLBACK (selector_tree_drag_leave), view); g_signal_connect (priv->selector, "drag-drop", G_CALLBACK (selector_tree_drag_drop), view); Index: calendar/gui/GNOME_Evolution_Calendar.server.in.in =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/GNOME_Evolution_Calendar.server.in.in,v retrieving revision 1.20 diff -u -p -r1.20 GNOME_Evolution_Calendar.server.in.in --- calendar/gui/GNOME_Evolution_Calendar.server.in.in 12 Jan 2006 15:08:40 -0000 1.20 +++ calendar/gui/GNOME_Evolution_Calendar.server.in.in 12 Sep 2006 05:58:33 -0000 @@ -40,6 +40,7 @@ + @@ -60,6 +61,7 @@ + @@ -80,6 +82,7 @@ + @@ -111,7 +114,11 @@ - + + + + + @@ -124,6 +131,7 @@ + Index: calendar/gui/calendar-commands.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/calendar-commands.c,v retrieving revision 1.163 diff -u -p -r1.163 calendar-commands.c --- calendar/gui/calendar-commands.c 30 Jan 2006 04:27:10 -0000 1.163 +++ calendar/gui/calendar-commands.c 12 Sep 2006 05:58:33 -0000 @@ -66,6 +66,7 @@ #include "e-util/e-icon-factory.h" #include "e-util/e-util-private.h" #include "e-cal-menu.h" +#include "e-util/e-util.h" /* Focusing information for the calendar view. We have to keep track of this * ourselves because with Bonobo controls, we may get unpaired focus_out events. @@ -649,9 +650,8 @@ calendar_control_activate (BonoboControl bonobo_ui_component_freeze (uic, NULL); - xmlfile = g_build_filename (EVOLUTION_UIDIR, - "evolution-calendar.xml", - NULL); + xmlfile = e_toolbar_copy_file ("evolution-calendar.xml"); + bonobo_ui_util_set_ui (uic, PREFIX, xmlfile, "evolution-calendar", Index: calendar/gui/calendar-component.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/calendar-component.c,v retrieving revision 1.220 diff -u -p -r1.220 calendar-component.c --- calendar/gui/calendar-component.c 22 Aug 2006 10:24:31 -0000 1.220 +++ calendar/gui/calendar-component.c 12 Sep 2006 05:58:33 -0000 @@ -1334,7 +1334,9 @@ create_component_view (CalendarComponent e_source_selector_set_select_new ((ESourceSelector *)component_view->source_selector, TRUE); a11y = gtk_widget_get_accessible (GTK_WIDGET (component_view->source_selector)); atk_object_set_name (a11y, _("Calendar Source Selector")); - + gtk_tree_view_set_enable_search ((GtkTreeView *)component_view->source_selector, + calendar_config_get_side_bar_search()); + g_signal_connect (component_view->source_selector, "drag-motion", G_CALLBACK (selector_tree_drag_motion), calendar_component); g_signal_connect (component_view->source_selector, "drag-leave", G_CALLBACK (selector_tree_drag_leave), @@ -1533,7 +1535,33 @@ impl__get_userCreatableItems (PortableSe CORBA_Environment *ev) { GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc (); - + GList *name=NULL, *verb=NULL, *accel=NULL, *ptr=NULL; + char *parse_filename=NULL; + char *accel_cal, *accel_meet, *accel_app, *accel_allday; + int index; + char *home = g_get_home_dir(); + char *user_path = g_build_filename (home, ".evolution", "ui", NULL); + + e_toolbar_copy_file ("evolution-uci.xml"); + parse_filename = g_build_filename (user_path, "evolution-uci.xml", NULL); + e_xml_parse_shortcuts_file (parse_filename, &name, &verb, &accel); + + ptr = g_list_find_custom (verb, "NewAppointment", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_app = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewMeeting", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_meet = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewAllDayAppointment", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_allday = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewCalendar", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_cal = g_list_nth_data (accel, index); + list->_length = 4; list->_maximum = list->_length; list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length); @@ -1544,7 +1572,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[0].description = _("New appointment"); list->_buffer[0].menuDescription = _("_Appointment"); list->_buffer[0].tooltip = _("Create a new appointment"); - list->_buffer[0].menuShortcut = 'a'; + list->_buffer[0].menuShortcut = accel_app; list->_buffer[0].iconName = "stock_new-appointment"; list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -1552,7 +1580,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[1].description = _("New meeting"); list->_buffer[1].menuDescription = _("M_eeting"); list->_buffer[1].tooltip = _("Create a new meeting request"); - list->_buffer[1].menuShortcut = 'e'; + list->_buffer[1].menuShortcut = accel_meet; list->_buffer[1].iconName = "stock_new-meeting"; list->_buffer[1].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -1560,7 +1588,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[2].description = _("New all day appointment"); list->_buffer[2].menuDescription = _("All Day A_ppointment"); list->_buffer[2].tooltip = _("Create a new all-day appointment"); - list->_buffer[2].menuShortcut = '\0'; + list->_buffer[2].menuShortcut = accel_allday; list->_buffer[2].iconName = "stock_new-24h-appointment"; list->_buffer[2].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -1568,7 +1596,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[3].description = _("New calendar"); list->_buffer[3].menuDescription = _("Cale_ndar"); list->_buffer[3].tooltip = _("Create a new calendar"); - list->_buffer[3].menuShortcut = '\0'; + list->_buffer[3].menuShortcut = accel_cal; list->_buffer[3].iconName = "stock_calendar"; list->_buffer[3].type = GNOME_Evolution_CREATABLE_FOLDER; Index: calendar/gui/calendar-config-keys.h =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config-keys.h,v retrieving revision 1.16 diff -u -p -r1.16 calendar-config-keys.h --- calendar/gui/calendar-config-keys.h 17 Jul 2006 06:01:28 -0000 1.16 +++ calendar/gui/calendar-config-keys.h 12 Sep 2006 05:58:33 -0000 @@ -61,7 +61,7 @@ G_BEGIN_DECLS #define CALENDAR_CONFIG_COMPRESS_WEEKEND CALENDAR_CONFIG_PREFIX "/display/compress_weekend" #define CALENDAR_CONFIG_SHOW_EVENT_END CALENDAR_CONFIG_PREFIX "/display/show_event_end" #define CALENDAR_CONFIG_WORKING_DAYS CALENDAR_CONFIG_PREFIX "/display/working_days" - +#define CALENDAR_CONFIG_SIDE_BAR_SEARCH "/apps/evolution/shell/view_defaults/side_bar_search" /* Date navigator settings */ #define CALENDAR_CONFIG_DN_SHOW_WEEK_NUMBERS CALENDAR_CONFIG_PREFIX "/date_navigator/show_week_numbers" Index: calendar/gui/calendar-config.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config.c,v retrieving revision 1.89 diff -u -p -r1.89 calendar-config.c --- calendar/gui/calendar-config.c 17 Jul 2006 06:01:28 -0000 1.89 +++ calendar/gui/calendar-config.c 12 Sep 2006 05:58:33 -0000 @@ -1483,3 +1483,9 @@ calendar_config_get_dir_path (void) return path; } + +gboolean +calendar_config_get_side_bar_search () +{ + return gconf_client_get_bool (config, CALENDAR_CONFIG_SIDE_BAR_SEARCH, NULL); +} Index: calendar/gui/calendar-config.h =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config.h,v retrieving revision 1.48 diff -u -p -r1.48 calendar-config.h --- calendar/gui/calendar-config.h 17 Jul 2006 06:01:28 -0000 1.48 +++ calendar/gui/calendar-config.h 12 Sep 2006 05:58:33 -0000 @@ -257,6 +257,7 @@ gboolean calendar_config_locale_support void calendar_config_set_dir_path (const char *); char * calendar_config_get_dir_path (void); +gboolean calendar_config_get_side_bar_search (); gboolean calendar_config_get_daylight_saving (void); void calendar_config_set_daylight_saving (gboolean daylight_saving); Index: calendar/gui/memos-component.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/memos-component.c,v retrieving revision 1.10 diff -u -p -r1.10 memos-component.c --- calendar/gui/memos-component.c 22 Aug 2006 17:21:40 -0000 1.10 +++ calendar/gui/memos-component.c 12 Sep 2006 05:58:33 -0000 @@ -981,7 +981,9 @@ create_component_view (MemosComponent *m e_source_selector_set_select_new ((ESourceSelector *)component_view->source_selector, TRUE); a11y = gtk_widget_get_accessible (GTK_WIDGET (component_view->source_selector)); atk_object_set_name (a11y, _("Memo Source Selector")); - + gtk_tree_view_set_enable_search ((GtkTreeView *)component_view->source_selector, + calendar_config_get_side_bar_search()); + g_signal_connect (component_view->source_selector, "drag-motion", G_CALLBACK (selector_tree_drag_motion), memos_component); g_signal_connect (component_view->source_selector, "drag-leave", G_CALLBACK (selector_tree_drag_leave), @@ -1155,7 +1157,29 @@ impl__get_userCreatableItems (PortableSe CORBA_Environment *ev) { GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc (); - + GList *name=NULL, *verb=NULL, *accel=NULL, *ptr=NULL; + char *parse_filename=NULL; + char *accel_memo, *accel_smemo, *accel_list; + int index; + char *home = g_get_home_dir(); + char *user_path = g_build_filename (home, ".evolution", "ui", NULL); + + e_toolbar_copy_file ("evolution-uci.xml"); + parse_filename = g_build_filename (user_path, "evolution-uci.xml", NULL); + e_xml_parse_shortcuts_file (parse_filename, &name, &verb, &accel); + + ptr = g_list_find_custom (verb, "NewMemo", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_memo = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewSharedMemo", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_smemo = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewMemoList", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_list = g_list_nth_data (accel, index); + list->_length = 3; list->_maximum = list->_length; list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length); @@ -1166,7 +1190,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[0].description = _("New memo"); list->_buffer[0].menuDescription = _("Mem_o"); list->_buffer[0].tooltip = _("Create a new memo"); - list->_buffer[0].menuShortcut = 'o'; + list->_buffer[0].menuShortcut = accel_memo; list->_buffer[0].iconName = "stock_insert-note"; list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -1174,7 +1198,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[1].description = _("New shared memo"); list->_buffer[1].menuDescription = _("_Shared memo"); list->_buffer[1].tooltip = _("Create a shared new memo"); - list->_buffer[1].menuShortcut = 's'; + list->_buffer[1].menuShortcut = accel_smemo; list->_buffer[1].iconName = "stock_insert-note"; list->_buffer[1].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -1182,7 +1206,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[2].description = _("New memo list"); list->_buffer[2].menuDescription = _("Memo li_st"); list->_buffer[2].tooltip = _("Create a new memo list"); - list->_buffer[2].menuShortcut = '\0'; + list->_buffer[2].menuShortcut = accel_list; list->_buffer[2].iconName = "stock_notes"; list->_buffer[2].type = GNOME_Evolution_CREATABLE_FOLDER; Index: calendar/gui/memos-control.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/memos-control.c,v retrieving revision 1.2 diff -u -p -r1.2 memos-control.c --- calendar/gui/memos-control.c 26 Nov 2005 02:31:50 -0000 1.2 +++ calendar/gui/memos-control.c 12 Sep 2006 05:58:33 -0000 @@ -213,9 +213,8 @@ memos_control_activate (BonoboControl *c bonobo_ui_component_freeze (uic, NULL); - xmlfile = g_build_filename (EVOLUTION_UIDIR, - "evolution-memos.xml", - NULL); + xmlfile = e_toolbar_copy_file ("evolution-memos.xml"); + bonobo_ui_util_set_ui (uic, PREFIX, xmlfile, "evolution-memos", Index: calendar/gui/tasks-component.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/tasks-component.c,v retrieving revision 1.99 diff -u -p -r1.99 tasks-component.c --- calendar/gui/tasks-component.c 8 Jul 2006 13:29:35 -0000 1.99 +++ calendar/gui/tasks-component.c 12 Sep 2006 05:58:34 -0000 @@ -985,7 +985,8 @@ create_component_view (TasksComponent *t e_source_selector_set_select_new ((ESourceSelector *)component_view->source_selector, TRUE); a11y = gtk_widget_get_accessible (GTK_WIDGET (component_view->source_selector)); atk_object_set_name (a11y, _("Task Source Selector")); - + gtk_tree_view_set_enable_search ((GtkTreeView *)component_view->source_selector, + calendar_config_get_side_bar_search()); g_signal_connect (component_view->source_selector, "drag-motion", G_CALLBACK (selector_tree_drag_motion), tasks_component); g_signal_connect (component_view->source_selector, "drag-leave", G_CALLBACK (selector_tree_drag_leave), @@ -1159,6 +1160,28 @@ impl__get_userCreatableItems (PortableSe CORBA_Environment *ev) { GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc (); + GList *name=NULL, *verb=NULL, *accel=NULL, *ptr=NULL; + char *parse_filename=NULL; + char *accel_task, *accel_atask, *accel_list; + int index; + char *home = g_get_home_dir(); + char *user_path = g_build_filename (home, ".evolution", "ui", NULL); + + e_toolbar_copy_file ("evolution-uci.xml"); + parse_filename = g_build_filename (user_path, "evolution-uci.xml", NULL); + e_xml_parse_shortcuts_file (parse_filename, &name, &verb, &accel); + + ptr = g_list_find_custom (verb, "NewTask", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_task = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewAssignedTask", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_atask = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewTaskList", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_list = g_list_nth_data (accel, index); list->_length = 3; list->_maximum = list->_length; @@ -1170,7 +1193,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[0].description = _("New task"); list->_buffer[0].menuDescription = _("_Task"); list->_buffer[0].tooltip = _("Create a new task"); - list->_buffer[0].menuShortcut = 't'; + list->_buffer[0].menuShortcut = accel_task; list->_buffer[0].iconName = "stock_task"; list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -1178,7 +1201,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[1].description = _("New assigned task"); list->_buffer[1].menuDescription = _("Assigne_d Task"); list->_buffer[1].tooltip = _("Create a new assigned task"); - list->_buffer[1].menuShortcut = '\0'; + list->_buffer[1].menuShortcut = accel_atask; list->_buffer[1].iconName = "stock_task"; list->_buffer[1].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -1186,7 +1209,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[2].description = _("New task list"); list->_buffer[2].menuDescription = _("Tas_k list"); list->_buffer[2].tooltip = _("Create a new task list"); - list->_buffer[2].menuShortcut = '\0'; + list->_buffer[2].menuShortcut = accel_list; list->_buffer[2].iconName = "stock_todo"; list->_buffer[2].type = GNOME_Evolution_CREATABLE_FOLDER; Index: calendar/gui/tasks-control.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/tasks-control.c,v retrieving revision 1.88 diff -u -p -r1.88 tasks-control.c --- calendar/gui/tasks-control.c 10 Aug 2006 07:34:30 -0000 1.88 +++ calendar/gui/tasks-control.c 12 Sep 2006 05:58:34 -0000 @@ -59,6 +59,7 @@ #include "e-cal-menu.h" #include "e-util/e-menu.h" #include "itip-utils.h" +#include "e-util/e-util.h" #define FIXED_MARGIN .05 @@ -285,9 +286,8 @@ tasks_control_activate (BonoboControl *c bonobo_ui_component_freeze (uic, NULL); - xmlfile = g_build_filename (EVOLUTION_UIDIR, - "evolution-tasks.xml", - NULL); + xmlfile = e_toolbar_copy_file ("evolution-tasks.xml"); + bonobo_ui_util_set_ui (uic, PREFIX, xmlfile, "evolution-tasks", Index: e-util/e-util.c =================================================================== RCS file: /cvs/gnome/evolution/e-util/e-util.c,v retrieving revision 1.77 diff -u -p -r1.77 e-util.c --- e-util/e-util.c 27 Aug 2006 11:55:06 -0000 1.77 +++ e-util/e-util.c 12 Sep 2006 05:58:35 -0000 @@ -605,6 +605,118 @@ e_create_directory (gchar *directory) } +static time_t +get_tstamp (GSList *list, const char *file) +{ + time_t ftime=0; + int slen = strlen (file); + + while (list) { + char* tsfile= (char *)list->data; + + if (strncmp (file, tsfile, slen) == 0) { + char **substr = g_strsplit (tsfile, "=", 2); + + ftime = atoi (substr[1]); + printf("%s(%d):%s: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, substr[1]); + g_strfreev (substr); + break; + } + list = list->next; + } + + printf("%s(%d):%s: returning time for %s = %d\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, file, ftime); + + return ftime; + +} + +static void +set_tstamp (GSList **plist, const char *file, time_t stime) +{ + GSList *tmp; + char * tfile=g_strdup_printf ("%s=%d", file, stime); + int slen = strlen (file); + + tmp = *plist; + + while (tmp) { + char* tsfile= tmp->data; + + + if (strncmp (file, tsfile, slen) == 0) { + g_free (tsfile); + tmp->data=tfile; + + return; + } + tmp = tmp->next; + } + + printf("%s(%d):%s: setting %d\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, stime); + *plist = g_slist_prepend (*plist, tfile); + + return; +} + +const char * +e_toolbar_copy_file (const char * file) +{ + char *home = g_get_home_dir(); + char *path = g_build_filename (home, ".evolution", "ui", NULL); + char *xmlfile, *contents = NULL, *tmp = NULL; + gsize length; + GError *err=NULL; + struct stat file_stat; + int ret; + GConfClient *gconf = gconf_client_get_default (); + time_t store_time; + GSList *list=NULL; + GList *name=NULL, *verb=NULL, *accl=NULL; + gboolean exists; + xmlfile = g_build_filename (path, file, NULL); + + if (!g_file_test (path, G_FILE_TEST_IS_DIR)) { + if (g_mkdir (path, 0777)) + g_warning ("Directory UI Was not created"); + } + + exists = g_file_test (xmlfile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR); + tmp = g_build_filename (EVOLUTION_UIDIR, file, NULL); + ret = g_stat (tmp, &file_stat); + list = gconf_client_get_list (gconf, "/apps/evolution/shell/ui_timestamps", GCONF_VALUE_STRING, NULL); + store_time = get_tstamp (list, file); + printf("%s(%d):%s: %d %d %d\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, exists, store_time, file_stat.st_mtime); + if ( !exists|| store_time != file_stat.st_mtime) { + + if (!exists && g_file_get_contents (tmp, &contents, &length, &err)) { + printf("%s(%d):%s: file doesnt exist\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); + set_tstamp (&list, file, file_stat.st_mtime); + gconf_client_set_list (gconf, "/apps/evolution/shell/ui_timestamps", GCONF_VALUE_STRING, list, NULL); + if (!g_file_set_contents (xmlfile, contents, length, &err)) + g_warning ("Cannot set the contents of file %s", file); + } + else if (exists) { + /* We have to overwrite with new file preserving the old prefs *sigh */ + printf("%s(%d):%s: file exists\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); + e_xml_parse_shortcuts_file (xmlfile, &name, &verb, &accl); + printf("%s(%d):%s: 2\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); + e_xml_save_shortcuts_file (file, verb, accl, TRUE); + set_tstamp (&list, file, file_stat.st_mtime); + gconf_client_set_list (gconf, "/apps/evolution/shell/ui_timestamps", GCONF_VALUE_STRING, list, NULL); + } + + } + + g_slist_foreach (list, (GFunc)g_free, NULL); + g_free(path); + g_free(tmp); + g_object_unref (gconf); + return(xmlfile); +} + + + /* Perform a binary search for key in base which has nmemb elements of size bytes each. The comparisons are done by (*compare)(). */ void e_bsearch (const void *key, Index: e-util/e-util.h =================================================================== RCS file: /cvs/gnome/evolution/e-util/e-util.h,v retrieving revision 1.63 diff -u -p -r1.63 e-util.h --- e-util/e-util.h 24 Aug 2006 01:11:24 -0000 1.63 +++ e-util/e-util.h 12 Sep 2006 05:58:35 -0000 @@ -197,6 +197,7 @@ size_t e_utf8_strftime_fix_am_pm (cha const char *fmt, const struct tm *tm); +const char * e_toolbar_copy_file (const char *file); /* String to/from double conversion functions */ gdouble e_flexible_strtod (const gchar *nptr, Index: e-util/e-xml-utils.c =================================================================== RCS file: /cvs/gnome/evolution/e-util/e-xml-utils.c,v retrieving revision 1.40 diff -u -p -r1.40 e-xml-utils.c --- e-util/e-xml-utils.c 17 Dec 2005 16:50:36 -0000 1.40 +++ e-util/e-xml-utils.c 12 Sep 2006 05:58:35 -0000 @@ -39,6 +39,7 @@ #include #include #include +#include #include "e-i18n.h" #include "e-util.h" @@ -430,5 +431,468 @@ e_xml_get_translated_string_prop_by_name g_free(combined_name); return ret_val; +} + +void +toolbar_xml_parse_file ( const char *path, GList **name, GList **verb) +{ + xmlDocPtr doc = NULL; + xmlNodePtr root, scan, cur, iter; + char *tmp = NULL, *tmp1 = NULL, *status = NULL; + + doc = e_xml_parse_file (path); + if (doc == NULL) { + g_warning("Error: file '%s' not found", path); + return; + } + + root = xmlDocGetRootElement (doc); + if (root == NULL + || strcmp (root->name, "Root") != 0 ) { + g_warning ("Error: file '%s' Invalid format", path); + xmlFreeDoc (doc); + return; + } + + cur = root->children; + + for (scan = cur->next->children; scan; scan = scan->next) { + if (!strcmp (scan->name, "cmd")) { + status = xmlGetProp (scan, "ignore"); + if ((status != NULL) && (!strcmp (status, "yes"))) { + continue; + } + + tmp = xmlGetProp (scan, "_label"); + if (tmp == NULL) + continue; + else { + *name = g_list_append ( *name, tmp); + + tmp1 = xmlGetProp (scan, "name"); + *verb = g_list_append ( *verb, tmp1); + } + } + if (!strcmp (scan->name, "placeholder")) { + for (iter = scan->children; iter; iter = iter->next) { + if (!strcmp (iter->name, "cmd")) { + tmp = xmlGetProp (iter, "_label"); + if(tmp == NULL) + continue; + else { + *name = g_list_append ( *name, tmp); + + tmp1 = xmlGetProp (iter, "name"); + *verb = g_list_append ( *verb, tmp1); + } + } + } + } + } + + xmlFreeDoc (doc); +} + +void +e_xml_parse_shortcuts_file ( const char *path, GList **name, GList **verb, GList **accel) +{ + xmlDocPtr doc = NULL; + xmlNodePtr root, scan, cur, iter; + char *tmp = NULL, *tmp1 = NULL, *status = NULL; + + doc = e_xml_parse_file (path); + if (doc == NULL) { + g_warning("Error: file '%s' not found", path); + return; + } + + root = xmlDocGetRootElement (doc); + if (root == NULL + || strcmp (root->name, "Root") != 0 ) { + g_warning ("Error: file '%s' Invalid format", path); + xmlFreeDoc (doc); + return; + } + + cur = root->children; + + for (scan = cur->next->children; scan; scan = scan->next) { + if (!strcmp (scan->name, "cmd")) { + char *ename; + + ename = xmlGetProp (scan, "_editorlabel"); + if (ename) { + *name = g_list_prepend ( *name, ename); + *verb = g_list_prepend ( *verb, xmlGetProp (scan, "name")); + *accel = g_list_prepend ( *accel, xmlGetProp(scan, "accel")); + } + } + + } + + xmlFreeDoc (doc); +} + + +void +get_placeholders (const char *path, GList **verb, GList **place) +{ + xmlDocPtr doc = NULL; + xmlNodePtr root, scan, cur, iter; + char *tmp = NULL, *tmp1 = NULL, *status = NULL; + + doc = e_xml_parse_file (path); + if (doc == NULL) { + g_warning("Error: file '%s' not found", path); + return; + } + + root = xmlDocGetRootElement (doc); + if (root == NULL + || strcmp (root->name, "Root") != 0 ) { + g_warning ("Error: file '%s' Invalid format", path); + xmlFreeDoc (doc); + return; + } + + cur = root->children; + + for (scan = cur->next->children; scan; scan = scan->next) { + if (!strcmp (scan->name, "cmd")) { + status = xmlGetProp (scan, "ignore"); + if ((status != NULL) && (!strcmp (status, "yes"))) { + continue; + } + tmp = xmlGetProp (scan, "name"); + if (tmp == NULL) + continue; + else { + *verb = g_list_append ( *verb, tmp); + + tmp1 = xmlGetProp (scan, "placeholder"); + *place = g_list_append ( *place, tmp1); + } + } + } + + xmlFreeDoc (doc); +} + +void +toolbar_get_active_items ( const char *path, GList **active) +{ + xmlDocPtr doc = NULL; + xmlNodePtr root, scan, cur, iter; + char *tmp = NULL; + + doc = e_xml_parse_file (path); + if (doc == NULL) { + g_warning ("Error: file '%s' not found", path); + return; + } + + root = xmlDocGetRootElement (doc); + if (root == NULL + || strcmp (root->name, "Root") != 0 ) { + g_warning ("Error: file '%s' Invalid format", path); + xmlFreeDoc (doc); + return; + } + cur = root->children; + + for (; cur; cur=cur->next) { + if (!strcmp (cur->name, "dockitem")) + break; + } + if (cur!=NULL) { + for (scan = cur->children; scan; scan = scan->next) { + if (!strcmp (scan->name, "toolitem")) { + tmp = xmlGetProp (scan, "verb"); + if (tmp == NULL) + continue; + else { + *active = g_list_append ( *active, tmp); + } + } + if (!strcmp (scan->name, "placeholder")) { + for (iter = scan->children; iter; iter = iter->next) { + if (!strcmp (iter->name, "toolitem")) { + tmp = xmlGetProp(iter, "verb"); + if (tmp == NULL) + continue; + else { + *active = g_list_append ( *active, tmp); + } + + } + } + } + } + } + xmlFreeDoc (doc); +} + + +void +toolbar_xml_save_file (GList * modify, const char * file) +{ + xmlDoc *doc; + xmlNode *root, *child, *gchild, *ggchild; + xmlDocPtr source = NULL; + xmlNodePtr scan = NULL, cur = NULL, temp = NULL, trav = NULL; + + int i, len, j, index, next_index; + + char *filename = NULL, *str = NULL, *tmp = NULL, *next_place = NULL, *cur_place = NULL; + char *home = g_get_home_dir(); + char *user_path = g_build_filename (home, ".evolution", "ui", NULL); + + char **xml_files; + + xml_files = g_strsplit (file, ",", 0); for (i = 0; xml_files[i] != NULL; i++) { + GList *verb = NULL, *place = NULL, *ind = NULL, *next_ind = NULL; + char * source_filename = NULL; + + source_filename = g_build_filename (user_path, xml_files[i], NULL); + get_placeholders (source_filename, &verb, &place); + + source = e_xml_parse_file (source_filename); + if (source == NULL) { + g_warning ("Error: file '%s' not found",source_filename); + return; + } + + temp = xmlDocGetRootElement (source); + + doc = xmlNewDoc ("1.0"); + root = xmlNewNode (NULL, "Root"); + xmlDocSetRootElement (doc, root); + + for ( cur = temp->children; cur != NULL; cur = cur->next) + { + + if (!strcmp (cur->name, "text")) + continue; + else if (!strcmp (cur->name, "dockitem")) { + child = xmlNewChild (root, NULL, "dockitem", NULL); + e_xml_set_string_prop_by_name (child, "name", "Toolbar"); + + for (trav = cur->children; trav; trav = trav->next) { + if (g_str_equal (trav->name, "placeholder") && xmlGetLastChild (trav) == NULL) { + scan = xmlCopyNode (trav , 1); + if ( scan != NULL) + scan = xmlAddChild (child,scan); + } + } + + len = g_list_length (modify); + for (j=0 ; jchildren; cur != NULL; cur = cur->next) + { + + if (!strcmp (cur->name, "text")) + continue; + else if (!strcmp (cur->name, "commands")) { + child = xmlNewChild (root, NULL, "commands", NULL); + + for (trav = cur->children; trav; trav = trav->next) { + if (g_str_equal (trav->name, "cmd") && xmlGetLastChild (trav) == NULL) { + int pos; + GList *index=NULL; + char *str = xmlGetProp (trav, "name"); + + index = g_list_find_custom (modify, str, (GCompareFunc *)safe_strcmp); + if (index) { + char *cur_accel=NULL; + + pos = g_list_position ( modify, index); + cur_accel = g_list_nth_data (accel, pos); + scan = xmlCopyNode (trav , 1); + + if (cur_accel) + e_xml_set_string_prop_by_name (scan, "accel", cur_accel); + else { + xmlAttrPtr accel_prop; + accel_prop = xmlHasProp (scan, "accel"); + xmlRemoveProp (accel_prop); + } + + scan = xmlAddChild (child,scan); + } else { + /* Will be used on revert mode for new verbs*/ + scan = xmlCopyNode (trav , 1); + + scan = xmlAddChild (child,scan); + } + + } + } + } else { + scan = xmlCopyNode (cur , 1); + if ( scan != NULL) + scan = xmlAddChild (root,scan); + } + + } + + filename = g_concat_dir_and_file (rpath,"save.xml"); + if (e_xml_save_file (filename, doc) == -1) + g_warning ("Unable to save view to %s", filename); + + xmlFreeDoc(doc); + xmlFreeDoc(source); + + if (g_remove (revert ? rfile : source_filename)) + g_print ("\nError In Removing File"); + else if (g_rename (filename, rfile)) + g_print ("\nERROR In renaming The file"); + +/* g_free (source_filename); */ +/* g_free (filename); */ +/* if (verb != NULL) */ +/* g_list_foreach (verb, (GFunc *)g_free, NULL); */ +/* if (place != NULL) */ +/* g_list_foreach (place, (GFunc *)g_free, NULL); */ + } + + g_free (user_path); + } Index: mail/GNOME_Evolution_Mail.server.in.in =================================================================== RCS file: /cvs/gnome/evolution/mail/GNOME_Evolution_Mail.server.in.in,v retrieving revision 1.28 diff -u -p -r1.28 GNOME_Evolution_Mail.server.in.in --- mail/GNOME_Evolution_Mail.server.in.in 12 Jan 2006 15:03:03 -0000 1.28 +++ mail/GNOME_Evolution_Mail.server.in.in 12 Sep 2006 05:58:35 -0000 @@ -28,6 +28,8 @@ + + @@ -93,7 +95,9 @@ - + + + @@ -122,8 +126,10 @@ - - + + + - + + + Index: mail/em-folder-browser.c =================================================================== RCS file: /cvs/gnome/evolution/mail/em-folder-browser.c,v retrieving revision 1.89 diff -u -p -r1.89 em-folder-browser.c --- mail/em-folder-browser.c 28 Aug 2006 06:54:55 -0000 1.89 +++ mail/em-folder-browser.c 12 Sep 2006 05:58:35 -0000 @@ -81,6 +81,7 @@ #include "e-util/e-dialog-utils.h" #include "e-util/e-error.h" #include "e-util/e-util-private.h" +#include "e-util/e-util.h" #include "em-utils.h" #include "em-composer-utils.h" #include "em-format-html-display.h" @@ -293,7 +294,7 @@ generate_viewoption_menu (GtkWidget *emf GSList *l; menu = gtk_menu_new (); - + printf("%s(%d):%s: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__,_("Important Messages")); for (i = 0; emfb_view_items[i].search.id != -1; ++i) { if (emfb_view_items[i].search.text) { char *str; @@ -428,17 +429,11 @@ emfb_init(GObject *o) g_slist_free(emfb->view.ui_files); emfb->view.ui_files = g_slist_append(NULL, - g_build_filename (EVOLUTION_UIDIR, - "evolution-mail-global.xml", - NULL)); + e_toolbar_copy_file ("evolution-mail-global.xml")); emfb->view.ui_files = g_slist_append(emfb->view.ui_files, - g_build_filename (EVOLUTION_UIDIR, - "evolution-mail-list.xml", - NULL)); + e_toolbar_copy_file ("evolution-mail-list.xml")); emfb->view.ui_files = g_slist_append(emfb->view.ui_files, - g_build_filename (EVOLUTION_UIDIR, - "evolution-mail-message.xml", - NULL)); + e_toolbar_copy_file ("evolution-mail-message.xml")); emfb->view.enable_map = g_slist_prepend(emfb->view.enable_map, (void *)emfb_enable_map); @@ -610,6 +605,7 @@ void em_folder_browser_show_preview(EMFo } return; + } emfb->view.preview_active = state; @@ -1247,6 +1243,14 @@ emfb_edit_select_thread(BonoboUIComponen } static void +emfb_edit_select_entire_thread(BonoboUIComponent *uid, void *data, const char *path) +{ + EMFolderView *emfv = data; + + message_list_select_entire_thread(emfv->list); +} + +static void emfb_folder_properties(BonoboUIComponent *uid, void *data, const char *path) { EMFolderBrowser *emfb = data; @@ -1491,6 +1495,7 @@ static BonoboUIVerb emfb_verbs[] = { BONOBO_UI_UNSAFE_VERB ("EditInvertSelection", emfb_edit_invert_selection), BONOBO_UI_UNSAFE_VERB ("EditSelectAll", emfb_edit_select_all), BONOBO_UI_UNSAFE_VERB ("EditSelectThread", emfb_edit_select_thread), + BONOBO_UI_UNSAFE_VERB ("EditSelectEntireThread", emfb_edit_select_entire_thread), BONOBO_UI_UNSAFE_VERB ("ChangeFolderProperties", emfb_folder_properties), BONOBO_UI_UNSAFE_VERB ("FolderExpunge", emfb_folder_expunge), /* HideDeleted is a toggle */ Index: mail/em-folder-tree.c =================================================================== RCS file: /cvs/gnome/evolution/mail/em-folder-tree.c,v retrieving revision 1.162 diff -u -p -r1.162 em-folder-tree.c --- mail/em-folder-tree.c 7 Aug 2006 18:55:02 -0000 1.162 +++ mail/em-folder-tree.c 12 Sep 2006 05:58:35 -0000 @@ -495,7 +495,7 @@ folder_tree_new (EMFolderTree *emft, EMF GConfClient *gconf; gconf = mail_config_get_gconf_client (); - side_bar_search = gconf_client_get_bool (gconf, "/apps/evolution/mail/display/side_bar_search", NULL); + side_bar_search = gconf_client_get_bool (gconf, "/apps/evolution/shell/view_defaults/side_bar_search", NULL); tree = gtk_tree_view_new_with_model ((GtkTreeModel *) model); GTK_WIDGET_SET_FLAGS(tree, GTK_CAN_FOCUS); Index: mail/em-message-browser.c =================================================================== RCS file: /cvs/gnome/evolution/mail/em-message-browser.c,v retrieving revision 1.26 diff -u -p -r1.26 em-message-browser.c --- mail/em-message-browser.c 21 Aug 2006 05:59:48 -0000 1.26 +++ mail/em-message-browser.c 12 Sep 2006 05:58:36 -0000 @@ -51,6 +51,7 @@ #include #include "e-util/e-util-private.h" +#include "e-util/e-util.h" #include "em-format-html-display.h" #include "em-message-browser.h" @@ -92,13 +93,9 @@ emmb_init(GObject *o) g_slist_free(emmb->view.ui_files); emmb->view.ui_files = g_slist_append(NULL, - g_build_filename (EVOLUTION_UIDIR, - "evolution-mail-messagedisplay.xml", - NULL)); + e_toolbar_copy_file ("evolution-mail-messagedisplay.xml")); emmb->view.ui_files = g_slist_append(emmb->view.ui_files, - g_build_filename (EVOLUTION_UIDIR, - "evolution-mail-message.xml", - NULL)); + e_toolbar_copy_file ("evolution-mail-message.xml")); /* currently: just use a scrolledwindow for preview widget */ p->preview = gtk_scrolled_window_new(NULL, NULL); Index: mail/em-migrate.c =================================================================== RCS file: /cvs/gnome/evolution/mail/em-migrate.c,v retrieving revision 1.55 diff -u -p -r1.55 em-migrate.c --- mail/em-migrate.c 26 Apr 2006 08:15:39 -0000 1.55 +++ mail/em-migrate.c 12 Sep 2006 05:58:36 -0000 @@ -933,7 +933,6 @@ static e_gconf_map_t mail_accounts_map[] static e_gconf_map_t mail_display_map[] = { /* /Mail/Display */ - { "side_bar_search", "mail/display/side_bar_search", E_GCONF_MAP_BOOL }, { "thread_list", "mail/display/thread_list", E_GCONF_MAP_BOOL }, { "thread_subject", "mail/display/thread_subject", E_GCONF_MAP_BOOL }, { "hide_deleted", "mail/display/show_deleted", E_GCONF_MAP_BOOLNOT }, Index: mail/evolution-mail.schemas.in.in =================================================================== RCS file: /cvs/gnome/evolution/mail/evolution-mail.schemas.in.in,v retrieving revision 1.29 diff -u -p -r1.29 evolution-mail.schemas.in.in --- mail/evolution-mail.schemas.in.in 14 Jul 2006 05:42:26 -0000 1.29 +++ mail/evolution-mail.schemas.in.in 12 Sep 2006 05:58:36 -0000 @@ -170,20 +170,6 @@ - /schemas/apps/evolution/mail/display/side_bar_search - /apps/evolution/mail/display/side_bar_search - evolution-mail - bool - true - - Enable or disable type ahead search feature - - Enable side bar search feature so that you can start interactive searching by typing in the text. Use is that you can easily find a folder in that side bar by just typing the folder name and the selection jumps automatically to that folder. - - - - - /schemas/apps/evolution/mail/display/mark_citations /apps/evolution/mail/display/mark_citations evolution-mail Index: mail/mail-component.c =================================================================== RCS file: /cvs/gnome/evolution/mail/mail-component.c,v retrieving revision 1.136 diff -u -p -r1.136 mail-component.c --- mail/mail-component.c 2 Aug 2006 04:45:41 -0000 1.136 +++ mail/mail-component.c 12 Sep 2006 05:58:37 -0000 @@ -808,7 +808,25 @@ static GNOME_Evolution_CreatableItemType impl__get_userCreatableItems (PortableServer_Servant servant, CORBA_Environment *ev) { GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc (); + GList *name=NULL, *verb=NULL, *accel=NULL, *ptr=NULL; + char *parse_filename=NULL; + char *accel_message, *accel_folder; + int index; + char *home = g_get_home_dir(); + char *user_path = g_build_filename (home, ".evolution", "ui", NULL); + + e_toolbar_copy_file ("evolution-uci.xml"); + parse_filename = g_build_filename (user_path, "evolution-uci.xml", NULL); + e_xml_parse_shortcuts_file (parse_filename, &name, &verb, &accel); + ptr = g_list_find_custom (verb, "NewMailMessage", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_message = g_list_nth_data (accel, index); + + ptr = g_list_find_custom (verb, "NewMailFolder", (GCompareFunc *)strcmp); + index = g_list_position ( verb, ptr); + accel_folder = g_list_nth_data (accel, index); + list->_length = 2; list->_maximum = list->_length; list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length); @@ -819,7 +837,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[0].description = _("New Mail Message"); list->_buffer[0].menuDescription = _("_Mail Message"); list->_buffer[0].tooltip = _("Compose a new mail message"); - list->_buffer[0].menuShortcut = 'm'; + list->_buffer[0].menuShortcut = accel_message; list->_buffer[0].iconName = "stock_mail-compose"; list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT; @@ -827,7 +845,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[1].description = _("New Mail Folder"); list->_buffer[1].menuDescription = _("Mail _Folder"); list->_buffer[1].tooltip = _("Create a new mail folder"); - list->_buffer[1].menuShortcut = '\0'; + list->_buffer[1].menuShortcut = accel_folder; list->_buffer[1].iconName = "stock_new-dir"; list->_buffer[1].type = GNOME_Evolution_CREATABLE_FOLDER; Index: mail/message-list.c =================================================================== RCS file: /cvs/gnome/evolution/mail/message-list.c,v retrieving revision 1.437 diff -u -p -r1.437 message-list.c --- mail/message-list.c 25 Aug 2006 17:48:15 -0000 1.437 +++ mail/message-list.c 12 Sep 2006 05:58:37 -0000 @@ -757,6 +757,51 @@ message_list_select_thread (MessageList etsm = (ETreeSelectionModel *) e_tree_get_selection_model (message_list->tree); e_tree_selected_path_foreach (message_list->tree, thread_select_foreach, &tsi); + e_tree_selection_model_select_paths(etsm, tsi.paths); + g_ptr_array_free (tsi.paths, TRUE); +} + +static ETreePath +get_top_parent (ETreeModel *etm, ETreePath *child) +{ + if (e_tree_model_node_depth (etm, child) == 1) + return child; + else + return get_top_parent(etm, e_tree_model_node_get_parent (etm, child)); +} + +static void +thread_select_all_foreach (ETreePath path, gpointer user_data) +{ + thread_select_info_t *tsi = (thread_select_info_t *) user_data; + ETreeModel *model = tsi->ml->model; + ETreePath node; + + node = get_top_parent (model, path); + g_ptr_array_add (tsi->paths, node); + + e_tree_model_node_traverse (model, node, select_node, tsi); +} + +/** + * message_list_select_entire_thread: + * @message_list: Message List widget + * + * Selects all messages in the current thread (based on cursor). + **/ + +void +message_list_select_entire_thread (MessageList *message_list) +{ + ETreeSelectionModel *etsm; + thread_select_info_t tsi; + + tsi.ml = message_list; + tsi.paths = g_ptr_array_new (); + + etsm = (ETreeSelectionModel *) e_tree_get_selection_model (message_list->tree); + + e_tree_selected_path_foreach (message_list->tree, thread_select_all_foreach, &tsi); e_tree_selection_model_select_paths(etsm, tsi.paths); g_ptr_array_free (tsi.paths, TRUE); } Index: mail/message-list.h =================================================================== RCS file: /cvs/gnome/evolution/mail/message-list.h,v retrieving revision 1.92 diff -u -p -r1.92 message-list.h --- mail/message-list.h 2 Jun 2006 18:12:02 -0000 1.92 +++ mail/message-list.h 12 Sep 2006 05:58:37 -0000 @@ -202,6 +202,7 @@ void message_list_select_next_ /* selection manipulation */ void message_list_select_all (MessageList *ml); void message_list_select_thread (MessageList *ml); +void message_list_select_entire_thread (MessageList *ml); void message_list_invert_selection (MessageList *ml); /* clipboard stuff */ Index: shell/Evolution-Component.idl =================================================================== RCS file: /cvs/gnome/evolution/shell/Evolution-Component.idl,v retrieving revision 1.21 diff -u -p -r1.21 Evolution-Component.idl --- shell/Evolution-Component.idl 22 Dec 2005 11:11:15 -0000 1.21 +++ shell/Evolution-Component.idl 12 Sep 2006 05:58:38 -0000 @@ -41,7 +41,7 @@ module Evolution { string description; string menuDescription; string tooltip; - char menuShortcut; + string menuShortcut; string iconName; CreatableItem type; }; Index: shell/apps_evolution_shell.schemas.in.in =================================================================== RCS file: /cvs/gnome/evolution/shell/apps_evolution_shell.schemas.in.in,v retrieving revision 1.15 diff -u -p -r1.15 apps_evolution_shell.schemas.in.in --- shell/apps_evolution_shell.schemas.in.in 28 Apr 2006 11:19:51 -0000 1.15 +++ shell/apps_evolution_shell.schemas.in.in 12 Sep 2006 05:58:38 -0000 @@ -14,6 +14,18 @@ + + /schemas/apps/evolution/shell/ui_timestamps + /apps/evolution/shell/ui_timestamps + evolution + list + string + [] + + Time stamp of the XML UI files for migration purposes. + + + @@ -69,6 +81,20 @@ + + + /schemas/apps/evolution/shell/view_display/side_bar_search + /apps/evolution/shell/view_display/side_bar_search + evolution + bool + true + + Enable or disable type ahead search feature + + Enable side bar search feature so that you can start interactive searching by typing in the text. Use is that you can easily find a folder in that side bar by just typing the folder name and the selection jumps automatically to that folder. + + + /schemas/apps/evolution/shell/view_defaults/width Index: shell/e-component-registry.c =================================================================== RCS file: /cvs/gnome/evolution/shell/e-component-registry.c,v retrieving revision 1.58 diff -u -p -r1.58 e-component-registry.c --- shell/e-component-registry.c 2 Jun 2006 17:32:19 -0000 1.58 +++ shell/e-component-registry.c 12 Sep 2006 05:58:38 -0000 @@ -50,6 +50,7 @@ static EComponentInfo * component_info_new (const char *id, GNOME_Evolution_Component iface, const char *alias, + const char *file, const char *button_label, const char *button_tooltips, const char *menu_label, @@ -63,6 +64,7 @@ component_info_new (const char *id, info->id = g_strdup (id); info->iface = bonobo_object_dup_ref(iface, NULL); info->alias = g_strdup (alias); + info->file = g_strdup (file); info->button_label = g_strdup (button_label); info->button_tooltips = g_strdup (button_tooltips); info->menu_label = g_strdup (menu_label); @@ -180,6 +182,7 @@ query_components (EComponentRegistry *re const char *menu_label; const char *menu_accelerator; const char *alias; + const char *file; const char *icon_name; const char *sort_order_string; const char *tooltips; @@ -210,6 +213,8 @@ query_components (EComponentRegistry *re alias = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:component_alias", NULL); + file = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:component_file", NULL); + icon_name = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:button_icon", NULL); if (icon_name) { icon = e_icon_factory_get_icon (icon_name, E_ICON_SIZE_LARGE_TOOLBAR); @@ -223,7 +228,7 @@ query_components (EComponentRegistry *re else sort_order = atoi (sort_order_string); - info = component_info_new (id, iface, alias, label, tooltips, menu_label, + info = component_info_new (id, iface, alias, file, label, tooltips, menu_label, menu_accelerator, sort_order, icon, menuicon); set_schemas (info, & info_list->_buffer [i]); Index: shell/e-component-registry.h =================================================================== RCS file: /cvs/gnome/evolution/shell/e-component-registry.h,v retrieving revision 1.17 diff -u -p -r1.17 e-component-registry.h --- shell/e-component-registry.h 16 May 2005 04:46:40 -0000 1.17 +++ shell/e-component-registry.h 12 Sep 2006 05:58:38 -0000 @@ -67,6 +67,7 @@ struct _EComponentInfo { char *id; char *alias; + char *file; /* NULL if not activated. */ GNOME_Evolution_Component iface; @@ -77,7 +78,7 @@ struct _EComponentInfo { char *menu_label; char *menu_accelerator; GdkPixbuf *menu_icon; - + int sort_order; /* List of URI schemas that this component supports. */ Index: shell/e-shell-window-commands.c =================================================================== RCS file: /cvs/gnome/evolution/shell/e-shell-window-commands.c,v retrieving revision 1.52 diff -u -p -r1.52 e-shell-window-commands.c --- shell/e-shell-window-commands.c 22 Aug 2006 17:39:27 -0000 1.52 +++ shell/e-shell-window-commands.c 12 Sep 2006 05:58:38 -0000 @@ -30,11 +30,15 @@ #include #include +#include + #include #include #include #include +#include + #include @@ -42,6 +46,9 @@ #include +#include +#include + #include "e-util/e-icon-factory.h" #include "e-util/e-dialog-utils.h" #include "e-util/e-error.h" @@ -53,6 +60,25 @@ #include "e-shell-importer.h" + +enum { + +TB_NAME = 0, +TB_VERB, +TB_ENABLED_COLUMN, +TB_N_COLUMN + +}; + + +enum { +CS_TREE = 0, +CS_NAME, +CS_VERB, +CS_ACCEL, +CS_N_COLUMN +}; + /* Utility functions. */ static void @@ -604,6 +630,695 @@ command_about_box (BonoboUIComponent *ui gtk_widget_show (about_box_window); } + +static void +list_enable_toggled (GtkCellRendererToggle *renderer, + const char *path_string, + GtkWidget *view) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + gboolean bool; + + path = gtk_tree_path_new_from_string (path_string); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (view)); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + + if (gtk_tree_model_get_iter (model, &iter, path)) { + gtk_tree_model_get (model, &iter, TB_ENABLED_COLUMN, &bool , -1); + gtk_tree_store_set (GTK_TREE_STORE (model), &iter, TB_ENABLED_COLUMN,!bool , -1); + } + + gtk_tree_path_free (path); +} + +static int +custom_toolbar_dialog_key_pressed (GtkWidget *dialog, GdkEventKey *event, void *user_data) +{ + if (event->keyval == GDK_Escape) { + gtk_widget_destroy (dialog); + return TRUE; + } + return FALSE; +} + +static void +custom_toolbar (BonoboUIComponent *uih, + EShellWindow *window, + const char *path) +{ + GtkCellRenderer *renderer; + GtkTreeModel *model; + GtkWidget *view, *scrolled; + GtkTreeStore *store; + GtkTreeIter iter; + GtkDialog *dialog; + GtkTreeSelection *selection; + GList *cols, *l, *name = NULL, *active = NULL, *selected = NULL, *verb = NULL; + char *str = NULL, *str1 = NULL, *component = NULL, *file = NULL; + int response, i, len; + char **xml_files; + + char *home = g_get_home_dir(); + char *user_path = g_build_filename (home, ".evolution", "ui", NULL); + + component = e_shell_window_peek_current_component_alias(window); + EComponentRegistry *registry = e_shell_peek_component_registry (e_shell_window_peek_shell (window)); + EComponentInfo *info = e_component_registry_peek_info (registry, + ECR_FIELD_ALIAS, + component); + + file = g_strdup (info->file); + xml_files = g_strsplit (file, ",", 0); + + dialog = (GtkDialog *)gtk_dialog_new(); + gtk_dialog_set_has_separator(dialog, TRUE); + g_signal_connect ((GtkWidget *)dialog, "key-press-event" , G_CALLBACK (custom_toolbar_dialog_key_pressed), NULL); + + gtk_widget_ensure_style ((GtkWidget *)dialog); + gtk_container_set_border_width ((GtkContainer *)(dialog->vbox), 0); + gtk_container_set_border_width ((GtkContainer *)(dialog->action_area), 12); + + gtk_dialog_add_button (dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + gtk_dialog_add_button (dialog, GTK_STOCK_OK, GTK_RESPONSE_OK); + gtk_window_set_title ((GtkWindow *)dialog, "Customize Toolbar..." ); + gtk_window_set_default_size ((GtkWindow *) dialog, 300, 500); + + scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN); + + view = gtk_tree_view_new (); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + _("Name"), + renderer, + "text", TB_NAME, + NULL); + g_object_set_data ((GObject *) scrolled, "renderer", renderer); + + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + "Verb", + renderer, + "text", TB_VERB, + NULL); + g_object_set_data ((GObject *) scrolled, "renderer", renderer); + + renderer = gtk_cell_renderer_toggle_new (); + g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + _("Enabled"), + renderer, + "active", TB_ENABLED_COLUMN , + NULL); + g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (list_enable_toggled), view); + + for (i = 0; xml_files[i] != NULL; i++) { + char *parse_filename = NULL; + + e_toolbar_copy_file (xml_files[i]); + parse_filename = g_build_filename (user_path, xml_files[i], NULL); + toolbar_xml_parse_file (parse_filename, &name, &verb); + toolbar_get_active_items (parse_filename, &active); + + g_free(parse_filename); + } + + store = gtk_list_store_new (TB_N_COLUMN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN); + + len=g_list_length(name); + for (i=0 ; inext) { + GtkTreeViewColumn *col = (GtkTreeViewColumn *) l->data; + if(strcmp (gtk_tree_view_column_get_title (col), "Name") == 0) { + gtk_tree_view_column_set_fixed_width (col, 200); + } + if (strcmp (gtk_tree_view_column_get_title (col), "Verb") == 0) { + gtk_tree_view_column_set_visible (col, FALSE); + break; + } + } + + model= GTK_TREE_MODEL(store); + gtk_tree_view_set_model (GTK_TREE_VIEW (view),model); + g_object_unref (model); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); + gtk_container_add (GTK_CONTAINER (scrolled), view); + g_object_set_data ((GObject *) scrolled, "view", view); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), scrolled); + + gtk_widget_show_all ((GtkWidget *)dialog); + response = gtk_dialog_run(dialog); + + if (response == GTK_RESPONSE_OK) + { + int valid; + valid = gtk_tree_model_get_iter_first (store, &iter); + + while (valid) + { + gchar *str_data; + gboolean bool_data; + + gtk_tree_model_get (store, &iter, + TB_VERB, &str_data, + TB_ENABLED_COLUMN, &bool_data, + -1); + if (bool_data) + selected = g_list_append ( selected, str_data); + + valid = gtk_tree_model_iter_next (store, &iter); + } + + toolbar_xml_save_file (selected, file); + gtk_widget_destroy ((GtkWidget *)dialog); + } + else if (response == GTK_RESPONSE_CANCEL) { + gtk_widget_destroy ((GtkWidget *)dialog); + } + + + g_free(file); + g_strfreev(xml_files); + g_free(user_path); + g_list_foreach (name, (GFunc *)g_free, NULL); + g_list_foreach (active, (GFunc *)g_free, NULL); + g_list_foreach (selected, (GFunc *)g_free, NULL); + g_list_foreach (verb, (GFunc *)g_free, NULL); +} + +static char * +sanitize_accel (char *in) +{ + int len; + char *out; + int i=0,j=0; + gboolean quoted=FALSE; + + if (!in) + return NULL; + + len = strlen (in); + out = malloc ((len+2) * sizeof (char)); + for (;i') { + out[j] = '*'; + } else if (in[i] == ' ') + continue; + else + out[j] = in[i]; + + } + + out[j] = 0; + +// g_free (in); + return out; +} + + + +/* static gboolean */ +/* decide_key (GtkEntry *entry, GdkEventKey *event, gpointer dum) */ +/* { */ + +/* if (event->keyval > 65500) */ +/* return TRUE; */ + +/* gtk_entry_set_text (entry, gtk_accelerator_name (event->keyval, event->state)); */ +/* return TRUE; */ +/* } */ +/* static void */ +/* accel_editstart (GtkCellRenderer *renderer, */ +/* GtkCellEditable *editable, */ +/* gchar *path, */ +/* gpointer user_data) */ +/* { */ +/* printf("%s(%d):%s: started\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); */ +/* gtk_entry_set_text (editable, "Type a new accelerator or backspace to clear"); */ +/* gtk_entry_set_has_frame (editable, FALSE); */ +/* g_signal_connect (editable, "key_press_event", G_CALLBACK(decide_key), NULL); */ +/* } */ + +/* static void */ +/* accel_edited (GtkCellRendererText *renderer, */ +/* gchar *arg1, */ +/* gchar *arg2, */ +/* gpointer user_data) */ +/* { */ +/* printf("%s(%d):%s: finished \n", __FILE__, __LINE__, __PRETTY_FUNCTION__); */ +/* //g_object_set (G_OBJECT (renderer), "sensitive", TRUE, NULL); */ +/* } */ + +/* static void */ +/* col_clicked (GtkTreeViewColumn *col, gpointer dum) */ +/* { */ +/* printf("%s(%d):%s: clicked\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); */ +/* } */ + +/* static void */ +/* row_act (GtkTreeView *tree_view, */ +/* GtkTreePath *path, */ +/* GtkTreeViewColumn *column, */ +/* gpointer user_data) */ +/* { */ +/* printf("%s(%d):%s: ROW \n", __FILE__, __LINE__, __PRETTY_FUNCTION__); */ +/* } */ + + +static gboolean +check_for_dupe (GtkTreeModel *store, const char *key) +{ + GtkTreeIter iter, parent; + gboolean valid; + + + valid = gtk_tree_model_get_iter_first (store, &parent); + + if (valid) + valid = gtk_tree_model_iter_children (store, &iter, &parent); + else { + /* Crisis*/ + return FALSE; + } + + + while (valid) + { + char *verb, *name, *accel; + + gtk_tree_model_get (store, &iter, 1, &name, 2, &verb, 3, &accel, -1); + if (accel && g_ascii_strcasecmp (key, accel) == 0) { + e_error_run(NULL, "shell:shortcut-exist", key, name, NULL); + return TRUE; + } + + valid = gtk_tree_model_iter_next (store, &iter); + if (!valid) { + valid = gtk_tree_model_iter_next (store, &parent); + if (valid) + valid = gtk_tree_model_iter_children (store, &iter, &parent); + else + break; + } + + + + } + + return FALSE; + +} + +static void +accel_edited_callback (GtkCellRendererText *cell, + const char *path_string, + guint keyval, + GdkModifierType mask, + guint hardware_keycode, + GtkTreeView *view) +{ + GtkTreePath *path = gtk_tree_path_new_from_string (path_string); + GtkTreeIter iter; + GtkTreeModel *model; + gboolean ret; + char *acc = gtk_accelerator_name (keyval, mask); + + model = gtk_tree_view_get_model (view); + gtk_tree_model_get_iter (model, &iter, path); + ret = check_for_dupe (model, acc); + if (!ret) + gtk_tree_store_set (model, &iter, CS_ACCEL, acc, -1); + printf("%s(%d):%s: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, acc); + g_free (acc); + +} + +static void +accel_clear_callback (GtkCellRendererAccel *accel, + gchar *path_string, + GtkTreeView *view) +{ + GtkTreePath *path = gtk_tree_path_new_from_string (path_string); + GtkTreeIter iter; + GtkTreeModel *model; + + model = gtk_tree_view_get_model (view); + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_store_set (model, &iter, CS_ACCEL, NULL, -1); +} + +static void +check_toggled (GtkToggleButton * check, gpointer dummy) +{ + GConfClient *client = gconf_client_get_default (); + + gconf_client_set_bool (client, "/apps/evolution/shell/view_defaults/sidebar_visible", gtk_toggle_button_get_active (check), NULL); + g_object_unref (client); +} + +static void +custom_shortcuts (BonoboUIComponent *uih, EShellWindow *window, const char *path) +{ + GtkCellRenderer *renderer; + GtkTreeModel *model; + GtkWidget *view, *scrolled, *box, *check, *hbox, *image, *label, *def; + GtkWidget *bimage, *blabel, *bbox; + GtkListStore *store; + GtkTreeIter iter, parent; + GtkDialog *dialog; + GtkTreeSelection *selection; + GtkTreeViewColumn *col; + GList *cols, *l, *name = NULL, *active = NULL, *verb = NULL, *accel=NULL; + char *component = NULL, *file = NULL; + int response, i, len; + char **xml_files; + + char *home = g_get_home_dir(); + char *user_path = g_build_filename (home, ".evolution", "ui", NULL); + GConfClient *client = gconf_client_get_default (); + EComponentRegistry *registry; + EComponentInfo *info; + char *parse_filename = NULL; + + component = e_shell_window_peek_current_component_alias(window); + registry = e_shell_peek_component_registry (e_shell_window_peek_shell (window)); + info = e_component_registry_peek_info (registry, + ECR_FIELD_ALIAS, + component); + + file = g_strdup (info->file); + xml_files = g_strsplit (file, ",", 0); + + + dialog = (GtkDialog *)gtk_dialog_new(); + box =gtk_vbox_new (FALSE, 6); + check = gtk_check_button_new_with_mnemonic (_("_Enable interactive search in side bar")); + gtk_box_pack_start (box, check, FALSE, FALSE, 3); + gtk_toggle_button_set_active ((GtkToggleButton *) check, gconf_client_get_bool (client, "/apps/evolution/shell/view_defaults/side_bar_search", NULL)); + g_signal_connect (check, "toggled", check_toggled, NULL); + g_object_unref (client); + + gtk_dialog_set_has_separator(dialog, TRUE); + g_signal_connect ((GtkWidget *)dialog, "key-press-event" , G_CALLBACK (custom_toolbar_dialog_key_pressed), NULL); + + gtk_widget_ensure_style ((GtkWidget *)dialog); + gtk_container_set_border_width ((GtkContainer *)box, 9); + + def = gtk_button_new (); + blabel = gtk_label_new_with_mnemonic (_("_Revert to Defaults")); + bimage = e_icon_factory_get_image ("stock_undo", E_ICON_SIZE_BUTTON); + bbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (bbox, bimage, FALSE, FALSE, 0); + gtk_box_pack_start (bbox, blabel, FALSE, FALSE, 0); + gtk_container_add (def, bbox); + + gtk_dialog_add_action_widget (dialog, def, GTK_RESPONSE_ACCEPT); + gtk_dialog_add_button (dialog, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_CLOSE); + + gtk_dialog_set_has_separator (dialog, FALSE); + gtk_window_set_title ((GtkWindow *)dialog, _("Customize Keyboard Shortcuts") ); + gtk_window_set_default_size ((GtkWindow *) dialog, 400, 540); + + hbox = gtk_hbox_new (FALSE, 6); + label = gtk_label_new_with_mnemonic (_("_Shortcut Keys:")); + + gtk_box_pack_start (hbox, label, FALSE, FALSE, 0); + gtk_box_pack_start (box, hbox, FALSE, FALSE, 0); + + scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN); + gtk_box_pack_start (box, scrolled, TRUE, TRUE, 0); + + + view = gtk_tree_view_new (); + gtk_label_set_mnemonic_widget (label, view); + gtk_tree_view_set_enable_search (view, FALSE); + gtk_tree_view_set_rules_hint (view, TRUE); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + _("Name"), + renderer, + "text", CS_NAME, + NULL); + g_object_set_data ((GObject *) scrolled, "renderer", renderer); + + hbox = gtk_hbox_new (FALSE, 6); + label = gtk_label_new (_("Changes will not take effect immediately. Please restart your Evolution to use the new shortcuts.")); + gtk_widget_set_size_request (label, 350, -1); + gtk_label_set_line_wrap (label, TRUE); + + image = e_icon_factory_get_image ("stock_dialog-info", E_ICON_SIZE_DIALOG); + gtk_box_pack_start (hbox, image, FALSE, FALSE, 0); + gtk_box_pack_start (hbox, label, FALSE, FALSE, 0); + gtk_box_pack_start (box, hbox, FALSE, FALSE, 0); + + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + "Verb", + renderer, + "text", CS_VERB, + NULL); + g_object_set_data ((GObject *) scrolled, "renderer", renderer); + + renderer = gtk_cell_renderer_accel_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), + -1, + "Accelerator", + renderer, + "text", CS_ACCEL, + NULL); + col = gtk_tree_view_get_column (GTK_TREE_VIEW (view), 2); + + g_signal_connect (renderer, "accel-edited", accel_edited_callback, view); + g_signal_connect (renderer, "accel-cleared", accel_clear_callback, view); + g_object_set (G_OBJECT (renderer), "editable", TRUE, "accel-mode", GTK_CELL_RENDERER_ACCEL_MODE_GTK, NULL); + g_object_set_data ((GObject *) scrolled, "renderer", renderer); + + e_toolbar_copy_file ("evolution.xml"); + parse_filename = g_build_filename (user_path, "evolution.xml", NULL); + e_xml_parse_shortcuts_file (parse_filename, &name, &verb, &accel); + + e_toolbar_copy_file ("evolution-uci.xml"); + parse_filename = g_build_filename (user_path, "evolution-uci.xml", NULL); + e_xml_parse_shortcuts_file (parse_filename, &name, &verb, &accel); + for (i = 0; xml_files[i] != NULL; i++) { + + + e_toolbar_copy_file (xml_files[i]); + parse_filename = g_build_filename (user_path, xml_files[i], NULL); + e_xml_parse_shortcuts_file (parse_filename, &name, &verb, &accel); + } + + name = g_list_reverse (name); + accel = g_list_reverse (accel); + verb = g_list_reverse (verb); + + store = gtk_tree_store_new (CS_N_COLUMN, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + + len=g_list_length(name); + for (i=0 ; inext) { + GtkTreeViewColumn *col = (GtkTreeViewColumn *) l->data; + if(strcmp (gtk_tree_view_column_get_title (col), "Name") == 0) { + gtk_tree_view_column_set_fixed_width (col, 200); + } + if (strcmp (gtk_tree_view_column_get_title (col), "Verb") == 0) { + gtk_tree_view_column_set_visible (col, FALSE); + break; + } + } + + + + model= GTK_TREE_MODEL(store); + gtk_tree_view_set_model (GTK_TREE_VIEW (view),model); + gtk_tree_view_expand_all((GtkTreeView *)view); + gtk_tree_view_set_expander_column((GtkTreeView *)view, gtk_tree_view_get_column((GtkTreeView *)view, 0)); + + g_object_unref (model); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); + gtk_container_add (GTK_CONTAINER (scrolled), view); + g_object_set_data ((GObject *) scrolled, "view", view); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), box); + gtk_widget_show_all ((GtkWidget *)dialog); + response = gtk_dialog_run(dialog); + //printf("%s(%d):%s: %d\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, response); + if (response == GTK_RESPONSE_CLOSE || response == GTK_RESPONSE_NONE || response == GTK_RESPONSE_DELETE_EVENT) + { + int valid; + GList *verb=NULL, *set_accel=NULL; + + valid = gtk_tree_model_get_iter_first (store, &parent); + if (valid) + valid = gtk_tree_model_iter_children (store, &iter, &parent); + else { + gtk_widget_destroy ((GtkWidget *)dialog); + return; + } + + + while (valid) + { + gchar *str_data, *accel_data; + + gtk_tree_model_get (store, &iter, + CS_VERB, &str_data, + CS_ACCEL, &accel_data, + -1); + printf("%s(%d):%s: %s %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, str_data, accel_data); + if (str_data) { + verb = g_list_append ( verb, str_data); + set_accel = g_list_append ( set_accel, desanitize_accel(accel_data)); + } + valid = gtk_tree_model_iter_next (store, &iter); + + + if (!valid) { + valid = gtk_tree_model_iter_next (store, &parent); + if (valid) + valid = gtk_tree_model_iter_children (store, &iter, &parent); + else + break; + } + + + + } + + e_xml_save_shortcuts_file (file, verb, set_accel, FALSE); + e_xml_save_shortcuts_file ("evolution.xml", verb, set_accel, FALSE); + e_xml_save_shortcuts_file ("evolution-uci.xml", verb, set_accel, FALSE); + gtk_widget_destroy ((GtkWidget *)dialog); + } + else if (response == GTK_RESPONSE_ACCEPT) { + e_xml_revert_shortcuts_file (file); + gtk_widget_destroy ((GtkWidget *)dialog); + + } + + + g_free(file); + g_strfreev(xml_files); + g_free(user_path); + g_list_foreach (name, (GFunc *)g_free, NULL); + g_list_foreach (active, (GFunc *)g_free, NULL); + //g_list_foreach (selected, (GFunc *)g_free, NULL); + g_list_foreach (verb, (GFunc *)g_free, NULL); +} + + + + + + #if 0 /* Unused */ static void @@ -747,6 +1462,9 @@ static BonoboUIVerb new_verbs [] = { static BonoboUIVerb actions_verbs[] = { BONOBO_UI_VERB ("SendReceive", (BonoboUIVerbFn) command_send_receive), BONOBO_UI_VERB ("ForgetPasswords", command_forget_passwords), + BONOBO_UI_VERB ("CustomToolbar", custom_toolbar), + BONOBO_UI_VERB ("CustomShortcuts", custom_shortcuts), + BONOBO_UI_VERB_END }; @@ -944,12 +1662,14 @@ view_statusbar_item_toggled_handler (Bon { GtkWidget *status_bar = e_shell_window_peek_statusbar (shell_window); gboolean is_visible; + GConfClient *client = gconf_client_get_default (); is_visible = state[0] == '1'; if(is_visible) gtk_widget_show (status_bar); else gtk_widget_hide (status_bar); - gconf_client_set_bool (gconf_client_get_default (),"/apps/evolution/shell/view_defaults/statusbar_visible", is_visible, NULL); + gconf_client_set_bool (client, "/apps/evolution/shell/view_defaults/statusbar_visible", is_visible, NULL); + g_object_unref (client); } static void @@ -961,12 +1681,15 @@ view_sidebar_item_toggled_handler (Bonob { GtkWidget *side_bar = GTK_WIDGET(e_shell_window_peek_sidebar (shell_window)); gboolean is_visible; + GConfClient *client = gconf_client_get_default (); + is_visible = state[0] == '1'; if(is_visible) gtk_widget_show (side_bar); else gtk_widget_hide (side_bar); - gconf_client_set_bool (gconf_client_get_default (),"/apps/evolution/shell/view_defaults/sidebar_visible", is_visible, NULL); + gconf_client_set_bool (client, "/apps/evolution/shell/view_defaults/sidebar_visible", is_visible, NULL); + g_object_unref (client); } /* Public API. */ Index: shell/e-shell-window.c =================================================================== RCS file: /cvs/gnome/evolution/shell/e-shell-window.c,v retrieving revision 1.53 diff -u -p -r1.53 e-shell-window.c --- shell/e-shell-window.c 23 Aug 2006 09:02:48 -0000 1.53 +++ shell/e-shell-window.c 12 Sep 2006 05:58:38 -0000 @@ -54,6 +54,8 @@ #include #include +#include + #include #include @@ -139,6 +141,7 @@ static GdkBitmap *offline_mask = NULL; static GdkPixmap *online_pixmap = NULL; static GdkBitmap *online_mask = NULL; +static gboolean store_window_size (GtkWidget* widget); /* ComponentView handling. */ @@ -827,7 +830,8 @@ setup_widgets (EShellWindow *window) static void impl_dispose (GObject *object) { - EShellWindowPrivate *priv = E_SHELL_WINDOW (object)->priv; + EShellWindow *self = E_SHELL_WINDOW (object); + EShellWindowPrivate *priv = self->priv; if (priv->shell != NULL) { g_object_remove_weak_pointer (G_OBJECT (priv->shell), (void **) &priv->shell); @@ -1016,7 +1028,7 @@ e_shell_window_new (EShell *shell, bonobo_object_corba_objref (BONOBO_OBJECT (ui_container)), NULL); - xmlfile = g_build_filename (EVOLUTION_UIDIR, "evolution.xml", NULL); + xmlfile = e_toolbar_copy_file ("evolution.xml"); bonobo_ui_util_set_ui (priv->ui_component, PREFIX, xmlfile, @@ -1106,6 +1118,16 @@ e_shell_window_peek_current_component_id return window->priv->current_view->component_id; } +const char * +e_shell_window_peek_current_component_alias (EShellWindow *window) +{ + g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL); + + if (window->priv->current_view == NULL) + return NULL; + + return window->priv->current_view->component_alias; +} EShell * e_shell_window_peek_shell (EShellWindow *window) Index: shell/e-shell-window.h =================================================================== RCS file: /cvs/gnome/evolution/shell/e-shell-window.h,v retrieving revision 1.11 diff -u -p -r1.11 e-shell-window.h --- shell/e-shell-window.h 21 Dec 2005 07:18:49 -0000 1.11 +++ shell/e-shell-window.h 12 Sep 2006 05:58:38 -0000 @@ -63,6 +63,9 @@ void e_shell_window_switch_to_com const char *component_id); const char *e_shell_window_peek_current_component_id (EShellWindow *shell); +const char *e_shell_window_peek_current_component_alias (EShellWindow *shell); + + EShell *e_shell_window_peek_shell (EShellWindow *window); BonoboUIComponent *e_shell_window_peek_bonobo_ui_component (EShellWindow *window); ESidebar *e_shell_window_peek_sidebar (EShellWindow *window); Index: shell/e-user-creatable-items-handler.c =================================================================== RCS file: /cvs/gnome/evolution/shell/e-user-creatable-items-handler.c,v retrieving revision 1.20 diff -u -p -r1.20 e-user-creatable-items-handler.c --- shell/e-user-creatable-items-handler.c 22 Aug 2006 05:03:42 -0000 1.20 +++ shell/e-user-creatable-items-handler.c 12 Sep 2006 05:58:38 -0000 @@ -63,7 +63,7 @@ typedef struct _Component Component; /* Representation of a single menu item. */ struct _MenuItem { const char *label; - char shortcut; + char *shortcut; char *verb; char *tooltip; char *component; @@ -568,8 +568,8 @@ xml_menu_item_func (EUserCreatableItemsH if (first) g_string_append_printf (xml, " accel=\"*Control*N\""); - else if (item->shortcut != '\0') - g_string_append_printf (xml, " accel=\"*Control**Shift*%c\"", item->shortcut); + else if (item->shortcut && *item->shortcut) + g_string_append_printf (xml, " accel=\"%s\"", item->shortcut); if (item->icon != NULL) { char *icon_xml; @@ -630,6 +630,40 @@ default_activate (EComboButton *combo_bu execute_verb (handler, handler->priv->default_menu_item->verb); } +static char * +sanitize_accel (char *in) +{ + int len; + char *out; + int i=0,j=0; + gboolean quoted=FALSE; + + if (!in) + return NULL; + + len = strlen (in); + out = malloc ((len+2) * sizeof (char)); + for (;ipriv->accel_group, 'n', GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - } else if (item->shortcut != '\0') { + } else if (item->shortcut && *item->shortcut) { + char *san_accel = sanitize_accel (item->shortcut); + guint mod, accel; + + gtk_accelerator_parse (san_accel, &accel, &mod); gtk_widget_add_accelerator (menuitem, "activate", handler->priv->accel_group, - item->shortcut, - GDK_CONTROL_MASK | GDK_SHIFT_MASK, + accel, + mod, GTK_ACCEL_VISIBLE); + g_free (san_accel); } g_object_set_data (G_OBJECT (menuitem), "EUserCreatableItemsHandler:verb", item->verb); Index: shell/evolution-test-component.c =================================================================== RCS file: /cvs/gnome/evolution/shell/evolution-test-component.c,v retrieving revision 1.42 diff -u -p -r1.42 evolution-test-component.c --- shell/evolution-test-component.c 12 Jan 2004 05:26:25 -0000 1.42 +++ shell/evolution-test-component.c 12 Sep 2006 05:58:38 -0000 @@ -140,7 +140,7 @@ impl__get_userCreatableItems (PortableSe list->_buffer[0].description = _("New Test"); list->_buffer[0].menuDescription = _("_Test"); list->_buffer[0].tooltip = _("Create a new test item"); - list->_buffer[0].menuShortcut = 'i'; + list->_buffer[0].menuShortcut = "*Shift**Control*i"; list->_buffer[0].iconName = ""; return list; Index: shell/shell.error.xml =================================================================== RCS file: /cvs/gnome/evolution/shell/shell.error.xml,v retrieving revision 1.10 diff -u -p -r1.10 shell.error.xml --- shell/shell.error.xml 5 Feb 2006 20:18:12 -0000 1.10 +++ shell/shell.error.xml 12 Sep 2006 05:58:38 -0000 @@ -79,5 +79,9 @@ Click help for details.