r15734 - gnucash/trunk - Add GUID numbers to check formats. Detect duplicate check format

David Hampton hampton at cvs.gnucash.org
Sun Mar 18 13:37:54 EDT 2007


Author: hampton
Date: 2007-03-18 13:37:53 -0400 (Sun, 18 Mar 2007)
New Revision: 15734
Trac: http://svn.gnucash.org/trac/changeset/15734

Modified:
   gnucash/trunk/checks/deluxe.chk
   gnucash/trunk/checks/gnomeprint/deluxe.chk
   gnucash/trunk/checks/gnomeprint/quicken.chk
   gnucash/trunk/checks/gnomeprint/quicken_wallet.chk
   gnucash/trunk/checks/quicken.chk
   gnucash/trunk/checks/quicken_wallet.chk
   gnucash/trunk/src/gnome/dialog-print-check.c
Log:
Add GUID numbers to check formats.  Detect duplicate check format
files (by guid) and show a warning dialog to the user.  Remember the
users selected check format by GUID and not by index.  Add text
clipping when using GnomePrint.


Modified: gnucash/trunk/checks/deluxe.chk
===================================================================
--- gnucash/trunk/checks/deluxe.chk	2007-03-17 17:29:35 UTC (rev 15733)
+++ gnucash/trunk/checks/deluxe.chk	2007-03-18 17:37:53 UTC (rev 15734)
@@ -1,9 +1,10 @@
 [Top]
+Guid = 54a0fef9-0b7e-462b-8af3-a5f4f328f7bc
 Title = Deluxe(tm) Personal Checks US-Letter
 Rotation = -90.0
 Translation = 4;492
-Show_Grid = 0
-Show_Boxes = 0
+Show_Grid = false
+Show_Boxes = false
 
 [Check Items]
 Type_1 = PAYEE

Modified: gnucash/trunk/checks/gnomeprint/deluxe.chk
===================================================================
--- gnucash/trunk/checks/gnomeprint/deluxe.chk	2007-03-17 17:29:35 UTC (rev 15733)
+++ gnucash/trunk/checks/gnomeprint/deluxe.chk	2007-03-18 17:37:53 UTC (rev 15734)
@@ -1,9 +1,10 @@
 [Top]
+Guid = 54a0fef9-0b7e-462b-8af3-a5f4f328f7bc
 Title = Deluxe(tm) Personal Checks US-Letter
 Rotation = 90
 Translation = 232;300
-Show_Grid = 0
-Show_Boxes = 0
+Show_Grid = false
+Show_Boxes = false
 
 [Check Items]
 Type_1 = PAYEE

Modified: gnucash/trunk/checks/gnomeprint/quicken.chk
===================================================================
--- gnucash/trunk/checks/gnomeprint/quicken.chk	2007-03-17 17:29:35 UTC (rev 15733)
+++ gnucash/trunk/checks/gnomeprint/quicken.chk	2007-03-18 17:37:53 UTC (rev 15734)
@@ -1,9 +1,10 @@
 [Top]
+Guid = 67b144d1-96a5-48d5-9337-0e1083bbf229
 Title = Quicken/QuickBooks (tm) US-Letter
 Rotation = 0.0
 Translation = 0.0;0.0
-Show_Grid = 0
-Show_Boxes = 0
+Show_Grid = false
+Show_Boxes = false
 
 [Check Positions]
 Height = 252.0

Modified: gnucash/trunk/checks/gnomeprint/quicken_wallet.chk
===================================================================
--- gnucash/trunk/checks/gnomeprint/quicken_wallet.chk	2007-03-17 17:29:35 UTC (rev 15733)
+++ gnucash/trunk/checks/gnomeprint/quicken_wallet.chk	2007-03-18 17:37:53 UTC (rev 15734)
@@ -1,9 +1,10 @@
 [Top]
+Guid = 617da3b6-21d8-4340-af07-6a4f38bdeb3f
 Title = Quicken(tm) Wallet Checks w/ side stub
 Rotation = 0.0
 Translation = 0.0;0.0
-Show_Grid = 0
-Show_Boxes = 0
+Show_Grid = false
+Show_Boxes = false
 
 [Check Positions]
 Height = 204.0

Modified: gnucash/trunk/checks/quicken.chk
===================================================================
--- gnucash/trunk/checks/quicken.chk	2007-03-17 17:29:35 UTC (rev 15733)
+++ gnucash/trunk/checks/quicken.chk	2007-03-18 17:37:53 UTC (rev 15734)
@@ -1,9 +1,10 @@
 [Top]
