public ITreeData Create(Person p, string s, Color clr, int depth, bool isSpouse = false) { int w, h; w = h = 0; if (s != null) { // MeasureString and DrawText will behave as desired for multiline text // if the Environment.NewLine is used for line separation. var s2 = s.Replace("\n", Environment.NewLine); SizeF txtSz = _graphics.MeasureString(s2, isSpouse ? _spouseFont : _mainFont, 1000, StringFormat.GenericDefault); w = (int)(txtSz.Width + 1); h = (int)(txtSz.Height); } var node = new PersonNode(p, s, w, h, _vertOrient); node.BackColor = clr; node.DrawVert = !isSpouse; // TODO brother/sister incest: both spouses are children node.Depth = depth; return(node); }
public UnionNode(PersonNode p1, PersonNode p2, string unionId, bool vertical) { IsReal = true; P1 = p1; P2 = p2; UnionId = unionId; Vertical = vertical; }
private static void MultiMarriage(ITreeData parent, Person who, int depth) { // A person has multiple marriages. // 1. Make the person a child of the parent. // 2. For each marriage: // 2a. Add the spouse as a not-real child of the parent. // 2b. Connect each spouse to the person for drawing. // 2c. call GrowTree(spouse, marriage) PersonNode nodeP = (PersonNode)_nf.Create(who, StringForNode(who), ColorForNode(who), depth); _tree.addChild(parent, nodeP); foreach (var marr in who.SpouseIn) { // Add each spouse as a pseudo-child of the 'parent' Person spouseP = marr.Spouse(who); PersonNode node = (PersonNode)_nf.Create(spouseP, StringForNode(spouseP), ColorForNode(spouseP), depth, true); node.IsReal = false; nodeP.AddSpouse(node); _tree.addChild(parent, node); // This union might have already been added to the // tree. If so, provide a link to the previous node, // and do NOT add children. ITreeData dup; if (_unionSet.TryGetValue(marr.Id, out dup)) { nodeP.DupNode = dup; node.DupNode = dup; } else { _unionSet.Add(marr.Id, nodeP); // here we're about to start the next level, punt if limit reached if (_genDepth < _config.MaxDepth) { GrowTree(node, marr); } } } }