diff --git a/src/MultiLedger.c b/src/MultiLedger.c index 91fdd7373e..77906e9335 100644 --- a/src/MultiLedger.c +++ b/src/MultiLedger.c @@ -145,7 +145,7 @@ xaccLedgerDisplaySimple (Account *account) return NULL; } - return xaccLedgerDisplayGeneral (account, NULL, reg_type, REG_SINGLE_LINE); + return xaccLedgerDisplayGeneral (account, NULL, reg_type, REG_STYLE_LEDGER); } static GList * @@ -236,7 +236,7 @@ xaccLedgerDisplayAccGroup (Account *account) } ledger_display = xaccLedgerDisplayGeneral (account, accounts, ledger_type, - REG_SINGLE_LINE); + REG_STYLE_LEDGER); g_list_free (accounts); @@ -406,7 +406,7 @@ xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts, /* xaccMallocSplitRegister will malloc & initialize the register, * but will not do the gui init */ - regData->ledger = xaccMallocSplitRegister (type, style, + regData->ledger = xaccMallocSplitRegister (type, style, FALSE, xaccSRGetEntryHandler, xaccSRGetFGColorHandler, xaccSRGetBGColorHandler, diff --git a/src/SplitLedger.c b/src/SplitLedger.c index 70e71a457b..a7c3b51ab2 100644 --- a/src/SplitLedger.c +++ b/src/SplitLedger.c @@ -297,7 +297,7 @@ xaccSRGetParent(SplitRegister *reg) if (info->get_parent == NULL) return NULL; - return (info->get_parent)(info->user_data); + return info->get_parent(info->user_data); } void @@ -307,7 +307,7 @@ xaccSRSetData(SplitRegister *reg, void *user_data, { SRInfo *info = xaccSRGetInfo(reg); - assert(reg != NULL); + g_return_if_fail (reg != NULL); info->user_data = user_data; info->get_parent = get_parent; @@ -689,6 +689,26 @@ sr_set_cell_fractions (SplitRegister *reg, Split *split) } } +static CellBlock * +sr_get_lead_cursor (SplitRegister *reg) +{ + switch (reg->style) + { + case REG_STYLE_LEDGER: + case REG_STYLE_AUTO_LEDGER: + return reg->use_double_line ? + reg->cursor_ledger_double : reg->cursor_ledger_single; + + case REG_STYLE_JOURNAL: + return reg->use_double_line ? + reg->cursor_journal_double : reg->cursor_journal_single; + } + + PWARN ("bad register style"); + + return NULL; +} + /* ======================================================== */ /* This callback gets called when the user clicks on the gui * in such a way as to leave the current virtual cursor, and @@ -723,6 +743,7 @@ LedgerMoveCursor (Table *table, VirtualLocation *p_new_virt_loc) Split *new_trans_split; Split *new_split; CursorClass new_class; + gboolean do_refresh; gboolean saved; PINFO ("start callback %d %d \n", @@ -754,6 +775,8 @@ LedgerMoveCursor (Table *table, VirtualLocation *p_new_virt_loc) new_class = info->cursor_hint_cursor_class; } + info->hint_set_by_traverse = FALSE; + /* commit the contents of the cursor into the database */ saved = xaccSRSaveRegEntry (reg, old_trans != new_trans); if ((pending_trans != NULL) && @@ -813,28 +836,42 @@ LedgerMoveCursor (Table *table, VirtualLocation *p_new_virt_loc) /* in the mult-line and dynamic modes, we need to hide the old * and show the new. */ - if (((REG_SINGLE_DYNAMIC == reg->style) || - (REG_DOUBLE_DYNAMIC == reg->style) || - (REG_MULTI_LINE == reg->style)) && + if (((REG_STYLE_AUTO_LEDGER == reg->style) || + (REG_STYLE_JOURNAL == reg->style)) && (old_trans_split != new_trans_split)) { - xaccSRSetTransVisible (reg, old_trans_split_loc, FALSE, - REG_MULTI_LINE == reg->style); + VirtualCellLocation vc_loc; - xaccSRSetTransVisible (reg, new_virt_loc.vcell_loc, TRUE, - REG_MULTI_LINE == reg->style); + vc_loc = old_trans_split_loc; + gnc_table_set_virt_cell_cursor (table, vc_loc, + sr_get_lead_cursor (reg)); + xaccSRSetTransVisible (reg, vc_loc, FALSE, + reg->style == REG_STYLE_JOURNAL); - gnc_table_refresh_gui (reg->table); + xaccSRGetTransSplit (reg, new_virt_loc.vcell_loc, &vc_loc); + gnc_table_set_virt_cell_cursor (table, vc_loc, + reg->use_double_line ? + reg->cursor_journal_double : + reg->cursor_journal_single); + xaccSRSetTransVisible (reg, vc_loc, TRUE, + reg->style == REG_STYLE_JOURNAL); + + gnc_table_find_close_valid_cell (table, p_new_virt_loc, FALSE); + + do_refresh = TRUE; } + else + do_refresh = FALSE; info->cursor_hint_trans = new_trans; info->cursor_hint_split = new_split; info->cursor_hint_trans_split = new_trans_split; info->cursor_hint_cursor_class = new_class; - info->hint_set_by_traverse = FALSE; - sr_set_cell_fractions (reg, new_split); + + if (do_refresh) + gnc_table_refresh_gui (reg->table); } /* This function determines if auto-completion is appropriate and, @@ -1380,7 +1417,6 @@ xaccSRGetSplitVirtLoc (SplitRegister *reg, Split *split, Table *table; int v_row; int v_col; - Split *s; if ((reg == NULL) || (split == NULL)) return FALSE; @@ -1394,8 +1430,17 @@ xaccSRGetSplitVirtLoc (SplitRegister *reg, Split *split, for (v_col = 0; v_col < table->num_virt_cols; v_col++) { VirtualCellLocation vc_loc = { v_row, v_col }; + VirtualCell *vcell; + Split *s; - s = sr_get_split (reg, vc_loc); + vcell = gnc_table_get_virtual_cell (table, vc_loc); + if (vcell == NULL) + continue; + + if (!vcell->visible) + continue; + + s = xaccSplitLookup (vcell->vcell_data); if (s == split) { @@ -3197,8 +3242,8 @@ xaccSRGetBGColorHandler (VirtualLocation virt_loc, gpointer user_data) case CURSOR_TYPE_HEADER: return reg_colors.header_bg_color; - case CURSOR_TYPE_TRANS: - case CURSOR_TYPE_SINGLE: + case CURSOR_TYPE_SINGLE_JOURNAL: + case CURSOR_TYPE_SINGLE_LEDGER: if (is_current) return vcell->start_primary_color ? reg_colors.primary_active_bg_color : @@ -3207,7 +3252,8 @@ xaccSRGetBGColorHandler (VirtualLocation virt_loc, gpointer user_data) return vcell->start_primary_color ? reg_colors.primary_bg_color : reg_colors.secondary_bg_color; - case CURSOR_TYPE_DOUBLE: + case CURSOR_TYPE_DOUBLE_LEDGER: + case CURSOR_TYPE_DOUBLE_JOURNAL: if (is_current) { if (reg_colors.double_alternate_virt) @@ -3250,6 +3296,7 @@ sr_add_transaction (SplitRegister *reg, CellBlock *lead_cursor, gboolean visible_splits, gboolean start_primary_color, + gboolean add_blank, Split *find_split, CursorClass find_class, int *new_split_row, @@ -3262,13 +3309,13 @@ sr_add_transaction (SplitRegister *reg, CellBlock *lead_cursor, gboolean visible_splits, gboolean start_primary_color, + gboolean add_blank, Split *find_split, CursorClass find_class, int *new_split_row, VirtualCellLocation *vcell_loc) { - Split *secondary; - int i = 0; + GList *node; if (split == find_split) *new_split_row = vcell_loc->virt_row; @@ -3277,25 +3324,24 @@ sr_add_transaction (SplitRegister *reg, TRUE, start_primary_color, *vcell_loc); vcell_loc->virt_row++; - do + for (node = xaccTransGetSplitList (trans); node; node = node->next) { - secondary = xaccTransGetSplit (trans, i++); - if (secondary == NULL) - break; + Split *secondary = node->data; - if (secondary != split) - { - if (secondary == find_split && find_class == CURSOR_CLASS_SPLIT) - *new_split_row = vcell_loc->virt_row; + if (secondary == find_split && find_class == CURSOR_CLASS_SPLIT) + *new_split_row = vcell_loc->virt_row; - gnc_table_set_vcell (reg->table, reg->split_cursor, - xaccSplitGetGUID (secondary), - visible_splits, TRUE, *vcell_loc); - vcell_loc->virt_row++; - } - } while (TRUE); + gnc_table_set_vcell (reg->table, reg->cursor_split, + xaccSplitGetGUID (secondary), + visible_splits, TRUE, *vcell_loc); + vcell_loc->virt_row++; + } - gnc_table_set_vcell (reg->table, reg->split_cursor, + if (!add_blank) + return; + + /* Add blank transaction split */ + gnc_table_set_vcell (reg->table, reg->cursor_split, xaccSplitGetGUID (NULL), FALSE, TRUE, *vcell_loc); vcell_loc->virt_row++; } @@ -3357,17 +3403,10 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, table = reg->table; - multi_line = (REG_MULTI_LINE == reg->style); - dynamic = ((REG_SINGLE_DYNAMIC == reg->style) || - (REG_DOUBLE_DYNAMIC == reg->style)); + multi_line = (reg->style == REG_STYLE_JOURNAL); + dynamic = (reg->style == REG_STYLE_AUTO_LEDGER); - if ((REG_SINGLE_LINE == reg->style) || - (REG_SINGLE_DYNAMIC == reg->style)) - lead_cursor = reg->single_cursor; - else if (REG_MULTI_LINE == reg->style) - lead_cursor = reg->trans_cursor; - else - lead_cursor = reg->double_cursor; + lead_cursor = sr_get_lead_cursor (reg); /* figure out where we are going to. */ find_trans = info->cursor_hint_trans; @@ -3407,7 +3446,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, /* make sure that the header is loaded */ vcell_loc.virt_row = 0; vcell_loc.virt_col = 0; - gnc_table_set_vcell (table, reg->header, NULL, TRUE, TRUE, vcell_loc); + gnc_table_set_vcell (table, reg->cursor_header, NULL, TRUE, TRUE, vcell_loc); vcell_loc.virt_row++; /* get the current time and reset the dividing row */ @@ -3476,7 +3515,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, new_trans_split_row = vcell_loc.virt_row; sr_add_transaction (reg, trans, split, lead_cursor, multi_line, - start_primary_color, find_split, find_class, + start_primary_color, TRUE, find_split, find_class, &new_split_row, &vcell_loc); if (!multi_line) @@ -3496,8 +3535,8 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, new_trans_split_row = vcell_loc.virt_row; sr_add_transaction (reg, trans, split, lead_cursor, multi_line, - start_primary_color, find_split, find_class, - &new_split_row, &vcell_loc); + start_primary_color, info->blank_split_edited, + find_split, find_class, &new_split_row, &vcell_loc); /* resize the table to the sizes we just counted above */ /* num_virt_cols is always one. */ @@ -3520,7 +3559,11 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, trans_split = xaccSRGetTransSplit (reg, save_loc.vcell_loc, &trans_split_loc.vcell_loc); if (dynamic || multi_line) + { + gnc_table_set_virt_cell_cursor (table, trans_split_loc.vcell_loc, + reg->cursor_journal_single); xaccSRSetTransVisible (reg, trans_split_loc.vcell_loc, TRUE, multi_line); + } else save_loc = trans_split_loc; diff --git a/src/engine/Transaction.c b/src/engine/Transaction.c index 7caef2b424..5e0cf13d86 100644 --- a/src/engine/Transaction.c +++ b/src/engine/Transaction.c @@ -1992,6 +1992,14 @@ xaccTransGetSplit (Transaction *trans, int i) return g_list_nth_data (trans->splits, i); } +GList * +xaccTransGetSplitList (Transaction *trans) +{ + if (!trans) return NULL; + + return trans->splits; +} + const char * xaccTransGetNum (Transaction *trans) { diff --git a/src/engine/Transaction.h b/src/engine/Transaction.h index c442a72450..6aa31512d1 100644 --- a/src/engine/Transaction.h +++ b/src/engine/Transaction.h @@ -203,6 +203,10 @@ void xaccSplitDestroy (Split *split); */ Split * xaccTransGetSplit (Transaction *trans, int i); +/* The xaccTransGetSplitList() method returns a GList of the splits + * in a transaction. This list must not be modified. */ +GList * xaccTransGetSplitList (Transaction *trans); + /* These routines return the Num (or ID field), the description, * and the date field. */ diff --git a/src/gnome/dialog-find-transactions.c b/src/gnome/dialog-find-transactions.c index 5ae1adedfd..d360db38b0 100644 --- a/src/gnome/dialog-find-transactions.c +++ b/src/gnome/dialog-find-transactions.c @@ -500,7 +500,7 @@ gnc_ui_find_transactions_dialog_ok_cb(GtkButton * button, new_ledger = TRUE; ftd->ledger = xaccLedgerDisplayGeneral(NULL, NULL, SEARCH_LEDGER, - REG_SINGLE_LINE); + REG_STYLE_JOURNAL); xaccFreeQuery(ftd->ledger->query); } diff --git a/src/gnome/window-register.c b/src/gnome/window-register.c index d01e801c59..31bc989756 100644 --- a/src/gnome/window-register.c +++ b/src/gnome/window-register.c @@ -261,23 +261,19 @@ gnc_register_jump_to_split_amount(RegWindow *regData, Split *split) static SplitRegisterStyle gnc_get_default_register_style() { - SplitRegisterStyle new_style = REG_SINGLE_LINE; + SplitRegisterStyle new_style = REG_STYLE_LEDGER; char *style_string; style_string = gnc_lookup_multichoice_option("Register", "Default Register Mode", - "single_line"); + "ledger"); - if (safe_strcmp(style_string, "single_line") == 0) - new_style = REG_SINGLE_LINE; - else if (safe_strcmp(style_string, "double_line") == 0) - new_style = REG_DOUBLE_LINE; - else if (safe_strcmp(style_string, "multi_line") == 0) - new_style = REG_MULTI_LINE; - else if (safe_strcmp(style_string, "auto_single") == 0) - new_style = REG_SINGLE_DYNAMIC; - else if (safe_strcmp(style_string, "auto_double") == 0) - new_style = REG_DOUBLE_DYNAMIC; + if (safe_strcmp(style_string, "ledger") == 0) + new_style = REG_STYLE_LEDGER; + else if (safe_strcmp(style_string, "auto_ledger") == 0) + new_style = REG_STYLE_AUTO_LEDGER; + else if (safe_strcmp(style_string, "journal") == 0) + new_style = REG_STYLE_JOURNAL; if (style_string != NULL) free(style_string); @@ -294,53 +290,54 @@ gnc_register_change_style(RegWindow *regData, SplitRegisterStyle style) if (style == reg->style) return; - xaccConfigSplitRegister(reg, reg->type, style); + xaccConfigSplitRegister(reg, reg->type, style, reg->use_double_line); regData->ledger->dirty = 1; xaccLedgerDisplayRefresh(regData->ledger); } static void -gnc_register_style_single_cb(GtkWidget *w, gpointer data) +gnc_register_style_ledger_cb(GtkWidget *w, gpointer data) { RegWindow *regData = data; - gnc_register_change_style(regData, REG_SINGLE_LINE); + gnc_register_change_style(regData, REG_STYLE_LEDGER); } static void -gnc_register_style_double_cb(GtkWidget *w, gpointer data) +gnc_register_style_auto_ledger_cb(GtkWidget *w, gpointer data) { RegWindow *regData = data; - gnc_register_change_style(regData, REG_DOUBLE_LINE); + gnc_register_change_style(regData, REG_STYLE_AUTO_LEDGER); } static void -gnc_register_style_multi_cb(GtkWidget *w, gpointer data) +gnc_register_style_journal_cb(GtkWidget *w, gpointer data) { RegWindow *regData = data; - gnc_register_change_style(regData, REG_MULTI_LINE); + gnc_register_change_style(regData, REG_STYLE_JOURNAL); } static void -gnc_register_style_auto_single_cb(GtkWidget *w, gpointer data) +gnc_register_double_line_cb (GtkWidget *w, gpointer data) { RegWindow *regData = data; + SplitRegister *reg = regData->ledger->ledger; + gboolean use_double_line; - gnc_register_change_style(regData, REG_SINGLE_DYNAMIC); + use_double_line = GTK_CHECK_MENU_ITEM(w)->active; + + if (use_double_line == reg->use_double_line) + return; + + xaccConfigSplitRegister(reg, reg->type, reg->style, use_double_line); + + regData->ledger->dirty = 1; + xaccLedgerDisplayRefresh(regData->ledger); } -static void -gnc_register_style_auto_double_cb(GtkWidget *w, gpointer data) -{ - RegWindow *regData = data; - - gnc_register_change_style(regData, REG_DOUBLE_DYNAMIC); -} - - static void gnc_register_sort(RegWindow *regData, sort_type_t sort_code) { @@ -350,7 +347,7 @@ gnc_register_sort(RegWindow *regData, sort_type_t sort_code) if (regData->sort_type == sort_code) return; - switch(sort_code) + switch (sort_code) { case BY_STANDARD: xaccQuerySetSortOrder(query, BY_STANDARD, BY_NONE, BY_NONE); @@ -1100,31 +1097,28 @@ gnc_register_create_menu_bar(RegWindow *regData, GtkWidget *statusbar) static GnomeUIInfo style_list[] = { - GNOMEUIINFO_RADIOITEM_DATA(N_("Single Line"), - N_("Show transactions on single lines"), - gnc_register_style_single_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Double Line"), - N_("Show transactions on two lines with " - "more information"), - gnc_register_style_double_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Multi Line"), - N_("Show transactions on multiple lines with " - "one line for each split"), - gnc_register_style_multi_cb, NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Auto Single"), - N_("Single line mode with a multi-line cursor"), - gnc_register_style_auto_single_cb, - NULL, NULL), - GNOMEUIINFO_RADIOITEM_DATA(N_("Auto Double"), - N_("Double line mode with a multi-line cursor"), - gnc_register_style_auto_double_cb, - NULL, NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("Ledger"), + N_("Show transactions on one or two lines"), + gnc_register_style_ledger_cb, NULL, NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("Auto Ledger"), + N_("Show transactions on one or two lines and " + "expand the current transaction"), + gnc_register_style_auto_ledger_cb, NULL, NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("Journal"), + N_("Show expanded transactions with all " + "splits"), + gnc_register_style_journal_cb, NULL, NULL), GNOMEUIINFO_END }; static GnomeUIInfo style_menu[] = { GNOMEUIINFO_RADIOLIST(style_list), + GNOMEUIINFO_SEPARATOR, + GNOMEUIINFO_TOGGLEITEM(N_("Double Line"), + N_("Show two lines of information for each " + "transaction"), + gnc_register_double_line_cb, NULL), GNOMEUIINFO_END }; @@ -1396,21 +1390,15 @@ gnc_register_create_menu_bar(RegWindow *regData, GtkWidget *statusbar) switch (gnc_get_default_register_style()) { default: - case REG_SINGLE_LINE: + case REG_STYLE_LEDGER: index = 0; break; - case REG_DOUBLE_LINE: + case REG_STYLE_AUTO_LEDGER: index = 1; break; - case REG_MULTI_LINE: + case REG_STYLE_JOURNAL: index = 2; break; - case REG_SINGLE_DYNAMIC: - index = 3; - break; - case REG_DOUBLE_DYNAMIC: - index = 4; - break; } widget = style_list[index].widget; @@ -1515,7 +1503,7 @@ gnc_register_record_cb(GnucashRegister *reg, gpointer data) SplitRegister *sr = regData->ledger->ledger; SplitRegisterStyle style = sr->style; - if ((style == REG_SINGLE_LINE) || (style == REG_DOUBLE_LINE)) + if (style == REG_STYLE_LEDGER) { Split *blank_split; @@ -1748,9 +1736,18 @@ regWindowLedger(xaccLedgerDisplay *ledger) popup, regData); } - /* be sure to initialize the gui elements associated with the cursor */ - xaccConfigSplitRegister(ledger->ledger, ledger->type, - gnc_get_default_register_style()); + { + gboolean use_double_line; + + use_double_line = gnc_lookup_boolean_option("Register", + "Double Line Mode", + FALSE); + + /* be sure to initialize the gui elements associated with the cursor */ + xaccConfigSplitRegister(ledger->ledger, ledger->type, + gnc_get_default_register_style(), + use_double_line); + } /* Allow grow, allow shrink, auto-shrink */ gtk_window_set_policy(GTK_WINDOW(register_window), TRUE, TRUE, TRUE); @@ -2400,8 +2397,7 @@ deleteCB(GtkWidget *widget, gpointer data) /* On a transaction cursor with 2 or fewer splits in single or double * mode, we just delete the whole transaction, kerblooie */ - if ((xaccTransCountSplits(trans) <= 2) && - ((style == REG_SINGLE_LINE) || (style == REG_DOUBLE_LINE))) + if ((xaccTransCountSplits(trans) <= 2) && (style == REG_STYLE_LEDGER)) { const char *message = _("Are you sure you want to delete the current " "transaction?"); diff --git a/src/register/gnome/gnucash-sheet.c b/src/register/gnome/gnucash-sheet.c index 00ad8529f3..aedb484b6f 100644 --- a/src/register/gnome/gnucash-sheet.c +++ b/src/register/gnome/gnucash-sheet.c @@ -68,15 +68,15 @@ static guint register_signals[LAST_SIGNAL]; void -gnucash_sheet_set_cursor (GnucashSheet *sheet, CellBlock *cursor, - CursorType cursor_type) +gnucash_sheet_set_cursor (GnucashSheet *sheet, CellBlock *cursor) { g_return_if_fail (sheet != NULL); g_return_if_fail (GNUCASH_IS_SHEET (sheet)); - g_return_if_fail (cursor_type >= 0); - g_return_if_fail (cursor_type < NUM_CURSOR_TYPES); + g_return_if_fail (cursor != NULL); + g_return_if_fail (cursor->cursor_type >= 0); + g_return_if_fail (cursor->cursor_type < NUM_CURSOR_TYPES); - sheet->cursors[cursor_type] = cursor; + sheet->cursors[cursor->cursor_type] = cursor; } void diff --git a/src/register/gnome/gnucash-sheet.h b/src/register/gnome/gnucash-sheet.h index dde966f7e8..08fcfc4154 100644 --- a/src/register/gnome/gnucash-sheet.h +++ b/src/register/gnome/gnucash-sheet.h @@ -168,8 +168,7 @@ void gnucash_sheet_compute_visible_range (GnucashSheet *sheet); void gnucash_sheet_make_cell_visible (GnucashSheet *sheet, VirtualLocation virt_loc); -void gnucash_sheet_set_cursor (GnucashSheet *sheet, CellBlock *cursor, - CursorType cursor_type); +void gnucash_sheet_set_cursor (GnucashSheet *sheet, CellBlock *cursor); void gnucash_sheet_update_adjustments (GnucashSheet *sheet); diff --git a/src/register/gnome/gnucash-style.c b/src/register/gnome/gnucash-style.c index 8858765fc6..19d9c211c6 100644 --- a/src/register/gnome/gnucash-style.c +++ b/src/register/gnome/gnucash-style.c @@ -50,13 +50,14 @@ style_get_key (SheetBlockStyle *style) { switch (style->cursor_type) { case CURSOR_TYPE_HEADER: - case CURSOR_TYPE_SINGLE: - case CURSOR_TYPE_TRANS: + case CURSOR_TYPE_SINGLE_LEDGER: + case CURSOR_TYPE_SINGLE_JOURNAL: case CURSOR_TYPE_SPLIT: return "singles"; break; - case CURSOR_TYPE_DOUBLE: + case CURSOR_TYPE_DOUBLE_LEDGER: + case CURSOR_TYPE_DOUBLE_JOURNAL: return "doubles"; break; diff --git a/src/register/splitreg.c b/src/register/splitreg.c index cdfd504655..f5d2d38bbc 100644 --- a/src/register/splitreg.c +++ b/src/register/splitreg.c @@ -100,27 +100,31 @@ static char *cell_sample_strings[] = N_("sample:Expenses:Automobile:Gasoline"+7), /* mxfrm cell */ }; -#define DATE_CELL_ALIGN CELL_ALIGN_RIGHT -#define NUM_CELL_ALIGN CELL_ALIGN_LEFT -#define ACTN_CELL_ALIGN CELL_ALIGN_LEFT -#define XFRM_CELL_ALIGN CELL_ALIGN_RIGHT -#define MXFRM_CELL_ALIGN CELL_ALIGN_RIGHT -#define XTO_CELL_ALIGN CELL_ALIGN_RIGHT -#define DESC_CELL_ALIGN CELL_ALIGN_LEFT -#define MEMO_CELL_ALIGN CELL_ALIGN_LEFT -#define RECN_CELL_ALIGN CELL_ALIGN_CENTER -#define DEBT_CELL_ALIGN CELL_ALIGN_RIGHT -#define CRED_CELL_ALIGN CELL_ALIGN_RIGHT -#define PRIC_CELL_ALIGN CELL_ALIGN_RIGHT -#define SHRS_CELL_ALIGN CELL_ALIGN_RIGHT -#define SHRBALN_CELL_ALIGN CELL_ALIGN_RIGHT -#define BALN_CELL_ALIGN CELL_ALIGN_RIGHT +static CellAlignment cell_alignments[] = +{ + CELL_ALIGN_RIGHT, /* date cell */ + CELL_ALIGN_LEFT, /* num cell */ + CELL_ALIGN_LEFT, /* desc cell */ + CELL_ALIGN_CENTER, /* recn cell */ + CELL_ALIGN_RIGHT, /* share balance cell */ + CELL_ALIGN_RIGHT, /* balance cell */ + CELL_ALIGN_LEFT, /* action cell */ + CELL_ALIGN_RIGHT, /* xfrm cell */ + CELL_ALIGN_RIGHT, /* xto cell */ + CELL_ALIGN_LEFT, /* memo cell */ + CELL_ALIGN_RIGHT, /* credit cell */ + CELL_ALIGN_RIGHT, /* debit cell */ + CELL_ALIGN_RIGHT, /* price cell */ + CELL_ALIGN_RIGHT, /* shares cell */ + CELL_ALIGN_RIGHT, /* mxfrm cell */ +}; static void xaccInitSplitRegister (SplitRegister *reg, SplitRegisterType type, SplitRegisterStyle style, + gboolean use_double_line, TableGetEntryHandler entry_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -297,47 +301,61 @@ configAction (SplitRegister *reg) /* ============================================== */ -#define SET(NAME,col,row,handler) \ -{ \ - BasicCell *hcell; \ - hcell = reg->header_cells[NAME##_CELL]; \ - \ - if ((0<=row) && (0<=col)) { \ - CellBlockCell *cb_cell; \ - \ - cb_cell = gnc_cellblock_get_cell (curs, row, col); \ - \ - cb_cell->cell = (handler); \ - cb_cell->cell_type = NAME##_CELL; \ - cb_cell->label = g_strdup (hcell->value); \ - cb_cell->sample_text = \ - g_strdup (_(cell_sample_strings[NAME##_CELL])); \ - cb_cell->alignment = NAME##_CELL_ALIGN; \ - cb_cell->expandable = \ - ((handler) == (BasicCell *) reg->descCell); \ - cb_cell->span = \ - ((handler) == (BasicCell *) reg->memoCell); \ - \ - cb_cell = gnc_cellblock_get_cell (header, row, col); \ - if (cb_cell && (curs == reg->single_cursor)) { \ - cb_cell->cell = hcell; \ - cb_cell->cell_type = NAME##_CELL; \ - cb_cell->label = g_strdup (hcell->value); \ - cb_cell->sample_text = \ - g_strdup (_(cell_sample_strings[NAME##_CELL])); \ - cb_cell->alignment = NAME##_CELL_ALIGN; \ - cb_cell->expandable = \ - ((handler) == (BasicCell *) reg->descCell); \ - cb_cell->span = \ - ((handler) == (BasicCell *) reg->memoCell); \ - } \ - } \ +static void +set_cell (SplitRegister *reg, CellBlock *cursor, + CellType cell_type, short row, short col) +{ + CellBlockCell *cb_cell; + BasicCell *hcell; + + hcell = reg->header_cells[cell_type]; + + cb_cell = gnc_cellblock_get_cell (cursor, row, col); + + cb_cell->cell = reg->cells[cell_type]; + cb_cell->cell_type = cell_type; + cb_cell->label = g_strdup (hcell->value); + cb_cell->sample_text = g_strdup (_(cell_sample_strings[cell_type])); + cb_cell->alignment = cell_alignments[cell_type]; + cb_cell->expandable = reg->cells[cell_type] == (BasicCell *) reg->descCell; + cb_cell->span = reg->cells[cell_type] == (BasicCell *) reg->memoCell; + + cb_cell = gnc_cellblock_get_cell (reg->cursor_header, row, col); + + if (cb_cell && (cursor == reg->cursor_ledger_single)) + { + cb_cell->cell = reg->cells[cell_type]; + cb_cell->cell_type = cell_type; + cb_cell->label = g_strdup (hcell->value); + cb_cell->sample_text = g_strdup (_(cell_sample_strings[cell_type])); + cb_cell->alignment = cell_alignments[cell_type]; + cb_cell->expandable = + reg->cells[cell_type] == (BasicCell *) reg->descCell; + cb_cell->span = reg->cells[cell_type] == (BasicCell *) reg->memoCell; + } } /* SET_CELL macro initializes cells in the register */ -#define SET_CELL(NAME,CN,col,row) { \ - SET (NAME, col, row, &(reg->CN##Cell->cell)); \ +#define SET_CELL(NAME,col,row) { \ + set_cell (reg, curs, NAME##_CELL, row, col); \ +} + +static void +copy_cursor_row (SplitRegister *reg, CellBlock *to, CellBlock *from, int row) +{ + int col; + + for (col = 0; col < from->num_cols; col++) + { + CellBlockCell *cb_cell; + + cb_cell = gnc_cellblock_get_cell (from, row, col); + if (cb_cell->cell_type < 0) + continue; + + set_cell (reg, to, cb_cell->cell_type, row, col); + } } /* ============================================== */ @@ -345,33 +363,36 @@ configAction (SplitRegister *reg) static void configLayout (SplitRegister *reg) { - CellBlock *curs, *header; + CellBlock *curs; int i; - /* define header for macros */ - header = reg->header; - /* fill things up with null cells */ - for (i=0; i < header->num_cols; i++) + for (i = 0; i < reg->cursor_header->num_cols; i++) { CellBlockCell *cb_cell; - cb_cell = gnc_cellblock_get_cell (header, 0, i); + cb_cell = gnc_cellblock_get_cell (reg->cursor_header, 0, i); cb_cell->cell = reg->nullCell; - cb_cell = gnc_cellblock_get_cell (reg->split_cursor, 0, i); + cb_cell = gnc_cellblock_get_cell (reg->cursor_ledger_single, 0, i); cb_cell->cell = reg->nullCell; - cb_cell = gnc_cellblock_get_cell (reg->trans_cursor, 0, i); + cb_cell = gnc_cellblock_get_cell (reg->cursor_ledger_double, 0, i); cb_cell->cell = reg->nullCell; - cb_cell = gnc_cellblock_get_cell (reg->single_cursor, 0, i); + cb_cell = gnc_cellblock_get_cell (reg->cursor_ledger_double, 1, i); cb_cell->cell = reg->nullCell; - cb_cell = gnc_cellblock_get_cell (reg->double_cursor, 0, i); + cb_cell = gnc_cellblock_get_cell (reg->cursor_journal_single, 0, i); cb_cell->cell = reg->nullCell; - cb_cell = gnc_cellblock_get_cell (reg->double_cursor, 1, i); + cb_cell = gnc_cellblock_get_cell (reg->cursor_journal_double, 0, i); + cb_cell->cell = reg->nullCell; + + cb_cell = gnc_cellblock_get_cell (reg->cursor_journal_double, 1, i); + cb_cell->cell = reg->nullCell; + + cb_cell = gnc_cellblock_get_cell (reg->cursor_split, 0, i); cb_cell->cell = reg->nullCell; } @@ -386,44 +407,42 @@ configLayout (SplitRegister *reg) case EXPENSE_REGISTER: case EQUITY_REGISTER: { - curs = reg->double_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (MXFRM, mxfrm, 3, 0); - SET_CELL (RECN, recn, 4, 0); - SET_CELL (DEBT, debit, 5, 0); - SET_CELL (CRED, credit, 6, 0); - SET_CELL (BALN, balance, 7, 0); + curs = reg->cursor_ledger_single; + SET_CELL (DATE, 0, 0); + SET_CELL (NUM, 1, 0); + SET_CELL (DESC, 2, 0); + SET_CELL (MXFRM, 3, 0); + SET_CELL (RECN, 4, 0); + SET_CELL (DEBT, 5, 0); + SET_CELL (CRED, 6, 0); + SET_CELL (BALN, 7, 0); - SET_CELL (ACTN, action, 1, 1); - SET_CELL (MEMO, memo, 2, 1); + curs = reg->cursor_ledger_double; + copy_cursor_row (reg, curs, reg->cursor_ledger_single, 0); - curs = reg->trans_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (RECN, recn, 4, 0); - SET_CELL (DEBT, debit, 5, 0); - SET_CELL (CRED, credit, 6, 0); - SET_CELL (BALN, balance, 7, 0); + SET_CELL (ACTN, 1, 1); + SET_CELL (MEMO, 2, 1); - curs = reg->split_cursor; - SET_CELL (ACTN, action, 1, 0); - SET_CELL (MEMO, memo, 2, 0); - SET_CELL (XFRM, xfrm, 3, 0); - SET_CELL (DEBT, debit, 5, 0); - SET_CELL (CRED, credit, 6, 0); + curs = reg->cursor_journal_single; + SET_CELL (DATE, 0, 0); + SET_CELL (NUM, 1, 0); + SET_CELL (DESC, 2, 0); + SET_CELL (RECN, 4, 0); + SET_CELL (DEBT, 5, 0); + SET_CELL (CRED, 6, 0); + SET_CELL (BALN, 7, 0); - curs = reg->single_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (MXFRM, mxfrm, 3, 0); - SET_CELL (RECN, recn, 4, 0); - SET_CELL (DEBT, debit, 5, 0); - SET_CELL (CRED, credit, 6, 0); - SET_CELL (BALN, balance, 7, 0); + curs = reg->cursor_journal_double; + copy_cursor_row (reg, curs, reg->cursor_journal_single, 0); + + SET_CELL (MEMO, 2, 1); + + curs = reg->cursor_split; + SET_CELL (ACTN, 1, 0); + SET_CELL (MEMO, 2, 0); + SET_CELL (XFRM, 3, 0); + SET_CELL (DEBT, 5, 0); + SET_CELL (CRED, 6, 0); break; } @@ -433,44 +452,42 @@ configLayout (SplitRegister *reg) case GENERAL_LEDGER: case SEARCH_LEDGER: { - curs = reg->double_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (XTO, xto, 3, 0); - SET_CELL (MXFRM, mxfrm, 4, 0); - SET_CELL (RECN, recn, 5, 0); - SET_CELL (DEBT, debit, 6, 0); - SET_CELL (CRED, credit, 7, 0); + curs = reg->cursor_ledger_single; + SET_CELL (DATE, 0, 0); + SET_CELL (NUM, 1, 0); + SET_CELL (DESC, 2, 0); + SET_CELL (XTO, 3, 0); + SET_CELL (MXFRM, 4, 0); + SET_CELL (RECN, 5, 0); + SET_CELL (DEBT, 6, 0); + SET_CELL (CRED, 7, 0); - SET_CELL (ACTN, action, 1, 1); - SET_CELL (MEMO, memo, 2, 1); + curs = reg->cursor_ledger_double; + copy_cursor_row (reg, curs, reg->cursor_ledger_single, 0); - curs = reg->trans_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (XTO, mxfrm, 3, 0); - SET_CELL (RECN, recn, 5, 0); - SET_CELL (DEBT, debit, 6, 0); - SET_CELL (CRED, credit, 7, 0); + SET_CELL (ACTN, 1, 1); + SET_CELL (MEMO, 2, 1); - curs = reg->split_cursor; - SET_CELL (ACTN, action, 1, 0); - SET_CELL (MEMO, memo, 2, 0); - SET_CELL (XFRM, xfrm, 4, 0); - SET_CELL (DEBT, debit, 6, 0); - SET_CELL (CRED, credit, 7, 0); + curs = reg->cursor_journal_single; + SET_CELL (DATE, 0, 0); + SET_CELL (NUM, 1, 0); + SET_CELL (DESC, 2, 0); + SET_CELL (XTO, 3, 0); + SET_CELL (RECN, 5, 0); + SET_CELL (DEBT, 6, 0); + SET_CELL (CRED, 7, 0); - curs = reg->single_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (XTO, xto, 3, 0); - SET_CELL (MXFRM, mxfrm, 4, 0); - SET_CELL (RECN, recn, 5, 0); - SET_CELL (DEBT, debit, 6, 0); - SET_CELL (CRED, credit, 7, 0); + curs = reg->cursor_journal_double; + copy_cursor_row (reg, curs, reg->cursor_journal_single, 0); + + SET_CELL (MEMO, 2, 1); + + curs = reg->cursor_split; + SET_CELL (ACTN, 1, 0); + SET_CELL (MEMO, 2, 0); + SET_CELL (XFRM, 4, 0); + SET_CELL (DEBT, 6, 0); + SET_CELL (CRED, 7, 0); break; } @@ -479,53 +496,48 @@ configLayout (SplitRegister *reg) case STOCK_REGISTER: case CURRENCY_REGISTER: { - curs = reg->double_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (MXFRM, mxfrm, 3, 0); - SET_CELL (RECN, recn, 4, 0); - SET_CELL (SHRS, shares, 5, 0); - SET_CELL (PRIC, price, 6, 0); - SET_CELL (DEBT, debit, 7, 0); - SET_CELL (CRED, credit, 8, 0); - SET_CELL (SHRBALN, shrbaln, 9, 0); - SET_CELL (BALN, balance, 10, 0); + curs = reg->cursor_ledger_single; + SET_CELL (DATE, 0, 0); + SET_CELL (NUM, 1, 0); + SET_CELL (DESC, 2, 0); + SET_CELL (MXFRM, 3, 0); + SET_CELL (RECN, 4, 0); + SET_CELL (SHRS, 5, 0); + SET_CELL (PRIC, 6, 0); + SET_CELL (DEBT, 7, 0); + SET_CELL (CRED, 8, 0); + SET_CELL (SHRBALN, 9, 0); + SET_CELL (BALN, 10, 0); - SET_CELL (ACTN, action, 1, 1); - SET_CELL (MEMO, memo, 2, 1); + curs = reg->cursor_ledger_double; + copy_cursor_row (reg, curs, reg->cursor_ledger_single, 0); - curs = reg->trans_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (RECN, recn, 4, 0); - SET_CELL (SHRS, shares, 5, 0); - SET_CELL (PRIC, price, 6, 0); - SET_CELL (DEBT, debit, 7, 0); - SET_CELL (CRED, credit, 8, 0); - SET_CELL (SHRBALN, shrbaln, 9, 0); - SET_CELL (BALN, balance, 10, 0); + SET_CELL (ACTN, 1, 1); + SET_CELL (MEMO, 2, 1); - curs = reg->split_cursor; - SET_CELL (ACTN, action, 1, 0); - SET_CELL (MEMO, memo, 2, 0); - SET_CELL (XFRM, xfrm, 3, 0); - SET_CELL (DEBT, debit, 7, 0); - SET_CELL (CRED, credit, 8, 0); + curs = reg->cursor_journal_single; + SET_CELL (DATE, 0, 0); + SET_CELL (NUM, 1, 0); + SET_CELL (DESC, 2, 0); + SET_CELL (RECN, 4, 0); + SET_CELL (SHRS, 5, 0); + SET_CELL (PRIC, 6, 0); + SET_CELL (DEBT, 7, 0); + SET_CELL (CRED, 8, 0); + SET_CELL (SHRBALN, 9, 0); + SET_CELL (BALN, 10, 0); - curs = reg->single_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (MXFRM, mxfrm, 3, 0); - SET_CELL (RECN, recn, 4, 0); - SET_CELL (SHRS, shares, 5, 0); - SET_CELL (PRIC, price, 6, 0); - SET_CELL (DEBT, debit, 7, 0); - SET_CELL (CRED, credit, 8, 0); - SET_CELL (SHRBALN, shrbaln, 9, 0); - SET_CELL (BALN, balance, 10, 0); + curs = reg->cursor_journal_double; + copy_cursor_row (reg, curs, reg->cursor_journal_single, 0); + + SET_CELL (MEMO, 2, 1); + + curs = reg->cursor_split; + SET_CELL (ACTN, 1, 0); + SET_CELL (MEMO, 2, 0); + SET_CELL (XFRM, 3, 0); + SET_CELL (DEBT, 7, 0); + SET_CELL (CRED, 8, 0); break; } @@ -533,53 +545,48 @@ configLayout (SplitRegister *reg) /* --------------------------------------------------------- */ case PORTFOLIO_LEDGER: { - curs = reg->double_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (XTO, xto, 3, 0); - SET_CELL (MXFRM, mxfrm, 4, 0); - SET_CELL (RECN, recn, 5, 0); - SET_CELL (SHRS, shares, 6, 0); - SET_CELL (PRIC, price, 7, 0); - SET_CELL (DEBT, debit, 8, 0); - SET_CELL (CRED, credit, 9, 0); - SET_CELL (SHRBALN, shrbaln, 10, 0); + curs = reg->cursor_ledger_single; + SET_CELL (DATE, 0, 0); + SET_CELL (NUM, 1, 0); + SET_CELL (DESC, 2, 0); + SET_CELL (XTO, 3, 0); + SET_CELL (MXFRM, 4, 0); + SET_CELL (RECN, 5, 0); + SET_CELL (SHRS, 6, 0); + SET_CELL (PRIC, 7, 0); + SET_CELL (DEBT, 8, 0); + SET_CELL (CRED, 9, 0); + SET_CELL (SHRBALN, 10, 0); - SET_CELL (ACTN, action, 1, 1); - SET_CELL (MEMO, memo, 2, 1); + curs = reg->cursor_ledger_double; + copy_cursor_row (reg, curs, reg->cursor_ledger_single, 0); - curs = reg->trans_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (XTO, mxfrm, 3, 0); - SET_CELL (RECN, recn, 5, 0); - SET_CELL (SHRS, shares, 6, 0); - SET_CELL (PRIC, price, 7, 0); - SET_CELL (DEBT, debit, 8, 0); - SET_CELL (CRED, credit, 9, 0); - SET_CELL (SHRBALN, shrbaln, 10, 0); + SET_CELL (ACTN, 1, 1); + SET_CELL (MEMO, 2, 1); - curs = reg->split_cursor; - SET_CELL (ACTN, action, 1, 0); - SET_CELL (MEMO, memo, 2, 0); - SET_CELL (XFRM, xfrm, 4, 0); - SET_CELL (DEBT, debit, 8, 0); - SET_CELL (CRED, credit, 9, 0); + curs = reg->cursor_journal_single; + SET_CELL (DATE, 0, 0); + SET_CELL (NUM, 1, 0); + SET_CELL (DESC, 2, 0); + SET_CELL (XTO, 3, 0); + SET_CELL (RECN, 5, 0); + SET_CELL (SHRS, 6, 0); + SET_CELL (PRIC, 7, 0); + SET_CELL (DEBT, 8, 0); + SET_CELL (CRED, 9, 0); + SET_CELL (SHRBALN, 10, 0); - curs = reg->single_cursor; - SET_CELL (DATE, date, 0, 0); - SET_CELL (NUM, num, 1, 0); - SET_CELL (DESC, desc, 2, 0); - SET_CELL (XTO, xto, 3, 0); - SET_CELL (MXFRM, mxfrm, 4, 0); - SET_CELL (RECN, recn, 5, 0); - SET_CELL (SHRS, shares, 6, 0); - SET_CELL (PRIC, price, 7, 0); - SET_CELL (DEBT, debit, 8, 0); - SET_CELL (CRED, credit, 9, 0); - SET_CELL (SHRBALN, shrbaln, 10, 0); + curs = reg->cursor_journal_double; + copy_cursor_row (reg, curs, reg->cursor_journal_single, 0); + + SET_CELL (MEMO, 2, 1); + + curs = reg->cursor_split; + SET_CELL (ACTN, 1, 0); + SET_CELL (MEMO, 2, 0); + SET_CELL (XFRM, 4, 0); + SET_CELL (DEBT, 8, 0); + SET_CELL (CRED, 9, 0); break; } @@ -596,6 +603,7 @@ configLayout (SplitRegister *reg) SplitRegister * xaccMallocSplitRegister (SplitRegisterType type, SplitRegisterStyle style, + gboolean use_double_line, TableGetEntryHandler entry_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -607,7 +615,7 @@ xaccMallocSplitRegister (SplitRegisterType type, reg = g_new0(SplitRegister, 1); - xaccInitSplitRegister (reg, type, style, + xaccInitSplitRegister (reg, type, style, use_double_line, entry_handler, fg_color_handler, bg_color_handler, allocator, deallocator, copy); @@ -621,7 +629,8 @@ mallocCursors (SplitRegister *reg) { int num_cols; - switch (reg->type) { + switch (reg->type) + { case BANK_REGISTER: case CASH_REGISTER: case ASSET_REGISTER: @@ -654,33 +663,35 @@ mallocCursors (SplitRegister *reg) return; } - reg->header = gnc_cellblock_new (1, num_cols, CURSOR_TYPE_HEADER); + reg->cursor_header = gnc_cellblock_new (1, num_cols, CURSOR_TYPE_HEADER); - /* cursors used in the single & double line displays */ - reg->single_cursor = gnc_cellblock_new (1, num_cols, CURSOR_TYPE_SINGLE); - reg->double_cursor = gnc_cellblock_new (2, num_cols, CURSOR_TYPE_DOUBLE); + /* cursors used in ledger mode */ + reg->cursor_ledger_single = + gnc_cellblock_new (1, num_cols, CURSOR_TYPE_SINGLE_LEDGER); + reg->cursor_ledger_double = + gnc_cellblock_new (2, num_cols, CURSOR_TYPE_DOUBLE_LEDGER); - /* the two cursors used for multi-line and dynamic displays */ - reg->trans_cursor = gnc_cellblock_new (1, num_cols, CURSOR_TYPE_TRANS); - reg->split_cursor = gnc_cellblock_new (1, num_cols, CURSOR_TYPE_SPLIT); + /* cursors used for journal mode */ + reg->cursor_journal_single = + gnc_cellblock_new (1, num_cols, CURSOR_TYPE_SINGLE_JOURNAL); + reg->cursor_journal_double = + gnc_cellblock_new (2, num_cols, CURSOR_TYPE_DOUBLE_JOURNAL); + + reg->cursor_split = + gnc_cellblock_new (1, num_cols, CURSOR_TYPE_SPLIT); } /* ============================================== */ -#define HDR(NAME) \ -{ \ - BasicCell *hcell; \ - hcell = xaccMallocTextCell(); \ - reg->header_cells[NAME##_CELL] = hcell; \ -} - -#define NEW(CN,TYPE) \ +#define NEW(NAME, CN, TYPE) \ reg->CN##Cell = xaccMalloc##TYPE##Cell(); \ + reg->cells[NAME##_CELL] = (BasicCell *) reg->CN##Cell; static void xaccInitSplitRegister (SplitRegister *reg, SplitRegisterType type, SplitRegisterStyle style, + gboolean use_double_line, TableGetEntryHandler entry_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -693,8 +704,10 @@ xaccInitSplitRegister (SplitRegister *reg, reg->table = NULL; reg->user_data = NULL; reg->destroy = NULL; + reg->type = type; reg->style = style; + reg->use_double_line = use_double_line; /* --------------------------- */ /* define the number of columns in the display, malloc the cursors */ @@ -702,42 +715,34 @@ xaccInitSplitRegister (SplitRegister *reg, /* --------------------------- */ /* malloc the header (label) cells */ - HDR (DATE); - HDR (NUM); - HDR (ACTN); - HDR (XFRM); - HDR (MXFRM); - HDR (XTO); - HDR (DESC); - HDR (MEMO); - HDR (RECN); - HDR (CRED); - HDR (DEBT); - HDR (PRIC); - HDR (SHRS); - HDR (SHRBALN); - HDR (BALN); + { + int i; + + for (i = 0; i < CELL_TYPE_COUNT; i++) + reg->header_cells[i] = xaccMallocTextCell (); + } /* --------------------------- */ /* malloc the workhorse cells */ - NEW (null, Basic); - NEW (date, Date); - NEW (num, Num); - NEW (desc, QuickFill); - NEW (recn, Recn); - NEW (shrbaln, Price); - NEW (balance, Price); + reg->nullCell = xaccMallocBasicCell (); - NEW (xfrm, Combo); - NEW (mxfrm, Combo); - NEW (xto, Combo); - NEW (action, Combo); - NEW (memo, QuickFill); - NEW (credit, Price); - NEW (debit, Price); - NEW (price, Price); - NEW (shares, Price); + NEW (DATE, date, Date); + NEW (NUM, num, Num); + NEW (DESC, desc, QuickFill); + NEW (RECN, recn, Recn); + NEW (SHRBALN, shrbaln, Price); + NEW (BALN, balance, Price); + + NEW (XFRM, xfrm, Combo); + NEW (MXFRM, mxfrm, Combo); + NEW (XTO, xto, Combo); + NEW (ACTN, action, Combo); + NEW (MEMO, memo, QuickFill); + NEW (CRED, credit, Price); + NEW (DEBT, debit, Price); + NEW (PRIC, price, Price); + NEW (SHRS, shares, Price); /* --------------------------- */ /* configLabels merely puts strings into the label cells @@ -849,7 +854,8 @@ xaccInitSplitRegister (SplitRegister *reg, { VirtualCellLocation vcell_loc = { 0, 0 }; - gnc_table_set_vcell (table, reg->header, NULL, TRUE, TRUE, vcell_loc); + gnc_table_set_vcell (table, reg->cursor_header, + NULL, TRUE, TRUE, vcell_loc); } /* Set up first and only initial row */ @@ -861,8 +867,8 @@ xaccInitSplitRegister (SplitRegister *reg, vloc.phys_row_offset = 0; vloc.phys_col_offset = 0; - gnc_table_set_vcell (table, reg->single_cursor, NULL, TRUE, TRUE, - vloc.vcell_loc); + gnc_table_set_vcell (table, reg->cursor_ledger_single, + NULL, TRUE, TRUE, vloc.vcell_loc); gnc_table_move_cursor (table, vloc); } @@ -874,19 +880,22 @@ xaccInitSplitRegister (SplitRegister *reg, void xaccConfigSplitRegister (SplitRegister *reg, SplitRegisterType newtype, - SplitRegisterStyle newstyle) + SplitRegisterStyle newstyle, + gboolean use_double_line) { if (!reg) return; reg->type = newtype; reg->style = newstyle; + reg->use_double_line = use_double_line; /* Make sure that any GUI elements associated with this reconfig * are properly initialized. */ - gnc_table_create_cursor (reg->table, reg->single_cursor); - gnc_table_create_cursor (reg->table, reg->double_cursor); - gnc_table_create_cursor (reg->table, reg->trans_cursor); - gnc_table_create_cursor (reg->table, reg->split_cursor); + gnc_table_create_cursor (reg->table, reg->cursor_ledger_single); + gnc_table_create_cursor (reg->table, reg->cursor_ledger_double); + gnc_table_create_cursor (reg->table, reg->cursor_journal_single); + gnc_table_create_cursor (reg->table, reg->cursor_journal_double); + gnc_table_create_cursor (reg->table, reg->cursor_split); } /* ============================================== */ @@ -906,17 +915,19 @@ xaccDestroySplitRegister (SplitRegister *reg) gnc_table_destroy (reg->table); reg->table = NULL; - gnc_cellblock_destroy (reg->header); - gnc_cellblock_destroy (reg->single_cursor); - gnc_cellblock_destroy (reg->double_cursor); - gnc_cellblock_destroy (reg->trans_cursor); - gnc_cellblock_destroy (reg->split_cursor); + gnc_cellblock_destroy (reg->cursor_header); + gnc_cellblock_destroy (reg->cursor_ledger_single); + gnc_cellblock_destroy (reg->cursor_ledger_double); + gnc_cellblock_destroy (reg->cursor_journal_single); + gnc_cellblock_destroy (reg->cursor_journal_double); + gnc_cellblock_destroy (reg->cursor_split); - reg->header = NULL; - reg->single_cursor = NULL; - reg->double_cursor = NULL; - reg->trans_cursor = NULL; - reg->split_cursor = NULL; + reg->cursor_header = NULL; + reg->cursor_ledger_single = NULL; + reg->cursor_ledger_double = NULL; + reg->cursor_journal_single = NULL; + reg->cursor_journal_double = NULL; + reg->cursor_split = NULL; xaccDestroyDateCell (reg->dateCell); xaccDestroyNumCell (reg->numCell); @@ -1021,12 +1032,13 @@ sr_cellblock_cursor_class(SplitRegister *reg, CellBlock *cursor) if (cursor == NULL) return CURSOR_CLASS_NONE; - if ((cursor == reg->single_cursor) || - (cursor == reg->double_cursor) || - (cursor == reg->trans_cursor)) + if ((cursor == reg->cursor_ledger_single) || + (cursor == reg->cursor_ledger_double) || + (cursor == reg->cursor_journal_single) || + (cursor == reg->cursor_journal_double)) return CURSOR_CLASS_TRANS; - if (cursor == reg->split_cursor) + if (cursor == reg->cursor_split) return CURSOR_CLASS_SPLIT; return CURSOR_CLASS_NONE; diff --git a/src/register/splitreg.h b/src/register/splitreg.h index f4314b74fd..67e9800a48 100644 --- a/src/register/splitreg.h +++ b/src/register/splitreg.h @@ -52,26 +52,26 @@ #include "recncell.h" #include "table-allgui.h" -/* defined register types */ -/* "registers" are single-account display windows. +/* defined register types. + * "registers" are single-account display windows. * "ledgers" are multiple-account display windows */ typedef enum { - BANK_REGISTER = 1, - CASH_REGISTER = 2, - ASSET_REGISTER = 3, - CREDIT_REGISTER = 4, - LIABILITY_REGISTER = 5, - INCOME_REGISTER = 6, - EXPENSE_REGISTER = 7, - EQUITY_REGISTER = 8, - STOCK_REGISTER = 9, - CURRENCY_REGISTER = 10, + BANK_REGISTER, + CASH_REGISTER, + ASSET_REGISTER, + CREDIT_REGISTER, + LIABILITY_REGISTER, + INCOME_REGISTER, + EXPENSE_REGISTER, + EQUITY_REGISTER, + STOCK_REGISTER, + CURRENCY_REGISTER, - GENERAL_LEDGER = 11, - INCOME_LEDGER = 12, - PORTFOLIO_LEDGER = 13, - SEARCH_LEDGER = 14 + GENERAL_LEDGER, + INCOME_LEDGER, + PORTFOLIO_LEDGER, + SEARCH_LEDGER } SplitRegisterType; /* These values are used to identify the cells in the register. */ @@ -93,10 +93,7 @@ typedef enum DEBT_CELL, PRIC_CELL, SHRS_CELL, - - /* MXFRM is the "mirrored" transfer-from account */ - MXFRM_CELL, - + MXFRM_CELL, /* MXFRM is the "mirrored" transfer-from account */ CELL_TYPE_COUNT } CellType; @@ -112,11 +109,9 @@ typedef enum */ typedef enum { - REG_SINGLE_LINE = 1, - REG_DOUBLE_LINE = 2, - REG_MULTI_LINE = 3, - REG_SINGLE_DYNAMIC = 4, - REG_DOUBLE_DYNAMIC = 5 + REG_STYLE_LEDGER, + REG_STYLE_AUTO_LEDGER, + REG_STYLE_JOURNAL } SplitRegisterStyle; /* modified flags -- indicate which cell values have been modified by user */ @@ -125,7 +120,6 @@ typedef enum #define MOD_NUM 0x0002 #define MOD_DESC 0x0004 #define MOD_RECN 0x0008 - #define MOD_ACTN 0x0010 #define MOD_XFRM 0x0020 #define MOD_MXFRM 0x0040 @@ -134,8 +128,7 @@ typedef enum #define MOD_AMNT 0x0200 #define MOD_PRIC 0x0400 #define MOD_SHRS 0x0800 -#define MOD_NEW 0x1000 -#define MOD_ALL 0x1fff +#define MOD_ALL 0xffff /* Types of cursors */ typedef enum @@ -150,9 +143,10 @@ typedef enum { CURSOR_TYPE_NONE = -1, CURSOR_TYPE_HEADER, - CURSOR_TYPE_SINGLE, - CURSOR_TYPE_DOUBLE, - CURSOR_TYPE_TRANS, + CURSOR_TYPE_SINGLE_LEDGER, + CURSOR_TYPE_DOUBLE_LEDGER, + CURSOR_TYPE_SINGLE_JOURNAL, + CURSOR_TYPE_DOUBLE_JOURNAL, CURSOR_TYPE_SPLIT, NUM_CURSOR_TYPES } CursorType; @@ -167,12 +161,15 @@ struct _SplitRegister /* the table itself that implements the underlying GUI. */ Table * table; - /* the cursors that define the currently edited row */ - CellBlock * single_cursor; - CellBlock * double_cursor; - CellBlock * trans_cursor; - CellBlock * split_cursor; - CellBlock * header; + /* the cursors that define the register structure */ + CellBlock * cursor_header; + CellBlock * cursor_ledger_single; + CellBlock * cursor_ledger_double; + CellBlock * cursor_journal_single; + CellBlock * cursor_journal_double; + CellBlock * cursor_split; + + BasicCell * nullCell; DateCell * dateCell; NumCell * numCell; @@ -180,24 +177,24 @@ struct _SplitRegister RecnCell * recnCell; /* main transaction line reconcile */ PriceCell * shrbalnCell; PriceCell * balanceCell; - BasicCell * nullCell; - ComboCell * actionCell; ComboCell * xfrmCell; - ComboCell * mxfrmCell; ComboCell * xtoCell; QuickFillCell * memoCell; PriceCell * creditCell; PriceCell * debitCell; PriceCell * priceCell; PriceCell * sharesCell; + ComboCell * mxfrmCell; SplitRegisterType type; SplitRegisterStyle style; + gboolean use_double_line; /* some private data; outsiders should not access this */ BasicCell *header_cells[CELL_TYPE_COUNT]; + BasicCell *cells[CELL_TYPE_COUNT]; /* user_data allows users of this object to hang * private data onto it */ @@ -217,6 +214,7 @@ void xaccSplitRegisterSetCreditStringGetter(SRStringGetter getter); SplitRegister * xaccMallocSplitRegister (SplitRegisterType type, SplitRegisterStyle style, + gboolean use_double_line, TableGetEntryHandler entry_handler, TableGetFGColorHandler fg_color_handler, TableGetBGColorHandler bg_color_handler, @@ -226,7 +224,8 @@ xaccMallocSplitRegister (SplitRegisterType type, void xaccConfigSplitRegister (SplitRegister *reg, SplitRegisterType type, - SplitRegisterStyle style); + SplitRegisterStyle style, + gboolean use_double_line); void xaccDestroySplitRegister (SplitRegister *reg); diff --git a/src/register/table-allgui.c b/src/register/table-allgui.c index f12b66602d..024277fe7c 100644 --- a/src/register/table-allgui.c +++ b/src/register/table-allgui.c @@ -865,11 +865,9 @@ gnc_table_enter_update(Table *table, /* ==================================================== */ -const char * -gnc_table_leave_update(Table *table, - VirtualLocation virt_loc) +void +gnc_table_leave_update(Table *table, VirtualLocation virt_loc) { - const char *retval; gboolean changed = FALSE; CellLeaveFunc leave; CellBlockCell *cb_cell; @@ -893,6 +891,9 @@ gnc_table_leave_update(Table *table, /* OK, if there is a callback for this cell, call it */ cb_cell = gnc_cellblock_get_cell (cb, cell_row, cell_col); + if (!cb_cell || !cb_cell->cell) + return; + cell = cb_cell->cell; leave = cell->leave_cell; @@ -912,15 +913,6 @@ gnc_table_leave_update(Table *table, g_free (old_value); } - - if (changed) - retval = cell->value; - else - retval = NULL; - - LEAVE("return %s\n", retval); - - return retval; } /* ==================================================== */ diff --git a/src/register/table-allgui.h b/src/register/table-allgui.h index b781f3cd1b..81398e7d4f 100644 --- a/src/register/table-allgui.h +++ b/src/register/table-allgui.h @@ -355,8 +355,7 @@ gboolean gnc_table_enter_update(Table *table, int *start_selection, int *end_selection); -const char * gnc_table_leave_update(Table *table, - VirtualLocation virt_loc); +void gnc_table_leave_update(Table *table, VirtualLocation virt_loc); const char * gnc_table_modify_update(Table *table, VirtualLocation virt_loc, diff --git a/src/register/table-gnome.c b/src/register/table-gnome.c index b4d0ed01db..80a97001c1 100644 --- a/src/register/table-gnome.c +++ b/src/register/table-gnome.c @@ -125,15 +125,12 @@ gnc_table_init_gui (gncUIWidget widget, void *data) /* config the cell-block styles */ - gnucash_sheet_set_cursor (sheet, sr->header, CURSOR_TYPE_HEADER); - gnucash_sheet_set_cursor (sheet, sr->single_cursor, - CURSOR_TYPE_SINGLE); - gnucash_sheet_set_cursor (sheet, sr->double_cursor, - CURSOR_TYPE_DOUBLE); - gnucash_sheet_set_cursor (sheet, sr->trans_cursor, - CURSOR_TYPE_TRANS); - gnucash_sheet_set_cursor (sheet, sr->split_cursor, - CURSOR_TYPE_SPLIT); + gnucash_sheet_set_cursor (sheet, sr->cursor_header); + gnucash_sheet_set_cursor (sheet, sr->cursor_ledger_single); + gnucash_sheet_set_cursor (sheet, sr->cursor_ledger_double); + gnucash_sheet_set_cursor (sheet, sr->cursor_journal_single); + gnucash_sheet_set_cursor (sheet, sr->cursor_journal_double); + gnucash_sheet_set_cursor (sheet, sr->cursor_split); for (i = 0; i < CELL_TYPE_COUNT; i++) header_widths[i] = -1; @@ -156,7 +153,7 @@ gnc_table_init_gui (gncUIWidget widget, void *data) name = gh_scm2newstr(gh_car (assoc), NULL); ctype = xaccSplitRegisterGetCellTypeFromName (name); if (name) - free((void *)name); + free(name); if (ctype == NO_CELL) continue; diff --git a/src/scm/prefs.scm b/src/scm/prefs.scm index 6b4d3c4b9d..3ffb02d2ae 100644 --- a/src/scm/prefs.scm +++ b/src/scm/prefs.scm @@ -202,19 +202,19 @@ the account instead of opening a register." #f)) (gnc:register-configuration-option (gnc:make-multichoice-option - "Register" "Default Register Mode" - "a" "Choose the default mode for register windows" - 'single_line - (list #(single_line "Single Line" "Show transactions on single lines") - #(double_line "Double Line" - "Show transactions on two lines with more information") - #(multi_line "Multi Line" - "Show transactions on multiple lines with one line for each split in the transaction") - #(auto_single "Auto Single" - "Single line mode with a multi-line cursor") - #(auto_double "Auto Double" - "Double line mode with a multi-line cursor") - ))) + "Register" "Default Register Style" + "a" "Default style for register windows" + 'ledger + (list #(ledger "Ledger" "Show transactions on one or two lines") + #(auto_ledger "Auto Ledger" + "Show transactions on one or two lines and expand the current transaction") + #(journal "Journal" + "Show expanded transactions with all splits")))) + +(gnc:register-configuration-option + (gnc:make-simple-boolean-option + "Register" "Double Line Mode" + "aa" "Show two lines of information for each transaction" #f)) (gnc:register-configuration-option (gnc:make-simple-boolean-option