+Guid = 67b144d1-96a5-48d5-9337-0e1083bbf229
 Title = Quicken/QuickBooks (tm) US-Letter
 Rotation = 0.0
 Translation = 0.0;4.0
-Show_Grid = 0
-Show_Boxes = 0
+Show_Grid = false
+Show_Boxes = false
 
 [Check Positions]
 Height = 252.0

Modified: gnucash/trunk/checks/quicken_wallet.chk
===================================================================
--- gnucash/trunk/checks/quicken_wallet.chk	2007-03-17 17:29:35 UTC (rev 15733)
+++ gnucash/trunk/checks/quicken_wallet.chk	2007-03-18 17:37:53 UTC (rev 15734)
@@ -1,9 +1,10 @@
 [Top]
+Guid = 617da3b6-21d8-4340-af07-6a4f38bdeb3f
 Title = Quicken(tm) Wallet Checks w/ side stub
 Rotation = 0.0
 Translation = 0.0;4.0
-Show_Grid = 0
-Show_Boxes = 0
+Show_Grid = false
+Show_Boxes = false
 
 [Check Positions]
 Height = 204.0

Modified: gnucash/trunk/src/gnome/dialog-print-check.c
===================================================================
--- gnucash/trunk/src/gnome/dialog-print-check.c	2007-03-17 17:29:35 UTC (rev 15733)
+++ gnucash/trunk/src/gnome/dialog-print-check.c	2007-03-18 17:37:53 UTC (rev 15734)
@@ -55,6 +55,7 @@
 #define G_LOG_DOMAIN "gnc.printing.checks"
 
 #define GCONF_SECTION 	       "dialogs/print_checks"
+#define KEY_CHECK_FORMAT_GUID  "check_format_guid"
 #define KEY_CHECK_FORMAT       "check_format"
 #define KEY_CHECK_POSITION     "check_position"
 #define KEY_DATE_FORMAT_USER   "date_format_custom"
@@ -78,6 +79,7 @@
 #define KF_GROUP_TOP       "Top"
 #define KF_GROUP_POS       "Check Positions"
 #define KF_GROUP_ITEMS     "Check Items"
+#define KF_KEY_GUID        "Guid"
 #define KF_KEY_TITLE       "Title"
 #define KF_KEY_ROTATION    "Rotation"
 #define KF_KEY_TRANSLATION "Translation"
@@ -92,10 +94,25 @@
 #define KF_KEY_TEXT        "Text"
 #define KF_KEY_FILENAME    "Filename"
 
+/**< This enum specifies the columns used in the check format combobox. */
+typedef enum format_combo_col_t {
+    COL_NAME = 0,               /**< This column holds a copy of the check
+                                 *   format name and is what is displayed to
+                                 *   the user in the combobox. It is NULL for
+                                 *   separator lines. */
+    COL_DATA,                   /**< This column holds a pointer to the check
+                                 *   format data read in from a file.  It is
+                                 *   NULL for the custom check format and for
+                                 *   separator lines. */
+    COL_SEP,                    /**< This column contains the value TRUE if
+                                 *   this enry specifies a separator line. */
+} format_combo_col;
+
 #if USE_GTKPRINT
 #    define GncPrintContext GtkPrintContext
 #else
 #    define GncPrintContext GnomePrintContext
+#    define GNOMEPRINT_CLIP_EXTRA 2
 #endif
 
 
@@ -103,9 +120,6 @@
 void gnc_ui_print_check_response_cb(GtkDialog * dialog, gint response, PrintCheckDialog * pcd);
 void gnc_print_check_format_changed(GtkComboBox *widget, PrintCheckDialog * pcd);
 void gnc_print_check_position_changed(GtkComboBox *widget, PrintCheckDialog * pcd);
-static void gnc_ui_print_save_dialog(PrintCheckDialog * pcd);
-static void gnc_ui_print_restore_dialog(PrintCheckDialog * pcd);
-void gnc_ui_print_restore_dialog(PrintCheckDialog * pcd);
 void gnc_print_check_save_button_clicked(GtkButton *button, PrintCheckDialog *pcd);
 
 
