Finish converting struct variable to an opaque type. In this
[pspp-builds.git] / src / ui / gui / psppire-variable.c
index 6443ee901ed2c069744c9cd9943956afcc100fb6..70c69a7ee768b3bdcbee3cd02a67b287dc31a50d 100644 (file)
@@ -1,6 +1,6 @@
 /* 
     PSPPIRE --- A Graphical User Interface for PSPP
-    Copyright (C) 2004  Free Software Foundation
+    Copyright (C) 2004, 2006  Free Software Foundation
     Written by John Darrington
 
     This program is free software; you can redistribute it and/or modify
     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     02110-1301, USA. */
 
+#include <config.h>
+
 #include <string.h>
 #include <stdlib.h>
 
-#include "missing-values.h"
-#include "value-labels.h"
-#include "format.h"
+#include <data/missing-values.h>
+#include <data/value-labels.h>
+#include <data/format.h>
+#include <libpspp/message.h>
+
+#include <libpspp/misc.h>
 
 #include "psppire-variable.h"
 #include "psppire-dict.h"
@@ -40,7 +45,7 @@ psppire_variable_set_name(struct PsppireVariable *pv, const gchar *text)
   if ( !text) 
     return FALSE;
 
-  if ( 0 == strcmp(pv->v->name, text))
+  if ( 0 == strcmp(var_get_name (pv->v), text))
     return FALSE;
 
   if ( ! psppire_dict_check_name(pv->dict, text, TRUE) )
@@ -48,7 +53,7 @@ psppire_variable_set_name(struct PsppireVariable *pv, const gchar *text)
 
   dict_rename_var(pv->dict->dict, pv->v, text);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
 
   return TRUE;
 }
@@ -61,9 +66,9 @@ psppire_variable_set_columns(struct PsppireVariable *pv, gint columns)
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  pv->v->display_width = columns;
+  var_set_display_width (pv->v, columns);
   
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
 
   return TRUE;
 }
@@ -75,10 +80,9 @@ psppire_variable_set_label(struct PsppireVariable *pv, const gchar *label)
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  g_free(pv->v->label);
-  pv->v->label = g_strdup(label);
+  var_set_label (pv->v, label);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
 
   return TRUE;
 }
@@ -87,12 +91,13 @@ psppire_variable_set_label(struct PsppireVariable *pv, const gchar *label)
 gboolean
 psppire_variable_set_decimals(struct PsppireVariable *pv, gint decimals)
 {
+  struct fmt_spec fmt;
+
   g_return_val_if_fail(pv, FALSE);
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  struct fmt_spec fmt = pv->v->write;
-
+  fmt = *var_get_write_format (pv->v);
   fmt.d = decimals;
 
   return psppire_variable_set_format(pv, &fmt);
@@ -103,16 +108,29 @@ psppire_variable_set_decimals(struct PsppireVariable *pv, gint decimals)
 gboolean
 psppire_variable_set_width(struct PsppireVariable *pv, gint width)
 {
+  struct fmt_spec fmt ;
   g_return_val_if_fail(pv, FALSE);
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  struct fmt_spec fmt = pv->v->write;
-
+  fmt = *var_get_write_format (pv->v);
   fmt.w = width;
 
-  if ( pv->v->type == ALPHA ) 
-    pv->v->width = width;
+  if (var_is_alpha (pv->v))
+    {
+      gint old_var_cnt , new_var_cnt ;
+
+      if ( var_get_width (pv->v) == 0 ) 
+       old_var_cnt = 1;
+      else
+       old_var_cnt = DIV_RND_UP(var_get_width (pv->v), MAX_SHORT_STRING);
+      
+      new_var_cnt = DIV_RND_UP(width, MAX_SHORT_STRING);
+      var_set_width (pv->v, width);
+
+      psppire_dict_resize_variable(pv->dict, pv,
+                                  old_var_cnt, new_var_cnt);
+    }
 
   return psppire_variable_set_format(pv, &fmt);
 }
@@ -121,16 +139,28 @@ psppire_variable_set_width(struct PsppireVariable *pv, gint width)
 gboolean
 psppire_variable_set_type(struct PsppireVariable *pv, int type)
 {
+  gint old_var_cnt , new_var_cnt ;
+
   g_return_val_if_fail(pv, FALSE);
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  pv->v->type = type; 
+  if ( var_get_width (pv->v) ) 
+    old_var_cnt = 1;
+  else
+    old_var_cnt = DIV_RND_UP (var_get_width (pv->v), MAX_SHORT_STRING);
+
+  var_set_width (pv->v, type == VAR_NUMERIC ? 0 : 1);
 
-  if ( type == NUMERIC ) 
-    pv->v->width = 0;
+  if ( var_get_width (pv->v) == 0 ) 
+    new_var_cnt = 1;
+  else
+    new_var_cnt = DIV_RND_UP (var_get_width (pv->v), MAX_SHORT_STRING);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_resize_variable(pv->dict, pv,
+                              old_var_cnt, new_var_cnt);
+
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
   return TRUE;
 }
 
@@ -142,17 +172,17 @@ psppire_variable_set_format(struct PsppireVariable *pv, struct fmt_spec *fmt)
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  if ( check_output_specifier(fmt, false) 
-       && 
-       check_specifier_type(fmt, pv->v->type, false)
-       && 
-       check_specifier_width(fmt, pv->v->width, false)
-       ) 
+  msg_disable ();
+  if ( fmt_check_output(fmt) 
+       && fmt_check_type_compat (fmt, var_get_type (pv->v))
+       && fmt_check_width_compat (fmt, var_get_width (pv->v))) 
     {
-      pv->v->write = pv->v->print = *fmt;
-      psppire_dict_var_changed(pv->dict, pv->v->index);
+      msg_enable ();
+      var_set_both_formats (pv->v, fmt);
+      psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
       return TRUE;
     }
+  msg_enable ();
 
   return FALSE;
 }
