Redesign the character re-encoding code.
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 27 Mar 2009 02:46:21 +0000 (11:46 +0900)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 27 Mar 2009 02:46:21 +0000 (11:46 +0900)
Remove the statically allocated convertors,
instead, assume that the encoding of variables,
data and associated metadata is stored in the dictionary.

20 files changed:
src/data/gnumeric-reader.c
src/libpspp/i18n.c
src/libpspp/i18n.h
src/ui/gui/compute-dialog.c
src/ui/gui/dialog-common.c
src/ui/gui/dict-display.c
src/ui/gui/helper.c
src/ui/gui/helper.h
src/ui/gui/psppire-data-editor.c
src/ui/gui/psppire-data-store.c
src/ui/gui/psppire-dict.c
src/ui/gui/psppire-dict.h
src/ui/gui/psppire-dictview.c
src/ui/gui/psppire-var-sheet.c
src/ui/gui/psppire-var-store.c
src/ui/gui/val-labs-dialog.c
src/ui/gui/val-labs-dialog.h
src/ui/gui/var-display.c
src/ui/gui/var-display.h
src/ui/gui/variable-info-dialog.c

index 5a0c75ede293a21052228a87b295a070398f3e1f..00a07d2f8a2b4ff57fb51f01c569b41a1d33f7ba 100644 (file)
@@ -314,11 +314,10 @@ static void
 convert_xml_string_to_value (struct ccase *c, const struct variable *var,
                             const xmlChar *xv)
 {
-  char *text;
   int n_bytes = 0;
   union value *v = case_data_rw (c, var);
 
-  text = recode_string (CONV_UTF8_TO_PSPP, (const char *) xv, -1);
+  const char *text = (const char *) xv;
 
   if ( text)
     n_bytes = MIN (var_get_width (var), strlen (text));
@@ -335,8 +334,6 @@ convert_xml_string_to_value (struct ccase *c, const struct variable *var,
       if ( errno != 0 || endptr == text)
        v->f = SYSMIS;
     }
-
-  free (text);
 }
 
 struct var_spec
@@ -459,10 +456,8 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
 
       if ( r->node_type == XML_READER_TYPE_TEXT )
        {
-         char *text ;
          xmlChar *value = xmlTextReaderValue (r->xtr);
-
-         text = recode_string (CONV_UTF8_TO_PSPP, (const char *) value, -1);
+         const char *text  = (const char *) value;
 
          if ( r->row < r->start_row)
            {
@@ -481,7 +476,6 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
            }
 
          free (value);
-         free (text);
        }
       else if ( r->node_type == XML_READER_TYPE_ELEMENT
                && r->state == STATE_CELL)
index 617f79683eb586ce3306832efae18cee03a0a629..674a9a27022b44bedb51c8883a8d203cfe0be3c8 100644 (file)
 #include <langinfo.h>
 #endif
 
-
-static char *locale;
-static char *charset;
-
-
-static iconv_t convertor[n_CONV];
+static char *default_encoding;
 
 
 /* A wrapper around iconv_open */
@@ -66,7 +61,8 @@ create_iconv (const char* tocode, const char* fromcode)
    The returned string must be freed when no longer required.
 */
 char *