@@ -171,6 +185,13 @@
  *  description in a text file. */
 typedef struct _check_format {
 
+    gchar *guid;                /**< Unique identifier for this format. */
+
+    const gchar *group;         /**< The group where this format was found. */
+
+    gchar *filename;            /**< The name of the file from which this data
+                                 *   was read.  */
+
     gchar *title;               /**< Title of this check format. Displayed to
                                  *   user in the dialog box. */
 
@@ -227,11 +248,44 @@
 
   gchar *format_string;
 
-  GSList *formats_list;
   check_format_t *selected_format;
 };
 
 
+/**< This function walks ths list of available check formats looking for a
+ * specific format as specified by guid number.  If found, a pointer to the
+ * check format is returned to the caller.  Additionally, if the caller passed
+ * a pointer to a GtkTreeIter, then the iter for that entry will also be
+ * returned. */
+static check_format_t *
+find_existing_format (GtkListStore *store, gchar *guid, GtkTreeIter *iter_out)
+{
+    GtkTreeIter iter;
+    check_format_t *format;
+
+    g_return_val_if_fail(store, NULL);
+    g_return_val_if_fail(guid, NULL);
+
+    if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
+        return NULL;
+
+    do {
+        gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
+                           COL_DATA, &format, -1);
+        if (format == NULL)
+            continue;
+        if (strcmp(format->guid, guid) != 0)
+            continue;
+
+        if (iter_out)
+          *iter_out = iter;
+        return format;
+    } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter));
+
+    return NULL;
+}
+
+
 static void
 save_float_pair (const char *section, const char *key, double a, double b)
 {
@@ -263,12 +317,20 @@
 static void
 gnc_ui_print_save_dialog(PrintCheckDialog * pcd)
 {
+  GtkTreeModel *model;
+  GtkTreeIter iter;
+  check_format_t *check;
   const gchar *format;
   gint active;
 
   /* Options page */
-  active = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->format_combobox));
-  gnc_gconf_set_int(GCONF_SECTION, KEY_CHECK_FORMAT, active, NULL);
+  if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(pcd->format_combobox),
+                                    &iter)) {
+      model = gtk_combo_box_get_model(GTK_COMBO_BOX(pcd->format_combobox));
+      gtk_tree_model_get(model, &iter, COL_DATA, &check, -1);
+      gnc_gconf_set_string(GCONF_SECTION, KEY_CHECK_FORMAT_GUID,
+                           check ? check->guid : "custom", NULL);
+  }
   active = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->position_combobox));
   gnc_gconf_set_int(GCONF_SECTION, KEY_CHECK_POSITION, active, NULL);
   active = gnc_date_format_get_format (GNC_DATE_FORMAT(pcd->date_format));
@@ -306,16 +368,29 @@
   gnc_gconf_set_int(GCONF_SECTION, KEY_CUSTOM_UNITS, active, NULL);
 }
 
-void
+static void
 gnc_ui_print_restore_dialog(PrintCheckDialog * pcd)
 {
-  gchar *format;
+  GtkTreeModel *model;
+  GtkTreeIter iter;
+  gchar *format, *guid;
   gdouble x, y;
   gint active;
 
   /* Options page */
-  active = gnc_gconf_get_int(GCONF_SECTION, KEY_CHECK_FORMAT, NULL);
-  gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), active);
+  guid = gnc_gconf_get_string(GCONF_SECTION, KEY_CHECK_FORMAT_GUID, NULL);
+  if (guid == NULL) {
+      active = gnc_gconf_get_int(GCONF_SECTION, KEY_CHECK_FORMAT, NULL);
+      gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), active);
+  } else if (strcmp(guid, "custom") == 0) {
+      gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox),
+                               pcd->format_max - 1);
+  } else {
+      model = gtk_combo_box_get_model(GTK_COMBO_BOX(pcd->format_combobox));
+      if (find_existing_format(GTK_LIST_STORE(model), guid, &iter)) {
+          gtk_combo_box_set_active_iter(GTK_COMBO_BOX(pcd->format_combobox), &iter);
+      }
+  }
   active = gnc_gconf_get_int(GCONF_SECTION, KEY_CHECK_POSITION, NULL);
   gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->position_combobox), active);
   active = gnc_gconf_get_int(GCONF_SECTION, KEY_DATE_FORMAT, NULL);
@@ -422,10 +497,15 @@
     GtkWidget *dialog;
     gdouble multip;
     gint i = 0;
+    GUID guid;
+    char buf[GUID_ENCODING_LENGTH+1];
 
     multip = pcd_get_custom_multip(pcd);
 
     key_file = g_key_file_new();
