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.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@15734 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
David Hampton 2007-03-18 17:37:53 +00:00
parent 9f1078dd53
commit a0e5db4497
7 changed files with 236 additions and 60 deletions

View File

@ -1,9 +1,10 @@
[Top] [Top]
Guid = 54a0fef9-0b7e-462b-8af3-a5f4f328f7bc
Title = Deluxe(tm) Personal Checks US-Letter Title = Deluxe(tm) Personal Checks US-Letter
Rotation = -90.0 Rotation = -90.0
Translation = 4;492 Translation = 4;492
Show_Grid = 0 Show_Grid = false
Show_Boxes = 0 Show_Boxes = false
[Check Items] [Check Items]
Type_1 = PAYEE Type_1 = PAYEE

View File

@ -1,9 +1,10 @@
[Top] [Top]
Guid = 54a0fef9-0b7e-462b-8af3-a5f4f328f7bc
Title = Deluxe(tm) Personal Checks US-Letter Title = Deluxe(tm) Personal Checks US-Letter
Rotation = 90 Rotation = 90
Translation = 232;300 Translation = 232;300
Show_Grid = 0 Show_Grid = false
Show_Boxes = 0 Show_Boxes = false
[Check Items] [Check Items]
Type_1 = PAYEE Type_1 = PAYEE

View File

@ -1,9 +1,10 @@
[Top] [Top]
Guid = 67b144d1-96a5-48d5-9337-0e1083bbf229
Title = Quicken/QuickBooks (tm) US-Letter Title = Quicken/QuickBooks (tm) US-Letter
Rotation = 0.0 Rotation = 0.0
Translation = 0.0;0.0 Translation = 0.0;0.0
Show_Grid = 0 Show_Grid = false
Show_Boxes = 0 Show_Boxes = false
[Check Positions] [Check Positions]
Height = 252.0 Height = 252.0

View File

@ -1,9 +1,10 @@
[Top] [Top]
Guid = 617da3b6-21d8-4340-af07-6a4f38bdeb3f
Title = Quicken(tm) Wallet Checks w/ side stub Title = Quicken(tm) Wallet Checks w/ side stub
Rotation = 0.0 Rotation = 0.0
Translation = 0.0;0.0 Translation = 0.0;0.0
Show_Grid = 0 Show_Grid = false
Show_Boxes = 0 Show_Boxes = false
[Check Positions] [Check Positions]
Height = 204.0 Height = 204.0

View File

@ -1,9 +1,10 @@
[Top] [Top]
Guid = 67b144d1-96a5-48d5-9337-0e1083bbf229
Title = Quicken/QuickBooks (tm) US-Letter Title = Quicken/QuickBooks (tm) US-Letter
Rotation = 0.0 Rotation = 0.0
Translation = 0.0;4.0 Translation = 0.0;4.0
Show_Grid = 0 Show_Grid = false
Show_Boxes = 0 Show_Boxes = false
[Check Positions] [Check Positions]
Height = 252.0 Height = 252.0

View File

@ -1,9 +1,10 @@
[Top] [Top]
Guid = 617da3b6-21d8-4340-af07-6a4f38bdeb3f
Title = Quicken(tm) Wallet Checks w/ side stub Title = Quicken(tm) Wallet Checks w/ side stub
Rotation = 0.0 Rotation = 0.0
Translation = 0.0;4.0 Translation = 0.0;4.0
Show_Grid = 0 Show_Grid = false
Show_Boxes = 0 Show_Boxes = false
[Check Positions] [Check Positions]
Height = 204.0 Height = 204.0

View File