-recode_string (enum conv_id how,  const char *text, int length)
+recode_string (const char *to, const char *from,
+              const char *text, int length)
 {
   char *outbuf = 0;
   size_t outbufferlength;
@@ -74,6 +70,7 @@ recode_string (enum conv_id how,  const char *text, int length)
   char *op ;
   size_t inbytes = 0;
   size_t outbytes ;
+  iconv_t conv ;
 
   /* FIXME: Need to ensure that this char is valid in the target encoding */
   const char fallbackchar = '?';
@@ -84,9 +81,17 @@ recode_string (enum conv_id how,  const char *text, int length)
   if ( length == -1 )
      length = strlen(text);
 
-  assert (how < n_CONV);
 
-  if (convertor[how] == (iconv_t) -1)
+  if (to == NULL)
+    to = default_encoding;
+
+  if (from == NULL)
+    from = default_encoding;
+
+
+  fprintf (stderr, "from: %s; to %s\n", from, to);
+
+  if ( 0 == strcmp (to, from))
     return xstrndup (text, length);
 
   for ( outbufferlength = 1 ; outbufferlength != 0; outbufferlength <<= 1 )
@@ -99,9 +104,12 @@ recode_string (enum conv_id how,  const char *text, int length)
   outbytes = outbufferlength;
   inbytes = length;
 
+
+  conv = create_iconv (to, from);
+
   do {
     const char *ip = text;
-    result = iconv (convertor[how], (ICONV_CONST char **) &text, &inbytes,
+    result = iconv (conv, (ICONV_CONST char **) &text, &inbytes,
                   &op, &outbytes);
 
     if ( -1 == result )
@@ -138,6 +146,9 @@ recode_string (enum conv_id how,  const char *text, int length)
       }
   } while ( -1 == result );
 
+
+  iconv_close (conv);
+
   if (outbytes == 0 )
     {
       char *const oldaddr = outbuf;
@@ -152,44 +163,21 @@ recode_string (enum conv_id how,  const char *text, int length)
 }
 
 
-/* Returns the current PSPP locale */
-const char *
-get_pspp_locale (void)
-{
-  assert (locale);
-  return locale;
-}
 
 
 void
 i18n_init (void)
 {
-  assert (!locale) ;
-  locale = strdup (setlocale (LC_CTYPE, NULL));
-
-  setlocale (LC_CTYPE, locale);
-
-  free (charset);
-  charset = strdup (locale_charset ());
-
-  convertor[CONV_PSPP_TO_UTF8]   = create_iconv ("UTF-8", charset);
-  convertor[CONV_UTF8_TO_PSPP]   = create_iconv (charset, "UTF-8");
+  free (default_encoding);
+  default_encoding = strdup (locale_charset ());
 }
 
 
 void
 i18n_done (void)
 {
-  int i;
-  free (locale);
-  locale = 0;
-
-  for(i = 0 ; i < n_CONV; ++i )
-    {
-      if ( (iconv_t) -1 == convertor[i] )
-       continue;
-      iconv_close (convertor[i]);
-    }
+  free (default_encoding);
+  default_encoding = NULL;
 }
 
 
index d0d65cf13659c46aa48e6d49519cd3f5aeaf30fb..c167e1f99b2ce63ebfd109494e08951b1ac17a9f 100644 (file)
 #ifndef I18N_H
 #define I18N_H
 
-const char * get_pspp_locale (void);
-void set_pspp_locale (const char *locale);
-const char * get_pspp_charset (void);
-
 void  i18n_done (void);
 void  i18n_init (void);
 
-enum conv_id
-  {
-    CONV_PSPP_TO_UTF8,
-    CONV_UTF8_TO_PSPP,
-    n_CONV
-  };
 
+#define UTF8 "UTF-8"
 
-char * recode_string (enum conv_id how,  const char *text, int len);
+char * recode_string (const char *to, const char *from,
+                     const char *text, int len);
 
 
 /* Return the decimal separator according to the
index 7703640c4d553e81eb6584f28eb46841a0c3fe21..a42ce4febf438d338727a68a9f70728217b8c2d4 100644 (file)
@@ -24,6 +24,7 @@
 #include "psppire-var-store.h"
 #include "psppire-selector.h"
 #include "dialog-common.h"
+#include <libpspp/i18n.h>
 
 #include <language/expressions/public.h>
 #include <language/syntax-string-source.h>
@@ -631,7 +632,9 @@ insert_source_row_into_text_view (GtkTreeIter iter,
 
   gtk_tree_path_free (path);
 
-  name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
+  name = recode_string (UTF8, psppire_dict_encoding (dict),
+                       var_get_name (var),
+                       -1);
 
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dest));
 
index 0aab294e12ef0b2a8ca937851f60533525847619..8d03bed16186e5664207b9fc2b8e989c63f10eae 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <config.h>
 
+#include <libpspp/i18n.h>
 #include "dialog-common.h"
 
 #include "psppire-var-ptr.h"
@@ -118,7 +119,8 @@ cell_var_name (GtkTreeViewColumn *tree_column,
 
   var = get_selected_variable (tree_model, iter, dict);
 
-  name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
+  name = recode_string (UTF8, psppire_dict_encoding (dict),
+                       var_get_name (var), -1);
   g_object_set (cell, "text", name, NULL);
   g_free (name);
 }
index 2123c3c5cfe7b300b6c2bcaca241f5ae95d5636d..d6b1bcd58c3b60bc5bb17705da7c18c4121d4105 100644 (file)
@@ -23,6 +23,7 @@
 #include "dict-display.h"
 
 #include "psppire-dict.h"
+#include <libpspp/i18n.h>
 #include "helper.h"
 #include <data/variable.h>
 #include <data/format.h>
@@ -80,7 +81,8 @@ insert_source_row_into_entry (GtkTreeIter iter,
 
   gtk_tree_path_free (path);
 
-  name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
+  name = recode_string (UTF8, psppire_dict_encoding (PSPPIRE_DICT (dict)),
+                       var_get_name (var), -1);
   gtk_entry_set_text (GTK_ENTRY (dest),  name);
   g_free (name);
 }
@@ -142,7 +144,8 @@ is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
 
   gtk_tree_path_free (path);
 
-  name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
+  name = recode_string (UTF8, psppire_dict_encoding (PSPPIRE_DICT (dict)),
+                       var_get_name (var), -1);
   result = ( 0 == strcmp (text, name));
   g_free (name);
 
index 9ac9fde6ec43b65ab79765859fb5ccfe9f5ec6ec..6d90cfc4ea5e7a4b6e5b2a33b6ad3210744c802c 100644 (file)
@@ -152,20 +152,6 @@ get_widget_assert (GtkBuilder *builder, const gchar *name)
   return GTK_WIDGET (get_object_assert (builder, name, GTK_TYPE_WIDGET));
 }
 
-/* Converts a string in the pspp locale to utf-8.
-   The return value must be freed when no longer required*/
-gchar *
-pspp_locale_to_utf8 (const gchar *text, gssize len, GError **err)
-{
-  return recode_string (CONV_PSPP_TO_UTF8, text, len);
-}
-
-gchar *
-utf8_to_pspp_locale (const gchar *text, gssize len, GError **err)
-{
-  return recode_string (CONV_UTF8_TO_PSPP, text, len);
-}
-
 /* This function must be used whenever a filename generated by glib,
    (eg, from gtk_file_chooser_get_filename) and passed to the C library,
    (eg through a pspp syntax string).
index 30792faf0835f5f8b0f1e2d6da11c469e9633516..6bd610e7c541b2e5bd01f0a17694fa4bc8703bb4 100644 (file)
@@ -43,14 +43,9 @@ GObject *get_object_assert (GtkBuilder *builder, const gchar *name, GType type);
 GtkAction * get_action_assert (GtkBuilder *builder, const gchar *name);
 GtkWidget * get_widget_assert (GtkBuilder *builder, const gchar *name);
 
-/* Converts a string in the pspp locale to utf-8 */
-gchar * pspp_locale_to_utf8 (const gchar *text, gssize len, GError **err);
-gchar * utf8_to_pspp_locale (const gchar *text, gssize len, GError **err);
-
 gchar * convert_glib_filename_to_system_filename (const gchar *fname,
                                                  GError **err);
 
-
 void connect_help (GtkBuilder *);
 
 void reference_manual (GtkMenuItem *, gpointer);
index ab3b21284ec55d23968c7c0de5c3a3fa246beb52..1070f5c2871caef36db153d9b48aca7667497ad3 100644 (file)
@@ -24,6 +24,7 @@
 #include <language/syntax-string-source.h>
 #include "psppire-data-store.h"
 #include <ui/gui/sheet/psppire-axis-impl.h>
+#include <libpspp/i18n.h>
 #include "helper.h"
 
 #include <gtk-contrib/gtkxpaned.h>
@@ -743,7 +744,9 @@ update_data_ref_entry (const PsppireSheet *sheet,
          gchar *text = g_strdup_printf ("%d: %s", row + FIRST_CASE_NUMBER,
                                         var_get_name (var));
 
-         gchar *s = pspp_locale_to_utf8 (text, -1, 0);
+         gchar *s = recode_string (UTF8,
+                                   psppire_dict_encoding (data_store->dict),
+                                   text, -1);
 
          g_free (text);
 
index 45104f5cbb8ff519418fee88edf92e496e91652c..45fa82488b4e19dabbdf991bae83681fe2e93075 100644 (file)
@@ -31,6 +31,7 @@
 #include <pango/pango-context.h>
 
 #include "psppire-data-store.h"
+#include <libpspp/i18n.h>
 #include "helper.h"
 
 #include <data/dictionary.h>
@@ -598,7 +599,8 @@ psppire_data_store_get_string (PsppireDataStore *store, glong row, glong column)
       if (label)
         {
           free (v);
-         return pspp_locale_to_utf8 (label, -1, 0);
+         return recode_string (UTF8, psppire_dict_encoding (store->dict),
+                               label, -1);
         }
     }
 
@@ -616,7 +618,8 @@ psppire_data_store_get_string (PsppireDataStore *store, glong row, glong column)
      FP.  No null terminator is appended to the buffer.  */
   data_out (v, fp, s->str);
 
-  text = pspp_locale_to_utf8 (s->str, fp->w, 0);
+  text = recode_string (UTF8, psppire_dict_encoding (store->dict),
+                       s->str, fp->w);
   g_string_free (s, TRUE);
 
   g_strchomp (text);
@@ -673,7 +676,7 @@ psppire_data_store_set_string (PsppireDataStore *store,
   if (row == n_cases)
     psppire_data_store_insert_new_case (store, row);
 
-  s = utf8_to_pspp_locale (text, -1, NULL);
+  s = recode_string (psppire_dict_encoding (store->dict), UTF8, text, -1);
 
   psppire_data_store_data_in (store, row,
                              var_get_case_index (pv), ss_cstr (s),
@@ -749,9 +752,11 @@ static const gchar null_var_name[]=N_("var");
 static gchar *
 get_row_button_label (const PsppireSheetModel *model, gint unit)
 {
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
   gchar *s = g_strdup_printf (_("%d"), unit + FIRST_CASE_NUMBER);
 
-  gchar *text =  pspp_locale_to_utf8 (s, -1, 0);
+  gchar *text =  recode_string (UTF8, psppire_dict_encoding (ds->dict),
+                               s, -1);
 
   g_free (s);
 
@@ -787,7 +792,8 @@ get_column_subtitle (const PsppireSheetModel *model, gint col)
   if ( ! var_has_label (v))
     return NULL;
 
-  text =  pspp_locale_to_utf8 (var_get_label (v), -1, 0);
+  text =  recode_string (UTF8, psppire_dict_encoding (ds->dict),
+                        var_get_label (v), -1);
 
   return text;
 }
@@ -804,7 +810,8 @@ get_column_button_label (const PsppireSheetModel *model, gint col)
 
   pv = psppire_dict_get_variable (ds->dict, col);
 
-  text =  pspp_locale_to_utf8 (var_get_name (pv), -1, 0);
+  text = recode_string (UTF8, psppire_dict_encoding (ds->dict),
+                       var_get_name (pv), -1);
 
   return text;
 }
index 564257f46c8cdb74c6adef8ce6d4547f0bd70764..c4f30783552ebb19fc794b65683f0a51acbdbb5d 100644 (file)
@@ -26,6 +26,7 @@
 #include <data/missing-values.h>
 #include <data/value-labels.h>
 #include <data/variable.h>
+#include <libpspp/i18n.h>
 
 #include "helper.h"
 #include "message-dialog.h"
@@ -752,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:
@@ -859,3 +861,12 @@ psppire_dict_dump (const PsppireDict *dict)
     }
 }
 #endif
