pspp-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pspp-cvs] psppire ./TODO ./psppire.glade src/ChangeLog sr...


From: John Darrington
Subject: [Pspp-cvs] psppire ./TODO ./psppire.glade src/ChangeLog sr...
Date: Sun, 18 Dec 2005 04:57:43 +0000

CVSROOT:        /sources/pspp
Module name:    psppire
Branch:         
Changes by:     John Darrington <address@hidden>        05/12/18 04:57:43

Modified files:
        .              : TODO psppire.glade 
        src            : ChangeLog var_type_dialog.c var_type_dialog.h 

Log message:
        Implemented Custom Currency input.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pspp/psppire/TODO.diff?tr1=1.16&tr2=1.17&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/psppire/psppire.glade.diff?tr1=1.15&tr2=1.16&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/psppire/src/ChangeLog.diff?tr1=1.10&tr2=1.11&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/psppire/src/var_type_dialog.c.diff?tr1=1.7&tr2=1.8&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/psppire/src/var_type_dialog.h.diff?tr1=1.5&tr2=1.6&r1=text&r2=text

Patches:
Index: psppire/TODO
diff -u psppire/TODO:1.16 psppire/TODO:1.17
--- psppire/TODO:1.16   Wed Dec 14 11:39:12 2005
+++ psppire/TODO        Sun Dec 18 04:57:43 2005
@@ -42,8 +42,6 @@
 * When switching between data/variables sheets by double-clicking title 
   buttons, we need to scroll the sheet to the right position.
 
-* Implement Custom Currency sub type in Variable Type dialog.
-
 * Value labels currently don't work properly for Date, Dot, Comma variables.
 
 * Implement mechanism for handling errors (use GError ?). 
Index: psppire/psppire.glade
diff -u psppire/psppire.glade:1.15 psppire/psppire.glade:1.16
--- psppire/psppire.glade:1.15  Wed Dec 14 11:39:12 2005
+++ psppire/psppire.glade       Sun Dec 18 04:57:43 2005
@@ -784,7 +784,7 @@
 
          <child>
            <widget class="GtkScrolledWindow" id="scrolledwindow4">
-             <property name="width_request">185</property>
+             <property name="width_request">20</property>
              <property name="height_request">194</property>
              <property name="can_focus">True</property>
              <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
@@ -808,8 +808,8 @@
            </widget>
            <packing>
              <property name="padding">0</property>
-             <property name="expand">True</property>
-             <property name="fill">True</property>
+             <property name="expand">False</property>
+             <property name="fill">False</property>
            </packing>
          </child>
 
@@ -820,6 +820,8 @@
 
              <child>
                <widget class="GtkScrolledWindow" id="scrolledwindow5">
+                 <property name="width_request">1</property>
+                 <property name="height_request">120</property>
                  <property name="visible">True</property>
                  <property name="can_focus">True</property>
                  <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
@@ -828,9 +830,7 @@
                  <property 
name="window_placement">GTK_CORNER_TOP_LEFT</property>
 
                  <child>
-                   <widget class="GtkTreeView" id="treeview2">
-                     <property name="width_request">36</property>
-                     <property name="height_request">115</property>
+                   <widget class="GtkTreeView" id="custom_treeview">
                      <property name="visible">True</property>
                      <property name="can_focus">True</property>
                      <property name="headers_visible">False</property>
@@ -876,9 +876,9 @@
                          <property name="spacing">0</property>
 
                          <child>
-                           <widget class="GtkLabel" id="label14">
+                           <widget class="GtkLabel" id="psample_label">
                              <property name="visible">True</property>
-                             <property name="label" 
translatable="yes">label14</property>
+                             <property name="label" 
translatable="yes">positive</property>
                              <property name="use_underline">False</property>
                              <property name="use_markup">False</property>
                              <property 
name="justify">GTK_JUSTIFY_LEFT</property>
@@ -895,15 +895,15 @@
                            </widget>
                            <packing>
                              <property name="padding">0</property>
-                             <property name="expand">False</property>
-                             <property name="fill">False</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
                            </packing>
                          </child>
 
                          <child>
-                           <widget class="GtkLabel" id="label15">
+                           <widget class="GtkLabel" id="nsample_label">
                              <property name="visible">True</property>
-                             <property name="label" 
translatable="yes">label15</property>
+                             <property name="label" 
translatable="yes">negative</property>
                              <property name="use_underline">False</property>
                              <property name="use_markup">False</property>
                              <property 
