X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dictview.c;h=23073a5f264821036208c0bc2d2057c471e21249;hb=de662c8f00fcf6b758da1531bfed3d43e0a63df8;hp=336092f5abfaf97d20b9a07d55ed193a47dfbe03;hpb=d3181522c4d8e725d417cbae655e46f660fe168e;p=pspp diff --git a/src/ui/gui/psppire-dictview.c b/src/ui/gui/psppire-dictview.c index 336092f5ab..23073a5f26 100644 --- a/src/ui/gui/psppire-dictview.c +++ b/src/ui/gui/psppire-dictview.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2009 Free Software Foundation + Copyright (C) 2009, 2010, 2011, 2012, 2013 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 @@ -16,11 +16,12 @@ #include -#include +#include #include "psppire-dictview.h" #include "psppire-dict.h" #include "psppire-conf.h" #include +#include #include "helper.h" #include @@ -67,14 +68,14 @@ psppire_dict_view_finalize (GObject *object) { PsppireDictView *dict_view = PSPPIRE_DICT_VIEW (object); - g_object_unref (dict_view->menu); + gtk_widget_destroy (dict_view->menu); } /* Properties */ enum { PROP_0, - PROP_MODEL, + PROP_DICTIONARY, PROP_PREDICATE, PROP_SELECTION_MODE }; @@ -104,7 +105,10 @@ set_model (PsppireDictView *dict_view) { GtkTreeModel *model ; - if ( dict_view->predicate ) + if ( dict_view->dict == NULL) + return; + + if ( dict_view->predicate ) { model = gtk_tree_model_filter_new (GTK_TREE_MODEL (dict_view->dict), NULL); @@ -117,9 +121,11 @@ set_model (PsppireDictView *dict_view) else { model = GTK_TREE_MODEL (dict_view->dict); + g_object_ref (model); } gtk_tree_view_set_model (GTK_TREE_VIEW (dict_view), model); + g_object_unref (model); } static void @@ -132,7 +138,7 @@ psppire_dict_view_set_property (GObject *object, switch (prop_id) { - case PROP_MODEL: + case PROP_DICTIONARY: dict_view->dict = g_value_get_object (value); break; case PROP_PREDICATE: @@ -168,7 +174,7 @@ psppire_dict_view_get_property (GObject *object, switch (prop_id) { - case PROP_MODEL: + case PROP_DICTIONARY: g_value_set_object (value, dict_view->dict); break; case PROP_PREDICATE: @@ -194,35 +200,27 @@ psppire_dict_view_class_init (PsppireDictViewClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); - GParamSpec *model_spec = - g_param_spec_object ("model", - "Model", - _("The dictionary to be displayed by this widget"), - PSPPIRE_TYPE_DICT, - G_PARAM_READABLE | G_PARAM_WRITABLE); - GParamSpec *predicate_spec = g_param_spec_pointer ("predicate", "Predicate", - _("A predicate function"), + "A predicate function", G_PARAM_READABLE | G_PARAM_WRITABLE); GParamSpec *selection_mode_spec = g_param_spec_enum ("selection-mode", "Selection Mode", - _("How many things can be selected"), + "How many things can be selected", GTK_TYPE_SELECTION_MODE, GTK_SELECTION_MULTIPLE, G_PARAM_CONSTRUCT | G_PARAM_READABLE | G_PARAM_WRITABLE); - object_class->set_property = psppire_dict_view_set_property; object_class->get_property = psppire_dict_view_get_property; - g_object_class_install_property (object_class, - PROP_MODEL, - model_spec); + g_object_class_override_property (object_class, + PROP_DICTIONARY, + "model"); g_object_class_install_property (object_class, PROP_PREDICATE, @@ -254,24 +252,42 @@ psppire_dict_view_base_finalize (PsppireDictViewClass *class, static void dv_get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter, - GtkTreeModel **model, GtkTreeIter *iter - ) + GtkTreeModel **model, GtkTreeIter *iter) { *model = top_model; - *iter = *top_iter; - while (GTK_IS_TREE_MODEL_FILTER (*model)) + + if ( iter) + *iter = *top_iter; + + while ( ! PSPPIRE_IS_DICT (*model)) { - GtkTreeIter parent_iter = *iter; - GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model); + GtkTreeIter parent_iter; + if (iter) + parent_iter = *iter; - *model = gtk_tree_model_filter_get_model (parent_model); + if ( GTK_IS_TREE_MODEL_FILTER (*model)) + { + GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model); - gtk_tree_model_filter_convert_iter_to_child_iter (parent_model, - iter, - &parent_iter); - } + *model = gtk_tree_model_filter_get_model (parent_model); - g_assert (PSPPIRE_IS_DICT (*model)); + if (iter) + gtk_tree_model_filter_convert_iter_to_child_iter (parent_model, + iter, + &parent_iter); + } + else if (GTK_IS_TREE_MODEL_SORT (*model)) + { + GtkTreeModelSort *parent_model = GTK_TREE_MODEL_SORT (*model); + + *model = gtk_tree_model_sort_get_model (parent_model); + + if (iter) + gtk_tree_model_sort_convert_iter_to_child_iter (parent_model, + iter, + &parent_iter); + } + } } @@ -290,31 +306,23 @@ var_description_cell_data_func (GtkTreeViewColumn *col, GtkTreeIter iter; GtkTreeModel *model; - dv_get_base_model (top_model, top_iter, &model, &iter); - g_assert (PSPPIRE_IS_DICT (model)); - gtk_tree_model_get (model, &iter, DICT_TVM_COL_VAR, &var, -1); if ( var_has_label (var) && dv->prefer_labels) { - gchar *text = g_strdup_printf ( + gchar *text = g_markup_printf_escaped ( "%s", var_get_label (var)); - char *utf8 = pspp_locale_to_utf8 (text, -1, NULL); - + g_object_set (cell, "markup", text, NULL); g_free (text); - g_object_set (cell, "markup", utf8, NULL); - g_free (utf8); } else { - char *name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL); - g_object_set (cell, "text", name, NULL); - g_free (name); + g_object_set (cell, "text", var_get_name (var), NULL); } } @@ -330,37 +338,57 @@ var_icon_cell_data_func (GtkTreeViewColumn *col, gpointer data) { struct variable *var; + gtk_tree_model_get (model, iter, DICT_TVM_COL_VAR, &var, -1); - if ( var_is_alpha (var)) - { - g_object_set (cell, "stock-id", "var-string", NULL); - } - else + g_object_set (cell, "stock_id", + get_var_measurement_stock_id (var_get_print_format (var)->type, + var_get_measure (var)), + NULL); +} + +const char * +get_var_measurement_stock_id (enum fmt_type type, enum measure measure) +{ + switch (fmt_get_category (type)) { - const struct fmt_spec *fs = var_get_write_format (var); - int cat = fmt_get_category (fs->type); - switch ( var_get_measure (var)) + case FMT_CAT_STRING: + switch (measure) { - case MEASURE_NOMINAL: - g_object_set (cell, "stock-id", "var-nominal", NULL); - break; - case MEASURE_ORDINAL: - g_object_set (cell, "stock-id", "var-ordinal", NULL); - break; - case MEASURE_SCALE: - if ( ( FMT_CAT_DATE | FMT_CAT_TIME ) & cat ) - g_object_set (cell, "stock-id", "var-date-scale", NULL); - else - g_object_set (cell, "stock-id", "var-scale", NULL); - break; - default: - g_assert_not_reached (); - }; + case MEASURE_NOMINAL: return "measure-string-nominal"; + case MEASURE_ORDINAL: return "measure-string-ordinal"; + case MEASURE_SCALE: return "role-none"; + case n_MEASURES: break; + } + break; + + case FMT_CAT_DATE: + case FMT_CAT_TIME: + switch (measure) + { + case MEASURE_NOMINAL: return "measure-date-nominal"; + case MEASURE_ORDINAL: return "measure-date-ordinal"; + case MEASURE_SCALE: return "measure-date-scale"; + case n_MEASURES: break; + } + break; + + default: + switch (measure) + { + case MEASURE_NOMINAL: return "measure-nominal"; + case MEASURE_ORDINAL: return "measure-ordinal"; + case MEASURE_SCALE: return "measure-scale"; + case n_MEASURES: break; + } + break; } + + g_return_val_if_reached (""); } + /* Sets the tooltip to be the name of the variable under the cursor */ static gboolean set_tooltip_for_variable (GtkTreeView *treeview, @@ -377,7 +405,6 @@ set_tooltip_for_variable (GtkTreeView *treeview, struct variable *var = NULL; gboolean ok; - gtk_tree_view_convert_widget_to_bin_window_coords (treeview, x, y, &bx, &by); @@ -387,7 +414,6 @@ set_tooltip_for_variable (GtkTreeView *treeview, tree_model = gtk_tree_view_get_model (treeview); - gtk_tree_view_set_tooltip_row (treeview, tooltip, path); ok = gtk_tree_model_get_iter (tree_model, &iter, path); @@ -403,16 +429,17 @@ set_tooltip_for_variable (GtkTreeView *treeview, return FALSE; { - gchar *tip ; + const gchar *tip ; + GtkTreeModel *m; + + dv_get_base_model (tree_model, NULL, &m, NULL); if ( PSPPIRE_DICT_VIEW (treeview)->prefer_labels ) - tip = pspp_locale_to_utf8 (var_get_name (var), -1, NULL); + tip = var_get_name (var); else - tip = pspp_locale_to_utf8 (var_get_label (var), -1, NULL); + tip = var_get_label (var); gtk_tooltip_set_text (tooltip, tip); - - g_free (tip); } return TRUE; @@ -440,6 +467,8 @@ toggle_label_preference (GtkCheckMenuItem *checkbox, gpointer data) gtk_widget_queue_draw (GTK_WIDGET (dv)); } + + static void psppire_dict_view_init (PsppireDictView *dict_view) { @@ -450,7 +479,8 @@ psppire_dict_view_init (PsppireDictView *dict_view) dict_view->prefer_labels = TRUE; psppire_conf_get_boolean (psppire_conf_new (), - "dialog-boxes", "prefer-labels", + G_OBJECT_TYPE_NAME (dict_view), + "prefer-labels", &dict_view->prefer_labels); gtk_tree_view_column_set_title (col, _("Variable")); @@ -477,7 +507,10 @@ psppire_dict_view_init (PsppireDictView *dict_view) gtk_tree_view_append_column (GTK_TREE_VIEW (dict_view), col); - g_object_set (dict_view, "has-tooltip", TRUE, NULL); + g_object_set (dict_view, + "has-tooltip", TRUE, + "headers-visible", FALSE, + NULL); g_signal_connect (dict_view, "query-tooltip", G_CALLBACK (set_tooltip_for_variable), NULL); @@ -513,26 +546,18 @@ psppire_dict_view_new (void) return GTK_WIDGET (g_object_new (psppire_dict_view_get_type (), NULL)); } - - -struct variable * -psppire_dict_view_get_selected_variable (PsppireDictView *treeview) +static struct variable * +psppire_dict_view_iter_to_var (PsppireDictView *dict_view, + GtkTreeIter *top_iter) { - struct variable *var; - GtkTreeModel *top_model; - GtkTreeIter top_iter; + GtkTreeView *treeview = GTK_TREE_VIEW (dict_view); + GtkTreeModel *top_model = gtk_tree_view_get_model (treeview); + struct variable *var; GtkTreeModel *model; GtkTreeIter iter; - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); - - if (! gtk_tree_selection_get_selected (selection, - &top_model, &top_iter)) - return NULL; - - dv_get_base_model (top_model, &top_iter, &model, &iter); + dv_get_base_model (top_model, top_iter, &model, &iter); g_assert (PSPPIRE_IS_DICT (model)); @@ -542,4 +567,56 @@ psppire_dict_view_get_selected_variable (PsppireDictView *treeview) return var; } +struct get_vars_aux + { + PsppireDictView *dict_view; + struct variable **vars; + size_t idx; + }; + +static void +get_vars_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, + gpointer data) +{ + struct get_vars_aux *aux = data; + struct variable *var = psppire_dict_view_iter_to_var (aux->dict_view, iter); + + g_return_if_fail (var != NULL); + aux->vars[aux->idx++] = var; +} + +void +psppire_dict_view_get_selected_variables (PsppireDictView *dict_view, + struct variable ***vars, + size_t *n_varsp) +{ + GtkTreeView *tree_view = GTK_TREE_VIEW (dict_view); + GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view); + gint n_vars = gtk_tree_selection_count_selected_rows (selection); + struct get_vars_aux aux; + + *vars = g_malloc_n (n_vars, sizeof **vars); + + aux.dict_view = dict_view; + aux.vars = *vars; + aux.idx = 0; + gtk_tree_selection_selected_foreach (selection, get_vars_cb, &aux); + + *n_varsp = aux.idx; + g_return_if_fail (aux.idx >= n_vars); +} + +struct variable * +psppire_dict_view_get_selected_variable (PsppireDictView *dict_view) +{ + GtkTreeView *tree_view = GTK_TREE_VIEW (dict_view); + GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view); + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (selection, NULL, &iter)) + return psppire_dict_view_iter_to_var (dict_view, &iter); + else + return NULL; +} +