evolution r36811 - in branches/kill-bonobo: . a11y a11y/calendar addressbook addressbook/gui/component addressbook/util calendar calendar/gui calendar/gui/alarm-notify calendar/gui/dialogs composer e-util help help/cs mail plugins/exchange-operations plugins/folder-unsubscribe plugins/google-account-setup plugins/groupwise-account-setup plugins/groupwise-features plugins/itip-formatter plugins/mail-notification po shell widgets/table



Author: mbarnes
Date: Mon Nov 24 05:14:44 2008
New Revision: 36811
URL: http://svn.gnome.org/viewvc/evolution?rev=36811&view=rev

Log:
Merge revisions 36737:36810 from trunk.


Modified:
   branches/kill-bonobo/   (props changed)
   branches/kill-bonobo/Makefile.am
   branches/kill-bonobo/a11y/ChangeLog
   branches/kill-bonobo/a11y/calendar/ea-cal-view.c
   branches/kill-bonobo/addressbook/ChangeLog
   branches/kill-bonobo/addressbook/gui/component/eab-composer-util.c   (props changed)
   branches/kill-bonobo/addressbook/gui/component/eab-composer-util.h   (props changed)
   branches/kill-bonobo/addressbook/util/addressbook.c   (props changed)
   branches/kill-bonobo/addressbook/util/addressbook.h   (props changed)
   branches/kill-bonobo/calendar/ChangeLog
   branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify-dialog.c
   branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify-dialog.h
   branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify.glade
   branches/kill-bonobo/calendar/gui/alarm-notify/alarm-queue.c
   branches/kill-bonobo/calendar/gui/calendar-component.h
   branches/kill-bonobo/calendar/gui/dialogs/comp-editor.c
   branches/kill-bonobo/calendar/gui/e-calendar-table.c
   branches/kill-bonobo/calendar/gui/e-calendar-view.c
   branches/kill-bonobo/calendar/gui/e-calendar-view.h
   branches/kill-bonobo/calendar/gui/e-day-view.c
   branches/kill-bonobo/calendar/gui/e-week-view.c
   branches/kill-bonobo/calendar/gui/gnome-cal.c
   branches/kill-bonobo/calendar/gui/memos-component.c
   branches/kill-bonobo/calendar/gui/print.c
   branches/kill-bonobo/calendar/gui/tasks-component.c
   branches/kill-bonobo/composer/ChangeLog
   branches/kill-bonobo/composer/e-msg-composer.c
   branches/kill-bonobo/composer/e-msg-composer.h
   branches/kill-bonobo/configure.in
   branches/kill-bonobo/e-util/ChangeLog
   branches/kill-bonobo/e-util/e-util-labels.c
   branches/kill-bonobo/help/ChangeLog
   branches/kill-bonobo/help/cs/cs.po
   branches/kill-bonobo/mail/ChangeLog
   branches/kill-bonobo/mail/em-composer-prefs.c
   branches/kill-bonobo/mail/em-folder-view.c
   branches/kill-bonobo/mail/em-format-html.c
   branches/kill-bonobo/mail/evolution-mail.schemas.in
   branches/kill-bonobo/mail/filtertypes.xml
   branches/kill-bonobo/mail/mail-config.c
   branches/kill-bonobo/mail/mail-config.glade
   branches/kill-bonobo/mail/mail-vfolder.c
   branches/kill-bonobo/mail/vfoldertypes.xml
   branches/kill-bonobo/plugins/exchange-operations/ChangeLog
   branches/kill-bonobo/plugins/exchange-operations/exchange-folder.c
   branches/kill-bonobo/plugins/folder-unsubscribe/ChangeLog
   branches/kill-bonobo/plugins/folder-unsubscribe/org-gnome-mail-folder-unsubscribe.eplug.xml
   branches/kill-bonobo/plugins/google-account-setup/ChangeLog
   branches/kill-bonobo/plugins/google-account-setup/google-contacts-source.c
   branches/kill-bonobo/plugins/google-account-setup/google-source.c
   branches/kill-bonobo/plugins/groupwise-account-setup/ChangeLog
   branches/kill-bonobo/plugins/groupwise-account-setup/camel-gw-listener.c
   branches/kill-bonobo/plugins/groupwise-features/ChangeLog
   branches/kill-bonobo/plugins/groupwise-features/status-track.c
   branches/kill-bonobo/plugins/itip-formatter/ChangeLog
   branches/kill-bonobo/plugins/itip-formatter/itip-formatter.c
   branches/kill-bonobo/plugins/mail-notification/ChangeLog
   branches/kill-bonobo/plugins/mail-notification/mail-notification.c
   branches/kill-bonobo/po/ChangeLog
   branches/kill-bonobo/po/cs.po
   branches/kill-bonobo/po/es.po
   branches/kill-bonobo/po/ru.po
   branches/kill-bonobo/shell/ChangeLog
   branches/kill-bonobo/shell/main.c
   branches/kill-bonobo/widgets/table/ChangeLog
   branches/kill-bonobo/widgets/table/e-table-defines.h
   branches/kill-bonobo/widgets/table/e-table-header-utils.c

Modified: branches/kill-bonobo/Makefile.am
==============================================================================
--- branches/kill-bonobo/Makefile.am	(original)
+++ branches/kill-bonobo/Makefile.am	Mon Nov 24 05:14:44 2008
@@ -13,6 +13,7 @@
 	COPYING-DOCS		\
 	COPYING.LGPL2		\
 	COPYING.LGPL3		\
+	COPYING.OPENLDAP	\
 	README			\
 	HACKING			\
 	MAINTAINERS		\

Modified: branches/kill-bonobo/a11y/calendar/ea-cal-view.c
==============================================================================
--- branches/kill-bonobo/a11y/calendar/ea-cal-view.c	(original)
+++ branches/kill-bonobo/a11y/calendar/ea-cal-view.c	Mon Nov 24 05:14:44 2008
@@ -277,7 +277,7 @@
 	}
 	g_object_notify (G_OBJECT (ea_cal_view), "accessible-name");
 	g_signal_emit_by_name (ea_cal_view, "visible_data_changed");
-	g_signal_emit_by_name (ea_cal_view, "children_changed", NULL);
+	g_signal_emit_by_name (ea_cal_view, "children_changed", NULL, NULL, NULL);
 #ifdef ACC_DEBUG
 	printf ("AccDebug: cal view date changed\n");
 #endif

Modified: branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify-dialog.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify-dialog.c	(original)
+++ branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify-dialog.c	Mon Nov 24 05:14:44 2008
@@ -67,6 +67,7 @@
 	GtkWidget *snooze_time_min;
 	GtkWidget *snooze_time_hrs;
 	GtkWidget *snooze_btn;
+	GtkWidget *dismiss_btn;
 	GtkWidget *minutes_label;
 	GtkWidget *hrs_label;
 	GtkWidget *description;
@@ -191,7 +192,30 @@
 	if (!snooze_timeout)
 		snooze_timeout = DEFAULT_SNOOZE_MINS;
 	(* funcinfo->func) (ALARM_NOTIFY_SNOOZE, snooze_timeout, funcinfo->func_data);
+}
+
+static void
+dismiss_pressed_cb (GtkButton *button, gpointer user_data)
+{
+	AlarmNotify *an = user_data;
+	GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (an->treeview));
+
+	g_return_if_fail (model != NULL);
 
+	if (gtk_tree_model_iter_n_children (model, NULL) <= 1) {
+		gtk_dialog_response (GTK_DIALOG (an->dialog), GTK_RESPONSE_CLOSE);
+	} else {
+		GtkTreeIter iter;
+		AlarmFuncInfo *funcinfo = NULL;
+		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (an->treeview));
+
+		if (gtk_tree_selection_get_selected (selection, &model, &iter))
+			gtk_tree_model_get (model, &iter, ALARM_FUNCINFO_COLUMN, &funcinfo, -1);
+
+		g_return_if_fail (funcinfo);
+
+		(* funcinfo->func) (ALARM_NOTIFY_DISMISS, -1, funcinfo->func_data);
+	}
 }
 
 static void
@@ -256,10 +280,11 @@
 	an->scrolledwindow = glade_xml_get_widget (an->xml, "treeview-scrolledwindow");
 	snooze_btn = glade_xml_get_widget (an->xml, "snooze-button");
 	an->snooze_btn = snooze_btn;