+    guid_new(&guid);
+    g_key_file_set_string(key_file, KF_GROUP_TOP, KF_KEY_GUID,
+                          guid_to_string_buff(&guid, buf));
     g_key_file_set_string(key_file, KF_GROUP_TOP, KF_KEY_TITLE,
                           _("Custom Check"));
     g_key_file_set_boolean(key_file, KF_GROUP_TOP, KF_KEY_SHOW_GRID, FALSE);
@@ -777,10 +857,24 @@
                          GKeyFile * key_file, check_format_t * format)
 {
     GError *error = NULL;
+    gchar **parts;
     gchar *value;
     double *dd;
     gsize dd_len;
 
+    value = g_key_file_get_string(key_file, KF_GROUP_TOP, KF_KEY_GUID, &error);
+    if (error) {
+        g_warning("Check file %s, group %s, key %s, error: %s",
+                  file, KF_GROUP_TOP, KF_KEY_GUID, error->message);
+        g_error_free(error);
+        return FALSE;
+    }
+    parts = g_strsplit(value, "-", -1);
+    format->guid = g_strjoinv("", parts);
+    g_strfreev(parts);
+    g_debug("Check file %s, group %s, key %s, value: %s",
+            file, KF_GROUP_TOP, KF_KEY_GUID, format->guid);
+
     format->title =
         g_key_file_get_string(key_file, KF_GROUP_TOP, KF_KEY_TITLE, &error);
     if (!error) {
@@ -882,6 +976,8 @@
 static void
 free_check_format(check_format_t * data)
 {
+    g_free(data->guid);
+    g_free(data->filename);
     g_free(data->title);
     g_free(data->font);
     g_slist_foreach(data->positions, (GFunc) free_check_position, NULL);
@@ -895,8 +991,8 @@
 /** Read a single check format file and append the resulting format to the
  *  list of all known formats.  This function calls other functions to read
  *  each section of the data file. */
-static void
-read_one_check_format(PrintCheckDialog * pcd,
+static check_format_t *
+read_one_check_format(PrintCheckDialog * pcd, const gchar *groupname,
                       const gchar * dirname, const gchar * file)
 {
     gchar *pathname;
@@ -908,10 +1004,12 @@
     g_free(pathname);
     if (!key_file) {
         g_warning("Check file %s, cannot load file", file);
-        return;
+        return NULL;
     }
 
     format = g_new0(check_format_t, 1);
+    format->group = groupname;
+    format->filename = g_strdup(file);
     if (format_read_general_info(file, key_file, format)) {
         format->positions = format_read_multicheck_info(file, key_file, format);
         format->items = format_read_item_placement(file, key_file, format);
@@ -921,10 +1019,10 @@
     if ((NULL == format->title) || (NULL == format->items)) {
         g_warning("Check file %s, no items read. Dropping file.", file);
         free_check_format(format);
-        return;
+        return NULL;
     }
 
-    pcd->formats_list = g_slist_append(pcd->formats_list, format);
+    return format;
 }
 
 
@@ -932,21 +1030,60 @@
  *  then calling a helper function to read and parse the check format withing
  *  the file. */
 static void
-read_one_check_directory(PrintCheckDialog * pcd, const gchar * dirname)
+read_one_check_directory(PrintCheckDialog * pcd, GtkListStore *store,
+                         const gchar *groupname, const gchar * dirname)
 {
+    check_format_t *format, *existing;
     GDir *dir;
     const gchar *filename;
+    GtkTreeIter iter;
+    GtkWidget *dialog;
+    gboolean found = FALSE;
 
     dir = g_dir_open(dirname, 0, NULL);
-    if (dir) {
-        while ((filename = g_dir_read_name(dir)) != NULL) {
-            if (g_str_has_prefix(filename, "#"))
-                continue;
-            if (g_str_has_suffix(filename, ".chk"))
-                read_one_check_format(pcd, dirname, filename);
+    if (dir == NULL)
+        return;
+
+    while ((filename = g_dir_read_name(dir)) != NULL) {
+        if (g_str_has_prefix(filename, "#"))
+            continue;
+        if (!g_str_has_suffix(filename, ".chk"))
+            continue;
+
+        format = read_one_check_format(pcd, groupname, dirname, filename);
+        if (NULL == format)
+            continue;
+
+        existing = find_existing_format(store, format->guid, NULL);
+        if (existing) {
+            dialog = gtk_message_dialog_new
+                (GTK_WINDOW(pcd->dialog),
+                 GTK_DIALOG_DESTROY_WITH_PARENT,
+                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+                 _("There is a duplicate check format file."));
+            gtk_message_dialog_format_secondary_text
+                (GTK_MESSAGE_DIALOG(dialog),
+                 _("The guids in the %s check format file '%s' and "
+                   "the %s check format file '%s' match."),
+                 existing->group, existing->filename,
+                 format->group, format->filename);
+            gtk_dialog_run(GTK_DIALOG(dialog));
+            gtk_widget_destroy(dialog);
+        } else {
+            gtk_list_store_append(store, &iter);
+            gtk_list_store_set(store, &iter, COL_NAME, format->title,
+                               COL_DATA, format, -1);
+            found = TRUE;
         }
-        g_dir_close(dir);
     }
+    g_dir_close(dir);
+
+    /* If any files were added to the list, add a separator between
+     *  this group and the next. */
+    if (found) {
+        gtk_list_store_append(store, &iter);
+        gtk_list_store_set(store, &iter, COL_SEP, TRUE, -1);
+    }
 }
 
 
@@ -954,22 +1091,32 @@
  *  for check files, and then looks in the user's .gnucash directory for any
  *  custom check files. */
 static void
-read_formats(PrintCheckDialog * pcd)
+read_formats(PrintCheckDialog * pcd, GtkListStore *store)
 {
     gchar *dirname, *pkgdatadir;
 
     pkgdatadir = gnc_path_get_pkgdatadir();
     dirname = g_build_filename(pkgdatadir, CHECK_FMT_DIR, (char *)NULL);
-    read_one_check_directory(pcd, dirname);
+    read_one_check_directory(pcd, store, _("application"), dirname);
     g_free(dirname);
     g_free(pkgdatadir);
 
     dirname = gnc_build_dotgnucash_path(CHECK_FMT_DIR);
-    read_one_check_directory(pcd, dirname);
+    read_one_check_directory(pcd, store, _("user"), dirname);
     g_free(dirname);
 }
 
 
+static gboolean
+format_is_a_separator (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
+{
+    gboolean separator;
+
+    gtk_tree_model_get(model, iter, COL_SEP, &separator, -1);
+    return separator;
+}
+
+
 /********************************************************************\
  * gnc_ui_print_check_dialog_create
  * make a new print check dialog and wait for it.
@@ -983,8 +1130,8 @@
   GladeXML *xml;
   GtkWidget *table;
   GtkWindow *window;
-  GSList *elem;
   GtkListStore *store;
+  GtkTreeIter iter;
 
   pcd = g_new0(PrintCheckDialog, 1);
   pcd->plugin_page = plugin_page;
@@ -996,8 +1143,6 @@
   pcd->xml = xml;
   pcd->dialog = glade_xml_get_widget (xml, "Print Check Dialog");
 
-  read_formats(pcd);
-
   /* now pick out the relevant child widgets */
   pcd->format_combobox = glade_xml_get_widget (xml, "check_format_combobox");
   pcd->position_combobox = glade_xml_get_widget (xml, "check_position_combobox");
@@ -1034,15 +1179,15 @@
   gtk_table_attach_defaults(GTK_TABLE(table), pcd->date_format, 1, 3, 2, 7);
 
   /* Update the combo boxes bases on the available check formats */
-  store = gtk_list_store_new (1, G_TYPE_STRING);
+  store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
+  read_formats(pcd, store);
+  gtk_list_store_append(store, &iter);
+  gtk_list_store_set(store, &iter, COL_NAME, _("Custom"), -1);
+  pcd->format_max = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store),NULL);
   gtk_combo_box_set_model(GTK_COMBO_BOX(pcd->format_combobox),
                           GTK_TREE_MODEL(store));
-  for (elem = pcd->formats_list; elem; elem = g_slist_next(elem)) {
-    gtk_combo_box_append_text(GTK_COMBO_BOX(pcd->format_combobox),
-                              ((check_format_t*)elem->data)->title);
-  }
-  gtk_combo_box_append_text(GTK_COMBO_BOX(pcd->format_combobox), _("Custom"));
-  pcd->format_max = g_slist_length(pcd->formats_list); /* -1 for 0 base, +1 for custom entry*/
+  gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(pcd->format_combobox),
+                                       format_is_a_separator, NULL, NULL);
 
 #if USE_GTKPRINT
   gtk_widget_destroy(glade_xml_get_widget (xml, "lower_left"));
@@ -1139,7 +1284,7 @@
     cairo_restore(cr);
     g_object_unref(layout);
 #else
-    gnome_print_gsave(context);
+    gnome_print_grestore(context);
 #endif
 }
 
@@ -1197,9 +1342,30 @@
     g_object_unref(layout);
     return width;
 #else
+    gdouble x0, x1, y0, y1;
+
+    /* Clip text to the enclosing rectangle */
+    gnome_print_gsave(context);
+    if (data->w && data->h) {
+        g_debug("Text clip rectangle, coords %f,%f, size %f,%f",
+                data->x, data->y - data->h, data->w, data->h);
+        x0 = data->x - GNOMEPRINT_CLIP_EXTRA;
+        x1 = data->x + data->w + GNOMEPRINT_CLIP_EXTRA;
+        y0 = data->y - GNOMEPRINT_CLIP_EXTRA;
+        y1 = data->y + data->h + GNOMEPRINT_CLIP_EXTRA;
+        gnome_print_moveto(context, x0, y0);
+        gnome_print_lineto(context, x0, y1);
+        gnome_print_lineto(context, x1, y1);
+        gnome_print_lineto(context, x1, y0);
+        gnome_print_lineto(context, x0, y0);
+        gnome_print_clip(context);
+    }
+
+    /* Draw the text */
     g_debug("Text move to %f,%f, print '%s'", data->x, data->y, text);
     gnome_print_moveto(context, data->x, data->y);
     gnome_print_show(context, text);
+    gnome_print_grestore(context);
     return 0.0;
 #endif
 }
@@ -1480,7 +1646,7 @@
 #endif
 
             default:
-                text = g_strdup_printf("(unknown check field %d)", item->type);
+                text = g_strdup_printf("(unknown check field, type %d)", item->type);
                 draw_text(context, text, item, default_desc);
                 g_free(text);
         }
@@ -1811,25 +1977,31 @@
 gnc_print_check_format_changed (GtkComboBox *widget,
                                 PrintCheckDialog * pcd)
 {
-  GtkListStore *store;
+  GtkListStore *p_store;
+  GtkTreeModel *f_model;
+  GtkTreeIter f_iter;
   gboolean sensitive;
-  gint fnum, pnum;
+  gint pnum;
   check_format_t *format;
+  gboolean separator;
   GSList *elem;
 
-  fnum = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->format_combobox));
-  if (-1 == fnum)
+  if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(pcd->format_combobox), &f_iter))
     return;
