diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2012-12-10 21:09:59 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2012-12-13 03:33:43 +0800 |
commit | d09d8de870b6697c8a8b262e7e077b871a69b315 (patch) | |
tree | 3b718882e7a0bb0a996daf2967a033d91714c9b5 /widgets/table/e-table-sorted.c | |
parent | b61331ed03ac1c7a9b8614e25510040b9c60ae02 (diff) | |
download | gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.tar gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.tar.gz gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.tar.bz2 gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.tar.lz gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.tar.xz gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.tar.zst gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.zip |
Consolidate base utility libraries into libeutil.
Evolution consists of entirely too many small utility libraries, which
increases linking and loading time, places a burden on higher layers of
the application (e.g. modules) which has to remember to link to all the
small in-tree utility libraries, and makes it difficult to generate API
documentation for these utility libraries in one Gtk-Doc module.
Merge the following utility libraries under the umbrella of libeutil,
and enforce a single-include policy on libeutil so we can reorganize
the files as desired without disrupting its pseudo-public API.
libemail-utils/libemail-utils.la
libevolution-utils/libevolution-utils.la
filter/libfilter.la
widgets/e-timezone-dialog/libetimezonedialog.la
widgets/menus/libmenus.la
widgets/misc/libemiscwidgets.la
widgets/table/libetable.la
widgets/text/libetext.la
This also merges libedataserverui from the Evolution-Data-Server module,
since Evolution is its only consumer nowadays, and I'd like to make some
improvements to those APIs without concern for backward-compatibility.
And finally, start a Gtk-Doc module for libeutil. It's going to be a
project just getting all the symbols _listed_ much less _documented_.
But the skeletal structure is in place and I'm off to a good start.
Diffstat (limited to 'widgets/table/e-table-sorted.c')
-rw-r--r-- | widgets/table/e-table-sorted.c | 330 |
1 files changed, 0 insertions, 330 deletions
diff --git a/widgets/table/e-table-sorted.c b/widgets/table/e-table-sorted.c deleted file mode 100644 index 31f0fa60b4..0000000000 --- a/widgets/table/e-table-sorted.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdlib.h> -#include <string.h> - -#include "e-util/e-util.h" - -#include "e-table-sorted.h" -#include "e-table-sorting-utils.h" - -#define d(x) - -#define INCREMENT_AMOUNT 100 - -/* workaround for avoding API breakage */ -#define ets_get_type e_table_sorted_get_type -G_DEFINE_TYPE (ETableSorted, ets, E_TYPE_TABLE_SUBSET) - -/* maximum insertions between an idle event that we will do without scheduling an idle sort */ -#define ETS_INSERT_MAX (4) - -static void ets_sort_info_changed (ETableSortInfo *info, ETableSorted *ets); -static void ets_sort (ETableSorted *ets); -static void ets_proxy_model_changed (ETableSubset *etss, ETableModel *source); -static void ets_proxy_model_row_changed (ETableSubset *etss, ETableModel *source, gint row); -static void ets_proxy_model_cell_changed (ETableSubset *etss, ETableModel *source, gint col, gint row); -static void ets_proxy_model_rows_inserted (ETableSubset *etss, ETableModel *source, gint row, gint count); -static void ets_proxy_model_rows_deleted (ETableSubset *etss, ETableModel *source, gint row, gint count); - -static void -ets_dispose (GObject *object) -{ - ETableSorted *ets = E_TABLE_SORTED (object); - - if (ets->sort_idle_id) - g_source_remove (ets->sort_idle_id); - ets->sort_idle_id = 0; - - if (ets->insert_idle_id) - g_source_remove (ets->insert_idle_id); - ets->insert_idle_id = 0; - - if (ets->sort_info) { - g_signal_handler_disconnect ( - ets->sort_info, - ets->sort_info_changed_id); - g_object_unref (ets->sort_info); - ets->sort_info = NULL; - } - - if (ets->full_header) - g_object_unref (ets->full_header); - ets->full_header = NULL; - - G_OBJECT_CLASS (ets_parent_class)->dispose (object); -} - -static void -ets_class_init (ETableSortedClass *class) -{ - ETableSubsetClass *etss_class = E_TABLE_SUBSET_CLASS (class); - GObjectClass *object_class = G_OBJECT_CLASS (class); - - etss_class->proxy_model_changed = ets_proxy_model_changed; - etss_class->proxy_model_row_changed = ets_proxy_model_row_changed; - etss_class->proxy_model_cell_changed = ets_proxy_model_cell_changed; - etss_class->proxy_model_rows_inserted = ets_proxy_model_rows_inserted; - etss_class->proxy_model_rows_deleted = ets_proxy_model_rows_deleted; - - object_class->dispose = ets_dispose; -} - -static void -ets_init (ETableSorted *ets) -{ - ets->full_header = NULL; - ets->sort_info = NULL; - - ets->sort_info_changed_id = 0; - - ets->sort_idle_id = 0; - ets->insert_count = 0; -} - -static gboolean -ets_sort_idle (ETableSorted *ets) -{ - g_object_ref (ets); - ets_sort (ets); - ets->sort_idle_id = 0; - ets->insert_count = 0; - g_object_unref (ets); - return FALSE; -} - -static gboolean -ets_insert_idle (ETableSorted *ets) -{ - ets->insert_count = 0; - ets->insert_idle_id = 0; - return FALSE; -} - -ETableModel * -e_table_sorted_new (ETableModel *source, - ETableHeader *full_header, - ETableSortInfo *sort_info) -{ - ETableSorted *ets = g_object_new (E_TYPE_TABLE_SORTED, NULL); - ETableSubset *etss = E_TABLE_SUBSET (ets); - - if (E_TABLE_SUBSET_CLASS (ets_parent_class)->proxy_model_pre_change) - (E_TABLE_SUBSET_CLASS (ets_parent_class)->proxy_model_pre_change) (etss, source); - - if (e_table_subset_construct (etss, source, 0) == NULL) { - g_object_unref (ets); - return NULL; - } - - ets->sort_info = sort_info; - g_object_ref (ets->sort_info); - ets->full_header = full_header; - g_object_ref (ets->full_header); - - ets_proxy_model_changed (etss, source); - - ets->sort_info_changed_id = g_signal_connect ( - sort_info, "sort_info_changed", - G_CALLBACK (ets_sort_info_changed), ets); - - return E_TABLE_MODEL (ets); -} - -static void -ets_sort_info_changed (ETableSortInfo *info, - ETableSorted *ets) -{ - ets_sort (ets); -} - -static void -ets_proxy_model_changed (ETableSubset *subset, - ETableModel *source) -{ - gint rows, i; - - rows = e_table_model_row_count (source); - - g_free (subset->map_table); - subset->n_map = rows; - subset->map_table = g_new (int, rows); - - for (i = 0; i < rows; i++) { - subset->map_table[i] = i; - } - - if (!E_TABLE_SORTED (subset)->sort_idle_id) - E_TABLE_SORTED (subset)->sort_idle_id = g_idle_add_full (50, (GSourceFunc) ets_sort_idle, subset, NULL); - - e_table_model_changed (E_TABLE_MODEL (subset)); -} - -static void -ets_proxy_model_row_changed (ETableSubset *subset, - ETableModel *source, - gint row) -{ - if (!E_TABLE_SORTED (subset)->sort_idle_id) - E_TABLE_SORTED (subset)->sort_idle_id = g_idle_add_full (50, (GSourceFunc) ets_sort_idle, subset, NULL); - - if (E_TABLE_SUBSET_CLASS (ets_parent_class)->proxy_model_row_changed) - (E_TABLE_SUBSET_CLASS (ets_parent_class)->proxy_model_row_changed) (subset, source, row); -} - -static void -ets_proxy_model_cell_changed (ETableSubset *subset, - ETableModel *source, - gint col, - gint row) -{ - ETableSorted *ets = E_TABLE_SORTED (subset); - if (e_table_sorting_utils_affects_sort (ets->sort_info, ets->full_header, col)) - ets_proxy_model_row_changed (subset, source, row); - else if (E_TABLE_SUBSET_CLASS (ets_parent_class)->proxy_model_cell_changed) - (E_TABLE_SUBSET_CLASS (ets_parent_class)->proxy_model_cell_changed) (subset, source, col, row); -} - -static void -ets_proxy_model_rows_inserted (ETableSubset *etss, - ETableModel *source, - gint row, - gint count) -{ - ETableModel *etm = E_TABLE_MODEL (etss); - ETableSorted *ets = E_TABLE_SORTED (etss); - gint i; - gboolean full_change = FALSE; - - if (count == 0) { - e_table_model_no_change (etm); - return; - } - - if (row != etss->n_map) { - full_change = TRUE; - for (i = 0; i < etss->n_map; i++) { - if (etss->map_table[i] >= row) { - etss->map_table[i] += count; - } - } - } - - etss->map_table = g_realloc (etss->map_table, (etss->n_map + count) * sizeof (gint)); - - for (; count > 0; count--) { - if (!full_change) - e_table_model_pre_change (etm); - i = etss->n_map; - if (ets->sort_idle_id == 0) { - /* this is to see if we're inserting a lot of things between idle loops. - * If we are, we're busy, its faster to just append and perform a full sort later */ - ets->insert_count++; - if (ets->insert_count > ETS_INSERT_MAX) { - /* schedule a sort, and append instead */ - ets->sort_idle_id = g_idle_add_full (50, (GSourceFunc) ets_sort_idle, ets, NULL); - } else { - /* make sure we have an idle handler to reset the count every now and then */ - if (ets->insert_idle_id == 0) { - ets->insert_idle_id = g_idle_add_full (40, (GSourceFunc) ets_insert_idle, ets, NULL); - } - i = e_table_sorting_utils_insert (etss->source, ets->sort_info, ets->full_header, etss->map_table, etss->n_map, row); - memmove (etss->map_table + i + 1, etss->map_table + i, (etss->n_map - i) * sizeof (gint)); - } - } - etss->map_table[i] = row; - etss->n_map++; - if (!full_change) { - e_table_model_row_inserted (etm, i); - } - - d (g_print ("inserted row %d", row)); - row++; - } - if (full_change) - e_table_model_changed (etm); - else - e_table_model_no_change (etm); - d (e_table_subset_print_debugging (etss)); -} - -static void -ets_proxy_model_rows_deleted (ETableSubset *etss, - ETableModel *source, - gint row, - gint count) -{ - ETableModel *etm = E_TABLE_MODEL (etss); - gint i; - gboolean shift; - gint j; - - shift = row == etss->n_map - count; - - for (j = 0; j < count; j++) { - for (i = 0; i < etss->n_map; i++) { - if (etss->map_table[i] == row + j) { - if (shift) - e_table_model_pre_change (etm); - memmove (etss->map_table + i, etss->map_table + i + 1, (etss->n_map - i - 1) * sizeof (gint)); - etss->n_map--; - if (shift) - e_table_model_row_deleted (etm, i); - } - } - } - if (!shift) { - for (i = 0; i < etss->n_map; i++) { - if (etss->map_table[i] >= row) - etss->map_table[i] -= count; - } - - e_table_model_changed (etm); - } else { - e_table_model_no_change (etm); - } - - d (g_print ("deleted row %d count %d", row, count)); - d (e_table_subset_print_debugging (etss)); -} - -static void -ets_sort (ETableSorted *ets) -{ - ETableSubset *etss = E_TABLE_SUBSET (ets); - static gint reentering = 0; - if (reentering) - return; - reentering = 1; - - e_table_model_pre_change (E_TABLE_MODEL (ets)); - - e_table_sorting_utils_sort (etss->source, ets->sort_info, ets->full_header, etss->map_table, etss->n_map); - - e_table_model_changed (E_TABLE_MODEL (ets)); - reentering = 0; -} |