+	an->dismiss_btn = glade_xml_get_widget (an->xml, "dismiss-button");
 	edit_btn = glade_xml_get_widget (an->xml, "edit-button");
 
 	if (!(an->dialog && an->scrolledwindow && an->treeview && an->snooze_time_min && an->snooze_time_hrs
-	      && an->description && an->location && edit_btn && snooze_btn)) {
+	      && an->description && an->location && edit_btn && snooze_btn && an->dismiss_btn)) {
 		g_message ("alarm_notify_dialog(): Could not find all widgets in Glade file!");
 		g_object_unref (an->xml);
 		g_free (an);
@@ -292,6 +317,7 @@
 
 	g_signal_connect (edit_btn, "clicked", G_CALLBACK (edit_pressed_cb), an);
 	g_signal_connect (snooze_btn, "clicked", G_CALLBACK (snooze_pressed_cb), an);
+	g_signal_connect (an->dismiss_btn, "clicked", G_CALLBACK (dismiss_pressed_cb), an);
 	g_signal_connect (G_OBJECT (an->dialog), "response", G_CALLBACK (dialog_response_cb), an);
 	g_signal_connect (G_OBJECT (an->dialog), "destroy", G_CALLBACK (dialog_destroyed_cb), an);
 

Modified: branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify-dialog.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify-dialog.h	(original)
+++ branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify-dialog.h	Mon Nov 24 05:14:44 2008
@@ -32,7 +32,8 @@
 typedef enum {
 	ALARM_NOTIFY_CLOSE,
 	ALARM_NOTIFY_SNOOZE,
-	ALARM_NOTIFY_EDIT
+	ALARM_NOTIFY_EDIT,
+	ALARM_NOTIFY_DISMISS
 } AlarmNotifyResult;
 
 typedef struct _AlarmNotificationsDialog AlarmNotificationsDialog;

Modified: branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify.glade
==============================================================================
--- branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify.glade	(original)
+++ branches/kill-bonobo/calendar/gui/alarm-notify/alarm-notify.glade	Mon Nov 24 05:14:44 2008
@@ -37,11 +37,73 @@
 	      <property name="visible">True</property>
 	      <property name="can_default">True</property>
 	      <property name="can_focus">True</property>
-	      <property name="label">gtk-close</property>
-	      <property name="use_stock">True</property>
 	      <property name="relief">GTK_RELIEF_NORMAL</property>
 	      <property name="focus_on_click">True</property>
 	      <property name="response_id">-7</property>
+
+	      <child>
+		<widget class="GtkAlignment" id="alignment4">
+		  <property name="visible">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xscale">0</property>
+		  <property name="yscale">0</property>
+		  <property name="top_padding">0</property>
+		  <property name="bottom_padding">0</property>
+		  <property name="left_padding">0</property>
+		  <property name="right_padding">0</property>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox9">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">2</property>
+
+		      <child>
+			<widget class="GtkImage" id="image6">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-close</property>
+			  <property name="icon_size">4</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label19">
+			  <property name="visible">True</property>
+			  <property name="label">Dismiss _All</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
 	    </widget>
 	  </child>
 	</widget>
@@ -527,6 +589,84 @@
 			  <property name="fill">False</property>
 			</packing>
 		      </child>
+
+		      <child>
+			<widget class="GtkButton" id="dismiss-button">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+
+			  <child>
+			    <widget class="GtkAlignment" id="alignment5">
+			      <property name="visible">True</property>
+			      <property name="xalign">0.5</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xscale">0</property>
+			      <property name="yscale">0</property>
+			      <property name="top_padding">0</property>
+			      <property name="bottom_padding">0</property>
+			      <property name="left_padding">0</property>
+			      <property name="right_padding">0</property>
+
+			      <child>
+				<widget class="GtkHBox" id="hbox10">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">2</property>
+
+				  <child>
+				    <widget class="GtkImage" id="image7">
+				      <property name="visible">True</property>
+				      <property name="stock">gtk-apply</property>
+				      <property name="icon_size">4</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+
+				  <child>
+				    <widget class="GtkLabel" id="label20">
+				      <property name="visible">True</property>
+				      <property name="label" translatable="yes">_Dismiss</property>
+				      <property name="use_underline">True</property>
+				      <property name="use_markup">False</property>
+				      <property name="justify">GTK_JUSTIFY_LEFT</property>
+				      <property name="wrap">False</property>
+				      <property name="selectable">False</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xpad">0</property>
+				      <property name="ypad">0</property>
+				      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				      <property name="width_chars">-1</property>
+				      <property name="single_line_mode">False</property>
+				      <property name="angle">0</property>
+				    </widget>
+				    <packing>
+				      <property name="padding">0</property>
+				      <property name="expand">False</property>
+				      <property name="fill">False</property>
+				    </packing>
+				  </child>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
 		    </widget>
 		    <packing>
 		      <property name="padding">0</property>

Modified: branches/kill-bonobo/calendar/gui/alarm-notify/alarm-queue.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/alarm-notify/alarm-queue.c	(original)
+++ branches/kill-bonobo/calendar/gui/alarm-notify/alarm-queue.c	Mon Nov 24 05:14:44 2008
@@ -1250,6 +1250,13 @@
 
 		break;
 
+	case ALARM_NOTIFY_DISMISS:
+		if (alarm_notifications_dialog) {
+			GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (alarm_notifications_dialog->treeview));
+			gtk_list_store_remove (GTK_LIST_STORE (model), &tray_data->iter);
+		}
+		break;
+
 	case ALARM_NOTIFY_CLOSE:
 		d(printf("%s:%d (notify_dialog_cb) - Dialog close\n",__FILE__, __LINE__));
 		if (alarm_notifications_dialog) {
@@ -1270,7 +1277,7 @@
 
 			/* Task to remove the tray icons */
 			tray_list_remove_icons ();
-	}
+		}
 
 		break;
 

Modified: branches/kill-bonobo/calendar/gui/calendar-component.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/calendar-component.h	(original)
+++ branches/kill-bonobo/calendar/gui/calendar-component.h	Mon Nov 24 05:14:44 2008
@@ -26,6 +26,7 @@
 
 #include <bonobo/bonobo-object.h>
 #include <libedataserver/e-source-list.h>
+#include <widgets/misc/e-activity-handler.h>
 #include "Evolution.h"
 
 

Modified: branches/kill-bonobo/calendar/gui/dialogs/comp-editor.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/comp-editor.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/comp-editor.c	Mon Nov 24 05:14:44 2008
@@ -2937,7 +2937,9 @@
 	if (e_cal_component_has_attachments (priv->comp)) {
 		GSList *attachment_list = NULL;
 		e_cal_component_get_attachment_list (priv->comp, &attachment_list);
+		g_signal_handlers_block_by_func(priv->attachment_bar, G_CALLBACK (attachment_bar_changed_cb), editor);
 		set_attachment_list (editor, attachment_list);
+		g_signal_handlers_unblock_by_func(priv->attachment_bar, G_CALLBACK (attachment_bar_changed_cb), editor);
 		g_slist_foreach (attachment_list, (GFunc)g_free, NULL);
 		g_slist_free (attachment_list);
 	}
@@ -2950,7 +2952,6 @@
 real_edit_comp (CompEditor *editor, ECalComponent *comp)
 {
 	CompEditorPrivate *priv;
-	const char *uid;
 
 	g_return_if_fail (IS_COMP_EDITOR (editor));
 
@@ -2969,7 +2970,6 @@
  	priv->warned = FALSE;
 
 	update_window_border (editor, NULL);
-	e_cal_component_get_uid (comp, &uid);
 
 	fill_widgets (editor);
 

Modified: branches/kill-bonobo/calendar/gui/e-calendar-table.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-calendar-table.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-calendar-table.c	Mon Nov 24 05:14:44 2008
@@ -440,6 +440,16 @@
 	e_cal_component_free_datetime (&dtstart);
 	e_cal_component_free_datetime (&dtdue);
 
+	tmp = e_calendar_view_get_attendees_status_info (new_comp);
+	if (tmp) {
+		l = gtk_label_new (tmp);
+		gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5);
+		gtk_box_pack_start (GTK_BOX (w), l, FALSE, FALSE, 0);
+
+		g_free (tmp);
+		tmp = NULL;
+	}
+
 	tmp2 = g_string_new ("");
 	e_cal_component_get_description_list (new_comp, &desc);
 	for (len = 0, p = desc; p != NULL; p = p->next) {

Modified: branches/kill-bonobo/calendar/gui/e-calendar-view.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-calendar-view.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-calendar-view.c	Mon Nov 24 05:14:44 2008
@@ -2034,6 +2034,83 @@
   gtk_widget_show (widget);
 }
 
+/**
+ * Returns information about attendees in the component. If no attendees, then returns NULL.
+ * The information is like "Status: Accepted: X   Declined: Y  ...".
+ * Free returned pointer with g_free.
+ **/
+char *
+e_calendar_view_get_attendees_status_info (ECalComponent *comp)
+{
+	struct _values {
+		icalparameter_partstat status;
+		const char *caption;
+		int count;
+	} values[] = {
+		{ ICAL_PARTSTAT_ACCEPTED,    N_("Accepted"),     0 },
+		{ ICAL_PARTSTAT_DECLINED,    N_("Declined"),     0 },
+		{ ICAL_PARTSTAT_TENTATIVE,   N_("Tentative"),    0 },
+		{ ICAL_PARTSTAT_DELEGATED,   N_("Delegated"),    0 },
+		{ ICAL_PARTSTAT_NEEDSACTION, N_("Needs action"), 0 },
+		{ ICAL_PARTSTAT_NONE,        N_("Other"),        0 },
+		{ ICAL_PARTSTAT_X,           NULL,              -1 }
+	};
+
+	GSList *attendees = NULL, *a;
+	gboolean have = FALSE;
+	char *res = NULL;
+	int i;
+
+	if (!comp || !e_cal_component_has_attendees (comp))
+		return NULL;
+
+	e_cal_component_get_attendee_list (comp, &attendees);
+
+	for (a = attendees; a; a = a->next) {
+		ECalComponentAttendee *att = a->data;
+
+		if (att && att->cutype == ICAL_CUTYPE_INDIVIDUAL &&
+		    (att->role == ICAL_ROLE_CHAIR ||
+		     att->role == ICAL_ROLE_REQPARTICIPANT ||
+		     att->role == ICAL_ROLE_OPTPARTICIPANT)) {
+			have = TRUE;
+
+			for (i = 0; values[i].count != -1; i++) {
+				if (att->status == values[i].status || values[i].status == ICAL_PARTSTAT_NONE) {
+					values[i].count++;
+					break;
+				}
+			}
+		}
+	}
+
+	if (have) {
+		GString *str = g_string_new ("");
+
+		for (i = 0; values[i].count != -1; i++) {
+			if (values[i].count > 0) {
+				if (str->str && *str->str)
+					g_string_append (str, "   ");
+
+				g_string_append_printf (str, "%s: %d", _(values[i].caption), values[i].count);
+			}
+		}
+
+		g_string_prepend (str, ": ");
+
+		/* To Translators: 'Status' here means the state of the attendees, the resulting string will be in a form:
+		   Status: Accepted: X   Declined: Y   ... */
+		g_string_prepend (str, _("Status"));
+
+		res = g_string_free (str, FALSE);
+	}
+
+	if (attendees)
+		e_cal_component_free_attendee_list (attendees);
+
+	return res;
+}
+
 /*
  * It is expected to show the tooltips in this below format
  *
@@ -2041,6 +2118,7 @@
  * 	Organiser: NameOfTheUser<email ofuser com>
  * 	Location: PlaceOfTheMeeting
  * 	Time : DateAndTime (xx Minutes)
+ *      Status: Accepted: X   Declined: Y   ...
  */
 
 gboolean
@@ -2179,6 +2257,17 @@
 	g_free (tmp2);
 	g_free (tmp1);
 
+	tmp = e_calendar_view_get_attendees_status_info (newcomp);
+	if (tmp) {
+		hbox = gtk_hbox_new (FALSE, 0);
+		gtk_box_pack_start ((GtkBox *)hbox, gtk_label_new (tmp), FALSE, FALSE, 0);
+		ebox = gtk_event_box_new ();
+		gtk_container_add ((GtkContainer *)ebox, hbox);
+		gtk_box_pack_start ((GtkBox *)box, ebox, FALSE, FALSE, 0);
+
+		g_free (tmp);
+	}
+
 	pevent->tooltip = gtk_window_new (GTK_WINDOW_POPUP);
 	frame = gtk_frame_new (NULL);
 	gtk_frame_set_shadow_type ((GtkFrame *)frame, GTK_SHADOW_IN);

