X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Ffind-dialog.c;h=1a3a0a5c91afcfeb70067d2e29bf56887880eba6;hb=ea17c5b225557fc0760810861451a84dc241d462;hp=87c88bf6e227edb996042bf9204d61117a762f67;hpb=f82952d22e200e1b35cea23545857a2cf2f02c66;p=pspp diff --git a/src/ui/gui/find-dialog.c b/src/ui/gui/find-dialog.c index 87c88bf6e2..1a3a0a5c91 100644 --- a/src/ui/gui/find-dialog.c +++ b/src/ui/gui/find-dialog.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2007 Free Software Foundation + Copyright (C) 2007, 2009, 2011, 2012 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,42 +20,41 @@ which match particular strings */ #include -#include "find-dialog.h" -#include "psppire-selector.h" -#include "psppire-dialog.h" -#include "helper.h" -#include "data-editor.h" -#include "dict-display.h" -#include -#include -#include -#include "psppire-data-store.h" #include -#include -#include -#include - #include -#include +#include #include +#include -#include "xalloc.h" +#include "data/data-in.h" +#include "data/datasheet.h" +#include "data/format.h" +#include "data/value.h" +#include "libpspp/cast.h" +#include "libpspp/message.h" +#include "ui/gui/builder-wrapper.h" +#include "ui/gui/dict-display.h" +#include "ui/gui/find-dialog.h" +#include "ui/gui/helper.h" +#include "ui/gui/psppire-data-sheet.h" +#include "ui/gui/psppire-data-store.h" +#include "ui/gui/psppire-data-window.h" +#include "ui/gui/psppire-dialog.h" +#include "ui/gui/psppire-selector.h" + +#include "gl/xalloc.h" #include #define _(msgid) gettext (msgid) #define N_(msgid) msgid -/* FIXME: These shouldn't be here */ -#include -#include "psppire-var-store.h" - struct find_dialog { - GladeXML *xml; + GtkBuilder *xml; PsppireDict *dict; struct datasheet *data; - struct data_editor *de; + PsppireDataWindow *de; GtkWidget *variable_entry; GtkWidget *value_entry; GtkWidget *value_labels_checkbox; @@ -101,12 +100,13 @@ refresh (GObject *obj, const struct find_dialog *fd) static void do_find (GObject *obj, const struct find_dialog *fd) { + PsppireDataSheet *data_sheet; casenumber x = -1; gint column = -1; glong row; - g_object_get (fd->de->data_editor, "current-case", &row, NULL); - + data_sheet = psppire_data_editor_get_active_data_sheet (fd->de->data_editor); + row = psppire_data_sheet_get_selected_case (data_sheet); if ( row < 0 ) row = 0; @@ -115,13 +115,11 @@ do_find (GObject *obj, const struct find_dialog *fd) if ( x != -1) { - gtk_notebook_set_page (GTK_NOTEBOOK (fd->de->data_editor), - PSPPIRE_DATA_EDITOR_DATA_VIEW); + gtk_notebook_set_current_page (GTK_NOTEBOOK (fd->de->data_editor), + PSPPIRE_DATA_EDITOR_DATA_VIEW); - g_object_set (fd->de->data_editor, - "current-case", x, - "current-variable", column, - NULL); + psppire_data_sheet_goto_case (data_sheet, x); + psppire_data_sheet_goto_variable (data_sheet, column); } } @@ -184,10 +182,8 @@ value_labels_toggled (GtkToggleButton *tb, gpointer data) /* Pops up the Find dialog box */ void -find_dialog (GObject *o, gpointer data) +find_dialog (PsppireDataWindow *de) { - struct data_editor *de = data; - struct find_dialog fd; GtkWidget *dialog ; @@ -197,10 +193,9 @@ find_dialog (GObject *o, gpointer data) GtkWidget *buttonbox; - PsppireVarStore *vs ; PsppireDataStore *ds ; - fd.xml = XML_NEW ("psppire.glade"); + fd.xml = builder_new ("find.ui"); fd.de = de; find_button = gtk_button_new_from_stock (GTK_STOCK_FIND); @@ -208,7 +203,7 @@ find_dialog (GObject *o, gpointer data) buttonbox = get_widget_assert (fd.xml, "find-buttonbox"); - gtk_box_pack_start_defaults (GTK_BOX (buttonbox), find_button); + psppire_box_pack_start_defaults (GTK_BOX (buttonbox), find_button); gtk_box_reorder_child (GTK_BOX (buttonbox), find_button, 0); dialog = get_widget_assert (fd.xml, "find-dialog"); @@ -216,12 +211,11 @@ find_dialog (GObject *o, gpointer data) selector = get_widget_assert (fd.xml, "find-selector"); g_object_get (de->data_editor, - "var-store", &vs, + "dictionary", &fd.dict, "data-store", &ds, NULL); - fd.dict = vs->dict; - fd.data = ds->case_file->datasheet; + fd.data = ds->datasheet; fd.variable_entry = get_widget_assert (fd.xml, "find-variable-entry"); fd.value_entry = get_widget_assert (fd.xml, "find-value-entry"); @@ -239,21 +233,16 @@ find_dialog (GObject *o, gpointer data) - gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window); + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); + + g_object_set (source, "model", fd.dict, + "selection-mode", GTK_SELECTION_SINGLE, + NULL); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - fd.dict, - GTK_SELECTION_SINGLE, - NULL); - psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector), - source, - fd.variable_entry, - insert_source_row_into_entry, - is_currently_in_entry, - NULL - ); + psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector), + is_currently_in_entry); g_signal_connect (dialog, "refresh", G_CALLBACK (refresh), &fd); @@ -287,7 +276,7 @@ forward (casenumber *i, struct datasheet *data UNUSED) static void forward_wrap (casenumber *i, struct datasheet *data) { - if ( ++*i >= datasheet_get_row_cnt (data) ) *i = 0; + if ( ++*i >= datasheet_get_n_rows (data) ) *i = 0; } static void @@ -301,7 +290,7 @@ static void backward_wrap (casenumber *i, struct datasheet *data) { if ( --*i < 0 ) - *i = datasheet_get_row_cnt (data) - 1; + *i = datasheet_get_n_rows (data) - 1; } @@ -346,7 +335,7 @@ cm1c (casenumber current, struct datasheet *data) static casenumber last (casenumber current, struct datasheet *data) { - return datasheet_get_row_cnt (data) ; + return datasheet_get_n_rows (data) ; } static casenumber @@ -441,7 +430,7 @@ struct comparator struct value_comparator { struct comparator parent; - union value *pattern; + union value pattern; }; /* A comparator which matches string values or parts thereof */ @@ -464,7 +453,7 @@ value_compare (const struct comparator *cmptr, const union value *v) { const struct value_comparator *vc = (const struct value_comparator *) cmptr; - return 0 == compare_values (v, vc->pattern, var_get_width (cmptr->var)); + return 0 == value_compare_3way (v, &vc->pattern, var_get_width (cmptr->var)); } @@ -476,8 +465,13 @@ string_label_compare (const struct comparator *cmptr, const struct string_comparator *ssc = (const struct string_comparator *) cmptr; + int width; + const char *text = var_lookup_value_label (cmptr->var, val); - int width = strlen (text); + if (text == NULL) + return false; + + width = strlen (text); assert ( cmptr->flags & STR_CMP_LABELS); @@ -494,20 +488,24 @@ static bool string_value_compare (const struct comparator *cmptr, const union value *val) { + bool found; + char *text; const struct string_comparator *ssc = (const struct string_comparator *) cmptr; - const char *text = val->s; int width = var_get_width (cmptr->var); - + g_return_val_if_fail (width > 0, false); assert ( ! (cmptr->flags & STR_CMP_LABELS)); - g_return_val_if_fail (width > 0, false); + text = value_to_text (*val, cmptr->var); if ( cmptr->flags & STR_CMP_SUBSTR) - return (NULL != g_strstr_len (text, width, ssc->pattern)); + found = (NULL != g_strstr_len (text, width, ssc->pattern)); else - return (0 == strncmp (text, ssc->pattern, width)); + found = (0 == strncmp (text, ssc->pattern, width)); + + free (text); + return found; } @@ -528,9 +526,9 @@ regexp_value_compare (const struct comparator *cmptr, g_return_val_if_fail (width > 0, false); + text = value_to_text (*val, cmptr->var); /* We must remove trailing whitespace, otherwise $ will not match where one would expect */ - text = g_strndup (val->s, width); g_strchomp (text); retval = (0 == regexec (&rec->re, text, 0, 0, 0)); @@ -566,46 +564,33 @@ regexp_label_compare (const struct comparator *cmptr, static void regexp_destroy (struct comparator *cmptr) { - struct regexp_comparator *rec = (struct regexp_comparator *) cmptr; + struct regexp_comparator *rec + = UP_CAST (cmptr, struct regexp_comparator, parent); regfree (&rec->re); } static void -value_destroy (struct comparator *cmptr) +cmptr_value_destroy (struct comparator *cmptr) { - struct value_comparator *vc = (struct value_comparator *) cmptr; - free (vc->pattern); + struct value_comparator *vc + = UP_CAST (cmptr, struct value_comparator, parent); + value_destroy (&vc->pattern, var_get_width (cmptr->var)); } static struct comparator * value_comparator_create (const struct variable *var, const char *target) { - const struct fmt_spec *fmt; - int width ; struct value_comparator *vc = xzalloc (sizeof (*vc)); - struct comparator *cmptr = (struct comparator *) vc; + struct comparator *cmptr = &vc->parent; cmptr->flags = 0; cmptr->var = var; cmptr->compare = value_compare ; - cmptr->destroy = value_destroy; + cmptr->destroy = cmptr_value_destroy; - width = var_get_width (var); - fmt = var_get_write_format (var); - - vc->pattern = value_create (width); - - if ( ! data_in (ss_cstr (target), - LEGACY_NATIVE, - fmt->type, - 0, 0, 0, - vc->pattern, width) ) - { - free (vc); - return NULL; - } + text_to_value (target, var, &vc->pattern); return cmptr; } @@ -615,7 +600,7 @@ string_comparator_create (const struct variable *var, const char *target, enum string_cmp_flags flags) { struct string_comparator *ssc = xzalloc (sizeof (*ssc)); - struct comparator *cmptr = (struct comparator *) ssc; + struct comparator *cmptr = &ssc->parent; cmptr->flags = flags; cmptr->var = var; @@ -637,7 +622,7 @@ regexp_comparator_create (const struct variable *var, const char *target, { int code; struct regexp_comparator *rec = xzalloc (sizeof (*rec)); - struct comparator *cmptr = (struct comparator *) rec; + struct comparator *cmptr = &rec->parent; cmptr->flags = flags; cmptr->var = var; @@ -741,12 +726,13 @@ find_value (const struct find_dialog *fd, casenumber current_row, flags |= STR_CMP_LABELS; { - union value *val = value_create (width); + union value val; casenumber i; const struct casenum_iterator *ip = get_iteration_params (fd); struct comparator *cmptr = comparator_factory (var, target_string, flags); + value_init (&val, width); if ( ! cmptr) goto finish; @@ -754,10 +740,9 @@ find_value (const struct find_dialog *fd, casenumber current_row, i != ip->end (current_row, fd->data); ip->next (&i, fd->data)) { - datasheet_get_value (fd->data, i, var_get_case_index (var), - val, width); + datasheet_get_value (fd->data, i, var_get_case_index (var), &val); - if ( comparator_compare (cmptr, val)) + if ( comparator_compare (cmptr, &val)) { *row = i; break; @@ -766,6 +751,6 @@ find_value (const struct find_dialog *fd, casenumber current_row, finish: comparator_destroy (cmptr); - free (val); + value_destroy (&val, width); } }