name="justify">GTK_JUSTIFY_LEFT</property>
@@ -920,8 +920,8 @@
                            </widget>
                            <packing>
                              <property name="padding">0</property>
-                             <property name="expand">False</property>
-                             <property name="fill">False</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
                            </packing>
                          </child>
                        </widget>
@@ -956,6 +956,7 @@
                  <property name="padding">0</property>
                  <property name="expand">True</property>
                  <property name="fill">True</property>
+                 <property name="pack_type">GTK_PACK_END</property>
                </packing>
              </child>
            </widget>
Index: psppire/src/ChangeLog
diff -u psppire/src/ChangeLog:1.10 psppire/src/ChangeLog:1.11
--- psppire/src/ChangeLog:1.10  Wed Dec 14 11:39:12 2005
+++ psppire/src/ChangeLog       Sun Dec 18 04:57:43 2005
@@ -1,3 +1,7 @@
+Sun Dec 18 12:41:56 WST 2005 John Darrington <address@hidden>
+
+       * var_type_dialog.c: Implemented custom currency type selection.
+
 Wed Dec 14 19:37:01 WST 2005 John Darrington <address@hidden>
 
        * val_labs_dialog.c: When entering value, treeview item is now 
Index: psppire/src/var_type_dialog.c
diff -u psppire/src/var_type_dialog.c:1.7 psppire/src/var_type_dialog.c:1.8
--- psppire/src/var_type_dialog.c:1.7   Wed Dec 14 11:39:12 2005
+++ psppire/src/var_type_dialog.c       Sun Dec 18 04:57:43 2005
@@ -29,6 +29,7 @@
 #include "misc.h"
 
 #include "var.h"
+#include "settings.h"
 
 struct tgs
 {
@@ -42,7 +43,8 @@
   struct fmt_spec spec;
 };
 
-static struct format_opt format_option[] =
+
+static const struct format_opt format_option[] =
   {
     { "dd-mmm-yyyy", {FMT_DATE,  11, 0} },
     { "dd-mmm-yy",   {FMT_DATE,   9, 0} },
@@ -64,7 +66,7 @@
   };
 
 
-static struct fmt_spec dollar_format[] = 
+static const struct fmt_spec dollar_format[] = 
   {
     {FMT_DOLLAR, 2, 0},
     {FMT_DOLLAR, 3, 0},
@@ -80,9 +82,21 @@
     {FMT_DOLLAR, 19, 2}
   };
 
+static const int cc_format[] = 
+  {
+    FMT_CCA, 
+    FMT_CCB, 
+    FMT_CCC, 
+    FMT_CCD, 
+    FMT_CCE, 
+  };
+
 
 static void select_treeview_from_format
-      (GtkTreeView *treeview, const struct fmt_spec *fmt);
+ (GtkTreeView *treeview, const struct fmt_spec *fmt);
+
+static void select_treeview_from_format_type(GtkTreeView *treeview, 
+                                            const int fmt_type);
 
 
 /* callback for when any of the radio buttons are toggled */
@@ -97,6 +111,30 @@
   tgs->dialog->active_button = tgs->button;
 }
 
+static void update_width_decimals(const struct var_type_dialog *dialog);
+
+#define force_max(x, val) if (x > val) x = val
+
+/* 
+   Set the local format from the variable
+   and force them to have sensible values */
+static void
+set_local_width_decimals(struct var_type_dialog *dialog)
+{
+  *dialog->fmt_l = dialog->var->write;
+
+  switch (dialog->active_button) 
+    {
+    case BUTTON_STRING:
+      force_max( dialog->fmt_l->w, 255);
+      break;
+    default:
+      force_max( dialog->fmt_l->w, 40);
+      force_max( dialog->fmt_l->d, 16);
+      break;
+    }
+}
+
 
 /* callback for when any of the radio buttons are toggled */
 static void        
@@ -123,7 +161,10 @@
        }
       return ;
     }
-  
+
+  set_local_width_decimals(dialog);
+  update_width_decimals(dialog);
+
   switch (dialog->active_button) 
     {
     case BUTTON_STRING:
@@ -144,6 +185,9 @@
       gtk_widget_show_all(dialog->width_decimals);
       break;
     case BUTTON_CUSTOM:
+      select_treeview_from_format_type(dialog->custom_treeview,
+                                 cc_format[0]);
+
       gtk_widget_show(dialog->width_decimals);
       gtk_widget_show(dialog->custom_currency_hbox);
       break;
@@ -202,28 +246,88 @@
   gtk_size_group_add_widget(sg, w);
 }
 
