gnucash master: Multiple changes pushed
John Ralls
jralls at code.gnucash.org
Mon Mar 28 03:15:15 EDT 2016
Updated via https://github.com/Gnucash/gnucash/commit/ec768b16 (commit)
via https://github.com/Gnucash/gnucash/commit/455508f9 (commit)
from https://github.com/Gnucash/gnucash/commit/d7112e9f (commit)
commit ec768b160c63728c0fbc9a15d34e6795ff181293
Author: John Ralls <jralls at ceridwen.us>
Date: Mon Mar 28 00:19:04 2016 -0700
Modify the changes from 139e3ea5 to accomodate private-KVP.
diff --git a/src/app-utils/business-options.scm b/src/app-utils/business-options.scm
index a4c1f6d..7e3c22d 100644
--- a/src/app-utils/business-options.scm
+++ b/src/app-utils/business-options.scm
@@ -472,14 +472,13 @@
(let ((option (gnc:make-string-option section name sort-tag documentation-string #f)))
(gnc:option-set-value option default-value)
(gnc:set-option-scm->kvp option
- (lambda (f p)
+ (lambda (b p)
(let ((value ((gnc:option-getter option)))
(path (list "counter_formats" key)))
(if (and (string? value)(not (string-null? value)))
- (kvp-frame-set-slot-path-gslist f value path)
- (gnc-kvp-frame-delete-at-path f path)))))
- (gnc:set-option-kvp->scm option (lambda (f p)
- (let ((v (kvp-frame-get-slot-path-gslist f (list "counter_formats" key))))
+ (qof-book-set-option b value path)))))
+ (gnc:set-option-kvp->scm option (lambda (b p)
+ (let ((v (qof-book-get-option b (list "counter_formats" key))))
(if (and v (string? v))
((gnc:option-setter option) v)))))
option))
commit 455508f92a9b6b721eabd941e18c0b5a2d9825e5
Author: John Ralls <jralls at ceridwen.us>
Date: Mon Mar 28 00:14:55 2016 -0700
Delete dialog-print-check2.c which somehow managed to survive the last merge.
diff --git a/src/gnome/dialog-print-check2.c b/src/gnome/dialog-print-check2.c
deleted file mode 100644
index 0f707fd..0000000
--- a/src/gnome/dialog-print-check2.c
+++ /dev/null
@@ -1,2648 +0,0 @@
-/********************************************************************\
- * dialog-print-check2.c : dialog to control check printing. *
- * Copyright (C) 2000 Bill Gribble <grib at billgribble.com> *
- * Copyright (C) 2006,2007 David Hampton <hampton at employees.org> *
- * *
- * 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 the Free Software Foundation; either version 2 of *
- * the License, or (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact: *
- * *
- * Free Software Foundation Voice: +1-617-542-5942 *
- * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
- * Boston, MA 02110-1301, USA gnu at gnu.org *
-\********************************************************************/
-
-/**
- * @file dialog-print-check2.c
- * @brief Print Checks Dialog
- * @author Copyright (C) 2000 Bill Gribble <grib at billgribble.com>
- * @author Copyright (C) 2006,2007 David Hampton <hampton at employees.org>
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include <stdio.h>
-#include <locale.h>
-#include <math.h>
-
-#include <gnc-gdate-utils.h>
-#include "qof.h"
-#include "gnc-date.h"
-#include "gnc-prefs.h"
-#include "gnc-numeric.h"
-#include "gnc-plugin-page-register2.h"
-#include "dialog-print-check2.h"
-#include "dialog-utils.h"
-#include "print-session.h"
-#include "gnc-ui.h"
-#include "gnc-date-format.h"
-#include "gnc-ui-util.h"
-#include "gnc-path.h"
-#include "gnc-filepath-utils.h"
-#include "gnc-gkeyfile-utils.h"
-
-#include "gnc-engine.h"
-#include "engine-helpers.h"
-#include "Split.h"
-#include "Transaction.h"
-
-#undef G_LOG_DOMAIN
-#define G_LOG_DOMAIN "gnc.printing.checks"
-
-/* This static indicates the debugging module that this .o belongs to.
- */
-G_GNUC_UNUSED static QofLogModule log_module = "gnc.printing.checks";
-
-#define GNC_PREFS_GROUP "dialogs.checkprinting"
-#define GNC_PREF_CHECK_FORMAT_GUID "check-format-guid"
-#define GNC_PREF_CHECK_POSITION "check-position"
-#define GNC_PREF_FIRST_PAGE_COUNT "first-page-count"
-#define GNC_PREF_DATE_FORMAT_USER "date-format-custom"
-#define GNC_PREF_CUSTOM_PAYEE "custom-payee"
-#define GNC_PREF_CUSTOM_DATE "custom-date"
-#define GNC_PREF_CUSTOM_WORDS "custom-amount-words"
-#define GNC_PREF_CUSTOM_NUMBER "custom-amount-number"
-#define GNC_PREF_CUSTOM_ADDRESS "custom-address"
-#define GNC_PREF_CUSTOM_NOTES "custom-notes"
-#define GNC_PREF_CUSTOM_MEMO "custom-memo"
-#define GNC_PREF_CUSTOM_TRANSLATION "custom-translation"
-#define GNC_PREF_CUSTOM_ROTATION "custom-rotation"
-#define GNC_PREF_CUSTOM_UNITS "custom-units"
-#define GNC_PREF_PRINT_DATE_FMT "print-date-format"
-#define GNC_PREF_DEFAULT_FONT "default-font"
-#define GNC_PREF_BLOCKING_CHARS "blocking-chars"
-#define GNC_PREF_SPLITS_AMOUNT "splits-amount"
-#define GNC_PREF_SPLITS_MEMO "splits-memo"
-#define GNC_PREF_SPLITS_ACCOUNT "splits-account"
-
-
-#define DEFAULT_FONT "sans 12"
-#define CHECK_FMT_DIR "checks"
-#define CHECK_NAME_EXTENSION ".chk"
-#define DEGREES_TO_RADIANS (G_PI / 180.0)
-
-#define BLOCKING_CHAR_OFF 0
-#define BLOCKING_CHAR_ON 1
-
-#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"
-#define KF_KEY_FONT "Font"
-#define KF_KEY_ALIGN "Align"
-#define KF_KEY_BLOCKING "Blocking_Chars"
-#define KF_KEY_SHOW_GRID "Show_Grid"
-#define KF_KEY_SHOW_BOXES "Show_Boxes"
-#define KF_KEY_NAMES "Names"
-#define KF_KEY_HEIGHT "Height"
-#define KF_KEY_TYPE "Type"
-#define KF_KEY_COORDS "Coords"
-#define KF_KEY_TEXT "Text"
-#define KF_KEY_FILENAME "Filename"
-#define KF_KEY_DATE_FORMAT "DateFormat"
-#define KF_KEY_SPLITS_AMOUNT "SplitsAmount"
-#define KF_KEY_SPLITS_MEMO "SplitsMemo"
-#define KF_KEY_SPLITS_ACCOUNT "SplitsAccount"
-
-/* 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 entry specifies a separator line. */
-} format_combo_col;
-
-void gnc_ui_print_check_response_cb2 (GtkDialog *dialog, gint response, PrintCheckDialog *pcd);
-void gnc_print_check_format_changed2 (GtkComboBox *widget, PrintCheckDialog *pcd);
-void gnc_print_check_position_changed2 (GtkComboBox *widget, PrintCheckDialog *pcd);
-void gnc_print_check_save_button_clicked2 (GtkButton *button, PrintCheckDialog *pcd);
-void gnc_check_format_title_changed2 (GtkEditable *editable, GtkWidget *ok_button);
-
-static void initialize_format_combobox (PrintCheckDialog *pcd);
-gchar* get_check_address2 (PrintCheckDialog *pcd);
-static gboolean check_format_has_address (PrintCheckDialog *pcd);
-gchar* get_check_splits_amount2 (PrintCheckDialog *pcd);
-gchar* get_check_splits_memo2 (PrintCheckDialog *pcd);
-gchar* get_check_splits_account2 (PrintCheckDialog *pcd);
-
-/* This enum defines the types of items that gnucash knows how to
- * print on checks. Most refer to specific fields from a gnucash
- * transaction and split, but some are generic items unrelated to
- * gnucash.
- */
-#define ENUM_CHECK_ITEM_TYPE(_) \
- _(NONE,) \
- _(PAYEE,) \
- _(DATE,) \
- _(NOTES,) \
- _(CHECK_NUMBER,) \
- \
- _(MEMO,) \
- _(ACTION,) \
- _(AMOUNT_NUMBER,) \
- _(AMOUNT_WORDS,) \
- \
- _(TEXT,) \
- _(ADDRESS,) \
- _(DATE_FORMAT,) \
- _(SPLITS_AMOUNT,) \
- _(SPLITS_MEMO,) \
- _(SPLITS_ACCOUNT,) \
- _(PICTURE,)
-
-DEFINE_ENUM(CheckItemType2, ENUM_CHECK_ITEM_TYPE)
-FROM_STRING_DEC(CheckItemType2, ENUM_CHECK_ITEM_TYPE)
-FROM_STRING_FUNC(CheckItemType2, ENUM_CHECK_ITEM_TYPE)
-AS_STRING_DEC(CheckItemType2, ENUM_CHECK_ITEM_TYPE)
-AS_STRING_FUNC(CheckItemType2, ENUM_CHECK_ITEM_TYPE)
-
-/* This data structure describes a single item printed on a check.
- * It is built from a description in a text file.
- */
-typedef struct _check_item
-{
-
- CheckItemType2 type; /**< What type of item is this? */
-
- gdouble x, y; /**< The x/y coordinates where this item should
- * be printed. The origin for these
- * coordinates is determined by the print
- * system used. */
-
- gdouble w, h; /**< Optional. The width and height of this
- * item. Text will be clipped to this
- * size. Pictures will be shrunk to fit if
- * necessary. */
-
- gchar *filename; /**< The filename for picture items. Otherwise
- * unused. */
-
- gchar *text; /**< The text to be displayed (for text based
- * items.) Otherwise unused. */
-
- gchar *font; /**< The font to use for text based items. This
- * overrides any font in the check format.
- * Unused for non-text items. */
-
- gboolean blocking; /**< Optional. Overrides blocking in the check
- * format. Default is no blocking characters
- * are written. Unused for non-text
- * items. */
-
- gboolean print_date_format; /**< Optional. Print date format. Only
- * applies to DATE items. Default is no
- * format is written. */
-
- PangoAlignment align; /**< The alignment of a text based item. Only
- * used for text based items when a width is
- * specified. */
-} check_item_t;
-
-/* This data structure describes an entire page of checks. Depending
- * upon the check format, the page may contain multiple checks or
- * only a single check. The data structure is built from a
- * 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 in
- * the dialog box. */
-
- gboolean blocking; /**< Default for printing blocking characters for
- * this page of checks. */
-
- gboolean print_date_format; /**< Default for printing date format characters for
- * this page of checks. */
-
- gboolean show_grid; /**< Print a grid pattern on the page */
-
- gboolean show_boxes; /**< Print boxes when width and height are
- * known. */
-
- gdouble rotation; /**< Rotate the entire page by this amount. */
-
- gdouble trans_x; /**< Move entire page left by this amount. */
-
- gdouble trans_y; /**< Move entire page down by this amount. */
-
- gchar *font; /**< Default font for this page of checks. */
-
- gdouble height; /**< Height of one check on a page. */
-
- GSList *positions; /**< Names of the checks on the page. */
-
- GSList *items; /**< List of items printed on each check. */
-} check_format_t;
-
-
-/* This data structure is used to manage the print check dialog, and
- * the overall check printing process. It contains pointers to many
- * of the widgets in the dialog, pointers to the check descriptions
- * that have been read, and also contains the data from the gnucash
- * transaction/split that is to be printed.
- */
-struct _print_check_dialog
-{
- GtkBuilder *builder;
- GtkWidget *dialog;
- GtkWindow *caller_window;
-
- GncPluginPageRegister2 *plugin_page;
- Split *split;
- GList *splits;
-
- GtkWidget *format_combobox;
- gint format_max;
- GtkWidget *position_combobox;
- gint position_max;
- GtkSpinButton *first_page_count;
- GtkWidget *custom_table;
- GtkSpinButton *payee_x, *payee_y;
- GtkSpinButton *date_x, *date_y;
- GtkSpinButton *words_x, *words_y;
- GtkSpinButton *number_x, *number_y;
- GtkSpinButton *address_x, *address_y;
- GtkSpinButton *notes_x, *notes_y;
- GtkSpinButton *memo_x, *memo_y;
- GtkSpinButton *splits_amount_x, *splits_amount_y;
- GtkSpinButton *splits_memo_x, *splits_memo_y;
- GtkSpinButton *splits_account_x, *splits_account_y;
- GtkSpinButton *translation_x, *translation_y;
- GtkSpinButton *check_rotation;
- GtkWidget *translation_label;
-
- GtkWidget *units_combobox;
-
- GtkWidget *date_format;
-
- GtkWidget *check_address_name;
- GtkWidget *check_address_1;
- GtkWidget *check_address_2;
- GtkWidget *check_address_3;
- GtkWidget *check_address_4;
-
- gchar *default_font;
-
- 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 it 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;
-}
-
-
-/* This function returns a string containing the check address in a five-line
- * format.
- *
- * Note that the string needs to be freed with g_free.
- */
-gchar *
-get_check_address2( PrintCheckDialog *pcd)
-{
- gchar *address;
- address = g_strconcat(gtk_entry_get_text(GTK_ENTRY(pcd->check_address_name)), "\n",
- gtk_entry_get_text(GTK_ENTRY(pcd->check_address_1)), "\n",
- gtk_entry_get_text(GTK_ENTRY(pcd->check_address_2)), "\n",
- gtk_entry_get_text(GTK_ENTRY(pcd->check_address_3)), "\n",
- gtk_entry_get_text(GTK_ENTRY(pcd->check_address_4)),
- NULL);
- return address;
-}
-
-
-//@{
-/** @name Split printing functions */
-
-/* This function formats the splits amounts for printing.
- */
-gchar *
-get_check_splits_amount2(PrintCheckDialog *pcd)
-{
- gchar* amount = NULL;
- Transaction *trans;
- GList *node;
- SplitList* s_list;
-
- trans = xaccSplitGetParent(pcd->split);
- s_list = xaccTransGetSplitList(trans);
- if ( !s_list ) return NULL;
-
- amount = g_strconcat("", NULL);
- node = s_list;
- while ( node )
- {
- Split *split = node->data;
- /* Include all splits except the main split for the check */
- if (split != pcd->split)
- {
- const gchar* split_amount;
- gchar* amt_temp;
- split_amount = xaccPrintAmount(xaccSplitGetAmount(split), gnc_split_amount_print_info(split, TRUE));
- amt_temp = amount;
- if (amount && *amount)
- amount = g_strconcat(amt_temp, "\n", split_amount, NULL);
- else
- amount = g_strconcat(amt_temp, split_amount, NULL);
- g_free(amt_temp);
- }
- node = node->next;
- }
- return amount;
-}
-
-
-/* This function formats the splits memo fields for printing.
- */
-gchar *
-get_check_splits_memo2(PrintCheckDialog *pcd)
-{
- gchar* memo = NULL;
- const gchar* split_memo;
- Transaction *trans;
- GList *node;
- SplitList* s_list;
-
- trans = xaccSplitGetParent(pcd->split);
- s_list = xaccTransGetSplitList(trans);
- if ( !s_list ) return NULL;
-
- memo = g_strconcat("", NULL);
- node = s_list;
- while ( node )
- {
- Split *split = node->data;
- /* Include all splits except the main split for the check */
- if (split != pcd->split)
- {
- gchar* memo_temp;
- split_memo = xaccSplitGetMemo(split);
- memo_temp = memo;
- if (memo && *memo)
- memo = g_strconcat(memo_temp, "\n", split_memo, NULL);
- else
- memo = g_strconcat(memo_temp, split_memo, NULL);
- g_free(memo_temp);
- }
- node = node->next;
- }
- return memo;
-}
-
-
-/* This function formats the splits accounts for printing.
- */
-gchar *
-get_check_splits_account2(PrintCheckDialog *pcd)
-{
- gchar* account = NULL;
- Transaction *trans;
- GList *node;
- SplitList* s_list;
-
- trans = xaccSplitGetParent(pcd->split);
- s_list = xaccTransGetSplitList(trans);
- if ( !s_list ) return NULL;
-
- account = g_strconcat("", NULL);
- node = s_list;
- while ( node )
- {
- Split *split = node->data;
- /* Include all splits except the main split for the check */
- if (split != pcd->split)
- {
- gchar* account_temp;
- const gchar* aName = NULL;
- Account *pAccount;
- pAccount = xaccSplitGetAccount(split);
- aName = gnc_get_account_name_for_register(pAccount);
- account_temp = account;
- if (account && *account)
- account = g_strconcat(account_temp, "\n", aName, NULL);
- else
- account = g_strconcat(account_temp, aName, NULL);
- g_free(account_temp);
- }
- node = node->next;
- }
- return account;
-}
-//@}
-
-
-/* This function determines if an address item is present in the check format.
- */
-static gboolean
-check_format_has_address ( PrintCheckDialog *pcd )
-{
- /* check format for an ADDRESS item */
- check_item_t *item = NULL;
- GSList *elem;
- check_format_t *format = NULL;
-
- if ( !pcd ) return FALSE;
-
- /* If we're printing more than one check no addresses are allowed */
- if (g_list_length(pcd->splits) != 1)
- return FALSE;
-
- /* if format is NULL, then the custom format is being used
- * which has an ADDRESS item by definition */
- format = pcd->selected_format;
- if ( !format ) return TRUE;
-
- for (elem = pcd->selected_format->items; elem; elem = g_slist_next(elem))
- {
- item = elem->data;
- if ( item->type == ADDRESS ) return TRUE;
- }
- return FALSE;
-}
-
-
-static void
-gnc_ui_print_save_dialog(PrintCheckDialog *pcd)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- check_format_t *check;
- const gchar *format;
- gint active;
-
- /* Options page */
- 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_prefs_set_string (GNC_PREFS_GROUP, GNC_PREF_CHECK_FORMAT_GUID,
- check ? check->guid : "custom");
- }
- active = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->position_combobox));
- gnc_prefs_set_int(GNC_PREFS_GROUP, GNC_PREF_CHECK_POSITION, active);
- active = gtk_spin_button_get_value_as_int(pcd->first_page_count);
- gnc_prefs_set_int(GNC_PREFS_GROUP, GNC_PREF_FIRST_PAGE_COUNT, active);
- active = gnc_date_format_get_format (GNC_DATE_FORMAT(pcd->date_format));
- gnc_prefs_set_int(GNC_PREFS_GROUP, GNC_PREF_DATE_FORMAT, active);
- if (active == QOF_DATE_FORMAT_CUSTOM)
- {
- format = gnc_date_format_get_custom (GNC_DATE_FORMAT(pcd->date_format));
- gnc_prefs_set_string (GNC_PREFS_GROUP, GNC_PREF_DATE_FORMAT_USER, format);
- }
- else
- {
- gnc_prefs_reset (GNC_PREFS_GROUP, GNC_PREF_DATE_FORMAT_USER);
- }
-
- /* Custom format page */
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_PAYEE,
- gtk_spin_button_get_value(pcd->payee_x),
- gtk_spin_button_get_value(pcd->payee_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_DATE,
- gtk_spin_button_get_value(pcd->date_x),
- gtk_spin_button_get_value(pcd->date_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_WORDS,
- gtk_spin_button_get_value(pcd->words_x),
- gtk_spin_button_get_value(pcd->words_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_NUMBER,
- gtk_spin_button_get_value(pcd->number_x),
- gtk_spin_button_get_value(pcd->number_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_NOTES,
- gtk_spin_button_get_value(pcd->notes_x),
- gtk_spin_button_get_value(pcd->notes_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_MEMO,
- gtk_spin_button_get_value(pcd->memo_x),
- gtk_spin_button_get_value(pcd->memo_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_ADDRESS,
- gtk_spin_button_get_value(pcd->address_x),
- gtk_spin_button_get_value(pcd->address_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_SPLITS_AMOUNT,
- gtk_spin_button_get_value(pcd->splits_amount_x),
- gtk_spin_button_get_value(pcd->splits_amount_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_SPLITS_MEMO,
- gtk_spin_button_get_value(pcd->splits_memo_x),
- gtk_spin_button_get_value(pcd->splits_memo_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_SPLITS_ACCOUNT,
- gtk_spin_button_get_value(pcd->splits_account_x),
- gtk_spin_button_get_value(pcd->splits_account_y));
- gnc_prefs_set_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_TRANSLATION,
- gtk_spin_button_get_value(pcd->translation_x),
- gtk_spin_button_get_value(pcd->translation_y));
- gnc_prefs_set_float(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_ROTATION,
- gtk_spin_button_get_value(pcd->check_rotation));
- active = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->units_combobox));
- gnc_prefs_set_int(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_UNITS, active);
-}
-
-
-static void
-gnc_ui_print_restore_dialog(PrintCheckDialog *pcd)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- gchar *format, *guid;
- gdouble x, y;
- gint active;
-
- /* Options page */
- guid = gnc_prefs_get_string (GNC_PREFS_GROUP, GNC_PREF_CHECK_FORMAT_GUID);
- if (guid == NULL)
- gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), 0);
- 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);
- }
- else
- {
- gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), 0);
- }
- }
- active = gnc_prefs_get_int(GNC_PREFS_GROUP, GNC_PREF_CHECK_POSITION);
-
- /* If the check format used last time no longer exists, then the saved check
- position may be invalid. If so set it to the first position. */
- if (active < 0 || active > pcd->position_max)
- active = 0;
- gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->position_combobox), active);
- active = gnc_prefs_get_int(GNC_PREFS_GROUP, GNC_PREF_FIRST_PAGE_COUNT);
- gtk_spin_button_set_value(pcd->first_page_count, (gdouble) active);
- active = gnc_prefs_get_int(GNC_PREFS_GROUP, GNC_PREF_DATE_FORMAT);
- gnc_date_format_set_format(GNC_DATE_FORMAT(pcd->date_format), active);
- if (active == QOF_DATE_FORMAT_CUSTOM)
- {
- format = gnc_prefs_get_string (GNC_PREFS_GROUP, GNC_PREF_DATE_FORMAT_USER);
- if (format)
- {
- gnc_date_format_set_custom(GNC_DATE_FORMAT(pcd->date_format), format);
- g_free(format);
- }
- }
-
- /* Custom format page */
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_PAYEE, &x, &y);
- gtk_spin_button_set_value(pcd->payee_x, x);
- gtk_spin_button_set_value(pcd->payee_y, y);
-
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_DATE, &x, &y);
- gtk_spin_button_set_value(pcd->date_x, x);
- gtk_spin_button_set_value(pcd->date_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_WORDS, &x, &y);
- gtk_spin_button_set_value(pcd->words_x, x);
- gtk_spin_button_set_value(pcd->words_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_NUMBER, &x, &y);
- gtk_spin_button_set_value(pcd->number_x, x);
- gtk_spin_button_set_value(pcd->number_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_ADDRESS, &x, &y);
- gtk_spin_button_set_value(pcd->address_x, x);
- gtk_spin_button_set_value(pcd->address_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_NOTES, &x, &y);
- gtk_spin_button_set_value(pcd->notes_x, x);
- gtk_spin_button_set_value(pcd->notes_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_MEMO, &x, &y);
- gtk_spin_button_set_value(pcd->memo_x, x);
- gtk_spin_button_set_value(pcd->memo_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_SPLITS_AMOUNT, &x, &y);
- gtk_spin_button_set_value(pcd->splits_amount_x, x);
- gtk_spin_button_set_value(pcd->splits_amount_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_SPLITS_MEMO, &x, &y);
- gtk_spin_button_set_value(pcd->splits_memo_x, x);
- gtk_spin_button_set_value(pcd->splits_memo_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_SPLITS_ACCOUNT, &x, &y);
- gtk_spin_button_set_value(pcd->splits_account_x, x);
- gtk_spin_button_set_value(pcd->splits_account_y, y);
- gnc_prefs_get_coords(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_TRANSLATION, &x, &y);
- gtk_spin_button_set_value(pcd->translation_x, x);
- gtk_spin_button_set_value(pcd->translation_y, y);
- x = gnc_prefs_get_float(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_ROTATION);
- gtk_spin_button_set_value(pcd->check_rotation, x);
- active = gnc_prefs_get_int(GNC_PREFS_GROUP, GNC_PREF_CUSTOM_UNITS);
- gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->units_combobox), active);
-}
-
-
-static gdouble
-pcd_get_custom_multip(PrintCheckDialog *pcd)
-{
- gint selected;
-
- selected = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->units_combobox));
- switch (selected)
- {
- default:
- return 72.0; /* inches */
- case 1:
- return 28.346; /* cm */
- case 2:
- return 2.8346; /* mm */
- case 3:
- return 1.0; /* points */
- }
-}
-
-
-/* This function saves a coordinate pair into a check description file. It
- * extracts the values from the spin buttons, adjusts them according to the
- * unit multiplier (inches, pixels, etc), then adds them to the gKeyFile.
- */
-static void
-pcd_key_file_save_xy (GKeyFile *key_file, const gchar *group_name,
- const gchar *key_name, gdouble multip,
- GtkSpinButton *spin0, GtkSpinButton *spin1)
-{
- gdouble dd[2];
-
- dd[0] = multip * gtk_spin_button_get_value(spin0);
- dd[1] = multip * gtk_spin_button_get_value(spin1);
-
- /* Clip the numbers to three decimal places. */
- dd[0] = round(dd[0] * 1000) / 1000;
- dd[1] = round(dd[1] * 1000) / 1000;
- g_key_file_set_double_list(key_file, group_name, key_name, dd, 2);
-}
-
-
-/* This function saves the information about a single printed item into a
- * check description file. It uses a helper function to extracts and save the
- * item coordinates.
- */
-static void
-pcd_key_file_save_item_xy (GKeyFile *key_file, int index,
- CheckItemType2 type, gdouble multip,
- GtkSpinButton *spin0, GtkSpinButton *spin1)
-{
- gchar *key;
- key = g_strdup_printf("Type_%d", index);
- g_key_file_set_string(key_file, KF_GROUP_ITEMS, key,
- CheckItemType2asString(type));
- g_free(key);
- key = g_strdup_printf("Coords_%d", index);
- pcd_key_file_save_xy(key_file, KF_GROUP_ITEMS, key, multip, spin0, spin1);
- g_free(key);
-}
-
-
-/* This function saves all of the information from the custom check dialog
- * into a check description file.
- */
-static void
-pcd_save_custom_data(PrintCheckDialog *pcd, const gchar *title)
-{
- GKeyFile *key_file;
- GError *error = NULL;
- GtkWidget *dialog;
- gdouble multip;
- gint i = 1;
- GncGUID guid;
- char buf[GUID_ENCODING_LENGTH+1];
- gchar *filename, *pathname;
-
- multip = pcd_get_custom_multip(pcd);
-
- key_file = g_key_file_new();
- guid_replace(&guid);
- guid_to_string_buff(&guid, buf);
- g_key_file_set_string(key_file, KF_GROUP_TOP, KF_KEY_GUID, buf);
- g_key_file_set_string(key_file, KF_GROUP_TOP, KF_KEY_TITLE, title);
- g_key_file_set_boolean(key_file, KF_GROUP_TOP, KF_KEY_SHOW_GRID, FALSE);
- g_key_file_set_boolean(key_file, KF_GROUP_TOP, KF_KEY_SHOW_BOXES, FALSE);
- g_key_file_set_double(key_file, KF_GROUP_TOP, KF_KEY_ROTATION,
- gtk_spin_button_get_value(pcd->check_rotation));
- pcd_key_file_save_xy(key_file, KF_GROUP_TOP, KF_KEY_TRANSLATION, multip,
- pcd->translation_x, pcd->translation_y);
-
- pcd_key_file_save_item_xy(key_file, i++, PAYEE, multip,
- pcd->payee_x, pcd->payee_y);
- pcd_key_file_save_item_xy(key_file, i++, DATE, multip,
- pcd->date_x, pcd->date_y);
- pcd_key_file_save_item_xy(key_file, i++, AMOUNT_WORDS, multip,
- pcd->words_x, pcd->words_y);
- pcd_key_file_save_item_xy(key_file, i++, AMOUNT_NUMBER, multip,
- pcd->number_x, pcd->number_y);
- pcd_key_file_save_item_xy(key_file, i++, ADDRESS, multip,
- pcd->address_x, pcd->address_y);
- pcd_key_file_save_item_xy(key_file, i++, NOTES, multip,
- pcd->notes_x, pcd->notes_y);
- pcd_key_file_save_item_xy(key_file, i++, MEMO, multip,
- pcd->memo_x, pcd->memo_y);
- pcd_key_file_save_item_xy(key_file, i++, SPLITS_AMOUNT, multip,
- pcd->splits_amount_x, pcd->splits_amount_y);
- pcd_key_file_save_item_xy(key_file, i++, SPLITS_MEMO, multip,
- pcd->splits_memo_x, pcd->splits_memo_y);
- pcd_key_file_save_item_xy(key_file, i++, SPLITS_ACCOUNT, multip,
- pcd->splits_account_x, pcd->splits_account_y);
-
- filename = g_strconcat(title, CHECK_NAME_EXTENSION, NULL);
- pathname = g_build_filename(gnc_dotgnucash_dir(), CHECK_FMT_DIR,
- filename, NULL);
-
- if (gnc_key_file_save_to_file(pathname, key_file, &error))
- {
- if (!gnc_prefs_get_bool(GNC_PREFS_GROUP, GNC_PREF_PRINT_DATE_FMT))
- /* Reload the format combo box and reselect the "custom" entry */
- initialize_format_combobox(pcd);
-
- gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox),
- pcd->format_max - 1);
- }
- else
- {
- dialog = gtk_message_dialog_new(GTK_WINDOW(pcd->dialog),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE, "%s",
- _("Cannot save check format file."));
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
- "%s", error->message);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- g_error_free(error);
- }
- g_free(pathname);
- g_free(filename);
-}
-
-
-/* This function makes the OK button active iff a title has been entered.
- */
-void
-gnc_check_format_title_changed2 (GtkEditable *editable, GtkWidget *ok_button)
-{
- const gchar *text;
- gboolean sensitive;
-
- text = gtk_entry_get_text(GTK_ENTRY(editable));
- sensitive = text && *text;
- gtk_widget_set_sensitive(ok_button, sensitive);
-}
-
-
-/* This function is called when the user clicks the "save format" button in
- * the check printing dialog. It presents another dialog to the user to get
- * the filename for saving the data.
- */
-void
-gnc_print_check_save_button_clicked2(GtkButton *unused, PrintCheckDialog *pcd)
-{
- GtkWidget *dialog, *entry, *button;
- GtkBuilder *builder;
- gchar *title;
-
- builder = gtk_builder_new();
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "Format Title Dialog");
-
- /* Get a title for the new check format. */
- dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Format Title Dialog"));
- entry = GTK_WIDGET(gtk_builder_get_object (builder, "format_title"));
- button = GTK_WIDGET(gtk_builder_get_object (builder, "ok_button"));
- gnc_check_format_title_changed2(GTK_EDITABLE(entry), button);
- gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, pcd);
-
- gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(pcd->dialog));
- if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
- {
- gtk_widget_destroy(dialog);
- g_object_unref(G_OBJECT(builder));
- return;
- }
-
- title = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
- gtk_widget_destroy (dialog);
-
- g_object_unref(G_OBJECT(builder));
-
- pcd_save_custom_data(pcd, title);
- g_free(title);
-}
-
-
-/* This function is an auxiliary debugging function for converting an array of
- * doubles into a printable string.
- */
-static gchar *
-doubles_to_string(gdouble *dd, gint len)
-{
- GString *str;
- gint i;
-
- str = g_string_new_len(NULL, 50);
- for (i = 0; i < len; i++)
- g_string_append_printf(str, "%f ", dd[i]);
- return g_string_free(str, FALSE);
-}
-
-
-/* This function reads in the information describing the placement for each
- * item to be printed on a check. This information is all relative to the
- * upper left hand corner of a "check". See the format_read_multicheck_info()
- * function for determining if there are multiple checks on a single page of
- * paper. This data is build into a linked list and saved as part of the check
- * format information. These items will be printed in the same order they are
- * read, meaning that items listed later in the date file can be printed over
- * top of items that appear earlier in the file.
- */
-static GSList *
-format_read_item_placement(const gchar *file,
- GKeyFile *key_file, check_format_t *format)
-{
- check_item_t *data = NULL;
- GError *error = NULL;
- GSList *list = NULL;
- gchar *key, *value, *name;
- int item_num;
- gboolean bval;
- gdouble *dd;
- gsize dd_len;
-
- /* Read until failure. */
- for (item_num = 1;; item_num++)
- {
-
- /* Create the per-item data structure */
- data = g_new0(check_item_t, 1);
- if (NULL == data)
- return list;
-
- /* Get the item type */
- key = g_strdup_printf("%s_%d", KF_KEY_TYPE, item_num);
- value = g_key_file_get_string(key_file, KF_GROUP_ITEMS, key, &error);
- if (error)
- {
- if ((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND))
- {
- /* This is the expected exit from this function. */
- goto cleanup;
- }
- goto failed;
- }
- g_debug("Check file %s, group %s, key %s, value: %s",
- file, KF_GROUP_ITEMS, key, value);
- g_free(key);
-
- /* Convert the type from a string to an enum, ignoring case. */
- name = g_utf8_strup(value, -1);
- data->type = CheckItemType2fromString(name);
- g_free(name);
- g_free(value);
-
-
- /* Get the item location */
- key = g_strdup_printf("%s_%d", KF_KEY_COORDS, item_num);
- dd = g_key_file_get_double_list(key_file, KF_GROUP_ITEMS,
- key, &dd_len, &error);
- if (error)
- goto failed;
- value = doubles_to_string(dd, dd_len);
- g_debug("Check file %s, group %s, key %s, length %"G_GSIZE_FORMAT"; values: %s",
- file, KF_GROUP_ITEMS, key, dd_len, value);
- g_free(value);
-
- /* Must have "x;y" or "x;y;w;h". */
- switch (dd_len)
- {
- case 4:
- data->w = dd[2];
- data->h = dd[3];
- /* fall through */
- case 2:
- data->x = dd[0];
- data->y = dd[1];
- break;
- default:
- g_warning
- ("Check file %s, group %s, key %s, error: 2 or 4 values only",
- file, KF_GROUP_ITEMS, key);
- goto cleanup;
- }
- g_free(dd);
- g_free(key);
-
- /* Any text item can specify:
- * a font FONT_n
- * an alignment if a width was provided for the item ALIGN_n
- * blocking chars flag BLOCKING_CHARS_n
- * These values are optional and do not cause a failure if they are missing. */
-
- if (data->type != PICTURE)
- {
- key = g_strdup_printf("%s_%d", KF_KEY_FONT, item_num);
- data->font =
- g_key_file_get_string(key_file, KF_GROUP_ITEMS, key, &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %s",
- file, KF_GROUP_ITEMS, key, data->font);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_ITEMS, key, error->message);
- g_clear_error(&error);
- }
- g_free(key);
-
- key = g_strdup_printf("%s_%d", KF_KEY_ALIGN, item_num);
- value =
- g_key_file_get_string(key_file, KF_GROUP_ITEMS, key, &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %s",
- file, KF_GROUP_ITEMS, key, value);
- name = g_utf8_strdown(value, -1);
- if (strcmp(name, "right") == 0)
- data->align = PANGO_ALIGN_RIGHT;
- else if (strcmp(name, "center") == 0)
- data->align = PANGO_ALIGN_CENTER;
- else
- data->align = PANGO_ALIGN_LEFT;
- g_free(name);
- g_free(value);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_ITEMS, key, error->message);
- data->align = PANGO_ALIGN_LEFT;
- g_clear_error(&error);
- }
- g_free(key);
-
- key = g_strdup_printf("%s_%d", KF_KEY_BLOCKING, item_num);
- bval =
- g_key_file_get_boolean(key_file, KF_GROUP_ITEMS, key, &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %d",
- file, KF_GROUP_ITEMS, key, bval);
- data->blocking = bval;
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_ITEMS, key, error->message);
- data->blocking = format->blocking;
- g_clear_error(&error);
- }
- g_free(key);
- }
- /* Get any extra data for specific items. */
- switch (data->type)
- {
- case PICTURE:
- key = g_strdup_printf("%s_%d", KF_KEY_FILENAME, item_num);
- data->filename =
- g_key_file_get_string(key_file, KF_GROUP_ITEMS, key,
- &error);
- if (error)
- goto failed;
- g_debug("Check file %s, group %s, key %s, value: %s",
- file, KF_GROUP_ITEMS, key, data->filename);
- g_free(key);
- break;
- case TEXT:
- key = g_strdup_printf("%s_%d", KF_KEY_TEXT, item_num);
- data->text =
- g_key_file_get_string(key_file, KF_GROUP_ITEMS, key,
- &error);
- if (error)
- goto failed;
- g_debug("Check file %s, group %s, key %s, value: %s",
- file, KF_GROUP_ITEMS, key, data->text);
- g_free(key);
- break;
- case DATE:
- /* no error if the date_format is not present */
- key = g_strdup_printf("%s_%d", KF_KEY_DATE_FORMAT, item_num);
- bval = g_key_file_get_boolean(key_file, KF_GROUP_ITEMS, key, &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %d",
- file, KF_GROUP_ITEMS, key, bval);
- data->print_date_format = bval;
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_ITEMS, key, error->message);
- data->print_date_format = format->print_date_format;
- g_clear_error(&error);
- }
- g_free(key);
- break;
- default:
- break;
- }
-
- list = g_slist_append(list, data);
- data = NULL;
- }
-
- /* Should never be reached. */
- return list;
-
-failed:
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_ITEMS, key, error->message);
-cleanup:
- if (error)
- g_error_free(error);
- if (data)
- g_free(data);
- if (key)
- g_free(key);
- return list;
-}
-
-
-/* Free the data describing the placement of a single item on a check.
- */
-static void
-format_free_item_placement(check_item_t *data)
-{
- if (data->font)
- g_free(data->font);
- if (data->text)
- g_free(data->text);
- if (data->filename)
- g_free(data->filename);
- g_free(data);
-}
-
-
-/* Read the information describing whether a page contains multiple checks or
- * a single check. If there are multiple checks on a page, this functions
- * builds a linked list of the position names and their offsets (from the
- * upper left corner of the page).
- */
-static GSList *
-format_read_multicheck_info(const gchar *file,
- GKeyFile *key_file, check_format_t *format)
-{
- GError *error = NULL;
- GSList *list = NULL;
- gchar *key, **names;
- gsize length;
- gint i;
-
- key = g_strdup_printf("%s", KF_KEY_HEIGHT);
- format->height = g_key_file_get_double(key_file, KF_GROUP_POS, key, &error);
- if (error)
- {
- if ((error->domain == G_KEY_FILE_ERROR)
- && ((error->code == G_KEY_FILE_ERROR_GROUP_NOT_FOUND)
- || (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- {
- g_clear_error(&error);
- format->height = 0.0;
- }
- else
- {
- g_warning("Check file %s, error reading group %s, key %s: %s",
- file, KF_GROUP_POS, key, error->message);
- g_free(key);
- return NULL;
- }
- }
-
- names = g_key_file_get_string_list(key_file, KF_GROUP_POS, KF_KEY_NAMES,
- &length, &error);
- if (error)
- {
- if ((error->domain == G_KEY_FILE_ERROR)
- && ((error->code == G_KEY_FILE_ERROR_GROUP_NOT_FOUND)
- || (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- {
- /* This is the expected exit from this function. */
- g_free(key);
- return NULL;
- }
- g_warning("Check file %s, error reading group %s, key %s: %s",
- file, KF_GROUP_POS, key, error->message);
- g_free(key);
- return list;
- }
-
- for (i = 0; i < length; i++)
- list = g_slist_append(list, g_strdup(names[i]));
-
- g_strfreev(names);
- return list;
-}
-
-
-/* Free the data describing the placement of multiple checks on a page.
- */
-static void
-free_check_position(gchar *name)
-{
- g_free(name);
-}
-
-
-/* Read the information describing the general layout of a page of checks.
- * All items in this section are optional except or the name of the check
- * style.
- */
-static gboolean
-format_read_general_info(const gchar *file,
- 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)
- {
- g_debug("Check file %s, group %s, key %s, value: %s",
- file, KF_GROUP_TOP, KF_KEY_TITLE, format->title);
- }
- else
- {
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_TOP, KF_KEY_TITLE, error->message);
- return FALSE;
- }
-
- format->blocking =
- g_key_file_get_boolean(key_file, KF_GROUP_TOP, KF_KEY_BLOCKING,
- &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %d",
- file, KF_GROUP_TOP, KF_KEY_BLOCKING, format->blocking);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_TOP, KF_KEY_BLOCKING, error->message);
- if ( gnc_prefs_get_bool(GNC_PREFS_GROUP, GNC_PREF_BLOCKING_CHARS) )
- {
- format->blocking = TRUE;
- }
- else
- {
- format->blocking = FALSE;
- }
- g_clear_error(&error);
- }
-
- format->print_date_format =
- g_key_file_get_boolean(key_file, KF_GROUP_TOP, KF_KEY_DATE_FORMAT,
- &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %d",
- file, KF_GROUP_TOP, KF_KEY_DATE_FORMAT, format->print_date_format);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_TOP, KF_KEY_DATE_FORMAT, error->message);
- if ( gnc_prefs_get_bool(GNC_PREFS_GROUP, GNC_PREF_PRINT_DATE_FMT) )
- {
- format->print_date_format = TRUE;
- }
- else
- {
- format->print_date_format = FALSE;
- }
- g_clear_error(&error);
- }
-
- format->show_grid =
- g_key_file_get_boolean(key_file, KF_GROUP_TOP, KF_KEY_SHOW_GRID,
- &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %d",
- file, KF_GROUP_TOP, KF_KEY_SHOW_GRID, format->show_grid);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_TOP, KF_KEY_SHOW_GRID, error->message);
- format->show_grid = FALSE;
- g_clear_error(&error);
- }
-
- format->show_boxes =
- g_key_file_get_boolean(key_file, KF_GROUP_TOP, KF_KEY_SHOW_BOXES,
- &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %d",
- file, KF_GROUP_TOP, KF_KEY_SHOW_BOXES, format->show_boxes);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_TOP, KF_KEY_SHOW_BOXES, error->message);
- format->show_boxes = FALSE;
- g_clear_error(&error);
- }
-
- format->font =
- g_key_file_get_string(key_file, KF_GROUP_TOP, KF_KEY_FONT, &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %s",
- file, KF_GROUP_TOP, KF_KEY_FONT, format->font);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_TOP, KF_KEY_FONT, error->message);
- g_clear_error(&error);
- }
-
- format->rotation =
- g_key_file_get_double(key_file, KF_GROUP_TOP, KF_KEY_ROTATION, &error);
- if (!error)
- {
- g_debug("Check file %s, group %s, key %s, value: %f",
- file, KF_GROUP_TOP, KF_KEY_ROTATION, format->rotation);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group %s, key %s, error: %s",
- file, KF_GROUP_TOP, KF_KEY_ROTATION, error->message);
- format->rotation = 0.0;
- g_clear_error(&error);
- }
-
- dd = g_key_file_get_double_list(key_file, KF_GROUP_TOP, KF_KEY_TRANSLATION,
- &dd_len, &error);
- if (!error)
- {
- value = doubles_to_string(dd, dd_len);
- g_debug("Check file %s, group %s, key %s, length %"G_GSIZE_FORMAT"; values: %s",
- file, KF_GROUP_TOP, KF_KEY_TRANSLATION, dd_len, value);
- g_free(value);
-
- if (dd_len == 2)
- {
- format->trans_x = dd[0];
- format->trans_y = dd[1];
- }
- else
- {
- g_warning("Check file %s, error top %s, key %s: 2 values only",
- file, KF_GROUP_TOP, KF_KEY_TRANSLATION);
- }
- g_free(dd);
- }
- else
- {
- if (!((error->domain == G_KEY_FILE_ERROR)
- && (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)))
- g_warning("Check file %s, group top %s, key %s: %s",
- file, KF_GROUP_ITEMS, KF_KEY_TRANSLATION, error->message);
- g_clear_error(&error);
- }
-
- return TRUE;
-}
-
-
-/* Free all of the information describing a page of checks.
- */
-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);
- g_slist_free(data->positions);
- g_slist_foreach(data->items, (GFunc) format_free_item_placement, NULL);
- g_slist_free(data->items);
- g_free(data);
-}
-
-
-/* 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 check_format_t *
-read_one_check_format(PrintCheckDialog *pcd, const gchar *groupname,
- const gchar *dirname, const gchar *file)
-{
- gchar *pathname;
- GKeyFile *key_file;
- check_format_t *format;
-
- pathname = g_build_filename(dirname, file, (char *)NULL);
- key_file = gnc_key_file_load_from_file(pathname, FALSE, FALSE, NULL);
- g_free(pathname);
- if (!key_file)
- {
- g_warning("Check file %s, cannot load file", file);
- 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);
- }
-
- g_key_file_free(key_file);
- if ((NULL == format->title) || (NULL == format->items))
- {
- g_warning("Check file %s, no items read. Dropping file.", file);
- free_check_format(format);
- return NULL;
- }
-
- return format;
-}
-
-
-/* Iterate over a single check directory, throwing out any backup files and
- * then calling a helper function to read and parse the check format withing
- * the file.
- */
-static void
-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 == 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, "%s",
- _("There is a duplicate check format file."));
- gtk_message_dialog_format_secondary_text
- (GTK_MESSAGE_DIALOG(dialog),
- /* Translators: %1$s is the type of the first check
- * format (user defined or application defined); %2$s
- * is the filename of that format; %3$s the type of
- * the other check format; and %4$s the filename of
- * that other format. */
- _("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);
-
- /* 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);
- }
-}
-
-
-/* Read all check formats. This function first looks in the system directory
- * for check files, and then looks in the user's .gnucash directory for any
- * custom check files.
- */
-static void
-read_formats(PrintCheckDialog *pcd, GtkListStore *store)
-{
- gchar *dirname, *pkgdatadir;
-
- pkgdatadir = gnc_path_get_pkgdatadir();
- dirname = g_build_filename(pkgdatadir, CHECK_FMT_DIR, (char *)NULL);
- /* Translators: This is a directory name. It may be presented to
- * the user to indicate that some data file was defined by the
- * gnucash application. */
- read_one_check_directory(pcd, store, _("application"), dirname);
- g_free(dirname);
- g_free(pkgdatadir);
-
- dirname = gnc_build_dotgnucash_path(CHECK_FMT_DIR);
- /* Translators: This is a directory name. It may be presented to
- * the user to indicate that some data file was defined by a
- * user herself. */
- 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;
-}
-
-
-static void
-initialize_format_combobox (PrintCheckDialog *pcd)
-{
- GtkListStore *store;
- GtkTreeIter iter;
-
- 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));
- gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(pcd->format_combobox),
- format_is_a_separator, NULL, NULL);
-}
-
-
-/*****************************************************
- * gnc_ui_print_check_dialog_create2 *
- * make a new print check dialog and wait for it. *
- *****************************************************/
-void
-gnc_ui_print_check_dialog_create2(GncPluginPageRegister2 *plugin_page,
- GList *splits)
-{
- PrintCheckDialog *pcd;
- GtkBuilder *builder;
- GtkWidget *table;
- GtkWindow *window;
- gchar *font;
- Transaction *trans = NULL;
-
- pcd = g_new0(PrintCheckDialog, 1);
- pcd->plugin_page = plugin_page;
- pcd->splits = g_list_copy(splits);
-
- builder = gtk_builder_new();
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment1");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment2");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment3");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment4");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment5");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment6");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment7");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment8");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment9");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment10");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment11");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment12");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment13");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment14");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment15");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment16");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment17");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment18");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment19");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment20");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment21");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment22");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment23");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "adjustment24");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "liststore1");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "liststore2");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "liststore3");
- gnc_builder_add_from_file (builder, "dialog-print-check.glade", "Print Check Dialog");
-
- gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, pcd);
-
- pcd->builder = builder;
- pcd->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Print Check Dialog"));
-
- /* now pick out the relevant child widgets */
- pcd->format_combobox = GTK_WIDGET(gtk_builder_get_object (builder, "check_format_combobox"));
- pcd->position_combobox = GTK_WIDGET(gtk_builder_get_object (builder, "check_position_combobox"));
- pcd->first_page_count = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "first_page_count_entry"));
-
- pcd->custom_table = GTK_WIDGET(gtk_builder_get_object (builder, "custom_table"));
- pcd->payee_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "payee_x_entry"));
- pcd->payee_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "payee_y_entry"));
- pcd->date_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "date_x_entry"));
- pcd->date_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "date_y_entry"));
- pcd->words_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "amount_words_x_entry"));
- pcd->words_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "amount_words_y_entry"));
- pcd->number_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "amount_numbers_x_entry"));
- pcd->number_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "amount_numbers_y_entry"));
- pcd->notes_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "notes_x_entry"));
- pcd->notes_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "notes_y_entry"));
- pcd->memo_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "memo_x_entry"));
- pcd->memo_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "memo_y_entry"));
- pcd->address_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "address_x_entry"));
- pcd->address_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "address_y_entry"));
- pcd->splits_amount_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "splits_amount_x_entry"));
- pcd->splits_amount_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "splits_amount_y_entry"));
- pcd->splits_memo_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "splits_memo_x_entry"));
- pcd->splits_memo_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "splits_memo_y_entry"));
- pcd->splits_account_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "splits_account_x_entry"));
- pcd->splits_account_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "splits_account_y_entry"));
- pcd->translation_x = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "translation_x_entry"));
- pcd->translation_y = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "translation_y_entry"));
- pcd->translation_label = GTK_WIDGET(gtk_builder_get_object (builder, "translation_label"));
- pcd->check_rotation = GTK_SPIN_BUTTON(gtk_builder_get_object (builder, "check_rotation_entry"));
- pcd->units_combobox = GTK_WIDGET(gtk_builder_get_object (builder, "units_combobox"));
-
- window = GTK_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window);
- gtk_window_set_transient_for(GTK_WINDOW(pcd->dialog), window);
- pcd->caller_window = GTK_WINDOW(window);
-
- /* Create and attach the date-format chooser */
- table = GTK_WIDGET(gtk_builder_get_object (builder, "options_table"));
- pcd->date_format = gnc_date_format_new_without_label();
- gtk_table_attach_defaults(GTK_TABLE(table), pcd->date_format, 1, 3, 4, 7);
-
- /* Default font (set in preferences) */
- font = gnc_prefs_get_string(GNC_PREFS_GROUP, GNC_PREF_DEFAULT_FONT);
- pcd->default_font = font ? font : g_strdup(DEFAULT_FONT);
-
- /* Update the combo boxes bases on the available check formats */
- initialize_format_combobox(pcd);
-
- /* address */
- pcd->check_address_name = GTK_WIDGET(gtk_builder_get_object (builder, "check_address_name"));
- pcd->check_address_1 = GTK_WIDGET(gtk_builder_get_object (builder, "check_address_1"));
- pcd->check_address_2 = GTK_WIDGET(gtk_builder_get_object (builder, "check_address_2"));
- pcd->check_address_3 = GTK_WIDGET(gtk_builder_get_object (builder, "check_address_3"));
- pcd->check_address_4 = GTK_WIDGET(gtk_builder_get_object (builder, "check_address_4"));
- /* fill in any available address data */
- /* Can't access business objects e.g. Customer,Vendor,Employee because
- * it would create build problems */
- if (g_list_length(pcd->splits) == 1)
- trans = xaccSplitGetParent((Split *)(pcd->splits->data));
- else
- trans = NULL;
- if ( trans )
- {
- gtk_entry_set_text(GTK_ENTRY(pcd->check_address_name), xaccTransGetDescription(trans));
- }
- else
- {
- /* nothing to do - defaults to blank */
- }
-
- gtk_widget_destroy(GTK_WIDGET(gtk_builder_get_object (builder, "lower_left")));
-
- gnc_ui_print_restore_dialog(pcd);
- gnc_restore_window_size(GNC_PREFS_GROUP, GTK_WINDOW(pcd->dialog));
-
- g_object_unref(G_OBJECT(builder));
- gtk_widget_show_all(pcd->dialog);
-}
-
-
-/**************************************
- * Print check contents to the page. *
- **************************************/
-
-/* Draw a grid pattern on the page to be printed. This grid is helpful when
- * figuring out the offsets for where to print various items on the page.
- */
-static void
-draw_grid(GtkPrintContext *context, gint width, gint height, const gchar *font)
-{
- const double dash_pattern[2] = { 1.0, 5.0 };
- PangoFontDescription *desc;
- PangoLayout *layout;
- cairo_t *cr;
- gchar *text;
- gint i;
-
- /* Initialize for printing text */
- layout = gtk_print_context_create_pango_layout(context);
- desc = pango_font_description_from_string(font);
- pango_layout_set_font_description(layout, desc);
- pango_font_description_free(desc);
- pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
- pango_layout_set_width(layout, -1);
-
- /* Set up the line to draw with. */
- cr = gtk_print_context_get_cairo_context(context);
- cairo_save(cr);
- cairo_set_line_width(cr, 1.0);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
- cairo_set_dash(cr, dash_pattern, 2, 0);
-
- /* Draw horizontal lines */
- for (i = -200; i < (height + 200); i += 50)
- {
- text = g_strdup_printf("%d", (int)i);
- cairo_move_to(cr, -200, i);
- cairo_line_to(cr, width + 200, i);
- cairo_stroke(cr);
- pango_layout_set_text(layout, text, -1);
- cairo_move_to(cr, 0, i);
- pango_cairo_show_layout(cr, layout);
- g_free(text);
- }
-
- /* Draw vertical lines */
- for (i = -200; i < (width + 200); i += 50)
- {
- text = g_strdup_printf("%d", (int)i);
- cairo_move_to(cr, i, -200);
- cairo_line_to(cr, i, height + 200);
- cairo_stroke(cr);
- pango_layout_set_text(layout, text, -1);
- cairo_move_to(cr, i, 0);
- pango_cairo_show_layout(cr, layout);
- g_free(text);
- }
-
- /* Clean up after ourselves */
- cairo_restore(cr);
- g_object_unref(layout);
-}
-
-
-/* Print a single line of text to the printed page. If a width and height
- * are specified, the line will be wrapped at the specified width, and the
- * resulting text will be clipped if it does not fit in the space
- * available.
- */
-static gdouble
-draw_text(GtkPrintContext *context, const gchar *text, check_item_t *data,
- PangoFontDescription *default_desc)
-{
- PangoFontDescription *desc;
- PangoLayout *layout;
- cairo_t *cr;
- gint layout_height, layout_width;
- gdouble width, height;
- gchar *new_text;
-
- if ((NULL == text) || (strlen(text) == 0))
- return 0.0;
-
- /* Initialize for printing text */
- layout = gtk_print_context_create_pango_layout(context);
- if (data->font)
- {
- desc = pango_font_description_from_string(data->font);
- pango_layout_set_font_description(layout, desc);
- pango_font_description_free(desc);
- }
- else
- {
- pango_layout_set_font_description(layout, default_desc);
- }
- pango_layout_set_alignment(layout,
- data->w ? data->align : PANGO_ALIGN_LEFT);
- pango_layout_set_width(layout, data->w ? data->w * PANGO_SCALE : -1);
- pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
- if ( data->blocking )
- {
- new_text = g_strdup_printf("***%s***", text);
- pango_layout_set_text(layout, new_text, -1);
- g_free(new_text);
- }
- else
- {
- pango_layout_set_text(layout, text, -1);
- }
- pango_layout_get_size(layout, &layout_width, &layout_height);
- width = (gdouble) layout_width / PANGO_SCALE;
- height = (gdouble) layout_height / PANGO_SCALE;
-
- cr = gtk_print_context_get_cairo_context(context);
- cairo_save(cr);
-
- /* Clip text to the enclosing rectangle */
- 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);
- cairo_rectangle(cr, data->x, data->y - data->h, data->w, data->h);
- cairo_clip_preserve(cr);
- }
-
- /* Draw the text */
- g_debug("Text move to %f,%f, print '%s'", data->x, data->y,
- text ? text : "(null)");
- cairo_move_to(cr, data->x, data->y - height);
- pango_cairo_show_layout(cr, layout);
-
- /* Clean up after ourselves */
- cairo_restore(cr);
- g_object_unref(layout);
- return width;
-
-}
-
-
-/* Find and load the specified image. If the specified filename isn't an
- * absolute path name, this code will also look in the gnucash system check
- * format directory, and then in the user's private check format
- * directory.
- *
- * NOTE: The gtk_image_new_from_file() function never fails. If it can't
- * find the specified file, it returns the "broken image" icon. This function
- * takes advantage of that.
-*/
-static GtkWidget *
-read_image (const gchar *filename)
-{
- GtkWidget *image;
- gchar *pkgdatadir, *dirname, *tmp_name;
-
- if (g_path_is_absolute(filename))
- return gtk_image_new_from_file(filename);
-
- pkgdatadir = gnc_path_get_pkgdatadir();
- tmp_name = g_build_filename(pkgdatadir, CHECK_FMT_DIR, filename, (char *)NULL);
- if (!g_file_test(tmp_name, G_FILE_TEST_EXISTS))
- {
- g_free(tmp_name);
- dirname = gnc_build_dotgnucash_path(CHECK_FMT_DIR);
- tmp_name = g_build_filename(dirname, filename, (char *)NULL);
- g_free(dirname);
- }
- image = gtk_image_new_from_file(tmp_name);
- g_free(tmp_name);
- return image;
-}
-
-
-/* Print a single image to the printed page. This picture will be scaled
- * down to fit in the specified size rectangle. Scaling is done with the
- * proportions locked 1:1 so as not to distort the image.
- */
-static void
-draw_picture(GtkPrintContext *context, check_item_t *data)
-{
- cairo_t *cr;
- GdkPixbuf *pixbuf, *scaled_pixbuf;
- GtkImage *image;
- gint pix_w, pix_h;
- gdouble scale_w, scale_h, scale;
-
- cr = gtk_print_context_get_cairo_context(context);
- cairo_save(cr);
-
- /* Get the picture. */
- image = GTK_IMAGE(read_image(data->filename));
- pixbuf = gtk_image_get_pixbuf(image);
- if (pixbuf)
- {
- g_object_ref(pixbuf);
- }
- else
- {
- g_warning("Filename '%s' cannot be read or understood.",
- data->filename);
- pixbuf = gtk_widget_render_icon(GTK_WIDGET(image),
- GTK_STOCK_MISSING_IMAGE,
- -1, NULL);
- }
- pix_w = gdk_pixbuf_get_width(pixbuf);
- pix_h = gdk_pixbuf_get_height(pixbuf);
-
- /* Draw the enclosing rectangle */
- if (data->w && data->h)
- {
- cairo_rectangle(cr, data->x, data->y - data->h, data->w, data->h);
- g_debug("Picture clip rectangle, user coords %f,%f, user size %f,%f",
- data->x, data->y - data->h, data->w, data->h);
- }
- else
- {
- cairo_rectangle(cr, data->x, data->y - pix_h, pix_w, pix_h);
- g_debug("Picture clip rectangle, user coords %f,%f, pic size %d,%d",
- data->x, data->y - data->h, pix_w, pix_h);
- }
- cairo_clip_preserve(cr);
-
- /* Scale down to fit. Never scale up. */
- scale_w = scale_h = 1;
- if (data->w && (pix_w > data->w))
- scale_w = data->w / pix_w;
- if (data->h && (pix_h > data->h))
- scale_h = data->h / pix_h;
- scale = MIN(scale_w, scale_h);
-
- if (scale != 1)
- {
- scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, pix_w * scale,
- pix_h * scale,
- GDK_INTERP_BILINEAR);
- pix_h = gdk_pixbuf_get_height(scaled_pixbuf);
- gdk_cairo_set_source_pixbuf(cr, scaled_pixbuf, data->x,
- data->y - pix_h);
-
- g_object_unref(scaled_pixbuf);
- }
- else
- {
- gdk_cairo_set_source_pixbuf(cr, pixbuf, data->x, data->y - pix_h);
- }
- g_object_unref(pixbuf);
- cairo_paint(cr);
-
- /* Clean up after ourselves */
- cairo_restore(cr);
- gtk_widget_destroy(GTK_WIDGET(image));
-}
-
-
-#define DATE_FMT_HEIGHT 8
-#define DATE_FMT_SLOP 2
-
-/* There is a new Canadian requirement that all software that prints the date
- * on a check must also print the format of that date underneath using a 6-8
- * point font. This function implements that requirement. It requires the
- * font description used in printing the date so that it can print in the same
- * font using a smaller point size. It also requires width of the printed
- * date as an argument, allowing it to center the format string under the
- * date.
- *
- * Note: This code only prints a date if the user has explicitly requested it
- * via a preference setting. This is because gnucash has no way of
- * knowing if the user's checks already have a date format printed on them.
- */
-static void
-draw_date_format(GtkPrintContext *context, const gchar *date_format,
- check_item_t *data, PangoFontDescription *default_desc,
- gdouble width)
-{
- PangoFontDescription *date_desc;
- check_item_t date_item;
- gchar *text = NULL, *expanded = NULL;
- const gchar *c;
- GString *cdn_fmt;
-
- setlocale(LC_ALL, NULL);
- if ( !data->print_date_format ) return;
-
- date_desc = pango_font_description_copy_static(default_desc);
- pango_font_description_set_size(date_desc, DATE_FMT_HEIGHT * PANGO_SCALE);
- date_item = *data;
- date_item.y += (DATE_FMT_HEIGHT + DATE_FMT_SLOP);
- date_item.w = width;
- date_item.h = DATE_FMT_HEIGHT + DATE_FMT_SLOP;
- date_item.align = PANGO_ALIGN_CENTER;
-
- /* This is a date format string. It should only contain ascii. */
- cdn_fmt = g_string_new_len(NULL, 50);
- for (c = date_format; c && *c; )
- {
- if ((c[0] != '%') || (c[1] == '\0'))
- {
- c += 1;
- continue;
- }
- switch (c[1])
- {
- case 'F':
- cdn_fmt = g_string_append(cdn_fmt, "YYYYMMDD");
- break;
- case 'Y':
- cdn_fmt = g_string_append(cdn_fmt, "YYYY");
- break;
- case 'y':
- cdn_fmt = g_string_append(cdn_fmt, "YY");
- break;
- case 'm':
- cdn_fmt = g_string_append(cdn_fmt, "MM");
- break;
- case 'd':
- case 'e':
- cdn_fmt = g_string_append(cdn_fmt, "DD");
- break;
- case 'x':
- expanded = g_strdup_printf("%s%s",
- qof_date_format_get_string(QOF_DATE_FORMAT_LOCALE),
- c + 2);
- c = expanded;
- continue;
- default:
- break;
- }
- c += 2;
- }
-
- text = g_string_free(cdn_fmt, FALSE);
- draw_text(context, text, &date_item, date_desc);
- g_free(text);
- if (expanded)
- g_free(expanded);
- pango_font_description_free(date_desc);
-}
-
-
-/* Print each of the items that in the description of a single check. This
- * function uses helper functions to print text based and picture based items.
- */
-static void
-draw_page_items(GtkPrintContext *context,
- check_format_t *format, gpointer user_data)
-{
- PrintCheckDialog *pcd = (PrintCheckDialog *) user_data;
- PangoFontDescription *default_desc;
- Transaction *trans;
- gnc_numeric amount;
- GNCPrintAmountInfo info;
- const gchar *date_format;
- gchar *text = NULL, buf[100];
- GSList *elem;
- check_item_t *item;
- gdouble width;
- gchar *address = NULL;
-
- trans = xaccSplitGetParent(pcd->split);
- /* This was valid when the check printing dialog was instantiated. */
- g_return_if_fail(trans);
- amount = gnc_numeric_abs(xaccSplitGetAmount(pcd->split));
-
- if (format->font)
- default_desc = pango_font_description_from_string(format->font);
- else
- default_desc = pango_font_description_from_string(pcd->default_font);
-
- /* Now put the actual data onto the page. */
- for (elem = format->items; elem; elem = g_slist_next(elem))
- {
- item = elem->data;
-
- switch (item->type)
- {
- case DATE:
- {
- GDate date;
- g_date_clear (&date, 1);
- gnc_gdate_set_time64 (&date, xaccTransGetDate(trans));
- date_format =
- gnc_date_format_get_custom(GNC_DATE_FORMAT
- (pcd->date_format));
- g_date_strftime(buf, 100, date_format, &date);
- width = draw_text(context, buf, item, default_desc);
- draw_date_format(context, date_format, item, default_desc, width);
- break;
- }
-
- case PAYEE:
- draw_text(context, xaccTransGetDescription(trans), item, default_desc);
- break;
-
- case NOTES:
- draw_text(context, xaccTransGetNotes(trans), item, default_desc);
- break;
-
- case MEMO:
- draw_text(context, xaccSplitGetMemo(pcd->split), item, default_desc);
- break;
-
- case ACTION:
- draw_text(context, gnc_get_action_num(trans, pcd->split), item,
- default_desc);
- break;
-
- case CHECK_NUMBER:
- draw_text(context, gnc_get_num_action(trans, pcd->split), item,
- default_desc);
- break;
-
- case AMOUNT_NUMBER:
- info = gnc_default_print_info(FALSE);
- draw_text(context, xaccPrintAmount(amount, info),
- item, default_desc);
- break;
-
- case AMOUNT_WORDS:
- text = numeric_to_words(amount);
- draw_text(context, text, item, default_desc);
- g_free(text);
- break;
-
- case TEXT:
- draw_text(context, item->text, item, default_desc);
- break;
-
- case ADDRESS:
- address = get_check_address2(pcd);
- draw_text(context, address, item, default_desc);
- g_free(address);
- break;
-
- case SPLITS_AMOUNT:
- text = get_check_splits_amount2(pcd);
- draw_text(context, text, item, default_desc);
- g_free(text);
- break;
-
- case SPLITS_MEMO:
- text = get_check_splits_memo2(pcd);
- draw_text(context, text, item, default_desc);
- g_free(text);
- break;
-
- case SPLITS_ACCOUNT:
- text = get_check_splits_account2(pcd);
- draw_text(context, text, item, default_desc);
- g_free(text);
- break;
-
- case PICTURE:
- draw_picture(context, item);
- break;
-
- default:
- text = g_strdup_printf("(unknown check field, type %d)", item->type);
- draw_text(context, text, item, default_desc);
- g_free(text);
- break;
- }
- }
-
- pango_font_description_free(default_desc);
-}
-
-
-/* Print each of the items that in the description of a single check. This
- * function uses helper functions to print text based and picture based items.
- */
-static void
-draw_page_boxes(GtkPrintContext *context,
- check_format_t *format, gpointer user_data)
-{
- cairo_t *cr;
- GSList *elem;
- check_item_t *item;
-
- cr = gtk_print_context_get_cairo_context(context);
-
- /* Now put the actual data onto the page. */
- for (elem = format->items; elem; elem = g_slist_next(elem))
- {
- item = elem->data;
- if (!item->w || !item->h)
- continue;
- cairo_rectangle(cr, item->x, item->y - item->h, item->w, item->h);
- cairo_stroke(cr);
- }
-}
-
-
-/* Print an entire page based upon the layout in a check description file. This
- * function takes care of translating/rotating the page, calling the function to
- * print the grid pattern (if requested), and calls a helper function to print
- * all check items.
- */
-static void
-draw_check_format(GtkPrintContext *context, gint position,
- check_format_t *format, gpointer user_data)
-{
- PrintCheckDialog *pcd = (PrintCheckDialog *) user_data;
- cairo_t *cr;
- gdouble x, y, r, multip;
-
- cr = gtk_print_context_get_cairo_context(context);
- cairo_translate(cr, format->trans_x, format->trans_y);
- g_debug("Page translated by %f,%f", format->trans_x, format->trans_y);
- cairo_rotate(cr, format->rotation * DEGREES_TO_RADIANS);
- g_debug("Page rotated by %f degrees", format->rotation);
-
- /* The grid is useful when determining check layouts */
- if (format->show_grid)
- {
- draw_grid(context,
- gtk_print_context_get_width(context),
- gtk_print_context_get_height(context),
- pcd->default_font);
- }
-
- /* Translate all subsequent check items if requested.
- * For check position 0, no translation is needed. */
- if ((position > 0) && (position < pcd->position_max))
- {
- /* Standard positioning is used.
- * Note that the first check on the page (position 0) doesn't
- * need to be moved (hence the test for position > 0 above. */
- cairo_translate(cr, 0, format->height);
- g_debug("Position %d translated by %f (pre-defined)", position, format->height);
- }
- else if (position == pcd->position_max)
- {
- /* Custom positioning is used. */
- multip = pcd_get_custom_multip(pcd);
- x = multip * gtk_spin_button_get_value(pcd->translation_x);
- y = multip * gtk_spin_button_get_value(pcd->translation_y);
- cairo_translate(cr, x, y);
- g_debug("Position translated by %f,%f (custom)", x, y);
- r = gtk_spin_button_get_value(pcd->check_rotation);
- cairo_rotate(cr, r * DEGREES_TO_RADIANS);
- g_debug("Position rotated by %f degrees (custom)", r);
- }
-
- /* Draw layout boxes if requested. Also useful when determining check
- * layouts. */
- if (format->show_boxes)
- draw_page_boxes(context, format, user_data);
-
- /* Draw the actual check data. */
- draw_page_items(context, format, user_data);
-}
-
-
-static void
-draw_check_custom(GtkPrintContext *context, gpointer user_data)
-{
- PrintCheckDialog *pcd = (PrintCheckDialog *) user_data;
- GNCPrintAmountInfo info;
- PangoFontDescription *desc;
- Transaction *trans;
- gnc_numeric amount;
- cairo_t *cr;
- const gchar *date_format;
- gchar *text = NULL, buf[100];
- check_item_t item = { 0 };
- gdouble x, y, multip, degrees;
- GDate date;
- gchar *address;
-
- trans = xaccSplitGetParent(pcd->split);
- /* This was valid when the check printing dialog was instantiated. */
- g_return_if_fail(trans);
-
- desc = pango_font_description_from_string(pcd->default_font);
-
- multip = pcd_get_custom_multip(pcd);
- degrees = gtk_spin_button_get_value(pcd->check_rotation);
- cr = gtk_print_context_get_cairo_context(context);
- cairo_rotate(cr, degrees * DEGREES_TO_RADIANS);
- g_debug("Page rotated by %f degrees", degrees);
-
- x = multip * gtk_spin_button_get_value(pcd->translation_x);
- y = multip * gtk_spin_button_get_value(pcd->translation_y);
- cairo_translate(cr, x, y);
- g_debug("Page translated by %f,%f", x, y);
-
- item.x = multip * gtk_spin_button_get_value(pcd->payee_x);
- item.y = multip * gtk_spin_button_get_value(pcd->payee_y);
- draw_text(context, xaccTransGetDescription(trans), &item, desc);
-
- item.x = multip * gtk_spin_button_get_value(pcd->date_x);
- item.y = multip * gtk_spin_button_get_value(pcd->date_y);
- g_date_clear (&date, 1);
- gnc_gdate_set_time64 (&date, xaccTransGetDate(trans));
- date_format = gnc_date_format_get_custom(GNC_DATE_FORMAT(pcd->date_format));
- g_date_strftime(buf, 100, date_format, &date);
- draw_text(context, buf, &item, desc);
-
- item.x = multip * gtk_spin_button_get_value(pcd->number_x);
- item.y = multip * gtk_spin_button_get_value(pcd->number_y);
- info = gnc_default_print_info(FALSE);
- amount = gnc_numeric_abs(xaccSplitGetAmount(pcd->split));
- draw_text(context, xaccPrintAmount(amount, info), &item, desc);
-
- item.x = multip * gtk_spin_button_get_value(pcd->words_x);
- item.y = multip * gtk_spin_button_get_value(pcd->words_y);
- text = numeric_to_words(amount);
- draw_text(context, text, &item, desc);
- g_free(text);
-
- item.x = multip * gtk_spin_button_get_value(pcd->address_x);
- item.y = multip * gtk_spin_button_get_value(pcd->address_y);
- address = get_check_address2(pcd);
- draw_text(context, address, &item, desc);
- g_free(address);
-
- item.x = multip * gtk_spin_button_get_value(pcd->splits_amount_x);
- item.y = multip * gtk_spin_button_get_value(pcd->splits_amount_y);
- text = get_check_splits_amount2(pcd);
- draw_text(context, text, &item, desc);
- g_free(text);
-
- item.x = multip * gtk_spin_button_get_value(pcd->splits_memo_x);
- item.y = multip * gtk_spin_button_get_value(pcd->splits_memo_y);
- text = get_check_splits_memo2(pcd);
- draw_text(context, text, &item, desc);
- g_free(text);
-
- item.x = multip * gtk_spin_button_get_value(pcd->splits_account_x);
- item.y = multip * gtk_spin_button_get_value(pcd->splits_account_y);
- text = get_check_splits_account2(pcd);
- draw_text(context, text, &item, desc);
- g_free(text);
-
- item.x = multip * gtk_spin_button_get_value(pcd->notes_x);
- item.y = multip * gtk_spin_button_get_value(pcd->notes_y);
- draw_text(context, xaccTransGetNotes(trans), &item, desc);
-
- item.x = multip * gtk_spin_button_get_value(pcd->memo_x);
- item.y = multip * gtk_spin_button_get_value(pcd->memo_y);
- draw_text(context, xaccSplitGetMemo(pcd->split), &item, desc);
-
- pango_font_description_free(desc);
-}
-
-
-/* Print a page of checks. This takes into account the number of checks to print,
- * the number of checks on a page, and the starting check position on the page.
- * This function is called once by the GtkPrint code once for each page to be printed.
- */
-static void
-draw_page(GtkPrintOperation *operation,
- GtkPrintContext *context, gint page_nr, gpointer user_data)
-{
- PrintCheckDialog *pcd = (PrintCheckDialog *) user_data;
- check_format_t *format;
-
- format = pcd->selected_format;
- if (format)
- {
- gint first_check, last_check;
- gint first_page_count;
- guint check_count = g_list_length(pcd->splits);
- gint check_number;
- gint position = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->position_combobox));
- gint checks_per_page;
- GList *next_split;
-
- if (position == pcd->position_max)
- {
- /* Custom position, one check per page */
- checks_per_page = 1;
- first_page_count = 1;
- }
- else
- {
- checks_per_page = pcd->position_max;
- first_page_count = gtk_spin_button_get_value_as_int(pcd->first_page_count);
- }
-
- if (page_nr == 0)
- {
- first_check = 0;
- last_check = first_page_count - 1;
- next_split = pcd->splits;
- }
- else
- {
- first_check = first_page_count + (page_nr - 1) * checks_per_page;
- last_check = MIN(check_count - 1, first_check + checks_per_page - 1);
- next_split = g_list_nth(pcd->splits, first_check);
- /* If position is not "custom" reset it to top */
- if (position < pcd->position_max)
- position = 0;
- }
-
- for (check_number = first_check; check_number <= last_check;
- check_number++, position++)
- {
- pcd->split = (Split *) next_split->data;
- next_split = g_list_next(next_split);
- draw_check_format(context, position, format, user_data);
- }
- }
- else
- {
- /* Custom check format */
- pcd->split = (Split *) g_list_nth_data(pcd->splits, page_nr);
- g_return_if_fail(pcd->split);
- draw_check_custom(context, user_data);
- }
-}
-
-
-/* Compute the number of pages required to complete this print operation.
- * This function is called once by the GtkPrint code to determine the number
- * of pages required to complete the print operation.
- */
-static void
-begin_print(GtkPrintOperation *operation,
- GtkPrintContext *context, gpointer user_data)
-{
- PrintCheckDialog *pcd = (PrintCheckDialog *) user_data;
- guint check_count = g_list_length(pcd->splits);
- gint first_page_count;
- gint pages;
- gint position = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->position_combobox));
-
- if (pcd->selected_format && pcd->position_max > 1 && position < pcd->position_max)
- {
- first_page_count = gtk_spin_button_get_value_as_int(pcd->first_page_count);
- pages = ((check_count - first_page_count) + pcd->position_max - 1) /
- pcd->position_max + 1;
- }
- else
- pages = check_count;
- gtk_print_operation_set_n_pages(operation, pages);
-}
-
-
-/************************************
- * gnc_ui_print_check_dialog_ok_cb *
- ************************************/
-static void
-gnc_ui_print_check_dialog_ok_cb(PrintCheckDialog *pcd)
-{
- GtkPrintOperation *print;
- GtkPrintOperationResult res;
-
- print = gtk_print_operation_new();
-
- gnc_print_operation_init(print, "GnuCash-Checks");
- gtk_print_operation_set_unit(print, GTK_UNIT_POINTS);
- gtk_print_operation_set_use_full_page(print, TRUE);
- g_signal_connect(print, "begin_print", G_CALLBACK(begin_print), pcd);
- g_signal_connect(print, "draw_page", G_CALLBACK(draw_page), pcd);
-
- res = gtk_print_operation_run(print,
- GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
- pcd->caller_window, NULL);
-
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY)
- gnc_print_operation_save_print_settings(print);
-
- g_object_unref(print);
-}
-
-
-static void
-gnc_print_check_set_sensitive (GtkWidget *widget, gpointer data)
-{
- gboolean sensitive;
- if (GTK_IS_LABEL(widget) || GTK_IS_SEPARATOR(widget))
- return;
- sensitive = GPOINTER_TO_INT(data);
- gtk_widget_set_sensitive(widget, sensitive);
-}
-
-
-void
-gnc_print_check_format_changed2 (GtkComboBox *widget,
- PrintCheckDialog *pcd)
-{
- GtkListStore *p_store;
- GtkTreeModel *f_model;
- GtkTreeIter f_iter, iter;
- gboolean sensitive;
- gint pnum;
- check_format_t *format;
- gboolean separator;
- GSList *elem;
-
- 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 */
- pcd->selected_format = format;
- p_store = gtk_list_store_new (1, G_TYPE_STRING);
- gtk_combo_box_set_model(GTK_COMBO_BOX(pcd->position_combobox),
- GTK_TREE_MODEL(p_store));
- if (format)
- {
- if (format->positions)
- {
- 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))
- {
- gtk_list_store_append(GTK_LIST_STORE(p_store), &iter);
- gtk_list_store_set (GTK_LIST_STORE(p_store), &iter, 0, elem->data, -1);
- }
- }
- else
- {
- /* Invent a "Top" position if format has no positions */
- pcd->position_max = 1;
- gtk_list_store_append(GTK_LIST_STORE(p_store), &iter);
- gtk_list_store_set (GTK_LIST_STORE(p_store), &iter, 0, _("Top"), -1);
- }
- }
- else
- {
- pcd->position_max = 0;
- }
- gtk_list_store_append(GTK_LIST_STORE(p_store), &iter);
- gtk_list_store_set (GTK_LIST_STORE(p_store), &iter, 0, _("Custom"), -1);
-
- /* If there's only one thing in the position combobox, make it insensitive */
- sensitive = (pcd->position_max > 0);
- gtk_widget_set_sensitive(GTK_WIDGET(pcd->position_combobox), sensitive);
-
- /* Update the custom page, this must be done before setting the active
- entry in the position combo box since gnc_print_check_position_changed2
- will adjust these settings in some cases. */
- sensitive = (!separator && !format);
- gtk_container_foreach(GTK_CONTAINER(pcd->custom_table),
- gnc_print_check_set_sensitive,
- GINT_TO_POINTER(sensitive));
-
- /* Set the active entry in the position combo box, this will trigger a
- call to gnc_print_check_position_changed2 */
- pnum = MAX(MIN(pnum, pcd->position_max), 0);
- gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->position_combobox), pnum);
-
- /* Update address fields */
- sensitive = check_format_has_address(pcd);
- gtk_widget_set_sensitive(pcd->check_address_name, sensitive);
- gtk_widget_set_sensitive(pcd->check_address_1, sensitive);
- gtk_widget_set_sensitive(pcd->check_address_2, sensitive);
- gtk_widget_set_sensitive(pcd->check_address_3, sensitive);
- gtk_widget_set_sensitive(pcd->check_address_4, sensitive);
-}
-
-
-void
-gnc_print_check_position_changed2 (GtkComboBox *widget,
- PrintCheckDialog *pcd)
-{
- gboolean sensitive;
- gint pnum;
- guint check_count;
- gint first_page_max, first_page_min, first_page_value;
-
- pnum = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->position_combobox));
-
- /* Make the translation and rotation fields active if the position is "custom" */
- sensitive = pnum == pcd->position_max;
- gtk_widget_set_sensitive(GTK_WIDGET(pcd->translation_x), sensitive);
- gtk_widget_set_sensitive(GTK_WIDGET(pcd->translation_y), sensitive);
- gtk_widget_set_sensitive(GTK_WIDGET(pcd->check_rotation), sensitive);
- gtk_widget_set_sensitive(GTK_WIDGET(pcd->units_combobox), sensitive);
-
- /* Set up the first page check count spin box */
- check_count = g_list_length(pcd->splits);
- first_page_max = MAX(1, MIN(pcd->position_max - pnum, check_count));
- first_page_min = 1;
- pnum = gtk_spin_button_get_value_as_int(pcd->first_page_count);
- first_page_value = MAX(MIN(pnum, first_page_max), first_page_min);
- gtk_spin_button_set_range(pcd->first_page_count, (gdouble)first_page_min, (gdouble)first_page_max);
- gtk_spin_button_set_value(pcd->first_page_count, (gdouble)first_page_value);
- sensitive = first_page_max > 1;
- gtk_widget_set_sensitive(GTK_WIDGET(pcd->first_page_count), sensitive);
-}
-
-
-void
-gnc_ui_print_check_response_cb2(GtkDialog *dialog,
- gint response,
- PrintCheckDialog *pcd)
-{
- switch (response)
- {
- case GTK_RESPONSE_HELP:
- gnc_gnome_help(HF_HELP, HL_PRINTCHECK);
- return;
-
- case GTK_RESPONSE_OK:
- gnc_ui_print_check_dialog_ok_cb(pcd);
- gnc_ui_print_save_dialog(pcd);
- gnc_save_window_size(GNC_PREFS_GROUP, GTK_WINDOW(dialog));
- break;
-
- case GTK_RESPONSE_CANCEL:
- gnc_save_window_size(GNC_PREFS_GROUP, GTK_WINDOW(dialog));
- break;
- }
-
- gtk_widget_destroy(pcd->dialog);
- g_free(pcd->default_font);
- g_list_free(pcd->splits);
- g_free(pcd);
-}
Summary of changes:
src/app-utils/business-options.scm | 9 +-
src/gnome/dialog-print-check2.c | 2648 ------------------------------------
2 files changed, 4 insertions(+), 2653 deletions(-)
delete mode 100644 src/gnome/dialog-print-check2.c
More information about the gnucash-changes
mailing list