+
+
+
+
+const gchar *
+psppire_dict_encoding (const PsppireDict *dict)
+{
+  return NULL;
+}
index 3fd73f9a6dc0bd9f21e9016cc7037f495081dcb6..54f3e39af0597d3399d09bf628eb8fb12d2bb1c9 100644 (file)
@@ -109,6 +109,8 @@ struct variable * psppire_dict_get_weight_variable (const PsppireDict *);
 void psppire_dict_dump (const PsppireDict *);
 #endif
 
+const gchar *psppire_dict_encoding (const PsppireDict *);
+
 G_END_DECLS
 
 #endif /* __PSPPIRE_DICT_H__ */
index 863365f9f8549696f9c0afa2fb1cbd14dba09e79..37539694b138c109fbe6692628e3009dd62e35e9 100644 (file)
@@ -21,6 +21,7 @@
 #include "psppire-dict.h"
 #include "psppire-conf.h"
 #include <data/format.h>
+#include <libpspp/i18n.h>
 #include "helper.h"
 
 #include <gettext.h>
@@ -274,11 +275,15 @@ dv_get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
                )
 {
   *model = top_model;
-  *iter = *top_iter;
+
+  if ( iter)
+    *iter = *top_iter;
 
   while ( ! PSPPIRE_IS_DICT (*model))
     {
-      GtkTreeIter parent_iter = *iter;
+      GtkTreeIter parent_iter;
+      if (iter)
+       parent_iter = *iter;
 
       if ( GTK_IS_TREE_MODEL_FILTER (*model))
        {
@@ -286,9 +291,10 @@ dv_get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
 
          *model = gtk_tree_model_filter_get_model (parent_model);
 
-         gtk_tree_model_filter_convert_iter_to_child_iter (parent_model,
-                                                           iter,
-                                                           &parent_iter);
+         if (iter)
+           gtk_tree_model_filter_convert_iter_to_child_iter (parent_model,
+                                                             iter,
+                                                             &parent_iter);
        }
       else if (GTK_IS_TREE_MODEL_SORT (*model))
        {
@@ -296,9 +302,10 @@ dv_get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
 
          *model = gtk_tree_model_sort_get_model (parent_model);
 
-         gtk_tree_model_sort_convert_iter_to_child_iter (parent_model,
-                                                         iter,
-                                                         &parent_iter);
+         if (iter)
+           gtk_tree_model_sort_convert_iter_to_child_iter (parent_model,
+                                                           iter,
+                                                           &parent_iter);
        }
     }
 }