Modified: branches/kill-bonobo/calendar/gui/e-calendar-view.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-calendar-view.h	(original)
+++ branches/kill-bonobo/calendar/gui/e-calendar-view.h	Mon Nov 24 05:14:44 2008
@@ -171,6 +171,7 @@
 void           e_calendar_view_move_tip (GtkWidget *widget, int x, int y);
 
 const gchar *e_calendar_view_get_icalcomponent_summary (ECal *ecal, icalcomponent *icalcomp, gboolean *free_text);
+char *e_calendar_view_get_attendees_status_info (ECalComponent *comp);
 
 void           draw_curved_rectangle (cairo_t *cr,
                                       double x0,

Modified: branches/kill-bonobo/calendar/gui/e-day-view.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-day-view.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-day-view.c	Mon Nov 24 05:14:44 2008
@@ -1776,41 +1776,38 @@
 	return TRUE;
 }
 
-#if 0
-/*  Checks if the users participation status is Needs action and shows the summary as bold text*/
+/* Checks if the users participation status is NEEDS-ACTION and shows the summary as bold text */
 static void
 set_text_as_bold (EDayViewEvent *event)
 {
 	ECalComponent *comp;
-	char *address;
-	GSList *attendees, *l;
+	GSList *attendees = NULL, *l;
+	gchar *address;
 	ECalComponentAttendee *at = NULL;
 
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
 	address = itip_get_comp_attendee (comp, event->comp_data->client);
 	e_cal_component_get_attendee_list (comp, &attendees);
-
 	for (l = attendees; l; l = l->next) {
 		ECalComponentAttendee *attendee = l->data;
 
-		if (g_str_equal (itip_strip_mailto (attendee->value), address)) {
+		if ((g_str_equal (itip_strip_mailto (attendee->value), address)) 
+		 || (attendee->sentby && g_str_equal (itip_strip_mailto (attendee->sentby), address))) {
 			at = attendee;
 			break;
 		}
 	}
-
-	/* The attendee has not yet accepted the meeting, display the summary as bolded .
-	   If the attendee is not present, it might have come through a mailing list*/
-	if (!at || (at->status == ICAL_PARTSTAT_NEEDSACTION)) {
-		gnome_canvas_item_set (event->canvas_item, "bold", TRUE, NULL);
-	}
-
 	e_cal_component_free_attendee_list (attendees);
-	g_object_unref (comp);
 	g_free (address);
+	g_object_unref (comp);
+
+	/* The attendee has not yet accepted the meeting, display the summary as bolded.
+	   If the attendee is not present, it might have come through a mailing list. 
+	   In that case, we never show the meeting as bold even if it is unaccepted. */
+	if (at && (at->status == ICAL_PARTSTAT_NEEDSACTION))
+		gnome_canvas_item_set (event->canvas_item, "bold", TRUE, NULL);
 }
-#endif
 
 /* This updates the text shown for an event. If the event start or end do not
    lie on a row boundary, the time is displayed before the summary. */
@@ -1860,9 +1857,9 @@
 			       "text", text,
 			       NULL);
 
-/*	if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
+	if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
 				&& e_cal_util_component_has_attendee (event->comp_data->icalcomp))
-		set_text_as_bold (event); */
+		set_text_as_bold (event);
 
 	if (free_text)
 		g_free (text);
@@ -1892,9 +1889,9 @@
 	if (free_text)
 		g_free ((gchar*)summary);
 
-/*	if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
+	if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
 				&& e_cal_util_component_has_attendee (event->comp_data->icalcomp))
-		set_text_as_bold (event); */
+		set_text_as_bold (event);
 }
 
 

Modified: branches/kill-bonobo/calendar/gui/e-week-view.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-week-view.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-week-view.c	Mon Nov 24 05:14:44 2008
@@ -1878,41 +1878,38 @@
 	return FALSE;
 }
 
-#if 0
-/*  Checks if the users participation status is Needs action and shows the summary as bold text*/
+/* Checks if the users participation status is NEEDS-ACTION and shows the summary as bold text */
 static void
 set_text_as_bold (EWeekViewEvent *event, EWeekViewEventSpan *span)
 {
 	ECalComponent *comp;
-	char *address;
-	GSList *attendees, *l;
+	GSList *attendees = NULL, *l;
+	gchar *address;
 	ECalComponentAttendee *at = NULL;
 
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
 	address = itip_get_comp_attendee (comp, event->comp_data->client);
 	e_cal_component_get_attendee_list (comp, &attendees);
-
 	for (l = attendees; l; l = l->next) {
 		ECalComponentAttendee *attendee = l->data;
 
-		if (g_str_equal (itip_strip_mailto (attendee->value), address)) {
+		if ((g_str_equal (itip_strip_mailto (attendee->value), address)) 
+		 || (attendee->sentby && g_str_equal (itip_strip_mailto (attendee->sentby), address))) {
 			at = attendee;
 			break;
 		}
 	}
+	e_cal_component_free_attendee_list (attendees);
+	g_free (address);
+	g_object_unref (comp);
 
 	/* The attendee has not yet accepted the meeting, display the summary as bolded.
-	   If the attendee is not present, it might have come through a mailing list*/
-	if (!at || (at->status == ICAL_PARTSTAT_NEEDSACTION)) {
+	   If the attendee is not present, it might have come through a mailing list. 
+	   In that case, we never show the meeting as bold even if it is unaccepted. */
+	if (at && (at->status == ICAL_PARTSTAT_NEEDSACTION))
 		gnome_canvas_item_set (span->text_item, "bold", TRUE, NULL);
-	}
-
-	e_cal_component_free_attendee_list (attendees);
-	g_object_unref (comp);
-	g_free (address);
 }
-#endif
 
 /* This calls a given function for each event instance that matches the given
    uid. Note that it is safe for the callback to remove the event (since we
@@ -2817,11 +2814,10 @@
 		if (free_text)
 			g_free ((gchar*)summary);
 
-/*		Uncomment once the pango fix is in
 		if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
 				&& e_cal_util_component_has_attendee (event->comp_data->icalcomp)) {
 			set_text_as_bold (event, span);
-		} */
+		}
 		g_object_set_data (G_OBJECT (span->text_item), "event-num", GINT_TO_POINTER (event_num));
 		g_signal_connect (span->text_item, "event",
 				  G_CALLBACK (e_week_view_on_text_item_event),

Modified: branches/kill-bonobo/calendar/gui/gnome-cal.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/gnome-cal.c	(original)
+++ branches/kill-bonobo/calendar/gui/gnome-cal.c	Mon Nov 24 05:14:44 2008
@@ -179,6 +179,9 @@
 	/* We should know which calendar has been used to create object, so store it here
 	   before emitting "user_created" signal and make it NULL just after the emit. */
 	ECal *user_created_cal;
+
+	/* used in update_todo_view, to prevent interleaving when called in separate thread */
+	GMutex *todo_update_lock;
 };
 
 /* Signal IDs */
@@ -738,6 +741,8 @@
 
 	real_sexp = adjust_e_cal_view_sexp (gcal, priv->sexp);
 	if (!real_sexp) {
+		g_object_unref (msg->gcal);
+		g_slice_free (struct _date_query_msg, msg);
 		return; /* No time range is set, so don't start a query */
 	}
 	
@@ -1048,18 +1053,30 @@
 	set_timezone (calendar);
 }
 
+struct _mupdate_todo_msg {
+	Message header;
+	GnomeCalendar *gcal;
+};
+
 static void
-update_todo_view (GnomeCalendar *gcal)
+update_todo_view_async (struct _mupdate_todo_msg *msg)
 {
+	GnomeCalendar *gcal;
 	GnomeCalendarPrivate *priv;
 	ECalModel *model;
 	char *sexp = NULL;
 
+	g_return_if_fail (msg != NULL);
+
+	gcal = msg->gcal;
 	priv = gcal->priv;
 
+	g_mutex_lock (priv->todo_update_lock);
+
 	/* Set the query on the task pad */
 	if (priv->todo_sexp) {
 		g_free (priv->todo_sexp);
+		priv->todo_sexp = NULL;
 	}
 
 	model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo));
@@ -1074,6 +1091,22 @@
 		e_cal_model_set_search_query (model, priv->todo_sexp);
 	}
 
+	g_mutex_unlock (priv->todo_update_lock);
+
+	g_object_unref (msg->gcal);
+	g_slice_free (struct _mupdate_todo_msg, msg);
+}
+
+static void
+update_todo_view (GnomeCalendar *gcal)
+{
+	struct _mupdate_todo_msg *msg;
+
+	msg = g_slice_new0 (struct _mupdate_todo_msg);
+	msg->header.func = (MessageFunc) update_todo_view_async;
+	msg->gcal = g_object_ref (gcal);
+
+	message_push ((Message *) msg);
 }
 
 static void
@@ -1384,7 +1417,7 @@
 	gtk_widget_show (vbox);
 	gtk_widget_show (sep);
 
-	update_todo_view (gcal);
+	/* update_todo_view (gcal); */
 
 	/* Timeout check to hide completed items */
 	priv->update_timeout = g_timeout_add_full (G_PRIORITY_LOW, 60000, (GSourceFunc) update_todo_view_cb, gcal, NULL);
@@ -1500,6 +1533,8 @@
 
 	e_categories_register_change_listener (G_CALLBACK (categories_changed_cb), gcal);
 
+	priv->todo_update_lock = g_mutex_new ();
+
 	priv->current_view_type = GNOME_CAL_DAY_VIEW;
 	priv->range_selected = FALSE;
 	priv->lview_select_daten_range = TRUE;
@@ -1616,6 +1651,8 @@
 		g_signal_handlers_disconnect_by_func (cal_model,
 				G_CALLBACK (view_done_cb), gcal);
 
+		g_mutex_free (priv->todo_update_lock);
+
 		g_free (priv);
 		gcal->priv = NULL;
 	}

Modified: branches/kill-bonobo/calendar/gui/memos-component.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/memos-component.c	(original)
+++ branches/kill-bonobo/calendar/gui/memos-component.c	Mon Nov 24 05:14:44 2008
@@ -218,43 +218,21 @@
 	return TRUE;
 }
 
