29 #include <glib/gi18n.h> 31 #include <sys/types.h> 34 #include "search-string.h" 35 #include "search-core-utils.h" 40 static void editable_enters (GNCSearchCoreType *fe);
41 static void pass_parent (GNCSearchCoreType *fe, gpointer parent);
42 static void grab_focus (GNCSearchCoreType *fe);
43 static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe);
44 static gboolean gncs_validate (GNCSearchCoreType *fe);
45 static GtkWidget *gncs_get_widget(GNCSearchCoreType *fe);
46 static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe);
48 static void gnc_search_string_finalize (GObject *obj);
52 GNCSearchCoreType parent_instance;
54 GNCSearchString_Type how;
62 G_DEFINE_TYPE(GNCSearchString, gnc_search_string, GNC_TYPE_SEARCH_CORE_TYPE)
65 gnc_search_string_class_init (GNCSearchStringClass *klass)
67 GObjectClass *object_class;
68 GNCSearchCoreTypeClass *gnc_search_core_type = (GNCSearchCoreTypeClass *)klass;
70 object_class = G_OBJECT_CLASS (klass);
72 object_class->finalize = gnc_search_string_finalize;
75 gnc_search_core_type->editable_enters = editable_enters;
76 gnc_search_core_type->pass_parent = pass_parent;
77 gnc_search_core_type->grab_focus = grab_focus;
78 gnc_search_core_type->validate = gncs_validate;
79 gnc_search_core_type->get_widget = gncs_get_widget;
80 gnc_search_core_type->get_predicate = gncs_get_predicate;
81 gnc_search_core_type->clone = gncs_clone;
85 gnc_search_string_init (GNCSearchString *o)
88 o->how = SEARCH_STRING_CONTAINS;
93 gnc_search_string_finalize (GObject *obj)
95 GNCSearchString *o = (GNCSearchString *)obj;
96 g_assert (GNC_IS_SEARCH_STRING (o));
100 G_OBJECT_CLASS (gnc_search_string_parent_class)->finalize(obj);
111 gnc_search_string_new (
void)
113 GNCSearchString *o = g_object_new(GNC_TYPE_SEARCH_STRING, NULL);
118 gnc_search_string_set_value (GNCSearchString *fi,
const char *value)
120 g_return_if_fail (fi);
121 g_return_if_fail (GNC_IS_SEARCH_STRING (fi));
126 fi->value = g_strdup (value);
130 gnc_search_string_set_how (GNCSearchString *fi, GNCSearchString_Type how)
132 g_return_if_fail (fi);
133 g_return_if_fail (GNC_IS_SEARCH_STRING (fi));
138 gnc_search_string_set_case (GNCSearchString *fi, gboolean ignore_case)
140 g_return_if_fail (fi);
141 g_return_if_fail (GNC_IS_SEARCH_STRING (fi));
142 fi->ign_case = ignore_case;
146 gncs_validate (GNCSearchCoreType *fe)
148 GNCSearchString *fi = (GNCSearchString *)fe;
149 gboolean valid = TRUE;
151 g_return_val_if_fail (fi, FALSE);
152 g_return_val_if_fail (GNC_IS_SEARCH_STRING (fi), FALSE);
154 if (!fi->value || *(fi->value) ==
'\0')
157 dialog = gtk_message_dialog_new (GTK_WINDOW(fi->parent),
162 _(
"You need to enter some search text."));
163 gtk_dialog_run (GTK_DIALOG (dialog));
164 gtk_widget_destroy(dialog);
168 if (fi->how == SEARCH_STRING_MATCHES_REGEX ||
169 fi->how == SEARCH_STRING_NOT_MATCHES_REGEX)
173 int flags = REG_EXTENDED;
178 regerr = regcomp (®expat, fi->value, flags);
182 gchar *regmsg, *errmsg;
187 reglen = regerror (regerr, ®expat, 0, 0);
188 regmsg = g_malloc0 (reglen + 1);
189 regerror (regerr, ®expat, regmsg, reglen);
191 errmsg = g_strdup_printf (_(
"Error in regular expression '%s':\n%s"),
195 dialog = gtk_message_dialog_new (GTK_WINDOW(fi->parent),
200 gtk_dialog_run (GTK_DIALOG (dialog));
201 gtk_widget_destroy(dialog);
213 toggle_changed (GtkToggleButton *button, GNCSearchString *fe)
215 fe->ign_case = !gtk_toggle_button_get_active (button);
219 entry_changed (GtkEntry *entry, GNCSearchString *fe)
223 new_str = gtk_entry_get_text(entry);
224 gnc_search_string_set_value (fe, new_str);
228 make_menu (GNCSearchCoreType *fe)
230 GNCSearchString *fi = (GNCSearchString *)fe;
233 combo = GTK_COMBO_BOX(gnc_combo_box_new_search());
235 gnc_combo_box_search_add(combo, _(
"contains"), SEARCH_STRING_CONTAINS);
236 gnc_combo_box_search_add(combo, _(
"equals"), SEARCH_STRING_EQUAL);
237 gnc_combo_box_search_add(combo, _(
"matches regex"),
238 SEARCH_STRING_MATCHES_REGEX);
239 gnc_combo_box_search_add(combo, _(
"does not match regex"),
240 SEARCH_STRING_NOT_MATCHES_REGEX);
241 gnc_combo_box_search_changed(combo, &fi->how);
242 gnc_combo_box_search_set_active(combo, fi->how ? fi->how : SEARCH_STRING_CONTAINS);
244 return GTK_WIDGET(combo);
248 grab_focus (GNCSearchCoreType *fe)
250 GNCSearchString *fi = (GNCSearchString *)fe;
252 g_return_if_fail (fi);
253 g_return_if_fail (GNC_IS_SEARCH_STRING (fi));
256 gtk_widget_grab_focus (fi->entry);
260 editable_enters (GNCSearchCoreType *fe)
262 GNCSearchString *fi = (GNCSearchString *)fe;
264 g_return_if_fail (fi);
265 g_return_if_fail (GNC_IS_SEARCH_STRING (fi));
268 gtk_entry_set_activates_default(GTK_ENTRY (fi->entry), TRUE);
272 pass_parent (GNCSearchCoreType *fe, gpointer parent)
274 GNCSearchString *fi = (GNCSearchString *)fe;
276 g_return_if_fail (fi);
277 g_return_if_fail (GNC_IS_SEARCH_STRING (fi));
279 fi->parent = GTK_WINDOW(parent);
283 gncs_get_widget (GNCSearchCoreType *fe)
285 GtkWidget *entry, *toggle, *menu, *box;
286 GNCSearchString *fi = (GNCSearchString *)fe;
288 g_return_val_if_fail (fi, NULL);
289 g_return_val_if_fail (GNC_IS_SEARCH_STRING (fi), NULL);
291 box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
292 gtk_box_set_homogeneous (GTK_BOX (box), FALSE);
295 menu = make_menu (fe);
296 gtk_box_pack_start (GTK_BOX (box), menu, FALSE, FALSE, 3);
299 entry = gtk_entry_new ();
301 gtk_entry_set_text (GTK_ENTRY (entry), fi->value);
302 g_signal_connect (G_OBJECT (entry),
"changed", G_CALLBACK (entry_changed), fe);
303 gtk_box_pack_start (GTK_BOX (box), entry, FALSE, FALSE, 3);
307 toggle = gtk_check_button_new_with_label (_(
"Match case"));
308 g_signal_connect (G_OBJECT(toggle),
"toggled", G_CALLBACK (toggle_changed), fe);
309 gtk_box_pack_start (GTK_BOX (box), toggle, FALSE, FALSE, 3);
315 static QofQueryPredData* gncs_get_predicate (GNCSearchCoreType *fe)
317 GNCSearchString *ss = (GNCSearchString *)fe;
320 gboolean is_regex = FALSE;
322 g_return_val_if_fail (ss, NULL);
323 g_return_val_if_fail (GNC_IS_SEARCH_STRING (ss), NULL);
327 case SEARCH_STRING_MATCHES_REGEX:
330 case SEARCH_STRING_CONTAINS:
331 how = QOF_COMPARE_CONTAINS;
333 case SEARCH_STRING_EQUAL:
334 how = QOF_COMPARE_EQUAL;
336 case SEARCH_STRING_NOT_MATCHES_REGEX:
339 case SEARCH_STRING_NOT_CONTAINS:
340 how = QOF_COMPARE_NCONTAINS;
342 case SEARCH_STRING_NOT_EQUAL:
343 how = QOF_COMPARE_NEQ;
346 g_warning (
"invalid string choice: %d", ss->how);
351 options = QOF_STRING_MATCH_CASEINSENSITIVE;
353 return qof_query_string_predicate (how, ss->value, options, is_regex);
356 static GNCSearchCoreType *gncs_clone(GNCSearchCoreType *fe)
358 GNCSearchString *se, *fse = (GNCSearchString *)fe;
360 g_return_val_if_fail (fse, NULL);
361 g_return_val_if_fail (GNC_IS_SEARCH_STRING (fse), NULL);
363 se = gnc_search_string_new ();
364 gnc_search_string_set_value (se, fse->value);
365 gnc_search_string_set_how (se, fse->how);
366 gnc_search_string_set_case (se, fse->ign_case);
368 return (GNCSearchCoreType *)se;
QofStringMatch
List of known core query data-types...
QofQueryCompare
Standard Query comparators, for how to compare objects in a predicate.