Register rewrite Update, this adds the trading accounts option with some other changes.

This update adds the trading accounts option. Also included is a fix for the way the model is loaded and changes the way it the view gets refreshed. There are also some minor changes to transaction confirmation. Two new files have been added and some functions moved to these with more to follow.
Author: Robert Fewell

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@22920 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Geert Janssens
2013-04-20 16:45:56 +00:00
parent d98f1ef194
commit 9197062afe
14 changed files with 1394 additions and 650 deletions

View File

@@ -319,6 +319,7 @@ src/gnome-utils/gnc-tree-model-commodity.c
src/gnome-utils/gnc-tree-model-owner.c
src/gnome-utils/gnc-tree-model-price.c
src/gnome-utils/gnc-tree-model-split-reg.c
src/gnome-utils/gnc-tree-util-split-reg.c
src/gnome-utils/gnc-tree-view-account.c
src/gnome-utils/gnc-tree-view.c
src/gnome-utils/gnc-tree-view-commodity.c

View File

@@ -646,7 +646,7 @@ xaccTransCopyOnto(const Transaction *from_trans, Transaction *to_trans)
* Neither 'from_trans', nor 'from_acc', nor any of 'from's splits may
* be modified in any way.
*
* 'no_date' if TRUE will not copy the date posted.
* 'no_start' if TRUE will not copy the date posted or Num.
*
* The 'to_trans' transaction will end up with valid copies of from's
* splits. In addition, the copies of any of from's splits that were
@@ -654,7 +654,7 @@ xaccTransCopyOnto(const Transaction *from_trans, Transaction *to_trans)
\********************************************************************/
void
xaccTransCopyFromClipBoard(const Transaction *from_trans, Transaction *to_trans,
const Account *from_acc, Account *to_acc, gboolean no_date)
const Account *from_acc, Account *to_acc, gboolean no_start)
{
Timespec ts = {0,0};
gboolean change_accounts = FALSE;
@@ -670,10 +670,11 @@ xaccTransCopyFromClipBoard(const Transaction *from_trans, Transaction *to_trans,
xaccTransSetCurrency(to_trans, xaccTransGetCurrency(from_trans));
xaccTransSetDescription(to_trans, xaccTransGetDescription(from_trans));
xaccTransSetNum(to_trans, xaccTransGetNum(from_trans));
xaccTransSetNotes(to_trans, xaccTransGetNotes(from_trans));
if(!no_date)
if(!no_start)
{
xaccTransSetNum(to_trans, xaccTransGetNum(from_trans));
xaccTransGetDatePostedTS(from_trans, &ts);
xaccTransSetDatePostedTS(to_trans, &ts);
}

View File

@@ -244,14 +244,14 @@ void xaccTransCopyOnto(const Transaction *from_trans, Transaction *to_trans);
* Neither 'from_trans', nor 'from_acc', nor any of 'from's splits may be modified
* in any way.
*
* 'no_date' if TRUE will not copy the date posted.
* 'no_start' if TRUE will not copy the date posted or Num.
*
* The 'to_trans' transaction will end up with valid copies of from's
* splits. In addition, the copies of any of from's splits that were
* in from_acc (or at least claimed to be) will end up in to_acc.
*/
void xaccTransCopyFromClipBoard(const Transaction *from_trans, Transaction *to_trans,
const Account *from_acc, Account *to_acc, gboolean no_date);
const Account *from_acc, Account *to_acc, gboolean no_start);
/*################## Added for Reg2 #################*/

View File

@@ -92,6 +92,7 @@ libgncmod_gnome_utils_la_SOURCES = \
gnc-tree-model-commodity.c \
gnc-tree-model-price.c \
gnc-tree-model-split-reg.c \
gnc-tree-util-split-reg.c \
gnc-tree-view-account.c \
gnc-tree-view-commodity.c \
gnc-tree-view-owner.c \
@@ -170,6 +171,7 @@ gncinclude_HEADERS = \
gnc-tree-model-commodity.h \
gnc-tree-model-price.h \
gnc-tree-model-split-reg.h \
gnc-tree-util-split-reg.h \
gnc-tree-view-account.h \
gnc-tree-view-commodity.h \
gnc-tree-view-owner.h \

View File

@@ -33,6 +33,7 @@
#include "gnc-tree-control-split-reg.h"
#include "gnc-tree-model-split-reg.h"
#include "gnc-tree-util-split-reg.h"
#include "gnc-tree-view-split-reg.h"
#include "gnc-component-manager.h"
#include "gnc-ui.h"
@@ -266,8 +267,6 @@ gnc_tree_control_split_reg_balance_trans (GncTreeViewSplitReg *view, Transaction
window = gnc_tree_view_split_reg_get_parent (view);
model = gnc_tree_view_split_reg_get_model_from_view (view);
//FIXME ## Trading ## Copied from split-register-control, needs testing
if (xaccTransUseTradingAccounts (trans))
{
MonetaryList *imbal_list;
@@ -297,7 +296,6 @@ gnc_tree_control_split_reg_balance_trans (GncTreeViewSplitReg *view, Transaction
}
else
multi_currency = FALSE;
//FIXME
split = xaccTransGetSplit (trans, 0);
other_split = xaccSplitGetOtherSplit (split);
@@ -452,6 +450,14 @@ gnc_tree_control_split_reg_exchange_rate (GncTreeViewSplitReg *view)
window = gnc_tree_view_split_reg_get_parent (view);
/* Make sure we NEED this for this type of register */
if (!gnc_tree_util_split_reg_has_rate (view))
{
message = _("This register does not support editing exchange rates.");
gnc_error_dialog(window, "%s", message);
return;
}
/* If the anchor commodity is not a currency, cancel */
if (anchor && !gnc_commodity_is_currency (xaccAccountGetCommodity (anchor)))
{
@@ -461,7 +467,7 @@ gnc_tree_control_split_reg_exchange_rate (GncTreeViewSplitReg *view)
}
/* If we're not expanded AND number of splits greater than two, nothing to do */
if ((num_splits > 2) && !expanded)
if ((gnc_tree_util_split_reg_is_multi (xaccTransGetSplit (trans, 0))) && !expanded)
{
message = _("You need to expand the transaction in order to modify its "
"exchange rates.");
@@ -469,9 +475,13 @@ gnc_tree_control_split_reg_exchange_rate (GncTreeViewSplitReg *view)
return;
}
if (num_splits == 2 && anchor != NULL && !expanded)
if (!gnc_tree_util_split_reg_is_multi (xaccTransGetSplit (trans, 0)) && anchor != NULL && !expanded)
{
split = gnc_tree_control_split_reg_get_current_trans_split (view);
if (xaccAccountGetType (xaccSplitGetAccount (split)) == ACCT_TYPE_TRADING) // trading split
return;
osplit = xaccSplitGetOtherSplit (split);
value = xaccSplitGetValue (split);
@@ -480,9 +490,9 @@ gnc_tree_control_split_reg_exchange_rate (GncTreeViewSplitReg *view)
xaccTransBeginEdit (trans);
if (txn_com == xaccAccountGetCommodity (xaccSplitGetAccount(split)))
gnc_tree_view_split_reg_set_value_for (view, trans, osplit, gnc_numeric_neg (value), TRUE);
gnc_tree_util_split_reg_set_value_for (view, trans, osplit, gnc_numeric_neg (value), TRUE);
else
gnc_tree_view_split_reg_set_value_for (view, trans, split, value, TRUE);
gnc_tree_util_split_reg_set_value_for (view, trans, split, value, TRUE);
xaccTransCommitEdit (trans);
gnc_tree_view_split_reg_set_dirty_trans (view, NULL);
@@ -492,6 +502,9 @@ gnc_tree_control_split_reg_exchange_rate (GncTreeViewSplitReg *view)
{
split = gnc_tree_view_split_reg_get_current_split (view);
if (xaccAccountGetType (xaccSplitGetAccount (split)) == ACCT_TYPE_TRADING) // trading split
return;
value = xaccSplitGetValue (split);
if (txn_com == xaccAccountGetCommodity (xaccSplitGetAccount(split)))
@@ -505,7 +518,7 @@ gnc_tree_control_split_reg_exchange_rate (GncTreeViewSplitReg *view)
gnc_tree_view_split_reg_set_dirty_trans (view, trans);
xaccTransBeginEdit (trans);
gnc_tree_view_split_reg_set_value_for (view, trans, split, value, TRUE);
gnc_tree_util_split_reg_set_value_for (view, trans, split, value, TRUE);
xaccTransCommitEdit (trans);
gnc_tree_view_split_reg_set_dirty_trans (view, NULL);
@@ -839,7 +852,7 @@ gnc_tree_control_split_reg_goto_rel_trans_row (GncTreeViewSplitReg *view, gint r
{
GncTreeModelSplitReg *model;
GtkTreePath *mpath, *spath;
GtkTreePath *new_spath;
GtkTreePath *new_mpath, *new_spath;
gint *indices;
ENTER("Move relative, view is %p, relative is %d", view, relative);
@@ -867,8 +880,17 @@ gnc_tree_control_split_reg_goto_rel_trans_row (GncTreeViewSplitReg *view, gint r
gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), new_spath, NULL, FALSE);
if (relative == 0)
{
gnc_tree_view_split_reg_block_selection (view, FALSE);
/* Get the new model path we are pointing at */
new_mpath = gnc_tree_view_split_reg_get_model_path_from_sort_path (view, new_spath);
/* As we are not emitting selection change, we need to save the current path ref */
gnc_tree_view_split_reg_set_current_path (view, new_mpath);
gtk_tree_path_free (new_mpath);
}
LEAVE("new_spath is %s", gtk_tree_path_to_string (new_spath));
gtk_tree_path_free (new_spath);
@@ -2018,10 +2040,10 @@ gnc_tree_control_split_reg_sort_changed_cb (GtkTreeSortable *sortable, gpointer
view->sort_col = sortcol - 1;
if (type == GTK_SORT_ASCENDING)
view->sort_direction = 1;
else
if (type == GTK_SORT_DESCENDING)
view->sort_direction = -1;
else
view->sort_direction = 1;
/* Save the sort depth to gconf */
gconf_section = gnc_tree_view_get_gconf_section (GNC_TREE_VIEW (view));

View File

@@ -49,7 +49,7 @@
/* Signal codes */
enum
{
REFRESH_VIEW,
REFRESH_TRANS,
REFRESH_STATUS_BAR,
SELECTION_MOVE_DELETE,
SELECTION_MOVE_FILTER,
@@ -288,14 +288,16 @@ gnc_tree_model_split_reg_class_init (GncTreeModelSplitRegClass *klass)
o_class->finalize = gnc_tree_model_split_reg_finalize;
o_class->dispose = gnc_tree_model_split_reg_dispose;
gnc_tree_model_split_reg_signals[REFRESH_VIEW] =
g_signal_new("refresh_view",
gnc_tree_model_split_reg_signals[REFRESH_TRANS] =
g_signal_new("refresh_trans",
G_TYPE_FROM_CLASS (o_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GncTreeModelSplitRegClass, refresh_view),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GncTreeModelSplitRegClass, refresh_trans),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE,
1,
G_TYPE_POINTER);
gnc_tree_model_split_reg_signals[REFRESH_STATUS_BAR] =
g_signal_new("refresh_status_bar",
@@ -328,7 +330,7 @@ gnc_tree_model_split_reg_class_init (GncTreeModelSplitRegClass *klass)
1,
G_TYPE_POINTER);
klass->refresh_view = NULL;
klass->refresh_trans = NULL;
klass->refresh_status_bar = NULL;
klass->selection_move_delete = NULL;
klass->selection_move_filter = NULL;
@@ -558,6 +560,9 @@ gnc_tree_model_split_reg_load (GncTreeModelSplitReg *model, GList *slist, Accoun
/* Add the blank transaction to the tlist */
priv->tlist = g_list_append (priv->tlist, priv->btrans);
PINFO("Register for Account '%s' has %d transactions and %d splits",
default_account ? xaccAccountGetName (default_account) : "NULL", g_list_length (priv->tlist), g_list_length (slist));
/* Update the completion model liststores */
gnc_tree_model_split_reg_update_completion (model);
@@ -744,7 +749,7 @@ gnc_tree_model_split_reg_get_column_type (GtkTreeModel *tree_model, int index)
case GNC_TREE_MODEL_SPLIT_REG_COL_DUEDATE:
case GNC_TREE_MODEL_SPLIT_REG_COL_NUMACT:
case GNC_TREE_MODEL_SPLIT_REG_COL_DESCNOTES:
case GNC_TREE_MODEL_SPLIT_REG_COL_TRANSVOID:
case GNC_TREE_MODEL_SPLIT_REG_COL_TRANSFERVOID:
case GNC_TREE_MODEL_SPLIT_REG_COL_RECN:
case GNC_TREE_MODEL_SPLIT_REG_COL_DEBIT:
case GNC_TREE_MODEL_SPLIT_REG_COL_CREDIT:
@@ -1201,7 +1206,7 @@ gnc_tree_model_split_reg_get_value (GtkTreeModel *tree_model,
case GNC_TREE_MODEL_SPLIT_REG_COL_DESCNOTES:
break;
case GNC_TREE_MODEL_SPLIT_REG_COL_TRANSVOID:
case GNC_TREE_MODEL_SPLIT_REG_COL_TRANSFERVOID:
break;
case GNC_TREE_MODEL_SPLIT_REG_COL_RECN:
@@ -2788,7 +2793,7 @@ gnc_tree_model_split_reg_event_handler (QofInstance *entity,
gtm_insert_row_at (model, &iter1);
iter2 = gtm_make_iter (model, TROW2 | BLANK, tnode, NULL);
gtm_insert_row_at (model, &iter2);
g_signal_emit_by_name (model, "refresh_view", NULL);
g_signal_emit_by_name (model, "refresh_trans", priv->btrans);
}
if (get_iter (model, trans, NULL, &iter1, &iter2))
@@ -2796,7 +2801,7 @@ gnc_tree_model_split_reg_event_handler (QofInstance *entity,
DEBUG ("change trans %p (%s)", trans, name);
gtm_changed_row_at (model, &iter1);
gtm_changed_row_at (model, &iter2);
g_signal_emit_by_name (model, "refresh_view", NULL);
g_signal_emit_by_name (model, "refresh_trans", trans);
}
break;
case QOF_EVENT_DESTROY:
@@ -2815,7 +2820,6 @@ gnc_tree_model_split_reg_event_handler (QofInstance *entity,
DEBUG("destroy trans %p (%s)", trans, name);
g_signal_emit_by_name (model, "selection_move_delete", trans);
gtm_delete_trans (model, trans);
g_signal_emit_by_name (model, "refresh_view", NULL);
}
break;
default:
@@ -2836,13 +2840,13 @@ gnc_tree_model_split_reg_event_handler (QofInstance *entity,
{
DEBUG("Insert trans %p for gl (%s)", trans, name);
gtm_insert_trans (model, trans);
g_signal_emit_by_name (model, "refresh_view", NULL);
g_signal_emit_by_name (model, "refresh_trans", trans);
}
else if (!g_list_find (priv->tlist, trans) && ((xaccAccountHasAncestor (acc, priv->anchor) && priv->display_subacc) || acc == priv->anchor ))
{
DEBUG("Insert trans %p (%s)", trans, name);
gtm_insert_trans (model, trans);
g_signal_emit_by_name (model, "refresh_view", NULL);
g_signal_emit_by_name (model, "refresh_trans", trans);
}
break;
default:

View File

@@ -86,25 +86,25 @@ typedef enum
typedef enum
{
GNC_TREE_MODEL_SPLIT_REG_COL_GUID, //0
GNC_TREE_MODEL_SPLIT_REG_COL_DATE, //1
GNC_TREE_MODEL_SPLIT_REG_COL_DUEDATE, //2
GNC_TREE_MODEL_SPLIT_REG_COL_NUMACT, //3
GNC_TREE_MODEL_SPLIT_REG_COL_DESCNOTES, //4
GNC_TREE_MODEL_SPLIT_REG_COL_TRANSVOID, //5
GNC_TREE_MODEL_SPLIT_REG_COL_RECN, //6
GNC_TREE_MODEL_SPLIT_REG_COL_DEBIT, //7
GNC_TREE_MODEL_SPLIT_REG_COL_CREDIT, //8
GNC_TREE_MODEL_SPLIT_REG_COL_GUID, //0
GNC_TREE_MODEL_SPLIT_REG_COL_DATE, //1
GNC_TREE_MODEL_SPLIT_REG_COL_DUEDATE, //2
GNC_TREE_MODEL_SPLIT_REG_COL_NUMACT, //3
GNC_TREE_MODEL_SPLIT_REG_COL_DESCNOTES, //4
GNC_TREE_MODEL_SPLIT_REG_COL_TRANSFERVOID, //5
GNC_TREE_MODEL_SPLIT_REG_COL_RECN, //6
GNC_TREE_MODEL_SPLIT_REG_COL_DEBIT, //7
GNC_TREE_MODEL_SPLIT_REG_COL_CREDIT, //8
GNC_TREE_MODEL_SPLIT_REG_COL_LAST_VISIBLE = GNC_TREE_MODEL_SPLIT_REG_COL_CREDIT, //8
/* internal hidden columns */
GNC_TREE_MODEL_SPLIT_REG_COL_RO, //9
GNC_TREE_MODEL_SPLIT_REG_COL_FILTER_VIS,//10
GNC_TREE_MODEL_SPLIT_REG_COL_NUM_VIS, //11
GNC_TREE_MODEL_SPLIT_REG_COL_ACT_VIS, //12
GNC_TREE_MODEL_SPLIT_REG_COL_RO, //9
GNC_TREE_MODEL_SPLIT_REG_COL_FILTER_VIS, //10
GNC_TREE_MODEL_SPLIT_REG_COL_NUM_VIS, //11
GNC_TREE_MODEL_SPLIT_REG_COL_ACT_VIS, //12
GNC_TREE_MODEL_SPLIT_REG_NUM_COLUMNS //13
GNC_TREE_MODEL_SPLIT_REG_NUM_COLUMNS //13
} GncTreeModelSplitRegColumn;
/* typedefs & structures */
@@ -143,8 +143,9 @@ typedef struct
{
GncTreeModelClass gnc_tree_model; /**< The parent object data. */
/* This signal is emitted to refresh the view */
void (*refresh_view) (GncTreeModelSplitReg *model, gpointer user_data);
/* This signal is emitted to refresh the transaction view, the pointer has
the transaction */
void (*refresh_trans) (GncTreeModelSplitReg *model, gpointer item);
/* This signal is emitted to refresh the status bar */
void (*refresh_status_bar) (GncTreeModelSplitReg *model, gpointer user_data);

View File

@@ -0,0 +1,772 @@
/********************************************************************\
* gnc-tree-util-split-reg.c -- GtkTreeView implementation *
* to display registers in a GtkTreeView. *
* *
* Copyright (C) 2006-2007 Chris Shoemaker <c.shoemaker@cox.net> *
* Copyright (C) 2012 Robert Fewell *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
#include "config.h"
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <stdlib.h>
#include <string.h>
#include "gnc-tree-util-split-reg.h"
#include "gnc-tree-model-split-reg.h"
#include "gnc-tree-view-split-reg.h"
#include "gnc-ui.h"
#include "dialog-utils.h"
#include "dialog-transfer.h"
#include "engine-helpers.h"
#include "Transaction.h"
#define SPLIT_TRANS_STR _("-- Split Transaction --")
#define STOCK_SPLIT_STR _("-- Stock Split --")
/** Static Globals *******************************************************/
static QofLogModule log_module = GNC_MOD_LEDGER;
/*****************************************************************************/
/* Is current split a security account */
static gboolean
gtu_split_reg_use_security (GncTreeViewSplitReg *view)
{
RowDepth depth;
Account *account = NULL;
Split *split;
split = gnc_tree_view_split_reg_get_current_split (view);
depth = gnc_tree_view_reg_get_selected_row_depth (view);
if (!split)
return TRUE;
if (depth != SPLIT3)
return TRUE;
if (!account)
account = xaccSplitGetAccount (split);
if (!account)
return TRUE;
if (xaccTransUseTradingAccounts (xaccSplitGetParent (split)))
{
if (!gnc_commodity_is_iso (xaccAccountGetCommodity (account)))
return TRUE;
}
return xaccAccountIsPriced (account);
}
/* Get the rate from the price db */
static gnc_numeric
gtu_split_reg_get_rate_from_db (gnc_commodity *from, gnc_commodity *to)
{
GNCPrice *prc;
gnc_numeric rate_split;
gboolean have_rate = FALSE;
QofBook *book = gnc_get_current_book ();
/* Do we have a rate allready */
prc = gnc_pricedb_lookup_latest (gnc_pricedb_get_db (book), from, to);
if (prc)
{
rate_split = gnc_price_get_value (prc);
gnc_price_unref (prc);
have_rate = TRUE;
}
/* Lets try reversing the commodities */
if (!have_rate)
{
prc = gnc_pricedb_lookup_latest (gnc_pricedb_get_db (book), to, from);
if (prc)
{
rate_split = gnc_numeric_div (gnc_numeric_create (100, 100), gnc_price_get_value (prc),
GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
gnc_price_unref (prc);
have_rate = TRUE;
}
}
/* No rate, set to 1/1 */
if (!have_rate)
rate_split = gnc_numeric_create (100, 100);
return rate_split;
}
/* Do we need an exchange rate */
static gboolean
gtu_split_reg_needs_exchange_rate (GncTreeViewSplitReg *view, Transaction *trans, Split *split)
{
gnc_commodity *split_com, *txn_curr, *reg_com;
ENTER("gtu_split_reg_needs_exchange_rate - trans %p and split %p", trans, split);
txn_curr = xaccTransGetCurrency (trans);
split_com = xaccAccountGetCommodity (xaccSplitGetAccount (split));
if (split_com && txn_curr && !gnc_commodity_equiv (split_com, txn_curr))
{
LEAVE("gtu_split_reg_needs_exchange_rate split_com to txn_curr return TRUE");
return TRUE;
}
reg_com = gnc_tree_view_split_reg_get_reg_commodity (view);
if (split_com && reg_com && !gnc_commodity_equiv (split_com, reg_com))
{
LEAVE("gtu_split_reg_needs_exchange_rate split_com and reg_com return TRUE");
return TRUE;
}
LEAVE("No Exchange rate needed");
return FALSE;
}
/* Either sets the value and amount for split and returns TRUE, or
does nothing and returns FALSE. */
static gboolean
gtu_split_reg_handle_exchange_rate (GncTreeViewSplitReg *view, gnc_numeric amount, Transaction *trans, Split *split, gboolean force)
{
GncTreeModelSplitReg *model;
XferDialog *xfer;
gboolean rate_split_ok, rate_reg_ok;
gnc_numeric rate_split, rate_reg, value;
Account *reg_acc;
gnc_commodity *xfer_comm = xaccAccountGetCommodity (xaccSplitGetAccount (split));
gnc_commodity *reg_comm = gnc_tree_view_split_reg_get_reg_commodity (view);
gnc_commodity *trans_curr = xaccTransGetCurrency (trans);
gboolean expanded;
gboolean have_rate = TRUE;
ENTER("handle_exchange_rate amount %s, trans %p and split %p force %d", gnc_numeric_to_string (amount), trans, split, force);
model = gnc_tree_view_split_reg_get_model_from_view (view);
reg_acc = gnc_tree_model_split_reg_get_anchor (model);
/* Rate from trans-curr to split-comm */
rate_split_ok = xaccTransGetRateForCommodity (trans, xfer_comm, split, &rate_split);
DEBUG("rate_split_ok %d and xfer_comm %s", rate_split_ok, gnc_commodity_get_fullname (xfer_comm));
/* Rate from trans-curr to reg-comm */
rate_reg_ok = xaccTransGetRateForCommodity (trans, reg_comm, split, &rate_reg);
DEBUG("rate_reg_ok %d and reg_comm %s", rate_reg_ok, gnc_commodity_get_fullname (reg_comm));
/* Are we expanded */
expanded = gnc_tree_view_split_reg_trans_expanded (view, trans);
if (gnc_commodity_equal (trans_curr, xfer_comm) && rate_split_ok)
{
xaccSplitSetAmount (split, amount);
xaccSplitSetValue (split, amount);
return TRUE;
}
if (rate_reg_ok && rate_split_ok && !force)
{
value = gnc_numeric_div (amount, rate_reg, gnc_commodity_get_fraction (trans_curr), GNC_HOW_DENOM_REDUCE);
amount = gnc_numeric_mul (value, rate_split, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND);
}
else
{
if (!rate_split_ok)
rate_split = gtu_split_reg_get_rate_from_db (reg_comm, xfer_comm);
/* create the exchange-rate dialog */
xfer = gnc_xfer_dialog (NULL, NULL);
gnc_xfer_dialog_is_exchange_dialog (xfer, &rate_split);
/* fill in the dialog entries */
gnc_xfer_dialog_set_description (xfer, xaccTransGetDescription (trans));
gnc_xfer_dialog_set_memo (xfer, xaccSplitGetMemo (split));
/* Get per book option */
gnc_xfer_dialog_set_num (xfer, gnc_get_num_action (trans, split));
gnc_xfer_dialog_set_date (xfer, timespecToTime64 (xaccTransRetDatePostedTS (trans)));
value = amount;
if (gnc_xfer_dialog_run_exchange_dialog (xfer, &rate_split, value, reg_acc, trans, xfer_comm, expanded))
{
if (!rate_split_ok)
rate_split = gnc_numeric_create (1, 1);
have_rate = FALSE;
}
else
have_rate = TRUE;
amount = gnc_numeric_mul (value, rate_split, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND);
}
xaccSplitSetAmount (split, amount);
xaccSplitSetValue (split, value);
LEAVE("handle_exchange_rate set split %p amt=%s; and val=%s", split, gnc_numeric_to_string (amount), gnc_numeric_to_string (value));
return have_rate;
}
/*###########################################################################*/
/* return TRUE if we have a RATE; return FALSE if we do not. */
gboolean
gnc_tree_util_split_reg_has_rate (GncTreeViewSplitReg *view)
{
GncTreeModelSplitReg *model;
model = gnc_tree_view_split_reg_get_model_from_view (view);
switch (model->type)
{
case BANK_REGISTER2:
case CASH_REGISTER2:
case ASSET_REGISTER2:
case CREDIT_REGISTER2:
case LIABILITY_REGISTER2:
case INCOME_REGISTER2:
case EXPENSE_REGISTER2:
case EQUITY_REGISTER2:
case TRADING_REGISTER2:
case GENERAL_LEDGER2:
case INCOME_LEDGER2:
case SEARCH_LEDGER2:
return TRUE;
case STOCK_REGISTER2:
case CURRENCY_REGISTER2:
case PORTFOLIO_LEDGER2:
case RECEIVABLE_REGISTER2:
case PAYABLE_REGISTER2:
default:
return FALSE;
}
}
/* Is this split part of a multi split transaction */
gboolean
gnc_tree_util_split_reg_is_multi (Split *split)
{
gboolean multi = FALSE;
Split *osplit;
if (!split)
return FALSE;
osplit = xaccSplitGetOtherSplit (split);
if (osplit)
multi = FALSE;
else
{
/* For multi-split transactions and stock splits,
* use a special value. */
osplit = xaccTransGetSplit (xaccSplitGetParent (split), 1);
if (osplit)
multi = TRUE;
else if (g_strcmp0 ("stock-split", xaccSplitGetType (split)) == 0)
multi = TRUE;
else
multi = FALSE;
}
return multi;
}
/* Return the string entry for transfer column and if multi */
const char *
gnc_tree_util_split_reg_get_transfer_entry (Split *split, gboolean *is_multi)
{
static char *name = NULL;
gboolean multi = FALSE;
Split *osplit;
if (is_multi)
*is_multi = multi;
if (!split)
return NULL;
osplit = xaccSplitGetOtherSplit (split);
g_free (name);
if (osplit)
name = gnc_get_account_name_for_register (xaccSplitGetAccount (osplit));
else
{
/* For multi-split transactions and stock splits,
* use a special value. */
osplit = xaccTransGetSplit (xaccSplitGetParent (split), 1);
if (osplit)
{
name = g_strdup (SPLIT_TRANS_STR);
multi = TRUE;
}
else if (g_strcmp0 ("stock-split", xaccSplitGetType (split)) == 0)
{
name = g_strdup (STOCK_SPLIT_STR);
multi = TRUE;
}
else
name = g_strdup ("");
}
if (is_multi)
*is_multi = multi;
return name;
}
/*###########################################################################*/
/* returns TRUE if you need to convert the split's value to the local
* (account) display currency. Returns FALSE if you can just use the
* split->value directly.
*/
gboolean
gnc_tree_util_split_reg_needs_conv_rate (GncTreeViewSplitReg *view,
Transaction *trans, Account *acc)
{
gnc_commodity *trans_cur, *acc_com;
/* If there is not a RATE_CELL, then don't do anything */
if (!gnc_tree_util_split_reg_has_rate (view))
return FALSE;
/* if txn->currency == acc->commodity, then return FALSE */
acc_com = xaccAccountGetCommodity (acc);
trans_cur = xaccTransGetCurrency (trans);
if (trans_cur && acc_com && gnc_commodity_equal (trans_cur, acc_com))
return FALSE;
return TRUE;
}
gboolean
gnc_tree_util_split_reg_needs_amount (GncTreeViewSplitReg *view, Split *split)
{
Transaction *txn = xaccSplitGetParent (split);
Account *acc = xaccSplitGetAccount (split);
return gnc_tree_util_split_reg_needs_conv_rate (view, txn, acc);
}
/*###########################################################################*/
gnc_numeric
gnc_tree_util_split_reg_get_value_for (GncTreeViewSplitReg *view, Transaction *trans, Split *split, gboolean is_blank)
{
gnc_numeric ret_num;
GNCPrintAmountInfo ret_print_info;
if (gnc_tree_util_split_reg_get_debcred_entry (view, trans, split, is_blank, &ret_num, &ret_print_info))
return ret_num;
else
return gnc_numeric_zero();
}
gboolean
gnc_tree_util_split_reg_get_debcred_entry (GncTreeViewSplitReg *view,
Transaction *trans, Split *split,
gboolean is_blank, gnc_numeric *ret_num,
GNCPrintAmountInfo *ret_print_info)
{
GncTreeModelSplitReg *model;
gnc_commodity *currency;
model = gnc_tree_view_split_reg_get_model_from_view (view);
currency = xaccTransGetCurrency (trans);
if (!currency)
currency = gnc_default_currency ();
if (is_blank)
{
gnc_numeric imbalance;
Account *acc;
imbalance = xaccTransGetImbalanceValue (trans);
if (gnc_numeric_zero_p (imbalance))
return FALSE;
if (xaccTransUseTradingAccounts (trans))
{
MonetaryList *imbal_list;
gnc_monetary *imbal_mon;
imbal_list = xaccTransGetImbalance (trans);
if (!imbal_list)
{
/* No commodity imbalance, there shouldn't be a value imablance. */
return FALSE;
}
if (imbal_list->next)
{
/* Multiple currency imbalance. */
gnc_monetary_list_free (imbal_list);
return FALSE;
}
imbal_mon = imbal_list->data;
if (!gnc_commodity_equal (gnc_monetary_commodity (*imbal_mon), currency))
{
/* Imbalance is in wrong currency */
gnc_monetary_list_free (imbal_list);
return FALSE;
}
if (!gnc_numeric_equal (gnc_monetary_value (*imbal_mon), imbalance))
{
/* Value and commodity imbalances differ */
gnc_monetary_list_free (imbal_list);
return FALSE;
}
/* Done with the imbalance list */
gnc_monetary_list_free (imbal_list);
}
imbalance = gnc_numeric_neg (imbalance);
acc = gnc_tree_model_split_reg_get_anchor (model);
if (gnc_tree_util_split_reg_needs_conv_rate (view, trans, acc))
{
imbalance = gnc_numeric_mul (imbalance,
xaccTransGetAccountConvRate (trans, acc),
gnc_commodity_get_fraction (currency),
GNC_HOW_RND_ROUND_HALF_UP);
}
else
{
imbalance = gnc_numeric_convert (imbalance,
gnc_commodity_get_fraction (currency),
GNC_HOW_RND_ROUND_HALF_UP);
}
*ret_num = imbalance;
*ret_print_info = gnc_account_print_info (acc, FALSE);
return TRUE;
}
{
gnc_numeric amount;
gnc_commodity *split_commodity;
GNCPrintAmountInfo print_info;
Account *account;
gnc_commodity *commodity;
account = gnc_tree_model_split_reg_get_anchor (model);
commodity = xaccAccountGetCommodity (account);
split_commodity = xaccAccountGetCommodity (xaccSplitGetAccount (split));
if (xaccTransUseTradingAccounts (trans))
{
gboolean use_symbol, is_current = FALSE;
Split *current_split = gnc_tree_view_split_reg_get_current_split (view);
RowDepth depth = gnc_tree_view_reg_get_selected_row_depth (view);
if ((split == current_split) && (depth == SPLIT3))
is_current = TRUE;
if (model->type == STOCK_REGISTER2 ||
model->type == CURRENCY_REGISTER2 ||
model->type == PORTFOLIO_LEDGER2)
{
gnc_commodity *amount_commodity;
/* security register. If this split has price and shares columns,
use the value, otherwise use the amount. */
if (gtu_split_reg_use_security (view))
{
amount = xaccSplitGetValue (split);
amount_commodity = currency;
}
else
{
amount = xaccSplitGetAmount (split);
amount_commodity = split_commodity;
}
/* Show the currency if it is not the default currency */
if (is_current ||
gnc_commodity_equiv (amount_commodity, gnc_default_currency ()))
use_symbol = FALSE;
else
use_symbol = TRUE;
print_info = gnc_commodity_print_info (amount_commodity, use_symbol);
}
else
{
/* non-security register, always use the split amount. */
amount = xaccSplitGetAmount (split);
if (is_current ||
gnc_commodity_equiv (split_commodity, commodity))
use_symbol = FALSE;
else
use_symbol = TRUE;
print_info = gnc_commodity_print_info (split_commodity, use_symbol);
}
}
else
{
/* If this account is not a stock/mutual/currency account, and
* currency != the account commodity, then use the SplitAmount
* instead of the SplitValue.
*/
switch (model->type)
{
case STOCK_REGISTER2:
case CURRENCY_REGISTER2:
case PORTFOLIO_LEDGER2:
amount = xaccSplitGetValue (split);
print_info = gnc_commodity_print_info (currency, FALSE);
break;
default:
if (commodity && !gnc_commodity_equal (commodity, currency))
/* Convert this to the "local" value */
amount = xaccSplitConvertAmount (split, account);
else
amount = xaccSplitGetValue (split);
print_info = gnc_account_print_info (account, FALSE);
break;
}
}
if (gnc_numeric_zero_p (amount))
return FALSE;
*ret_num = amount;
*ret_print_info = print_info;
return TRUE;
}
}
/*###########################################################################*/
void
gnc_tree_util_split_reg_set_value_for (GncTreeViewSplitReg *view, Transaction *trans, Split *split, gnc_numeric input, gboolean force)
{
GncTreeModelSplitReg *model;
GtkWidget *window;
Account *anchor;
Account *acct = xaccSplitGetAccount (split);
gnc_commodity *currency;
gnc_numeric value, amount, rate;
ENTER("set_value_for trans %p and split %p input %s force %d", trans, split, gnc_numeric_to_string (input), force);
currency = xaccTransGetCurrency (trans);
model = gnc_tree_view_split_reg_get_model_from_view (view);
anchor = gnc_tree_model_split_reg_get_anchor (model);
if (gnc_numeric_zero_p (input))
{
xaccSplitSetValue (split, input);
xaccSplitSetAmount (split, input);
LEAVE("input is zero");
return;
}
window = gnc_tree_view_split_reg_get_parent (view);
if (gtu_split_reg_needs_exchange_rate (view, trans, split))
{
if (gtu_split_reg_handle_exchange_rate (view, input, trans, split, force))
{
; //FIXME ??????
}
else
{
gnc_error_dialog (window, "%s",
_("Exchange Rate Canceled, using existing rate or default 1 to 1 rate if this is a new transaction."));
}
LEAVE("used exchange rate");
return;
}
gnc_tree_util_split_reg_save_amount_values (view, trans, split, input);
LEAVE(" ");
}
void
gnc_tree_util_split_reg_save_amount_values (GncTreeViewSplitReg *view, Transaction *trans, Split *split, gnc_numeric input)
{
GncTreeModelSplitReg *model;
Account *acc;
gnc_numeric new_amount, convrate, amtconv, value;
gnc_commodity *curr, *reg_com, *xfer_com;
Account *xfer_acc;
ENTER("View is %p, trans is %p, split is %p, input is %s", view, trans, split, gnc_numeric_to_string (input));
model = gnc_tree_view_split_reg_get_model_from_view (view);
new_amount = input;
acc = gnc_tree_model_split_reg_get_anchor (model);
xfer_acc = xaccSplitGetAccount (split);
xfer_com = xaccAccountGetCommodity (xfer_acc);
reg_com = xaccAccountGetCommodity (acc);
curr = xaccTransGetCurrency (trans);
if (!xaccTransGetRateForCommodity (trans, reg_com, NULL, &convrate))
convrate = gnc_numeric_create (100, 100);
amtconv = convrate;
if (gnc_tree_util_split_reg_needs_conv_rate (view, trans, acc))
{
/* If we are in an expanded register and the xfer_acc->comm !=
* reg_acc->comm then we need to compute the convrate here.
* Otherwise, we _can_ use the rate_cell!
*/
if (gnc_commodity_equal (reg_com, xfer_com))
amtconv = xaccTransGetAccountConvRate (trans, acc);
}
if (xaccTransUseTradingAccounts (trans))
{
/* Using currency accounts, the amount is probably really the
amount and not the value. */
gboolean is_amount;
if (model->type == STOCK_REGISTER2 ||
model->type == CURRENCY_REGISTER2 ||
model->type == PORTFOLIO_LEDGER2)
{
if (xaccAccountIsPriced (xfer_acc) ||
!gnc_commodity_is_iso (xaccAccountGetCommodity (xfer_acc)))
is_amount = FALSE;
else
is_amount = TRUE;
}
else
{
is_amount = TRUE;
}
if (is_amount)
{
xaccSplitSetAmount (split, new_amount);
if (gnc_tree_util_split_reg_needs_amount (view, split))
{
value = gnc_numeric_div (new_amount, amtconv,
gnc_commodity_get_fraction (curr),
GNC_HOW_RND_ROUND_HALF_UP);
xaccSplitSetValue (split, value);
}
else
xaccSplitSetValue (split, new_amount);
}
else
{
xaccSplitSetValue (split, new_amount);
}
LEAVE(" ");
return;
}
/* How to interpret new_amount depends on our view of this
* transaction. If we're sitting in an account with the same
* commodity as the transaction, then we can set the Value and then
* compute the amount. Otherwise we are setting the "converted
* value". This means we need to convert new_amount to the actual
* 'value' by dividing by the convrate in order to set the value.
*/
/* Now compute/set the split value. Amount is in the register
* currency but we need to convert to the txn currency.
*/
if (gnc_tree_util_split_reg_needs_conv_rate (view, trans, acc))
{
/* convert the amount to the Value ... */
value = gnc_numeric_div (new_amount, amtconv,
gnc_commodity_get_fraction (curr),
GNC_HOW_RND_ROUND_HALF_UP);
xaccSplitSetValue (split, value);
}
else
{
xaccSplitSetValue (split, new_amount);
}
/* Now re-compute the Amount from the Value. We may need to convert
* from the Value back to the amount here using the convrate from
* earlier.
*/
value = xaccSplitGetValue (split);
if (gnc_tree_util_split_reg_needs_amount (view, split))
{
acc = xaccSplitGetAccount (split);
new_amount = gnc_numeric_mul (value, convrate,
xaccAccountGetCommoditySCU (acc),
GNC_HOW_RND_ROUND_HALF_UP);
xaccSplitSetAmount (split, new_amount);
}
else
{
xaccSplitSetAmount (split, value);
}
LEAVE(" ");
}
/*###########################################################################*/
/*****************************************************************************/

View File

@@ -0,0 +1,71 @@
/********************************************************************\
* gnc-tree-util-split-reg.h -- GtkTreeView implementation *
* to display registers in a GtkTreeView. *
* *
* Copyright (C) 2006-2007 Chris Shoemaker <c.shoemaker@cox.net> *
* Copyright (C) 2012 Robert Fewell *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
#ifndef __GNC_TREE_UTIL_SPLIT_REG_H
#define __GNC_TREE_UTIL_SPLIT_REG_H
#include "gnc-tree-model-split-reg.h"
#include "gnc-tree-view-split-reg.h"
G_BEGIN_DECLS
/*****************************************************************************/
gboolean gnc_tree_util_split_reg_has_rate (GncTreeViewSplitReg *view);
gboolean gnc_tree_util_split_reg_needs_conv_rate (GncTreeViewSplitReg *view,
Transaction *trans, Account *acc);
const char * gnc_tree_util_split_reg_get_transfer_entry (Split *split, gboolean *is_multi);
gboolean gnc_tree_util_split_reg_is_multi (Split *split);
gboolean gnc_tree_util_split_reg_needs_amount (GncTreeViewSplitReg *view, Split *split);
void gnc_tree_util_split_reg_set_value_for (GncTreeViewSplitReg *view, Transaction *trans,
Split *split, gnc_numeric input, gboolean force);
void gnc_tree_util_split_reg_save_amount_values (GncTreeViewSplitReg *view, Transaction *trans,
Split *split, gnc_numeric input);
gnc_numeric gnc_tree_util_split_reg_get_value_for (GncTreeViewSplitReg *view, Transaction *trans,
Split *split, gboolean is_blank);
gboolean gnc_tree_util_split_reg_get_debcred_entry (GncTreeViewSplitReg *view,
Transaction *trans, Split *split,
gboolean is_blank,gnc_numeric *ret_num,
GNCPrintAmountInfo *ret_print_info);
/*****************************************************************************/
G_END_DECLS
#endif /* __GNC_TREE_UTIL_SPLIT_REG_H */

File diff suppressed because it is too large Load Diff

View File

@@ -87,23 +87,23 @@ typedef enum {
}RowDepth;
typedef enum {
COL_DATE, //0
COL_DUEDATE, //1
COL_NUMACT, //2
COL_DESCNOTES, //3
COL_TRANSVOID, //4
COL_RECN, //5
COL_TYPE, //6
COL_VALUE, //7
COL_AMOUNT, //8
COL_AMTVAL, //9
COL_RATE, //10
COL_PRICE, //11
COL_DEBIT, //12
COL_CREDIT, //13
COL_BALANCE, //14
COL_STATUS, //15
COL_COMM, //16
COL_DATE, //0
COL_DUEDATE, //1
COL_NUMACT, //2
COL_DESCNOTES, //3
COL_TRANSFERVOID, //4
COL_RECN, //5
COL_TYPE, //6
COL_VALUE, //7
COL_AMOUNT, //8
COL_AMTVAL, //9
COL_RATE, //10
COL_PRICE, //11
COL_DEBIT, //12
COL_CREDIT, //13
COL_BALANCE, //14
COL_STATUS, //15
COL_COMM, //16
} ViewCol;
/* Standard g_object type */
@@ -115,9 +115,9 @@ void gnc_tree_view_split_reg_block_selection (GncTreeViewSplitReg *view, gboolea
void gnc_tree_view_split_reg_default_selection (GncTreeViewSplitReg *view);
void gnc_tree_view_split_reg_set_read_only (GncTreeViewSplitReg *view, gboolean read_only);
gboolean gnc_tree_view_split_reg_set_format (GncTreeViewSplitReg *view);
void gnc_tree_view_split_reg_set_value_for (GncTreeViewSplitReg *view, Transaction *trans, Split *split, gnc_numeric input, gboolean force);
void gnc_tree_view_split_reg_set_read_only (GncTreeViewSplitReg *view, gboolean read_only);
void gnc_tree_view_split_reg_set_dirty_trans (GncTreeViewSplitReg *view, Transaction *trans);
@@ -129,6 +129,8 @@ Transaction * gnc_tree_view_split_reg_get_dirty_trans (GncTreeViewSplitReg *view
GtkTreePath * gnc_tree_view_split_reg_get_current_path (GncTreeViewSplitReg *view);
void gnc_tree_view_split_reg_set_current_path (GncTreeViewSplitReg *view, GtkTreePath *mpath);
RowDepth gnc_tree_view_reg_get_selected_row_depth (GncTreeViewSplitReg *view);
void gnc_tree_view_split_reg_moved_cb (GncTreeViewSplitReg *view, GFunc cb, gpointer cb_data);
@@ -145,6 +147,8 @@ void gnc_tree_view_split_reg_collapse_trans (GncTreeViewSplitReg *view, Transact
const char * gnc_tree_view_split_reg_get_credit_debit_string (GncTreeViewSplitReg *view, gboolean credit);
gnc_commodity * gnc_tree_view_split_reg_get_reg_commodity (GncTreeViewSplitReg *view);
/*************************************************************************************/
/* Get sort model path from the model path */
GtkTreePath * gnc_tree_view_split_reg_get_sort_path_from_model_path (GncTreeViewSplitReg *view, GtkTreePath *mpath);

View File

@@ -1120,7 +1120,10 @@ gnc_plugin_page_register2_create_widget (GncPluginPage *plugin_page)
gnc_ppr_update_date_filter (page, FALSE);
}
gnc_ledger_display2_refresh (priv->ledger);
// gnc_ledger_display2_refresh (priv->ledger);
/* This sets the default selection on load */
gnc_tree_view_split_reg_default_selection (view);
plugin_page->summarybar = gsr2_create_summary_bar(priv->gsr);
@@ -3041,8 +3044,6 @@ gnc_plugin_page_register2_cmd_style_changed (GtkAction *action,
value = gtk_radio_action_get_current_value (current);
gnc_split_reg2_change_style (priv->gsr, value);
gtk_tree_view_collapse_all (GTK_TREE_VIEW (gnc_ledger_display2_get_split_view_register (priv->ledger)));
gnc_plugin_page_register2_ui_update (NULL, plugin_page);
LEAVE(" ");
}
@@ -3058,10 +3059,10 @@ gnc_plugin_page_register2_cmd_style_double_line (GtkToggleAction *action,
ENTER("(action %p, plugin_page %p)", action, plugin_page);
g_return_if_fail(GTK_IS_ACTION(action));
g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(plugin_page));
g_return_if_fail (GTK_IS_ACTION(action));
g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (plugin_page));
priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(plugin_page);
priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (plugin_page);
model = gnc_ledger_display2_get_split_model_register (priv->ledger);
view = gnc_ledger_display2_get_split_view_register (priv->ledger);
@@ -3070,8 +3071,9 @@ gnc_plugin_page_register2_cmd_style_double_line (GtkToggleAction *action,
if (use_double_line != model->use_double_line)
{
gnc_tree_model_split_reg_config (model, model->type, model->style, use_double_line);
gtk_tree_view_collapse_all (GTK_TREE_VIEW(view));
gnc_ledger_display2_refresh (priv->ledger);
// This will re-display the view.
gnc_tree_view_split_reg_set_format (view);
}
LEAVE(" ");
}
@@ -3086,11 +3088,11 @@ gnc_plugin_page_register2_cmd_transfer (GtkAction *action,
ENTER("(action %p, plugin_page %p)", action, page);
g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(page));
g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
account = gnc_plugin_page_register2_get_account (page);
gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE (page)->window);
window = GTK_WIDGET(gnc_window_get_gtk_window(gnc_window));
gnc_window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
window = GTK_WIDGET (gnc_window_get_gtk_window (gnc_window));
gnc_xfer_dialog (window, account);
LEAVE(" ");
}
@@ -3728,29 +3730,26 @@ gnc_plugin_page_help_changed_cb (GNCSplitReg2 *gsr, GncPluginPageRegister2 *regi
}
static void
gnc_plugin_page_register2_refresh_cb (GHashTable *changes, gpointer user_data)
gnc_plugin_page_register2_refresh_cb (GHashTable *changes, gpointer user_data) //this works
{
GncPluginPageRegister2 *page = user_data;
GncPluginPageRegister2Private *priv;
GncTreeViewSplitReg *view;
// Not sure what this really is but it gets fired from preference changes.
//g_print("gnc_plugin_page_register2_refresh_cb\n");
g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER2 (page));
priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE (page);
view = gnc_ledger_display2_get_split_view_register (priv->ledger);
//g_print("gnc_plugin_page_register2_refresh_cb 0\n");
if (changes)
{
const EventInfo* ei;
//g_print("gnc_plugin_page_register2_refresh_cb 1\n");
ei = gnc_gui_get_entity_events(changes, &priv->key);
ei = gnc_gui_get_entity_events (changes, &priv->key);
if (ei)
{
if (ei->event_mask & QOF_EVENT_DESTROY)
{
gnc_main_window_close_page(GNC_PLUGIN_PAGE(page));
gnc_main_window_close_page (GNC_PLUGIN_PAGE (page));
return;
}
if (ei->event_mask & QOF_EVENT_MODIFY)
@@ -3760,10 +3759,8 @@ gnc_plugin_page_register2_refresh_cb (GHashTable *changes, gpointer user_data)
}
else
{
//g_print("gnc_plugin_page_register2_refresh_cb 2\n");
/* Force updates */
gnc_tree_view_split_reg_refresh_from_gconf (view);
gtk_widget_queue_draw (priv->widget);
}
gnc_plugin_page_register2_ui_update (NULL, page);
}

View File

@@ -271,10 +271,10 @@ gsr2_create_table (GNCSplitReg2 *gsr)
/* Restore the sort order from gconf */
sort_string = gnc_gconf_get_string (gconf_key, "sort_order", NULL);
if (g_strcmp0 ("ascending", sort_string) == 0)
view->sort_direction = 1;
else
if (g_strcmp0 ("descending", sort_string) == 0)
view->sort_direction = -1;
else
view->sort_direction = 1;
g_object_set (G_OBJECT (view), "gconf-section", gconf_key,
"show-column-menu", FALSE, NULL);
@@ -755,7 +755,9 @@ gnc_split_reg2_change_style (GNCSplitReg2 *gsr, SplitRegisterStyle2 style)
return;
gnc_tree_model_split_reg_config (model, model->type, style, model->use_double_line);
gnc_ledger_display2_refresh (gsr->ledger);
// This will re-display the view.
gnc_tree_view_split_reg_set_format (gnc_ledger_display2_get_split_view_register (gsr->ledger));
}
void
@@ -803,7 +805,9 @@ gnc_split_reg2_double_line_cb (GtkWidget *w, gpointer data)
return;
gnc_tree_model_split_reg_config (model, model->type, model->style, use_double_line);
gnc_ledger_display2_refresh (gsr->ledger);
// This will re-display the view.
gnc_tree_view_split_reg_set_format (gnc_ledger_display2_get_split_view_register (gsr->ledger));
}
static

View File

@@ -94,7 +94,7 @@ gnc_ledger_display2_internal (Account *lead_account, Query *q,
static void gnc_ledger_display2_refresh_internal (GNCLedgerDisplay2 *ld, GList *splits);
static void gnc_ledger_display2_refresh_cb (GncTreeModelSplitReg *model, gpointer user_data);
static void gnc_ledger_display2_refresh_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data);
/** Implementations *************************************************/
@@ -827,7 +827,7 @@ gnc_ledger_display2_internal (Account *lead_account, Query *q,
gnc_tree_model_split_reg_set_data (ld->model, ld, gnc_ledger_display2_parent);
// This sets up a call back for the search_ledger2 to reload after changes
g_signal_connect (G_OBJECT (ld->model), "refresh_view",
g_signal_connect (G_OBJECT (ld->model), "refresh_trans",
G_CALLBACK (gnc_ledger_display2_refresh_cb), ld );
splits = qof_query_run (ld->query);
@@ -890,18 +890,6 @@ gnc_ledger_display2_find_by_query (Query *q)
return ledger_display;
}
#ifdef skip
GNCLedgerDisplay2 *
gnc_ledger_display2_find_by_query (Query *q)
{
if (!q)
return NULL;
return gnc_find_first_gui_component (REGISTER_GL_CM_CLASS, find_by_query, q);
}
#endif
/********************************************************************\
* refresh only the indicated register window *
\********************************************************************/
@@ -1036,7 +1024,7 @@ gnc_ledger_display2_set_split_view_refresh (GNCLedgerDisplay2 *ld, gboolean ok)
/* This is used for the search_ledger2 reload after any changes made */
static void
gnc_ledger_display2_refresh_cb (GncTreeModelSplitReg *model, gpointer user_data)
gnc_ledger_display2_refresh_cb (GncTreeModelSplitReg *model, gpointer item, gpointer user_data)
{
GNCLedgerDisplay2 *ld = user_data;