-static void
-selector_tree_drag_data_received (GtkWidget *widget,
-				  GdkDragContext *context,
-				  gint x,
-				  gint y,
-				  GtkSelectionData *data,
-				  guint info,
-				  guint time,
-				  gpointer user_data)
+static gboolean
+selector_tree_data_dropped (ESourceSelector *selector,
+                            GtkSelectionData *data,
+                            ESource *destination,
+                            GdkDragAction action,
+                            guint info,
+                            MemosComponent *component)
 {
-	GtkTreePath *path = NULL;
-	GtkTreeViewDropPosition pos;
-	gpointer source = NULL;
-	GtkTreeModel *model;
-	GtkTreeIter iter;
 	gboolean success = FALSE;
 	icalcomponent *icalcomp = NULL;
 	ECal *client = NULL;
 	GSList *components, *p;
-	MemosComponent *component = MEMOS_COMPONENT (user_data);
-
-	if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
-						x, y, &path, &pos))
-		goto finish;
-
-	model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
-	if (!gtk_tree_model_get_iter (model, &iter, path))
-		goto finish;
-
-
-	gtk_tree_model_get (model, &iter, 0, &source, -1);
-
-	if (E_IS_SOURCE_GROUP (source) || e_source_get_readonly (source) || !data->data)
-		goto finish;
 
-	client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_JOURNAL);
+	client = auth_new_cal_from_source (
+		destination, E_CAL_SOURCE_TYPE_JOURNAL);
 
 	if (!client || !e_cal_open (client, TRUE, NULL))
 		goto  finish;
@@ -280,7 +258,7 @@
 			continue;
 
 		/* FIXME deal with GDK_ACTION_ASK */