-/* Callback for when a treeview row is changed.
-   It sets the fmt_spec to reflect the selected format */
+/* Set the local width and decimals entry boxes to reflec the local format */
 static void
-update_width_decimals(GtkTreeView *treeview, gpointer data)
+update_width_decimals(const struct var_type_dialog *dialog)
 {
-  struct var_type_dialog *dialog = data;
+  g_assert(dialog);
+  g_assert(dialog->fmt_l);
 
-  gchar *text = g_strdup_printf("%d", dialog->fmt_spec->w);
+  gchar *text = g_strdup_printf("%d", dialog->fmt_l->w);
   gtk_entry_set_text(GTK_ENTRY(dialog->entry_width), text);
   g_free(text);
 
-  text = g_strdup_printf("%d", dialog->fmt_spec->d);
+  text = g_strdup_printf("%d", dialog->fmt_l->d);
   gtk_entry_set_text(GTK_ENTRY(dialog->entry_decimals), text);
   g_free(text);
 }
 
+/* Callback for when the custom treeview row is changed.
+   It sets dialog box to reflect the selected format */
+static void
+preview_custom(GtkWidget *w, gpointer data)
+{
+  struct var_type_dialog *dialog = data;
+
+  if ( dialog->active_button != BUTTON_CUSTOM ) 
+    return;
+
+  const gchar *text = gtk_entry_get_text(GTK_ENTRY(dialog->entry_decimals));
+  dialog->fmt_l->d = atoi(text);
+
+  text = gtk_entry_get_text(GTK_ENTRY(dialog->entry_width));
+  dialog->fmt_l->w = atoi(text);
+
+  if ( ! check_output_specifier(dialog->fmt_l, 0))
+    {
+      gtk_label_set_text(GTK_LABEL(dialog->label_psample), "---");
+      gtk_label_set_text(GTK_LABEL(dialog->label_nsample), "---");
+    }
+  else
+    {
+      gchar *sample_text;
+      union value v;
+      v.f = 1234.56;
+
+      sample_text = value_to_text(v, *dialog->fmt_l);
+      gtk_label_set_text(GTK_LABEL(dialog->label_psample), sample_text);
+      g_free(sample_text);
+
+      v.f = -v.f;
+      sample_text = value_to_text(v, *dialog->fmt_l);
+      gtk_label_set_text(GTK_LABEL(dialog->label_nsample), sample_text);
+      g_free(sample_text);
+    }
+}
+
+/* Callback for when a treeview row is changed.
+   It sets the fmt_l_spec to reflect the selected format */
+static void
+set_format_from_treeview(GtkTreeView *treeview, gpointer data)
+{
+  struct var_type_dialog *dialog = data;
+  GtkTreeIter iter ;
+  GValue the_value = {0}; 
+
+  GtkTreeSelection* sel =  gtk_tree_view_get_selection(treeview);
+
+  GtkTreeModel * model  = gtk_tree_view_get_model(treeview);
+
+  gtk_tree_selection_get_selected (sel, &model, &iter);
+
+  gtk_tree_model_get_value(model, &iter, 1, &the_value);
+
+  *dialog->fmt_l = *(struct fmt_spec *) g_value_get_pointer(&the_value);
+  
+}
+
 
 /* Callback for when a treeview row is changed.
-   It sets the fmt_spec to reflect the selected format */
+   It sets the type of the fmt_l to reflect the selected type */
 static void
-set_format(GtkTreeView *treeview, gpointer data)
+set_format_type_from_treeview(GtkTreeView *treeview, gpointer data)
 {
+  static struct fmt_spec custom_format = {0,0,0};
   struct var_type_dialog *dialog = data;
   GtkTreeIter iter ;
   GValue the_value = {0}; 
@@ -236,11 +340,14 @@
 
   gtk_tree_model_get_value(model, &iter, 1, &the_value);
 
-  dialog->fmt_spec = g_value_get_pointer(&the_value);
+  *dialog->fmt_l = custom_format;
+  dialog->fmt_l->type = *(int*) g_value_get_pointer(&the_value);
+
 }
 
 
 
+
 /* Create the structure from the XML definitions */
 struct var_type_dialog *
 var_type_dialog_create(GladeXML *xml)