@@ -318,11 +325,11 @@ var_description_cell_data_func (GtkTreeViewColumn *col,
   struct variable *var;
   GtkTreeIter iter;
   GtkTreeModel *model;
-
+  PsppireDict *dict;
 
   dv_get_base_model (top_model, top_iter, &model, &iter);
 
-  g_assert (PSPPIRE_IS_DICT (model));
+  dict = PSPPIRE_DICT (model);
 
   gtk_tree_model_get (model,
                      &iter, DICT_TVM_COL_VAR, &var, -1);
@@ -333,7 +340,8 @@ var_description_cell_data_func (GtkTreeViewColumn *col,
                                     "<span stretch=\"condensed\">%s</span>",
                                     var_get_label (var));
 
-      char *utf8 = pspp_locale_to_utf8 (text, -1, NULL);
+      char *utf8 = recode_string (UTF8, psppire_dict_encoding (dict),
+                                 text, -1);
 
       g_free (text);
       g_object_set (cell, "markup", utf8, NULL);
@@ -341,7 +349,8 @@ var_description_cell_data_func (GtkTreeViewColumn *col,
     }
   else
     {
-      char *name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
+      char *name = recode_string (UTF8, psppire_dict_encoding (dict),
+                                 var_get_name (var), -1);
       g_object_set (cell, "text", name, NULL);
       g_free (name);
     }
@@ -406,7 +415,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);
 
