private static void PL_WalkDescLinks(Graph graph, PGNode prevNode, GEDCOMIndividualRecord ancestor) { for (int i = 0, count = ancestor.SpouseToFamilyLinks.Count; i < count; i++) { GEDCOMFamilyRecord family = ancestor.SpouseToFamilyLinks[i].Family; PGNode node = family.ExtData as PGNode; if (node != null && node.Type != PGNodeType.Default) { IVertex vtx = graph.FindVertex(node.FamilyXRef); if (vtx == null) { vtx = graph.AddVertex(node.FamilyXRef, node); } if (prevNode != null) { graph.AddDirectedEdge(prevNode.FamilyXRef, node.FamilyXRef, 1, null); } prevNode = node; } for (int k = 0, count2 = family.Children.Count; k < count2; k++) { GEDCOMIndividualRecord child = family.Children[k].Value as GEDCOMIndividualRecord; PL_WalkDescLinks(graph, prevNode, child); } } }
public override void UpdateView() { fView.SelectedList.BeginUpdate(); fView.SelectedList.ClearItems(); fView.SkippedList.BeginUpdate(); fView.SkippedList.ClearItems(); try { var tree = fBase.Context.Tree; int cnt = 0; int num = tree.RecordsCount; for (int i = 0; i < num; i++) { GEDCOMRecord rec = tree[i]; if (rec is GEDCOMIndividualRecord) { cnt++; GEDCOMIndividualRecord iRec = rec as GEDCOMIndividualRecord; string st = iRec.XRef + " / " + GKUtils.GetNameString(iRec, true, false); if (fSplitList.IndexOf(iRec) < 0) { fView.SkippedList.AddItem(null, st); } else { fView.SelectedList.AddItem(null, st); } } } fView.Caption = fSplitList.Count.ToString() + @" / " + cnt.ToString(); } finally { fView.SelectedList.EndUpdate(); fView.SkippedList.EndUpdate(); } }
public CommunicationEditDlg() { InitializeComponent(); fTempInd = null; for (GKCommunicationType ct = GKCommunicationType.ctCall; ct <= GKCommunicationType.ctLast; ct++) { cmbCorrType.Items.Add(LangMan.LS(GKData.CommunicationNames[(int)ct])); } fNotesList = new GKSheetList(pageNotes); fMediaList = new GKSheetList(pageMultimedia); // SetLang() btnAccept.Text = LangMan.LS(LSID.LSID_DlgAccept); btnCancel.Text = LangMan.LS(LSID.LSID_DlgCancel); Title = LangMan.LS(LSID.LSID_WinCommunicationEdit); pageNotes.Text = LangMan.LS(LSID.LSID_RPNotes); pageMultimedia.Text = LangMan.LS(LSID.LSID_RPMultimedia); lblTheme.Text = LangMan.LS(LSID.LSID_Theme); lblCorresponder.Text = LangMan.LS(LSID.LSID_Corresponder); lblType.Text = LangMan.LS(LSID.LSID_Type); lblDate.Text = LangMan.LS(LSID.LSID_Date); btnPersonAdd.ToolTip = LangMan.LS(LSID.LSID_PersonAttachTip); txtDir.Items.Clear(); txtDir.Items.AddRange(GKComboItem.Convert(new string[] { LangMan.LS(LSID.LSID_CD_1), LangMan.LS(LSID.LSID_CD_2) })); }
private static void SearchKGInt(Vertex prevNode, GEDCOMIndividualRecord iRec, KinshipsGraph graph, RelationKind relation, RelationKind inverseRelation) { if (iRec == null) { return; } Vertex currNode = graph.FindVertex(iRec.XRef); if (currNode != null) { if (prevNode != null) { graph.AddRelation(prevNode, currNode, relation, inverseRelation); } return; } else { currNode = graph.AddIndividual(iRec); if (prevNode != null) { graph.AddRelation(prevNode, currNode, relation, inverseRelation); } } if (iRec.ChildToFamilyLinks.Count > 0) { GEDCOMFamilyRecord fam = iRec.GetParentsFamily(); if (fam != null) { GEDCOMIndividualRecord father, mother; father = fam.GetHusband(); mother = fam.GetWife(); SearchKGInt(currNode, father, graph, RelationKind.rkParent, RelationKind.rkChild); SearchKGInt(currNode, mother, graph, RelationKind.rkParent, RelationKind.rkChild); } } int num = iRec.SpouseToFamilyLinks.Count; for (int i = 0; i < num; i++) { GEDCOMFamilyRecord family = iRec.SpouseToFamilyLinks[i].Family; GEDCOMIndividualRecord spouse = ((iRec.Sex == GEDCOMSex.svMale) ? family.GetWife() : family.GetHusband()); SearchKGInt(currNode, spouse, graph, RelationKind.rkSpouse, RelationKind.rkSpouse); int num2 = family.Children.Count; for (int j = 0; j < num2; j++) { GEDCOMIndividualRecord child = (GEDCOMIndividualRecord)family.Children[j].Value; SearchKGInt(currNode, child, graph, RelationKind.rkChild, RelationKind.rkParent); } } }
private void ListModify(object sender, ModifyEventArgs eArgs) { if (sender == fPersonsList) { GEDCOMIndividualRecord iRec = eArgs.ItemData as GEDCOMIndividualRecord; switch (eArgs.Action) { case RecordAction.raAdd: iRec = fBase.Context.SelectPerson(null, TargetMode.tmNone, GEDCOMSex.svNone); if (iRec != null) { fTemp = fTemp + iRec.XRef + ";"; } break; case RecordAction.raDelete: if (iRec != null) { fTemp = fTemp.Replace(iRec.XRef + ";", ""); } break; } } UpdateControls(); }
public CorresponderRet GetCorresponder() { GKCommunicationDir commDir = GKCommunicationDir.cdFrom; GEDCOMIndividualRecord corresponder = null; GEDCOMTag corrTag = FindTag("FROM", 0); if (corrTag == null) { corrTag = FindTag("TO", 0); } if (corrTag != null) { corresponder = (Owner.XRefIndex_Find(GEDCOMUtils.CleanXRef(corrTag.StringValue)) as GEDCOMIndividualRecord); if (corrTag.Name == "FROM") { commDir = GKCommunicationDir.cdFrom; } else if (corrTag.Name == "TO") { commDir = GKCommunicationDir.cdTo; } } return(new CorresponderRet(commDir, corresponder)); }
public TreeChartWin(IBaseWindow baseWin, GEDCOMIndividualRecord startPerson) { InitializeComponent(); fBase = baseWin; fPerson = startPerson; fTreeBox = new TreeChartBox(new TreeChartGfxRenderer()); fTreeBox.Base = fBase; //fTreeBox.Dock = DockStyle.Fill; //fTreeBox.DragOver += ImageTree_DragOver; fTreeBox.PersonModify += ImageTree_PersonModify; fTreeBox.RootChanged += ImageTree_RootChanged; fTreeBox.PersonProperties += ImageTree_PersonProperties; fTreeBox.Options = GlobalOptions.Instance.ChartOptions; fTreeBox.NavRefresh += ImageTree_NavRefresh; Content = fTreeBox; SetLang(); miModeBoth.Tag = TreeChartKind.ckBoth; miModeAncestors.Tag = TreeChartKind.ckAncestors; miModeDescendants.Tag = TreeChartKind.ckDescendants; miCertaintyIndex.Checked = fTreeBox.Options.CertaintyIndexVisible; fTreeBox.CertaintyIndex = fTreeBox.Options.CertaintyIndexVisible; miTraceSelected.Checked = fTreeBox.Options.TraceSelected; fTreeBox.TraceSelected = fTreeBox.Options.TraceSelected; miTraceKinships.Checked = fTreeBox.TraceKinships; miTraceKinships.Enabled = false; }
public static bool AddIndividualMother(IBaseWindow baseWin, ChangeTracker localUndoman, GEDCOMIndividualRecord person) { bool result = false; GEDCOMIndividualRecord mother = baseWin.Context.SelectPerson(person, TargetMode.tmChild, GEDCOMSex.svFemale); if (mother != null) { GEDCOMFamilyRecord family = baseWin.Context.GetChildFamily(person, true, mother); if (family != null) { if (family.Wife.Value == null) { // new family result = localUndoman.DoOrdinaryOperation(OperationType.otFamilySpouseAttach, family, mother); } else { // selected family with wife Logger.LogWrite("BaseController.AddMother(): fail, because family already has mother"); result = true; } } } return(result); }
private static void PostProcessPerson(IBaseWindow baseWin, GEDCOMIndividualRecord indivRec) { AppHost.NamesTable.ImportNames(indivRec); IListManager listMan = baseWin.GetRecordsListManByType(GEDCOMRecordType.rtIndividual); if (listMan == null) { return; } IndividualListFilter iFilter = (IndividualListFilter)listMan.Filter; if (iFilter.SourceMode == FilterGroupMode.Selected) { GEDCOMSourceRecord src = baseWin.Context.Tree.XRefIndex_Find(iFilter.SourceRef) as GEDCOMSourceRecord; if (src != null && AppHost.StdDialogs.ShowQuestionYN(LangMan.LS(LSID.LSID_IncludedSourceFilter))) { indivRec.AddSource(src, "", 0); } } if (iFilter.FilterGroupMode == FilterGroupMode.Selected) { GEDCOMGroupRecord grp = baseWin.Context.Tree.XRefIndex_Find(iFilter.GroupRef) as GEDCOMGroupRecord; if (grp != null && AppHost.StdDialogs.ShowQuestionYN(LangMan.LS(LSID.LSID_IncludedGroupFilter))) { grp.AddMember(indivRec); } } }
public CircleChartWin(IBaseWindow baseWin, GEDCOMIndividualRecord startPerson, CircleChartType type) { InitializeComponent(); tbImageSave.Image = GKResources.iSaveImage; tbDocPreview.Image = GKResources.iPreview; tbDocPrint.Image = GKResources.iPrint; tbPrev.Image = GKResources.iLeft1; tbNext.Image = GKResources.iRight1; ToolBar1.Visible = true; fBaseWin = baseWin; fCircleChart = new CircleChart(); fCircleChart.Base = fBaseWin; fCircleChart.ChartType = type; fCircleChart.Name = "fCircleChart"; fCircleChart.Dock = DockStyle.Fill; fCircleChart.NavRefresh += CircleChartWin_NavRefresh; fCircleChart.RootChanged += CircleChartWin_RootChanged; fCircleChart.RootPerson = startPerson; Controls.Add(fCircleChart); Controls.SetChildIndex(fCircleChart, 0); SetLang(); }
public static ExtList <PatriarchObj> GetPatriarchsLinks(IBaseContext context, int gensMin, bool datesCheck, bool loneSuppress) { ExtList <PatriarchObj> patList = GetPatriarchsList(context, gensMin, datesCheck); IProgressController progress = AppHost.Progress; progress.ProgressInit(LangMan.LS(LSID.LSID_LinksSearch), patList.Count); try { int num2 = patList.Count; for (int i = 0; i < num2; i++) { PatriarchObj patr = patList[i]; for (int j = i + 1; j < num2; j++) { PatriarchObj patr2 = patList[j]; GEDCOMIndividualRecord cross = TreeTools.PL_SearchDesc(patr.IRec, patr2.IRec); if (cross != null) { patr.HasLinks = true; patr2.HasLinks = true; if (cross.Sex == GEDCOMSex.svFemale) { patr.Links.Add(patr2); } else { patr2.Links.Add(patr); } } } progress.ProgressStep(); } } finally { progress.ProgressDone(); } if (loneSuppress) { for (int i = patList.Count - 1; i >= 0; i--) { PatriarchObj patr = patList[i]; if (!patr.HasLinks) { patList.Delete(i); } } patList.Pack(); } return(patList); }
public void Test_GEDCOMEventToDateStr() { GEDCOMIndividualRecord iRec = fContext.Tree.XRefIndex_Find("I1") as GEDCOMIndividualRecord; GEDCOMCustomEvent evt = iRec.FindEvent("BIRT"); Assert.IsNotNull(evt); string st2 = GKUtils.GEDCOMEventToDateStr(null, DateFormat.dfYYYY_MM_DD, false); Assert.AreEqual("", st2); st2 = GKUtils.GEDCOMEventToDateStr(evt, DateFormat.dfYYYY_MM_DD, false); Assert.AreEqual("1990.12.28", st2); evt.Cause = "test cause"; st2 = GKUtils.GetEventCause(evt); Assert.AreEqual("test cause", st2); string ds = GKUtils.GEDCOMEventToDateStr(evt, DateFormat.dfDD_MM_YYYY, false); Assert.AreEqual("28.12.1990", ds); ds = GKUtils.GEDCOMEventToDateStr(evt, DateFormat.dfYYYY_MM_DD, false); Assert.AreEqual("1990.12.28", ds); ds = GKUtils.GEDCOMEventToDateStr(evt, DateFormat.dfYYYY, false); Assert.AreEqual("1990", ds); ds = GKUtils.GEDCOMEventToDateStr(null, DateFormat.dfYYYY, false); Assert.AreEqual("", ds); }
public override void UpdateContents() { var family = fDataOwner as GEDCOMFamilyRecord; if (fSheetList == null || family == null) { return; } try { fSheetList.BeginUpdate(); fSheetList.ClearItems(); int idx = 0; foreach (GEDCOMPointer ptr in family.Children) { idx += 1; GEDCOMIndividualRecord child = (GEDCOMIndividualRecord)ptr.Value; fSheetList.AddItem(child, new object[] { idx, GKUtils.GetNameString(child, true, false), new GEDCOMDateItem(GKUtils.GetBirthDate(child)) }); } fSheetList.EndUpdate(); } catch (Exception ex) { Logger.LogWrite("ChildrenListModel.UpdateContents(): " + ex.Message); } }
// FIXME: perhaps it is necessary to define the maximum age by statistics private bool FilterHandler(GEDCOMRecord record) { bool result = true; try { GEDCOMIndividualRecord iRec = (GEDCOMIndividualRecord)record; int bdy = iRec.GetChronologicalYear("BIRT"); int ddy = iRec.GetChronologicalYear("DEAT"); if (bdy != 0 && ddy == 0) { ddy = bdy + GKData.PROVED_LIFE_LENGTH; } if (bdy == 0 && ddy != 0) { bdy = ddy - GKData.PROVED_LIFE_LENGTH; } if (fYearCurrent > 0) { result = (fYearCurrent >= bdy && fYearCurrent <= ddy); } } catch (Exception ex) { Logger.LogWrite("TimeLineWidget.FilterHandler(): " + ex.Message); } return(result); }
public virtual string GetPossessiveName(GEDCOMIndividualRecord iRec) { string nm = GKUtils.GetNameString(iRec, true, false); nm = GetPossessiveName(nm); return(nm); }
public CircleChartWin(IBaseWindow baseWin, GEDCOMIndividualRecord startPerson, CircleChartType type) { InitializeComponent(); tbImageSave.Image = UIHelper.LoadResourceImage("Resources.btn_save_image.gif"); tbDocPreview.Image = UIHelper.LoadResourceImage("Resources.btn_preview.gif"); tbDocPrint.Image = UIHelper.LoadResourceImage("Resources.btn_print.gif"); tbPrev.Image = UIHelper.LoadResourceImage("Resources.btn_left.gif"); tbNext.Image = UIHelper.LoadResourceImage("Resources.btn_right.gif"); tbOptions.Image = UIHelper.LoadResourceImage("Resources.btn_tools.gif"); fBaseWin = baseWin; fCircleChart = new CircleChart(); fCircleChart.Base = fBaseWin; fCircleChart.ChartType = type; fCircleChart.NavRefresh += CircleChartWin_NavRefresh; fCircleChart.ZoomChanged += CircleChartWin_NavRefresh; fCircleChart.RootChanged += CircleChartWin_RootChanged; fCircleChart.RootPerson = startPerson; fCircleChart.Options.Assign(GlobalOptions.Instance.AncestorsCircleOptions); Content = fCircleChart; SetLang(); fController = new CircleChartWinController(this); fController.Init(fBaseWin); }
public override void UpdateContents() { var grp = fDataOwner as GEDCOMGroupRecord; if (fSheetList == null || grp == null) { return; } try { fSheetList.BeginUpdate(); fSheetList.ClearItems(); foreach (GEDCOMPointer ptrMember in grp.Members) { GEDCOMIndividualRecord member = ptrMember.Value as GEDCOMIndividualRecord; if (member == null) { continue; } fSheetList.AddItem(member, new object[] { GKUtils.GetNameString(member, true, false) }); } fSheetList.EndUpdate(); } catch (Exception ex) { Logger.LogWrite("GroupMembersSublistModel.UpdateContents(): " + ex.Message); } }
private static void PrepareSpecIndex(StringList index, string val, GEDCOMIndividualRecord iRec) { if (index == null) { throw new ArgumentNullException("index"); } if (iRec == null) { throw new ArgumentNullException("iRec"); } StringList persons; int idx = index.IndexOf(val); if (idx < 0) { persons = new StringList(); index.AddObject(val, persons); } else { persons = (StringList)index.GetObject(idx); } if (persons.IndexOfObject(iRec) < 0) { persons.AddObject(GKUtils.GetNameString(iRec, true, false), iRec); } }
public static bool AddIndividualPortrait(IBaseWindow baseWin, GEDCOMIndividualRecord iRec) { bool result = false; GEDCOMMultimediaRecord mmRec = baseWin.Context.SelectRecord(GEDCOMRecordType.rtMultimedia, null) as GEDCOMMultimediaRecord; if (mmRec == null) { return(false); } // remove previous portrait link GEDCOMMultimediaLink mmLink = iRec.GetPrimaryMultimediaLink(); if (mmLink != null) { mmLink.IsPrimary = false; } // set new portrait link mmLink = iRec.SetPrimaryMultimediaLink(mmRec); // select portrait area using (var selectDlg = AppHost.Container.Resolve <IPortraitSelectDlg>()) { selectDlg.InitDialog(baseWin); selectDlg.MultimediaLink = mmLink; result = AppHost.Instance.ShowModalX(selectDlg, false); } return(result); }
private static bool CheckPersonsEx(GEDCOMIndividualRecord rec1, GEDCOMIndividualRecord rec2) { GEDCOMFamilyRecord fam1 = rec1.GetParentsFamily(); GEDCOMFamilyRecord fam2 = rec2.GetParentsFamily(); return(!Equals(fam1, fam2)); }
public void GenChart(GEDCOMIndividualRecord iRec, TreeChartKind kind, bool rootCenter) { if (iRec == null) { return; } try { fSelected = null; fModel.GenChart(iRec, kind, rootCenter); RecalcChart(); if (rootCenter) { CenterPerson(fModel.Root, false); } NavAdd(iRec); DoRootChanged(fModel.Root); } catch (Exception ex) { Logger.LogWrite("TreeChartBox.GenChart(): " + ex.Message); } }
private void CollectData() { fAdrList.ClearItems(); fPhonesList.ClearItems(); fMailsList.ClearItems(); fWebsList.ClearItems(); int num = fBase.Context.Tree.RecordsCount; for (int i = 0; i < num; i++) { GEDCOMRecord rec = fBase.Context.Tree[i]; if (rec.RecordType != GEDCOMRecordType.rtIndividual) { continue; } GEDCOMIndividualRecord iRec = (GEDCOMIndividualRecord)rec; string nm = GKUtils.GetNameString(iRec, true, false); foreach (GEDCOMCustomEvent evt in iRec.Events) { PrepareEvent(nm, evt); } } fAdrList.ResizeColumn(0); fAdrList.ResizeColumn(1); fPhonesList.ResizeColumn(0); fPhonesList.ResizeColumn(1); fMailsList.ResizeColumn(0); fMailsList.ResizeColumn(1); fWebsList.ResizeColumn(0); fWebsList.ResizeColumn(1); }
public void SelectByRec(GEDCOMIndividualRecord iRec) { if (iRec == null) { return; } int num = fModel.Persons.Count; for (int i = 0; i < num; i++) { TreeChartPerson p = fModel.Persons[i]; if (p.Rec == iRec) { SetSelected(p); if (fTraceSelected) { CenterPerson(p); } return; } } SetSelected(null); }
private bool ProcessIndividualPortrait(bool redo) { GEDCOMIndividualRecord iRec = fObj as GEDCOMIndividualRecord; GEDCOMMultimediaLink mmLink = fNewVal as GEDCOMMultimediaLink; if (iRec == null || mmLink == null) { return(false); } if (fType == OperationType.otIndividualPortraitDetach) { redo = !redo; } if (redo) { mmLink.IsPrimary = true; } else { mmLink.IsPrimary = false; } return(true); }
private void ModifySpousesSheet(object sender, ModifyEventArgs eArgs) { GEDCOMFamilyRecord family = eArgs.ItemData as GEDCOMFamilyRecord; if (eArgs.Action == RecordAction.raJump) { if (family != null && (fPerson.Sex == GEDCOMSex.svMale || fPerson.Sex == GEDCOMSex.svFemale)) { GEDCOMPointer sp = null; switch (fPerson.Sex) { case GEDCOMSex.svMale: sp = family.Wife; break; case GEDCOMSex.svFemale: sp = family.Husband; break; } if (sp != null) { GEDCOMIndividualRecord spouse = (GEDCOMIndividualRecord)sp.Value; AcceptChanges(); fBase.SelectRecordByXRef(spouse.XRef); Close(); } } } }
public void Test_GetMarriageAge() { GEDCOMIndividualRecord iRec1 = fContext.Tree.XRefIndex_Find("I1") as GEDCOMIndividualRecord; // specially bad date also for CheckBase functions Assert.AreEqual(10, GKUtils.GetMarriageAge(iRec1)); }
private GEDCOMIndividualRecord ParsePerson(StringList buffer, string str, ref int selfId) { try { selfId = -1; int marrNum = -1; int pid_end = 0; var plRet = ParsePersonLine(str); // extData - (в/б) if (plRet == null) { return(null); } pid_end = plRet.Pos; if (fPersonsList.ContainsKey(plRet.PersId)) { fLog.Add(">>>> " + fLangMan.LS(ILS.LSID_ParseError_NumDuplicate) + " \"" + plRet.PersId + "\"."); return(null); } if (NumbersType == PersonNumbersType.pnKonovalov) { selfId = int.Parse(plRet.PersId); int.TryParse(plRet.MarNum, out marrNum); } str = str.Substring(pid_end).Trim(); GEDCOMSex proposeSex = GetProposeSex(buffer); GEDCOMIndividualRecord result = DefinePerson(str, proposeSex); fPersonsList.Add(plRet.PersId, result); if (!string.IsNullOrEmpty(plRet.ParentId)) { GEDCOMIndividualRecord parent; if (fPersonsList.TryGetValue(plRet.ParentId, out parent)) { AddChild(parent, marrNum, result); } else { fLog.Add(">>>> " + fLangMan.LS(ILS.LSID_ParseError_AncNotFound) + " \"" + plRet.ParentId + "\"."); } } return(result); } catch (Exception ex) { Logger.LogWrite("Importer.ParsePerson(): " + ex.Message); throw; } }
private void ExposeCatalog(Document document, SimpleColumnText columnText, CatalogProps catProps) { StringList index = catProps.Index; if (index == null) { return; } Chunk chunk = new Chunk(catProps.Title, fSubchapFont); chunk.SetLocalDestination(catProps.Sign); if (CatalogNewPages) { document.Add(new Paragraph(chunk)); document.Add(new Paragraph(Chunk.NEWLINE)); } else { columnText.AddElement(new Paragraph(chunk) { Alignment = 1 }); columnText.AddElement(new Paragraph(Chunk.NEWLINE)); } index.Sort(); int num = index.Count; for (int i = 0; i < num; i++) { Paragraph ps = new Paragraph(new Chunk(index[i], fSymFont)); ps.SpacingBefore = 0f; ps.SpacingAfter = 20f; //ps.Alignment = 1; ps.Add(Chunk.NEWLINE); columnText.AddElement(ps); StringList persons = (StringList)index.GetObject(i); persons.Sort(); int num2 = persons.Count; for (int k = 0; k < num2; k++) { GEDCOMIndividualRecord iRec = (GEDCOMIndividualRecord)persons.GetObject(k); chunk = new Chunk(persons[k], fTextFont); chunk.SetLocalGoto(iRec.XRef); Paragraph p = new Paragraph(chunk); columnText.AddElement(p); } columnText.AddElement(new Paragraph(Chunk.NEWLINE) { SpacingAfter = 10f }); } }
public void Test_GetFirstborn() { GEDCOMIndividualRecord iRec1 = fContext.Tree.XRefIndex_Find("I1") as GEDCOMIndividualRecord; GEDCOMIndividualRecord iRec3 = fContext.Tree.XRefIndex_Find("I3") as GEDCOMIndividualRecord; Assert.AreEqual(iRec3, GKUtils.GetFirstborn(iRec1)); Assert.AreEqual(20, GKUtils.GetFirstbornAge(iRec1, iRec3)); }
private void ImageTree_RootChanged(object sender, TreeChartPerson person) { if (person != null && person.Rec != null) { fPerson = person.Rec; UpdateControls(); } }