39 #include "gnc-component-manager.h" 41 #include "gnc-general-search.h" 44 #define GNCGENERALSEARCH_CLASS "gnc-general-search-widget" 61 static void gnc_general_search_destroy (GtkWidget *widget);
69 GNCSearchCB search_cb;
72 const QofParam * get_guid;
76 G_DEFINE_TYPE_WITH_PRIVATE(
GNCGeneralSearch, gnc_general_search, GTK_TYPE_BOX)
79 ((GNCGeneralSearchPrivate*)gnc_general_search_get_instance_private((GNCGeneralSearch*)o)) 81 static guint general_search_signals[LAST_SIGNAL];
86 GtkWidgetClass *object_class = (GtkWidgetClass *) klass;
89 general_search_signals[SELECTION_CHANGED] =
90 g_signal_new(
"changed",
91 G_TYPE_FROM_CLASS(object_class),
95 g_cclosure_marshal_VOID__VOID,
98 object_class->destroy = gnc_general_search_destroy;
100 klass->changed = NULL;
106 gtk_orientable_set_orientation (GTK_ORIENTABLE(gsl), GTK_ORIENTATION_HORIZONTAL);
108 gsl->selected_item = NULL;
112 gnc_general_search_destroy (GtkWidget *widget)
115 GNCGeneralSearchPrivate *priv;
117 g_return_if_fail (widget != NULL);
118 g_return_if_fail (GNC_IS_GENERAL_SEARCH (widget));
120 gsl = GNC_GENERAL_SEARCH (widget);
125 priv = _PRIVATE(gsl);
129 gnc_search_dialog_set_select_cb (priv->sw, NULL, NULL, FALSE);
130 gnc_search_dialog_disconnect (priv->sw, gsl);
133 if (priv->component_id)
136 gnc_unregister_gui_component (priv->component_id);
137 priv->component_id = 0;
140 GTK_WIDGET_CLASS (gnc_general_search_parent_class)->destroy (widget);
147 GNCGeneralSearchPrivate *priv;
150 priv = _PRIVATE(gsl);
151 if (gsl->selected_item == NULL)
156 gtk_entry_set_text(GTK_ENTRY(gsl->entry), text);
161 refresh_handler (GHashTable *changes, gpointer data)
164 GNCGeneralSearchPrivate *priv;
167 priv = _PRIVATE(gsl);
170 info = gnc_gui_get_entity_events (changes, &priv->guid);
173 if (info->event_mask & QOF_EVENT_DESTROY)
174 gsl->selected_item = NULL;
175 reset_selection_text (gsl);
182 new_item_selected_cb (GtkWindow *dialog, gpointer item, gpointer user_data)
185 gnc_general_search_set_selected (gsl, item);
190 on_close_cb (GtkDialog *dialog, gpointer user_data)
193 GNCGeneralSearchPrivate *priv;
195 priv = _PRIVATE(gsl);
202 search_cb(GtkButton * button, gpointer user_data)
205 GNCGeneralSearchPrivate *priv;
208 priv = _PRIVATE(gsl);
211 gnc_search_dialog_raise (priv->sw);
215 sw = (priv->search_cb)(
gnc_ui_get_gtk_window (GTK_WIDGET (button)), gsl->selected_item, priv->user_data);
225 gnc_search_dialog_connect_on_close (sw, G_CALLBACK (on_close_cb),
229 gnc_search_dialog_set_select_cb (sw, new_item_selected_cb,
230 gsl, gsl->allow_clear);
251 gnc_gsl_match_selected_cb (GtkEntryCompletion *completion,
252 GtkTreeModel *comp_model,
253 GtkTreeIter *comp_iter,
256 QofObject * qofobject;
258 gtk_tree_model_get(comp_model, comp_iter, GSL_COLUMN_QOFOBJECT, &qofobject, -1);
259 gnc_general_search_set_selected (gsl, qofobject);
276 gnc_gsl_focus_out_cb (GtkEntry *entry,
277 GdkEventFocus *event,
281 GtkEntryCompletion *completion;
284 gchar *lc_text, *tree_string, *lc_tree_string;
285 gboolean match, valid_iter;
286 QofObject *qofobject;
287 gpointer selected_item = NULL;
290 completion = gtk_entry_get_completion(entry);
291 model = gtk_entry_completion_get_model(completion);
294 valid_iter = gtk_tree_model_get_iter_first(model, &iter);
298 text = gtk_entry_get_text(entry);
299 lc_text = g_utf8_strdown(text, -1);
303 if (gsl->selected_item)
305 GNCGeneralSearchPrivate * priv;
307 priv = _PRIVATE(gsl);
309 lc_tree_string = g_utf8_strdown(tree_string, -1);
310 match = g_utf8_collate(lc_text, lc_tree_string) == 0;
312 g_free(lc_tree_string);
314 selected_item = gsl->selected_item;
318 while (valid_iter && !selected_item)
320 gtk_tree_model_get(model, &iter, GSL_COLUMN_TEXT, &tree_string, -1);
321 lc_tree_string = g_utf8_strdown(tree_string, -1);
322 match = g_utf8_collate(lc_text, lc_tree_string) == 0;
324 g_free(lc_tree_string);
327 gtk_tree_model_get(model, &iter, GSL_COLUMN_QOFOBJECT, &qofobject, -1);
328 selected_item = qofobject;
331 valid_iter = gtk_tree_model_iter_next(model, &iter);
335 gnc_general_search_set_selected (gsl, selected_item);
342 gboolean text_editable,
346 GtkListStore * list_store;
350 GtkEntryCompletion *completion;
353 gsl->entry = gtk_entry_new ();
355 gtk_editable_set_editable (GTK_EDITABLE (gsl->entry), FALSE);
356 gtk_box_pack_start (GTK_BOX (gsl), gsl->entry, TRUE, TRUE, 0);
364 q = qof_query_create_for (type);
366 (NULL, QOF_PARAM_ACTIVE), TRUE, QOF_QUERY_AND);
371 list_store = gtk_list_store_new (GSL_N_COLUMNS, G_TYPE_STRING, G_TYPE_OBJECT);
372 for (it = list; it != NULL ; it = it->next)
380 gtk_list_store_append (list_store, &iter);
381 gtk_list_store_set (list_store, &iter,
382 GSL_COLUMN_TEXT, name,
383 GSL_COLUMN_QOFOBJECT, G_OBJECT(it->data),
393 completion = gtk_entry_completion_new();
394 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(list_store));
395 gtk_entry_completion_set_text_column(completion, 0);
396 gtk_entry_set_completion(GTK_ENTRY(gsl->entry), completion);
398 g_signal_connect (G_OBJECT (completion),
"match_selected",
399 G_CALLBACK (gnc_gsl_match_selected_cb), gsl);
400 g_signal_connect (G_OBJECT (gsl->entry),
"focus-out-event",
401 G_CALLBACK (gnc_gsl_focus_out_cb), gsl);
403 g_object_unref (list_store);
404 g_object_unref(completion);
405 gtk_widget_show (gsl->entry);
408 gsl->button = gtk_button_new_with_label (label);
409 gtk_box_pack_start (GTK_BOX (gsl), gsl->button, FALSE, FALSE, 0);
410 g_signal_connect (G_OBJECT (gsl->button),
"clicked",
411 G_CALLBACK (search_cb), gsl);
412 gtk_widget_show (gsl->button);
439 gboolean text_editable,
440 GNCSearchCB search_cb,
445 GNCGeneralSearchPrivate *priv;
446 const QofParam *get_guid;
448 g_return_val_if_fail (type && label && search_cb, NULL);
451 g_return_val_if_fail (get_guid, NULL);
453 gsl = g_object_new (GNC_TYPE_GENERAL_SEARCH, NULL);
455 create_children (gsl, label, text_editable, type, book);
457 priv = _PRIVATE(gsl);
459 priv->search_cb = search_cb;
460 priv->user_data = user_data;
461 priv->get_guid = get_guid;
463 gnc_register_gui_component (GNCGENERALSEARCH_CLASS,
464 refresh_handler, NULL, gsl);
466 return GTK_WIDGET (gsl);
473 g_assert(gsl->entry);
474 gtk_widget_grab_focus(gsl->entry);
489 GNCGeneralSearchPrivate *priv;
491 g_return_if_fail(gsl != NULL);
492 g_return_if_fail(GNC_IS_GENERAL_SEARCH(gsl));
494 priv = _PRIVATE(gsl);
495 if (selection != gsl->selected_item)
497 gsl->selected_item = selection;
499 general_search_signals[SELECTION_CHANGED], 0);
501 reset_selection_text (gsl);
503 gnc_gui_component_clear_watches (priv->component_id);
505 if (selection && priv->get_guid)
507 const QofParam *get_guid = priv->get_guid;
508 GncGUID *guid = (
GncGUID *)(get_guid->param_getfcn (gsl->selected_item,
510 priv->guid = guid ? *guid : *
guid_null ();
511 gnc_gui_component_watch_entity
512 (priv->component_id, &(priv->guid),
513 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
528 g_return_val_if_fail(gsl != NULL, NULL);
529 g_return_val_if_fail(GNC_IS_GENERAL_SEARCH(gsl), NULL);
531 return gsl->selected_item;
535 gnc_general_search_allow_clear (
GNCGeneralSearch *gsl, gboolean allow_clear)
537 g_return_if_fail (GNC_IS_GENERAL_SEARCH (gsl));
538 gsl->allow_clear = allow_clear;
const gchar * QofIdTypeConst
QofIdTypeConst declaration.
GtkWindow * gnc_ui_get_gtk_window(GtkWidget *widget)
Get a pointer to the widget's immediate top level GtkWindow.
const QofParam * qof_class_get_parameter(QofIdTypeConst obj_name, const char *parameter)
Return the registered Parameter Definition for the requested parameter.
void qof_query_destroy(QofQuery *query)
Frees the resources associate with a Query object.
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.
GList * qof_query_run(QofQuery *query)
Perform the query, return the results.
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
const char * qof_object_printable(QofIdTypeConst type_name, gpointer obj)
void qof_query_add_boolean_match(QofQuery *q, QofQueryParamList *param_list, gboolean value, QofQueryOp op)
Handy-dandy convenience routines, avoids having to create a separate predicate for boolean matches...
The type used to store guids in C.