@@ -166,10 +196,9 @@ psppire_variable_set_value_labels(const struct PsppireVariable *pv,
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  val_labs_destroy(pv->v->val_labs);
-  pv->v->val_labs = val_labs_copy(vls);
+  var_set_value_labels (pv->v, vls);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
   return TRUE;
 }
 
@@ -181,9 +210,9 @@ psppire_variable_set_missing(const struct PsppireVariable *pv,
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  mv_copy(&pv->v->miss, miss);
+  var_set_missing_values (pv->v, miss);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
   return TRUE;
 }
 
@@ -193,9 +222,9 @@ psppire_variable_set_write_spec(const struct PsppireVariable *pv, struct fmt_spe
   g_return_val_if_fail(pv, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  pv->v->write = fmt;
+  var_set_write_format (pv->v, &fmt);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
   return TRUE;
 }
 
@@ -205,9 +234,9 @@ psppire_variable_set_print_spec(const struct PsppireVariable *pv, struct fmt_spe
   g_return_val_if_fail(pv, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  pv->v->print = fmt;
+  var_set_print_format (pv->v, &fmt);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
   return TRUE;
 }
 
@@ -220,9 +249,9 @@ psppire_variable_set_alignment(struct PsppireVariable *pv, gint align)
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  pv->v->alignment = align;
+  var_set_alignment (pv->v, align);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
   return TRUE;
 }
 
@@ -234,9 +263,9 @@ psppire_variable_set_measure(struct PsppireVariable *pv, gint measure)
   g_return_val_if_fail(pv->dict, FALSE);
   g_return_val_if_fail(pv->v, FALSE);
 
-  pv->v->measure = measure + 1;
+  var_set_measure (pv->v, measure + 1);
 
-  psppire_dict_var_changed(pv->dict, pv->v->index);
+  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
   return TRUE;
 }
 
@@ -247,8 +276,7 @@ psppire_variable_get_write_spec(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, NULL);
   g_return_val_if_fail(pv->v, NULL);
 
-
-  return &pv->v->write;
+  return var_get_write_format (pv->v);
 }
 
 
@@ -258,7 +286,7 @@ psppire_variable_get_name(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, NULL);
   g_return_val_if_fail(pv->v, NULL);
 
-  return pv->v->name;
+  return var_get_name (pv->v);
 }
 
 
@@ -268,7 +296,7 @@ psppire_variable_get_columns(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, -1);
   g_return_val_if_fail(pv->v, -1);
 
-  return pv->v->display_width;
+  return var_get_display_width (pv->v);
 }
 
 
@@ -279,7 +307,7 @@ psppire_variable_get_label(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, NULL);
   g_return_val_if_fail(pv->v, NULL);
 
-  return pv->v->label;
+  return var_get_label (pv->v);
 }
 
 
@@ -289,7 +317,7 @@ psppire_variable_get_missing(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, NULL);
   g_return_val_if_fail(pv->v, NULL);
 
-  return &pv->v->miss;
+  return var_get_missing_values (pv->v);
 }
 
 
@@ -299,7 +327,7 @@ psppire_variable_get_value_labels(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, NULL);
   g_return_val_if_fail(pv->v, NULL);
 
-  return pv->v->val_labs;
+  return var_get_value_labels (pv->v);
 }
 
 
@@ -309,7 +337,7 @@ psppire_variable_get_alignment(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, -1);
   g_return_val_if_fail(pv->v, -1);
 
-  return pv->v->alignment;
+  return var_get_alignment (pv->v);
 }
 
 
@@ -320,7 +348,7 @@ psppire_variable_get_measure(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, -1);
   g_return_val_if_fail(pv->v, -1);
 
-  return pv->v->measure - 1;
+  return var_get_measure (pv->v) - 1;
 }
 
 gint
@@ -329,7 +357,7 @@ psppire_variable_get_type(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, -1);
   g_return_val_if_fail(pv->v, -1);
 
-  return pv->v->type;
+  return var_get_type (pv->v);
 }
 
 
@@ -339,15 +367,27 @@ psppire_variable_get_width(const struct PsppireVariable *pv)
   g_return_val_if_fail(pv, -1);
   g_return_val_if_fail(pv->v, -1);
 
-  return pv->v->width;
+  return var_get_width (pv->v);
 }
 
+
+gint
+psppire_variable_get_fv(const struct PsppireVariable *pv)
+{
+  g_return_val_if_fail(pv, -1);
+  g_return_val_if_fail(pv->v, -1);
+
+  return var_get_case_index (pv->v);
+}
+
+
+
 gint
 psppire_variable_get_index(const struct PsppireVariable *pv)
 {
   g_return_val_if_fail(pv, -1);
   g_return_val_if_fail(pv->v, -1);
 
-  return pv->v->fv;
+  return var_get_dict_index (pv->v);
 }