Ledgers, Registers and Sheets Oh My!

Josh Sled jsled@asynchronous.org
Tue, 27 Nov 2001 00:35:44 -0800


--fUYQa+Pmc3FrFX/N
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

I've been puzzling out the relationship between the code in
window-register.c [RegWindow, let's say], the GNCLedgerDisplay, the
SplitRegister, the GnucashRegister, the GnucashSheet and the Table...

After talking to dave_p this evening, things are much more clear.

I was especially curious about what constructs like the following [slightly
edited] were all about:


void gnc_register_jump_to_blank (RegWindow *regData)
{
  SplitRegister *reg = gnc_ledger_display_get_split_register (regData->ledger);
  VirtualCellLocation vcell_loc;
  Split *blank;

  blank = gnc_split_register_get_blank_split (reg);

  if (gnc_split_register_get_split_virt_loc (reg, blank, &vcell_loc))
    gnucash_register_goto_virt_cell (regData->reg, vcell_loc);
}


Specifically, it seems like there's two very similar registers at play
['(SplitRegister)reg' and '(GnucashRegister)regData->reg'].

But, as it turns out...

The SplitRegister is, as mentioned, an application-specific
Split-containing-thing editor, which interacts with the Table [a ui-agnostic
tabular editor], which itself is an MVC-patterned thing.

The GnucashRegister is a Gnome-specific UI for that table ... it should
probably be named GnomeTableView, but isn't.

Thus, the call above gets the vcell_loc of the blank_split from the
application-specific SplitRegister, and feeds that to the UI-specific
GnucashRegister [read: GnomeTableView]... thus jumping to the blank split
as per the user's request.

In the course of this, I came up with a .dia file of the relationship
and navigability between these things; a .png export of it is attached.
Please forgive my mangling of UML notation.

...jsled

--fUYQa+Pmc3FrFX/N
Content-Type: image/png
Content-Disposition: attachment; filename="register_ledger_sheet_oh_my.png"
Content-Transfer-Encoding: base64

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
7t27t+9e0KcDBw584hOf2L9//7yeMR9JSZLkvPPOi7G55cP8ombQprXqQWG+ZO7MDGmjAVED
gBLZkLF3796zzz77xBNPjLTFBhMsijQe2qg4gkMpUQOAQkUhY9u2bQ1aWxzs6yaJlkf6ummj
evcav6JJETUAyNFtyFioGxrmy7cfQFlusPEpr7krtu/Y4jW2bGewRA0ADhIpZCSZxBA4uAay
RbMJE7XCSu7CuRut/opadmmtiRoA/ECkkJG6hkTpMrmPhH9tsEBY3TmkpY8XJZXqXVpfogYA
P3D33XdffPHFSaeVDBA1+jSRPAusi9e97nVnn332WWedNfqQER65sHPulqgBwA/90R/9Ud9d
YGxEDQAmJ9J1ysnldmsAQESiBgAQkQEUAFqZyMUhevfAAw/s2rWr7140oaoBAESkqgFAK+ZI
xnbGGWfcfvvtr3jFK/ruSEOqGgBARKIGABCRqAEARCRqAAARiRoAQETOQAGgFdfVWA3X1QAA
yKGqAUArrqsRm+tqAAAUEjUAgIhEDQAgIlGjf//2b//WdxcAIBZRAwCIyBkofTryyCP77gJA
W66rQZiqBgAQkaoGAA1tbm723QXWgKoGABCRqAEARCRqAAARiRoAQESiBgAAAAAAQMrstge3
+u7DdD31vSffvPPww56345P3PdF3XwAgCnM1AICIRA0AICYDKABAJLc9uKWqAQBE9MPbre39
8Dd77Mc0PfP09/7Hfzl++6HPe8//fKjvvgBAl/a/88XzH1Q1AICIRA0AIKLt5YsAwAAsCvKs
3rbth/6H/3rdy3/6DQ3WVdUAAEoceObpT139rq9/+bYG64oaAKyTLVbugQceOProo5966qlm
aUPUAABKHHvssfv27WuWNkQNAKDcFVdc0SxtiBoAQCXN0oaoAQBU1SBtiBoAQA1104aoAQDU
UyttiBoAQG3V04aoAQA0UTFtiBoAQENV0oZ7oAAAJR555JHf+Z3fST24tbWVJMlRRx21e/fu
O++88/9c9c63f+D/HvPjr0otpqoBAIQcc8wx733ve7MXLJ89501vetPLXvayAwcOPPJPD2RX
V9UAAEKOOeaYD3zgA+Fl/v7v//6GG27IfUpVAwCISNQAACIygALAeMxms/kP85kE83mLiweX
zZ9KPTtfK7XAkC1eY9Gz8x9ylwmv26H1jhr73/nivrvQgWee/t66v5DnPf/oCz70//ruBTBp
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

--fUYQa+Pmc3FrFX/N--