39 #include "gnc-component-manager.h"
41 #include "gnc-general-search.h"
43 #define GNCGENERALSEARCH_CLASS "gnc-general-search-widget"
62 static void gnc_general_search_destroy (GtkObject *
object);
70 GNCSearchCB search_cb;
78 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_GENERAL_SEARCH, GNCGeneralSearchPrivate))
80 static GtkHBoxClass *parent_class;
81 static guint general_search_signals[LAST_SIGNAL];
90 gnc_general_search_get_type (
void)
92 static GType general_search_type = 0;
94 if (!general_search_type)
96 static const GTypeInfo our_info =
101 (GClassInitFunc) gnc_general_search_class_init,
106 (GInstanceInitFunc) gnc_general_search_init,
109 general_search_type = g_type_register_static (GTK_TYPE_HBOX,
114 return general_search_type;
120 GtkObjectClass *object_class = (GtkObjectClass *) klass;
122 object_class = (GtkObjectClass*) klass;
124 parent_class = g_type_class_peek_parent (klass);
126 general_search_signals[SELECTION_CHANGED] =
127 g_signal_new(
"changed",
128 G_TYPE_FROM_CLASS(object_class),
132 g_cclosure_marshal_VOID__VOID,
135 object_class->destroy = gnc_general_search_destroy;
137 klass->changed = NULL;
145 gsl->selected_item = NULL;
149 gnc_general_search_destroy (GtkObject *
object)
154 g_return_if_fail (
object != NULL);
155 g_return_if_fail (GNC_IS_GENERAL_SEARCH (
object));
157 gsl = GNC_GENERAL_SEARCH (
object);
162 priv = _PRIVATE(gsl);
166 gnc_search_dialog_set_select_cb (priv->sw, NULL, NULL, FALSE);
167 gnc_search_dialog_disconnect (priv->sw, gsl);
170 if (priv->component_id)
173 gnc_unregister_gui_component (priv->component_id);
174 priv->component_id = 0;
177 if (GTK_OBJECT_CLASS (parent_class)->destroy)
178 GTK_OBJECT_CLASS (parent_class)->destroy (
object);
188 priv = _PRIVATE(gsl);
189 if (gsl->selected_item == NULL)
194 gtk_entry_set_text(GTK_ENTRY(gsl->entry), text);
199 refresh_handler (GHashTable *changes, gpointer data)
205 priv = _PRIVATE(gsl);
208 info = gnc_gui_get_entity_events (changes, &priv->guid);
211 if (info->event_mask & QOF_EVENT_DESTROY)
212 gsl->selected_item = NULL;
213 reset_selection_text (gsl);
220 new_item_selected_cb (gpointer item, gpointer user_data)
223 gnc_general_search_set_selected (gsl, item);
228 on_close_cb (GtkDialog *dialog, gpointer user_data)
233 priv = _PRIVATE(gsl);
240 search_cb(GtkButton * button, gpointer user_data)
246 priv = _PRIVATE(gsl);
249 gnc_search_dialog_raise (priv->sw);
253 sw = (priv->search_cb)(gsl->selected_item, priv->user_data);
263 gnc_search_dialog_connect_on_close (sw, G_CALLBACK (on_close_cb),
267 gnc_search_dialog_set_select_cb (sw, new_item_selected_cb,
268 gsl, gsl->allow_clear);
289 gnc_gsl_match_selected_cb (GtkEntryCompletion *completion,
290 GtkTreeModel *comp_model,
291 GtkTreeIter *comp_iter,
296 gtk_tree_model_get(comp_model, comp_iter, GSL_COLUMN_QOFOBJECT, &qofobject, -1);
297 gnc_general_search_set_selected (gsl, qofobject);
314 gnc_gsl_focus_out_cb (GtkEntry *entry,
315 GdkEventFocus *event,
319 GtkEntryCompletion *completion;
322 gchar *lc_text, *tree_string, *lc_tree_string;
323 gboolean match, valid_iter;
325 gpointer selected_item = NULL;
328 completion = gtk_entry_get_completion(entry);
329 model = gtk_entry_completion_get_model(completion);
332 valid_iter = gtk_tree_model_get_iter_first(model, &iter);
336 text = gtk_entry_get_text(entry);
337 lc_text = g_utf8_strdown(text, -1);
341 if (gsl->selected_item)
345 priv = _PRIVATE(gsl);
347 lc_tree_string = g_utf8_strdown(tree_string, -1);
348 match = g_utf8_collate(lc_text, lc_tree_string) == 0;
350 g_free(lc_tree_string);
352 selected_item = gsl->selected_item;
356 while (valid_iter && !selected_item)
358 gtk_tree_model_get(model, &iter, GSL_COLUMN_TEXT, &tree_string, -1);
359 lc_tree_string = g_utf8_strdown(tree_string, -1);
360 match = g_utf8_collate(lc_text, lc_tree_string) == 0;
362 g_free(lc_tree_string);
365 gtk_tree_model_get(model, &iter, GSL_COLUMN_QOFOBJECT, &qofobject, -1);
366 selected_item = qofobject;
369 valid_iter = gtk_tree_model_iter_next(model, &iter);
373 gnc_general_search_set_selected (gsl, selected_item);
380 gboolean text_editable,
384 GtkListStore * list_store;
388 GtkEntryCompletion *completion;
391 gsl->entry = gtk_entry_new ();
393 gtk_editable_set_editable (GTK_EDITABLE (gsl->entry), FALSE);
394 gtk_box_pack_start (GTK_BOX (gsl), gsl->entry, TRUE, TRUE, 0);
402 q = qof_query_create_for (type);
404 (NULL, QOF_PARAM_ACTIVE), TRUE, QOF_QUERY_AND);
409 list_store = gtk_list_store_new (GSL_N_COLUMNS, G_TYPE_STRING, G_TYPE_OBJECT);
410 for (it = list; it != NULL ; it = it->next)
418 gtk_list_store_append (list_store, &iter);
419 gtk_list_store_set (list_store, &iter,
420 GSL_COLUMN_TEXT, name,
421 GSL_COLUMN_QOFOBJECT, G_OBJECT(it->data),
431 completion = gtk_entry_completion_new();
432 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(list_store));
433 gtk_entry_completion_set_text_column(completion, 0);
434 gtk_entry_completion_set_inline_completion(completion, TRUE);
435 gtk_entry_set_completion(GTK_ENTRY(gsl->entry), completion);
437 g_signal_connect (G_OBJECT (completion),
"match_selected",
438 G_CALLBACK (gnc_gsl_match_selected_cb), gsl);
439 g_signal_connect (G_OBJECT (gsl->entry),
"focus-out-event",
440 G_CALLBACK (gnc_gsl_focus_out_cb), gsl);
442 g_object_unref(completion);
443 gtk_widget_show (gsl->entry);
446 gsl->button = gtk_button_new_with_label (label);
447 gtk_box_pack_start (GTK_BOX (gsl), gsl->button, FALSE, FALSE, 0);
448 g_signal_connect (G_OBJECT (gsl->button),
"clicked",
449 G_CALLBACK (search_cb), gsl);
450 gtk_widget_show (gsl->button);
477 gboolean text_editable,
478 GNCSearchCB search_cb,
486 g_return_val_if_fail (type && label && search_cb, NULL);
489 g_return_val_if_fail (get_guid, NULL);
491 gsl = g_object_new (GNC_TYPE_GENERAL_SEARCH, NULL);
493 create_children (gsl, label, text_editable, type, book);
495 priv = _PRIVATE(gsl);
497 priv->search_cb = search_cb;
498 priv->user_data = user_data;
499 priv->get_guid = get_guid;
501 gnc_register_gui_component (GNCGENERALSEARCH_CLASS,
502 refresh_handler, NULL, gsl);
504 return GTK_WIDGET (gsl);
511 g_assert(gsl->entry);
512 gtk_widget_grab_focus(gsl->entry);
529 g_return_if_fail(gsl != NULL);
530 g_return_if_fail(GNC_IS_GENERAL_SEARCH(gsl));
532 priv = _PRIVATE(gsl);
533 if (selection != gsl->selected_item)
535 gsl->selected_item = selection;
537 general_search_signals[SELECTION_CHANGED], 0);
539 reset_selection_text (gsl);
541 gnc_gui_component_clear_watches (priv->component_id);
545 const QofParam *get_guid = priv->get_guid;
546 priv->guid = * ((
GncGUID *)(get_guid->param_getfcn
547 (gsl->selected_item, get_guid)));
548 gnc_gui_component_watch_entity
549 (priv->component_id, &(priv->guid),
550 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
565 g_return_val_if_fail(gsl != NULL, NULL);
566 g_return_val_if_fail(GNC_IS_GENERAL_SEARCH(gsl), NULL);
568 return gsl->selected_item;
572 gnc_general_search_allow_clear (
GNCGeneralSearch *gsl, gboolean allow_clear)
574 g_return_if_fail (GNC_IS_GENERAL_SEARCH (gsl));
575 gsl->allow_clear = allow_clear;
const gchar * QofIdTypeConst
struct _QofQuery QofQuery
const QofParam * qof_class_get_parameter(QofIdTypeConst obj_name, const char *parameter)
void qof_query_destroy(QofQuery *q)
void qof_query_set_book(QofQuery *q, QofBook *book)
GList * qof_query_run(QofQuery *query)
const GncGUID * guid_null(void)
const char * qof_object_printable(QofIdTypeConst type_name, gpointer instance)
void qof_query_add_boolean_match(QofQuery *q, QofQueryParamList *param_list, gboolean value, QofQueryOp op)