29 #include <glib/gi18n.h>
31 #include <sys/types.h>
34 #include "search-string.h"
35 #include "search-core-utils.h"
49 static void gnc_search_string_finalize (GObject *obj);
59 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_SEARCH_STRING, GNCSearchStringPrivate))
64 gnc_search_string_get_type (
void)
66 static GType type = 0;
75 (GClassInitFunc)gnc_search_string_class_init,
80 (GInstanceInitFunc)gnc_search_string_init,
83 type = g_type_register_static (GNC_TYPE_SEARCH_CORE_TYPE,
94 GObjectClass *object_class;
97 object_class = G_OBJECT_CLASS (klass);
98 parent_class = g_type_class_peek_parent (klass);
100 object_class->finalize = gnc_search_string_finalize;
103 gnc_search_core_type->editable_enters = editable_enters;
104 gnc_search_core_type->grab_focus = grab_focus;
105 gnc_search_core_type->validate = gncs_validate;
106 gnc_search_core_type->get_widget = gncs_get_widget;
107 gnc_search_core_type->get_predicate = gncs_get_predicate;
108 gnc_search_core_type->clone = gncs_clone;
117 o->how = SEARCH_STRING_CONTAINS;
122 gnc_search_string_finalize (GObject *obj)
125 g_assert (IS_GNCSEARCH_STRING (o));
129 G_OBJECT_CLASS (parent_class)->finalize(obj);
140 gnc_search_string_new (
void)
149 g_return_if_fail (fi);
150 g_return_if_fail (IS_GNCSEARCH_STRING (fi));
155 fi->value = g_strdup (value);
159 gnc_search_string_set_how (
GNCSearchString *fi, GNCSearchString_Type how)
161 g_return_if_fail (fi);
162 g_return_if_fail (IS_GNCSEARCH_STRING (fi));
169 g_return_if_fail (fi);
170 g_return_if_fail (IS_GNCSEARCH_STRING (fi));
171 fi->ign_case = ignore_case;
178 gboolean valid = TRUE;
180 g_return_val_if_fail (fi, FALSE);
181 g_return_val_if_fail (IS_GNCSEARCH_STRING (fi), FALSE);
183 if (!fi->value || *(fi->value) ==
'\0')
186 dialog = gtk_message_dialog_new (NULL,
191 _(
"You need to enter some search text."));
192 gtk_dialog_run (GTK_DIALOG (dialog));
193 gtk_widget_destroy(dialog);
197 if (fi->how == SEARCH_STRING_MATCHES_REGEX ||
198 fi->how == SEARCH_STRING_NOT_MATCHES_REGEX)
202 int flags = REG_EXTENDED;
207 regerr = regcomp (®expat, fi->value, flags);
211 gchar *regmsg, *errmsg;
216 reglen = regerror (regerr, ®expat, 0, 0);
217 regmsg = g_malloc0 (reglen + 1);
218 regerror (regerr, ®expat, regmsg, reglen);
220 errmsg = g_strdup_printf (_(
"Error in regular expression '%s':\n%s"),
224 dialog = gtk_message_dialog_new (NULL,
229 gtk_dialog_run (GTK_DIALOG (dialog));
230 gtk_widget_destroy(dialog);
244 fe->ign_case = !gtk_toggle_button_get_active (button);
252 new_str = gtk_entry_get_text(entry);
253 gnc_search_string_set_value (fe, new_str);
262 combo = GTK_COMBO_BOX(gnc_combo_box_new_search());
264 gnc_combo_box_search_add(combo, _(
"contains"), SEARCH_STRING_CONTAINS);
265 gnc_combo_box_search_add(combo, _(
"equals"), SEARCH_STRING_EQUAL);
266 gnc_combo_box_search_add(combo, _(
"matches regex"),
267 SEARCH_STRING_MATCHES_REGEX);
268 gnc_combo_box_search_add(combo, _(
"does not match regex"),
269 SEARCH_STRING_NOT_MATCHES_REGEX);
270 gnc_combo_box_search_changed(combo, &fi->how);
271 gnc_combo_box_search_set_active(combo, fi->how ? fi->how : SEARCH_STRING_CONTAINS);
273 return GTK_WIDGET(combo);
282 g_return_if_fail (fi);
283 g_return_if_fail (IS_GNCSEARCH_STRING (fi));
287 gtk_widget_grab_focus (priv->entry);
296 g_return_if_fail (fi);
297 g_return_if_fail (IS_GNCSEARCH_STRING (fi));
301 gtk_entry_set_activates_default(GTK_ENTRY (priv->entry), TRUE);
307 GtkWidget *entry, *toggle, *menu, *box;
311 g_return_val_if_fail (fi, NULL);
312 g_return_val_if_fail (IS_GNCSEARCH_STRING (fi), NULL);
315 box = gtk_hbox_new (FALSE, 3);
318 menu = make_menu (fe);
319 gtk_box_pack_start (GTK_BOX (box), menu, FALSE, FALSE, 3);
322 entry = gtk_entry_new ();
324 gtk_entry_set_text (GTK_ENTRY (entry), fi->value);
325 g_signal_connect (G_OBJECT (entry),
"changed", G_CALLBACK (entry_changed), fe);
326 gtk_box_pack_start (GTK_BOX (box), entry, FALSE, FALSE, 3);
330 toggle = gtk_check_button_new_with_label (_(
"Match case"));
331 g_signal_connect (G_OBJECT(toggle),
"toggled", G_CALLBACK (toggle_changed), fe);
332 gtk_box_pack_start (GTK_BOX (box), toggle, FALSE, FALSE, 3);
343 gboolean is_regex = FALSE;
345 g_return_val_if_fail (ss, NULL);
346 g_return_val_if_fail (IS_GNCSEARCH_STRING (ss), NULL);
350 case SEARCH_STRING_MATCHES_REGEX:
353 case SEARCH_STRING_CONTAINS:
354 how = QOF_COMPARE_CONTAINS;
356 case SEARCH_STRING_EQUAL:
357 how = QOF_COMPARE_EQUAL;
359 case SEARCH_STRING_NOT_MATCHES_REGEX:
362 case SEARCH_STRING_NOT_CONTAINS:
363 how = QOF_COMPARE_NCONTAINS;
365 case SEARCH_STRING_NOT_EQUAL:
366 how = QOF_COMPARE_NEQ;
369 g_warning (
"invalid string choice: %d", ss->how);
374 options = QOF_STRING_MATCH_CASEINSENSITIVE;
376 return qof_query_string_predicate (how, ss->value, options, is_regex);
383 g_return_val_if_fail (fse, NULL);
384 g_return_val_if_fail (IS_GNCSEARCH_STRING (fse), NULL);
386 se = gnc_search_string_new ();
387 gnc_search_string_set_value (se, fse->value);
388 gnc_search_string_set_how (se, fse->how);
389 gnc_search_string_set_case (se, fse->ign_case);