X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dict.c;h=afc7d570c9afe6ab85f637344b9b46a9340bc711;hb=2d983f3e5bd2d5f531cbcbdcebe078034ddb8955;hp=db24bbf0a8f4492e32fa0862a32daece4685a32a;hpb=1dabf6c48c0f5827a933af82c01a26bdf55488bd;p=pspp diff --git a/src/ui/gui/psppire-dict.c b/src/ui/gui/psppire-dict.c index db24bbf0a8..afc7d570c9 100644 --- a/src/ui/gui/psppire-dict.c +++ b/src/ui/gui/psppire-dict.c @@ -19,27 +19,18 @@ #include #include -#include +#include #include "psppire-dict.h" #include #include #include #include +#include #include "helper.h" #include "message-dialog.h" -/* --- prototypes --- */ -static void psppire_dict_class_init (PsppireDictClass *class); -static void psppire_dict_init (PsppireDict *dict); -static void psppire_dict_finalize (GObject *object); - -static void dictionary_tree_model_init (GtkTreeModelIface *iface); - - -/* --- variables --- */ -static GObjectClass *parent_class = NULL; enum { BACKEND_CHANGED, @@ -48,6 +39,7 @@ enum { VARIABLE_RESIZED, VARIABLE_INSERTED, VARIABLE_DELETED, + VARIABLE_DISPLAY_WIDTH_CHANGED, WEIGHT_CHANGED, FILTER_CHANGED, @@ -55,6 +47,18 @@ enum { n_SIGNALS }; + +/* --- prototypes --- */ +static void psppire_dict_class_init (PsppireDictClass *class); +static void psppire_dict_init (PsppireDict *dict); +static void psppire_dict_finalize (GObject *object); + +static void dictionary_tree_model_init (GtkTreeModelIface *iface); + + +/* --- variables --- */ +static GObjectClass *parent_class = NULL; + static guint signals [n_SIGNALS]; /* --- functions --- */ @@ -93,8 +97,6 @@ psppire_dict_get_type (void) g_type_add_interface_static (object_type, GTK_TYPE_TREE_MODEL, &tree_model_info); - - } return object_type; @@ -152,7 +154,7 @@ psppire_dict_class_init (PsppireDictClass *class) G_SIGNAL_RUN_FIRST, 0, NULL, NULL, - marshaller_VOID__INT_INT_INT, + psppire_marshal_VOID__INT_INT_INT, G_TYPE_NONE, 3, G_TYPE_INT, @@ -166,12 +168,23 @@ psppire_dict_class_init (PsppireDictClass *class) G_SIGNAL_RUN_FIRST, 0, NULL, NULL, - gtkextra_VOID__INT_INT, + psppire_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); + signals [VARIABLE_DISPLAY_WIDTH_CHANGED] = + g_signal_new ("variable-display-width-changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); + signals [WEIGHT_CHANGED] = g_signal_new ("weight-changed", @@ -223,7 +236,10 @@ psppire_dict_finalize (GObject *object) static void addcb (struct dictionary *d, int idx, void *pd) { - g_signal_emit (pd, signals [VARIABLE_INSERTED], 0, idx); + PsppireDict *dict = PSPPIRE_DICT (pd); + + if ( ! dict->disable_insert_signal) + g_signal_emit (dict, signals [VARIABLE_INSERTED], 0, idx); } static void @@ -264,6 +280,13 @@ split_changed_callback (struct dictionary *d, void *pd) g_signal_emit (pd, signals [SPLIT_CHANGED], 0); } +static void +variable_display_width_callback (struct dictionary *d, int idx, void *pd) +{ + g_signal_emit (pd, signals [VARIABLE_DISPLAY_WIDTH_CHANGED], 0, idx); +} + + static const struct dict_callbacks gui_callbacks = { @@ -273,13 +296,15 @@ static const struct dict_callbacks gui_callbacks = resize_cb, weight_changed_callback, filter_changed_callback, - split_changed_callback + split_changed_callback, + variable_display_width_callback }; static void psppire_dict_init (PsppireDict *psppire_dict) { psppire_dict->stamp = g_random_int (); + psppire_dict->disable_insert_signal = FALSE; } /** @@ -291,7 +316,7 @@ psppire_dict_init (PsppireDict *psppire_dict) PsppireDict* psppire_dict_new_from_dict (struct dictionary *d) { - PsppireDict *new_dict = g_object_new (G_TYPE_PSPPIRE_DICT, NULL); + PsppireDict *new_dict = g_object_new (PSPPIRE_TYPE_DICT, NULL); new_dict->dict = d; dict_set_callbacks (new_dict->dict, &gui_callbacks, new_dict); @@ -349,9 +374,15 @@ psppire_dict_insert_variable (PsppireDict *d, gint idx, const gchar *name) if ( ! name ) name = auto_generate_var_name (d); + d->disable_insert_signal = TRUE; + var = dict_create_var (d->dict, name, 0); dict_reorder_var (d->dict, var, idx); + + d->disable_insert_signal = FALSE; + + g_signal_emit (d, signals[VARIABLE_INSERTED], 0, idx); } /* Delete N variables beginning at FIRST */ @@ -404,7 +435,9 @@ psppire_dict_set_name (PsppireDict* d, gint idx, const gchar *name) -/* Return the IDXth variable */ +/* Return the IDXth variable. + Will return NULL if IDX exceeds the number of variables in the dictionary. + */ struct variable * psppire_dict_get_variable (const PsppireDict *d, gint idx) { @@ -487,7 +520,7 @@ psppire_dict_check_name (const PsppireDict *dict, } -inline gint +gint psppire_dict_get_next_value_idx (const PsppireDict *dict) { return dict_get_next_value_idx (dict->dict); @@ -720,10 +753,11 @@ tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter, { case DICT_TVM_COL_NAME: { - gchar *name = pspp_locale_to_utf8(var_get_name (var), -1, NULL); - g_value_init (value, G_TYPE_STRING); - g_value_set_string (value, name); - g_free (name); + gchar *name = recode_string (UTF8, psppire_dict_encoding (dict), + var_get_name (var), -1); + g_value_init (value, G_TYPE_STRING); + g_value_set_string (value, name); + g_free (name); } break; case DICT_TVM_COL_VAR: @@ -827,3 +861,12 @@ psppire_dict_dump (const PsppireDict *dict) } } #endif + + + + +const gchar * +psppire_dict_encoding (const PsppireDict *dict) +{ + return dict_get_encoding (dict->dict); +}