From fd4ffbd38ccef4d2a35675a50f89e0b5f2d6d86e Mon Sep 17 00:00:00 2001 From: Christopher James Lahey Date: Tue, 12 Mar 2002 14:30:53 +0000 Subject: Added e-table-search.lo. 2002-03-12 Christopher James Lahey * gal/Makefile.am (libgal_la_LIBADD): Added e-table-search.lo. * gal/util/e-util.c, gal/util/e-util.h (e_marshal_BOOL__STRING): Added this marshal function. From gal/e-table/ChangeLog: 2002-03-12 Christopher James Lahey * Makefile.am (libetable_la_SOURCES): Added e-table-search.c. (libetableinclude_HEADERS): Added e-table-search.h. * e-cell.h: Added ETableSearchFun here. * e-table-col.h: Added search here. * e-table-column-specification.c, e-table-column-specification.h: Added search here. * e-table-extras.c, e-table-extras.h (e_table_extras_add_search): Added ETableSearchFuncs here. * e-table-memory-store.c (e_table_memory_store_insert, e_table_memory_store_insert_adopt): Handle row == -1 here. * e-table-search.c, e-table-search.h: New class to reusably handle the semantics of searching for a string. * e-table-simple.c, e-table-simple.h: Added a bunch of simple functions here for if your table is all strings. Should be reusable. * e-table-utils.c (et_col_spec_to_col): Added support for searches here. * e-table.c, e-table.h: Added an ETableSearch here. svn path=/trunk/; revision=16119 --- widgets/table/e-table-search.c | 219 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 widgets/table/e-table-search.c (limited to 'widgets/table/e-table-search.c') diff --git a/widgets/table/e-table-search.c b/widgets/table/e-table-search.c new file mode 100644 index 0000000000..88b6673c86 --- /dev/null +++ b/widgets/table/e-table-search.c @@ -0,0 +1,219 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * e-table-search.c + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * Chris Lahey + * + * 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 +#include +#include "e-table-search.h" +#include "gal/util/e-util.h" + +#define ETS_CLASS(e) ((ETableSearchClass *)((GtkObject *)e)->klass) + +#define PARENT_TYPE gtk_object_get_type () + +#define d(x) + +d(static gint depth = 0); + +struct _ETableSearchPrivate { + guint timeout_id; + + char *search_string; + gunichar last_character; +}; + +static GtkObjectClass *e_table_search_parent_class; + +enum { + SEARCH_SEARCH, + SEARCH_ACCEPT, + LAST_SIGNAL +}; + +static guint e_table_search_signals [LAST_SIGNAL] = { 0, }; + +static gboolean +e_table_search_search (ETableSearch *e_table_search, char *string) +{ + gboolean ret_val; + g_return_val_if_fail (e_table_search != NULL, FALSE); + g_return_val_if_fail (E_IS_TABLE_SEARCH (e_table_search), FALSE); + + gtk_signal_emit (GTK_OBJECT (e_table_search), + e_table_search_signals [SEARCH_SEARCH], string, &ret_val); + + return ret_val; +} + +static void +e_table_search_accept (ETableSearch *e_table_search) +{ + g_return_if_fail (e_table_search != NULL); + g_return_if_fail (E_IS_TABLE_SEARCH (e_table_search)); + + gtk_signal_emit (GTK_OBJECT (e_table_search), + e_table_search_signals [SEARCH_ACCEPT]); +} + +static gboolean +ets_accept (gpointer data) +{ + ETableSearch *ets = data; + e_table_search_accept (ets); + g_free (ets->priv->search_string); + + ets->priv->timeout_id = 0; + ets->priv->search_string = g_strdup (""); + ets->priv->last_character = 0; + + return FALSE; +} + +static void +drop_timeout (ETableSearch *ets) +{ + if (ets->priv->timeout_id) { + g_source_remove (ets->priv->timeout_id); + } + ets->priv->timeout_id = 0; +} + +static void +add_timeout (ETableSearch *ets) +{ + drop_timeout (ets); + ets->priv->timeout_id = g_timeout_add (1000, ets_accept, ets); +} + +static void +e_table_search_destroy (GtkObject *object) +{ + if (e_table_search_parent_class->destroy) + (*e_table_search_parent_class->destroy)(object); +} + +static void +e_table_search_class_init (GtkObjectClass *object_class) +{ + ETableSearchClass *klass = E_TABLE_SEARCH_CLASS(object_class); + e_table_search_parent_class = gtk_type_class (PARENT_TYPE); + + object_class->destroy = e_table_search_destroy; + + e_table_search_signals [SEARCH_SEARCH] = + gtk_signal_new ("search", + GTK_RUN_LAST, + E_OBJECT_CLASS_TYPE (object_class), + GTK_SIGNAL_OFFSET (ETableSearchClass, search), + e_marshal_BOOL__STRING, + GTK_TYPE_BOOL, 1, GTK_TYPE_STRING); + + e_table_search_signals [SEARCH_ACCEPT] = + gtk_signal_new ("accept", + GTK_RUN_LAST, + E_OBJECT_CLASS_TYPE (object_class), + GTK_SIGNAL_OFFSET (ETableSearchClass, accept), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + E_OBJECT_CLASS_ADD_SIGNALS (object_class, e_table_search_signals, LAST_SIGNAL); + + klass->search = NULL; + klass->accept = NULL; +} + +static void +e_table_search_init (ETableSearch *ets) +{ + ets->priv = g_new (ETableSearchPrivate, 1); + + ets->priv->timeout_id = 0; + ets->priv->search_string = g_strdup (""); + ets->priv->last_character = 0; +} + + +guint +e_table_search_get_type (void) +{ + static guint type = 0; + + if (!type) + { + GtkTypeInfo info = + { + "ETableSearch", + sizeof (ETableSearch), + sizeof (ETableSearchClass), + (GtkClassInitFunc) e_table_search_class_init, + (GtkObjectInitFunc) e_table_search_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + type = gtk_type_unique (PARENT_TYPE, &info); + } + + return type; +} + +ETableSearch * +e_table_search_new (void) +{ + ETableSearch *ets = gtk_type_new (e_table_search_get_type()); + + return ets; +} + +/** + * e_table_search_column_count: + * @e_table_search: The e-table-search to operate on + * + * Returns: the number of columns in the table search. + */ +void +e_table_search_input_character (ETableSearch *ets, gunichar character) +{ + char character_utf8[7]; + + g_return_if_fail (ets != NULL); + g_return_if_fail (E_IS_TABLE_SEARCH (ets)); + + character_utf8 [g_unichar_to_utf8 (character, character_utf8)] = 0; + + if (character != ets->priv->last_character) { + char *temp_string; + temp_string = g_strdup_printf ("%s%s", ets->priv->search_string, character_utf8); + if (e_table_search_search (ets, temp_string)) { + g_free (ets->priv->search_string); + ets->priv->search_string = temp_string; + add_timeout (ets); + } else { + g_free (temp_string); + } + } else { + e_table_search_search (ets, ets->priv->search_string); + add_timeout (ets); + } + ets->priv->last_character = character; +} -- cgit