+  f_model = gtk_combo_box_get_model(GTK_COMBO_BOX(pcd->format_combobox));
+  gtk_tree_model_get(f_model, &f_iter, COL_DATA, &format, COL_SEP, &separator, -1);
+  if (separator)
+    return;
+
   pnum = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->position_combobox));
 
   /* Update the positions combobox */
-  format = g_slist_nth_data(pcd->formats_list, fnum);
   pcd->selected_format = format;
   g_signal_handlers_block_by_func(pcd->position_combobox,
                                   gnc_print_check_position_changed, pcd);
-  store = gtk_list_store_new (1, G_TYPE_STRING);
+  p_store = gtk_list_store_new (1, G_TYPE_STRING);
   gtk_combo_box_set_model(GTK_COMBO_BOX(pcd->position_combobox),
-                          GTK_TREE_MODEL(store));
+                          GTK_TREE_MODEL(p_store));
   if (format) {
     pcd->position_max = g_slist_length(format->positions); /* -1 for 0 base, +1 for custom entry */
     for (elem = format->positions; elem; elem = g_slist_next(elem)) {
@@ -1849,7 +2021,7 @@
   gtk_widget_set_sensitive(GTK_WIDGET(pcd->position_combobox), sensitive);
   
   /* Update the custom page */
-  sensitive = (fnum == pcd->format_max);
+  sensitive = (!separator && !format);
   gtk_container_foreach(GTK_CONTAINER(pcd->custom_table),
 			gnc_print_check_set_sensitive,
 			GINT_TO_POINTER(sensitive));
@@ -1882,7 +2054,5 @@
 
   gtk_widget_destroy(pcd->dialog);
   g_object_unref(pcd->xml);
-  g_slist_foreach(pcd->formats_list, (GFunc)free_check_format, NULL);
-  g_slist_free(pcd->formats_list);
   g_free(pcd);
 }



More information about the gnucash-changes mailing list