Files
evolution/widgets/table/e-table-model.c
Tor Lillqvist 2decafb544 Port to Windows, initial commit:
2005-04-29  Tor Lillqvist  <tml@novell.com>

	Port to Windows, initial commit:

	* configure.in: Check for Win32, define Automake conditional
	OS_WIN32. Check for regexec() perhaps in separate -lregex, define
	REGEX_LIBS if so. Require glib-2.0 >= 2.6 (and thus also gtk+-2.0
	>= 2.6) so that we can use the gstdio wrappers for full support of
	non-ASCII filenames on Win32. Don't use -D_REENTRANT on Win32, has
	ne special meaning.

	* gal.pc.in: Require gtk+-2.0 >= 2.6 also here for consistency.

	* gal-zip.in: New file, used to build zipfile format distribution
	of gal for Win32.

	* configure.in
	* Makefile.am: Add gal-zip(.in).

	* */Makefile.am
	* */*.c: Harmonize -I and #include conventions. (Of course, this
	hasn't anything to do with Windows porting as such, I just got
	carried away...) Use only -I$(top_srcdir). Use paths to gal
	headers staring with "gal", except for headers from the same
	directory as the .c file, which are included as such. Include all
	gal headers using doublequotes. Sort #includes and remove
	duplicates and obvious redundancies. Include config.h first
	without any HAVE_CONFIG_H, then system headers, then other GNOME
	lib headers, than gal's own headers. Just include gtk.h instead of
	separate gtk*.h headers. Don't include gi18n.h, include e-i18n.h
	to use e_gettext() consistently.

	* gal/Makefile.am: Use -no-undefined on Win32 so that libtool
	agrees to build a shared library. Because of the bidirectional
	dependency between libgal and libgal-a11y we can build libgal-a11y
	sanely as a shared library on Win32, so we don't install any
	separate libgal-a11y at all. So, on Win32, link the stuff that
	goes into libgal-a11y also into libgal. Link with REGEX_LIBS.

	* gal/a11y/Makefile.am: See above. Just build a dummy static
	libgal-a11y on Win32 (can't convince Automake not to build the
	library at all on one platform using Automake ifdef,
	apparently). Then (this is a gross hack) explicitly remove the
	library after installation in the install-data-local rule.

	* gal/e-table/Makefile.am
	* gal/e-table/e-table-config.c: Rename ETABLE_GLADEDIR to
	GAL_GLADEDIR for consistency.

	* gal/e-table/e-cell-date.c: No localtime_r() in Microsoft's C
	library, but its localtime() *is* thread-safe.

	* gal/e-table/e-cell-text.c
	* gal/e-table/e-cell-tree.c
	* gal/e-table/e-cell-vbox.c
	* gal/e-text/e-text.c
	* gal/widgets/e-unicode.c: Remove unnecessary inclusion of gdkx.h.

	* gal/e-table/e-cell-tree.c (ect_realize): Instead of the Xlib
	macro None (whose value is zero), use the corresponding
	zero-valued enums from the appropriate GDK type.

	* gal/e-table/e-table-config.c
	* gal/e-table/e-table-field-chooser.c
	* gal/menus/gal-define-views-dialog.c
	* gal/menus/gal-view-instance-save-as-dialog.c
	* gal/menus/gal-view-new-dialog.c
	* gal/widgets/e-categories-master-list-array.c
	* gal/widgets/e-categories-master-list-dialog.c
	* gal/widgets/e-categories.c: Use g_build_filename() to construct
	pathnames at run-time instead of compile-time. On Windows the
	macros GAL_GLADEDIR and GAL_IMAGESDIR expand to function calls, in
	order to support installing in a freely chosen location.

	* gal/e-table/e-table-item.c
	* gal/e-table/e-cell-vbox.c: Instrad of the Xlib GrabSuccess, use
	GDK_GRAB_SUCCESS (which has the same value).

	* gal/e-table/e-table-specification.c (e_table_specification_load_from_file)
	* gal/e-table/e-table.c (e_table_load_specification)
	* gal/e-table/e-tree-table-adapter.c (open_file)
	* gal/menus/gal-view-instance.c (load_current_view)
	* gal/menus/gal-view-instance.c (load_current_view): On Win32,
	convert filename to the locale character set before passing to
	xmlParseFile() which doesn't use UTF-8 filenames. Use gstdio
	wrappers.

	* gal/util/Makefile.am: Define GAL_PREFIX as $prefix. Define
	GAL_LOCALEDIR, GAL_GLADEDIR and GAL_IMAGESDIR also here for
	e-win32-reloc.c. Include e-win32-reloc.c on Win32.

	* gal/util/e-iconv.c (e_iconv_init): Use g_win32_getlocale() on
	Windows.

	* gal/util/e-util.c
	* gal/util/e-xml-utils.c: Use g_mkstemp() instead of non-portable
	mkstemp(). Use GLib pathname manipulation functions. Use gstdio
	wrappers.

	* gal/util/e-util-private.h: New file. Contains just Win32 bits
	for now that redefine the directory names from the Makefile as
	functions calls.

	* gal/util/e-win32-reloc.c: New file. Contains a minimal DllMain()
	and functions to support freely chosen installation location on
	Windows.

	* gal/util/e-xml-utils.c: No fsync() in the Microsoft C library.

	* gal/windgets/Makefile.am: Add -I$(top_srcdir)/gal for
	consistency with the sibling Makefile.am files.

	* gal/widgets/e-canvas.c: Instead of the Xlib AlreadyGrabbed, use
	GDK_GRAB_ALREADY_GRABBED.

svn path=/trunk/; revision=29249
2005-04-29 14:18:18 +00:00

620 lines
19 KiB
C

/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* e-table-model.c
* Copyright 2000, 2001, Ximian, Inc.
*
* Authors:
* Chris Lahey <clahey@ximian.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License, version 2, as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <config.h>
#include <glib-object.h>
#include "gal/util/e-marshal.h"
#include "gal/util/e-util.h"
#include "e-table-model.h"
#define ETM_CLASS(e) (E_TABLE_MODEL_GET_CLASS (e))
#define ETM_FROZEN(e) (GPOINTER_TO_INT (g_object_get_data (G_OBJECT(e), "frozen")) != 0)
#define d(x)
d(static gint depth = 0;)
static GObjectClass *e_table_model_parent_class;
enum {
MODEL_NO_CHANGE,
MODEL_CHANGED,
MODEL_PRE_CHANGE,
MODEL_ROW_CHANGED,
MODEL_CELL_CHANGED,
MODEL_ROWS_INSERTED,
MODEL_ROWS_DELETED,
ROW_SELECTION,
LAST_SIGNAL
};
static guint e_table_model_signals [LAST_SIGNAL] = { 0, };
/**
* e_table_model_column_count:
* @e_table_model: The e-table-model to operate on
*
* Returns: the number of columns in the table model.
*/
int
e_table_model_column_count (ETableModel *e_table_model)
{
g_return_val_if_fail (e_table_model != NULL, 0);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), 0);
return ETM_CLASS (e_table_model)->column_count (e_table_model);
}
/**
* e_table_model_row_count:
* @e_table_model: the e-table-model to operate on
*
* Returns: the number of rows in the Table model.
*/
int
e_table_model_row_count (ETableModel *e_table_model)
{
g_return_val_if_fail (e_table_model != NULL, 0);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), 0);
return ETM_CLASS (e_table_model)->row_count (e_table_model);
}
/**
* e_table_model_append_row:
* @e_table_model: the table model to append the a row to.
* @source:
* @row:
*
*/
void
e_table_model_append_row (ETableModel *e_table_model, ETableModel *source, int row)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_CLASS (e_table_model)->append_row)
ETM_CLASS (e_table_model)->append_row (e_table_model, source, row);
}
/**
* e_table_value_at:
* @e_table_model: the e-table-model to operate on
* @col: column in the model to pull data from.
* @row: row in the model to pull data from.
*
* Return value: This function returns the value that is stored
* by the @e_table_model in column @col and row @row. The data
* returned can be a pointer or any data value that can be stored
* inside a pointer.
*
* The data returned is typically used by an ECell renderer.
*
* The data returned must be valid until the model sends a signal that
* affect that piece of data. model_changed affects all data.
* row_changed affects the data in that row. cell_changed affects the
* data in that cell. rows_deleted affects all data in those rows.
* rows_inserted and no_change don't affect any data in this way.
**/
void *
e_table_model_value_at (ETableModel *e_table_model, int col, int row)
{
g_return_val_if_fail (e_table_model != NULL, NULL);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
return ETM_CLASS (e_table_model)->value_at (e_table_model, col, row);
}
/**
* e_table_model_set_value_at:
* @e_table_model: the table model to operate on.
* @col: the column where the data will be stored in the model.
* @row: the row where the data will be stored in the model.
* @value: the data to be stored.
*
* This function instructs the model to store the value in @data in the
* the @e_table_model at column @col and row @row. The @data typically
* comes from one of the ECell rendering objects.
*
* There should be an agreement between the Table Model and the user
* of this function about the data being stored. Typically it will
* be a pointer to a set of data, or a datum that fits inside a void *.
*/
void
e_table_model_set_value_at (ETableModel *e_table_model, int col, int row, const void *value)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
ETM_CLASS (e_table_model)->set_value_at (e_table_model, col, row, value);
}
/**
* e_table_model_is_cell_editable:
* @e_table_model: the table model to query.
* @col: column to query.
* @row: row to query.
*
* Returns: %TRUE if the cell in @e_table_model at @col,@row can be
* edited, %FALSE otherwise
*/
gboolean
e_table_model_is_cell_editable (ETableModel *e_table_model, int col, int row)
{
g_return_val_if_fail (e_table_model != NULL, FALSE);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
return ETM_CLASS (e_table_model)->is_cell_editable (e_table_model, col, row);
}
void *
e_table_model_duplicate_value (ETableModel *e_table_model, int col, const void *value)
{
g_return_val_if_fail (e_table_model != NULL, NULL);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
if (ETM_CLASS (e_table_model)->duplicate_value)
return ETM_CLASS (e_table_model)->duplicate_value (e_table_model, col, value);
else
return NULL;
}
void
e_table_model_free_value (ETableModel *e_table_model, int col, void *value)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_CLASS (e_table_model)->free_value)
ETM_CLASS (e_table_model)->free_value (e_table_model, col, value);
}
gboolean
e_table_model_has_save_id (ETableModel *e_table_model)
{
g_return_val_if_fail (e_table_model != NULL, FALSE);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
if (ETM_CLASS (e_table_model)->has_save_id)
return ETM_CLASS (e_table_model)->has_save_id (e_table_model);
else
return FALSE;
}
char *
e_table_model_get_save_id (ETableModel *e_table_model, int row)
{
g_return_val_if_fail (e_table_model != NULL, "/");
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), "/");
if (ETM_CLASS (e_table_model)->get_save_id)
return ETM_CLASS (e_table_model)->get_save_id (e_table_model, row);
else
return NULL;
}
gboolean
e_table_model_has_change_pending(ETableModel *e_table_model)
{
g_return_val_if_fail (e_table_model != NULL, FALSE);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
if (ETM_CLASS (e_table_model)->has_change_pending)
return ETM_CLASS (e_table_model)->has_change_pending (e_table_model);
else
return FALSE;
}
void *
e_table_model_initialize_value (ETableModel *e_table_model, int col)
{
g_return_val_if_fail (e_table_model != NULL, NULL);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
if (ETM_CLASS (e_table_model)->initialize_value)
return ETM_CLASS (e_table_model)->initialize_value (e_table_model, col);
else
return NULL;
}
gboolean
e_table_model_value_is_empty (ETableModel *e_table_model, int col, const void *value)
{
g_return_val_if_fail (e_table_model != NULL, FALSE);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
if (ETM_CLASS (e_table_model)->value_is_empty)
return ETM_CLASS (e_table_model)->value_is_empty (e_table_model, col, value);
else
return FALSE;
}
char *
e_table_model_value_to_string (ETableModel *e_table_model, int col, const void *value)
{
g_return_val_if_fail (e_table_model != NULL, NULL);
g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
if (ETM_CLASS (e_table_model)->value_to_string)
return ETM_CLASS (e_table_model)->value_to_string (e_table_model, col, value);
else
return g_strdup("");
}
static void
e_table_model_finalize (GObject *object)
{
if (e_table_model_parent_class->finalize)
(*e_table_model_parent_class->finalize)(object);
}
static void
e_table_model_class_init (GObjectClass *object_class)
{
ETableModelClass *klass = E_TABLE_MODEL_CLASS(object_class);
e_table_model_parent_class = g_type_class_peek_parent (object_class);
object_class->finalize = e_table_model_finalize;
e_table_model_signals [MODEL_NO_CHANGE] =
g_signal_new ("model_no_change",
E_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ETableModelClass, model_no_change),
(GSignalAccumulator) NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
e_table_model_signals [MODEL_CHANGED] =
g_signal_new ("model_changed",
E_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ETableModelClass, model_changed),
(GSignalAccumulator) NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
e_table_model_signals [MODEL_PRE_CHANGE] =
g_signal_new ("model_pre_change",
E_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ETableModelClass, model_pre_change),
(GSignalAccumulator) NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
e_table_model_signals [MODEL_ROW_CHANGED] =
g_signal_new ("model_row_changed",
E_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ETableModelClass, model_row_changed),
(GSignalAccumulator) NULL, NULL,
g_cclosure_marshal_VOID__INT,
G_TYPE_NONE, 1, G_TYPE_INT);
e_table_model_signals [MODEL_CELL_CHANGED] =
g_signal_new ("model_cell_changed",
E_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ETableModelClass, model_cell_changed),
(GSignalAccumulator) NULL, NULL,
e_marshal_VOID__INT_INT,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
e_table_model_signals [MODEL_ROWS_INSERTED] =
g_signal_new ("model_rows_inserted",
E_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ETableModelClass, model_rows_inserted),
(GSignalAccumulator) NULL, NULL,
e_marshal_VOID__INT_INT,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
e_table_model_signals [MODEL_ROWS_DELETED] =
g_signal_new ("model_rows_deleted",
E_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ETableModelClass, model_rows_deleted),
(GSignalAccumulator) NULL, NULL,
e_marshal_VOID__INT_INT,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
klass->column_count = NULL;
klass->row_count = NULL;
klass->append_row = NULL;
klass->value_at = NULL;
klass->set_value_at = NULL;
klass->is_cell_editable = NULL;
klass->has_save_id = NULL;
klass->get_save_id = NULL;
klass->has_change_pending = NULL;
klass->duplicate_value = NULL;
klass->free_value = NULL;
klass->initialize_value = NULL;
klass->value_is_empty = NULL;
klass->value_to_string = NULL;
klass->model_no_change = NULL;
klass->model_changed = NULL;
klass->model_row_changed = NULL;
klass->model_cell_changed = NULL;
klass->model_rows_inserted = NULL;
klass->model_rows_deleted = NULL;
}
E_MAKE_TYPE(e_table_model, "ETableModel", ETableModel, e_table_model_class_init, NULL, G_TYPE_OBJECT)
#if d(!)0
static void
print_tabs (void)
{
int i;
for (i = 0; i < depth; i++)
g_print("\t");
}
#endif
void
e_table_model_pre_change (ETableModel *e_table_model)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_FROZEN (e_table_model))
return;
d(print_tabs());
d(g_print("Emitting pre_change on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
d(depth++);
g_signal_emit (G_OBJECT (e_table_model),
e_table_model_signals [MODEL_PRE_CHANGE], 0);
d(depth--);
}
/**
* e_table_model_no_change:
* @e_table_model: the table model to notify of the lack of a change
*
* Use this function to notify any views of this table model that
* the contents of the table model have changed. This will emit
* the signal "model_no_change" on the @e_table_model object.
*
* It is preferable to use the e_table_model_row_changed() and
* the e_table_model_cell_changed() to notify of smaller changes
* than to invalidate the entire model, as the views might have
* ways of caching the information they render from the model.
*/
void
e_table_model_no_change (ETableModel *e_table_model)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_FROZEN (e_table_model))
return;
d(print_tabs());
d(g_print("Emitting model_no_change on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
d(depth++);
g_signal_emit (G_OBJECT (e_table_model),
e_table_model_signals [MODEL_NO_CHANGE], 0);
d(depth--);
}
/**
* e_table_model_changed:
* @e_table_model: the table model to notify of the change
*
* Use this function to notify any views of this table model that
* the contents of the table model have changed. This will emit
* the signal "model_changed" on the @e_table_model object.
*
* It is preferable to use the e_table_model_row_changed() and
* the e_table_model_cell_changed() to notify of smaller changes
* than to invalidate the entire model, as the views might have
* ways of caching the information they render from the model.
*/
void
e_table_model_changed (ETableModel *e_table_model)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_FROZEN (e_table_model))
return;
d(print_tabs());
d(g_print("Emitting model_changed on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
d(depth++);
g_signal_emit (G_OBJECT (e_table_model),
e_table_model_signals [MODEL_CHANGED], 0);
d(depth--);
}
/**
* e_table_model_row_changed:
* @e_table_model: the table model to notify of the change
* @row: the row that was changed in the model.
*
* Use this function to notify any views of the table model that
* the contents of row @row have changed in model. This function
* will emit the "model_row_changed" signal on the @e_table_model
* object
*/
void
e_table_model_row_changed (ETableModel *e_table_model, int row)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_FROZEN (e_table_model))
return;
d(print_tabs());
d(g_print("Emitting row_changed on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
d(depth++);
g_signal_emit (G_OBJECT (e_table_model),
e_table_model_signals [MODEL_ROW_CHANGED], 0, row);
d(depth--);
}
/**
* e_table_model_cell_changed:
* @e_table_model: the table model to notify of the change
* @col: the column.
* @row: the row
*
* Use this function to notify any views of the table model that
* contents of the cell at @col,@row has changed. This will emit
* the "model_cell_changed" signal on the @e_table_model
* object
*/
void
e_table_model_cell_changed (ETableModel *e_table_model, int col, int row)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_FROZEN (e_table_model))
return;
d(print_tabs());
d(g_print("Emitting cell_changed on model 0x%p, a %s, row %d, col %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row, col));
d(depth++);
g_signal_emit (G_OBJECT (e_table_model),
e_table_model_signals [MODEL_CELL_CHANGED], 0, col, row);
d(depth--);
}
/**
* e_table_model_rows_inserted:
* @e_table_model: the table model to notify of the change
* @row: the row that was inserted into the model.
* @count: The number of rows that were inserted.
*
* Use this function to notify any views of the table model that
* @count rows at row @row have been inserted into the model. This
* function will emit the "model_rows_inserted" signal on the
* @e_table_model object
*/
void
e_table_model_rows_inserted (ETableModel *e_table_model, int row, int count)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_FROZEN (e_table_model))
return;
d(print_tabs());
d(g_print("Emitting row_inserted on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
d(depth++);
g_signal_emit (G_OBJECT (e_table_model),
e_table_model_signals [MODEL_ROWS_INSERTED], 0, row, count);
d(depth--);
}
/**
* e_table_model_row_inserted:
* @e_table_model: the table model to notify of the change
* @row: the row that was inserted into the model.
*
* Use this function to notify any views of the table model that the
* row @row has been inserted into the model. This function will emit
* the "model_rows_inserted" signal on the @e_table_model object
*/
void
e_table_model_row_inserted (ETableModel *e_table_model, int row)
{
e_table_model_rows_inserted(e_table_model, row, 1);
}
/**
* e_table_model_row_deleted:
* @e_table_model: the table model to notify of the change
* @row: the row that was deleted
* @count: The number of rows deleted
*
* Use this function to notify any views of the table model that
* @count rows at row @row have been deleted from the model. This
* function will emit the "model_rows_deleted" signal on the
* @e_table_model object
*/
void
e_table_model_rows_deleted (ETableModel *e_table_model, int row, int count)
{
g_return_if_fail (e_table_model != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
if (ETM_FROZEN (e_table_model))
return;
d(print_tabs());
d(g_print("Emitting row_deleted on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
d(depth++);
g_signal_emit (G_OBJECT (e_table_model),
e_table_model_signals [MODEL_ROWS_DELETED], 0, row, count);
d(depth--);
}
/**
* e_table_model_row_deleted:
* @e_table_model: the table model to notify of the change
* @row: the row that was deleted
*
* Use this function to notify any views of the table model that the
* row @row has been deleted from the model. This function will emit
* the "model_rows_deleted" signal on the @e_table_model object
*/
void
e_table_model_row_deleted (ETableModel *e_table_model, int row)
{
e_table_model_rows_deleted(e_table_model, row, 1);
}
void
e_table_model_freeze (ETableModel *e_table_model)
{
e_table_model_pre_change (e_table_model);
g_object_set_data (G_OBJECT (e_table_model), "frozen", GINT_TO_POINTER (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (e_table_model), "frozen")) + 1));
}
void
e_table_model_thaw (ETableModel *e_table_model)
{
g_object_set_data (G_OBJECT (e_table_model), "frozen", GINT_TO_POINTER (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (e_table_model), "frozen")) - 1));
e_table_model_changed (e_table_model);
}