From 21d8db13e7690014197cb315a99b0ce71f5e17f5 Mon Sep 17 00:00:00 2001 From: Dave Peticolas Date: Thu, 21 Sep 2000 22:47:23 +0000 Subject: [PATCH] Add functionality to extract column widths from gnome sheet. Remove TODO -- obsolete. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@2924 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/register/gnome/TODO | 32 ------------- src/register/gnome/gnucash-style.c | 73 ++++++++++++++++++++++++++++-- src/register/gnome/gnucash-style.h | 3 ++ src/register/splitreg.c | 51 ++++++++++++++++++++- src/register/splitreg.h | 38 +++++++++------- src/register/table-gnome.c | 16 +++++-- 6 files changed, 157 insertions(+), 56 deletions(-) delete mode 100644 src/register/gnome/TODO diff --git a/src/register/gnome/TODO b/src/register/gnome/TODO deleted file mode 100644 index b6156243a4..0000000000 --- a/src/register/gnome/TODO +++ /dev/null @@ -1,32 +0,0 @@ -UPDATED June 03 2000 - - -********************* -Overall Issues and Features. - -1. The styles still need a lot of work. I'm not sure whether -we should handle the styles entirely within the gnome register -code, or try to make splitreg.c reasonably GUI independent. -For example, things like fonts, cell colors, cell configurations, -etc. should be dynamically changeable by the user. Also, -the style dimension computation should take into account -the font size. - -2. Also, regarding the styles, I made some rather arbitrary -choices in setting up how the cells are layed out and drawn. -(For example, the Reconcile cells aren't dealt with very well -for multline cellblocks.) And, it isn't clear that setting -up layouts by percentages is the right way to go. - -3. The "artwork" isn't great. I'd like a better looking -cell cursor. - -4. There's a bit of overdraw, but it isn't clear if optimizing -the drawing is worth the effort. - -********************* - -Bugs - -1. There are a few drawing bugs in the register; this is mostly related -to the style computation. diff --git a/src/register/gnome/gnucash-style.c b/src/register/gnome/gnucash-style.c index bf7f02332c..25e684bb50 100644 --- a/src/register/gnome/gnucash-style.c +++ b/src/register/gnome/gnucash-style.c @@ -648,9 +648,8 @@ gnucash_sheet_style_new (GnucashSheet *sheet, CellBlock *cursor, sr = sheet->split_register; - style = g_new0(SheetBlockStyle, 1); + style = g_new0(SheetBlockStyle, 1); - style->reg_type = sr->type; style->cursor = cursor; style->cursor_type = cursor_type; @@ -761,7 +760,6 @@ gnucash_sheet_get_style_from_table (GnucashSheet *sheet, VirtualCellLocation vcell_loc) { Table *table; - SplitRegister *sr; VirtualCell *vcell; CellBlock *cursor; int i; @@ -770,7 +768,6 @@ gnucash_sheet_get_style_from_table (GnucashSheet *sheet, g_return_val_if_fail (GNUCASH_IS_SHEET(sheet), NULL); table = sheet->table; - sr = sheet->split_register; vcell = gnc_table_get_virtual_cell (table, vcell_loc); @@ -864,6 +861,74 @@ gnucash_style_set_register_hint_font_name(const char *name) gdk_font_ref(gnucash_register_hint_font); } +void +gnucash_sheet_get_header_widths (GnucashSheet *sheet, int *header_widths) +{ + SheetBlockStyle *style; + CellBlock *header; + int row, col; + + g_return_if_fail(sheet != NULL); + g_return_if_fail(GNUCASH_IS_SHEET(sheet)); + + style = sheet->cursor_styles[GNUCASH_CURSOR_HEADER]; + header = sheet->cursors[GNUCASH_CURSOR_HEADER]; + + g_return_if_fail(style != NULL); + g_return_if_fail(header != NULL); + + for (row = 0; row < style->nrows; row++) + for (col = 0; col < style->ncols; col++) + { + CellDimensions *cd; + CellBlockCell *cb_cell; + + cd = gnucash_style_get_cell_dimensions (style, + row, col); + + cb_cell = gnc_cellblock_get_cell (header, row, col); + + if (cb_cell->cell_type < 0) + continue; + + header_widths[cb_cell->cell_type] = cd->pixel_width; + } +} + +void +gnucash_sheet_set_header_widths (GnucashSheet *sheet, int *header_widths) +{ + SheetBlockStyle *style; + CellBlock *header; + int row, col; + + g_return_if_fail(sheet != NULL); + g_return_if_fail(GNUCASH_IS_SHEET(sheet)); + + style = sheet->cursor_styles[GNUCASH_CURSOR_HEADER]; + header = sheet->cursors[GNUCASH_CURSOR_HEADER]; + + g_return_if_fail(style != NULL); + g_return_if_fail(header != NULL); + + for (row = 0; row < style->nrows; row++) + for (col = 0; col < style->ncols; col++) + { + CellDimensions *cd; + CellBlockCell *cb_cell; + + cd = gnucash_style_get_cell_dimensions (style, + row, col); + + cb_cell = gnc_cellblock_get_cell (header, row, col); + + if (cb_cell->cell_type < 0) + continue; + + cd->pixel_width = header_widths[cb_cell->cell_type]; + } +} + const char * gnucash_style_get_default_register_font_name(void) { diff --git a/src/register/gnome/gnucash-style.h b/src/register/gnome/gnucash-style.h index 9bc0e2ce9d..2a5970910b 100644 --- a/src/register/gnome/gnucash-style.h +++ b/src/register/gnome/gnucash-style.h @@ -138,6 +138,9 @@ void gnucash_style_set_register_borders (int reg_borders_new); void gnucash_style_set_borders (SheetBlockStyle *style, int border); void gnucash_sheet_set_borders (GnucashSheet *sheet, int border); +void gnucash_sheet_get_header_widths (GnucashSheet *sheet, int *header_widths); +void gnucash_sheet_set_header_widths (GnucashSheet *sheet, int *header_widths); + extern GdkFont *gnucash_register_font; extern GdkFont *gnucash_register_hint_font; diff --git a/src/register/splitreg.c b/src/register/splitreg.c index a7856c2ca0..d45eb2ad29 100644 --- a/src/register/splitreg.c +++ b/src/register/splitreg.c @@ -312,8 +312,9 @@ configAction (SplitRegister *reg) cb_cell->span = ((handler) == (BasicCell *) reg->memoCell); \ \ cb_cell = gnc_cellblock_get_cell (header, row, col); \ - if (cb_cell) { \ + if (cb_cell && (curs == reg->single_cursor)) { \ cb_cell->cell = hcell; \ + cb_cell->cell_type = NAME##_CELL; \ cb_cell->sample_text = g_strdup (NAME##_CELL_SAMPLE); \ cb_cell->alignment = NAME##_CELL_ALIGN; \ cb_cell->expandable = ((handler) == (BasicCell *) reg->descCell); \ @@ -1723,4 +1724,52 @@ xaccSplitRegisterRestoreCursorChanged(SplitRegister *sr, restoreCellChanged(&sr->ndebitCell->cell, &srb->ndebitCell); } +/* keep in sync with CellType enum */ +static const char *cell_names[] = +{ + "date", + "num", + "description", + "reconcile", + "shares", + "balance", + "action", + "account", + "split-account", + "memo", + "credit", + "debit", + "price", + "value", + "neg-credit", + "neg-debit", + "transfer" +}; + +const char * +xaccSplitRegisterGetCellTypeName (CellType type) +{ + if (type < 0) + return NULL; + if (type >= CELL_TYPE_COUNT) + return NULL; + + return cell_names[type]; +} + +CellType +xaccSplitRegisterGetCellTypeFromName (const char *name) +{ + CellType type; + + if (name == NULL) + return NO_CELL; + + for (type = 0; type < CELL_TYPE_COUNT; type++) + if (safe_strcmp (name, cell_names[type]) == 0) + return type; + + return NO_CELL; +} + /* ============ END OF FILE ===================== */ diff --git a/src/register/splitreg.h b/src/register/splitreg.h index 54b489b5ae..97ca0cdda4 100644 --- a/src/register/splitreg.h +++ b/src/register/splitreg.h @@ -82,30 +82,33 @@ typedef enum } SplitRegisterType; /* These values are used to identify the cells in the register. */ +/* Keep these in sync with the cell_names array in splitreg.c. */ typedef enum { NO_CELL = -1, DATE_CELL = 0, - NUM_CELL = 1, - DESC_CELL = 2, - RECN_CELL = 3, - SHRS_CELL = 4, - BALN_CELL = 5, - ACTN_CELL = 6, - XFRM_CELL = 7, - XTO_CELL = 8, - MEMO_CELL = 9, - CRED_CELL = 10, - DEBT_CELL = 11, - PRIC_CELL = 12, - VALU_CELL = 13, + NUM_CELL, + DESC_CELL, + RECN_CELL, + SHRS_CELL, + BALN_CELL, + ACTN_CELL, + XFRM_CELL, + XTO_CELL, + MEMO_CELL, + CRED_CELL, + DEBT_CELL, + PRIC_CELL, + VALU_CELL, /* NCRED & NDEBT handle minus the usual quantities */ - NCRED_CELL = 14, - NDEBT_CELL = 15, + NCRED_CELL, + NDEBT_CELL, /* MXFRM is the "mirrored" transfer-from account */ - MXFRM_CELL = 16 + MXFRM_CELL, + + CELL_TYPE_COUNT } CellType; /* @@ -303,6 +306,9 @@ void xaccSplitRegisterSaveCursor(SplitRegister *sr, SplitRegisterBuffer *srb); void xaccSplitRegisterRestoreCursorChanged(SplitRegister *sr, SplitRegisterBuffer *srb); +const char * xaccSplitRegisterGetCellTypeName (CellType type); +CellType xaccSplitRegisterGetCellTypeFromName (const char *name); + #endif /* __XACC_SPLITREG_H__ */ diff --git a/src/register/table-gnome.c b/src/register/table-gnome.c index e4f87a3061..8e7f3da50e 100644 --- a/src/register/table-gnome.c +++ b/src/register/table-gnome.c @@ -54,14 +54,24 @@ static void table_destroy_cb(Table *table) { + int header_widths[CELL_TYPE_COUNT]; + GnucashSheet *sheet; + int i; + if (table == NULL) return; if (table->ui_data == NULL) return; - if (table->ui_data) - gtk_widget_unref(GTK_WIDGET(table->ui_data)); + sheet = GNUCASH_SHEET(table->ui_data); + + for (i = 0; i < CELL_TYPE_COUNT; i++) + header_widths[i] = -1; + + gnucash_sheet_get_header_widths (sheet, header_widths); + + gtk_widget_unref(GTK_WIDGET(sheet)); table->ui_data = NULL; } @@ -82,7 +92,7 @@ gnc_table_init_gui (gncUIWidget widget, void *data) greg = GNUCASH_REGISTER(widget); sheet = GNUCASH_SHEET(greg->sheet); - sheet->split_register = data; + sheet->split_register = sr; table = sheet->table; table->destroy = table_destroy_cb;