From cea054cd54d84479352a43bbabc19c9ce9af5efb Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Fri, 8 Aug 2008 04:26:12 +0000 Subject: Merge revisions 35747:35930 from trunk. svn path=/branches/kill-bonobo/; revision=35931 --- plugins/addressbook-file/ChangeLog | 8 + .../org-gnome-addressbook-file.eplug.xml | 3 +- plugins/backup-restore/ChangeLog | 7 + .../org-gnome-backup-restore.error.xml | 2 +- plugins/bbdb/ChangeLog | 15 + plugins/bbdb/bbdb.c | 8 +- plugins/caldav/ChangeLog | 17 + plugins/caldav/caldav-source.c | 4 +- .../caldav/org-gnome-evolution-caldav.eplug.xml | 3 +- plugins/calendar-file/ChangeLog | 8 + .../org-gnome-calendar-file.eplug.xml | 3 +- plugins/calendar-http/ChangeLog | 8 + .../org-gnome-calendar-http.eplug.xml | 3 +- plugins/calendar-weather/ChangeLog | 8 + .../org-gnome-calendar-weather.eplug.xml | 3 +- plugins/email-custom-header/ChangeLog | 28 + plugins/email-custom-header/Makefile.am | 3 +- .../apps_evolution_email_custom_header.schemas.in | 2 +- plugins/email-custom-header/email-custom-header.c | 416 ++++++++++- .../email-custom-header/email-custom-header.glade | 176 +++++ .../org-gnome-email-custom-header.eplug.xml | 7 + plugins/exchange-operations/ChangeLog | 31 + .../exchange-operations/exchange-account-setup.c | 14 + .../exchange-folder-subscription.c | 3 + .../org-gnome-exchange-operations.eplug.xml | 6 +- .../org-gnome-exchange-operations.error.xml | 4 + plugins/external-editor/ChangeLog | 7 + .../external-editor/org-gnome-external-editor.xml | 2 +- plugins/google-account-setup/ChangeLog | 38 + plugins/google-account-setup/Makefile.am | 5 +- .../google-account-setup/google-contacts-source.c | 269 ++++++++ .../google-account-setup/google-contacts-source.h | 30 + plugins/google-account-setup/google-source.c | 394 ++++++++++- .../org-gnome-evolution-google.eplug.xml | 14 +- plugins/groupwise-account-setup/ChangeLog | 8 + .../org-gnome-gw-account-setup.eplug.xml | 2 +- plugins/groupwise-features/ChangeLog | 15 + .../org-gnome-proxy-login-errors.xml | 2 +- .../org-gnome-shared-folder.errors.xml | 12 +- plugins/groupwise-features/process-meeting.c | 8 +- plugins/hula-account-setup/ChangeLog | 8 + ...rg-gnome-evolution-hula-account-setup.eplug.xml | 2 +- plugins/itip-formatter/ChangeLog | 19 + plugins/itip-formatter/itip-formatter.c | 2 + plugins/itip-formatter/itip-view.c | 16 +- plugins/mail-notification/ChangeLog | 31 + plugins/mail-notification/Makefile.am | 2 +- .../apps-evolution-mail-notification.schemas.in | 2 +- plugins/mail-notification/mail-notification.c | 168 ++++- plugins/mark-all-read/ChangeLog | 7 + plugins/mark-all-read/mark-all-read.c | 8 +- plugins/python/ChangeLog | 9 + plugins/python/Makefile.am | 9 +- plugins/startup-wizard/ChangeLog | 8 + .../org-gnome-evolution-startup-wizard.eplug.xml | 4 +- plugins/templates/ChangeLog | 19 + plugins/templates/Makefile.am | 41 ++ ...apps-evolution-template-placeholders.schemas.in | 26 + plugins/templates/org-gnome-templates.eplug.xml | 36 + plugins/templates/templates.c | 763 +++++++++++++++++++++ plugins/templates/templates.glade | 126 ++++ plugins/webdav-account-setup/Makefile.am | 22 + .../org-gnome-evolution-webdav.eplug.xml | 22 + .../webdav-account-setup/webdav-contacts-source.c | 370 ++++++++++ 64 files changed, 3223 insertions(+), 93 deletions(-) create mode 100644 plugins/email-custom-header/email-custom-header.glade create mode 100644 plugins/google-account-setup/google-contacts-source.c create mode 100644 plugins/google-account-setup/google-contacts-source.h create mode 100644 plugins/templates/ChangeLog create mode 100644 plugins/templates/Makefile.am create mode 100644 plugins/templates/apps-evolution-template-placeholders.schemas.in create mode 100644 plugins/templates/org-gnome-templates.eplug.xml create mode 100644 plugins/templates/templates.c create mode 100644 plugins/templates/templates.glade create mode 100644 plugins/webdav-account-setup/Makefile.am create mode 100644 plugins/webdav-account-setup/org-gnome-evolution-webdav.eplug.xml create mode 100644 plugins/webdav-account-setup/webdav-contacts-source.c (limited to 'plugins') diff --git a/plugins/addressbook-file/ChangeLog b/plugins/addressbook-file/ChangeLog index c44ddb846c..167e44dc61 100644 --- a/plugins/addressbook-file/ChangeLog +++ b/plugins/addressbook-file/ChangeLog @@ -1,3 +1,11 @@ +2008-07-31 Matthew Barnes + + ** Fixes part of bug #545568 + + * org-gnome-addressbook-file.eplug.xml: + Add "system_plugin=true" so it's not shown in the Plugin Manager. + This plugin is not designed to be disabled by the user. + 2006-02-28 Christian Kellner * addressbook-file.c: fixing a leak. diff --git a/plugins/addressbook-file/org-gnome-addressbook-file.eplug.xml b/plugins/addressbook-file/org-gnome-addressbook-file.eplug.xml index 4b041f8c45..b9fe52e341 100644 --- a/plugins/addressbook-file/org-gnome-addressbook-file.eplug.xml +++ b/plugins/addressbook-file/org-gnome-addressbook-file.eplug.xml @@ -4,7 +4,8 @@ type="shlib" location="@PLUGINDIR@/liborg-gnome-addressbook-file@SOEXT@" id="org.gnome.evolution.addressbook.file" - _name="Local Address Books"> + _name="Local Address Books" + system_plugin="true"> <_description>Provides core functionality for local address books. diff --git a/plugins/backup-restore/ChangeLog b/plugins/backup-restore/ChangeLog index 2abd006846..3dbab34a81 100644 --- a/plugins/backup-restore/ChangeLog +++ b/plugins/backup-restore/ChangeLog @@ -1,3 +1,10 @@ +2008-08-01 Matthew Barnes + + ** Fixes bug #543754 + + * org-gnome-backup-restore.error.xml: + Reword "insufficient-permissions" error message. + 2008-07-03 Roger Zauner ** Fix for bug #540400 diff --git a/plugins/backup-restore/org-gnome-backup-restore.error.xml b/plugins/backup-restore/org-gnome-backup-restore.error.xml index 6085a1196d..6b3bb8ad52 100644 --- a/plugins/backup-restore/org-gnome-backup-restore.error.xml +++ b/plugins/backup-restore/org-gnome-backup-restore.error.xml @@ -19,6 +19,6 @@ <_title>Insufficient Permissions - <_secondary>The selected folder does not have enough permissions to create the file + <_secondary>The selected folder is not writable. diff --git a/plugins/bbdb/ChangeLog b/plugins/bbdb/ChangeLog index 18b7b6afbc..53d5e13f7e 100644 --- a/plugins/bbdb/ChangeLog +++ b/plugins/bbdb/ChangeLog @@ -1,3 +1,18 @@ +2008-08-07 Paul Bolle + + ** Fixes bug #546785 + + * bbdb.c: (e_plugin_lib_enable): The bbdb plugin is noisy when + enabled: + "BBDB spinning up..." + Make this plugin just as polite as google-account-setup. + +2008-07-28 Lucian Langa + + ** See bug #504417 + + * bbdb.c: - Preferences window cut off + 2008-01-10 Milan Crha ** Fix for bug #496402 diff --git a/plugins/bbdb/bbdb.c b/plugins/bbdb/bbdb.c index feac342232..98db91fb99 100644 --- a/plugins/bbdb/bbdb.c +++ b/plugins/bbdb/bbdb.c @@ -49,6 +49,8 @@ #include "bbdb.h" +#define d(x) + /* Plugin hooks */ int e_plugin_lib_enable (EPluginLib *ep, int enable); void bbdb_handle_reply (EPlugin *ep, EMEventTargetMessage *target); @@ -119,7 +121,7 @@ e_plugin_lib_enable (EPluginLib *ep, int enable) { /* Start up the plugin. */ if (enable) { - fprintf (stderr, "BBDB spinning up...\n"); + d(fprintf (stderr, "BBDB spinning up...\n")); if (bbdb_check_gaim_enabled ()) bbdb_sync_buddy_list_check (); @@ -562,7 +564,7 @@ bbdb_page_factory (EPlugin *ep, EConfigHookItemFactoryData *hook_data) gtk_box_pack_start (GTK_BOX (hbox), inner_vbox, FALSE, FALSE, 0); /* Enable BBDB checkbox */ - check = gtk_check_button_new_with_mnemonic (_("_Automatically create entries in the addressbook when responding to messages")); + check = gtk_check_button_new_with_mnemonic (_("_Auto-create addressbook entries when replying to messages")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), gconf_client_get_bool (target->gconf, GCONF_KEY_ENABLE, NULL)); g_signal_connect (GTK_TOGGLE_BUTTON (check), "toggled", G_CALLBACK (enable_toggled_cb), stuff); gtk_box_pack_start (GTK_BOX (inner_vbox), check, FALSE, FALSE, 0); @@ -598,7 +600,7 @@ bbdb_page_factory (EPlugin *ep, EConfigHookItemFactoryData *hook_data) gtk_box_pack_start (GTK_BOX (hbox), inner_vbox, FALSE, FALSE, 0); /* Enable Gaim Checkbox */ - check_gaim = gtk_check_button_new_with_mnemonic (_("Periodically synchronize contact information and images from Pidgin buddy list")); + check_gaim = gtk_check_button_new_with_mnemonic (_("Synchronize contact info and images from Pidgin buddy list")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_gaim), gconf_client_get_bool (target->gconf, GCONF_KEY_ENABLE_GAIM, NULL)); g_signal_connect (GTK_TOGGLE_BUTTON (check_gaim), "toggled", G_CALLBACK (enable_gaim_toggled_cb), stuff); gtk_box_pack_start (GTK_BOX (inner_vbox), check_gaim, FALSE, FALSE, 0); diff --git a/plugins/caldav/ChangeLog b/plugins/caldav/ChangeLog index 0801aed8cd..43cc26248f 100644 --- a/plugins/caldav/ChangeLog +++ b/plugins/caldav/ChangeLog @@ -1,3 +1,20 @@ +2008-08-07 Paul Bolle + + ** Fixes bug #546785 + + * caldav-source.c: (e_plugin_lib_enable): The caldav plugin is noisy + when enabled: + "CalDAV Eplugin starting up ..." + Make this plugin just as polite as google-account-setup. + +2008-07-31 Matthew Barnes + + ** Fixes part of bug #545568 + + * org-gnome-caldav.eplug.xml: + Add "system_plugin=true" so it's not shown in the Plugin Manager. + This plugin is not designed to be disabled by the user. + 2007-10-26 Kjartan Maraas * caldav-source.c: (ensure_caldav_source_group): diff --git a/plugins/caldav/caldav-source.c b/plugins/caldav/caldav-source.c index 784e79bf8d..8b48bf6319 100644 --- a/plugins/caldav/caldav-source.c +++ b/plugins/caldav/caldav-source.c @@ -38,6 +38,8 @@ #include +#define d(x) + /*****************************************************************************/ /* prototypes */ int e_plugin_lib_enable (EPluginLib *ep, @@ -84,7 +86,7 @@ e_plugin_lib_enable (EPluginLib *ep, int enable) { if (enable) { - g_print ("CalDAV Eplugin starting up ...\n"); + d(g_print ("CalDAV Eplugin starting up ...\n")); ensure_caldav_source_group (); } diff --git a/plugins/caldav/org-gnome-evolution-caldav.eplug.xml b/plugins/caldav/org-gnome-evolution-caldav.eplug.xml index 40710b39f7..dc728f1e7f 100644 --- a/plugins/caldav/org-gnome-evolution-caldav.eplug.xml +++ b/plugins/caldav/org-gnome-evolution-caldav.eplug.xml @@ -7,7 +7,8 @@ load-on-startup="true" domain="@GETTEXT_PACKAGE@" localedir="@LOCALEDIR@" - _name="CalDAV sources"> + _name="CalDAV sources" + system_plugin="true"> <_description>CalDAV Calendar sources diff --git a/plugins/calendar-file/ChangeLog b/plugins/calendar-file/ChangeLog index a98c581934..351dc79c96 100644 --- a/plugins/calendar-file/ChangeLog +++ b/plugins/calendar-file/ChangeLog @@ -1,3 +1,11 @@ +2008-07-31 Matthew Barnes + + ** Fixes part of bug #545568 + + * org-gnome-calendar-file.eplug.xml: + Add "system_plugin=true" so it's not shown in the Plugin Manager. + This plugin is not designed to be disabled by the user. + 2007-03-20 Matthew Barnes ** Fixes part of bug #419524 diff --git a/plugins/calendar-file/org-gnome-calendar-file.eplug.xml b/plugins/calendar-file/org-gnome-calendar-file.eplug.xml index f2af9a0037..246b176059 100644 --- a/plugins/calendar-file/org-gnome-calendar-file.eplug.xml +++ b/plugins/calendar-file/org-gnome-calendar-file.eplug.xml @@ -4,7 +4,8 @@ type="shlib" location="@PLUGINDIR@/liborg-gnome-calendar-file@SOEXT@" id="org.gnome.evolution.calendar.file" - _name="Local Calendars"> + _name="Local Calendars" + system_plugin="true"> <_description>Provides core functionality for local calendars. diff --git a/plugins/calendar-http/ChangeLog b/plugins/calendar-http/ChangeLog index 76fb7d8cba..8cadbba783 100644 --- a/plugins/calendar-http/ChangeLog +++ b/plugins/calendar-http/ChangeLog @@ -1,3 +1,11 @@ +2008-07-31 Matthew Barnes + + ** Fixes part of bug #545568 + + * org-gnome-calendar-http.eplug.xml: + Add "system_plugin=true" so it's not shown in the Plugin Manager. + This plugin is not designed to be disabled by the user. + 2008-03-31 Suman Manjunath ** Fix for bug #346555 diff --git a/plugins/calendar-http/org-gnome-calendar-http.eplug.xml b/plugins/calendar-http/org-gnome-calendar-http.eplug.xml index 3d4f885aec..8b75a0f2c3 100644 --- a/plugins/calendar-http/org-gnome-calendar-http.eplug.xml +++ b/plugins/calendar-http/org-gnome-calendar-http.eplug.xml @@ -4,7 +4,8 @@ type="shlib" location="@PLUGINDIR@/liborg-gnome-calendar-http@SOEXT@" id="org.gnome.evolution.calendar.http" - _name="HTTP Calendars"> + _name="HTTP Calendars" + system_plugin="true"> <_description>Provides core functionality for webcal and http calendars. diff --git a/plugins/calendar-weather/ChangeLog b/plugins/calendar-weather/ChangeLog index 78f2dc28d7..13f1f22a89 100644 --- a/plugins/calendar-weather/ChangeLog +++ b/plugins/calendar-weather/ChangeLog @@ -1,3 +1,11 @@ +2008-07-31 Matthew Barnes + + ** Fixes part of bug #545568 + + * org-gnome-calendar-weather.eplug.xml: + Add "system_plugin=true" so it's not shown in the Plugin Manager. + This plugin is not designed to be disabled by the user. + 2008-03-31 Suman Manjunath ** Fix for bug #346555 diff --git a/plugins/calendar-weather/org-gnome-calendar-weather.eplug.xml b/plugins/calendar-weather/org-gnome-calendar-weather.eplug.xml index 442fd83074..e6767d128a 100644 --- a/plugins/calendar-weather/org-gnome-calendar-weather.eplug.xml +++ b/plugins/calendar-weather/org-gnome-calendar-weather.eplug.xml @@ -4,7 +4,8 @@ type="shlib" location="@PLUGINDIR@/liborg-gnome-calendar-weather@SOEXT@" id="org.gnome.evolution.calendar.weather" - _name="Weather Calendars"> + _name="Weather Calendars" + system_plugin="true"> <_description>Provides core functionality for weather calendars. diff --git a/plugins/email-custom-header/ChangeLog b/plugins/email-custom-header/ChangeLog index 0fbc6ac296..7f4dc1918a 100644 --- a/plugins/email-custom-header/ChangeLog +++ b/plugins/email-custom-header/ChangeLog @@ -1,3 +1,31 @@ +2008-08-01 Matthew Barnes + + ** Fixes bug #543755 + + * apps_evolution_email_custom_header.schemas.in: Fix typo. + +2008-07-22 Milan Crha + + ** Part of fix for bug #544022 + + * email-custom-header.c: Compiler warning cleanup. + +2008-06-25 Ashish Shrivastava + * email-custom-header.glade: Marked strings for + translation. + remove "window1" string from translation. + +2008-06-24 Ashish Shrivastava + + * email-custom-header.c: (e_plugin_lib_get_configure_widget), + (org_gnome_email_custom_header_config_option): + Added Support for configuring gconf values. + * email-custom-header.glade: + Configure email-custom-header plugin within the plugin-manager. + * org-gnome-email-custom-header.eplug.xml: Add hook class + for Configure tab. + * Makefile.am: Add new file.(email-custom-header.glade). + 2008-06-02 Matthew Barnes * Makefile.am: diff --git a/plugins/email-custom-header/Makefile.am b/plugins/email-custom-header/Makefile.am index f7a9c84e2f..91a3b52df4 100644 --- a/plugins/email-custom-header/Makefile.am +++ b/plugins/email-custom-header/Makefile.am @@ -42,7 +42,8 @@ install-data-local: fi glade_DATA = \ - org-gnome-email-custom-header.glade + org-gnome-email-custom-header.glade \ + email-custom-header.glade EXTRA_DIST = \ org-gnome-email-custom-header.eplug.xml \ diff --git a/plugins/email-custom-header/apps_evolution_email_custom_header.schemas.in b/plugins/email-custom-header/apps_evolution_email_custom_header.schemas.in index 79c8a9d8ec..cb3bd97ce8 100644 --- a/plugins/email-custom-header/apps_evolution_email_custom_header.schemas.in +++ b/plugins/email-custom-header/apps_evolution_email_custom_header.schemas.in @@ -8,7 +8,7 @@ string [Security=Personal;Unclassified;Protected;InConfidence;Secret;Topsecret] - List of Custom Header + List of Custom Headers The key specifies the list of custom headers that you can add to an outgoing message. The format for specifying a Header and Header value is: Name of the custom header followed by "=" and the values separated by ";" diff --git a/plugins/email-custom-header/email-custom-header.c b/plugins/email-custom-header/email-custom-header.c index ef2ac976a7..6918a9b43c 100644 --- a/plugins/email-custom-header/email-custom-header.c +++ b/plugins/email-custom-header/email-custom-header.c @@ -33,10 +33,28 @@ #include "mail/em-event.h" #include "composer/e-msg-composer.h" #include "libedataserver/e-account.h" +#include "e-util/e-config.h" #include "email-custom-header.h" #define d(x) x +#define GCONF_KEY_CUSTOM_HEADER "/apps/evolution/eplugin/email_custom_header/customHeader" + +typedef struct { + GladeXML *xml; + GConfClient *gconf; + GtkWidget *treeview; + GtkWidget *header_add; + GtkWidget *header_edit; + GtkWidget *header_remove; + GtkListStore *store; +} ConfigData; + +enum { + HEADER_KEY_COLUMN, + HEADER_VALUE_COLUMN, + HEADER_N_COLUMNS, +}; struct _EmailCustomHeaderOptionsDialogPrivate { /* Glade XML data */ @@ -60,8 +78,17 @@ static void epech_dialog_init (GObject *object); static void epech_dialog_dispose (GObject *object); static void epech_setup_widgets (CustomHeaderOptionsDialog *mch); static gint epech_check_existing_composer_window(gconstpointer a, gconstpointer b); - +static void commit_changes (ConfigData *cd); +int e_plugin_lib_enable (EPluginLib *ep, int enable); +GtkWidget *e_plugin_lib_get_configure_widget (EPlugin *epl); gboolean e_plugin_ui_init(GtkUIManager *manager, EMsgComposer *composer); +GtkWidget *org_gnome_email_custom_header_config_option (struct _EPlugin *epl, struct _EConfigHookItemFactoryData *data); + +int +e_plugin_lib_enable (EPluginLib *ep, int enable) +{ + return 0; +} static void epech_get_widgets_data (CustomHeaderOptionsDialog *mch) @@ -242,7 +269,7 @@ epech_get_header_list (CustomHeaderOptionsDialog *mch) client = gconf_client_get_default (); g_return_if_fail (GCONF_IS_CLIENT (client)); - gconf_client_add_dir (client, "/apps/evolution/eplugin/email_custom_header" , GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + gconf_client_add_dir (client, GCONF_KEY_CUSTOM_HEADER, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); epech_load_from_gconf (client, "/apps/evolution/eplugin/email_custom_header/customHeader", mch); return; @@ -554,3 +581,388 @@ e_plugin_ui_init (GtkUIManager *manager, return TRUE; } +static void +commit_changes (ConfigData *cd) +{ + GtkTreeModel *model = NULL; + GSList *header_config_list = NULL; + GtkTreeIter iter; + gboolean valid; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->treeview)); + valid = gtk_tree_model_get_iter_first (model, &iter); + + while (valid) { + gchar *keyword = NULL, *value = NULL; + gtk_tree_model_get (model, &iter, HEADER_KEY_COLUMN, &keyword, -1); + /* Check if the keyword is not empty */ + gtk_tree_model_get (model, &iter, HEADER_VALUE_COLUMN, &value, -1); + /* Check if the keyword is not empty */ + if ((keyword) && (g_utf8_strlen(g_strstrip(keyword), -1) > 0)){ + if ((value) && (g_utf8_strlen(g_strstrip(value), -1) > 0)){ + keyword = g_strconcat (keyword, "=", value, NULL); + } + header_config_list = g_slist_append (header_config_list, g_strdup(keyword)); + } + g_free (keyword); + valid = gtk_tree_model_iter_next (model, &iter); + } + + gconf_client_set_list (cd->gconf, GCONF_KEY_CUSTOM_HEADER, GCONF_VALUE_STRING, header_config_list, NULL); + + g_slist_foreach (header_config_list, (GFunc) g_free, NULL); + g_slist_free (header_config_list); +} + +static void +header_isempty (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, ConfigData *cd) +{ + GtkTreeSelection *selection; + char *keyword = NULL; + char *value = NULL; + gboolean valid; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (cd->treeview)); + /* move to the previous node */ + valid = gtk_tree_path_prev (path); + + gtk_tree_model_get (model, iter, HEADER_KEY_COLUMN, &keyword, -1); + + if ((keyword) && !(g_utf8_strlen (g_strstrip (keyword), -1) > 0)) + gtk_list_store_remove (cd->store, iter); + + /* Check if we have a valid row to select. If not, then select + * the previous row */ + if (gtk_list_store_iter_is_valid (GTK_LIST_STORE (model), iter)) { + gtk_tree_selection_select_iter (selection, iter); + } else { + if (path && valid) { + gtk_tree_model_get_iter (model, iter, path); + gtk_tree_selection_select_iter (selection, iter); + } + } + + gtk_widget_grab_focus (cd->treeview); + g_free (keyword); + g_free (value); +} + +static gboolean +header_foreach_check_isempty (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, ConfigData *cd) +{ + gboolean valid; + + valid = gtk_tree_model_get_iter_first (model, iter); + while (valid && gtk_list_store_iter_is_valid (cd->store, iter)) { + char *keyword = NULL; + gtk_tree_model_get (model, iter, HEADER_KEY_COLUMN, &keyword, -1); + /* Check if the keyword is not empty and then emit the row-changed + signal (if we delete the row, then the iter gets corrupted) */ + if ((keyword) && !(g_utf8_strlen (g_strstrip (keyword), -1) > 0)) + gtk_tree_model_row_changed (model, path, iter); + + char *value = NULL; + gtk_tree_model_get (model, iter, HEADER_VALUE_COLUMN, &value, -1); + /* Check if the keyword is not empty and then emit the row-changed + signal (if we delete the row, then the iter gets corrupted) */ + if ((value) && !(g_utf8_strlen (g_strstrip (value), -1) > 0)) + gtk_tree_model_row_changed (model, path, iter); + + g_free (keyword); + g_free (value); + + valid = gtk_tree_model_iter_next (model, iter); + } + + return FALSE; +} + +static void +cell_edited_callback (GtkCellRendererText *cell, + gchar *path_string, + gchar *new_text, + ConfigData *cd) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->treeview)); + + gtk_tree_model_get_iter_from_string (model, &iter, path_string); + + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + HEADER_KEY_COLUMN, new_text, -1); + + commit_changes (cd); +} + +static void +cell_value_edited_callback (GtkCellRendererText *cell, + gchar *path_string, + gchar *new_text, + ConfigData *cd) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->treeview)); + + gtk_tree_model_get_iter_from_string (model, &iter, path_string); + + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + HEADER_VALUE_COLUMN, new_text, -1); + + commit_changes (cd); +} + +static void +header_add_clicked (GtkButton *button, ConfigData *cd) +{ + GtkTreeModel *model; + GtkTreeIter iter; + gchar *new_header = NULL; + GtkTreeViewColumn *focus_col; + GtkTreePath *path; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->treeview)); + gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc) header_foreach_check_isempty, cd); + + /* Disconnect from signal so that we can create an empty row */ + g_signal_handlers_disconnect_matched(G_OBJECT(model), G_SIGNAL_MATCH_FUNC, 0, 0, NULL, header_isempty, cd); + + new_header = g_strdup (""); + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + HEADER_KEY_COLUMN, new_header, -1); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + HEADER_VALUE_COLUMN, new_header, -1); + + focus_col = gtk_tree_view_get_column (GTK_TREE_VIEW (cd->treeview), HEADER_KEY_COLUMN); + path = gtk_tree_model_get_path (model, &iter); + + if (path) { + gtk_tree_view_set_cursor (GTK_TREE_VIEW (cd->treeview), path, focus_col, TRUE); + gtk_tree_view_row_activated(GTK_TREE_VIEW(cd->treeview), path, focus_col); + gtk_tree_path_free (path); + } + + /* We have done our job, connect back to the signal */ + g_signal_connect(G_OBJECT(model), "row-changed", G_CALLBACK(header_isempty), cd); +} + +static void +header_remove_clicked (GtkButton *button, ConfigData *cd) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreePath *path; + gboolean valid; + gint len; + + valid = FALSE; + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (cd->treeview)); + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) + return; + + /* Get the path and move to the previous node :) */ + path = gtk_tree_model_get_path (model, &iter); + if (path) + valid = gtk_tree_path_prev(path); + + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + + len = gtk_tree_model_iter_n_children (model, NULL); + if (len > 0) { + if (gtk_list_store_iter_is_valid (GTK_LIST_STORE(model), &iter)) { + gtk_tree_selection_select_iter (selection, &iter); + } else { + if (path && valid) { + gtk_tree_model_get_iter(model, &iter, path); + gtk_tree_selection_select_iter (selection, &iter); + } + } + } else { + gtk_widget_set_sensitive (cd->header_edit, FALSE); + gtk_widget_set_sensitive (cd->header_remove, FALSE); + } + + gtk_widget_grab_focus(cd->treeview); + gtk_tree_path_free (path); + + commit_changes (cd); +} + +static void +header_edit_clicked (GtkButton *button, ConfigData *cd) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + GtkTreeViewColumn *focus_col; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (cd->treeview)); + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) + return; + + focus_col = gtk_tree_view_get_column (GTK_TREE_VIEW (cd->treeview), HEADER_KEY_COLUMN); + path = gtk_tree_model_get_path (model, &iter); + + if (path) { + gtk_tree_view_set_cursor (GTK_TREE_VIEW (cd->treeview), path, focus_col, TRUE); + gtk_tree_path_free (path); + } +} + +static void +selection_changed (GtkTreeSelection *selection, ConfigData *cd) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gtk_widget_set_sensitive (cd->header_edit, TRUE); + gtk_widget_set_sensitive (cd->header_remove, TRUE); + } else { + gtk_widget_set_sensitive (cd->header_edit, FALSE); + gtk_widget_set_sensitive (cd->header_remove, FALSE); + } +} + +static void +destroy_cd_data (gpointer data) +{ + ConfigData *cd = (ConfigData *) data; + + if (!cd) + return; + + g_object_unref (cd->xml); + g_object_unref (cd->gconf); + g_free (cd); +} + +GtkWidget * +e_plugin_lib_get_configure_widget (EPlugin *epl) +{ + GtkCellRenderer *renderer; + GtkTreeSelection *selection; + GtkTreeIter iter; + GtkWidget *hbox; + GSList *list; + GSList *header_list = NULL; + GtkTreeModel *model; + gint index; + gchar *buffer; + char *str_colon = NULL, *str1_colon = NULL; + GtkTreeViewColumn *col; + int col_pos; + + GConfClient *client = gconf_client_get_default(); + + ConfigData *cd = g_new0 (ConfigData, 1); + + char *gladefile; + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "email-custom-header.glade", + NULL); + cd->xml = glade_xml_new (gladefile, "ech_configuration_box", NULL); + g_free (gladefile); + + cd->gconf = gconf_client_get_default (); + + cd->treeview = glade_xml_get_widget (cd->xml, "header_treeview"); + + cd->store = gtk_list_store_new (HEADER_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); + + gtk_tree_view_set_model (GTK_TREE_VIEW (cd->treeview), GTK_TREE_MODEL (cd->store)); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (cd->treeview), -1, _("Key"), + renderer, "text", HEADER_KEY_COLUMN, NULL); + col = gtk_tree_view_get_column (GTK_TREE_VIEW (cd->treeview), col_pos -1); + gtk_tree_view_column_set_resizable (col, TRUE); + gtk_tree_view_column_set_reorderable(col, TRUE); + g_object_set (col, "min-width", 50, NULL); + + g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL); + g_signal_connect(renderer, "edited", (GCallback) cell_edited_callback, cd); + + renderer = gtk_cell_renderer_text_new (); + col_pos = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (cd->treeview), -1, _("Values"), + renderer, "text", HEADER_VALUE_COLUMN, NULL); + col = gtk_tree_view_get_column (GTK_TREE_VIEW (cd->treeview), col_pos -1); + gtk_tree_view_column_set_resizable (col, TRUE); + gtk_tree_view_column_set_reorderable(col, TRUE); + g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL); + + g_signal_connect(renderer, "edited", (GCallback) cell_value_edited_callback, cd); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (cd->treeview)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (selection_changed), cd); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (cd->treeview), TRUE); + + cd->header_add = glade_xml_get_widget (cd->xml, "header_add"); + g_signal_connect (G_OBJECT (cd->header_add), "clicked", G_CALLBACK (header_add_clicked), cd); + + cd->header_remove = glade_xml_get_widget (cd->xml, "header_remove"); + g_signal_connect (G_OBJECT (cd->header_remove), "clicked", G_CALLBACK (header_remove_clicked), cd); + gtk_widget_set_sensitive (cd->header_remove, FALSE); + + cd->header_edit = glade_xml_get_widget (cd->xml, "header_edit"); + g_signal_connect (G_OBJECT (cd->header_edit), "clicked", G_CALLBACK (header_edit_clicked), cd); + gtk_widget_set_sensitive (cd->header_edit, FALSE); + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (cd->treeview)); + g_signal_connect(G_OBJECT(model), "row-changed", G_CALLBACK(header_isempty), cd); + + /* Populate tree view with values from gconf */ + header_list = gconf_client_get_list (client,GCONF_KEY_CUSTOM_HEADER,GCONF_VALUE_STRING, NULL); + + for (list = header_list; list; list = g_slist_next (list)) { + gtk_list_store_append (cd->store, &iter); + gchar **parse_header_list; + buffer = list->data; + parse_header_list = g_strsplit_set (buffer, "=,", -1); + str_colon = g_strconcat (parse_header_list[0], "", NULL); + gtk_list_store_set (cd->store, &iter, HEADER_KEY_COLUMN, str_colon, -1); + + for (index = 0; parse_header_list[index+1] ; ++index) { + str1_colon = g_strconcat (parse_header_list[index+1], "", NULL); + gtk_list_store_set (cd->store, &iter, HEADER_VALUE_COLUMN, str1_colon, -1); + } + } + g_free (str_colon); + g_free (str1_colon); + + if (header_list) { + g_slist_foreach (header_list, (GFunc) g_free, NULL); + g_slist_free (header_list); + } + + /* Add the list here */ + + hbox = gtk_vbox_new (FALSE, 0); + + gtk_box_pack_start (GTK_BOX (hbox), glade_xml_get_widget (cd->xml, "ech_configuration_box"), TRUE, TRUE, 0); + + /* to let free data properly on destroy of configuration widget */ + g_object_set_data_full (G_OBJECT (hbox), "mycd-data", cd, destroy_cd_data); + + return hbox; +} + +/* Configuration in Mail Prefs Page goes here */ + +GtkWidget * +org_gnome_email_custom_header_config_option (struct _EPlugin *epl, struct _EConfigHookItemFactoryData *data) +{ + /* This function and the hook needs to be removed, + once the configure code is thoroughly tested */ + + return NULL; + +} diff --git a/plugins/email-custom-header/email-custom-header.glade b/plugins/email-custom-header/email-custom-header.glade new file mode 100644 index 0000000000..14a618f977 --- /dev/null +++ b/plugins/email-custom-header/email-custom-header.glade @@ -0,0 +1,176 @@ + + + + + + + True + window1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + True + False + 0 + + + + True + False + 0 + + + + True + The format for specifying a Custom Header key value is: +Name of the Custom Header key values separated by ";". + False + False + GTK_JUSTIFY_CENTER + True + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + True + + + + + 0 + False + False + + + + + + True + False + 5 + + + + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + 1 + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_START + 6 + + + + True + True + True + gtk-add + True + GTK_RELIEF_NORMAL + True + + + + + + True + True + True + gtk-edit + True + GTK_RELIEF_NORMAL + True + + + + + + True + True + True + gtk-remove + True + GTK_RELIEF_NORMAL + True + + + + + 0 + False + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + diff --git a/plugins/email-custom-header/org-gnome-email-custom-header.eplug.xml b/plugins/email-custom-header/org-gnome-email-custom-header.eplug.xml index 055acc1030..94102ba62a 100644 --- a/plugins/email-custom-header/org-gnome-email-custom-header.eplug.xml +++ b/plugins/email-custom-header/org-gnome-email-custom-header.eplug.xml @@ -18,5 +18,12 @@ + + + + + + + diff --git a/plugins/exchange-operations/ChangeLog b/plugins/exchange-operations/ChangeLog index 5386d2bbfd..f16f1301cf 100644 --- a/plugins/exchange-operations/ChangeLog +++ b/plugins/exchange-operations/ChangeLog @@ -1,3 +1,34 @@ +2008-08-06 Milan Crha + + ** Fix for bug #435969 + + * org-gnome-exchange-operations.eplug.xml: + Show authentication section in an account druid too. + +2008-07-31 Matthew Barnes + + ** Fixes part of bug #545568 + + * org-gnome-exchange-operations.eplug.xml: + Add "system_plugin=true" so it's not shown in the Plugin Manager. + This plugin is not designed to be disabled by the user. + +2008-07-30 Milan Crha + + ** Part of fix for bug #500389 + + * exchange-account-setup.c: (gal_auth_to_string), + (owa_authenticate_user): Use default authentication for GAL. + +2008-07-11 Bharath Acharya + + ** Fix for bug #542149 + + * exchange-folder-subscription.c: (subscribe_to_folder): Display an + error message to restart if user tries to subscribe to other's mailbox. + * org-gnome-exchange-operations.error.xml: Added the corresponding + error message. + 2008-06-16 Milan Crha ** Fix for bug #273627 diff --git a/plugins/exchange-operations/exchange-account-setup.c b/plugins/exchange-operations/exchange-account-setup.c index 55d3d7c8a1..3e9e64ea6a 100644 --- a/plugins/exchange-operations/exchange-account-setup.c +++ b/plugins/exchange-operations/exchange-account-setup.c @@ -413,6 +413,18 @@ print_error (const char *owa_url, E2kAutoconfigResult result) } } +static const char * +gal_auth_to_string (E2kAutoconfigGalAuthPref ad_auth) +{ + switch (ad_auth) { + case E2K_AUTOCONFIG_USE_GAL_DEFAULT: return "default"; + case E2K_AUTOCONFIG_USE_GAL_BASIC: return "basic"; + case E2K_AUTOCONFIG_USE_GAL_NTLM: return "ntlm"; + } + + return "default"; +} + static void owa_authenticate_user(GtkWidget *button, EConfig *config) { @@ -430,6 +442,7 @@ owa_authenticate_user(GtkWidget *button, EConfig *config) exchange_params = g_new0 (ExchangeParams, 1); exchange_params->host = NULL; exchange_params->ad_server = NULL; + exchange_params->ad_auth = E2K_AUTOCONFIG_USE_GAL_DEFAULT; exchange_params->mailbox = NULL; exchange_params->owa_path = NULL; exchange_params->is_ntlm = TRUE; @@ -487,6 +500,7 @@ owa_authenticate_user(GtkWidget *button, EConfig *config) camel_url_set_param (url, "ad_server", valid ? exchange_params->ad_server: NULL); camel_url_set_param (url, "mailbox", valid ? exchange_params->mailbox : NULL); camel_url_set_param (url, "owa_path", valid ? exchange_params->owa_path : NULL); + camel_url_set_param (url, "ad_auth", valid ? gal_auth_to_string (exchange_params->ad_auth) : NULL); if (mailbox_entry) { const char *par = camel_url_get_param (url, "mailbox"); diff --git a/plugins/exchange-operations/exchange-folder-subscription.c b/plugins/exchange-operations/exchange-folder-subscription.c index 021a06434b..9706dd29ab 100644 --- a/plugins/exchange-operations/exchange-folder-subscription.c +++ b/plugins/exchange-operations/exchange-folder-subscription.c @@ -237,9 +237,12 @@ subscribe_to_folder (GtkWidget *dialog, gint response, gpointer data) user_email_address, folder_name, &folder); g_free (folder_name); + gtk_widget_hide (dialog); switch (result) { case EXCHANGE_ACCOUNT_FOLDER_OK: exchange_account_rescan_tree (subscription_info->account); + if (!g_ascii_strcasecmp (e_folder_get_type_string (folder), "mail")) + e_error_run (NULL, ERROR_DOMAIN ":folder-restart-evo", NULL); break; case EXCHANGE_ACCOUNT_FOLDER_ALREADY_EXISTS: e_error_run (NULL, ERROR_DOMAIN ":folder-exists-error", NULL); diff --git a/plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml b/plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml index b551b8d746..16f4a7b311 100644 --- a/plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml +++ b/plugins/exchange-operations/org-gnome-exchange-operations.eplug.xml @@ -5,7 +5,8 @@ id="org.gnome.evolution.plugin.exchange-operations" location="@PLUGINDIR@/liborg-gnome-exchange-operations@SOEXT@" load-on-startup="true" - _name="Exchange Operations"> + _name="Exchange Operations" + system_plugin="true"> @@ -37,6 +38,9 @@ + <_primary>Folder already exists + + <_primary>Evolution requires a restart to load the subscribed user's mailbox + + <_primary>Folder does not exist diff --git a/plugins/external-editor/ChangeLog b/plugins/external-editor/ChangeLog index d49ecb97a4..1eb9b8fdef 100644 --- a/plugins/external-editor/ChangeLog +++ b/plugins/external-editor/ChangeLog @@ -1,3 +1,10 @@ +2008-08-01 Matthew Barnes + + ** Fixes bug #517151 + + * org-gnome-external-editor.xml: + Give a mnemonic to "Composer in External Editor". + 2008-04-17 Sankar P * Makefile.am: diff --git a/plugins/external-editor/org-gnome-external-editor.xml b/plugins/external-editor/org-gnome-external-editor.xml index 71be9e1266..e472f8bd1c 100644 --- a/plugins/external-editor/org-gnome-external-editor.xml +++ b/plugins/external-editor/org-gnome-external-editor.xml @@ -1,7 +1,7 @@ - diff --git a/plugins/google-account-setup/ChangeLog b/plugins/google-account-setup/ChangeLog index a1019c05e7..037aa01a3c 100644 --- a/plugins/google-account-setup/ChangeLog +++ b/plugins/google-account-setup/ChangeLog @@ -1,3 +1,41 @@ +2008-08-07 Milan Crha + + ** Fix for bug #535745 + + * google-source.c: (sanitize_user_mail), (construct_default_uri), + (is_default_uri), (init_combo_values), (user_changed), + (cal_combo_changed), (claim_error), (retrieve_list_clicked), + (plugin_google): New widgets and functionality to retrieve list + of subscribed calendars from the Google account and let user choose + which one would be shown. + +2008-08-01 Matthew Barnes + + ** Fixes bug #544860 + + * google-contacts-source.c (plugin_google_contacts): + Add translator comments for split "update every" sentence. + +2008-07-31 Matthew Barnes + + ** Fixes part of bug #545568 + + * org-gnome-evolution-google.eplug.xml: + Add "system_plugin=true" so it's not shown in the Plugin Manager. + This plugin is not designed to be disabled by the user. + +2008-05-24 Jörgen Scheibengruber + + * Makefile.am: + * google-contacts-source.c (ensure_google_contacts_source_group), + (remove_google_contacts_source_group), (on_username_entry_changed), + (on_update_cb_toggled), (on_interval_sb_value_changed), + (plugin_google_contacts): + * google-contacts-source.h: + * google-source.c (e_plugin_lib_enable): + * org-gnome-evolution-google.eplug.xml: + Added a UI for the addressbook part + 2008-03-31 Suman Manjunath ** Fix for bug #346555 diff --git a/plugins/google-account-setup/Makefile.am b/plugins/google-account-setup/Makefile.am index 898083c65a..d1c385b172 100644 --- a/plugins/google-account-setup/Makefile.am +++ b/plugins/google-account-setup/Makefile.am @@ -1,5 +1,6 @@ INCLUDES = \ $(EVOLUTION_CALENDAR_CFLAGS) \ + $(EVOLUTION_ADDRESSBOOK_CFLAGS) \ -I . \ -I$(top_srcdir) \ -DCALDAV_GLADEDIR=\""$(gladedir)"\" @@ -10,7 +11,9 @@ plugin_DATA = org-gnome-evolution-google.eplug plugin_LTLIBRARIES = liborg-gnome-evolution-google.la liborg_gnome_evolution_google_la_SOURCES = \ - google-source.c + google-source.c \ + google-contacts-source.h \ + google-contacts-source.c liborg_gnome_evolution_google_la_LIBADD = \ $(EVOLUTION_CALENDAR_LIBS) \ diff --git a/plugins/google-account-setup/google-contacts-source.c b/plugins/google-account-setup/google-contacts-source.c new file mode 100644 index 0000000000..d0c8e71e63 --- /dev/null +++ b/plugins/google-account-setup/google-contacts-source.c @@ -0,0 +1,269 @@ +/* + * Copyright 2008, Joergen Scheibengruber + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include +#include + +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include "google-contacts-source.h" + + +void +ensure_google_contacts_source_group (void) +{ + ESourceList *source_list; + ESourceGroup *group; + + source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); + + if (source_list == NULL) { + return; + } + + group = e_source_list_peek_group_by_name (source_list, _("Google")); + + if (group == NULL) { + gboolean res; + + group = e_source_group_new (_("Google"), "google://"); + res = e_source_list_add_group (source_list, group, -1); + + if (res == FALSE) { + g_warning ("Could not add Google source group!"); + } else { + e_source_list_sync (source_list, NULL); + } + + g_object_unref (group); + } + g_object_unref (source_list); +} + +void +remove_google_contacts_source_group (void) +{ + ESourceList *source_list; + ESourceGroup *group; + + source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); + + if (source_list == NULL) { + return; + } + + group = e_source_list_peek_group_by_name (source_list, _("Google")); + + if (group) { + GSList *sources; + + sources = e_source_group_peek_sources (group); + + if (NULL == sources) { + e_source_list_remove_group (source_list, group); + e_source_list_sync (source_list, NULL); + } + } + g_object_unref (source_list); +} + +static void +on_username_entry_changed (GtkEntry *entry, gpointer user_data) +{ + ESource *source = user_data; + const char *text; + char *username; + + text = gtk_entry_get_text (entry); + + if (strstr (text, "@")) { + username = g_strdup (text); + } else { + username = g_strdup_printf ("%s@gmail.com", text); + } + + e_source_set_relative_uri (source, username); + e_source_set_property (source, "username", username); + e_source_set_property (source, "auth", "plain/password"); + g_free (username); +} + +static void +on_update_cb_toggled (GtkToggleButton *tb, gpointer user_data) +{ + ESource *source = user_data; + GtkWidget *sb = g_object_get_data (G_OBJECT (tb), "sb"); + + gtk_widget_set_sensitive (sb, gtk_toggle_button_get_active (tb)); + if (gtk_toggle_button_get_active (tb)) { + gdouble value; + char *value_string; + + value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (sb)); + value_string = g_strdup_printf ("%d", (int)(value * 60.0)); + e_source_set_property (source, "refresh-interval", value_string); + g_free (value_string); + } else { + e_source_set_property (source, "refresh-interval", "-1"); + } +} + +static void +on_interval_sb_value_changed (GtkSpinButton *sb, gpointer user_data) +{ + ESource *source = user_data; + gdouble value; + char *value_string; + + value = gtk_spin_button_get_value (sb); + value_string = g_strdup_printf ("%d", (int)(value * 60.0)); + e_source_set_property (source, "refresh-interval", value_string); + g_free (value_string); +} + +GtkWidget * +plugin_google_contacts (EPlugin *epl, + EConfigHookItemFactoryData *data) +{ + EABConfigTargetSource *t = (EABConfigTargetSource *) data->target; + ESource *source; + ESourceGroup *group; + const char *base_uri; + const char *username; + const char *refresh_interval_str; + int refresh_interval; + GtkWidget *parent; + GtkWidget *vbox; + + GtkWidget *section; + GtkWidget *vbox2; + + GtkWidget *hbox; + GtkWidget *spacer; + GtkWidget *label; + GtkWidget *username_entry; + + GtkWidget *update_cb; + GtkWidget *interval_sb; + + + source = t->source; + group = e_source_peek_group (source); + + base_uri = e_source_group_peek_base_uri (group); + + g_object_set_data_full (G_OBJECT (epl), "widget", NULL, + (GDestroyNotify)gtk_widget_destroy); + + if (strcmp (base_uri, "google://")) { + return NULL; + } + + /* Build up the UI */ + parent = data->parent; + vbox = gtk_widget_get_ancestor (gtk_widget_get_parent (parent), GTK_TYPE_VBOX); + + vbox2 = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0); + + section = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (section), _("Server")); + gtk_misc_set_alignment (GTK_MISC (section), 0.0, 0.0); + gtk_box_pack_start (GTK_BOX (vbox2), section, FALSE, FALSE, 0); + + hbox = gtk_hbox_new (FALSE, 10); + gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0); + + spacer = gtk_label_new (" "); + gtk_box_pack_start (GTK_BOX (hbox), spacer, FALSE, FALSE, 0); + + label = gtk_label_new (_("Username:")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + + username_entry = gtk_entry_new (); + username = e_source_get_property (source, "username"); + if (username) { + gtk_entry_set_text (GTK_ENTRY (username_entry), username); + } + gtk_box_pack_start (GTK_BOX (hbox), username_entry, TRUE, TRUE, 0); + + hbox = gtk_hbox_new (FALSE, 10); + gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0); + + spacer = gtk_label_new (" "); + gtk_box_pack_start (GTK_BOX (hbox), spacer, FALSE, FALSE, 0); + + refresh_interval_str = e_source_get_property (source, "refresh-interval"); + if (refresh_interval_str && + (1 == sscanf (refresh_interval_str, "%d", &refresh_interval))) { + } else { + refresh_interval = -1; + } + + /* Translators: This is the first half of the sentence "Update + * every NNN minute(s)", where NNN is a spin button widget. */ + update_cb = gtk_check_button_new_with_label (_("Update every")); + gtk_box_pack_start (GTK_BOX (hbox), update_cb, FALSE, FALSE, 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (update_cb), + refresh_interval > 0); + + interval_sb = gtk_spin_button_new_with_range (1, 60, 1); + gtk_widget_set_sensitive (interval_sb, + refresh_interval > 0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (interval_sb), + refresh_interval > 0 ? refresh_interval / 60 : 30); + gtk_box_pack_start (GTK_BOX (hbox), interval_sb, FALSE, FALSE, 0); + + /* Translators: This is the second half of the sentence "Update + * every NNN minute(s)", where NNN is a spin button widget. */ + label = gtk_label_new (_("minute(s)")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + + gtk_widget_show_all (vbox2); + + g_object_set_data (G_OBJECT (update_cb), "sb", interval_sb); + g_object_set_data_full (G_OBJECT (epl), "widget", vbox2, + (GDestroyNotify)gtk_widget_destroy); + + g_signal_connect (G_OBJECT (username_entry), "changed", + G_CALLBACK (on_username_entry_changed), + source); + g_signal_connect (G_OBJECT (update_cb), "toggled", + G_CALLBACK (on_update_cb_toggled), + source); + g_signal_connect (G_OBJECT (interval_sb), "value-changed", + G_CALLBACK (on_interval_sb_value_changed), + source); + + return NULL; +} + + diff --git a/plugins/google-account-setup/google-contacts-source.h b/plugins/google-account-setup/google-contacts-source.h new file mode 100644 index 0000000000..17421fb232 --- /dev/null +++ b/plugins/google-account-setup/google-contacts-source.h @@ -0,0 +1,30 @@ +/* + * Copyright 2008, Joergen Scheibengruber + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef __GOOGLE_CONTACTS_SOURCE_H__ +#define __GOOGLE_CONTACTS_SOURCE_H__ + +GtkWidget *plugin_google_contacts (EPlugin *epl, + EConfigHookItemFactoryData *data); + +void ensure_google_contacts_source_group (void); + +void remove_google_contacts_source_group (void); + +#endif diff --git a/plugins/google-account-setup/google-source.c b/plugins/google-account-setup/google-source.c index d586b3027e..57727c6122 100644 --- a/plugins/google-account-setup/google-source.c +++ b/plugins/google-account-setup/google-source.c @@ -40,8 +40,18 @@ #include #include #include +#include +#include + +#include +#include +#include + +#include "google-contacts-source.h" #define CALENDAR_LOCATION "http://www.google.com/calendar/feeds/" +#define CALENDAR_DEFAULT_PATH "/private/full" +#define URL_GET_SUBSCRIBED_CALENDARS "http://www.google.com/calendar/feeds/default/allcalendars/full" #define d(x) @@ -56,6 +66,8 @@ GtkWidget * plugin_google (EPlugin *epl, /*****************************************************************************/ /* plugin intialization */ + + static void ensure_google_source_group () { @@ -96,6 +108,9 @@ e_plugin_lib_enable (EPluginLib *ep, int enable) if (enable) { d(printf ("\n Google Eplugin starting up ...\n")); ensure_google_source_group (); + ensure_google_contacts_source_group (); + } else { + remove_google_contacts_source_group (); } return 0; @@ -169,6 +184,83 @@ is_email (const char *address) return TRUE; } +static char * +sanitize_user_mail (const char *user) +{ + if (!user) + return NULL; + + if (!is_email (user)) { + return g_strconcat (user, "%40gmail.com", NULL); + } else { + char *tmp = g_malloc0 (sizeof (char) * (1 + strlen (user) + 2)); + char *at = strchr (user, '@'); + + strncpy (tmp, user, at - user); + strcat (tmp, "%40"); + strcat (tmp, at + 1); + + return tmp; + } +} + +static char * +construct_default_uri (const char *username) +{ + char *user, *uri; + + user = sanitize_user_mail (username); + uri = g_strconcat (CALENDAR_LOCATION, user, CALENDAR_DEFAULT_PATH, NULL); + g_free (user); + + return uri; +} + +/* checks whether the given_uri is pointing to the default user's calendar or not */ +static gboolean +is_default_uri (const char *given_uri, const char *username) +{ + char *uri, *at; + int ats; + gboolean res; + + if (!given_uri) + return TRUE; + + uri = construct_default_uri (username); + + /* count number of '@' in given_uri to know how much memory will be required */ + ats = 0; + for (at = strchr (given_uri, '@'); at; at = strchr (at + 1, '@')) { + ats++; + } + + if (!ats) + res = g_ascii_strcasecmp (given_uri, uri) == 0; + else { + const char *last; + char *tmp = g_malloc0 (sizeof (char) * (1 + strlen (given_uri) + (2 * ats))); + + last = given_uri; + for (at = strchr (last, '@'); at; at = strchr (at + 1, '@')) { + strncat (tmp, last, at - last); + strcat (tmp, "%40"); + last = at + 1; + } + strcat (tmp, last); + + res = g_ascii_strcasecmp (tmp, uri) == 0; + + g_free (tmp); + } + + g_free (uri); + + return res; +} + +static void init_combo_values (GtkComboBox *combo, const char *deftitle, const char *defuri); + static void user_changed (GtkEntry *editable, ESource *source) { @@ -176,10 +268,8 @@ user_changed (GtkEntry *editable, ESource *source) char *uri; char *ruri; const char *user; - char *projection; uri = e_source_get_uri (source); - user = gtk_entry_get_text (GTK_ENTRY (editable)); if (uri == NULL) { g_free (uri); @@ -188,24 +278,27 @@ user_changed (GtkEntry *editable, ESource *source) euri = e_uri_new (uri); g_free (euri->user); + euri->user = NULL; - if (user != NULL) { - euri->user = g_strdup (user); - e_source_set_property (source, "auth", "1"); - } else { - e_source_set_property (source, "auth", NULL); - } - - projection = g_strdup ("/private/full"); + /* two reasons why set readonly to FALSE: + a) the e_source_set_relative_uri does nothing for readonly sources + b) we are going to set default uri, which should be always writeable */ + e_source_set_readonly (source, FALSE); - if (!is_email (user)) { - user = g_strconcat (user, "@gmail.com", NULL); - } + user = gtk_entry_get_text (GTK_ENTRY (editable)); + uri = construct_default_uri (user); + e_source_set_relative_uri (source, uri); + g_free (uri); - e_source_set_relative_uri (source, g_strconcat (CALENDAR_LOCATION, g_strdup(user), g_strdup (projection), NULL)); - e_source_set_property (source, "username", euri->user); + e_source_set_property (source, "username", gtk_entry_get_text (GTK_ENTRY (editable))); e_source_set_property (source, "protocol", "google"); e_source_set_property (source, "auth-domain", "google"); + e_source_set_property (source, "auth", (user && *user) ? "1" : NULL); + e_source_set_property (source, "googlename", NULL); + + /* we changed user, thus reset the chosen calendar combo too, because + other user means other calendars subscribed */ + init_combo_values (GTK_COMBO_BOX (g_object_get_data (G_OBJECT (editable), "CalendarCombo")), _("Default"), NULL); ruri = print_uri_noproto (euri); g_free (ruri); @@ -291,6 +384,229 @@ set_refresh_time (ESource *source, GtkWidget *spin, GtkWidget *option) gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), time); } +enum { + COL_COLOR = 0, /* GDK_TYPE_COLOR */ + COL_TITLE, /* G_TYPE_STRING */ + COL_URL_PATH, /* G_TYPE_STRING */ + COL_READ_ONLY, /* G_TYPE_BOOLEAN */ + NUM_COLUMNS +}; + +static void +init_combo_values (GtkComboBox *combo, const char *deftitle, const char *defuri) +{ + GtkTreeIter iter; + GtkListStore *store; + + if (!combo) + return; + + store = GTK_LIST_STORE (gtk_combo_box_get_model (combo)); + + gtk_list_store_clear (store); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COL_COLOR, NULL, + COL_TITLE, deftitle, + COL_URL_PATH, defuri, + COL_READ_ONLY, FALSE, + -1); + + gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0); +} + +static void +cal_combo_changed (GtkComboBox *combo, ESource *source) +{ + GtkListStore *store; + GtkTreeIter iter; + + g_return_if_fail (combo != NULL); + g_return_if_fail (source != NULL); + + store = GTK_LIST_STORE (gtk_combo_box_get_model (combo)); + + if (gtk_combo_box_get_active_iter (combo, &iter)) { + char *uri = NULL, *title = NULL; + gboolean readonly = FALSE; + + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_TITLE, &title, COL_URL_PATH, &uri, COL_READ_ONLY, &readonly, -1); + + if (!uri) + uri = construct_default_uri (e_source_get_property (source, "username")); + + if (is_default_uri (uri, e_source_get_property (source, "username"))) { + /* do not store title when we use default uri */ + g_free (title); + title = NULL; + } + + /* first set readonly to FALSE, otherwise if TRUE, then e_source_set_readonly does nothing */ + e_source_set_readonly (source, FALSE); + e_source_set_relative_uri (source, uri); + e_source_set_readonly (source, readonly); + e_source_set_property (source, "googlename", title); + e_source_set_property (source, "protocol", "google"); + e_source_set_property (source, "auth-domain", "google"); + + g_free (title); + g_free (uri); + } +} + +static void +claim_error (GtkWindow *parent, const char *error) +{ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + error); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); +} + +static void +retrieve_list_clicked (GtkButton *button, GtkComboBox *combo) +{ + ESource *source; + GDataGoogleService *service; + GDataFeed *feed; + char *password, *tmp; + const char *username; + GError *error = NULL; + GtkWindow *parent; + + g_return_if_fail (button != NULL); + g_return_if_fail (combo != NULL); + + parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))); + + source = g_object_get_data (G_OBJECT (button), "ESource"); + g_return_if_fail (source != NULL); + + username = e_source_get_property (source, "username"); + if (!username || !*username) { + claim_error (parent, _("Please enter user name first.")); + return; + } + + tmp = g_strdup_printf (_("Enter password for user %s to access list of subscribed calendars."), username); + password = e_passwords_ask_password (_("Enter password"), "Calendar", "", tmp, + E_PASSWORDS_REMEMBER_NEVER | E_PASSWORDS_REPROMPT | E_PASSWORDS_SECRET | E_PASSWORDS_DISABLE_REMEMBER, + NULL, parent); + g_free (tmp); + + if (!password) + return; + + service = gdata_google_service_new ("cl", "evolution-client-0.0.1"); + gdata_service_set_credentials (GDATA_SERVICE (service), username, password); + /* privacy... maybe... */ + memset (password, 0, strlen (password)); + g_free (password); + + feed = gdata_service_get_feed (GDATA_SERVICE (service), URL_GET_SUBSCRIBED_CALENDARS, &error); + + if (feed) { + GSList *l; + char *old_selected = NULL; + int idx, active = -1, default_idx = -1; + GtkListStore *store = GTK_LIST_STORE (gtk_combo_box_get_model (combo)); + GtkTreeIter iter; + + if (gtk_combo_box_get_active_iter (combo, &iter)) + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_URL_PATH, &old_selected, -1); + + gtk_list_store_clear (store); + + for (l = gdata_feed_get_entries (feed), idx = 1; l != NULL; l = l->next) { + const char *uri, *title, *color, *access; + GSList *links; + GDataEntry *entry = (GDataEntry *) l->data; + + if (!entry || !GDATA_IS_ENTRY (entry)) + continue; + + /* skip hidden entries */ + if (gdata_entry_get_custom (entry, "hidden") && g_ascii_strcasecmp (gdata_entry_get_custom (entry, "hidden"), "true") == 0) + continue; + + uri = NULL; + for (links = gdata_entry_get_links (entry); links && !uri; links = links->next) { + GDataEntryLink *link = (GDataEntryLink *)links->data; + + if (!link || !link->href || !link->rel) + continue; + + if (g_ascii_strcasecmp (link->rel, "alternate") == 0) + uri = link->href; + } + + title = gdata_entry_get_title (entry); + color = gdata_entry_get_custom (entry, "color"); + access = gdata_entry_get_custom (entry, "accesslevel"); + + if (uri && title) { + GdkColor gdkcolor; + + if (old_selected && g_str_equal (old_selected, uri)) + active = idx; + + if (color) + gdk_color_parse (color, &gdkcolor); + + if (default_idx == -1 && is_default_uri (uri, username)) { + /* have the default uri always NULL and first in the combo */ + uri = NULL; + gtk_list_store_insert (store, &iter, 0); + default_idx = idx; + } else { + gtk_list_store_append (store, &iter); + } + + gtk_list_store_set (store, &iter, + COL_COLOR, color ? &gdkcolor : NULL, + COL_TITLE, title, + COL_URL_PATH, uri, + COL_READ_ONLY, access && !g_str_equal (access, "owner") && !g_str_equal (access, "contributor"), + -1); + idx++; + } + } + + if (default_idx == -1) { + /* Hey, why we didn't find the default uri? Did something go so wrong or what? */ + gtk_list_store_insert (store, &iter, 0); + gtk_list_store_set (store, &iter, + COL_COLOR, NULL, + COL_TITLE, _("Default"), + COL_URL_PATH, NULL, + COL_READ_ONLY, FALSE, + -1); + } + + gtk_combo_box_set_active (combo, active == -1 ? 0 : active); + + g_free (old_selected); + g_object_unref (feed); + } else { + tmp = g_strdup_printf (_("Cannot read data from Google server.\n%s"), (error && error->message) ? error->message : _("Unknown error.")); + claim_error (parent, tmp); + g_free (tmp); + + if (error) { + g_error_free (error); + error = NULL; + } + } + + g_object_unref (service); +} + GtkWidget * plugin_google (EPlugin *epl, EConfigHookItemFactoryData *data) @@ -305,11 +621,14 @@ plugin_google (EPlugin *epl, GtkWidget *luser; GtkWidget *user; GtkWidget *label; + GtkWidget *combo; char *uri; char *username; const char *ssl_prop; gboolean ssl_enabled; int row; + GtkCellRenderer *renderer; + GtkListStore *store; GtkWidget *option, *spin, *menu, *hbox; GtkWidget *times [4]; @@ -425,7 +744,48 @@ plugin_google (EPlugin *epl, g_free (uri); g_free (username); - return widget; -} + label = gtk_label_new_with_mnemonic (_("Cal_endar:")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_widget_show (label); + gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row + 4, row + 5, GTK_FILL | GTK_EXPAND, 0, 0, 0); + + store = gtk_list_store_new ( + NUM_COLUMNS, + GDK_TYPE_COLOR, /* COL_COLOR */ + G_TYPE_STRING, /* COL_TITLE */ + G_TYPE_STRING, /* COL_URL_PATH */ + G_TYPE_BOOLEAN); /* COL_READ_ONLY */ + + combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo); + + renderer = e_cell_renderer_color_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, "color", COL_COLOR, NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, "text", COL_TITLE, NULL); + + init_combo_values (GTK_COMBO_BOX (combo), + e_source_get_property (source, "googlename") ? e_source_get_property (source, "googlename") : _("Default"), + e_source_get_property (source, "googlename") ? e_source_peek_relative_uri (source) : NULL); + g_signal_connect (combo, "changed", G_CALLBACK (cal_combo_changed), source); + g_object_set_data (G_OBJECT (user), "CalendarCombo", combo); + + hbox = gtk_hbox_new (FALSE, 6); + + gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0); + label = gtk_button_new_with_mnemonic (_("Retrieve _list")); + g_signal_connect (label, "clicked", G_CALLBACK (retrieve_list_clicked), combo); + g_object_set_data (G_OBJECT (label), "ESource", source); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + + gtk_widget_show_all (hbox); + gtk_table_attach (GTK_TABLE (parent), hbox, 1, 2, row + 4, row + 5, GTK_FILL | GTK_EXPAND, 0, 0, 0); + + return widget; +} diff --git a/plugins/google-account-setup/org-gnome-evolution-google.eplug.xml b/plugins/google-account-setup/org-gnome-evolution-google.eplug.xml index d6087ad748..93a8aeee2d 100644 --- a/plugins/google-account-setup/org-gnome-evolution-google.eplug.xml +++ b/plugins/google-account-setup/org-gnome-evolution-google.eplug.xml @@ -1,13 +1,19 @@ + location="@PLUGINDIR@/liborg-gnome-evolution-google@SOEXT@" load-on-startup="false" localedir = "@LOCALEDIR@" system_plugin="true"> - <_description>A plugin to setup google calendar. - + + <_description>A plugin to setup google calendar and contacts. + - + + + + + + diff --git a/plugins/groupwise-account-setup/ChangeLog b/plugins/groupwise-account-setup/ChangeLog index 6e158a510c..6c0e4211e6 100644 --- a/plugins/groupwise-account-setup/ChangeLog +++ b/plugins/groupwise-account-setup/ChangeLog @@ -1,3 +1,11 @@ +2008-07-31 Matthew Barnes + + ** Fixes part of bug #545568 + + * org-gnome-gw-account-setup.eplug.xml: + Add "system_plugin=true" so it's not shown in the Plugin Manager. + This plugin is not designed to be disabled by the user. + 2008-04-30 Chenthill Palanisamy ** Fixes #358644 (bnc) diff --git a/plugins/groupwise-account-setup/org-gnome-gw-account-setup.eplug.xml b/plugins/groupwise-account-setup/org-gnome-gw-account-setup.eplug.xml index dd7886348c..3174226137 100644 --- a/plugins/groupwise-account-setup/org-gnome-gw-account-setup.eplug.xml +++ b/plugins/groupwise-account-setup/org-gnome-gw-account-setup.eplug.xml @@ -1,7 +1,7 @@ + location="@PLUGINDIR@/liborg-gnome-gw-account-setup@SOEXT@" load-on-startup="true" system_plugin="true"> <_description>A plugin to setup groupwise calendar and contacts sources. diff --git a/plugins/groupwise-features/ChangeLog b/plugins/groupwise-features/ChangeLog index f0587b07df..1b18e0c3f2 100644 --- a/plugins/groupwise-features/ChangeLog +++ b/plugins/groupwise-features/ChangeLog @@ -1,3 +1,18 @@ +2008-08-01 Matthew Barnes + + ** Fixes bug #544861 + + * org-gnome-proxy-login-errors.xml: + Reword "invalid-user" error message. + +2008-07-28 Milan Crha + + ** Fix for bug #543756 + + * org-gnome-shared-folder.errors.xml: + * process-meeting.c: (process_meeting): + Make question better translatable. + 2008-06-20 Sankar P * mail-retract.c (retract_mail_settings): diff --git a/plugins/groupwise-features/org-gnome-proxy-login-errors.xml b/plugins/groupwise-features/org-gnome-proxy-login-errors.xml index 2523f51056..36d8527e49 100644 --- a/plugins/groupwise-features/org-gnome-proxy-login-errors.xml +++ b/plugins/groupwise-features/org-gnome-proxy-login-errors.xml @@ -3,7 +3,7 @@ <_primary>Invalid user <_secondary> -Proxy login as "{0}" was unsuccessful. Please check Email Id and try again. +Proxy login as "{0}" was unsuccessful. Please check your email address and try again. diff --git a/plugins/groupwise-features/org-gnome-shared-folder.errors.xml b/plugins/groupwise-features/org-gnome-shared-folder.errors.xml index 85ce4ac156..5e7bfb28e5 100644 --- a/plugins/groupwise-features/org-gnome-shared-folder.errors.xml +++ b/plugins/groupwise-features/org-gnome-shared-folder.errors.xml @@ -15,9 +15,17 @@ You cannot share folder with specified user "{0}" - + <_primary>This is a recurring meeting -<_secondary>What would you like to {0}? +<_secondary>Would you like to accept it? +