patches/evolution-05-e-sort-callback.diff
author yippi
Mon, 27 Sep 2010 21:07:51 +0000
changeset 20108 51df67ca9307
parent 20053 50e2f1cd7c78
permissions -rw-r--r--
I had these modules listed as being owned by me, but they are really owned by wangke, correcting.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20051
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     1
--- evolution-2.30.2/widgets/table/e-table-extras.c.orig	2010-09-13 10:32:58.597227009 +0800
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     2
+++ evolution-2.30.2/widgets/table/e-table-extras.c	2010-09-13 10:33:05.421403470 +0800
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     3
@@ -156,6 +156,129 @@
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     4
 		return FALSE;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     5
 }
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     6
 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     7
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     8
+/**
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
     9
+ * g_utf8_collate_key_1:
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    10
+ * @str: a UTF-8 encoded string.
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    11
+ * @len: length of @str, in bytes, or -1 if @str is nul-terminated.
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    12
+ *
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    13
+ * Converts a string into a collation key that can be compared
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    14
+ * with other collation keys produced by the same function using 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    15
+ * strcmp(). 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    16
+ *
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    17
+ * The results of comparing the collation keys of two strings 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    18
+ * with strcmp() will always be the same as comparing the two 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    19
+ * original keys with g_utf8_collate().
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    20
+ * 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    21
+ * Note that this function depends on the 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    22
+ * <link linkend="setlocale">current locale</link>.
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    23
+ * 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    24
+ * Return value: a newly allocated string. This string should
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    25
+ *   be freed with g_free() when you are done with it.
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    26
+ **/
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    27
+gchar *
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    28
+g_utf8_collate_key_1 (const gchar *str,
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    29
+		    gssize       len)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    30
+{
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    31
+  gchar *result;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    32
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    33
+#ifdef HAVE_CARBON
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    34
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    35
+  g_return_val_if_fail (str != NULL, NULL);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    36
+  result = carbon_collate_key (str, len);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    37
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    38
+#elif defined(__STDC_ISO_10646__)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    39
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    40
+  gsize xfrm_len;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    41
+  gunichar *str_norm;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    42
+  wchar_t *result_wc;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    43
+  gsize i;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    44
+  gsize result_len = 0;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    45
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    46
+  g_return_val_if_fail (str != NULL, NULL);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    47
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    48
+  str_norm = _g_utf8_normalize_wc (str, len, G_NORMALIZE_ALL_COMPOSE);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    49
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    50
+  xfrm_len = wcsxfrm (NULL, (wchar_t *)str_norm, 0);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    51
+  result_wc = g_new (wchar_t, xfrm_len + 1);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    52
+  wcsxfrm (result_wc, (wchar_t *)str_norm, xfrm_len + 1);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    53
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    54
+  for (i=0; i < xfrm_len; i++)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    55
+    result_len += utf8_encode (NULL, result_wc[i]);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    56
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    57
+  result = g_malloc (result_len + 1);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    58
+  result_len = 0;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    59
+  for (i=0; i < xfrm_len; i++)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    60
+    result_len += utf8_encode (result + result_len, result_wc[i]);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    61
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    62
+  result[result_len] = '\0';
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    63
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    64
+  g_free (result_wc);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    65
+  g_free (str_norm);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    66
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    67
+  return result;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    68
+#else /* !__STDC_ISO_10646__ */
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    69
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    70
+  gsize xfrm_len;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    71
+  const gchar *charset;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    72
+  gchar *str_norm;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    73
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    74
+  g_return_val_if_fail (str != NULL, NULL);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    75
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    76
+  str_norm = g_utf8_normalize (str, len, G_NORMALIZE_ALL_COMPOSE);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    77
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    78
+  result = NULL;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    79
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    80
+  if (g_get_charset (&charset))
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    81
+    {
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    82
+      if (str_norm)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    83
+	      xfrm_len = strxfrm (NULL, str_norm, 0);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    84
+      else xfrm_len = 0;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    85
+      if (xfrm_len >= 0 && xfrm_len < G_MAXINT - 2)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    86
+        {
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    87
+          result = g_malloc (xfrm_len + 1);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    88
+          if (str_norm)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    89
+		  strxfrm (result, str_norm, xfrm_len + 1);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    90
+        }
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    91
+    }
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    92
+  else
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    93
+    {
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    94
+      gchar *str_locale = g_convert (str_norm, -1, charset, "UTF-8", NULL, NULL, NULL);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    95
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    96
+      if (str_locale)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    97
+	{
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    98
+	  xfrm_len = strxfrm (NULL, str_locale, 0);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
    99
+	  if (xfrm_len < 0 || xfrm_len >= G_MAXINT - 2)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   100
+	    {
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   101
+	      g_free (str_locale);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   102
+	      str_locale = NULL;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   103
+	    }
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   104
+	}
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   105
+      if (str_locale)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   106
+	{
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   107
+	  result = g_malloc (xfrm_len + 2);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   108
+	  result[0] = 'A';
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   109
+	  strxfrm (result + 1, str_locale, xfrm_len + 1);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   110
+	  
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   111
+	  g_free (str_locale);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   112
+	}
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   113
+    }
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   114
+    
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   115
+  if (!result) 
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   116
+    {
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   117
+      xfrm_len = strlen (str_norm);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   118
+      result = g_malloc (xfrm_len + 2);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   119
+      result[0] = 'B';
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   120
+      memcpy (result + 1, str_norm, xfrm_len);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   121
+      result[xfrm_len+1] = '\0';
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   122
+    }
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   123
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   124
+  g_free (str_norm);
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   125
+#endif /* __STDC_ISO_10646__ */
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   126
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   127
+  return result;
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   128
+}
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   129
+
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   130
 static gint
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   131
 e_table_str_case_compare (gconstpointer x, gconstpointer y, gpointer cmp_cache)
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   132
 {
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   133
@@ -175,7 +298,7 @@
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   134
 		_cz = e_table_sorting_utils_lookup_cmp_cache (cmp_cache, _z);	\
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   135
 		if (!_cz) {							\
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   136
 			gchar *tmp = g_utf8_casefold (_z, -1);			\
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   137
-			_cz = g_utf8_collate_key (tmp, -1);			\
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   138
+			_cz = g_utf8_collate_key_1 (tmp, -1);			\
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   139
 			g_free (tmp);						\
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   140
 										\
abed7d046a45 2010-09-13 Jeff Cai <[email protected]>
qc161282
parents:
diff changeset
   141
 			e_table_sorting_utils_add_to_cmp_cache (		\