diff options
-rw-r--r-- | e-util/e-util.c | 244 | ||||
-rw-r--r-- | e-util/e-util.h | 201 | ||||
-rw-r--r-- | widgets/misc/e-selection-model-simple.c | 18 | ||||
-rw-r--r-- | widgets/misc/e-selection-model-simple.h | 10 | ||||
-rw-r--r-- | widgets/misc/e-selection-model.c | 82 | ||||
-rw-r--r-- | widgets/misc/e-selection-model.h | 17 |
6 files changed, 448 insertions, 124 deletions
diff --git a/e-util/e-util.c b/e-util/e-util.c index 02092041f0..436e11b141 100644 --- a/e-util/e-util.c +++ b/e-util/e-util.c @@ -30,6 +30,7 @@ #include <string.h> #include <locale.h> #include <stdio.h> +#include <stdlib.h> #include "e-util.h" #if 0 @@ -269,6 +270,30 @@ e_marshal_INT__INT_INT_POINTER (GtkObject * object, func_data); } +typedef gint (*GtkSignal_INT__INT_POINTER_INT_POINTER) (GtkObject * object, + gint arg1, + gpointer arg2, + gint arg3, + gpointer arg4, + gpointer user_data); + +void +e_marshal_INT__INT_POINTER_INT_POINTER (GtkObject * object, + GtkSignalFunc func, + gpointer func_data, GtkArg * args) +{ + GtkSignal_INT__INT_POINTER_INT_POINTER rfunc; + gint *return_val; + return_val = GTK_RETLOC_INT (args[3]); + rfunc = (GtkSignal_INT__INT_POINTER_INT_POINTER) func; + *return_val = (*rfunc) (object, + GTK_VALUE_INT (args[0]), + GTK_VALUE_POINTER (args[1]), + GTK_VALUE_INT (args[2]), + GTK_VALUE_POINTER (args[3]), + func_data); +} + typedef void (*GtkSignal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL) (GtkObject * object, GtkObject *arg1, gdouble arg2, @@ -361,6 +386,29 @@ e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT (GtkObject * object, GTK_VALUE_INT (args[4]), GTK_VALUE_INT (args[5]), func_data); } +typedef void (*GtkSignal_NONE__INT_POINTER_INT_POINTER_POINTER_INT_INT) (GtkObject * object, + gint arg1, + gpointer arg2, + gint arg3, + gpointer arg4, + gpointer arg5, + gint arg6, + gint arg7, + gpointer user_data); +void +e_marshal_NONE__INT_POINTER_INT_POINTER_POINTER_INT_INT (GtkObject * object, + GtkSignalFunc func, + gpointer func_data, GtkArg * args) +{ + GtkSignal_NONE__INT_POINTER_INT_POINTER_POINTER_INT_INT rfunc; + rfunc = (GtkSignal_NONE__INT_POINTER_INT_POINTER_POINTER_INT_INT) func; + (*rfunc) (object, + GTK_VALUE_INT (args[0]), GTK_VALUE_POINTER (args[1]), GTK_VALUE_INT (args[2]), + GTK_VALUE_POINTER (args[3]), + GTK_VALUE_POINTER (args[4]), + GTK_VALUE_INT (args[5]), GTK_VALUE_INT (args[6]), func_data); +} + typedef void (*GtkSignal_NONE__INT_INT_POINTER_INT) (GtkObject * object, gint arg1, gint arg2, @@ -378,6 +426,24 @@ e_marshal_NONE__INT_INT_POINTER_INT (GtkObject * object, GTK_VALUE_POINTER (args[2]), GTK_VALUE_INT (args[3]), func_data); } +typedef void (*GtkSignal_NONE__INT_POINTER_INT_POINTER_INT) (GtkObject * object, + gint arg1, + gpointer arg2, + gint arg3, + gpointer arg4, + gint arg5, gpointer user_data); +void +e_marshal_NONE__INT_POINTER_INT_POINTER_INT (GtkObject * object, + GtkSignalFunc func, + gpointer func_data, GtkArg * args) +{ + GtkSignal_NONE__INT_POINTER_INT_POINTER_INT rfunc; + rfunc = (GtkSignal_NONE__INT_POINTER_INT_POINTER_INT) func; + (*rfunc) (object, + GTK_VALUE_INT (args[0]), GTK_VALUE_POINTER (args[1]), GTK_VALUE_INT (args[2]), + GTK_VALUE_POINTER (args[3]), GTK_VALUE_INT (args[4]), func_data); +} + typedef gboolean (*GtkSignal_BOOL__INT_INT_POINTER_INT_INT_INT) (GtkObject * object, gint arg1, gint arg2, @@ -404,6 +470,34 @@ e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT (GtkObject * object, GTK_VALUE_INT (args[5]), func_data); } +typedef gboolean (*GtkSignal_BOOL__INT_POINTER_INT_POINTER_INT_INT_INT) (GtkObject * object, + gint arg1, + gpointer arg2, + gint arg3, + gpointer arg4, + gint arg5, + gint arg6, + gint arg7, + gpointer user_data); +void +e_marshal_BOOL__INT_POINTER_INT_POINTER_INT_INT_INT (GtkObject * object, + GtkSignalFunc func, + gpointer func_data, GtkArg * args) +{ + GtkSignal_BOOL__INT_POINTER_INT_POINTER_INT_INT_INT rfunc; + gboolean *return_val; + return_val = GTK_RETLOC_BOOL (args[6]); + rfunc = (GtkSignal_BOOL__INT_POINTER_INT_POINTER_INT_INT_INT) func; + *return_val = (*rfunc) (object, + GTK_VALUE_INT (args[0]), + GTK_VALUE_POINTER (args[1]), + GTK_VALUE_INT (args[2]), + GTK_VALUE_POINTER (args[3]), + GTK_VALUE_INT (args[4]), + GTK_VALUE_INT (args[5]), + GTK_VALUE_INT (args[6]), func_data); +} + typedef void (*GtkSignal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT) (GtkObject * object, gint arg1, @@ -436,6 +530,38 @@ e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject * object, GTK_VALUE_INT (args[6]), GTK_VALUE_INT (args[7]), func_data); } +typedef void (*GtkSignal_NONE__INT_POINTER_INT_POINTER_INT_INT_POINTER_INT_INT) (GtkObject * + object, + gint arg1, + gpointer arg2, + gint arg3, + gpointer arg4, + gint arg5, + gint arg6, + gpointer arg7, + gint arg8, + gint arg9, + gpointer user_data); + +void +e_marshal_NONE__INT_POINTER_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject * object, + GtkSignalFunc func, + gpointer func_data, + GtkArg * args) +{ + GtkSignal_NONE__INT_POINTER_INT_POINTER_INT_INT_POINTER_INT_INT rfunc; + rfunc = (GtkSignal_NONE__INT_POINTER_INT_POINTER_INT_INT_POINTER_INT_INT) func; + (*rfunc) (object, + GTK_VALUE_INT (args[0]), + GTK_VALUE_POINTER (args[1]), + GTK_VALUE_INT (args[2]), + GTK_VALUE_POINTER (args[3]), + GTK_VALUE_INT (args[4]), + GTK_VALUE_INT (args[5]), + GTK_VALUE_POINTER (args[6]), + GTK_VALUE_INT (args[7]), GTK_VALUE_INT (args[8]), func_data); +} + typedef void (*GtkSignal_NONE__POINTER_POINTER_INT) (GtkObject *, gpointer, gpointer, gint, gpointer); @@ -449,6 +575,19 @@ e_marshal_NONE__POINTER_POINTER_INT (GtkObject * object, GtkSignalFunc func, GTK_VALUE_INT (args[2]), func_data); } +typedef void (*GtkSignal_NONE__INT_POINTER_INT_POINTER) (GtkObject *, gint, gpointer, + gint, gpointer, gpointer); + +void +e_marshal_NONE__INT_POINTER_INT_POINTER (GtkObject * object, GtkSignalFunc func, + gpointer func_data, GtkArg * args) +{ + GtkSignal_NONE__INT_POINTER_INT_POINTER rfunc; + rfunc = (GtkSignal_NONE__INT_POINTER_INT_POINTER) func; + (*rfunc) (object, GTK_VALUE_INT (args[0]), GTK_VALUE_POINTER (args[1]), + GTK_VALUE_INT (args[2]), GTK_VALUE_POINTER (args[3]), func_data); +} + typedef int (*GtkSignal_INT__POINTER_POINTER) (GtkObject *, gpointer, gpointer, gpointer user_data); @@ -740,3 +879,108 @@ e_create_directory (gchar *directory) return (return_value); } + + +/* Perform a binary search for key in base which has nmemb elements + of size bytes each. The comparisons are done by (*compare)(). */ +void e_bsearch (const void *key, + const void *base, + size_t nmemb, + size_t size, + ESortCompareFunc compare, + gpointer closure, + size_t *start, + size_t *end) +{ + size_t l, u, idx; + const void *p; + int comparison; + if (!(start || end)) + return; + + l = 0; + u = nmemb; + while (l < u) { + idx = (l + u) / 2; + p = (void *) (((const char *) base) + (idx * size)); + comparison = (*compare) (key, p, closure); + if (comparison < 0) + u = idx; + else if (comparison > 0) + l = idx + 1; + else { + size_t lsave, usave; + lsave = l; + usave = u; + if (start) { + while (l < u) { + idx = (l + u) / 2; + p = (void *) (((const char *) base) + (idx * size)); + comparison = (*compare) (key, p, closure); + if (comparison <= 0) + u = idx; + else + l = idx + 1; + } + *start = l; + + l = lsave; + u = usave; + } + if (end) { + while (l < u) { + idx = (l + u) / 2; + p = (void *) (((const char *) base) + (idx * size)); + comparison = (*compare) (key, p, closure); + if (comparison < 0) + u = idx; + else + l = idx + 1; + } + *end = l; + } + return; + } + } + + if (start) + *start = l; + if (end) + *end = l; +} + +static gpointer closure_closure; +static ESortCompareFunc compare_closure; + +static int +qsort_callback(const void *data1, const void *data2) +{ + return (*compare_closure) (data1, data2, closure_closure); +} + +/* Forget it. We're just going to use qsort. I lost the need for a stable sort. */ +void +e_sort (void *base, + size_t nmemb, + size_t size, + ESortCompareFunc compare, + gpointer closure) +{ + closure_closure = closure; + compare_closure = compare; + qsort(base, nmemb, size, qsort_callback); +#if 0 + void *base_copy; + int i; + base_copy = g_malloc(nmemb * size); + + for (i = 0; i < nmemb; i++) { + int position; + e_bsearch(base + (i * size), base_copy, i, size, compare, closure, NULL, &position); + memmove(base_copy + (position + 1) * size, base_copy + position * size, (i - position) * size); + memcpy(base_copy + position * size, base + i * size, size); + } + memcpy(base, base_copy, nmemb * size); + g_free(base_copy); +#endif +} diff --git a/e-util/e-util.h b/e-util/e-util.h index 77d056b051..e1e6205583 100644 --- a/e-util/e-util.h +++ b/e-util/e-util.h @@ -59,90 +59,141 @@ typedef enum { E_FOCUS_START, E_FOCUS_END } EFocus; -int g_str_compare (const void *x, - const void *y); -int g_int_compare (const void *x, - const void *y); -char *e_strdup_strip (const char *string); -void e_free_object_list (GList *list); -void e_free_string_list (GList *list); -char *e_read_file (const char *filename); -int e_write_file (const char *filename, - const char *data, - int flags); -int e_mkdir_hier (const char *path, - mode_t mode); - -gchar **e_strsplit (const gchar *string, - const gchar *delimiter, - gint max_tokens); -gchar *e_strstrcase (const gchar *haystack, - const gchar *needle); -void e_filename_make_safe (gchar *string); -gchar *e_format_number (gint number); -gboolean e_create_directory (gchar *directory); -void e_marshal_INT__INT_INT_POINTER (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); -void e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); -void e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); -void e_marshal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); +int g_str_compare (const void *x, + const void *y); +int g_int_compare (const void *x, + const void *y); +char *e_strdup_strip (const char *string); +void e_free_object_list (GList *list); +void e_free_string_list (GList *list); +char *e_read_file (const char *filename); +int e_write_file (const char *filename, + const char *data, + int flags); +int e_mkdir_hier (const char *path, + mode_t mode); + +gchar **e_strsplit (const gchar *string, + const gchar *delimiter, + gint max_tokens); +gchar *e_strstrcase (const gchar *haystack, + const gchar *needle); +void e_filename_make_safe (gchar *string); +gchar *e_format_number (gint number); +gboolean e_create_directory (gchar *directory); + + +typedef int (*ESortCompareFunc) (const void *first, + const void *second, + gpointer closure); + +void e_sort (void *base, + size_t nmemb, + size_t size, + ESortCompareFunc compare, + gpointer closure); +void e_bsearch (const void *key, + const void *base, + size_t nmemb, + size_t size, + ESortCompareFunc compare, + gpointer closure, + size_t *start, + size_t *end); + + + +void e_marshal_INT__INT_INT_POINTER (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_INT__INT_POINTER_INT_POINTER (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_NONE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_DOUBLE__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_BOOL__OBJECT_DOUBLE_DOUBLE_BOOL (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); #define e_marshal_NONE__INT_INT_POINTER_POINTER_UINT_UINT e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT -void e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); +void e_marshal_NONE__INT_INT_POINTER_POINTER_INT_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); + +#define e_marshal_NONE__INT_POINTER_INT_POINTER_POINTER_UINT_UINT e_marshal_NONE__INT_POINTER_INT_POINTER_POINTER_INT_INT +void e_marshal_NONE__INT_POINTER_INT_POINTER_POINTER_INT_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); #define e_marshal_NONE__INT_INT_POINTER_UINT e_marshal_NONE__INT_INT_POINTER_INT -void e_marshal_NONE__INT_INT_POINTER_INT (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); +void e_marshal_NONE__INT_INT_POINTER_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); -#define e_marshal_BOOL__INT_INT_POINTER_INT_INT_UINT e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT -void e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); +#define e_marshal_NONE__INT_POINTER_INT_POINTER_UINT e_marshal_NONE__INT_POINTER_INT_POINTER_INT +void e_marshal_NONE__INT_POINTER_INT_POINTER_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); -#ifdef __cplusplus -} -#endif /* __cplusplus */ +#define e_marshal_BOOL__INT_INT_POINTER_INT_INT_UINT e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT +void e_marshal_BOOL__INT_INT_POINTER_INT_INT_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +#define e_marshal_BOOL__INT_POINTER_INT_POINTER_INT_INT_UINT e_marshal_BOOL__INT_POINTER_INT_POINTER_INT_INT_INT +void e_marshal_BOOL__INT_POINTER_INT_POINTER_INT_INT_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); #define e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_UINT_UINT e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT +void e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); + +#define e_marshal_NONE__INT_POINTER_INT_POINTER_INT_INT_POINTER_UINT_UINT e_marshal_NONE__INT_POINTER_INT_POINTER_INT_INT_POINTER_INT_INT +void e_marshal_NONE__INT_POINTER_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_NONE__POINTER_POINTER_INT (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_NONE__INT_POINTER_INT_POINTER (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_INT__POINTER_POINTER (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_INT__POINTER_POINTER_POINTER (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); +void e_marshal_INT__POINTER_POINTER_POINTER_POINTER (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args); -void e_marshal_NONE__INT_INT_POINTER_INT_INT_POINTER_INT_INT (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); -void e_marshal_NONE__POINTER_POINTER_INT (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); - -void e_marshal_INT__POINTER_POINTER (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); -void e_marshal_INT__POINTER_POINTER_POINTER (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); -void e_marshal_INT__POINTER_POINTER_POINTER_POINTER (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args); +#ifdef __cplusplus +} +#endif /* __cplusplus */ #endif /* _E_UTIL_H_ */ diff --git a/widgets/misc/e-selection-model-simple.c b/widgets/misc/e-selection-model-simple.c index 9a9c1e0d79..8b8329b7bb 100644 --- a/widgets/misc/e-selection-model-simple.c +++ b/widgets/misc/e-selection-model-simple.c @@ -74,19 +74,21 @@ esms_get_row_count (ESelectionModel *esm) return esms->row_count; } -void e_selection_model_simple_insert_row (ESelectionModelSimple *esms, - int row) +void e_selection_model_simple_insert_rows (ESelectionModelSimple *esms, + int row, + int count) { - esms->row_count ++; - e_selection_model_insert_row (E_SELECTION_MODEL(esms), row); + esms->row_count += count; + e_selection_model_insert_rows (E_SELECTION_MODEL(esms), row, count); } void -e_selection_model_simple_delete_row (ESelectionModelSimple *esms, - int row) +e_selection_model_simple_delete_rows (ESelectionModelSimple *esms, + int row, + int count) { - esms->row_count --; - e_selection_model_delete_row (E_SELECTION_MODEL(esms), row); + esms->row_count -= count; + e_selection_model_delete_rows (E_SELECTION_MODEL(esms), row, count); } void diff --git a/widgets/misc/e-selection-model-simple.h b/widgets/misc/e-selection-model-simple.h index 52e785880c..65d69d0143 100644 --- a/widgets/misc/e-selection-model-simple.h +++ b/widgets/misc/e-selection-model-simple.h @@ -27,10 +27,12 @@ typedef struct { GtkType e_selection_model_simple_get_type (void); ESelectionModelSimple *e_selection_model_simple_new (void); -void e_selection_model_simple_insert_row (ESelectionModelSimple *esms, - int row); -void e_selection_model_simple_delete_row (ESelectionModelSimple *esms, - int row); +void e_selection_model_simple_insert_rows (ESelectionModelSimple *esms, + int row, + int count); +void e_selection_model_simple_delete_rows (ESelectionModelSimple *esms, + int row, + int count); void e_selection_model_simple_move_row (ESelectionModelSimple *esms, int old_row, int new_row); diff --git a/widgets/misc/e-selection-model.c b/widgets/misc/e-selection-model.c index de48bc3952..c52397ca37 100644 --- a/widgets/misc/e-selection-model.c +++ b/widgets/misc/e-selection-model.c @@ -27,7 +27,6 @@ static GtkObjectClass *e_selection_model_parent_class; -static void change_one_row(ESelectionModel *selection, int row, gboolean grow); static void esm_select_single_row (ESelectionModel *selection, int row); enum { @@ -48,6 +47,19 @@ enum { ARG_CURSOR_MODE, }; +gboolean +e_selection_model_confirm_row_count(ESelectionModel *esm) +{ + if (esm->row_count < 0) { + esm->row_count = e_selection_model_get_row_count(esm); + if (esm->row_count < 0) + return FALSE; + g_free(esm->selection); + esm->selection = g_new0(gint, (esm->row_count + 31) / 32); + } + return TRUE; +} + static void e_selection_model_insert_row_real(ESelectionModel *esm, int row) { @@ -116,20 +128,26 @@ e_selection_model_delete_row_real(ESelectionModel *esm, int row) esm->cursor_row --; } +/* FIXME : Improve efficiency here. */ void -e_selection_model_delete_row(ESelectionModel *esm, int row) +e_selection_model_delete_rows(ESelectionModel *esm, int row, int count) { - e_selection_model_delete_row_real(esm, row); + int i; + for (i = 0; i < count; i++) + e_selection_model_delete_row_real(esm, row); gtk_signal_emit(GTK_OBJECT(esm), e_selection_model_signals [SELECTION_CHANGED]); gtk_signal_emit(GTK_OBJECT(esm), e_selection_model_signals [CURSOR_CHANGED], esm->cursor_row, esm->cursor_col); } +/* FIXME : Improve efficiency here. */ void -e_selection_model_insert_row(ESelectionModel *esm, int row) +e_selection_model_insert_rows(ESelectionModel *esm, int row, int count) { - e_selection_model_insert_row_real(esm, row); + int i; + for (i = 0; i < count; i++) + e_selection_model_insert_row_real(esm, row); gtk_signal_emit(GTK_OBJECT(esm), e_selection_model_signals [SELECTION_CHANGED]); gtk_signal_emit(GTK_OBJECT(esm), @@ -150,7 +168,7 @@ e_selection_model_move_row(ESelectionModel *esm, int old_row, int new_row) if (esm->mode == GTK_SELECTION_SINGLE) esm_select_single_row (esm, new_row); else - change_one_row(esm, new_row, TRUE); + e_selection_model_change_one_row(esm, new_row, TRUE); } if (cursor) { esm->cursor_row = new_row; @@ -372,8 +390,8 @@ e_selection_model_foreach (ESelectionModel *selection, #define OPERATE(object, i,mask,grow) ((grow) ? (((object)->selection[(i)]) |= ((guint32) ~(mask))) : (((object)->selection[(i)]) &= (mask))) -static void -change_one_row(ESelectionModel *selection, int row, gboolean grow) +void +e_selection_model_change_one_row(ESelectionModel *selection, int row, gboolean grow) { int i; i = BOX(row); @@ -388,7 +406,7 @@ change_selection(ESelectionModel *selection, int start, int end, gboolean grow) if (start != end) { if (selection->sorter && e_sorter_needs_sorting(selection->sorter)) { for ( i = start; i < end; i++) { - change_one_row(selection, e_sorter_sorted_to_model(selection->sorter, i), grow); + e_selection_model_change_one_row(selection, e_sorter_sorted_to_model(selection->sorter, i), grow); } } else { i = BOX(start); @@ -509,13 +527,8 @@ e_selection_model_do_something (ESelectionModel *selection, if (col == -1 && row != -1) col = 0; - if (selection->row_count < 0) { - selection->row_count = e_selection_model_get_row_count(selection); - if (selection->row_count < 0) - return; - g_free(selection->selection); - selection->selection = g_new0(gint, (selection->row_count + 31) / 32); - } + if (!e_selection_model_confirm_row_count(selection)) + return; if (selection->row_count >= 0 && row < selection->row_count) { switch (selection->mode) { case GTK_SELECTION_SINGLE: @@ -635,7 +648,7 @@ move_selection (ESelectionModel *selection, */ gint e_selection_model_key_press (ESelectionModel *selection, - GdkEventKey *key) + GdkEventKey *key) { switch (key->keyval) { case GDK_Up: @@ -766,14 +779,9 @@ void e_selection_model_select_all (ESelectionModel *selection) { int i; - - if (selection->row_count < 0) { - selection->row_count = e_selection_model_get_row_count(selection); - if (selection->row_count < 0) - return; - g_free (selection->selection); - selection->selection = g_new0 (gint, (selection->row_count + 31) / 32); - } + + if (!e_selection_model_confirm_row_count(selection)) + return; if (!selection->selection) selection->selection = g_new0 (gint, (selection->row_count + 31) / 32); @@ -814,14 +822,9 @@ void e_selection_model_invert_selection (ESelectionModel *selection) { int i; - - if (selection->row_count < 0) { - selection->row_count = e_selection_model_get_row_count (selection); - if (selection->row_count < 0) + + if (!e_selection_model_confirm_row_count(selection)) return; - g_free (selection->selection); - selection->selection = g_new0 (gint, (selection->row_count + 31) / 32); - } if (!selection->selection) selection->selection = g_new0 (gint, (selection->row_count + 31) / 32); @@ -850,3 +853,18 @@ e_selection_model_get_row_count (ESelectionModel *selection) else return 0; } + +void +e_selection_model_change_cursor (ESelectionModel *selection, int row) +{ + g_return_if_fail(selection != NULL); + g_return_if_fail(E_IS_SELECTION_MODEL(selection)); + + selection->cursor_row = row; + if (row == -1) + selection->cursor_col = -1; + else if (selection->cursor_col == -1) + selection->cursor_col = 0; + gtk_signal_emit(GTK_OBJECT(selection), + e_selection_model_signals[CURSOR_CHANGED], selection->cursor_row, selection->cursor_col); +} diff --git a/widgets/misc/e-selection-model.h b/widgets/misc/e-selection-model.h index 74cbcb50d2..5ba0411587 100644 --- a/widgets/misc/e-selection-model.h +++ b/widgets/misc/e-selection-model.h @@ -65,7 +65,6 @@ typedef struct { } ESelectionModelClass; GtkType e_selection_model_get_type (void); - gboolean e_selection_model_is_row_selected (ESelectionModel *selection, gint n); void e_selection_model_foreach (ESelectionModel *selection, @@ -87,13 +86,21 @@ void e_selection_model_select_all (ESelectionModel *selection); void e_selection_model_invert_selection (ESelectionModel *selection); /* Private Functions */ -void e_selection_model_insert_row (ESelectionModel *esm, - int row); -void e_selection_model_delete_row (ESelectionModel *esm, - int row); +void e_selection_model_insert_rows (ESelectionModel *esm, + int row, + int count); +void e_selection_model_delete_rows (ESelectionModel *esm, + int row, + int count); void e_selection_model_move_row (ESelectionModel *esm, int old_row, int new_row); +void e_selection_model_change_one_row (ESelectionModel *esm, + int row, + gboolean on); +void e_selection_model_change_cursor (ESelectionModel *esm, + int row); +gboolean e_selection_model_confirm_row_count (ESelectionModel *esm); /* Virtual Function */ gint e_selection_model_get_row_count (ESelectionModel *esm); |