Fix memory handling of queries by the register.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3347 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2000-12-23 01:28:48 +00:00
parent ce09e164fc
commit 223fc82741
4 changed files with 119 additions and 44 deletions

View File

@ -43,6 +43,12 @@
static short module = MOD_LEDGER; static short module = MOD_LEDGER;
/** Declarations ****************************************************/
static xaccLedgerDisplay *
xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q,
SplitRegisterType type, SplitRegisterStyle style);
/** Implementations *************************************************/ /** Implementations *************************************************/
static gboolean static gboolean
@ -339,6 +345,30 @@ close_handler (gpointer user_data)
g_free (ld); g_free (ld);
} }
static void
make_ledger_query (xaccLedgerDisplay *ld, gboolean show_all,
SplitRegisterType type)
{
ld->query = xaccMallocQuery ();
/* This is a bit of a hack. The number of splits should be
* configurable, or maybe we should go back a time range instead
* of picking a number, or maybe we should be able to exclude
* based on reconciled status. Anyway, this works for now. */
if (!show_all && (type != SEARCH_LEDGER))
xaccQuerySetMaxSplits (ld->query, 30);
xaccQuerySetGroup (ld->query, gncGetCurrentGroup());
if (ld->displayed_accounts)
xaccQueryAddAccountMatch (ld->query, ld->displayed_accounts,
ACCT_MATCH_ANY, QUERY_OR);
if (ld->leader &&
(g_list_find (ld->displayed_accounts, ld->leader) == NULL))
xaccQueryAddSingleAccountMatch (ld->query, ld->leader, QUERY_OR);
}
/********************************************************************\ /********************************************************************\
* xaccLedgerDisplayGeneral * * xaccLedgerDisplayGeneral *
* opens up a ledger window for a list of accounts * * opens up a ledger window for a list of accounts *
@ -347,11 +377,46 @@ close_handler (gpointer user_data)
* (may be NULL) * * (may be NULL) *
* accounts - the list of accounts to display * * accounts - the list of accounts to display *
* (may be NULL) * * (may be NULL) *
* type - the type of split register to open *
* style - the style of register to use *
* Return: the register window instance * * Return: the register window instance *
\********************************************************************/ \********************************************************************/
xaccLedgerDisplay * xaccLedgerDisplay *
xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts, xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts,
SplitRegisterType type, SplitRegisterStyle style) SplitRegisterType type, SplitRegisterStyle style)
{
return xaccLedgerDisplayInternal (lead_account, accounts, NULL, type, style);
}
/********************************************************************\
* xaccLedgerDisplayQuery *
* opens up a ledger window for an arbitrary query *
* *
* Args: query - the query to use for the register *
* type - the type of split register to open *
* style - the style of register to use *
* Return: the register window instance *
\********************************************************************/
xaccLedgerDisplay *
xaccLedgerDisplayQuery (Query *query, SplitRegisterType type,
SplitRegisterStyle style)
{
return xaccLedgerDisplayInternal (NULL, NULL, query, type, style);
}
void
xaccLedgerDisplaySetQuery (xaccLedgerDisplay *ledger_display, Query *q)
{
if (!ledger_display || !q)
return;
xaccFreeQuery (ledger_display->query);
ledger_display->query = xaccQueryCopy (q);
}
static xaccLedgerDisplay *
xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q,
SplitRegisterType type, SplitRegisterStyle style)
{ {
xaccLedgerDisplay *ld; xaccLedgerDisplay *ld;
gboolean show_all; gboolean show_all;
@ -402,24 +467,10 @@ xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts,
TRUE); TRUE);
/* set up the query filter */ /* set up the query filter */
ld->query = xaccMallocQuery (); if (q)
ld->query = xaccQueryCopy (q);
/* This is a bit of a hack. The number of splits should be else
* configurable, or maybe we should go back a time range instead make_ledger_query (ld, show_all, type);
* of picking a number, or maybe we should be able to exclude
* based on reconciled status. Anyway, this works for now. */
if (!show_all && (type != SEARCH_LEDGER))
xaccQuerySetMaxSplits(ld->query, 30);
xaccQuerySetGroup (ld->query, gncGetCurrentGroup());
if (ld->displayed_accounts)
xaccQueryAddAccountMatch (ld->query, ld->displayed_accounts,
ACCT_MATCH_ANY, QUERY_OR);
if ((ld->leader != NULL) &&
(g_list_find (ld->displayed_accounts, ld->leader) == NULL))
xaccQueryAddSingleAccountMatch (ld->query, ld->leader, QUERY_OR);
ld->component_id = gnc_register_gui_component (class, NULL, ld->component_id = gnc_register_gui_component (class, NULL,
close_handler, ld); close_handler, ld);
@ -459,7 +510,7 @@ void
xaccLedgerDisplayRefresh (xaccLedgerDisplay *ld) xaccLedgerDisplayRefresh (xaccLedgerDisplay *ld)
{ {
/* If we don't really need the redraw, don't do it. */ /* If we don't really need the redraw, don't do it. */
if (!(ld->dirty)) if (!ld->dirty)
return; return;
ld->dirty = FALSE; /* mark clean */ ld->dirty = FALSE; /* mark clean */

View File

@ -79,6 +79,14 @@ xaccLedgerDisplay * xaccLedgerDisplayGeneral (Account *lead_account,
SplitRegisterType type, SplitRegisterType type,
SplitRegisterStyle style); SplitRegisterStyle style);
/* display a register for an arbitrary query */
xaccLedgerDisplay * xaccLedgerDisplayQuery (Query *query,
SplitRegisterType type,
SplitRegisterStyle style);
/* Set the query used for a register. */
void xaccLedgerDisplaySetQuery (xaccLedgerDisplay *ledger_display, Query *q);
/* redisplay/redraw all windows that contain any transactions that are /* redisplay/redraw all windows that contain any transactions that are
* associated with the indicated account. */ * associated with the indicated account. */
void xaccAccountDisplayRefresh (Account *account); void xaccAccountDisplayRefresh (Account *account);

View File

@ -39,12 +39,16 @@
#include "dialog-utils.h" #include "dialog-utils.h"
#include "glade-cb-gnc-dialogs.h" #include "glade-cb-gnc-dialogs.h"
#include "gnc-dateedit.h" #include "gnc-dateedit.h"
#include "gnc-engine-util.h"
#include "gnc-ui.h" #include "gnc-ui.h"
#include "messages.h" #include "messages.h"
#include "splitreg.h" #include "splitreg.h"
#include "window-help.h" #include "window-help.h"
#include "window-register.h" #include "window-register.h"
/* This static indicates the debugging module that this .o belongs to. */
static short module = MOD_GUI;
/********************************************************************\ /********************************************************************\
* gnc_ui_find_transactions_dialog_create * gnc_ui_find_transactions_dialog_create
* make a new print check dialog and wait for it. * make a new print check dialog and wait for it.
@ -59,7 +63,7 @@ gnc_ui_find_transactions_dialog_create(xaccLedgerDisplay * orig_ledg) {
ftd->ledger = orig_ledg; ftd->ledger = orig_ledg;
if(orig_ledg) { if(orig_ledg) {
ftd->q = orig_ledg->query; ftd->q = xaccQueryCopy (orig_ledg->query);
} }
else { else {
ftd->q = NULL; ftd->q = NULL;
@ -227,7 +231,13 @@ gnc_ui_find_transactions_dialog_destroy(FindTransactionsDialog * ftd) {
gnome_dialog_close(GNOME_DIALOG(ftd->dialog)); gnome_dialog_close(GNOME_DIALOG(ftd->dialog));
ftd->dialog = NULL; ftd->dialog = NULL;
xaccFreeQuery (ftd->q);
ftd->q = NULL;
g_free(ftd->ymd_format); g_free(ftd->ymd_format);
ftd->ymd_format = NULL;
g_free(ftd); g_free(ftd);
} }
@ -339,6 +349,7 @@ gnc_ui_find_transactions_dialog_ok_cb(GtkButton * button,
float amt_temp; float amt_temp;
int amt_type; int amt_type;
Query * q, * q2; Query * q, * q2;
Query * new_q;
gboolean new_ledger = FALSE; gboolean new_ledger = FALSE;
int use_start_date, use_end_date; int use_start_date, use_end_date;
@ -516,39 +527,45 @@ gnc_ui_find_transactions_dialog_ok_cb(GtkButton * button,
xaccQueryAddBalanceMatch(q, how, QUERY_AND); xaccQueryAddBalanceMatch(q, how, QUERY_AND);
} }
if(!ftd->ledger) {
new_ledger = TRUE;
ftd->ledger = xaccLedgerDisplayGeneral(NULL, NULL,
SEARCH_LEDGER,
REG_STYLE_JOURNAL);
xaccFreeQuery(ftd->ledger->query);
}
switch(search_type) { switch(search_type) {
case 0: case 0:
ftd->ledger->query = q; new_q = q;
break; break;
case 1: case 1:
ftd->ledger->query = xaccQueryMerge(ftd->q, q, QUERY_AND); new_q = xaccQueryMerge(ftd->q, q, QUERY_AND);
xaccFreeQuery(q); xaccFreeQuery(q);
break; break;
case 2: case 2:
ftd->ledger->query = xaccQueryMerge(ftd->q, q, QUERY_OR); new_q = xaccQueryMerge(ftd->q, q, QUERY_OR);
xaccFreeQuery(q); xaccFreeQuery(q);
break; break;
case 3: case 3:
q2 = xaccQueryInvert(q); q2 = xaccQueryInvert(q);
ftd->ledger->query = xaccQueryMerge(ftd->q, q2, QUERY_AND); new_q = xaccQueryMerge(ftd->q, q2, QUERY_AND);
xaccFreeQuery(q2); xaccFreeQuery(q2);
xaccFreeQuery(q); xaccFreeQuery(q);
break; break;
default:
PERR ("bad search type: %d", search_type);
new_q = q;
break;
} }
ftd->ledger->dirty = 1; if(!ftd->ledger) {
new_ledger = TRUE;
ftd->ledger = xaccLedgerDisplayQuery (new_q, SEARCH_LEDGER,
REG_STYLE_JOURNAL);
}
else
xaccLedgerDisplaySetQuery (ftd->ledger, new_q);
xaccFreeQuery (new_q);
ftd->ledger->dirty = TRUE;
xaccLedgerDisplayRefresh(ftd->ledger); xaccLedgerDisplayRefresh(ftd->ledger);
if (new_ledger) regWindowLedger(ftd->ledger);
if (new_ledger)
regWindowLedger(ftd->ledger);
gnc_ui_find_transactions_dialog_destroy(ftd); gnc_ui_find_transactions_dialog_destroy(ftd);
} }

View File

@ -905,13 +905,12 @@ static void
gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data) gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data)
{ {
RegWindow * regdata = data; RegWindow * regdata = data;
if(regdata->ledger->type == SEARCH_LEDGER) {
if (regdata->ledger->type == SEARCH_LEDGER)
gnc_ui_find_transactions_dialog_create (regdata->ledger); gnc_ui_find_transactions_dialog_create (regdata->ledger);
} else
else {
gnc_ui_find_transactions_dialog_create (NULL); gnc_ui_find_transactions_dialog_create (NULL);
} }
}
static GtkWidget * static GtkWidget *