@@ -250,7 +357,7 @@
 
   struct var_type_dialog *dialog = g_malloc(sizeof(struct var_type_dialog));
 
-  dialog->fmt_spec = 0;
+  dialog->fmt_l = g_malloc(sizeof *dialog->fmt_l);
 
   dialog->window = get_widget_assert(xml,"var_type_dialog");
 
@@ -280,6 +387,9 @@
   dialog->label_decimals = get_widget_assert(xml, "decimals_label");
   dialog->entry_decimals = get_widget_assert(xml, "decimals_entry");
 
+  dialog->label_psample = get_widget_assert(xml, "psample_label");
+  dialog->label_nsample = get_widget_assert(xml, "nsample_label");
+
 
   dialog->entry_width = get_widget_assert(xml,"width_entry");
 
@@ -290,6 +400,10 @@
   dialog->dollar_treeview = 
     GTK_TREE_VIEW(get_widget_assert(xml, "dollar_treeview"));
 
+  dialog->custom_treeview = 
+    GTK_TREE_VIEW(get_widget_assert(xml, "custom_treeview"));
+
+
   dialog->ok = get_widget_assert(xml,"var_type_ok");
 
 
@@ -298,7 +412,7 @@
      We need to make sure that they all have the same width, to avoid
      upleasant resizing effects */
   GtkSizeGroup *sizeGroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-  gtk_container_foreach(get_widget_assert(xml, "middle_box"), 
+  gtk_container_foreach(GTK_CONTAINER(get_widget_assert(xml, "middle_box")), 
                        add_to_group, sizeGroup);
 
   
@@ -351,7 +465,7 @@
   g_object_unref(list_store);
 
   g_signal_connect(GTK_OBJECT(dialog->date_format_treeview), "cursor-changed",
-                  GTK_SIGNAL_FUNC(set_format), dialog);
+                  GTK_SIGNAL_FUNC(set_format_from_treeview), dialog);
 
 
   /* populate the dollar treeview */
@@ -387,13 +501,66 @@
 
   g_signal_connect(GTK_OBJECT(dialog->dollar_treeview), 
                   "cursor-changed",
-                  GTK_SIGNAL_FUNC(set_format), dialog);
+                  GTK_SIGNAL_FUNC(set_format_from_treeview), dialog);
 
-  g_signal_connect(GTK_OBJECT(dialog->dollar_treeview), 
+  g_signal_connect_swapped(GTK_OBJECT(dialog->dollar_treeview), 
                   "cursor-changed",
                   GTK_SIGNAL_FUNC(update_width_decimals), dialog);
 
 
+  /* populate the custom treeview */
+
+  renderer = gtk_cell_renderer_text_new();
+  
+  column = gtk_tree_view_column_new_with_attributes ("Title",
+                                                    renderer,
+                                                    "text",
+                                                    0,
+                                                    NULL);
+
+  gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->custom_treeview), 
+                              column);
+
+
+  list_store = gtk_list_store_new (2, G_TYPE_STRING, 
+                                                G_TYPE_POINTER);
+
+  for ( i = 0 ; i < CC_CNT ; ++i ) 
+    {
+      gchar text[4];
+      g_snprintf(text, 4, "CC%c", 'A' + i);
+      gtk_list_store_append (list_store, &iter);
+      gtk_list_store_set (list_store, &iter,
+                          0, text,
+                         1, &cc_format[i],
+                         -1);
+    }
+
+  gtk_tree_view_set_model(GTK_TREE_VIEW(dialog->custom_treeview), 
+                         GTK_TREE_MODEL(list_store));
+
+  g_object_unref(list_store);
+
+
+  g_signal_connect(GTK_OBJECT(dialog->custom_treeview), 
+                  "cursor-changed",
+                  GTK_SIGNAL_FUNC(set_format_type_from_treeview), dialog);
+
+
+  g_signal_connect(GTK_OBJECT(dialog->custom_treeview), 
+                  "cursor-changed",
+                  GTK_SIGNAL_FUNC(preview_custom), dialog);
+
+
+  g_signal_connect(GTK_OBJECT(dialog->entry_width), 
+                  "changed",
+                  GTK_SIGNAL_FUNC(preview_custom), dialog);
+
+
+  g_signal_connect(GTK_OBJECT(dialog->entry_decimals), 
+                  "changed",
+                  GTK_SIGNAL_FUNC(preview_custom), dialog);
+
 
   /* Connect the OK button */
   g_signal_connect(dialog->ok, "clicked", G_CALLBACK(on_var_type_ok_clicked), 
@@ -454,6 +621,45 @@
 }
 
 