@ -55,6 +55,7 @@
#define G_LOG_DOMAIN "gnc.printing.checks" #define G_LOG_DOMAIN "gnc.printing.checks"
#define GCONF_SECTION "dialogs/print_checks" #define GCONF_SECTION "dialogs/print_checks"
#define KEY_CHECK_FORMAT_GUID "check_format_guid"
#define KEY_CHECK_FORMAT "check_format" #define KEY_CHECK_FORMAT "check_format"
#define KEY_CHECK_POSITION "check_position" #define KEY_CHECK_POSITION "check_position"
#define KEY_DATE_FORMAT_USER "date_format_custom" #define KEY_DATE_FORMAT_USER "date_format_custom"
@ -78,6 +79,7 @@
#define KF_GROUP_TOP "Top" #define KF_GROUP_TOP "Top"
#define KF_GROUP_POS "Check Positions" #define KF_GROUP_POS "Check Positions"
#define KF_GROUP_ITEMS "Check Items" #define KF_GROUP_ITEMS "Check Items"
#define KF_KEY_GUID "Guid"
#define KF_KEY_TITLE "Title" #define KF_KEY_TITLE "Title"
#define KF_KEY_ROTATION "Rotation" #define KF_KEY_ROTATION "Rotation"
#define KF_KEY_TRANSLATION "Translation" #define KF_KEY_TRANSLATION "Translation"
@ -92,10 +94,25 @@
#define KF_KEY_TEXT "Text" #define KF_KEY_TEXT "Text"
#define KF_KEY_FILENAME "Filename" #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 #if USE_GTKPRINT
# define GncPrintContext GtkPrintContext # define GncPrintContext GtkPrintContext
#else #else
# define GncPrintContext GnomePrintContext # define GncPrintContext GnomePrintContext
# define GNOMEPRINT_CLIP_EXTRA 2
#endif #endif
@ -103,9 +120,6 @@
void gnc_ui_print_check_response_cb(GtkDialog * dialog, gint response, PrintCheckDialog * pcd); 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_format_changed(GtkComboBox *widget, PrintCheckDialog * pcd);
void gnc_print_check_position_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); void gnc_print_check_save_button_clicked(GtkButton *button, PrintCheckDialog *pcd);
@ -171,6 +185,13 @@ typedef struct _check_item {
* description in a text file. */ * description in a text file. */
typedef struct _check_format { 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 gchar *title; /**< Title of this check format. Displayed to
* user in the dialog box. */ * user in the dialog box. */
@ -227,11 +248,44 @@ struct _print_check_dialog {
gchar *format_string; gchar *format_string;
GSList *formats_list;
check_format_t *selected_format; 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 static void
save_float_pair (const char *section, const char *key, double a, double b) save_float_pair (const char *section, const char *key, double a, double b)
{ {
@ -263,12 +317,20 @@ get_float_pair (const char *section, const char *key, double *a, double *b)
static void static void
gnc_ui_print_save_dialog(PrintCheckDialog * pcd) gnc_ui_print_save_dialog(PrintCheckDialog * pcd)
{ {
GtkTreeModel *model;
GtkTreeIter iter;
check_format_t *check;
const gchar *format; const gchar *format;
gint active; gint active;
/* Options page */ /* Options page */
active = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->format_combobox)); if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(pcd->format_combobox),
gnc_gconf_set_int(GCONF_SECTION, KEY_CHECK_FORMAT, active, NULL); &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)); active = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->position_combobox));
gnc_gconf_set_int(GCONF_SECTION, KEY_CHECK_POSITION, active, NULL); gnc_gconf_set_int(GCONF_SECTION, KEY_CHECK_POSITION, active, NULL);
active = gnc_date_format_get_format (GNC_DATE_FORMAT(pcd->date_format)); active = gnc_date_format_get_format (GNC_DATE_FORMAT(pcd->date_format));
@ -306,16 +368,29 @@ gnc_ui_print_save_dialog(PrintCheckDialog * pcd)
gnc_gconf_set_int(GCONF_SECTION, KEY_CUSTOM_UNITS, active, NULL); gnc_gconf_set_int(GCONF_SECTION, KEY_CUSTOM_UNITS, active, NULL);
} }
void static void
gnc_ui_print_restore_dialog(PrintCheckDialog * pcd) gnc_ui_print_restore_dialog(PrintCheckDialog * pcd)
{ {
gchar *format; GtkTreeModel *model;
GtkTreeIter iter;
gchar *format, *guid;
gdouble x, y; gdouble x, y;
gint active; gint active;
/* Options page */ /* Options page */
active = gnc_gconf_get_int(GCONF_SECTION, KEY_CHECK_FORMAT, NULL); guid = gnc_gconf_get_string(GCONF_SECTION, KEY_CHECK_FORMAT_GUID, NULL);
gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), active); 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); active = gnc_gconf_get_int(GCONF_SECTION, KEY_CHECK_POSITION, NULL);
gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->position_combobox), active); gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->position_combobox), active);
active = gnc_gconf_get_int(GCONF_SECTION, KEY_DATE_FORMAT, NULL); active = gnc_gconf_get_int(GCONF_SECTION, KEY_DATE_FORMAT, NULL);
@ -422,10 +497,15 @@ pcd_save_custom_data(PrintCheckDialog *pcd, gchar *filename)
GtkWidget *dialog; GtkWidget *dialog;
gdouble multip; gdouble multip;
gint i = 0; gint i = 0;
GUID guid;
char buf[GUID_ENCODING_LENGTH+1];
multip = pcd_get_custom_multip(pcd); multip = pcd_get_custom_multip(pcd);
key_file = g_key_file_new(); 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, g_key_file_set_string(key_file, KF_GROUP_TOP, KF_KEY_TITLE,
_("Custom Check")); _("Custom Check"));
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_GRID, FALSE);
@ -777,10 +857,24 @@ format_read_general_info(const gchar * file,
GKeyFile * key_file, check_format_t * format) GKeyFile * key_file, check_format_t * format)
{ {
GError *error = NULL; GError *error = NULL;
gchar **parts;
gchar *value; gchar *value;
double *dd; double *dd;
gsize dd_len; 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 = format->title =
g_key_file_get_string(key_file, KF_GROUP_TOP, KF_KEY_TITLE, &error); g_key_file_get_string(key_file, KF_GROUP_TOP, KF_KEY_TITLE, &error);
if (!error) { if (!error) {
@ -882,6 +976,8 @@ format_read_general_info(const gchar * file,
static void static void
free_check_format(check_format_t * data) free_check_format(check_format_t * data)
{ {
g_free(data->guid);
g_free(data->filename);
g_free(data->title); g_free(data->title);
g_free(data->font); g_free(data->font);
g_slist_foreach(data->positions, (GFunc) free_check_position, NULL); g_slist_foreach(data->positions, (GFunc) free_check_position, NULL);
@ -895,8 +991,8 @@ free_check_format(check_format_t * data)
/** Read a single check format file and append the resulting format to the /** 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 * list of all known formats. This function calls other functions to read
* each section of the data file. */ * each section of the data file. */
static void static check_format_t *
read_one_check_format(PrintCheckDialog * pcd, read_one_check_format(PrintCheckDialog * pcd, const gchar *groupname,
const gchar * dirname, const gchar * file) const gchar * dirname, const gchar * file)
{ {
gchar *pathname; gchar *pathname;
@ -908,10 +1004,12 @@ read_one_check_format(PrintCheckDialog * pcd,
g_free(pathname); g_free(pathname);
if (!key_file) { if (!key_file) {
g_warning("Check file %s, cannot load file", file); g_warning("Check file %s, cannot load file", file);
return; return NULL;
} }
format = g_new0(check_format_t, 1); format = g_new0(check_format_t, 1);
format->group = groupname;
format->filename = g_strdup(file);
if (format_read_general_info(file, key_file, format)) { if (format_read_general_info(file, key_file, format)) {
format->positions = format_read_multicheck_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); format->items = format_read_item_placement(file, key_file, format);
@ -921,10 +1019,10 @@ read_one_check_format(PrintCheckDialog * pcd,
if ((NULL == format->title) || (NULL == format->items)) { if ((NULL == format->title) || (NULL == format->items)) {
g_warning("Check file %s, no items read. Dropping file.", file); g_warning("Check file %s, no items read. Dropping file.", file);
free_check_format(format); free_check_format(format);
return; return NULL;
} }
pcd->formats_list = g_slist_append(pcd->formats_list, format); return format;
} }
@ -932,20 +1030,59 @@ read_one_check_format(PrintCheckDialog * pcd,
* then calling a helper function to read and parse the check format withing * then calling a helper function to read and parse the check format withing
* the file. */ * the file. */
static void 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; GDir *dir;
const gchar *filename; const gchar *filename;
GtkTreeIter iter;
GtkWidget *dialog;
gboolean found = FALSE;
dir = g_dir_open(dirname, 0, NULL); dir = g_dir_open(dirname, 0, NULL);
if (dir) { if (dir == NULL)
while ((filename = g_dir_read_name(dir)) != NULL) { return;
if (g_str_has_prefix(filename, "#"))
continue; while ((filename = g_dir_read_name(dir)) != NULL) {
if (g_str_has_suffix(filename, ".chk")) if (g_str_has_prefix(filename, "#"))
read_one_check_format(pcd, dirname, 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 @@ read_one_check_directory(PrintCheckDialog * pcd, const gchar * dirname)
* for check files, and then looks in the user's .gnucash directory for any * for check files, and then looks in the user's .gnucash directory for any
* custom check files. */ * custom check files. */
static void static void
read_formats(PrintCheckDialog * pcd) read_formats(PrintCheckDialog * pcd, GtkListStore *store)
{ {
gchar *dirname, *pkgdatadir; gchar *dirname, *pkgdatadir;
pkgdatadir = gnc_path_get_pkgdatadir(); pkgdatadir = gnc_path_get_pkgdatadir();
dirname = g_build_filename(pkgdatadir, CHECK_FMT_DIR, (char *)NULL); 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(dirname);
g_free(pkgdatadir); g_free(pkgdatadir);
dirname = gnc_build_dotgnucash_path(CHECK_FMT_DIR); 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); 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 * gnc_ui_print_check_dialog_create
* make a new print check dialog and wait for it. * make a new print check dialog and wait for it.
@ -983,8 +1130,8 @@ gnc_ui_print_check_dialog_create(GncPluginPageRegister *plugin_page,
GladeXML *xml; GladeXML *xml;
GtkWidget *table; GtkWidget *table;
GtkWindow *window; GtkWindow *window;
GSList *elem;
GtkListStore *store; GtkListStore *store;
GtkTreeIter iter;
pcd = g_new0(PrintCheckDialog, 1); pcd = g_new0(PrintCheckDialog, 1);
pcd->plugin_page = plugin_page; pcd->plugin_page = plugin_page;
@ -996,8 +1143,6 @@ gnc_ui_print_check_dialog_create(GncPluginPageRegister *plugin_page,
pcd->xml = xml; pcd->xml = xml;
pcd->dialog = glade_xml_get_widget (xml, "Print Check Dialog"); pcd->dialog = glade_xml_get_widget (xml, "Print Check Dialog");
read_formats(pcd);
/* now pick out the relevant child widgets */ /* now pick out the relevant child widgets */
pcd->format_combobox = glade_xml_get_widget (xml, "check_format_combobox"); pcd->format_combobox = glade_xml_get_widget (xml, "check_format_combobox");
pcd->position_combobox = glade_xml_get_widget (xml, "check_position_combobox"); pcd->position_combobox = glade_xml_get_widget (xml, "check_position_combobox");
@ -1034,15 +1179,15 @@ gnc_ui_print_check_dialog_create(GncPluginPageRegister *plugin_page,
gtk_table_attach_defaults(GTK_TABLE(table), pcd->date_format, 1, 3, 2, 7); gtk_table_attach_defaults(GTK_TABLE(table), pcd->date_format, 1, 3, 2, 7);
/* Update the combo boxes bases on the available check formats */ /* 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_combo_box_set_model(GTK_COMBO_BOX(pcd->format_combobox),
GTK_TREE_MODEL(store)); GTK_TREE_MODEL(store));
for (elem = pcd->formats_list; elem; elem = g_slist_next(elem)) { gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(pcd->format_combobox),
gtk_combo_box_append_text(GTK_COMBO_BOX(pcd->format_combobox), format_is_a_separator, NULL, NULL);
((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*/
#if USE_GTKPRINT #if USE_GTKPRINT
gtk_widget_destroy(glade_xml_get_widget (xml, "lower_left")); gtk_widget_destroy(glade_xml_get_widget (xml, "lower_left"));
@ -1139,7 +1284,7 @@ draw_grid(GncPrintContext * context, gint width, gint height)
cairo_restore(cr); cairo_restore(cr);
g_object_unref(layout); g_object_unref(layout);
#else #else
gnome_print_gsave(context); gnome_print_grestore(context);
#endif #endif
} }
@ -1197,9 +1342,30 @@ draw_text(GncPrintContext * context, const gchar * text, check_item_t * data,
g_object_unref(layout); g_object_unref(layout);
return width; return width;
#else #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); g_debug("Text move to %f,%f, print '%s'", data->x, data->y, text);
gnome_print_moveto(context, data->x, data->y); gnome_print_moveto(context, data->x, data->y);
gnome_print_show(context, text); gnome_print_show(context, text);
gnome_print_grestore(context);
return 0.0; return 0.0;
#endif #endif
} }
@ -1480,7 +1646,7 @@ draw_page_items(GncPrintContext * context,
#endif #endif
default: 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); draw_text(context, text, item, default_desc);
g_free(text); g_free(text);
} }
@ -1811,25 +1977,31 @@ void
gnc_print_check_format_changed (GtkComboBox *widget, gnc_print_check_format_changed (GtkComboBox *widget,
PrintCheckDialog * pcd) PrintCheckDialog * pcd)
{ {
GtkListStore *store; GtkListStore *p_store;
GtkTreeModel *f_model;
GtkTreeIter f_iter;
gboolean sensitive; gboolean sensitive;
gint fnum, pnum; gint pnum;
check_format_t *format; check_format_t *format;
gboolean separator;
GSList *elem; GSList *elem;
fnum = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->format_combobox)); if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(pcd->format_combobox), &f_iter))
if (-1 == fnum)
return; 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)); pnum = gtk_combo_box_get_active(GTK_COMBO_BOX(pcd->position_combobox));
/* Update the positions combobox */ /* Update the positions combobox */
format = g_slist_nth_data(pcd->formats_list, fnum);
pcd->selected_format = format; pcd->selected_format = format;
g_signal_handlers_block_by_func(pcd->position_combobox, g_signal_handlers_block_by_func(pcd->position_combobox,
gnc_print_check_position_changed, pcd); 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_combo_box_set_model(GTK_COMBO_BOX(pcd->position_combobox),
GTK_TREE_MODEL(store)); GTK_TREE_MODEL(p_store));
if (format) { if (format) {
pcd->position_max = g_slist_length(format->positions); /* -1 for 0 base, +1 for custom entry */ 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)) { for (elem = format->positions; elem; elem = g_slist_next(elem)) {
@ -1849,7 +2021,7 @@ gnc_print_check_format_changed (GtkComboBox *widget,
gtk_widget_set_sensitive(GTK_WIDGET(pcd->position_combobox), sensitive); gtk_widget_set_sensitive(GTK_WIDGET(pcd->position_combobox), sensitive);
/* Update the custom page */ /* Update the custom page */
sensitive = (fnum == pcd->format_max); sensitive = (!separator && !format);
gtk_container_foreach(GTK_CONTAINER(pcd->custom_table), gtk_container_foreach(GTK_CONTAINER(pcd->custom_table),
gnc_print_check_set_sensitive, gnc_print_check_set_sensitive,
GINT_TO_POINTER(sensitive)); GINT_TO_POINTER(sensitive));
@ -1882,7 +2054,5 @@ gnc_ui_print_check_response_cb(GtkDialog * dialog,
gtk_widget_destroy(pcd->dialog); gtk_widget_destroy(pcd->dialog);
g_object_unref(pcd->xml); 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); g_free(pcd);
} }