mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
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:
parent
9f1078dd53
commit
a0e5db4497
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
guid = gnc_gconf_get_string(GCONF_SECTION, KEY_CHECK_FORMAT_GUID, NULL);
|
||||||
|
if (guid == NULL) {
|
||||||
active = gnc_gconf_get_int(GCONF_SECTION, KEY_CHECK_FORMAT, NULL);
|
active = gnc_gconf_get_int(GCONF_SECTION, KEY_CHECK_FORMAT, NULL);
|
||||||
gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), active);
|
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)
|
||||||
|
return;
|
||||||
|
|
||||||
while ((filename = g_dir_read_name(dir)) != NULL) {
|
while ((filename = g_dir_read_name(dir)) != NULL) {
|
||||||
if (g_str_has_prefix(filename, "#"))
|
if (g_str_has_prefix(filename, "#"))
|
||||||
continue;
|
continue;
|
||||||
if (g_str_has_suffix(filename, ".chk"))
|
if (!g_str_has_suffix(filename, ".chk"))
|
||||||
read_one_check_format(pcd, dirname, filename);
|
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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user