-		if (context->action == GDK_ACTION_COPY) {
+		if (action == GDK_ACTION_COPY) {
 			old_uid = g_strdup (icalcomponent_get_uid (icalcomp));
 			uid = e_cal_component_gen_uid ();
 			icalcomponent_set_uid (icalcomp, uid);
@@ -297,7 +275,7 @@
 				/* this will report success by last item, but we don't care */
 				success = update_objects (client, icalcomp);
 
-				if (success && context->action == GDK_ACTION_MOVE) {
+				if (success && action == GDK_ACTION_MOVE) {
 					/* remove components rather here, because we know which has been moved */
 					ESource *source_source;
 					ECal *source_client;
@@ -337,12 +315,8 @@
  finish:
 	if (client)
 		g_object_unref (client);
-	if (source)
-		g_object_unref (source);
-	if (path)
-		gtk_tree_path_free (path);
 
-	gtk_drag_finish (context, success, success && context->action == GDK_ACTION_MOVE, time);
+	return success;
 }
 
 static void

Modified: branches/kill-bonobo/calendar/gui/print.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/print.c	(original)
+++ branches/kill-bonobo/calendar/gui/print.c	Mon Nov 24 05:14:44 2008
@@ -2531,7 +2531,7 @@
 	top += 20;
 
 	/* Attendees */
-	if (e_cal_component_has_attendees (comp)) {
+	if ((page_nr == 0) && e_cal_component_has_attendees (comp)) {
 		top = bound_text (context, font, _("Attendees: "), -1, 0.0, top, width, height, FALSE, &page_start, &pages);
 		pango_font_description_free (font);
 		font = get_font_for_size (12, PANGO_WEIGHT_NORMAL);

Modified: branches/kill-bonobo/calendar/gui/tasks-component.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/tasks-component.c	(original)
+++ branches/kill-bonobo/calendar/gui/tasks-component.c	Mon Nov 24 05:14:44 2008
@@ -238,6 +238,16 @@
 }
 
 static void
+rename_task_list_cb (EPopup *ep, EPopupItem *pitem, void *data)
+{
+	TasksComponentView *component_view = data;
+	ESourceSelector *selector;
+
+	selector = E_SOURCE_SELECTOR (component_view->source_selector);
+	e_source_selector_edit_primary_selection (selector);
+}
+
+static void
 edit_task_list_cb (EPopup *ep, EPopupItem *pitem, void *data)
 {
 	TasksComponentView *component_view = data;
@@ -278,6 +288,7 @@
 static EPopupItem etc_source_popups[] = {
 	{ E_POPUP_ITEM, "10.new", N_("_New Task List"), new_task_list_cb, NULL, "stock_todo", 0, 0 },
 	{ E_POPUP_ITEM, "15.copy", N_("_Copy..."), copy_task_list_cb, NULL, "edit-copy", 0, E_CAL_POPUP_SOURCE_PRIMARY },
+	{ E_POPUP_ITEM, "18.rename", N_("_Rename..."), rename_task_list_cb, NULL, NULL, 0, E_CAL_POPUP_SOURCE_PRIMARY },
 
 	{ E_POPUP_BAR, "20.bar" },
 	{ E_POPUP_ITEM, "20.delete", N_("_Delete"), delete_task_list_cb, NULL, "edit-delete", 0, E_CAL_POPUP_SOURCE_USER|E_CAL_POPUP_SOURCE_PRIMARY },
@@ -397,43 +408,21 @@
 	return TRUE;
 }
 
-static void
-selector_tree_drag_data_received (GtkWidget *widget,
-				  GdkDragContext *context,
-				  gint x,
-				  gint y,
-				  GtkSelectionData *data,
-				  guint info,
-				  guint time,
-				  gpointer user_data)
-{
-	GtkTreePath *path = NULL;
-	GtkTreeViewDropPosition pos;
-	gpointer source = NULL;
-	GtkTreeModel *model;
-	GtkTreeIter iter;
+static gboolean
+selector_tree_data_dropped (ESourceSelector *selector,
+                            GtkSelectionData *data,
+                            ESource *destination,
+                            GdkDragAction action,
+                            guint info,
+                            TasksComponent *component)
+{
 	gboolean success = FALSE;
 	icalcomponent *icalcomp = NULL;
 	ECal *client = NULL;
 	GSList *components, *p;
-	TasksComponent *component = TASKS_COMPONENT (user_data);
-
-	if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget),
-						x, y, &path, &pos))
-		goto finish;
-
-	model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-
-	if (!gtk_tree_model_get_iter (model, &iter, path))
-		goto finish;
-
-
-	gtk_tree_model_get (model, &iter, 0, &source, -1);
-
-	if (E_IS_SOURCE_GROUP (source) || e_source_get_readonly (source) || !data->data)
-		goto finish;
 
-	client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
+	client = auth_new_cal_from_source (
+		destination, E_CAL_SOURCE_TYPE_TODO);
 
 	if (!client || !e_cal_open (client, TRUE, NULL))
 		goto  finish;
@@ -459,7 +448,7 @@
 			continue;
 
 		/* FIXME deal with GDK_ACTION_ASK */
-		if (context->action == GDK_ACTION_COPY) {
+		if (action == GDK_ACTION_COPY) {
 			old_uid = g_strdup (icalcomponent_get_uid (icalcomp));
 			uid = e_cal_component_gen_uid ();
 			icalcomponent_set_uid (icalcomp, uid);
@@ -476,7 +465,7 @@
 				/* this will report success by last item, but we don't care */
 				success = update_objects (client, icalcomp);
 
-				if (success && context->action == GDK_ACTION_MOVE) {
+				if (success && action == GDK_ACTION_MOVE) {
 					/* remove components rather here, because we know which has been moved */
 					ESource *source_source;
 					ECal *source_client;
@@ -516,12 +505,8 @@
  finish:
 	if (client)
 		g_object_unref (client);
-	if (source)
-		g_object_unref (source);
-	if (path)
-		gtk_tree_path_free (path);
 
-	gtk_drag_finish (context, success, context->action == GDK_ACTION_MOVE, time);
+	return success;
 }
 
 static void

Modified: branches/kill-bonobo/composer/e-msg-composer.c
==============================================================================
--- branches/kill-bonobo/composer/e-msg-composer.c	(original)
+++ branches/kill-bonobo/composer/e-msg-composer.c	Mon Nov 24 05:14:44 2008
@@ -2085,10 +2085,9 @@
 	GObject *object;
 	EMsgComposer *composer;
 	GtkToggleAction *action;
-	GList *spell_languages = NULL;
+	GList *spell_languages;
 	GConfClient *client;
 	GArray *array;
-	GSList *list;
 	gboolean active;
 	guint binding_id;
 
@@ -2155,21 +2154,7 @@
 		client, COMPOSER_GCONF_REQUEST_RECEIPT_KEY, NULL);
 	gtk_toggle_action_set_active (action, active);
 
-	list = gconf_client_get_list (
-		client, COMPOSER_GCONF_SPELL_LANGUAGES_KEY,
-		GCONF_VALUE_STRING, NULL);
-	while (list != NULL) {
-		gchar *language_code = list->data;
-		const GtkhtmlSpellLanguage *language;
-
-		language = gtkhtml_spell_language_lookup (language_code);
-		if (language != NULL)
-			spell_languages = g_list_prepend (
-				spell_languages, (gpointer) language);
-
-		list = g_slist_delete_link (list, list);
-		g_free (language_code);
-	}
+	spell_languages = e_load_spell_languages ();
 	gtkhtml_editor_set_spell_languages (
 		GTKHTML_EDITOR (composer), spell_languages);
 	g_list_free (spell_languages);
@@ -2791,6 +2776,27 @@
 		drop_types, G_N_ELEMENTS (drop_types),
 		GDK_ACTION_COPY | GDK_ACTION_ASK | GDK_ACTION_MOVE);
 
+	/* XXX I'm not sure why we have to explicitly configure the
+	 *     attachment bar as a drag destination when CompEditor
+	 *     doesn't and previous Evolution releases (2.22 and
+	 *     prior) don't, but this is the only way I could figure
+	 *     out how to get drag-and-drop to the attachment bar
+	 *     working again.  I'm probably overlooking something
+	 *     simple... */
+
+	gtk_drag_dest_set (
+		composer->priv->attachment_bar, GTK_DEST_DEFAULT_ALL,
+		drop_types, G_N_ELEMENTS (drop_types),
+		GDK_ACTION_COPY | GDK_ACTION_ASK | GDK_ACTION_MOVE);
+
+	g_signal_connect (
+		composer->priv->attachment_bar, "drag-motion",
+		G_CALLBACK (msg_composer_drag_motion), NULL);
+
+	g_signal_connect (
+		composer->priv->attachment_bar, "drag-data-received",
+		G_CALLBACK (msg_composer_drag_data_received), NULL);
+
 	g_signal_connect (
 		html, "drag-data-received",
 		G_CALLBACK (msg_composer_drag_data_received), NULL);
@@ -4791,3 +4797,95 @@
 
 	composer->priv->send_invoked = send_enable;
 }
+
+GList *
+e_load_spell_languages (void)
+{
+	GConfClient *client;
+	GList *spell_languages = NULL;
+	GSList *list;
+	const gchar *key;
+	GError *error = NULL;
+
+	/* Ask GConf for a list of spell check language codes. */
+	client = gconf_client_get_default ();
+	key = COMPOSER_GCONF_SPELL_LANGUAGES_KEY;
+	list = gconf_client_get_list (client, key, GCONF_VALUE_STRING, &error);
+	g_object_unref (client);
+
+	/* Convert the codes to spell language structs. */
+	while (list != NULL) {
+		gchar *language_code = list->data;
+		const GtkhtmlSpellLanguage *language;
+
+		language = gtkhtml_spell_language_lookup (language_code);
+		if (language != NULL)
+			spell_languages = g_list_prepend (
+				spell_languages, (gpointer) language);
+
+		list = g_slist_delete_link (list, list);
+		g_free (language_code);
+	}
+
+	spell_languages = g_list_reverse (spell_languages);
+
+	/* Pick a default spell language if GConf came back empty. */
+	if (spell_languages == NULL) {
+		const GtkhtmlSpellLanguage *language;
+
+		language = gtkhtml_spell_language_lookup (NULL);
+		
+		if (language) {
+			spell_languages = g_list_prepend (
+				spell_languages, (gpointer) language);
+
+		/* Don't overwrite the stored spell check language
+		 * codes if there was a problem retrieving them. */
+			if (error == NULL)
+				e_save_spell_languages (spell_languages);
+		}
+	}
+
+	if (error != NULL) {
+		g_warning ("%s", error->message);
+		g_error_free (error);
+	}
+
+	return spell_languages;
+}
+
+void
+e_save_spell_languages (GList *spell_languages)
+{
+	GConfClient *client;
+	GSList *list = NULL;
+	const gchar *key;
+	GError *error = NULL;
+
+	/* Build a list of spell check language codes. */
+	while (spell_languages != NULL) {
+		const GtkhtmlSpellLanguage *language;
+		const gchar *language_code;
+
+		language = spell_languages->data;
+		language_code = gtkhtml_spell_language_get_code (language);
+		list = g_slist_prepend (list, (gpointer) language_code);
+
+		spell_languages = g_list_next (spell_languages);
+	}
+
+	list = g_slist_reverse (list);
+
+	/* Save the language codes to GConf. */
+	client = gconf_client_get_default ();
+	key = COMPOSER_GCONF_SPELL_LANGUAGES_KEY;
+	gconf_client_set_list (client, key, GCONF_VALUE_STRING, list, &error);
+	g_object_unref (client);
+
+	g_slist_free (list);
+
+	if (error != NULL) {
+		g_warning ("%s", error->message);
+		g_error_free (error);
+	}
+}

Modified: branches/kill-bonobo/composer/e-msg-composer.h
==============================================================================
--- branches/kill-bonobo/composer/e-msg-composer.h	(original)
+++ branches/kill-bonobo/composer/e-msg-composer.h	Mon Nov 24 05:14:44 2008
@@ -159,6 +159,9 @@
 
 gboolean	e_msg_composer_is_exiting	(EMsgComposer *composer);
 
+GList *		e_load_spell_languages		(void);
+void		e_save_spell_languages		(GList *spell_languages);
+
 G_END_DECLS
 
 #endif /* E_MSG_COMPOSER_H */

Modified: branches/kill-bonobo/configure.in
==============================================================================
--- branches/kill-bonobo/configure.in	(original)
+++ branches/kill-bonobo/configure.in	Mon Nov 24 05:14:44 2008
@@ -1,7 +1,17 @@
 # Process this file with autoconf to produce a configure script.
 AC_PREREQ(2.52)
 
-AC_INIT(evolution, 2.25.2, http://bugzilla.gnome.org/enter_bug.cgi?product=Evolution)
+m4_define([evo_major_version], [2])
+m4_define([evo_minor_version], [25])
+m4_define([evo_micro_version], [2])
+m4_define([evo_version],
+          [evo_major_version.evo_minor_version.evo_micro_version])
+m4_define([evo_stable_version],
+          [m4_if(m4_eval(evo_minor_version % 2), [1],
+          [evo_major_version.m4_eval(evo_minor_version - 1)],
+          [evo_version])])
+
+AC_INIT(evolution, [evo_version], http://bugzilla.gnome.org/enter_bug.cgi?product=Evolution)
 AC_CONFIG_SRCDIR(README)
 
 # Some requirements have versioned package names
@@ -13,7 +23,7 @@
 # Required Packages
 m4_define([glib_minimum_version], [2.18.0])
 m4_define([gtk_minimum_version], [2.12.0])
-m4_define([eds_minimum_version], [2.23.91])
+m4_define([eds_minimum_version], [2.25.2])
 m4_define([gnome_icon_theme_minimum_version], [2.19.91])
 m4_define([libbonobo_minimum_version], [2.20.3])
 m4_define([libbonoboui_minimum_version], [2.4.2])
@@ -53,6 +63,11 @@
 dnl Initialize maintainer mode
 AM_MAINTAINER_MODE
 
+if test "$evo_version" != "$evo_stable_version"; then
+        AC_DEFINE(STABLE_VERSION, ["evo_stable_version"],
+                  [Define to the latest stable version if this version is unstable])
+fi
+
 dnl *************************************************************************************************
 dnl Base Version
 dnl
@@ -75,16 +90,6 @@
 AC_SUBST(UPGRADE_REVISION)
 AC_DEFINE_UNQUOTED(UPGRADE_REVISION, "$UPGRADE_REVISION", [The number of times we've upgraded since the BASE_VERSION release])
 
-dnl *************************************************************************************************
-dnl Development mode
-dnl 
-dnl The controls whether things like the development warning in shell/main.c are displayed.
-dnl
-dnl This should be set to 0 for stable releases and 1 for unstable releases
-dnl *************************************************************************************************
-AC_DEFINE(DEVELOPMENT, 1, [If we are in development mode or not])
-AC_SUBST(DEVELOPMENT)
-
 AC_ISC_POSIX
 AC_PROG_CC
 AC_PROG_CPP

Modified: branches/kill-bonobo/e-util/e-util-labels.c
==============================================================================
--- branches/kill-bonobo/e-util/e-util-labels.c	(original)
+++ branches/kill-bonobo/e-util/e-util-labels.c	Mon Nov 24 05:14:44 2008
@@ -79,7 +79,7 @@
 
 		/* Needed for Backward Compatibility */
 		if (num < LABEL_DEFAULTS_NUM) {
-			label->name = g_strdup (_(buf));
+			label->name = g_strdup ((buf && *buf) ? buf : _(label_defaults[num].name));
 			label->tag = g_strdup (label_defaults[num].tag);
 			num++;
 		} else if (!tag) {

Modified: branches/kill-bonobo/mail/em-composer-prefs.c
==============================================================================
--- branches/kill-bonobo/mail/em-composer-prefs.c	(original)
+++ branches/kill-bonobo/mail/em-composer-prefs.c	Mon Nov 24 05:14:44 2008
@@ -584,46 +584,41 @@
 static void
 spell_language_save (EMComposerPrefs *prefs)
 {
-	GSList *list = NULL;
-	GConfClient *client;
+	GList *spell_languages = NULL;
 	GtkTreeModel *model;
 	GtkTreeIter iter;
-	const gchar *key;
 	gboolean valid;
 
 	model = prefs->language_model;
 
-	/* Build a list of active languages. */
+	/* Build a list of active spell languages. */
 	valid = gtk_tree_model_get_iter_first (model, &iter);
 	while (valid) {
 		const GtkhtmlSpellLanguage *language;
-		const gchar *code;
 		gboolean active;
 
 		gtk_tree_model_get (
 			model, &iter, 0, &active, 2, &language, -1);
-		code = gtkhtml_spell_language_get_code (language);
 
 		if (active)
-			list = g_slist_prepend (list, (gpointer) code);
+			spell_languages = g_list_prepend (
+				spell_languages, (gpointer) language);
 
 		valid = gtk_tree_model_iter_next (model, &iter);
 	}
-	list = g_slist_reverse (list);
+	spell_languages = g_list_reverse (spell_languages);
 
 	/* Update the GConf value. */
-	client = mail_config_get_gconf_client ();
-	key = "/apps/evolution/mail/composer/spell_languages";
-	gconf_client_set_list (client, key, GCONF_VALUE_STRING, list, NULL);
+	e_save_spell_languages (spell_languages);
 
-	g_slist_free (list);
+	g_list_free (spell_languages);
 }
 
 static void
 spell_setup (EMComposerPrefs *prefs)
 {
 	const GList *available_languages;
-	GSList *active_languages, *iter;
+	GList *active_languages;
 	GConfClient *client;
 	GtkListStore *store;
 	GdkColor color;
@@ -634,27 +629,7 @@
 	store = GTK_LIST_STORE (prefs->language_model);
 	available_languages = gtkhtml_spell_language_get_available ();
 
-	/* Retrieve a list of language codes from GConf. */
-	key = "/apps/evolution/mail/composer/spell_languages";
-	active_languages = gconf_client_get_list (
-		client, key, GCONF_VALUE_STRING, NULL);
-
-	/* Convert the list to GtkhtmlSpellLanguages. */
-	for (iter = active_languages; iter != NULL; iter = iter->next) {
-		gchar *code = iter->data;
-
-		iter->data = (gpointer) gtkhtml_spell_language_lookup (code);
-		g_free (code);
-	}
-
-	/* Make sure we have _something_ active. */
-	if (active_languages == NULL) {
-		const GtkhtmlSpellLanguage *default_language;
-
-		default_language = gtkhtml_spell_language_lookup (NULL);
-		active_languages = g_slist_prepend (
-			active_languages, (gpointer) default_language);
-	}
+	active_languages = e_load_spell_languages ();
 
 	/* Populate the GtkListStore. */
 	while (available_languages != NULL) {
@@ -665,7 +640,7 @@
 
 		language = available_languages->data;
 		name = gtkhtml_spell_language_get_name (language);
-		active = (g_slist_find (active_languages, language) != NULL);
+		active = (g_list_find (active_languages, language) != NULL);
 
 		gtk_list_store_append (store, &tree_iter);
 
@@ -676,10 +651,7 @@
 		available_languages = available_languages->next;
 	}
 
-	/* Update the GConf list in case we used a default language. */
-	spell_language_save (prefs);
-
-	g_slist_free (active_languages);
+	g_list_free (active_languages);
 
 	key = "/apps/evolution/mail/composer/spell_color";
 	string = gconf_client_get_string (client, key, NULL);
@@ -945,6 +917,12 @@
 		gtk_widget_set_sensitive (widget, FALSE);
 	gconf_bridge_bind_property (bridge, key, G_OBJECT (widget), "active");
 
+	key = "/apps/evolution/mail/composer/outlook_filenames";
+	widget = glade_xml_get_widget (gui, "chkOutlookFilenames");
+	if (!gconf_client_key_is_writable (client, key, NULL))
+		gtk_widget_set_sensitive (widget, FALSE);
+	gconf_bridge_bind_property (bridge, key, G_OBJECT (widget), "active");
+
 	key = "/apps/evolution/mail/composer/top_signature";
 	widget = glade_xml_get_widget (gui, "chkTopSignature");
 	if (!gconf_client_key_is_writable (client, key, NULL))

Modified: branches/kill-bonobo/mail/em-folder-view.c
==============================================================================
--- branches/kill-bonobo/mail/em-folder-view.c	(original)
+++ branches/kill-bonobo/mail/em-folder-view.c	Mon Nov 24 05:14:44 2008
@@ -2901,7 +2901,6 @@
 	case EMFV_HEADERS: {
 		GSList *header_config_list, *p;
 		EMFormat *emf = (EMFormat *)emfv->preview;
-		int added_headers = 0;
 
 		header_config_list = gconf_client_get_list(gconf, "/apps/evolution/mail/display/headers", GCONF_VALUE_STRING, NULL);
       		em_format_clear_headers((EMFormat *)emfv->preview);
@@ -2913,15 +2912,12 @@
 			h = em_mailer_prefs_header_from_xml(xml);
 			if (h && h->enabled) {
 				em_format_add_header(emf, h->name, EM_FORMAT_HEADER_BOLD);
-				added_headers++;
 			}
 			em_mailer_prefs_header_free(h);
 			p = g_slist_next(p);
 		}
 		g_slist_foreach(header_config_list, (GFunc) g_free, NULL);
 		g_slist_free(header_config_list);
-		if (added_headers == 0)
-			em_format_default_headers(emf);
 		/* force a redraw */
 		if (emf->message)
 			em_format_redraw(emf);

Modified: branches/kill-bonobo/mail/em-format-html.c
==============================================================================
--- branches/kill-bonobo/mail/em-format-html.c	(original)
+++ branches/kill-bonobo/mail/em-format-html.c	Mon Nov 24 05:14:44 2008
@@ -1891,22 +1891,23 @@
 			g_free(name);
 		} else if (!g_ascii_strcasecmp (header->name, "X-Evolution-Mail-From-Delegate")) {
 			mail_from_delegate = TRUE;
-		} else if (header_sender && header_from && mail_from_delegate) {
-			camel_stream_printf(stream, "<tr><td><table border=1 width=\"100%%\" cellspacing=2 cellpadding=2><tr>");
-			if(gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
-				camel_stream_printf (stream, "<td align=\"right\" width=\"100%%\">");
-			else
-				camel_stream_printf (stream, "<td align=\"left\" width=\"100%%\">");
-			/* To translators: This message suggests to the receipients that the sender of the mail is
-			   different from the one listed in From field.
-			*/
-			camel_stream_printf(stream, _("This message was sent by <b>%s</b> on behalf of <b>%s</b>"), header_sender, header_from);
-			camel_stream_printf(stream, "</td></tr></table></td></tr>");
-			break;
 		}
 
 		header = header->next;
 	}
+	
+	if (header_sender && header_from && mail_from_delegate) {
+		camel_stream_printf(stream, "<tr><td><table border=1 width=\"100%%\" cellspacing=2 cellpadding=2><tr>");
+		if(gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
+			camel_stream_printf (stream, "<td align=\"right\" width=\"100%%\">");
+		else
+			camel_stream_printf (stream, "<td align=\"left\" width=\"100%%\">");
+		/* To translators: This message suggests to the receipients that the sender of the mail is
+		   different from the one listed in From field.
+		*/
+		camel_stream_printf(stream, _("This message was sent by <b>%s</b> on behalf of <b>%s</b>"), header_sender, header_from);
+		camel_stream_printf(stream, "</td></tr></table></td></tr>");
+	}
 
 	g_free (header_sender);
 	g_free (header_from);
@@ -1918,7 +1919,7 @@
 
 	/* dump selected headers */
 	h = (EMFormatHeader *)emf->header_list.head;
-	if (h->next == NULL || emf->mode == EM_FORMAT_ALLHEADERS) {
+	if (emf->mode == EM_FORMAT_ALLHEADERS) {
 		header = ((CamelMimePart *)part)->headers;
 		while (header) {
 			efh_format_header(emf, stream, part, header, EM_FORMAT_HTML_HEADER_NOCOLUMNS, charset);

Modified: branches/kill-bonobo/mail/evolution-mail.schemas.in
==============================================================================
--- branches/kill-bonobo/mail/evolution-mail.schemas.in	(original)
+++ branches/kill-bonobo/mail/evolution-mail.schemas.in	Mon Nov 24 05:14:44 2008
@@ -186,6 +186,20 @@
     </schema>
 
     <schema>
+      <key>/schemas/apps/evolution/mail/composer/outlook_filenames</key>
+      <applyto>/apps/evolution/mail/composer/outlook_filenames</applyto>
+      <owner>evolution-mail</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+         <short>Encode file names in an Outlook/GMail way</short>
+         <long>
+          Encode file names in the mail headers same as Outlook or GMail does, to let them understand localized file names sent by Evolution, because they do not follow the RFC 2231, but uses incorrect RFC 2047 standard.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/evolution/mail/composer/width</key>
       <applyto>/apps/evolution/mail/composer/width</applyto>
       <owner>evolution-mail</owner>
@@ -232,9 +246,9 @@
       <type>bool</type>
       <default>false</default>
       <locale name="C">
-         <short>Disable or enable ellipsizing of folder names in folder tree</short>
+         <short>Disable or enable ellipsizing of folder names in side bar</short>
          <long>
-           Whether disable ellipsizing feature of folder names in folder tree.
+           Whether disable ellipsizing feature of folder names in side bar.
          </long>
       </locale>
     </schema>

Modified: branches/kill-bonobo/mail/filtertypes.xml
==============================================================================
--- branches/kill-bonobo/mail/filtertypes.xml	(original)
+++ branches/kill-bonobo/mail/filtertypes.xml	Mon Nov 24 05:14:44 2008
@@ -283,7 +283,109 @@
    </input>
    <input type="address" name="recipient"/>
  </part>
- 
+
+ <part name="senderto">
+   <title>Sender or Recipients</title>
+   <input type="optionlist" name="recipient-type">
+    <option value="contains">
+     <title>contains</title>
+     <code>
+	(match-all (or (header-contains "From" ${recipient})
+	    	       (header-contains "To" ${recipient})
+	    	       (header-contains "Cc" ${recipient})
+	    	       (header-contains "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="not contains">
+     <title>does not contain</title>
+     <code>
+	(match-all (not (or
+               (header-contains "From" ${recipient})
+	       (header-contains "To" ${recipient})
+	       (header-contains "Cc" ${recipient})
+	       (header-contains "Bcc" ${recipient}))))
+     </code>
+    </option>
+    <option value="is">
+     <title>is</title>
+     <code>
+	(match-all (or (header-matches "From" ${recipient})
+	    	       (header-matches "To" ${recipient})
+	    	       (header-matches "Cc" ${recipient})
+	    	       (header-matches "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="is not">
+     <title>is not</title>
+     <code>
+	(match-all (not (or
+               (header-matches "From" ${recipient})
+               (header-matches "To" ${recipient})
+	       (header-matches "Cc" ${recipient})
+	       (header-matches "Bcc" ${recipient}))))
+     </code>
+    </option>
+    <option value="starts with">
+     <title>starts with</title>
+     <code>
+        (match-all (or (header-starts-with "From" ${recipient})
+	    	       (header-starts-with "To" ${recipient})
+	    	       (header-starts-with "Cc" ${recipient})
+	    	       (header-starts-with "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="not starts with">
+     <title>does not start with</title>
+     <code>
+        (match-all (not (or
+               (header-starts-with "From" ${recipient})
+               (header-starts-with "To" ${recipient})
+	       (header-starts-with "Cc" ${recipient})
+	       (header-starts-with "Bcc" ${recipient}))))
+     </code>
+    </option>
+    <option value="ends with">
+     <title>ends with</title>
+     <code>
+        (match-all (or (header-ends-with "From" ${recipient})
+	    	       (header-ends-with "To" ${recipient})
+	    	       (header-ends-with "Cc" ${recipient})
+	    	       (header-ends-with "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="not ends with">
+     <title>does not end with</title>
+     <code>
+        (match-all (not (or
+               (header-ends-with "From" ${recipient})
+               (header-ends-with "To" ${recipient})
+	       (header-ends-with "Cc" ${recipient})
+	       (header-ends-with "Bcc" ${recipient}))))
+     </code>
+    </option>
+    <option value="matches soundex">
+     <title>sounds like</title>
+     <code>
+	(match-all (or (header-soundex "From" ${recipient})
+	    	       (header-soundex "To" ${recipient})
+	    	       (header-soundex "Cc" ${recipient})
+	    	       (header-soundex "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="not match soundex">
+     <title>does not sound like</title>
+     <code>
+	(match-all (not (or
+               (header-soundex "From" ${recipient})
+               (header-soundex "To" ${recipient})
+	       (header-soundex "Cc" ${recipient})
+	       (header-soundex "Bcc" ${recipient}))))
+     </code>
+    </option>
+   </input>
+   <input type="address" name="recipient"/>
+ </part>
+
  <part name="subject">
    <title>Subject</title>
    <input type="optionlist" name="subject-type">

Modified: branches/kill-bonobo/mail/mail-config.c
==============================================================================
--- branches/kill-bonobo/mail/mail-config.c	(original)
+++ branches/kill-bonobo/mail/mail-config.c	Mon Nov 24 05:14:44 2008
@@ -249,6 +249,22 @@
 }
 
 static void
+gconf_outlook_filenames_changed (GConfClient *client, guint cnxn_id,
+				 GConfEntry *entry, gpointer user_data)
+{
+	extern int camel_header_param_encode_filenames_in_rfc_2047;
+
+	g_return_if_fail (client != NULL);
+
+	/* pass option to the camel */
+	if (gconf_client_get_bool (client, "/apps/evolution/mail/composer/outlook_filenames", NULL)) {
+		camel_header_param_encode_filenames_in_rfc_2047 = 1;
+	} else {
+		camel_header_param_encode_filenames_in_rfc_2047 = 0;
+	}
+}
+
+static void
 gconf_jh_check_changed (GConfClient *client, guint cnxn_id,
 		     GConfEntry *entry, gpointer user_data)
 {
@@ -370,6 +386,12 @@
 	gconf_client_notify_add (
 		config->gconf, key, func, NULL, NULL, NULL);
 
+	key = "/apps/evolution/mail/composer/outlook_filenames";
+	func = (GConfClientNotifyFunc) gconf_outlook_filenames_changed;
+	gconf_outlook_filenames_changed (config->gconf, 0, NULL, NULL);
+	gconf_client_notify_add (
+		config->gconf, key, func, NULL, NULL, NULL);
+
 	/* Display Configuration */
 
 	gconf_client_add_dir (
@@ -782,48 +804,49 @@
 EAccount *
 mail_config_get_account_by_source_url (const char *source_url)
 {
-	CamelProvider *provider;
-	EAccount *account;
-	CamelURL *source;
+	EAccount *account = NULL;
 	EIterator *iter;
 
 	g_return_val_if_fail (source_url != NULL, NULL);
 
-	provider = camel_provider_get(source_url, NULL);
-	if (!provider)
-		return NULL;
-
-	source = camel_url_new (source_url, NULL);
-	if (!source)
-		return NULL;
-
 	iter = e_list_get_iterator ((EList *) config->accounts);
 	while (e_iterator_is_valid (iter)) {
+		CamelURL *url;
+		gchar *string;
+
 		account = (EAccount *) e_iterator_get (iter);
 
-		if (account->source && account->source->url && account->source->url[0]) {
-			CamelURL *url;
+		e_iterator_next (iter);
+
+		if (account->source == NULL)
+			continue;
 
-			url = camel_url_new (account->source->url, NULL);
-			if (url && provider->url_equal (url, source)) {
-				camel_url_free (url);
-				camel_url_free (source);
-				g_object_unref (iter);
+		else if (account->source->url == NULL)
+			continue;
 
-				return account;
-			}
+		else if (*account->source->url == '\0')
+			continue;
 
-			if (url)
-				camel_url_free (url);
-		}
+		url = camel_url_new (account->source->url, NULL);
+		if (url == NULL)
+			continue;
 
-		e_iterator_next (iter);
+		/* Simplify the account URL for comparison. */
+		string = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
+		if (string == NULL || strcmp (string, source_url) != 0)
+			account = NULL;  /* not a match */
+
+		camel_url_free (url);
+		g_free (string);
+
+		if (account != NULL) {
+			g_object_unref (iter);
+			return account;
+		}
 	}
 
 	g_object_unref (iter);
 
-	camel_url_free (source);
-
 	return NULL;
 }
 

Modified: branches/kill-bonobo/mail/mail-config.glade
==============================================================================
--- branches/kill-bonobo/mail/mail-config.glade	(original)
+++ branches/kill-bonobo/mail/mail-config.glade	Mon Nov 24 05:14:44 2008
@@ -7124,6 +7124,25 @@
 			  </child>
 
 			  <child>
+			    <widget class="GtkCheckButton" id="chkOutlookFilenames">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Encode file names in an Outlook/GMail way</property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
+			      <property name="active">False</property>
+			      <property name="inconsistent">False</property>
+			      <property name="draw_indicator">True</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
 			    <widget class="GtkTable" id="tableForwardsReplies">
 			      <property name="visible">True</property>
 			      <property name="n_rows">3</property>

Modified: branches/kill-bonobo/mail/mail-vfolder.c
==============================================================================
--- branches/kill-bonobo/mail/mail-vfolder.c	(original)
+++ branches/kill-bonobo/mail/mail-vfolder.c	Mon Nov 24 05:14:44 2008
@@ -267,6 +267,11 @@
 		g_warning("Folder '%s' disappeared while I was adding/remove it to/from my vfolder", m->uri);
 		return;
 	}
+	if (strncmp(m->uri, "vfolder:/", 9) == 0 ||
+		strncmp(m->uri, "email://vfolder local", 21) == 0) {
+		printf("Ignoring loading vfolder as a subfolder \n");
+		return;
+	}
 
 	if (folder == NULL)
 		folder = mail_tool_uri_to_folder (m->uri, 0, &m->base.ex);

Modified: branches/kill-bonobo/mail/vfoldertypes.xml
==============================================================================
--- branches/kill-bonobo/mail/vfoldertypes.xml	(original)
+++ branches/kill-bonobo/mail/vfoldertypes.xml	Mon Nov 24 05:14:44 2008
@@ -115,6 +115,89 @@
    <input type="address" name="recipient"/>
  </part>
 
+ <part name="senderto">
+   <title>Sender or Recipients</title>
+   <input type="optionlist" name="recipient-type">
+    <option value="contains">
+     <title>contains</title>
+     <code>
+	(match-all (or (header-contains "From" ${recipient})
+	               (header-contains "To" ${recipient})
+	               (header-contains "Cc" ${recipient})
+	               (header-contains "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="not contains">
+     <title>does not contain</title>
+     <code>
+	(match-all (not (or
+                          (header-contains "From" ${recipient})
+                          (header-contains "To" ${recipient})
+                          (header-contains "Cc" ${recipient})
+	                  (header-contains "Bcc" ${recipient}))))
+     </code>
+    </option>
+    <option value="is">
+     <title>is</title>
+     <code>
+	(match-all (or (header-matches "From" ${recipient})
+	    	       (header-matches "To" ${recipient})
+	    	       (header-matches "Cc" ${recipient})
+	    	       (header-matches "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="is not">
+     <title>is not</title>
+     <code>
+	(match-all (not (or
+               (header-matches "From" ${recipient})
+               (header-matches "To" ${recipient})
+               (header-matches "Cc" ${recipient})
+	       (header-matches "Bcc" ${recipient}))))
+     </code>
+    </option>
+    <option value="starts with">
+     <title>starts with</title>
+     <code>
+        (match-all (or (header-starts-with "From" ${recipient})
+	    	       (header-starts-with "To" ${recipient})
+	    	       (header-starts-with "Cc" ${recipient})
+	    	       (header-starts-with "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="not starts with">
+     <title>does not start with</title>
+     <code>
+        (match-all (not (or
+               (header-starts-with "From" ${recipient})
+               (header-starts-with "To" ${recipient})
+               (header-starts-with "Cc" ${recipient})
+	       (header-starts-with "Bcc" ${recipient}))))
+     </code>
+    </option>
+    <option value="ends with">
+     <title>ends with</title>
+     <code>
+        (match-all (or (header-ends-with "From" ${recipient})
+	    	       (header-ends-with "To" ${recipient})
+	    	       (header-ends-with "Cc" ${recipient})
+	    	       (header-ends-with "Bcc" ${recipient})))
+     </code>
+    </option>
+    <option value="not ends with">
+     <title>does not end with</title>
+     <code>
+        (match-all (not (or
+               (header-ends-with "From" ${recipient})
+               (header-ends-with "To" ${recipient})
+               (header-ends-with "Cc" ${recipient})
+	       (header-ends-with "Bcc" ${recipient}))))
+     </code>
+    </option>
+   </input>
+   <input type="address" name="recipient"/>
+ </part>
+
  <part name="subject">
    <title>Subject</title>
    <input type="optionlist" name="subject-type">

Modified: branches/kill-bonobo/plugins/exchange-operations/exchange-folder.c
==============================================================================
--- branches/kill-bonobo/plugins/exchange-operations/exchange-folder.c	(original)
+++ branches/kill-bonobo/plugins/exchange-operations/exchange-folder.c	Mon Nov 24 05:14:44 2008
@@ -223,7 +223,7 @@
 
 	g_free (path);
 
-	if (!sub_folder)
+	if (!sub_folder || !g_strrstr(sub_folder, "/"))
 		return;
 
         for (i = 0; i < sizeof (popup_inbox_items) / sizeof (popup_inbox_items[0]); i++)

Modified: branches/kill-bonobo/plugins/folder-unsubscribe/org-gnome-mail-folder-unsubscribe.eplug.xml
==============================================================================
--- branches/kill-bonobo/plugins/folder-unsubscribe/org-gnome-mail-folder-unsubscribe.eplug.xml	(original)
+++ branches/kill-bonobo/plugins/folder-unsubscribe/org-gnome-mail-folder-unsubscribe.eplug.xml	Mon Nov 24 05:14:44 2008
@@ -6,7 +6,7 @@
 		domain="@GETTEXT_PACKAGE@"
 		_name="Unsubscribe Folders"
 		location="@PLUGINDIR@/liborg-gnome-mail-folder-unsubscribe SOEXT@">
-		<_description>Allows unsubscribing of mail folders in the folder tree context menu.</_description>
+		<_description>Allows unsubscribing of mail folders in the side bar context menu.</_description>
 		<author name="Jeffrey Stedfast" email="fejj novell com"/>
 
 		<hook class="org.gnome.evolution.mail.popup:1.0">

Modified: branches/kill-bonobo/plugins/google-account-setup/google-contacts-source.c
==============================================================================
--- branches/kill-bonobo/plugins/google-account-setup/google-contacts-source.c	(original)
+++ branches/kill-bonobo/plugins/google-account-setup/google-contacts-source.c	Mon Nov 24 05:14:44 2008
@@ -218,6 +218,12 @@
     g_free (value_string);
 }
 
+static void
+destroy_ui_data(gpointer data)
+{
+	gtk_widget_destroy((GtkWidget *)data);
+}
+
 GtkWidget *
 plugin_google_contacts (EPlugin                    *epl,
                         EConfigHookItemFactoryData *data)
@@ -254,6 +260,9 @@
 
     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;
     }
@@ -337,6 +346,9 @@
 
     g_object_set_data (G_OBJECT (interval_sb), "interval-combo", interval_combo);
     g_object_set_data (G_OBJECT (interval_combo), "interval-sb", interval_sb);
+
+    g_object_set_data_full(G_OBJECT(epl), "widget", vbox2,
+			destroy_ui_data);
     g_signal_connect (G_OBJECT (username_entry), "changed",
                       G_CALLBACK (on_username_entry_changed),
                       source);

Modified: branches/kill-bonobo/plugins/google-account-setup/google-source.c
==============================================================================
--- branches/kill-bonobo/plugins/google-account-setup/google-source.c	(original)
+++ branches/kill-bonobo/plugins/google-account-setup/google-source.c	Mon Nov 24 05:14:44 2008
@@ -435,10 +435,7 @@
 	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;
-	}
+	g_return_if_fail (username != NULL && *username != '\0');
 
 	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, 
@@ -553,6 +550,18 @@
 	g_object_unref (service);
 }
 
+static void
+retrieve_list_sensitize (GtkEntry *username_entry,
+                         GtkWidget *button)
+{
+	const gchar *text;
+	gboolean sensitive;
+
+	text = gtk_entry_get_text (username_entry);
+	sensitive = (text != NULL && *text != '\0');
+	gtk_widget_set_sensitive (button, sensitive);
+}
+
 GtkWidget *
 plugin_google  (EPlugin                    *epl,
 	     EConfigHookItemFactoryData *data)
@@ -727,8 +736,10 @@
 	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_signal_connect (user, "changed", G_CALLBACK (retrieve_list_sensitize), label);
 	g_object_set_data (G_OBJECT (label), "ESource", source);
 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+	gtk_widget_set_sensitive (label, FALSE);
 
 	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);

Modified: branches/kill-bonobo/plugins/groupwise-account-setup/camel-gw-listener.c
==============================================================================
--- branches/kill-bonobo/plugins/groupwise-account-setup/camel-gw-listener.c	(original)
+++ branches/kill-bonobo/plugins/groupwise-account-setup/camel-gw-listener.c	Mon Nov 24 05:14:44 2008
@@ -559,7 +559,7 @@
 
 	url = camel_url_new (info->source_url, NULL);
 
-	color = g_strdup_printf ("%u",  g_random_int_range (0x100000, 0xffffaa));
+	color = g_strdup_printf ("#%06X",  g_random_int_range (0x100000, 0xffffaa));
 	/* The above range is chosen so that the colors are neither too light nor too dark
 	and appealing in all the themes */
 

Modified: branches/kill-bonobo/plugins/groupwise-features/status-track.c
==============================================================================
--- branches/kill-bonobo/plugins/groupwise-features/status-track.c	(original)
+++ branches/kill-bonobo/plugins/groupwise-features/status-track.c	Mon Nov 24 05:14:44 2008
@@ -79,8 +79,6 @@
 
 	gchar *boldmsg;
 
-	const char *status = NULL ;
-
 	int row = 0;
 
 	EGwConnection *cnc;
@@ -93,14 +91,6 @@
 		return ;
 	}
 
-	status = camel_medium_get_header ( CAMEL_MEDIUM(msg), "X-gw-status-opt") ;
-	if (!status) {
-		g_print ("Error!! No header\n");
-		/* No need to make any call if this header is not available.
-		This is the server side identifier for sent-items */
-		return ;
-	}
-
 	/*Create the dialog*/
 	d = (GtkDialog *) gtk_dialog_new ();
 	gtk_dialog_add_button (d, GTK_STOCK_OK, GTK_RESPONSE_OK);

Modified: branches/kill-bonobo/plugins/itip-formatter/itip-formatter.c
==============================================================================
--- branches/kill-bonobo/plugins/itip-formatter/itip-formatter.c	(original)
+++ branches/kill-bonobo/plugins/itip-formatter/itip-formatter.c	Mon Nov 24 05:14:44 2008
@@ -686,9 +686,12 @@
 		
 		/*
 		 * Only allow replies if backend doesn't do that automatically.
+                 * Only enable it for forwarded invitiations (PUBLISH) or direct
+                 * invitiations (REQUEST), but not replies (REPLY).
 		 * Replies only make sense for events with an organizer.
 		 */
 		if (!e_cal_get_static_capability (ecal, CAL_STATIC_CAPABILITY_SAVE_SCHEDULES) &&
+                    (pitip->method == ICAL_METHOD_PUBLISH || pitip->method ==  ICAL_METHOD_REQUEST) &&
 		    pitip->has_organizer) {
 			rsvp_enabled = TRUE;
 		}

Modified: branches/kill-bonobo/plugins/mail-notification/mail-notification.c
==============================================================================
--- branches/kill-bonobo/plugins/mail-notification/mail-notification.c	(original)
+++ branches/kill-bonobo/plugins/mail-notification/mail-notification.c	Mon Nov 24 05:14:44 2008
@@ -56,6 +56,7 @@
 
 static gboolean enabled = FALSE;
 static GtkWidget *get_cfg_widget (void);
+static GStaticMutex mlock = G_STATIC_MUTEX_INIT;
 
 /**
  * each part should "implement" its own "public" functions:
@@ -441,6 +442,26 @@
 	g_object_unref (menu);
 }
 
+#ifdef HAVE_LIBNOTIFY
+static void 
+notifyActionCallback (NotifyNotification *n, gchar *label, gpointer a)
+{
+	g_static_mutex_lock (&mlock);
+	
+	gtk_status_icon_set_visible (status_icon, FALSE);
+	g_object_unref (status_icon);
+
+	if (blink_timeout_id) {
+		g_source_remove (blink_timeout_id);
+		blink_timeout_id = 0;
+	}
+
+	status_icon = NULL;
+	status_count = 0;	
+	g_static_mutex_unlock (&mlock);
+}
+#endif
+
 static void
 new_notify_status (EMEventTargetFolder *t)
 {
@@ -487,6 +508,7 @@
 
 			notify_notification_set_urgency (notify, NOTIFY_URGENCY_NORMAL);
 			notify_notification_set_timeout (notify, NOTIFY_EXPIRES_DEFAULT);
+			notify_notification_add_action(notify, "default", "Default", notifyActionCallback, NULL, NULL);
 			g_timeout_add (500, notification_callback, notify);
 		}
 	}
@@ -835,7 +857,6 @@
 int e_plugin_lib_enable (EPluginLib *ep, int enable);
 GtkWidget *e_plugin_lib_get_configure_widget (EPlugin *epl);
 
-static GStaticMutex mlock = G_STATIC_MUTEX_INIT;
 
 void
 org_gnome_mail_new_notify (EPlugin *ep, EMEventTargetFolder *t)

Modified: branches/kill-bonobo/shell/main.c
==============================================================================
--- branches/kill-bonobo/shell/main.c	(original)
+++ branches/kill-bonobo/shell/main.c	Mon Nov 24 05:14:44 2008
@@ -84,12 +84,17 @@
 #define SKIP_WARNING_DIALOG_KEY \
 	"/apps/evolution/shell/skip_warning_dialog"
 
+/* STABLE_VERSION is only defined for development versions. */
+#ifdef STABLE_VERSION
+#define DEVELOPMENT 1
+#endif
+
 /* Command-line options.  */
 static gboolean start_online = FALSE;
 static gboolean start_offline = FALSE;
 static gboolean setup_only = FALSE;
 static gboolean force_shutdown = FALSE;
-#if DEVELOPMENT
+#ifdef DEVELOPMENT
 static gboolean force_migrate = FALSE;
 #endif
 static gboolean disable_eplugin = FALSE;
@@ -163,7 +168,7 @@
 #endif
 
 
-#if DEVELOPMENT
+#ifdef DEVELOPMENT
 
 /* Warning dialog to scare people off a little bit.  */
 
@@ -211,7 +216,7 @@
                   "\n"
 		  "We hope that you enjoy the results of our hard work, and we\n"
 		  "eagerly await your contributions!\n"),
-		"2.22.1");
+		STABLE_VERSION);
 	label = gtk_label_new (text);
 	g_free(text);
 
@@ -394,7 +399,7 @@
 	{ "force-shutdown", '\0', 0, G_OPTION_ARG_NONE, &force_shutdown,
 	  N_("Forcibly shut down all Evolution components"), NULL },
 #endif
-#if DEVELOPMENT
+#ifdef DEVELOPMENT
 	{ "force-migrate", '\0', 0, G_OPTION_ARG_NONE, &force_migrate,
 	  N_("Forcibly re-migrate from Evolution 1.4"), NULL },
 #endif
@@ -543,7 +548,7 @@
 #endif
 
 	GConfClient *client;
-#if DEVELOPMENT
+#ifdef DEVELOPMENT
 	gboolean skip_warning_dialog;
 #endif
 	GnomeProgram *program;
@@ -601,7 +606,7 @@
 
 	client = gconf_client_get_default ();
 
-#if DEVELOPMENT
+#ifdef DEVELOPMENT
 	if (force_migrate)
 		destroy_config (client);
 #endif
@@ -651,7 +656,7 @@
 		e_plugin_load_plugins ();
 	}
 
-#if DEVELOPMENT
+#ifdef DEVELOPMENT
 	skip_warning_dialog = gconf_client_get_bool (
 		client, SKIP_WARNING_DIALOG_KEY, NULL);
 

Modified: branches/kill-bonobo/widgets/table/e-table-defines.h
==============================================================================
--- branches/kill-bonobo/widgets/table/e-table-defines.h	(original)
+++ branches/kill-bonobo/widgets/table/e-table-defines.h	Mon Nov 24 05:14:44 2008
@@ -33,7 +33,7 @@
 #define GROUP_INDENT         (BUTTON_HEIGHT + (BUTTON_PADDING * 2))
 
 /* Padding around the contents of a header button */
-#define HEADER_PADDING 1
+#define HEADER_PADDING 3
 
 #define MIN_ARROW_SIZE 10
 

Modified: branches/kill-bonobo/widgets/table/e-table-header-utils.c
==============================================================================
--- branches/kill-bonobo/widgets/table/e-table-header-utils.c	(original)
+++ branches/kill-bonobo/widgets/table/e-table-header-utils.c	Mon Nov 24 05:14:44 2008
@@ -463,7 +463,7 @@
 	} else {
 		e_table_draw_elided_string (drawable, gc, widget,
 					    inner_x, inner_y,
-					    layout, ecol->text, inner_width, TRUE);
+					    layout, ecol->text, inner_width, FALSE);
 	}
 
 	g_object_unref (layout);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]