diff options
author | Milan Crha <mcrha@redhat.com> | 2014-05-24 00:57:12 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2014-05-24 00:57:12 +0800 |
commit | b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b (patch) | |
tree | 0bd4c7f004096cceae81a21d19c49bafab1b19e6 | |
parent | daee89cdda99b67fd985e90441df367e95bd1b3c (diff) | |
download | gsoc2013-evolution-b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b.tar gsoc2013-evolution-b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b.tar.gz gsoc2013-evolution-b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b.tar.bz2 gsoc2013-evolution-b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b.tar.lz gsoc2013-evolution-b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b.tar.xz gsoc2013-evolution-b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b.tar.zst gsoc2013-evolution-b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b.zip |
Bug #730199 - [MessageList] Support dates with value larger than 2^32
-rw-r--r-- | calendar/gui/e-memo-table.c | 4 | ||||
-rw-r--r-- | e-util/e-cell-date.c | 13 | ||||
-rw-r--r-- | e-util/e-table-extras.c | 12 | ||||
-rw-r--r-- | e-util/e-table-sorting-utils.c | 18 | ||||
-rw-r--r-- | mail/message-list.c | 62 | ||||
-rw-r--r-- | mail/message-list.etspec | 6 |
6 files changed, 89 insertions, 26 deletions
diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c index c71c22c233..092ea379f2 100644 --- a/calendar/gui/e-memo-table.c +++ b/calendar/gui/e-memo-table.c @@ -400,10 +400,6 @@ memo_table_constructed (GObject *object) cell = e_table_extras_get_cell (extras, "date"); e_cell_date_set_format_component (E_CELL_DATE (cell), "calendar"); - /* set proper format component for a default 'date' cell renderer */ - cell = e_table_extras_get_cell (extras, "date"); - e_cell_date_set_format_component (E_CELL_DATE (cell), "calendar"); - /* Construct the table */ etspecfile = g_build_filename ( diff --git a/e-util/e-cell-date.c b/e-util/e-cell-date.c index 973ae39196..610151a9a2 100644 --- a/e-util/e-cell-date.c +++ b/e-util/e-cell-date.c @@ -43,10 +43,12 @@ ecd_get_text (ECellText *cell, gint col, gint row) { - time_t date = GPOINTER_TO_INT (e_table_model_value_at (model, col, row)); + gint64 *pdate = e_table_model_value_at (model, col, row); const gchar *fmt_component, *fmt_part = NULL; + gchar *res; - if (date == 0) { + if (!pdate || *pdate == 0) { + e_table_model_free_value (model, col, pdate); return g_strdup (_("?")); } @@ -56,8 +58,11 @@ ecd_get_text (ECellText *cell, else fmt_part = "table"; - return e_datetime_format_format ( - fmt_component, fmt_part, DTFormatKindDateTime, date); + res = e_datetime_format_format (fmt_component, fmt_part, DTFormatKindDateTime, (time_t) *pdate); + + e_table_model_free_value (model, col, pdate); + + return res; } static void diff --git a/e-util/e-table-extras.c b/e-util/e-table-extras.c index b631dbd6e9..07f81ba44a 100644 --- a/e-util/e-table-extras.c +++ b/e-util/e-table-extras.c @@ -107,6 +107,15 @@ e_strint_compare (gconstpointer data1, return e_int_compare (GINT_TO_POINTER (int1), GINT_TO_POINTER (int2)); } +static gint +e_int64ptr_compare (gconstpointer data1, + gconstpointer data2) +{ + const gint64 *pa = data1, *pb = data2; + + return (*pa == *pb) ? 0 : (*pa < *pb) ? -1 : 1; +} + /* UTF-8 strncasecmp - not optimized */ static gint @@ -276,6 +285,9 @@ e_table_extras_init (ETableExtras *extras) e_table_extras_add_compare ( extras, "string-integer", (GCompareDataFunc) e_strint_compare); + e_table_extras_add_compare ( + extras, "pointer-integer64", + (GCompareDataFunc) e_int64ptr_compare); e_table_extras_add_search (extras, "string", e_string_search); diff --git a/e-util/e-table-sorting-utils.c b/e-util/e-table-sorting-utils.c index 494ebf4b7d..972a3fc2d2 100644 --- a/e-util/e-table-sorting-utils.c +++ b/e-util/e-table-sorting-utils.c @@ -391,6 +391,24 @@ e_table_sorting_utils_tree_sort (ETreeModel *source, map_table[i] = map_copy[map[i]]; } + for (j = 0; j < cols; j++) { + ETableColumnSpecification *spec; + ETableCol *col; + + spec = e_table_sort_info_sorting_get_nth ( + sort_info, j, &closure.sort_type[j]); + + col = e_table_header_get_column_by_spec (full_header, spec); + if (col == NULL) { + gint last = e_table_header_count (full_header) - 1; + col = e_table_header_get_column (full_header, last); + } + + for (i = 0; i < count; i++) { + e_tree_model_free_value (source, col->spec->compare_col, closure.vals[i * cols + j]); + } + } + g_free (map); g_free (map_copy); diff --git a/mail/message-list.c b/mail/message-list.c index 571788b6c1..72f4893063 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -1650,10 +1650,15 @@ ml_tree_value_at_ex (ETreeModel *etm, tag = camel_message_info_user_tag (msg_info, "due-by"); if (tag && *tag) { + gint64 *res; + due_by = camel_header_decode_date (tag, NULL); - return GINT_TO_POINTER (due_by); + res = g_new0 (gint64, 1); + *res = (gint64) due_by; + + return res; } else { - return GINT_TO_POINTER (0); + return NULL; } } case COL_FOLLOWUP_FLAG: @@ -1678,21 +1683,31 @@ ml_tree_value_at_ex (ETreeModel *etm, return (gpointer) get_normalised_string (message_list, msg_info, col); case COL_SENT: { struct LatestData ld; + gint64 *res; + ld.sent = TRUE; ld.latest = 0; for_node_and_subtree_if_collapsed (message_list, node, msg_info, latest_foreach, &ld); - return GINT_TO_POINTER (ld.latest); + res = g_new0 (gint64, 1); + *res = (gint64) ld.latest; + + return res; } case COL_RECEIVED: { struct LatestData ld; + gint64 *res; + ld.sent = FALSE; ld.latest = 0; for_node_and_subtree_if_collapsed (message_list, node, msg_info, latest_foreach, &ld); - return GINT_TO_POINTER (ld.latest); + res = g_new0 (gint64, 1); + *res = (gint64) ld.latest; + + return res; } case COL_TO: str = camel_message_info_to (msg_info); @@ -1850,17 +1865,18 @@ ml_tree_value_at_ex (ETreeModel *etm, } static gchar * -filter_date (time_t date) +filter_date (const gint64 *pdate) { time_t nowdate = time (NULL); - time_t yesdate; + time_t yesdate, date; struct tm then, now, yesterday; gchar buf[26]; gboolean done = FALSE; - if (date == 0) + if (!pdate || *pdate == 0) return g_strdup (_("?")); + date = (time_t) *pdate; localtime_r (&date, &then); localtime_r (&nowdate, &now); if (then.tm_mday == now.tm_mday && @@ -2913,6 +2929,7 @@ message_list_sort_value_at (ETreeModel *tree_model, { MessageList *message_list; struct LatestData ld; + gint64 *res; message_list = MESSAGE_LIST (tree_model); @@ -2930,7 +2947,11 @@ message_list_sort_value_at (ETreeModel *tree_model, e_tree_model_node_traverse ( tree_model, path, latest_foreach, &ld); - return GINT_TO_POINTER (ld.latest); + + res = g_new0 (gint64, 1); + *res = (gint64) ld.latest; + + return res; } static gpointer @@ -2965,12 +2986,9 @@ message_list_duplicate_value (ETreeModel *tree_model, case COL_ATTACHMENT: case COL_DELETED: case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: case COL_SIZE: case COL_FOLLOWUP_FLAG: case COL_FOLLOWUP_FLAG_STATUS: - case COL_FOLLOWUP_DUE_BY: return (gpointer) value; case COL_FROM: @@ -2984,6 +3002,20 @@ message_list_duplicate_value (ETreeModel *tree_model, case COL_LABELS: return g_strdup (value); + case COL_SENT: + case COL_RECEIVED: + case COL_FOLLOWUP_DUE_BY: + if (value) { + gint64 *res; + const gint64 *pvalue = value; + + res = g_new0 (gint64, 1); + *res = *pvalue; + + return res; + } else + return value; + default: g_return_val_if_reached (NULL); } @@ -3001,12 +3033,9 @@ message_list_free_value (ETreeModel *tree_model, case COL_ATTACHMENT: case COL_DELETED: case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: case COL_SIZE: case COL_FOLLOWUP_FLAG: case COL_FOLLOWUP_FLAG_STATUS: - case COL_FOLLOWUP_DUE_BY: case COL_FROM: case COL_FROM_NORM: case COL_TO: @@ -3023,6 +3052,9 @@ message_list_free_value (ETreeModel *tree_model, case COL_MIXED_SENDER: case COL_MIXED_RECIPIENTS: case COL_LABELS: + case COL_SENT: + case COL_RECEIVED: + case COL_FOLLOWUP_DUE_BY: g_free (value); break; @@ -3133,7 +3165,7 @@ message_list_value_to_string (ETreeModel *tree_model, case COL_SENT: case COL_RECEIVED: case COL_FOLLOWUP_DUE_BY: - return filter_date (GPOINTER_TO_INT (value)); + return filter_date (value); case COL_SIZE: return filter_size (GPOINTER_TO_INT (value)); diff --git a/mail/message-list.etspec b/mail/message-list.etspec index 8d2a10e821..efbf8c4811 100644 --- a/mail/message-list.etspec +++ b/mail/message-list.etspec @@ -11,9 +11,9 @@ <ETableColumn model_col="5" compare_col="21" _title="Subject" expansion="1.6" minimum_width="32" resizable="true" cell="render_tree" compare="string" search="string"/> - <ETableColumn model_col="6" _title="Date" expansion="0.4" minimum_width="32" resizable="true" cell="render_date" compare="integer"/> + <ETableColumn model_col="6" _title="Date" expansion="0.4" minimum_width="32" resizable="true" cell="render_date" compare="pointer-integer64"/> - <ETableColumn model_col="7" _title="Received" expansion="0.4" minimum_width="32" resizable="true" cell="render_date" compare="integer"/> + <ETableColumn model_col="7" _title="Received" expansion="0.4" minimum_width="32" resizable="true" cell="render_date" compare="pointer-integer64"/> <ETableColumn model_col="8" compare_col="22" _title="To" expansion="1.0" minimum_width="32" resizable="true" cell="render_text" compare="address_compare" search="string" priority="5"/> @@ -23,7 +23,7 @@ <ETableColumn model_col="11" _title="Follow Up Flag" expansion="0.2" minimum_width="32" resizable="true" cell="render_text" compare="collate"/> - <ETableColumn model_col="12" _title="Due By" expansion="0.2" minimum_width="32" resizable="true" cell="render_date" compare="integer"/> + <ETableColumn model_col="12" _title="Due By" expansion="0.2" minimum_width="32" resizable="true" cell="render_date" compare="pointer-integer64"/> <ETableColumn model_col="13" _title="Location" expansion="0.2" minimum_width="32" resizable="true" cell="render_text" compare="collate"/> |