Allow non-ascii characters to be entered into the variable and data sheets.
[pspp-builds.git] / src / ui / gui / psppire-data-store.c
index c8804f48ba0ee5a0a974fe459302e38e8fe4dd9a..45104f5cbb8ff519418fee88edf92e496e91652c 100644 (file)
@@ -263,6 +263,7 @@ static GtkJustification get_column_justification (const PsppireSheetModel *model
 
 static gchar * get_row_button_label (const PsppireSheetModel *model, gint row);
 static gboolean get_row_sensitivity (const PsppireSheetModel *model, gint row);
+static gboolean get_row_overstrike (const PsppireSheetModel *model, gint row);
 
 
 static void
@@ -285,6 +286,7 @@ psppire_data_store_sheet_model_init (PsppireSheetModelIface *iface)
 
   iface->get_row_title = get_row_button_label;
   iface->get_row_sensitivity = get_row_sensitivity;
+  iface->get_row_overstrike = get_row_overstrike;
 }
 
 
@@ -657,6 +659,7 @@ gboolean
 psppire_data_store_set_string (PsppireDataStore *store,
                               const gchar *text, glong row, glong col)
 {
+  gchar *s;
   glong n_cases;
   const struct variable *pv = psppire_dict_get_variable (store->dict, col);
   if ( NULL == pv)
@@ -670,9 +673,12 @@ 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);
+
   psppire_data_store_data_in (store, row,
-                             var_get_case_index (pv), ss_cstr (text),
+                             var_get_case_index (pv), ss_cstr (s),
                              var_get_write_format (pv));
+  free (s);
 
   psppire_sheet_model_range_changed (PSPPIRE_SHEET_MODEL (store), row, col, row, col);
 
@@ -1003,3 +1009,30 @@ psppire_data_store_insert_values (PsppireDataStore *ds,
 
   return TRUE;
 }
+
+static gboolean
+get_row_overstrike (const PsppireSheetModel *model, gint row)
+{
+  union value val;
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
+
+  const struct dictionary *dict = ds->dict->dict;
+
+  const struct variable *filter = dict_get_filter (dict);
+
+  if ( row < 0 || row >= datasheet_get_row_cnt (ds->datasheet))
+    return FALSE;
+
+  if ( ! filter)
+    return FALSE;
+
+  g_assert (var_is_numeric (filter));
+
+  if ( ! datasheet_get_value (ds->datasheet, row,
+                             var_get_case_index (filter),
+                             &val, 0) )
+    return FALSE;
+
+
+  return (val.f == 0.0);
+}