Merge remote-tracking branch 'origin/maint'

This commit is contained in:
Christopher Lam 2019-11-19 23:07:10 +08:00
commit 21f053398f
34 changed files with 1023 additions and 894 deletions

View File

@ -87,6 +87,7 @@ static void gcrd_show (GncCellRendererPopup *cell,
gint y1,
gint x2,
gint y2);
static void gcrd_hide (GncCellRendererPopup *cell);
@ -215,7 +216,6 @@ gcrd_class_init (GncCellRendererDateClass *klass)
NULL,
TRUE,
G_PARAM_READWRITE));
}
static void
@ -224,11 +224,10 @@ gcrd_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
GncCellRendererDate *date;
GncCellRendererDate *date = GNC_CELL_RENDERER_DATE(object);
date = GNC_CELL_RENDERER_DATE (object);
switch (param_id) {
switch (param_id)
{
case PROP_USE_BUTTONS:
date->use_buttons = g_value_get_boolean (value);
@ -250,11 +249,10 @@ gcrd_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
GncCellRendererDate *date;
GncCellRendererDate *date = GNC_CELL_RENDERER_DATE (object);
date = GNC_CELL_RENDERER_DATE (object);
switch (param_id) {
switch (param_id)
{
case PROP_USE_BUTTONS:
g_value_set_boolean (value, date->use_buttons);
break;
@ -307,7 +305,7 @@ gcrd_show (GncCellRendererPopup *cell,
gint x2,
gint y2)
{
GncCellRendererDate *date;
GncCellRendererDate *date = GNC_CELL_RENDERER_DATE (cell);
gint year = 0;
gint month = 0;
gint day = 0;
@ -320,8 +318,6 @@ gcrd_show (GncCellRendererPopup *cell,
x2, y2);
}
date = GNC_CELL_RENDERER_DATE (cell);
text = gnc_popup_entry_get_text (GNC_POPUP_ENTRY (GNC_CELL_RENDERER_POPUP (cell)->editable));
if (!(g_strcmp0(text, "")))
@ -373,9 +369,7 @@ gcrd_today_clicked (GtkWidget *button, GncCellRendererDate *cell)
static void
gcrd_selected_double_click (GtkWidget *calendar, GncCellRendererDate *cell)
{
GncCellRendererPopup *popup;
popup = GNC_CELL_RENDERER_POPUP (cell);
GncCellRendererPopup *popup = GNC_CELL_RENDERER_POPUP(cell);
gcrd_ok_clicked (popup->popup_window, cell);
}
@ -383,9 +377,7 @@ gcrd_selected_double_click (GtkWidget *calendar, GncCellRendererDate *cell)
static void
gcrd_cancel_clicked (GtkWidget *popup_window, GncCellRendererDate *cell)
{
GncCellRendererPopup *popup;
popup = GNC_CELL_RENDERER_POPUP (cell);
GncCellRendererPopup *popup = GNC_CELL_RENDERER_POPUP(cell);
popup->editing_canceled = TRUE;
gnc_cell_renderer_popup_hide (popup);
@ -394,9 +386,7 @@ gcrd_cancel_clicked (GtkWidget *popup_window, GncCellRendererDate *cell)
static void
gcrd_ok_clicked (GtkWidget *popup_window, GncCellRendererDate *cell)
{
GncCellRendererPopup *popup;
popup = GNC_CELL_RENDERER_POPUP (cell);
GncCellRendererPopup *popup = GNC_CELL_RENDERER_POPUP(cell);
gcrd_day_selected (popup_window, cell);
@ -460,7 +450,6 @@ gcrd_dmy2time (gint day, gint month, gint year)
return gnc_mktime (&when);
}
/* This function converts a time64 value date to a string */
static gchar *
gcrd_time2dmy_string (time64 raw_time)
@ -468,7 +457,6 @@ gcrd_time2dmy_string (time64 raw_time)
return qof_print_date (raw_time);
}
/* This function converts a string date to a time64 value */
static time64
gcrd_string_dmy2time (const gchar *date_string)

View File

@ -43,12 +43,28 @@ static void gpw_cell_editable_init (GtkCellEditableIface *iface);
static gboolean gpw_key_press_event (GtkWidget *box,
GdkEventKey *key_event);
static void gpw_set_property (GObject *object,
guint param_id,
const GValue *value,
GParamSpec *pspec);
static void gpw_get_property (GObject *object,
guint param_id,
GValue *value,
GParamSpec *pspec);
enum
{
ARROW_CLICKED,
LAST_SIGNAL
};
enum
{
PROP_0,
PROP_EDITING_CANCELED,
};
static GtkEventBoxClass *parent_class;
static guint signals[LAST_SIGNAL];
@ -97,6 +113,8 @@ gnc_popup_entry_init (GncPopupEntry *widget)
{
GtkWidget *arrow;
widget->editing_canceled = FALSE;
widget->hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_set_homogeneous (GTK_BOX(widget->hbox), FALSE);
gtk_widget_show (widget->hbox);
@ -130,11 +148,19 @@ static void
gnc_popup_entry_class_init (GncPopupEntryClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
widget_class->key_press_event = gpw_key_press_event;
gobject_class->set_property = gpw_set_property;
gobject_class->get_property = gpw_get_property;
parent_class = GTK_EVENT_BOX_CLASS (g_type_class_peek_parent (klass));
g_object_class_override_property (gobject_class,
PROP_EDITING_CANCELED,
"editing-canceled");
signals[ARROW_CLICKED] = g_signal_new
("arrow-clicked",
G_TYPE_FROM_CLASS (klass),
@ -146,6 +172,42 @@ gnc_popup_entry_class_init (GncPopupEntryClass *klass)
}
static void
gpw_set_property (GObject *object, guint param_id,
const GValue *value, GParamSpec *pspec)
{
GncPopupEntry *pe = GNC_POPUP_ENTRY(object);
switch (param_id)
{
case PROP_EDITING_CANCELED:
pe->editing_canceled = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
break;
}
}
static void
gpw_get_property (GObject *object, guint param_id,
GValue *value, GParamSpec *pspec)
{
GncPopupEntry *pe = GNC_POPUP_ENTRY(object);
switch (param_id)
{
case PROP_EDITING_CANCELED:
g_value_set_boolean (value, pe->editing_canceled);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
break;
}
}
static void
gpw_arrow_clicked (GtkWidget *button, GncPopupEntry *widget)
{

View File

@ -44,21 +44,23 @@ enum {
static void gcrp_init (GncCellRendererPopup *popup);
static void gcrp_class_init (GncCellRendererPopupClass *klass);
static GtkCellEditable *
gcrp_start_editing (GtkCellRenderer *cell,
static GtkCellEditable *gcrp_start_editing (GtkCellRenderer *cell,
GdkEvent *event,
GtkWidget *widget,
const gchar *path,
const GdkRectangle *background_area,
const GdkRectangle *cell_area,
GtkCellRendererState flags);
static void gcrp_show_popup (GncCellRendererPopup *cell,
const gchar *path,
gint x1,
gint y1,
gint x2,
gint y2);
static void gcrp_hide_popup (GncCellRendererPopup *cell);
static void gcrp_get_size (GtkCellRenderer *cell,
GtkWidget *widget,
const GdkRectangle *cell_area,
@ -66,17 +68,19 @@ static void gcrp_get_size (GtkCellRenderer *cell,
gint *y_offset,
gint *width,
gint *height);
static void gcrp_style_set (GtkWidget *widget,
GtkStyle *old_style,
GncCellRendererPopup *popup);
static gboolean gcrp_key_press_event (GtkWidget *popup_window,
GdkEventKey *event,
GncCellRendererPopup *cell);
static gboolean gcrp_button_press_event (GtkWidget *widget,
GdkEventButton *event,
GncCellRendererPopup *popup);
void gnc_marshal_VOID__STRING_INT_INT_INT_INT (GClosure *closure,
GValue *return_value,
guint n_param_values,
@ -192,14 +196,12 @@ gcrp_editing_done (GtkCellEditable *editable,
path = g_object_get_data (G_OBJECT(editable),
GNC_CELL_RENDERER_POPUP_PATH);
new_text = gnc_popup_entry_get_text (GNC_POPUP_ENTRY(editable));
gtk_cell_renderer_stop_editing (GTK_CELL_RENDERER(cell), FALSE);
g_signal_emit_by_name (cell,
"edited",
path,
new_text);
g_signal_emit_by_name (cell, "edited", path, new_text);
}
static void
@ -310,9 +312,11 @@ gcrp_show_popup (GncCellRendererPopup *cell,
#endif
/* Check if it fits in the available height. */
if (alloc.height > screen_height) {
if (alloc.height > screen_height)
{
/* It doesn't fit, so we see if we have the minimum space needed. */
if (alloc.height > screen_height && y - button_height > screen_height) {
if (alloc.height > screen_height && y - button_height > screen_height)
{
/* We don't, so we show the popup above the cell
instead of below it. */
y -= (alloc.height + button_height);
@ -325,14 +329,13 @@ gcrp_show_popup (GncCellRendererPopup *cell,
/* We try to line it up with the right edge of the column, but we don't
* want it to go off the edges of the screen.
*/
if (x > screen_width) {
if (x > screen_width)
x = screen_width;
}
x -= alloc.width;
if (x < 0) {
if (x < 0)
x = 0;
}
gtk_grab_add (cell->popup_window);
@ -351,16 +354,14 @@ gcrp_hide_popup (GncCellRendererPopup *cell)
gtk_grab_remove (cell->popup_window);
gtk_widget_hide (cell->popup_window);
if (cell->editable) {
if (cell->editable)
gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cell->editable));
}
/* This may look weird (the test), but the weak pointer will actually be
* nulled out for some cells, like the date cell.
*/
if (cell->editable) {
if (cell->editable)
gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cell->editable));
}
cell->shown = FALSE;
cell->editing_canceled = FALSE;
@ -374,7 +375,8 @@ gcrp_arrow_clicked (GtkCellEditable *entry,
gint x, y;
const gchar *path;
if (cell->shown) {
if (cell->shown)
{
cell->editing_canceled = TRUE;
gnc_cell_renderer_popup_hide (cell);
return;
@ -416,18 +418,16 @@ gcrp_start_editing (GtkCellRenderer *cell,
const GdkRectangle *cell_area,
GtkCellRendererState flags)
{
GncCellRendererPopup *popup;
GncCellRendererPopup *popup = GNC_CELL_RENDERER_POPUP(cell);
GtkWidget *editable;
gchar *text;
gboolean iseditable;
popup = GNC_CELL_RENDERER_POPUP (cell);
g_object_get (G_OBJECT (popup), "editable", &iseditable, NULL);
/* If the cell isn't editable we return NULL. */
if (iseditable == FALSE) {
if (iseditable == FALSE)
return NULL;
}
editable = g_object_new (GNC_TYPE_POPUP_ENTRY, NULL);
@ -485,9 +485,7 @@ gcrp_get_size (GtkCellRenderer *cell,
gint *width,
gint *height)
{
GncCellRendererPopup *popup;
popup = GNC_CELL_RENDERER_POPUP (cell);
GncCellRendererPopup *popup = GNC_CELL_RENDERER_POPUP (cell);
if (GTK_CELL_RENDERER_CLASS(parent_class)->get_size) {
(* GTK_CELL_RENDERER_CLASS(parent_class)->get_size) (cell,
@ -500,9 +498,8 @@ gcrp_get_size (GtkCellRenderer *cell,
}
/* We cache this because it takes really long to get the width. */
if (popup->button_width == -1) {
if (popup->button_width == -1)
popup->button_width = gnc_popup_get_button_width ();
}
*width += popup->button_width;
}
@ -540,9 +537,8 @@ gcrp_button_press_event (GtkWidget *widget,
gint x1, y1;
gint x2, y2;
if (event->button != 1) {
if (event->button != 1)
return FALSE;
}
/* If the event happened outside the popup, cancel editing.
*/
@ -565,9 +561,8 @@ gcrp_button_press_event (GtkWidget *widget,
x2 = x1 + alloc.width;
y2 = y1 + alloc.height;
if (x > x1 && x < x2 && y > y1 && y < y2) {
if (x > x1 && x < x2 && y > y1 && y < y2)
return FALSE;
}
popup->editing_canceled = TRUE;
gnc_cell_renderer_popup_hide (popup);
@ -594,6 +589,7 @@ gnc_marshal_VOID__STRING_INT_INT_INT_INT (GClosure *closure,
gint arg_4,
gint arg_5,
gpointer data2);
register GMarshalFunc_VOID__STRING_INT_INT_INT_INT callback;
register GCClosure *cc = (GCClosure*) closure;
register gpointer data1, data2;
@ -620,4 +616,3 @@ gnc_marshal_VOID__STRING_INT_INT_INT_INT (GClosure *closure,
g_marshal_value_peek_int (param_values + 5),
data2);
}

View File

@ -59,6 +59,8 @@ typedef struct
GtkWidget *sub_label;
gboolean jump_close;
gchar *saved_filter_text;
gint event_handler_id;
}FindAccountDialog;
@ -194,7 +196,7 @@ fill_model (GtkTreeModel *model, Account *account)
}
static void
get_account_info (FindAccountDialog *facc_dialog)
get_account_info (FindAccountDialog *facc_dialog, gboolean use_saved_filter)
{
Account *root;
GList *accts;
@ -214,6 +216,9 @@ get_account_info (FindAccountDialog *facc_dialog)
accts = gnc_account_get_descendants_sorted (root);
if (use_saved_filter)
filter_text = g_ascii_strdown (facc_dialog->saved_filter_text, -1);
else
filter_text = g_ascii_strdown (gtk_entry_get_text (GTK_ENTRY(facc_dialog->filter_text_entry)), -1);
/* disconnect the model from the treeview */
@ -250,12 +255,55 @@ get_account_info (FindAccountDialog *facc_dialog)
static void
filter_button_cb (GtkButton *button, FindAccountDialog *facc_dialog)
{
get_account_info (facc_dialog);
get_account_info (facc_dialog, FALSE);
if (facc_dialog->saved_filter_text)
g_free (facc_dialog->saved_filter_text);
// save the filter incase of an account event
facc_dialog->saved_filter_text = g_strdup (gtk_entry_get_text
(GTK_ENTRY(facc_dialog->filter_text_entry)));
// Clear the filter
gtk_entry_set_text (GTK_ENTRY(facc_dialog->filter_text_entry), "");
}
static void
gnc_find_account_event_handler (QofInstance *entity,
QofEventId event_type,
FindAccountDialog *facc_dialog,
gpointer evt_data)
{
Account *account = NULL;
g_return_if_fail (facc_dialog); /* Required */
if (!GNC_IS_ACCOUNT(entity))
return;
ENTER("entity %p of type %d, dialog %p, event_data %p",
entity, event_type, facc_dialog, evt_data);
account = GNC_ACCOUNT(entity);
switch (event_type)
{
case QOF_EVENT_ADD:
case QOF_EVENT_REMOVE:
case QOF_EVENT_MODIFY:
DEBUG("account change on %p (%s)", account, xaccAccountGetName (account));
get_account_info (facc_dialog, TRUE);
LEAVE(" ");
break;
default:
LEAVE("unknown event type");
return;
}
LEAVE(" ");
return;
}
static void
gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialog)
{
@ -280,6 +328,7 @@ gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialo
facc_dialog->session = gnc_get_current_session();
facc_dialog->parent = parent;
facc_dialog->saved_filter_text = g_strdup ("");
gtk_window_set_title (GTK_WINDOW(facc_dialog->window), _("Find Account"));
@ -400,7 +449,11 @@ gnc_find_account_dialog_create (GtkWidget *parent, FindAccountDialog *facc_dialo
// Set the filter to Wildcard
gtk_entry_set_text (GTK_ENTRY(facc_dialog->filter_text_entry), "");
get_account_info (facc_dialog);
// add a handler to listen for account events
facc_dialog->event_handler_id = qof_event_register_handler
((QofEventHandler)gnc_find_account_event_handler, facc_dialog);
get_account_info (facc_dialog, FALSE);
LEAVE(" ");
}
@ -410,6 +463,16 @@ close_handler (gpointer user_data)
FindAccountDialog *facc_dialog = user_data;
ENTER(" ");
if (facc_dialog->event_handler_id)
{
qof_event_unregister_handler (facc_dialog->event_handler_id);
facc_dialog->event_handler_id = 0;
}
if (facc_dialog->saved_filter_text)
g_free (facc_dialog->saved_filter_text);
gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(facc_dialog->window));
gtk_widget_destroy (GTK_WIDGET(facc_dialog->window));
LEAVE(" ");

View File

@ -107,7 +107,8 @@
(define (gnc:html-document-tree-collapse . tree)
(let lp ((e tree) (accum '()))
(cond ((list? e) (fold lp accum e))
(cond ((null? e) accum)
((pair? e) (fold lp accum e))
((string? e) (cons e accum))
(else (cons (object->string e) accum)))))
@ -142,6 +143,7 @@
;;<guile-sitedir>/gnucash/reports/data/balsheet-eg.eguile.scm:<html>
;;<guile-sitedir>/gnucash/reports/data/receipt.eguile.scm:<html>
(push "<!DOCTYPE html>\n")
(push "<html dir='auto'>\n")
(push "<head>\n")
(push "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n")

View File

@ -60,12 +60,9 @@
;; Registers font options
(define (register-font-options options)
(let*
(
(opt-register
(lambda (opt) (gnc:register-option options opt)))
(font-family (gnc-get-default-report-font-family))
)
(define (opt-register opt)
(gnc:register-option options opt))
(let ((font-family (gnc-get-default-report-font-family)))
(opt-register
(gnc:make-font-option
(N_ "Fonts")
@ -99,65 +96,60 @@
(opt-register
(gnc:make-font-option
(N_ "Fonts")
(N_ "Total number cell") "g" (N_ "Font info for number cells containing a total.")
(N_ "Total number cell") "g"
(N_ "Font info for number cells containing a total.")
(string-append font-family " Bold 12")))
(opt-register
(gnc:make-font-option
(N_ "Fonts")
(N_ "Total label cell") "h" (N_ "Font info for cells containing total labels.")
(N_ "Total label cell") "h"
(N_ "Font info for cells containing total labels.")
(string-append font-family " Bold 12")))
(opt-register
(gnc:make-font-option
(N_ "Fonts")
(N_ "Centered label cell") "i" (N_ "Font info for centered label cells.")
(string-append font-family " Bold 12")))
)
)
(string-append font-family " Bold 12")))))
;; Adds CSS style information to an html document
(define (add-css-information-to-doc options ssdoc doc)
(let*
((opt-val
(lambda (section name)
(gnc:option-value (gnc:lookup-option options section name))))
(negative-red? (opt-val "Fonts" "Negative Values in Red"))
(define (opt-font-val name)
(gnc:option-value (gnc:lookup-option options "Fonts" name)))
(define (opt-style-info name) (font-name-to-style-info (opt-font-val name)))
(let* ((negative-red? (opt-font-val "Negative Values in Red"))
(alternate-row-color
(gnc:color-option->html
(gnc:lookup-option options
"Colors"
"Alternate Table Cell Color")))
(title-font-info (font-name-to-style-info (opt-val "Fonts" "Title")))
(account-link-font-info (font-name-to-style-info (opt-val "Fonts" "Account link")))
(number-cell-font-info (font-name-to-style-info (opt-val "Fonts" "Number cell")))
(number-header-font-info (font-name-to-style-info (opt-val "Fonts" "Number header")))
(text-cell-font-info (font-name-to-style-info (opt-val "Fonts" "Text cell")))
(total-number-cell-font-info (font-name-to-style-info (opt-val "Fonts" "Total number cell")))
(total-label-cell-font-info (font-name-to-style-info (opt-val "Fonts" "Total label cell")))
(centered-label-cell-font-info (font-name-to-style-info (opt-val "Fonts" "Centered label cell"))))
(gnc:lookup-option options "Colors" "Alternate Table Cell Color")))
(title-info (opt-style-info "Title"))
(account-link-info (opt-style-info "Account link"))
(number-cell-info (opt-style-info "Number cell"))
(number-header-info (opt-style-info "Number header"))
(text-cell-info (opt-style-info "Text cell"))
(total-number-cell-info (opt-style-info "Total number cell"))
(total-label-cell-info (opt-style-info "Total label cell"))
(centered-label-cell-info (opt-style-info "Centered label cell")))
(gnc:html-document-set-style-text!
ssdoc
(string-append
"h3 { " title-font-info " }\n"
"a { " account-link-font-info " }\n"
"body, p, table, tr, td { vertical-align: top; " text-cell-font-info " }\n"
"h3 { " title-info " }\n"
"a { " account-link-info " }\n"
"body, p, table, tr, td { vertical-align: top; " text-cell-info " }\n"
"tr.alternate-row { background: " alternate-row-color " }\n"
"tr { page-break-inside: avoid !important;}\n"
"th.column-heading-left { text-align: left; " number-header-font-info " }\n"
"th.column-heading-center { text-align: center; " number-header-font-info " }\n"
"th.column-heading-right { text-align: right; " number-header-font-info " }\n"
"html, body { height: 100vh; margin: 0; }\n"
"td, th { border-color: grey }\n"
"th.column-heading-left { text-align: left; " number-header-info " }\n"
"th.column-heading-center { text-align: center; " number-header-info " }\n"
"th.column-heading-right { text-align: right; " number-header-info " }\n"
"td.neg { " (if negative-red? "color: red; " "") " }\n"
"td.number-cell, td.total-number-cell { text-align: right; white-space: nowrap; }\n"
"td.date-cell { white-space: nowrap; }\n"
"td.anchor-cell { white-space: nowrap; " text-cell-font-info " }\n"
"td.number-cell { " number-cell-font-info " }\n"
"td.number-header { text-align: right; " number-header-font-info " }\n"
"td.text-cell { " text-cell-font-info " }\n"
"td.total-number-cell { " total-number-cell-font-info " }\n"
"td.total-label-cell { " total-label-cell-font-info " }\n"
"td.centered-label-cell { text-align: center; " centered-label-cell-font-info " }\n"
(or (gnc:html-document-style-text doc) "")
)
)
)
)
"td.anchor-cell { white-space: nowrap; " text-cell-info " }\n"
"td.number-cell { " number-cell-info " }\n"
"td.number-header { text-align: right; " number-header-info " }\n"
"td.text-cell { " text-cell-info " }\n"
"td.total-number-cell { " total-number-cell-info " }\n"
"td.total-label-cell { " total-label-cell-info " }\n"
"td.centered-label-cell { text-align: center; " centered-label-cell-info " }\n"
(or (gnc:html-document-style-text doc) "")))))

View File

@ -247,6 +247,8 @@
(define (add-owner-table table splits acc start-date end-date date-type
used-columns payable? link-option)
(define (AP-negate num)
(if payable? (- num) num))
(define currency (xaccAccountGetCommodity acc))
(define link-cols (assq-ref '((none . 0) (simple . 1) (detailed . 3)) link-option))
(define (print-totals total debit credit tax sale)
@ -313,8 +315,9 @@
(cons (list (gnc:make-html-table-cell/size 1 2 (_ "Outstanding"))
(make-cell
(gnc:make-gnc-monetary
currency (gnc-lot-get-balance
(gncInvoiceGetPostedLot invoice)))))
currency
(AP-negate (gnc-lot-get-balance
(gncInvoiceGetPostedLot invoice))))))
result))))
(else
(let* ((lot-split (car invoice-splits))
@ -328,7 +331,7 @@
(let* ((tfr-split (car tfr-splits))
(tfr-acct (xaccSplitGetAccount tfr-split))
(tfr-curr (xaccAccountGetCommodity tfr-acct))
(tfr-amt (xaccSplitGetAmount tfr-split)))
(tfr-amt (AP-negate (xaccSplitGetAmount tfr-split))))
(lp1 (cdr tfr-splits)
(cons (list
(qof-print-date (xaccTransGetDate lot-txn))
@ -371,7 +374,7 @@
(let* ((payment-split (car payment-splits))
(inv (car payment-split))
(inv-split (cadr payment-split))
(inv-amount (xaccSplitGetAmount inv-split)))
(inv-amount (AP-negate (xaccSplitGetAmount inv-split))))
(lp (cdr payment-splits)
(- amount inv-amount)
(cons (list

View File

@ -349,6 +349,12 @@
'("-$23.00")
(get-row-col sxml -1 -1)))
(set-option! options "Filter" "Transaction Filter excludes matched strings" #t)
(let ((sxml (options->sxml options "negate transaction filter not.s?")))
(test-equal "transaction filter in bank to 'not.s?' and switch regex, sum = -$23.00"
'("$24.00")
(get-row-col sxml -1 -1)))
;; Test Reconcile Status Filters
(set! options (default-testing-options))
(set-option! options "General" "Start Date" (cons 'absolute (gnc-dmy2time64 01 01 1969)))

View File

@ -213,7 +213,7 @@
(let ((headline (or (gnc:html-document-headline doc)
(gnc:html-document-title doc))))
(if headline
(if (and headline (not (equal? headline "")))
(gnc:html-document-add-object!
ssdoc
(gnc:make-html-text

View File

@ -45,7 +45,8 @@
)
(define html-doc-header-no-title
"<html dir='auto'>\n\
"<!DOCTYPE html>
<html dir='auto'>\n\
<head>\n\
<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n\
</head><body>")
@ -87,7 +88,8 @@
(gnc:html-document-set-title! test-doc "HTML Document Title")
(test-equal "HTML Document - Render with title"
"<html dir='auto'>\n\
"<!DOCTYPE html>
<html dir='auto'>\n\
<head>\n\
<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n\
<title>\n\

View File

@ -89,6 +89,8 @@
(define optname-transaction-matcher (N_ "Transaction Filter"))
(define optname-transaction-matcher-regex
(N_ "Use regular expressions for transaction filter"))
(define optname-transaction-matcher-exclude
(N_ "Transaction Filter excludes matched strings"))
(define optname-reconcile-status (N_ "Reconcile Status"))
(define optname-void-transactions (N_ "Void Transactions"))
(define optname-closing-transactions (N_ "Closing transactions"))
@ -604,6 +606,13 @@ enable full POSIX regular expressions capabilities. '#work|#family' will match b
tags within description, notes or memo. ")
#f))
(gnc:register-trep-option
(gnc:make-simple-boolean-option
pagename-filter optname-transaction-matcher-exclude
"i3"
(_ "If this option is selected, transactions matching filter are excluded.")
#f))
(gnc:register-trep-option
(gnc:make-multichoice-option
pagename-filter optname-reconcile-status
@ -1969,6 +1978,8 @@ be excluded from periodic reporting.")
(lambda () (make-regexp transaction-matcher))
(const 'invalid-transaction-regex))
'no-guile-regex-support)))
(transaction-filter-exclude?
(opt-val pagename-filter optname-transaction-matcher-exclude))
(reconcile-status-filter
(keylist-get-info reconcile-status-list
(opt-val pagename-filter optname-reconcile-status)
@ -2044,6 +2055,11 @@ be excluded from periodic reporting.")
(define (date-comparator? X Y)
(generic-less? X Y 'date 'none #t))
(define (transaction-filter-match split)
(or (match? (xaccTransGetDescription (xaccSplitGetParent split)))
(match? (xaccTransGetNotes (xaccSplitGetParent split)))
(match? (xaccSplitGetMemo split))))
(cond
((or (null? c_account_1)
(symbol? account-matcher-regexp)
@ -2129,9 +2145,9 @@ be excluded from periodic reporting.")
((include) (is-filter-member split c_account_2))
((exclude) (not (is-filter-member split c_account_2))))
(or (string-null? transaction-matcher)
(match? (xaccTransGetDescription trans))
(match? (xaccTransGetNotes trans))
(match? (xaccSplitGetMemo split)))
(if transaction-filter-exclude?
(not (transaction-filter-match split))
(transaction-filter-match split)))
(or (not custom-split-filter)
(custom-split-filter split)))))
splits))

View File

@ -207,7 +207,7 @@ account_id_handler (xmlNodePtr node, gpointer act_pdata)
xaccAccountSetGUID (pdata->account, guid);
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -384,7 +384,7 @@ account_parent_handler (xmlNodePtr node, gpointer act_pdata)
gnc_account_append_child (parent, pdata->account);
g_free (gid);
guid_free (gid);
return TRUE;
}

View File

@ -279,7 +279,7 @@ set_parent_child (xmlNodePtr node, struct billterm_pdata* pdata,
gncBillTermSetGUID (term, guid);
gncBillTermCommitEdit (term);
}
g_free (guid);
guid_free (guid);
g_return_val_if_fail (term, FALSE);
func (pdata->term, term);
@ -318,7 +318,7 @@ billterm_guid_handler (xmlNodePtr node, gpointer billterm_pdata)
gncBillTermSetGUID (pdata->term, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -121,7 +121,7 @@ book_id_handler (xmlNodePtr node, gpointer book_pdata)
guid = dom_tree_to_guid (node);
qof_instance_set_guid (QOF_INSTANCE (book), guid);
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -109,7 +109,7 @@ budget_id_handler (xmlNodePtr node, gpointer bgt)
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
qof_instance_set_guid (QOF_INSTANCE (bgt), guid);
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -205,7 +205,7 @@ customer_guid_handler (xmlNodePtr node, gpointer cust_pdata)
gncCustomerSetGUID (pdata->customer, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -237,7 +237,7 @@ customer_terms_handler (xmlNodePtr node, gpointer cust_pdata)
g_return_val_if_fail (guid, FALSE);
term = gnc_billterm_xml_find_or_create (pdata->book, guid);
g_assert (term);
g_free (guid);
guid_free (guid);
gncCustomerSetTerms (pdata->customer, term);
return TRUE;
@ -353,7 +353,7 @@ customer_taxtable_handler (xmlNodePtr node, gpointer cust_pdata)
gncTaxTableDecRef (taxtable);
gncCustomerSetTaxTable (pdata->customer, taxtable);
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -178,7 +178,7 @@ employee_guid_handler (xmlNodePtr node, gpointer employee_pdata)
gncEmployeeSetGUID (pdata->employee, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -282,7 +282,7 @@ employee_ccard_handler (xmlNodePtr node, gpointer employee_pdata)
g_return_val_if_fail (guid, FALSE);
ccard_acc = xaccAccountLookup (guid, pdata->book);
g_free (guid);
guid_free (guid);
g_return_val_if_fail (ccard_acc, FALSE);
gncEmployeeSetCCard (pdata->employee, ccard_acc);

View File

@ -283,7 +283,7 @@ set_account (xmlNodePtr node, struct entry_pdata* pdata,
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
acc = xaccAccountLookup (guid, pdata->book);
g_free (guid);
guid_free (guid);
g_return_val_if_fail (acc, FALSE);
if (func)
@ -314,7 +314,7 @@ set_taxtable (xmlNodePtr node, struct entry_pdata* pdata,
gncTaxTableDecRef (taxtable);
func (pdata->entry, taxtable);
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -339,7 +339,7 @@ entry_guid_handler (xmlNodePtr node, gpointer entry_pdata)
gncEntrySetGUID (pdata->entry, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -579,7 +579,7 @@ entry_order_handler (xmlNodePtr node, gpointer entry_pdata)
gncOrderAddEntry (order, pdata->entry);
gncOrderCommitEdit (order);
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -604,7 +604,7 @@ entry_invoice_handler (xmlNodePtr node, gpointer entry_pdata)
gncInvoiceAddEntry (invoice, pdata->entry);
gncInvoiceCommitEdit (invoice);
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -629,7 +629,7 @@ entry_bill_handler (xmlNodePtr node, gpointer entry_pdata)
gncBillAddEntry (invoice, pdata->entry);
gncInvoiceCommitEdit (invoice);
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -214,7 +214,7 @@ invoice_guid_handler (xmlNodePtr node, gpointer invoice_pdata)
gncInvoiceSetGUID (pdata->invoice, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -296,7 +296,7 @@ invoice_terms_handler (xmlNodePtr node, gpointer invoice_pdata)
g_return_val_if_fail (guid, FALSE);
term = gnc_billterm_xml_find_or_create (pdata->book, guid);
g_assert (term);
g_free (guid);
guid_free (guid);
gncInvoiceSetTerms (pdata->invoice, term);
return TRUE;
@ -312,7 +312,7 @@ invoice_posttxn_handler (xmlNodePtr node, gpointer invoice_pdata)
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
txn = xaccTransLookup (guid, pdata->book);
g_free (guid);
guid_free (guid);
g_return_val_if_fail (txn, FALSE);
gncInvoiceSetPostedTxn (pdata->invoice, txn);
@ -329,7 +329,7 @@ invoice_postlot_handler (xmlNodePtr node, gpointer invoice_pdata)
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
lot = gnc_lot_lookup (guid, pdata->book);
g_free (guid);
guid_free (guid);
g_return_val_if_fail (lot, FALSE);
gncInvoiceSetPostedLot (pdata->invoice, lot);
@ -346,7 +346,7 @@ invoice_postacc_handler (xmlNodePtr node, gpointer invoice_pdata)
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
acc = xaccAccountLookup (guid, pdata->book);
g_free (guid);
guid_free (guid);
g_return_val_if_fail (acc, FALSE);
gncInvoiceSetPostedAcc (pdata->invoice, acc);

View File

@ -146,7 +146,7 @@ job_guid_handler (xmlNodePtr node, gpointer job_pdata)
gncJobSetGUID (pdata->job, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -91,7 +91,7 @@ lot_id_handler (xmlNodePtr node, gpointer p)
guid = dom_tree_to_guid (node);
gnc_lot_set_guid (pdata->lot, *guid);
g_free (guid);
guid_free (guid);
LEAVE ("");
return TRUE;

View File

@ -161,7 +161,7 @@ order_guid_handler (xmlNodePtr node, gpointer order_pdata)
gncOrderSetGUID (pdata->order, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -182,11 +182,11 @@ owner_id_handler (xmlNodePtr node, gpointer owner_pdata)
}
default:
PWARN ("Invalid owner type: %d\n", gncOwnerGetType (pdata->owner));
g_free (guid);
guid_free (guid);
return FALSE;
}
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -97,7 +97,7 @@ price_parse_xml_sub_node (GNCPrice* p, xmlNodePtr sub_node, QofBook* book)
GncGUID* c = dom_tree_to_guid (sub_node);
if (!c) return FALSE;
gnc_price_set_guid (p, c);
g_free (c);
guid_free (c);
}
else if (g_strcmp0 ("price:commodity", (char*)sub_node->name) == 0)
{

View File

@ -593,7 +593,7 @@ sx_templ_acct_handler (xmlNodePtr node, gpointer sx_pdata)
account = xaccAccountLookup (templ_acct_guid, pdata->book);
sx_set_template_account (sx, account);
g_free (templ_acct_guid);
guid_free (templ_acct_guid);
return TRUE;
}

View File

@ -155,7 +155,7 @@ ttentry_acct_handler (xmlNodePtr node, gpointer ttentry_pdata)
guid = dom_tree_to_guid (node);
g_return_val_if_fail (guid, FALSE);
acc = xaccAccountLookup (guid, pdata->book);
g_free (guid);
guid_free (guid);
g_return_val_if_fail (acc, FALSE);
gncTaxTableEntrySetAccount (pdata->ttentry, acc);
@ -257,7 +257,7 @@ set_parent_child (xmlNodePtr node, struct taxtable_pdata* pdata,
gncTaxTableSetGUID (table, guid);
gncTaxTableCommitEdit (table);
}
g_free (guid);
guid_free (guid);
g_return_val_if_fail (table, FALSE);
func (pdata->table, table);
@ -285,7 +285,7 @@ taxtable_guid_handler (xmlNodePtr node, gpointer taxtable_pdata)
gncTaxTableSetGUID (pdata->table, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -237,7 +237,7 @@ spl_id_handler (xmlNodePtr node, gpointer data)
xaccSplitSetGUID (pdata->split, tmp);
g_free (tmp);
guid_free (tmp);
return TRUE;
}
@ -316,7 +316,7 @@ spl_account_handler (xmlNodePtr node, gpointer data)
xaccAccountInsertSplit (account, pdata->split);
g_free (id);
guid_free (id);
return TRUE;
}
@ -340,7 +340,7 @@ spl_lot_handler (xmlNodePtr node, gpointer data)
gnc_lot_add_split (lot, pdata->split);
g_free (id);
guid_free (id);
return TRUE;
}
@ -455,7 +455,7 @@ trn_id_handler (xmlNodePtr node, gpointer trans_pdata)
xaccTransSetGUID ((Transaction*)trn, tmp);
g_free (tmp);
guid_free (tmp);
return TRUE;
}

View File

@ -190,7 +190,7 @@ vendor_guid_handler (xmlNodePtr node, gpointer vendor_pdata)
gncVendorSetGUID (pdata->vendor, guid);
}
g_free (guid);
guid_free (guid);
return TRUE;
}
@ -222,7 +222,7 @@ vendor_terms_handler (xmlNodePtr node, gpointer vendor_pdata)
g_return_val_if_fail (guid, FALSE);
term = gnc_billterm_xml_find_or_create (pdata->book, guid);
g_assert (term);
g_free (guid);
guid_free (guid);
gncVendorSetTerms (pdata->vendor, term);
return TRUE;
@ -298,7 +298,7 @@ vendor_taxtable_handler (xmlNodePtr node, gpointer vendor_pdata)
gncTaxTableDecRef (taxtable);
gncVendorSetTaxTable (pdata->vendor, taxtable);
g_free (guid);
guid_free (guid);
return TRUE;
}

View File

@ -251,7 +251,7 @@ test_dom_tree_to_guid (void)
xmlFreeNode (test_node);
g_free (test_guid1);
g_free (test_guid2);
guid_free (test_guid2);
}
}

View File

@ -209,12 +209,12 @@ equals_node_val_vs_guid (xmlNodePtr node, const GncGUID* id)
if (guid_compare (cmpid, id) == 0)
{
g_free (cmpid);
guid_free (cmpid);
return TRUE;
}
else
{
g_free (cmpid);
guid_free (cmpid);
return FALSE;
}
}

View File

@ -90,7 +90,7 @@ find_appropriate_node (xmlNodePtr node, Split* spl)
{
account_guid_good = TRUE;
}
g_free (accid);
guid_free (accid);
}
if (account_guid_good && amount_good)
@ -116,10 +116,10 @@ equals_node_val_vs_split_internal (xmlNodePtr node, Split* spl)
if (!guid_equal (id, xaccSplitGetGUID (spl)))
{
g_free (id);
guid_free (id);
return "ids differ";
}
g_free (id);
guid_free (id);
}
else if (g_strcmp0 ((char*)mark->name, "split:memo") == 0)
{
@ -191,10 +191,10 @@ equals_node_val_vs_split_internal (xmlNodePtr node, Split* spl)
if (!guid_equal (id, xaccAccountGetGUID (account)))
{
g_free (id);
guid_free (id);
return "accounts differ";
}
g_free (id);
guid_free (id);
}
}
return NULL;

View File

@ -211,14 +211,14 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; flattens an arbitrary deep nested list into simple list. this is
;; probably the most efficient algorithm available. '(1 2 (3 4)) -->
;; '(1 2 3 4)
;; '(1 2 3 4) thanks to manumanumanu on #guile
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (gnc:list-flatten . lst)
(reverse
(let lp ((e lst) (accum '()))
(if (list? e)
(fold lp accum e)
(cons e accum)))))
(let loop ((lst lst) (acc '()))
(cond
((null? lst) acc)
((pair? lst) (loop (car lst) (loop (cdr lst) acc)))
(else (cons lst acc)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; compatibility hack for fixing guile-2.0 string handling. this code