@@ -416,7 +424,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);
@@ -433,11 +440,18 @@ set_tooltip_for_variable (GtkTreeView  *treeview,
 
   {
     gchar *tip ;
+    GtkTreeModel *m;
+    PsppireDict *dict;
+
+    dv_get_base_model (tree_model, NULL, &m, NULL);
+    dict = PSPPIRE_DICT (m);
 
     if ( PSPPIRE_DICT_VIEW (treeview)->prefer_labels )
-      tip = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
+      tip = recode_string (UTF8, psppire_dict_encoding (dict),
+                          var_get_name (var), -1);
     else
-      tip = pspp_locale_to_utf8 (var_get_label (var), -1, NULL);
+      tip = recode_string (UTF8, psppire_dict_encoding (dict),
+                          var_get_label (var), -1);
 
     gtk_tooltip_set_text (tooltip, tip);
 
index 517a61e04b71924064ba4463aa695da111ff9e6b..b742f3b7c69d7431ab2789fb5b7fcbc1f366586a 100644 (file)
@@ -489,7 +489,8 @@ psppire_var_sheet_realize (GtkWidget *w)
 
   GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (vs));
 
-  vs->val_labs_dialog = val_labs_dialog_create (GTK_WINDOW (toplevel));
+  vs->val_labs_dialog = val_labs_dialog_create (GTK_WINDOW (toplevel),
+                                               PSPPIRE_SHEET (vs));
   vs->missing_val_dialog = missing_val_dialog_create (GTK_WINDOW (toplevel));
   vs->var_type_dialog = var_type_dialog_create (GTK_WINDOW (toplevel));
 
index 1d6f465d437e5c2605bb8001a7ddce6fd720eb3c..b64bc64ee79c805d3e21cf58a4de56b4077be995 100644 (file)
@@ -21,7 +21,7 @@
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
-
+#include <libpspp/i18n.h>
 
 #include <gobject/gvaluecollector.h>
 
@@ -53,9 +53,6 @@ static void         psppire_var_store_sheet_model_init (PsppireSheetModelIface *
 static void         psppire_var_store_finalize        (GObject           *object);
 
 
-gchar * missing_values_to_string (const struct variable *pv, GError **err);
-
-
 static gchar *psppire_var_store_get_string (const PsppireSheetModel *sheet_model, glong row, glong column);
 
 static gboolean  psppire_var_store_clear (PsppireSheetModel *model,  glong row, glong col);
@@ -67,7 +64,8 @@ static gboolean psppire_var_store_set_string (PsppireSheetModel *model,
 static glong psppire_var_store_get_row_count (const PsppireSheetModel * model);
 static glong psppire_var_store_get_column_count (const PsppireSheetModel * model);
 
-static gchar *text_for_column (const struct variable *pv, gint c, GError **err);
+static gchar *text_for_column (PsppireVarStore *vs, const struct variable *pv,
+                              gint c, GError **err);
 
 
 static GObjectClass *parent_class = NULL;
@@ -399,7 +397,8 @@ psppire_var_store_finalize (GObject *object)
 }
 
 static gchar *
-psppire_var_store_get_string (const PsppireSheetModel *model, glong row, glong column)
+psppire_var_store_get_string (const PsppireSheetModel *model,
+                             glong row, glong column)
 {
   PsppireVarStore *store = PSPPIRE_VAR_STORE (model);
 
@@ -410,7 +409,7 @@ psppire_var_store_get_string (const PsppireSheetModel *model, glong row, glong c
 
   pv = psppire_dict_get_variable (store->dict, row);
 
-  return text_for_column (pv, column, 0);
+  return text_for_column (store, pv, column, 0);
 }
 
 
@@ -531,7 +530,9 @@ psppire_var_store_set_string (PsppireSheetModel *model,
       break;
     case PSPPIRE_VAR_STORE_COL_LABEL:
       {
-       gchar *s = utf8_to_pspp_locale (text, -1, NULL);
+       gchar *s = recode_string (psppire_dict_encoding (var_store->dict),
+                                 UTF8,
+                                 text, -1);
        var_set_label (pv, s);
        free (s);
        return TRUE;
@@ -557,8 +558,10 @@ psppire_var_store_set_string (PsppireSheetModel *model,
 static const gchar none[] = N_("None");
 
 static  gchar *
-text_for_column (const struct variable *pv, gint c, GError **err)
+text_for_column (PsppireVarStore *vs,
+                const struct variable *pv, gint c, GError **err)
 {
+  PsppireDict *dict = vs->dict;
   static const gchar *const type_label[] =
     {
       N_("Numeric"),
@@ -578,7 +581,8 @@ text_for_column (const struct variable *pv, gint c, GError **err)
   switch (c)
     {
     case PSPPIRE_VAR_STORE_COL_NAME:
-      return pspp_locale_to_utf8 ( var_get_name (pv), -1, err);
+      return recode_string (UTF8, psppire_dict_encoding (dict),
+                           var_get_name (pv), -1);
       break;
     case PSPPIRE_VAR_STORE_COL_TYPE:
       {
@@ -665,12 +669,13 @@ text_for_column (const struct variable *pv, gint c, GError **err)
       }
       break;
     case PSPPIRE_VAR_STORE_COL_LABEL:
-      return pspp_locale_to_utf8 (var_get_label (pv), -1, err);
+      return recode_string (UTF8, psppire_dict_encoding (dict),
+                           var_get_label (pv), -1);
       break;
 
     case PSPPIRE_VAR_STORE_COL_MISSING:
       {
-       return missing_values_to_string (pv, err);
+       return missing_values_to_string (dict, pv, err);
       }
       break;
     case PSPPIRE_VAR_STORE_COL_VALUES:
@@ -696,7 +701,8 @@ text_for_column (const struct variable *pv, gint c, GError **err)
 
            val_labs_done (&ip);
 
-           ss = pspp_locale_to_utf8 (gstr->str, gstr->len, err);
+           ss = recode_string (UTF8, psppire_dict_encoding (dict),
+                               gstr->str, gstr->len);
            g_string_free (gstr, TRUE);
            return ss;
          }
index f6d0ab738b74270f508dab07ac82e6e852d132cf..42dd0b349c530c3f7a3d3daa5e970b78d541c0b1 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2005  Free Software Foundation
+   Copyright (C) 2005, 2009  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
 #include "val-labs-dialog.h"
 #include <data/value-labels.h>
 #include <data/format.h>
-
+#include "psppire-var-sheet.h"
+#include "psppire-var-store.h"
+#include <libpspp/i18n.h>
 
 struct val_labs_dialog
 {
   GtkWidget *window;
 
+  PsppireSheet *vs;
+
   /* The variable to be updated */
   struct variable *pv;
 
@@ -325,8 +329,7 @@ on_remove (GtkWidget *w, gpointer data)
 /* Callback which occurs when a line item is selected in the list of
    value--label pairs.*/
 static void
-on_select_row                  (GtkTreeView *treeview,
-                               gpointer data)
+on_select_row (GtkTreeView *treeview, gpointer data)
 {
   gchar *labeltext;
   struct val_labs_dialog *dialog = data;
@@ -336,6 +339,9 @@ on_select_row                  (GtkTreeView *treeview,
   gchar *const text = value_to_text (vl->value,
                                    *var_get_write_format (dialog->pv));
 
+  PsppireVarStore *var_store =
+    PSPPIRE_VAR_STORE (psppire_sheet_get_model (dialog->vs));
+
   g_signal_handler_block (GTK_ENTRY (dialog->value_entry),
                         dialog->value_handler_id);
 
@@ -348,7 +354,10 @@ on_select_row                  (GtkTreeView *treeview,
   g_signal_handler_block (GTK_ENTRY (dialog->label_entry),
                         dialog->change_handler_id);
 
-  labeltext = pspp_locale_to_utf8 (vl->label, -1, 0);
+
+  labeltext = recode_string (UTF8, psppire_dict_encoding (var_store->dict),
+                            vl->label, -1);
+
   gtk_entry_set_text (GTK_ENTRY (dialog->label_entry),
                     labeltext);
   g_free (labeltext);
@@ -364,7 +373,7 @@ on_select_row                  (GtkTreeView *treeview,
 /* Create a new dialog box
    (there should  normally be only one)*/
 struct val_labs_dialog *
-val_labs_dialog_create (GtkWindow *toplevel)
+val_labs_dialog_create (GtkWindow *toplevel, PsppireSheet *sheet)
 {
   GtkTreeViewColumn *column;
 
@@ -377,6 +386,7 @@ val_labs_dialog_create (GtkWindow *toplevel)
   dialog->window = get_widget_assert (xml,"val_labs_dialog");
   dialog->value_entry = get_widget_assert (xml,"value_entry");
   dialog->label_entry = get_widget_assert (xml,"label_entry");
+  dialog->vs = sheet;
 
   gtk_window_set_transient_for
     (GTK_WINDOW (dialog->window), toplevel);
@@ -461,6 +471,9 @@ repopulate_dialog (struct val_labs_dialog *dialog)
 
   GtkTreeIter iter;
 
+  PsppireVarStore *var_store =
+    PSPPIRE_VAR_STORE (psppire_sheet_get_model (dialog->vs));
+
   GtkListStore *list_store = gtk_list_store_new (2,
                                                 G_TYPE_STRING,
                                                 G_TYPE_DOUBLE);
@@ -489,11 +502,12 @@ repopulate_dialog (struct val_labs_dialog *dialog)
                      *var_get_write_format (dialog->pv));
 
       gchar *labeltext =
-       pspp_locale_to_utf8 (vl->label, -1, 0);
+       recode_string (UTF8,
+                      psppire_dict_encoding (var_store->dict),
+                      vl->label, -1);
 
       gchar *const text = g_strdup_printf ("%s = \"%s\"",
-                                         vstr, labeltext);
-
+                                          vstr, labeltext);
 
       gtk_list_store_append (list_store, &iter);
       gtk_list_store_set (list_store, &iter,
index 6b1d0e378b68ca04b95313c57864a3aeaaf277c6..3a09f1ca410e0f2f6b775741d9e62dde48e4aae7 100644 (file)
@@ -14,8 +14,6 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
-
-
 #ifndef __PSPPIRE_VAL_LABS_DIALOG_H
 #define __PSPPIRE_VAL_LABS_DIALOG_H
 
 
 #include <gtk/gtk.h>
 #include <data/variable.h>
+#include <gtk-contrib/psppire-sheet.h>
 
 
 struct val_labs;
 
 
-struct val_labs_dialog * val_labs_dialog_create (GtkWindow *);
+struct val_labs_dialog * val_labs_dialog_create (GtkWindow *, PsppireSheet *);
 
 void val_labs_dialog_show (struct val_labs_dialog *);
 
index 07c7a4736ff08e8537d62182383592fc4aec0ec1..50e0df4bbc7ec360869195c387ce9c1deadda119 100644 (file)
@@ -4,34 +4,17 @@
 #include <data/variable.h>
 #include <data/format.h>
 #include <stdlib.h>
+#include "psppire-dict.h"
 
 #include <gettext.h>
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
 #include "helper.h"
+#include <libpspp/i18n.h>
 
 static const gchar none[] = N_("None");
 
-gchar *
-name_to_string (const struct variable *var, GError **err)
-{
-  const char *name = var_get_name (var);
-  g_assert (name);
-
-  return pspp_locale_to_utf8 (name, -1, err);
-}
-
-
-gchar *
-label_to_string (const struct variable *var, GError **err)
-{
-  const char *label = var_get_label (var);
-
-  if ( ! label ) return g_strdup (none);
-
-  return pspp_locale_to_utf8 (label, -1, err);
-}
 
 gchar *
 measure_to_string (const struct variable *var, GError **err)
@@ -45,7 +28,7 @@ measure_to_string (const struct variable *var, GError **err)
 
 
 gchar *
-missing_values_to_string (const struct variable *pv, GError **err)
+missing_values_to_string (const PsppireDict *dict, const struct variable *pv, GError **err)
 {
   const struct fmt_spec *fmt =  var_get_print_format (pv);
   gchar *s;
@@ -70,7 +53,8 @@ missing_values_to_string (const struct variable *pv, GError **err)
              g_string_append (gstr, mv[i]);
              g_free (mv[i]);
            }
-         s = pspp_locale_to_utf8 (gstr->str, gstr->len, err);
+         s = recode_string (UTF8, psppire_dict_encoding (dict),
+                            gstr->str, gstr->len);
          g_string_free (gstr, TRUE);
        }
       else
@@ -99,7 +83,8 @@ missing_values_to_string (const struct variable *pv, GError **err)
              g_string_append (gstr, ss);
              free (ss);
            }
-         s = pspp_locale_to_utf8 (gstr->str, gstr->len, err);
+         s = recode_string (UTF8, psppire_dict_encoding (dict),
+                            gstr->str, gstr->len);
          g_string_free (gstr, TRUE);
        }
 
index 40404b896d1ae7be087830d39d5f5fbc4ab9b8df..927e235c21419d48e80875284412dd9268424f3e 100644 (file)
 
 #include <glib.h>
 #include <data/variable.h>
+#include "psppire-dict.h"
 
 struct variable;
 
 #define n_ALIGNMENTS 3
 
 extern const gchar *const alignments[n_ALIGNMENTS + 1];
-
 extern const gchar *const measures[n_MEASURES + 1];
 
-
-gchar * name_to_string (const struct variable *var, GError **err);
-
-
-gchar * missing_values_to_string (const struct variable *pv, GError **err);
-
-gchar * measure_to_string (const struct variable *var, GError **err);
-
-gchar * label_to_string (const struct variable *var, GError **err);
-
+gchar *missing_values_to_string (const PsppireDict *dict, const struct variable *pv, GError **err);
+gchar *measure_to_string (const struct variable *var, GError **err);
 
 #endif
index 612643b4351b4447f72b3b35449a1e63793dafd6..a53d6a5cf0a09264189a98a525a79c48f70c80d0 100644 (file)
@@ -28,6 +28,7 @@
 #include "helper.h"
 
 #include <language/syntax-string-source.h>
+#include <libpspp/i18n.h>
 #include "helper.h"
 
 
 #define N_(msgid) msgid
 
 
+static const gchar none[] = N_("None");
+
+
+static gchar *
+name_to_string (const struct variable *var, PsppireDict *dict)
+{
+  const char *name = var_get_name (var);
+  g_assert (name);
+
+  return recode_string (UTF8, psppire_dict_encoding (dict),
+                       name, -1);
+}
+
+
+static gchar *
+label_to_string (const struct variable *var, PsppireDict *dict)
+{
+  const char *label = var_get_label (var);
+
+  if (! label) return g_strdup (none);
+
+  return recode_string (UTF8, psppire_dict_encoding (dict),
+                       label, -1);
+}
+
 
 static void
 populate_text (PsppireDictView *treeview, gpointer data)
 {
   gchar *text = 0;
   GString *gstring;
+  PsppireDict *dict;
 
   GtkTextBuffer *textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(data));
   const struct variable *var =
@@ -50,6 +77,10 @@ populate_text (PsppireDictView *treeview, gpointer data)
   if ( var == NULL)
     return;
 
+  g_object_get (treeview,
+               "dictionary", &dict,
+               NULL);
+
   gstring = g_string_sized_new (200);
   text = name_to_string (var, NULL);
   g_string_assign (gstring, text);
@@ -70,7 +101,7 @@ populate_text (PsppireDictView *treeview, gpointer data)
     g_string_append_printf (gstring, _("Type: %s\n"), buffer);
   }
 
-  text = missing_values_to_string (var, NULL);
+  text = missing_values_to_string (dict, var, NULL);
   g_string_append_printf (gstring, _("Missing Values: %s\n"),
                          text);
   g_free (text);
@@ -92,7 +123,6 @@ populate_text (PsppireDictView *treeview, gpointer data)
       g_string_append (gstring, "\n");
       g_string_append (gstring, _("Value Labels:\n"));
 
-#if 1
       for (vl = val_labs_first_sorted (labs, &vli);
           vl;
           vl = val_labs_next (labs, &vli))
@@ -100,14 +130,15 @@ populate_text (PsppireDictView *treeview, gpointer data)
          gchar *const vstr  =
            value_to_text (vl->value,  *var_get_print_format (var));
 
-         text = pspp_locale_to_utf8 (vl->label, -1, NULL);
+
+         text = recode_string (UTF8, psppire_dict_encoding (dict),
+                               vl->label, -1);
 
          g_string_append_printf (gstring, _("%s %s\n"), vstr, text);
 
          g_free (text);
          g_free (vstr);
        }
-#endif
     }
 
   gtk_text_buffer_set_text (textbuffer, gstring->str, gstring->len);