static void new_variables_callback (PsppireDict *dict, gpointer data) { gint v; PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); gint m_width = width_of_m (GTK_WIDGET (de)); PsppireAxis *vaxis; g_object_get (de->var_sheet, "vertical-axis", &vaxis, NULL); psppire_axis_clear (vaxis); psppire_axis_append_n (vaxis, 1 + psppire_dict_get_var_cnt (dict), DEFAULT_ROW_HEIGHT); g_signal_connect_swapped (de->haxis, "resize-unit", G_CALLBACK (rewidth_variable), de); psppire_axis_clear (de->haxis); for (v = 0 ; v < psppire_dict_get_var_cnt (dict); ++v) { const struct variable *var = psppire_dict_get_variable (dict, v); psppire_axis_append (de->haxis, m_width * var_get_display_width (var)); } }
static void popup_variable_row_menu (PsppireSheet *sheet, gint row, GdkEventButton *event, gpointer data) { GtkMenu *menu = GTK_MENU (data); PsppireVarStore *var_store = PSPPIRE_VAR_STORE (psppire_sheet_get_model (sheet)); PsppireDict *dict; const struct variable *v ; g_object_get (var_store, "dictionary", &dict, NULL); v = psppire_dict_get_variable (dict, row); if ( v && event->button == 3) { psppire_sheet_select_row (sheet, row); gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event->button, event->time); } }
/* Update the data_ref_entry with the reference of the active cell */ static gint update_data_ref_entry (const PsppireSheet *sheet, gint row, gint col, gint old_row, gint old_col, gpointer data) { PsppireDataEditor *de = data; PsppireDataStore *data_store = PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet)); if (data_store) { const struct variable *var = psppire_dict_get_variable (data_store->dict, col); if ( var ) { gchar *text = g_strdup_printf ("%d: %s", row + FIRST_CASE_NUMBER, var_get_name (var)); gtk_entry_set_text (GTK_ENTRY (de->cell_ref_entry), text); g_free (text); } else goto blank_entry; if ( var ) { gchar *text = psppire_data_store_get_string (data_store, row, var_get_dict_index(var)); if ( ! text ) goto blank_entry; g_strchug (text); gtk_entry_set_text (GTK_ENTRY (de->datum_entry), text); g_free (text); } else goto blank_entry; } return FALSE; blank_entry: gtk_entry_set_text (GTK_ENTRY (de->datum_entry), ""); return FALSE; }
static void do_sort (PsppireDataEditor *de, int var, gboolean descend) { const struct variable *v = psppire_dict_get_variable (de->data_store->dict, var); gchar *syntax; syntax = g_strdup_printf ("SORT CASES BY %s%s.", var_get_name (v), descend ? " (D)" : ""); g_free (execute_syntax_string (de->data_window, syntax)); }
/* Callback for the axis' resize signal. Changes the variable's display width */ static void rewidth_variable (GtkWidget *w, gint unit, glong size) { PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (w); const PsppireDict *dict = de->data_store->dict; struct variable *var = psppire_dict_get_variable (dict, unit); if (NULL == var) return; var_set_display_width (var, size / (float) width_of_m (w)); }
static void rewidth_variable_callback (PsppireDict *dict, gint posn, gpointer data) { PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); gint m_width = width_of_m (GTK_WIDGET (de)); const struct variable *var = psppire_dict_get_variable (dict, posn); gint var_width = var_get_display_width (var); /* Don't allow zero width */ if ( var_width < 1 ) var_width = 1; psppire_axis_resize (de->haxis, posn, m_width * var_width); }
/* Returns true iff the variable selected by SOURCE is numeric */ gboolean numeric_only (GtkWidget *source, GtkWidget *dest) { gboolean retval = TRUE; GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (source)); PsppireDict *dict; GtkTreeSelection *selection; GList *list, *l; while (GTK_IS_TREE_MODEL_FILTER (model)) { model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model)); } dict = PSPPIRE_DICT (model); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (source)); list = gtk_tree_selection_get_selected_rows (selection, &model); /* Iterate through the selection of the source treeview */ for (l = list; l ; l = l->next) { GtkTreePath *path = l->data; GtkTreePath *fpath = gtk_tree_model_filter_convert_path_to_child_path (GTK_TREE_MODEL_FILTER (model), path); gint *idx = gtk_tree_path_get_indices (fpath); const struct variable *v = psppire_dict_get_variable (dict, idx[0]); gtk_tree_path_free (fpath); if ( var_is_alpha (v)) { retval = FALSE; break; } } g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); g_list_free (list); return retval; }
/* Inserts the name of the selected variable into the destination widget. The destination widget must be a GtkTextView */ static void insert_source_row_into_text_view (GtkTreeIter iter, GtkWidget *dest, GtkTreeModel *model, gpointer data ) { GtkTreePath *path; PsppireDict *dict; gint *idx; struct variable *var; GtkTreeIter dict_iter; GtkTextBuffer *buffer; g_return_if_fail (GTK_IS_TEXT_VIEW (dest)); if ( GTK_IS_TREE_MODEL_FILTER (model)) { dict = PSPPIRE_DICT (gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(model))); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &dict_iter, &iter); } else { dict = PSPPIRE_DICT (model); dict_iter = iter; } path = gtk_tree_model_get_path (GTK_TREE_MODEL (dict), &dict_iter); idx = gtk_tree_path_get_indices (path); var = psppire_dict_get_variable (dict, *idx); gtk_tree_path_free (path); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dest)); erase_selection (buffer); gtk_text_buffer_insert_at_cursor (buffer, var_get_name (var), -1); }
static void insert_variable_callback (PsppireDict *dict, gint x, gpointer data) { PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data); gint m_width = width_of_m (GTK_WIDGET (de)); PsppireAxis *var_vaxis; const struct variable *var = psppire_dict_get_variable (dict, x); g_object_get (de->var_sheet, "vertical-axis", &var_vaxis, NULL); psppire_axis_insert (var_vaxis, x, DEFAULT_ROW_HEIGHT); psppire_axis_insert (de->haxis, x, m_width * var_get_display_width (var)); }
static void popup_variable_column_menu (PsppireSheet *sheet, gint column, GdkEventButton *event, gpointer data) { GtkMenu *menu = GTK_MENU (data); PsppireDataStore *data_store = PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet)); const struct variable *v = psppire_dict_get_variable (data_store->dict, column); if ( v && event->button == 3) { psppire_sheet_select_column (sheet, column); gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event->button, event->time); } }
/* Returns true iff the variable selected by SOURCE is numeric */ gboolean numeric_only (GtkWidget *source, GtkWidget *dest) { gboolean retval = TRUE; GtkTreeModel *top_model = gtk_tree_view_get_model (GTK_TREE_VIEW (source)); GtkTreeModel *model = NULL; PsppireDict *dict; GtkTreeSelection *selection; GList *list, *l; get_base_model (top_model, NULL, &model, NULL); dict = PSPPIRE_DICT (model); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (source)); list = gtk_tree_selection_get_selected_rows (selection, &top_model); /* Iterate through the selection of the source treeview */ for (l = list; l ; l = l->next) { GtkTreePath *p = get_base_tree_path (top_model, l->data); gint *idx = gtk_tree_path_get_indices (p); const struct variable *v = psppire_dict_get_variable (dict, idx[0]); gtk_tree_path_free (p); if ( var_is_alpha (v)) { retval = FALSE; break; } } g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); g_list_free (list); return retval; }
/* Returns FALSE if the variables represented by the union of the rows currently selected by SOURCE widget, and contents of the DEST widget, are of different types. In other words, this function when passed as the argument to psppire_selector_set_allow, ensures that the selector selects only string variables, or only numeric variables, not a mixture. */ gboolean homogeneous_types (GtkWidget *source, GtkWidget *dest) { gboolean ok; GtkTreeIter iter; gboolean retval = TRUE; GtkTreeModel *top_model = gtk_tree_view_get_model (GTK_TREE_VIEW (source)); GtkTreeModel *model; PsppireDict *dict; GtkTreeSelection *selection; enum val_type type; GList *list, *l; bool have_type; get_base_model (top_model, NULL, &model, NULL); dict = PSPPIRE_DICT (model); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (source)); list = gtk_tree_selection_get_selected_rows (selection, &model); /* Iterate through the selection of the source treeview */ have_type = false; for (l = list; l ; l = l->next) { GtkTreePath *p = get_base_tree_path (top_model, l->data); gint *idx = gtk_tree_path_get_indices (p); const struct variable *v = psppire_dict_get_variable (dict, idx[0]); gtk_tree_path_free (p); if (have_type && var_get_type (v) != type) { retval = FALSE; break; } type = var_get_type (v); have_type = true; } g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); g_list_free (list); if ( retval == FALSE ) return FALSE; /* now deal with the dest widget */ model = gtk_tree_view_get_model (GTK_TREE_VIEW (dest)); for (ok = gtk_tree_model_get_iter_first (model, &iter); ok; ok = gtk_tree_model_iter_next (model, &iter)) { const struct variable *v; gtk_tree_model_get (model, &iter, 0, &v, -1); if ( have_type && var_get_type (v) != type ) { retval = FALSE; break; } type = var_get_type (v); have_type = true; } return retval; }
/* Returns FALSE if the variables represented by the union of the rows currently selected by SOURCE widget, and contents of the DEST widget, are of different types. In other words, this function when passed as the argument to psppire_selector_set_allow, ensures that the selector selects only string variables, or only numeric variables, not a mixture. */ gboolean homogeneous_types (GtkWidget *source, GtkWidget *dest) { gboolean ok; GtkTreeIter iter; gboolean retval = TRUE; GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (source)); PsppireDict *dict; GtkTreeSelection *selection; enum val_type type = -1; GList *list, *l; while (GTK_IS_TREE_MODEL_FILTER (model)) { model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model)); } dict = PSPPIRE_DICT (model); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (source)); list = gtk_tree_selection_get_selected_rows (selection, &model); /* Iterate through the selection of the source treeview */ for (l = list; l ; l = l->next) { GtkTreePath *path = l->data; GtkTreePath *fpath = gtk_tree_model_filter_convert_path_to_child_path (GTK_TREE_MODEL_FILTER (model), path); gint *idx = gtk_tree_path_get_indices (fpath); const struct variable *v = psppire_dict_get_variable (dict, idx[0]); gtk_tree_path_free (fpath); if ( type != -1 ) { if ( var_get_type (v) != type ) { retval = FALSE; break; } } type = var_get_type (v); } g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); g_list_free (list); if ( retval == FALSE ) return FALSE; /* now deal with the dest widget */ model = gtk_tree_view_get_model (GTK_TREE_VIEW (dest)); for (ok = gtk_tree_model_get_iter_first (model, &iter); ok; ok = gtk_tree_model_iter_next (model, &iter)) { const struct variable *v; gtk_tree_model_get (model, &iter, 0, &v, -1); if ( type != -1 ) { if ( var_get_type (v) != type ) { retval = FALSE; break; } } type = var_get_type (v); } return retval; }