+/* Set the TREEVIEW list cursor to the item described by FMT_TYPE */
+static void
+select_treeview_from_format_type(GtkTreeView *treeview, 
+                                const int fmt_type)
+{
+  /*
+    We do this with a linear search through the model --- hardly 
+    efficient, but the list is short ... */
+  GtkTreeIter iter;
+
+  GtkTreeModel * model  = gtk_tree_view_get_model(treeview);
+
+  gboolean success;
+  for (success = gtk_tree_model_get_iter_first(model, &iter);
+       success;
+       success = gtk_tree_model_iter_next(model, &iter))
+    {
+      GValue value = {0};
+
+      gtk_tree_model_get_value(model, &iter, 1, &value);
+         
+      const int spec = * ((int *) g_value_get_pointer(&value));
+
+      if ( spec == fmt_type)
+       break;
+    }
+       
+  GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
+  if ( path ) 
+    {
+      gtk_tree_view_set_cursor(treeview, path, 0, 0);
+      gtk_tree_path_free(path);
+    }
+  else
+    g_warning("Unknown custom type  %d\n", fmt_type);
+
+}
+
+
 
 /* Set up the state of the dialog box to match the variable VAR */
 void
@@ -465,7 +671,6 @@
 
   g_assert(dialog);
 
-
   dialog->var = var;
   
   GString *str = g_string_new("");
@@ -480,7 +685,7 @@
   gtk_entry_set_text(GTK_ENTRY(dialog->entry_width), 
                     str->str);
 
-  g_string_free(str,TRUE);
+  g_string_free(str, TRUE);
 
   /* Populate the radio button states */
   switch (write_spec.type)
@@ -526,6 +731,16 @@
       gtk_widget_show(dialog->date_format_list);
       select_treeview_from_format(dialog->date_format_treeview, &var->write);
       break;
+    case FMT_CCA:
+    case FMT_CCB:
+    case FMT_CCC:
+    case FMT_CCD:
+    case FMT_CCE:
+      var_type_dialog_set_active_button(dialog, BUTTON_CUSTOM);
+      select_treeview_from_format_type(dialog->custom_treeview, 
+                                      var->write.type);
+      gtk_widget_show_all(dialog->width_decimals);
+      break;
     default:
       gtk_widget_show_all(dialog->width_decimals);
       break;
@@ -600,16 +815,14 @@
       result = make_output_format_try(&spec, FMT_E, width, decimals);
       break;
     case BUTTON_DATE:
-      g_assert(dialog->fmt_spec);
-      g_assert(check_output_specifier(dialog->fmt_spec, TRUE));
-      result = memcpy(&spec, dialog->fmt_spec, sizeof(struct fmt_spec));
+    case BUTTON_CUSTOM:
+      g_assert(dialog->fmt_l);
+      g_assert(check_output_specifier(dialog->fmt_l, TRUE));
+      result = memcpy(&spec, dialog->fmt_l, sizeof(struct fmt_spec));
       break;
     case BUTTON_DOLLAR:
       result = make_output_format_try(&spec, FMT_DOLLAR, width, decimals);
       break;
-    case BUTTON_CUSTOM:
-      result = make_output_format_try(&spec, FMT_CCA, width, decimals);
-      break;
     default:
       g_print("Unknown variable type: %d\n", dialog->active_button) ;
       result = false;
Index: psppire/src/var_type_dialog.h
diff -u psppire/src/var_type_dialog.h:1.5 psppire/src/var_type_dialog.h:1.6
--- psppire/src/var_type_dialog.h:1.5   Wed Dec 14 11:39:12 2005
+++ psppire/src/var_type_dialog.h       Sun Dec 18 04:57:43 2005
@@ -48,7 +48,7 @@
   struct variable *var;
 
   /* Local copy of format specifier */
-  struct fmt_spec *fmt_spec;
+  struct fmt_spec *fmt_l;
 
   /* Toggle Buttons */
   GtkWidget *radioButton[num_BUTTONS];
@@ -73,6 +73,9 @@
 
   /* Custom Currency */
   GtkWidget *custom_currency_hbox;
+  GtkTreeView *custom_treeview;
+  GtkWidget *label_psample;
+  GtkWidget *label_nsample;
 
   /* Actions */
   GtkWidget *ok;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]