29 #include <glib/gi18n.h>
31 #include "dialog-utils.h"
32 #include "gnc-component-manager.h"
35 #include "gnc-gui-query.h"
36 #include "gnc-query-view.h"
38 #include "gnc-session.h"
40 #include "engine-helpers.h"
41 #include "qofbookslots.h"
45 #include "dialog-search.h"
46 #include "search-core-type.h"
47 #include "search-param.h"
52 #define DIALOG_SEARCH_CM_CLASS "dialog-search"
53 #define GNC_PREFS_GROUP_SEARCH_GENERAL "dialogs.search"
54 #define GNC_PREF_NEW_SEARCH_LIMIT "new-search-limit"
55 #define GNC_PREF_ACTIVE_ONLY "search-for-active-only"
59 GNC_SEARCH_MATCH_ALL = 0,
60 GNC_SEARCH_MATCH_ANY = 1
73 GtkWidget *grouping_combo;
74 GtkWidget *match_all_label;
75 GtkWidget *criteria_table;
76 GtkWidget *result_hbox;
79 GtkWidget *result_view;
80 gpointer selected_item;
81 GList *selected_item_list;
88 GtkWidget *active_only_check;
91 GtkWidget *select_button;
95 GtkWidget *close_button;
96 GtkWidget *cancel_button;
99 GNCSearchResultCB result_cb;
100 GNCSearchNewItemCB new_item_cb;
102 GNCSearchFree free_cb;
105 GNCSearchSelectedCB selected_cb;
107 gboolean allow_clear;
110 const gchar *type_label;
112 GNCSearchType grouping;
128 const gchar *prefs_group;
135 GtkWidget *elemwidget;
136 GtkWidget *container;
149 GtkTreeSelection *selection;
155 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(qview));
156 g_assert(gtk_tree_selection_get_mode(selection) == GTK_SELECTION_MULTIPLE);
157 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(qview));
160 if (cb->cb_multiselect_fn && (!cb->cb_fcn ))
164 sw->selected_item_list = g_list_reverse(sw->selected_item_list);
167 (cb->cb_multiselect_fn)(sw->selected_item_list, sw->user_data);
173 (cb->cb_fcn)(&(sw->selected_item), sw->user_data);
179 gnc_search_dialog_result_clicked (GtkButton *button,
GNCSearchWindow *sw)
183 cb = g_object_get_data (G_OBJECT (button),
"data");
184 gnc_search_callback_button_execute (cb, sw);
189 gnc_search_dialog_select_buttons_enable (
GNCSearchWindow *sw, gint selected)
192 gboolean enable, read_only;
197 for (blist = sw->button_list; blist; blist = blist->next)
203 gtk_widget_set_sensitive (GTK_WIDGET(blist->data), FALSE);
207 if(read_only == TRUE)
209 if((selected > 1) && (!(button_spec->cb_multiselect_fn == NULL)) && (button_spec->
sensitive_if_readonly == TRUE))
219 if((selected > 1) && (!(button_spec->cb_multiselect_fn == NULL)))
227 gtk_widget_set_sensitive (GTK_WIDGET(blist->data), enable);
235 g_return_if_fail (sw->selected_cb);
237 if (sw->selected_item == NULL && sw->allow_clear == FALSE)
239 char *msg = _(
"You must select an item from the list");
240 gnc_error_dialog (sw->dialog,
"%s", msg);
244 (sw->selected_cb)(sw->selected_item, sw->select_arg);
245 gnc_search_dialog_destroy (sw);
257 sw->selected_item_list = NULL;
258 sw->selected_item = NULL;
260 number_of_rows = GPOINTER_TO_INT(item);
262 gnc_search_dialog_select_buttons_enable(sw, number_of_rows);
264 if(number_of_rows == 1)
266 sw->selected_item = qview->selected_entry;
267 sw->selected_item_list = qview->selected_entry_list;
270 sw->selected_item_list = qview->selected_entry_list;
281 sw->selected_item = item;
284 gnc_search_dialog_select_cb (NULL, sw);
285 else if (sw->buttons)
287 gnc_search_callback_button_execute (sw->buttons, sw);
296 GtkTreeSelection *selection;
298 sw->result_view = gnc_query_view_new(sw->display_list, sw->q);
301 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sw->result_view));
302 gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
305 gnc_query_sort_order(GNC_QUERY_VIEW(sw->result_view), 1, GTK_SORT_ASCENDING);
308 g_signal_connect (GNC_QUERY_VIEW(sw->result_view),
"row_selected",
309 G_CALLBACK (gnc_search_dialog_select_row_cb), sw);
311 g_signal_connect (GNC_QUERY_VIEW(sw->result_view),
"double_click_entry",
312 G_CALLBACK(gnc_search_dialog_double_click_cb), sw);
325 if (sw->result_view == NULL)
327 GtkWidget *scroller, *frame, *button_box, *button;
330 gnc_search_dialog_init_result_view (sw);
332 frame = gtk_frame_new(NULL);
335 scroller = gtk_scrolled_window_new (NULL, NULL);
336 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller),
337 GTK_POLICY_AUTOMATIC,
338 GTK_POLICY_AUTOMATIC);
339 gtk_widget_set_size_request(GTK_WIDGET(scroller), 300, 100);
340 gtk_container_add (GTK_CONTAINER (scroller), sw->result_view);
341 gtk_container_add(GTK_CONTAINER(frame), scroller);
344 button_box = gtk_vbox_new (FALSE, 3);
351 button = gtk_button_new_with_label (_(
"Select"));
352 g_signal_connect (G_OBJECT (button),
"clicked",
353 G_CALLBACK (gnc_search_dialog_select_cb), sw);
354 gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 3);
355 sw->select_button = button;
357 for (i = 0; sw->buttons[i].label; i++)
360 button = gtk_button_new_with_label (_(button_spec->label));
361 g_object_set_data (G_OBJECT (button),
"data", button_spec);
367 sw->button_list = g_list_append(sw->button_list, button);
369 g_signal_connect (G_OBJECT (button),
"clicked",
370 G_CALLBACK (gnc_search_dialog_result_clicked), sw);
371 gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 3);
376 gtk_box_pack_end (GTK_BOX (sw->result_hbox), button_box, FALSE, FALSE, 3);
377 gtk_box_pack_end (GTK_BOX (sw->result_hbox), frame, TRUE, TRUE, 3);
380 gtk_widget_show_all (sw->result_hbox);
383 if (!sw->selected_cb)
384 gtk_widget_hide (sw->select_button);
388 gnc_query_view_reset_query (GNC_QUERY_VIEW(sw->result_view), sw->q);
391 gnc_search_dialog_select_buttons_enable (sw, 0);
392 gnc_query_view_unselect_all (GNC_QUERY_VIEW(sw->result_view));
395 max_count =
gnc_prefs_get_float(GNC_PREFS_GROUP_SEARCH_GENERAL, GNC_PREF_NEW_SEARCH_LIMIT);
396 if (gnc_query_view_get_num_entries(GNC_QUERY_VIEW(sw->result_view)) < max_count)
397 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (sw->new_rb), TRUE);
404 sw->grouping = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box));
411 GSList * buttongroup = gtk_radio_button_get_group (GTK_RADIO_BUTTON(button));
413 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
416 g_slist_length (buttongroup) - g_slist_index (buttongroup, button) - 1;
426 gtk_toggle_button_get_active (button));
433 static GSList *active_params = NULL;
439 if (sw->grouping == GNC_SEARCH_MATCH_ANY)
444 if (active_params == NULL)
445 active_params = g_slist_prepend (NULL, QOF_PARAM_ACTIVE);
448 if (sw->start_q == NULL)
450 sw->start_q = qof_query_create_for (sw->search_for);
460 q = qof_query_create_for (sw->search_for);
463 for (node = sw->crit_list; node; node = node->next)
467 pdata = gnc_search_core_type_get_predicate (data->element);
478 switch (sw->search_type)
499 g_warning (
"bad search type: %d", sw->search_type);
504 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (sw->active_only_check)))
507 active_params = NULL;
524 gtk_widget_show (sw->cancel_button);
525 gtk_widget_hide (sw->close_button);
529 gtk_widget_hide (sw->cancel_button);
530 gtk_widget_show (sw->close_button);
538 gboolean sens = (sw->q != NULL);
540 gtk_widget_set_sensitive(GTK_WIDGET(sw->narrow_rb), sens);
541 gtk_widget_set_sensitive(GTK_WIDGET(sw->add_rb), sens);
542 gtk_widget_set_sensitive(GTK_WIDGET(sw->del_rb), sens);
546 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (sw->new_rb), FALSE);
547 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (sw->narrow_rb), TRUE);
552 gtk_widget_set_sensitive(sw->grouping_combo, TRUE);
553 gtk_widget_hide(sw->match_all_label);
557 gtk_widget_set_sensitive(sw->grouping_combo, FALSE);
558 gtk_widget_show(sw->match_all_label);
573 l = g_list_last (sw->crit_list);
575 ret = gnc_search_core_type_validate (data->element);
578 sw->last_param = data->param;
587 if (!gnc_search_dialog_crit_ok (sw))
590 search_update_query (sw);
591 search_clear_criteria (sw);
592 gnc_search_dialog_reset_widgets (sw);
595 (sw->result_cb)(sw->q, sw->user_data, &(sw->selected_item));
597 gnc_search_dialog_display_results (sw);
606 g_return_if_fail (sw->new_item_cb);
608 res = (sw->new_item_cb)(sw->user_data);
612 const GncGUID *guid = (
const GncGUID *) ((sw->get_guid->param_getfcn)(res, sw->get_guid));
619 sw->start_q = qof_query_create_for (sw->search_for);
630 gnc_gui_component_watch_entity (sw->component_id, guid, QOF_EVENT_MODIFY);
639 sw->selected_item = NULL;
640 gnc_search_dialog_destroy (sw);
655 struct _elem_data *data;
660 element = g_object_get_data (G_OBJECT (button),
"element");
661 data = g_object_get_data (G_OBJECT (element),
"data");
664 sw->crit_list = g_list_remove (sw->crit_list, data);
667 gtk_container_remove (GTK_CONTAINER (sw->criteria_table), element);
668 gtk_container_remove (GTK_CONTAINER (sw->criteria_table), button);
673 gtk_widget_set_sensitive(sw->grouping_combo, FALSE);
674 gtk_widget_show(sw->match_all_label);
685 data = g_object_get_data (G_OBJECT (element),
"data");
687 gtk_table_attach (GTK_TABLE (sw->criteria_table), element, 0, 1, row, row + 1,
688 GTK_EXPAND | GTK_FILL, 0, 0, 0);
691 remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
692 g_object_set_data (G_OBJECT (
remove),
"element", element);
693 g_signal_connect (G_OBJECT (
remove),
"clicked", G_CALLBACK (remove_element), sw);
694 gtk_table_attach (GTK_TABLE (sw->criteria_table),
remove, 1, 2, row, row + 1,
696 gtk_widget_show (
remove);
697 data->button =
remove;
702 combo_box_changed (GtkComboBox *combo_box,
struct _crit_data *data)
709 if (!gtk_combo_box_get_active_iter(combo_box, &iter))
711 model = gtk_combo_box_get_model(combo_box);
712 gtk_tree_model_get(model, &iter, SEARCH_COL_POINTER, ¶m, -1);
714 if (gnc_search_param_type_match (param, data->param))
726 if (data->elemwidget)
727 gtk_container_remove (GTK_CONTAINER (data->container), data->elemwidget);
728 g_object_unref (G_OBJECT (data->element));
730 newelem = gnc_search_core_type_new_type_name
731 (gnc_search_param_get_param_type (param));
732 data->element = newelem;
733 data->elemwidget = gnc_search_core_type_get_widget (newelem);
734 if (data->elemwidget)
736 gtk_box_pack_start (GTK_BOX (data->container), data->elemwidget,
741 gtk_widget_show_all (data->container);
744 gtk_widget_queue_resize (GTK_WIDGET (data->dialog));
747 gnc_search_core_type_grab_focus (newelem);
748 gnc_search_core_type_editable_enters (newelem);
757 for (node = sw->crit_list; node; )
759 GList *tmp = node->next;
761 g_object_ref (data->button);
762 remove_element (data->button, sw);
771 GtkWidget *combo_box;
774 GtkCellRenderer *cell;
776 int index = 0, current = 0;
778 store = gtk_list_store_new(NUM_SEARCH_COLS, G_TYPE_STRING, G_TYPE_POINTER);
779 combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
780 g_object_unref(store);
782 cell = gtk_cell_renderer_text_new ();
783 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (combo_box), cell, TRUE);
784 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell,
785 "text", SEARCH_COL_NAME,
788 for (l = sw->params_list; l; l = l->next)
792 gtk_list_store_append(store, &iter);
793 gtk_list_store_set(store, &iter,
794 SEARCH_COL_NAME, _(param->title),
795 SEARCH_COL_POINTER, param,
798 if (param == sw->last_param)
804 gtk_combo_box_set_active (GTK_COMBO_BOX(combo_box), current);
805 g_signal_connect (combo_box,
"changed", G_CALLBACK (combo_box_changed), data);
813 GtkWidget *combo_box, *hbox, *p;
817 data->element = element;
818 data->dialog = GTK_DIALOG (sw->dialog);
820 hbox = gtk_hbox_new (FALSE, 0);
822 g_object_set_data_full (G_OBJECT (hbox),
"data", data, g_free);
824 p = gnc_search_core_type_get_widget (element);
825 data->elemwidget = p;
826 data->container = hbox;
827 data->param = sw->last_param;
829 combo_box = get_comb_box_widget (sw, data);
830 gtk_box_pack_start (GTK_BOX (hbox), combo_box, FALSE, FALSE, 0);
832 gtk_box_pack_start (GTK_BOX (hbox), p, FALSE, FALSE, 0);
833 gtk_widget_show_all (hbox);
839 gnc_search_dialog_book_option_changed (gpointer new_val, gpointer user_data)
843 gboolean *new_data = (gboolean*)new_val;
845 GtkWidget *focused_widget = gtk_window_get_focus(GTK_WINDOW(sw->dialog));
847 g_return_if_fail (sw);
848 if (strcmp (sw->search_for, GNC_ID_SPLIT) != 0)
852 for (l = sw->params_list; l; l = l->next)
858 if (strcmp (param->title, N_(
"Action")) == 0)
859 gnc_search_param_set_title (param, N_(
"Number/Action"));
860 if (strcmp (param->title, N_(
"Number")) == 0)
861 gnc_search_param_set_title (param, N_(
"Transaction Number"));
865 if (strcmp (param->title, N_(
"Number/Action")) == 0)
866 gnc_search_param_set_title (param, N_(
"Action"));
867 if (strcmp (param->title, N_(
"Transaction Number")) == 0)
868 gnc_search_param_set_title (param, N_(
"Number"));
872 for (l = sw->crit_list; l; l = l->next)
878 for (children = gtk_container_get_children(GTK_CONTAINER(data->container));
879 children; children = children->next)
881 GtkWidget *combo_box = children->data;
884 if (GTK_IS_COMBO_BOX(combo_box))
886 GtkWidget *new_combo_box;
890 index = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box));
892 new_combo_box = get_comb_box_widget (sw, data);
894 if (focused_widget == combo_box)
895 focused_widget = new_combo_box;
896 gtk_widget_destroy(combo_box);
898 gtk_combo_box_set_active(GTK_COMBO_BOX(new_combo_box), index);
899 gtk_box_pack_start (GTK_BOX (data->container), new_combo_box,
901 gtk_box_reorder_child(GTK_BOX (data->container), new_combo_box, 0);
902 gtk_widget_show_all (data->container);
906 gtk_widget_grab_focus(focused_widget);
917 if (!gnc_search_dialog_crit_ok (sw))
922 sw->last_param = sw->params_list->data;
925 gtk_widget_set_sensitive(sw->grouping_combo, TRUE);
926 gtk_widget_hide(sw->match_all_label);
929 new_sct = gnc_search_core_type_new_type_name
930 (gnc_search_param_get_param_type (sw->last_param));
938 w = get_element_widget (sw, new_sct);
939 data = g_object_get_data (G_OBJECT (w),
"data");
940 sw->crit_list = g_list_append (sw->crit_list, data);
942 rows = GTK_TABLE (sw->criteria_table)->nrows;
943 gtk_table_resize (GTK_TABLE (sw->criteria_table), rows + 1, 2);
944 attach_element (w, sw, rows);
946 gnc_search_core_type_grab_focus (new_sct);
947 gnc_search_core_type_editable_enters (new_sct);
955 gnc_search_dialog_add_criterion (sw);
962 g_return_val_if_fail (sw, TRUE);
966 if (strcmp (sw->search_for, GNC_ID_SPLIT) == 0)
967 gnc_book_option_remove_cb(OPTION_NAME_NUM_FIELD_SOURCE,
968 gnc_search_dialog_book_option_changed, sw);
970 gnc_unregister_gui_component (sw->component_id);
973 g_list_free (sw->crit_list);
976 g_list_free (sw->button_list);
984 (sw->free_cb)(sw->user_data);
993 refresh_handler (GHashTable *changes, gpointer data)
997 g_return_if_fail (sw);
1000 if (!sw->result_cb && (sw->result_view != NULL))
1001 gnc_search_dialog_display_results (sw);
1006 close_handler (gpointer data)
1010 g_return_if_fail (sw);
1011 gtk_widget_destroy (sw->dialog);
1016 static const gchar *
1017 type_label_to_new_button(
const gchar* type_label)
1019 if (g_strcmp0(type_label, _(
"Bill")) == 0)
1021 return _(
"New Bill");
1023 else if (g_strcmp0(type_label, _(
"Customer")) == 0)
1025 return _(
"New Customer");
1027 else if (g_strcmp0(type_label, _(
"Employee")) == 0)
1029 return _(
"New Employee");
1031 else if (g_strcmp0(type_label, _(
"Expense Voucher")) == 0)
1033 return _(
"New Expense Voucher");
1035 else if (g_strcmp0(type_label, _(
"Invoice")) == 0)
1037 return _(
"New Invoice");
1039 else if (g_strcmp0(type_label, _(
"Job")) == 0)
1041 return _(
"New Job");
1043 else if (g_strcmp0(type_label, _(
"Order")) == 0)
1045 return _(
"New Order");
1047 else if (g_strcmp0(type_label, _(
"Transaction")) == 0)
1049 return _(
"New Transaction");
1051 else if (g_strcmp0(type_label, _(
"Split")) == 0)
1053 return _(
"New Split");
1055 else if (g_strcmp0(type_label, _(
"Vendor")) == 0)
1057 return _(
"New Vendor");
1061 PWARN(
"No translatable new-button label found for search type \"%s\", please add one into dialog-search.c!", type_label);
1062 return Q_(
"Item represents an unknown object type (in the sense of bill, customer, invoice, transaction, split,...)|New item");
1068 gnc_search_dialog_init_widgets (
GNCSearchWindow *sw,
const gchar *title)
1070 GtkBuilder *builder;
1071 GtkWidget *label, *add, *box;
1072 GtkComboBoxText *combo_box;
1074 GtkWidget *new_item_button;
1075 const char *type_label;
1078 builder = gtk_builder_new();
1079 gnc_builder_add_from_file (builder,
"dialog-search.glade",
"Search Dialog");
1082 sw->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"Search Dialog"));
1083 gtk_window_set_title(GTK_WINDOW(sw->dialog), title);
1084 g_object_set_data (G_OBJECT (sw->dialog),
"dialog-info", sw);
1087 sw->result_hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"result_hbox"));
1090 sw->criteria_table = GTK_WIDGET(gtk_builder_get_object (builder,
"criteria_table"));
1093 label = GTK_WIDGET(gtk_builder_get_object (builder,
"type_label"));
1095 type_label = sw->type_label;
1098 gtk_label_set_text (GTK_LABEL (label), type_label);
1101 add = gtk_button_new_from_stock (GTK_STOCK_ADD);
1103 g_signal_connect (G_OBJECT (add),
"clicked", G_CALLBACK (add_criterion), sw);
1104 box = GTK_WIDGET(gtk_builder_get_object (builder,
"add_button_box"));
1105 gtk_box_pack_start (GTK_BOX (box), add, FALSE, FALSE, 3);
1106 gtk_widget_show (add);
1109 sw->grouping_combo = gtk_combo_box_text_new();
1110 combo_box = GTK_COMBO_BOX_TEXT(sw->grouping_combo);
1111 gtk_combo_box_text_append_text(combo_box, _(
"all criteria are met"));
1112 gtk_combo_box_text_append_text(combo_box, _(
"any criteria are met"));
1113 gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), sw->grouping);
1114 g_signal_connect(combo_box,
"changed", G_CALLBACK (match_combo_changed), sw);
1116 box = GTK_WIDGET(gtk_builder_get_object (builder,
"type_menu_box"));
1117 gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET(combo_box), FALSE, FALSE, 3);
1118 gtk_widget_show(GTK_WIDGET(combo_box));
1121 sw->match_all_label = GTK_WIDGET(gtk_builder_get_object (builder,
"match_all_label"));
1124 sw->new_rb = GTK_WIDGET(gtk_builder_get_object (builder,
"new_search_radiobutton"));
1125 g_signal_connect (sw->new_rb,
"toggled",
1126 G_CALLBACK (search_type_cb), sw);
1127 sw->narrow_rb = GTK_WIDGET(gtk_builder_get_object (builder,
"narrow_search_radiobutton"));
1128 g_signal_connect (sw->narrow_rb,
"toggled",
1129 G_CALLBACK (search_type_cb), sw);
1130 sw->add_rb = GTK_WIDGET(gtk_builder_get_object (builder,
"add_search_radiobutton"));
1131 g_signal_connect (sw->add_rb,
"toggled",
1132 G_CALLBACK (search_type_cb), sw);
1133 sw->del_rb = GTK_WIDGET(gtk_builder_get_object (builder,
"delete_search_radiobutton"));
1134 g_signal_connect (sw->del_rb,
"toggled",
1135 G_CALLBACK (search_type_cb), sw);
1138 sw->active_only_check = GTK_WIDGET(gtk_builder_get_object (builder,
"active_only_check"));
1139 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sw->active_only_check), active);
1140 g_signal_connect (sw->active_only_check,
"toggled",
1141 G_CALLBACK (search_active_only_cb), sw);
1147 gtk_widget_set_sensitive (sw->active_only_check, FALSE);
1150 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"find_button"));
1151 g_signal_connect (widget,
"clicked",
1152 G_CALLBACK (search_find_cb), sw);
1155 sw->cancel_button = GTK_WIDGET(gtk_builder_get_object (builder,
"cancel_button"));
1156 g_signal_connect (sw->cancel_button,
"clicked",
1157 G_CALLBACK (search_cancel_cb), sw);
1160 sw->close_button = GTK_WIDGET(gtk_builder_get_object (builder,
"close_button"));
1161 g_signal_connect (sw->close_button,
"clicked",
1162 G_CALLBACK (search_cancel_cb), sw);
1165 new_item_button = GTK_WIDGET(gtk_builder_get_object (builder,
"new_item_button"));
1166 gtk_button_set_label (GTK_BUTTON(new_item_button),
1167 type_label_to_new_button(type_label));
1168 g_signal_connect (new_item_button,
"clicked",
1169 G_CALLBACK (search_new_item_cb), sw);
1172 widget = GTK_WIDGET(gtk_builder_get_object (builder,
"help_button"));
1173 g_signal_connect (widget,
"clicked",
1174 G_CALLBACK (search_help_cb), sw);
1177 gnc_search_dialog_add_criterion (sw);
1181 if (strcmp (sw->search_for, GNC_ID_SPLIT) == 0)
1182 gnc_book_option_register_cb(OPTION_NAME_NUM_FIELD_SOURCE,
1183 gnc_search_dialog_book_option_changed, sw);
1186 if (!sw->new_item_cb)
1187 gtk_widget_hide (new_item_button);
1190 gtk_builder_connect_signals (builder, sw);
1193 sw->component_id = gnc_register_gui_component (DIALOG_SEARCH_CM_CLASS,
1196 gnc_gui_component_set_session (sw->component_id,
1197 gnc_get_current_session());
1200 g_signal_connect (G_OBJECT (sw->dialog),
"destroy",
1201 G_CALLBACK (gnc_search_dialog_close_cb), sw);
1203 gnc_search_dialog_reset_widgets (sw);
1204 gnc_search_dialog_show_close_cancel (sw);
1206 g_object_unref(G_OBJECT(builder));
1214 if (sw->prefs_group)
1215 gnc_save_window_size(sw->prefs_group, GTK_WINDOW(sw->dialog));
1216 gnc_close_gui_component (sw->component_id);
1224 gtk_window_present (GTK_WINDOW(sw->dialog));
1228 gnc_search_dialog_create (
QofIdTypeConst obj_type,
const gchar *title,
1230 GList *display_list,
1233 GNCSearchResultCB result_callback,
1234 GNCSearchNewItemCB new_item_cb,
1235 gpointer user_data, GNCSearchFree free_cb,
1236 const gchar *prefs_group,
1237 const gchar *type_label)
1241 g_return_val_if_fail (obj_type, NULL);
1242 g_return_val_if_fail (*obj_type !=
'\0', NULL);
1243 g_return_val_if_fail (param_list, NULL);
1246 g_return_val_if_fail ((callbacks && !result_callback) ||
1247 (!callbacks && result_callback), NULL);
1250 g_return_val_if_fail (display_list, NULL);
1252 sw->search_for = obj_type;
1253 sw->params_list = param_list;
1254 sw->display_list = display_list;
1255 sw->buttons = callbacks;
1256 sw->result_cb = result_callback;
1257 sw->new_item_cb = new_item_cb;
1258 sw->user_data = user_data;
1259 sw->free_cb = free_cb;
1260 sw->prefs_group = prefs_group;
1261 sw->type_label = type_label;
1267 sw->q = show_start_query;
1269 gnc_search_dialog_init_widgets (sw, title);
1270 if (sw->prefs_group)
1271 gnc_restore_window_size(sw->prefs_group, GTK_WINDOW(sw->dialog));
1272 gtk_widget_show(sw->dialog);
1275 if (callbacks && show_start_query)
1277 gnc_search_dialog_reset_widgets (sw);
1278 gnc_search_dialog_display_results (sw);
1290 g_return_val_if_fail (sw, 0);
1291 g_return_val_if_fail (func, 0);
1292 g_return_val_if_fail (user_data, 0);
1294 return g_signal_connect (G_OBJECT (sw->dialog),
"destroy",
1301 void gnc_search_dialog_disconnect (
GNCSearchWindow *sw, gpointer user_data)
1303 g_return_if_fail (sw);
1304 g_return_if_fail (user_data);
1306 g_signal_handlers_disconnect_matched (sw->dialog, G_SIGNAL_MATCH_DATA,
1307 0, 0, NULL, NULL, user_data);
1313 GNCSearchSelectedCB selected_cb,
1315 gboolean allow_clear)
1317 g_return_if_fail (sw);
1319 sw->selected_cb = selected_cb;
1320 sw->select_arg = user_data;
1321 sw->allow_clear = allow_clear;
1324 if (sw->select_button)
1327 gtk_widget_show (sw->select_button);
1329 gtk_widget_hide (sw->select_button);
1333 gnc_search_dialog_show_close_cancel (sw);
1344 list = gnc_search_param_prepend (list,
"Txn: All Accounts",
1346 type, SPLIT_TRANS, TRANS_SPLITLIST,
1348 list = gnc_search_param_prepend (list,
"Split Account", GNC_ID_ACCOUNT,
1349 type, SPLIT_ACCOUNT, QOF_PARAM_GUID,
1351 list = gnc_search_param_prepend (list,
"Split->Txn->Void?", NULL, type,
1352 SPLIT_TRANS, TRANS_VOID_STATUS, NULL);
1353 list = gnc_search_param_prepend (list,
"Split Int64", NULL, type,
1354 "d-share-int64", NULL);
1355 list = gnc_search_param_prepend (list,
"Split Amount (double)", NULL, type,
1356 "d-share-amount", NULL);
1357 list = gnc_search_param_prepend (list,
"Split Value (debcred)", NULL, type,
1359 list = gnc_search_param_prepend (list,
"Split Amount (numeric)", NULL, type,
1360 SPLIT_AMOUNT, NULL);
1361 list = gnc_search_param_prepend (list,
"Date Reconciled (date)", NULL, type,
1362 SPLIT_DATE_RECONCILED, NULL);
1363 list = gnc_search_param_prepend (list,
"Split Memo (string)", NULL, type,
1375 list = gnc_search_param_prepend (list,
"Amount", NULL, type, SPLIT_AMOUNT,
1377 list = gnc_search_param_prepend (list,
"Memo", NULL, type, SPLIT_MEMO, NULL);
1378 list = gnc_search_param_prepend (list,
"Date", NULL, type, SPLIT_TRANS,
1379 TRANS_DATE_POSTED, NULL);
1386 do_nothing (gpointer *a, gpointer b)
1393 gnc_search_dialog_test (
void)
1395 static GList *params = NULL;
1396 static GList *display = NULL;
1400 { (
"View Split"), do_nothing, NULL, TRUE },
1401 { (
"New Split"), do_nothing, NULL, TRUE },
1402 { (
"Do Something"), do_nothing, NULL, TRUE },
1403 { (
"Do Nothing"), do_nothing, NULL, TRUE },
1404 { (
"Who Cares?"), do_nothing, NULL, FALSE },
1409 params = get_params_list (GNC_ID_SPLIT);
1411 if (display == NULL)
1412 display = get_display_list (GNC_ID_SPLIT);
1415 gnc_search_dialog_create (GNC_ID_SPLIT, _(
"Find Transaction"),
1417 NULL, NULL, buttons, NULL, NULL, NULL, NULL,
void qof_query_add_term(QofQuery *query, QofQueryParamList *param_list, QofQueryPredData *pred_data, QofQueryOp op)
const char * qof_object_get_type_label(QofIdTypeConst type_name)
utility functions for the GnuCash UI
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
void qof_query_purge_terms(QofQuery *q, QofQueryParamList *param_list)
const gchar * QofIdTypeConst
QofQuery * qof_query_copy(QofQuery *q)
struct _QofQuery QofQuery
#define PWARN(format, args...)
const QofParam * qof_class_get_parameter(QofIdTypeConst obj_name, const char *parameter)
void qof_query_destroy(QofQuery *q)
#define ACCOUNT_MATCH_ALL_TYPE
gboolean gnc_prefs_set_bool(const gchar *group, const gchar *pref_name, gboolean value)
void qof_query_set_book(QofQuery *q, QofBook *book)
#define SPLIT_ACCOUNT_GUID
QofQuery * qof_query_merge(QofQuery *q1, QofQuery *q2, QofQueryOp op)
QofQuery * qof_query_invert(QofQuery *q)
void gnc_gnome_help(const char *file_name, const char *anchor)
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
Generic api to store and retrieve preferences.
gboolean qof_book_is_readonly(const QofBook *book)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
void qof_query_add_boolean_match(QofQuery *q, QofQueryParamList *param_list, gboolean value, QofQueryOp op)
API for Transactions and Splits (journal entries)
const gchar * QofLogModule
gdouble gnc_prefs_get_float(const gchar *group, const gchar *pref_name)