/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠN ECT EC Ċ Ġ* ĠĠ ĠNational ĠElectron ics Ġand ĠComputer ĠTechnology ĠCenter , ĠTh ail and Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġf fc . gen o gram . Node Ċ Ċ import Ġf fc . gen o gram . Family Tree Drawer Ċ import Ġf fc . gen o gram . Gender Label Ċ import Ġf fc . gen o gram . Person Ċ import Ġf fc . gen o gram . Relationship Line . Relationship Label Ċ import Ġkotlin . math . PI Ċ Ċ class ĠF emale Node ( ĊĠĠĠ Ġvar Ġfamily Tree Drawer : ĠFamily Tree Drawer , ĊĠĠĠ Ġprivate Ġval Ġadded Person : ĠPerson , ĊĠĠĠ Ġvar Ġfocused Person : ĠPerson ?, ĊĠĠĠ Ġvar ĠnodeName : ĠString , ĊĠĠĠ Ġvar Ġparent : ĠPerson ? Ċ ) Ġ: ĠNode () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġdraw Node ( relation Label : ĠRelationship Label ?, Ġs iblings : ĠBoolean ): ĠFamily Tree Drawer Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( relation Label Ġ!= ĠRelationship Label . CHILD REN Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelation Label Ġ!= ĠRelationship Label . TW IN ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadding Layer Ġ= Ġfamily Tree Drawer . find Person Layer ( focused Person !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnodeName Ġ= Ġcreate Gender Border ( nodeName , ĠGender Label . F EM ALE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( focused Person Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġlayer Ġof ĠAdded Person 's Ġs iblings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Layer Ġ= Ġfamily Tree Drawer . find Person Layer ( focused Person !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Line Layer Ġ= Ġchildren Layer Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġwhether Ġthe Ġfocused Person Ġhas Ġany Ġs iblings . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Right Hand S ib Ġ= Ġfamily Tree Drawer . has People On The Right ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Person !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadding Layer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Right Hand S ib ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF ocused Person ( added Person 's Ġh us band ) Ġhas Ġolder Ġs iblings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe order Ġthe Ġarray 's Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadding Ind Ġ= Ġfamily Tree Drawer . find Person Ind ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Person !! , Ġadding Layer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . add Family Storage Replace Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadding Layer , Ġadding Ind , ĠnodeName , Ġadded Person ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdded Person Ġhas Ġno Ġparents , Ġfocus Ġonly Ġon Ġdraw Ġ" Mar riage Line " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind ĠAdded Person 's Ġparent Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Layer Ġ= Ġfamily Tree Drawer . find Person Layer ( parent !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ind Ġ= Ġfamily Tree Drawer . find Person Ind ById ( focused Person !!. father !! , Ġparent Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġindex Ġof ĠAdded Person 's Ġs iblings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchildren Number Ġ= Ġfamily Tree Drawer . find Person Layer Size ( children Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren List Id Ġ= Ġparent !!. children !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren List Ind : ĠMutable List < Int > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren List Id . forEach Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren List Ind . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . find Person Ind ById ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . to Long (), Ġchildren Layer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadding Empty Nodes Ġ= Ġfind Adding Empty Nodes Parent ( children Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġempty Node Number Ġ= Ġfamily Tree Drawer . find NumberOf Empty Node ( parent Layer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtend Ġthe ĠMar riage Line Ġof ĠAdded Person 's Ġparent . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children Number Ġ> Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtend Ġthe ĠMar riage Line Ġby Ġadding Ġthe Ġempty Ġnode ( s ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer Ġ= Ġadd More Nodes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Node Number , Ġadding Empty Nodes , Ġparent Layer , Ġfamily Tree Drawer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtend Ġthe ĠCH ILD REN ĠLine Ġthe Ġtop Ġlayer Ġof Ġthe ĠAdded Person . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe ĠAdded Person Ġis Ġadded Ġon Ġthe Ġleft - hand Ġof Ġthis Ġw ife Ġ( Focused Person ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Ind Ġ= Ġchildren List Ind [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadding Ind Ġ= Ġparent Ind Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ind Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Number Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ind Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadding Ind Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Length Ġ= Ġfamily Tree Drawer . children Line Length ( children Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextended Line Ġ= Ġfamily Tree Drawer . extend Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren List Ind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ind ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . replace Family Storage Layer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Line Layer , Ġstart Ind , Ġextended Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġthe Ġchildren Ġsign ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedited Line Ġ= Ġfamily Tree Drawer . move Children Line Sign ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Line Layer , Ġadding Empty Nodes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . replace Family Storage Layer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Line Layer , Ġadding Ind , Ġedited Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtend Ġthe ĠMar riage Line Ġof ĠAdded Person Ġand ĠF ocused Person ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġby Ġadding Ġthe Ġempty Ġnode ( s ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck ĠAdded Person 's Ġh us band Ġindex , Ġthen Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhether Ġher Ġh us band 's Ġindex Ġis Ġequal Ġto Ġthe Ġnumber Ġof Ġempty Ġnode ( s ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh us band Ind Ġ= Ġfamily Tree Drawer . find Person Ind ( focused Person !! , Ġchildren Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmar riage Line Num b Ġ= Ġfamily Tree Drawer . find Person Layer Size ( children Layer Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( hus band Ind Ġ!= Ġempty Node Number ) Ġ&& Ġ( mar riage Line Num b Ġ== Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd More Ġ= ĠMath . abs ( adding Empty Nodes Ġ- Ġempty Node Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add More Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. ( add More Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . add Family Storage Replace Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Layer Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġnull , Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! has Right Hand S ib ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĠAdded Person 's Ġh us band Ġis Ġthe Ġyo un gest Ġchildren . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd ĠAdded Person Ġat Ġthe Ġend Ġof Ġthe Ġlayer . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġreorder Ġthe Ġarray 's Ġposition , Ġonly Ġextend Ġthe Ġline . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . add Family At Layer ( adding Layer , ĠnodeName , Ġadded Person ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtend Ġ" Mar riage Line " Ġof Ġthe ĠF ocused Person 's Ġparents . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtend Ġby Ġadding Ġthe Ġempty Ġnode ( s ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Number Ġ= Ġfamily Tree Drawer . find Person Layer Size ( children Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Layer Ġ= Ġfamily Tree Drawer . find Person Layer ( parent !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġempty Node Number Ġ= Ġfamily Tree Drawer . find NumberOf Empty Node ( parent Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadding Empty Nodes Ġ= Ġfind Adding Empty Nodes Parent ( children Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer Ġ= Ġadd More Nodes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Node Number , Ġadding Empty Nodes , Ġparent Layer , Ġfamily Tree Drawer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġindex Ġof ĠAdded Person 's Ġs iblings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren List Id Ġ= Ġparent !!. children !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren List Ind : ĠMutable List < Int > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren List Id . forEach Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren List Ind . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . find Person Ind ById ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . to Long (), Ġchildren Layer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtend Ġthe ĠCH ILD REN ĠLine Ġthe Ġtop Ġlayer Ġof Ġthe ĠAdded Person . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe ĠAdded Person Ġis Ġadded Ġon Ġthe Ġleft - hand Ġof Ġthis Ġw ife Ġ( Focused Person ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Ind Ġ= Ġchildren List Ind [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ind Ġ= Ġfamily Tree Drawer . find Person Ind ( parent !! , Ġparent Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ind Ġ= Ġif Ġ(( start Ind Ġ!= Ġ 0 ) Ġ&& Ġ( parent Ind Ġ> Ġstart Ind )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ind Ġ- Ġstart Ind ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Layer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġchildren Ġsign ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedited Line Ġ= Ġfamily Tree Drawer . move Children Line Sign ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Line Layer , Ġadding Empty Nodes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . replace Family Storage Layer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Line Layer , Ġstart Ind , Ġedited Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . add Family Layer ( nodeName , Ġadded Person ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChildren Ġor ĠT win ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġsingle Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadding Layer Ġ= Ġfamily Tree Drawer . find Person Layer ( focused Person !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Layer Ġ= Ġadding Layer Ġ+ Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ind Ġ= Ġfamily Tree Drawer . find Person Ind ( focused Person !! , Ġadding Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco us ins Num b Ġ= Ġfamily Tree Drawer . find Person Layer Size ( children Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġempty Node Num b Ġ= Ġparent Ind Ġ- Ġco us ins Num b ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 - 1 Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" add : Ġ${ added Person . firstname }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" focused Person : Ġ${ focused Person !!. firstname }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" parent Ind : Ġ$ parent Ind \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( empty Node Num b Ġ== Ġco us ins Num b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSepar ate ĠAdded Person Ġand Ġtheir Ġco us ins Ġby Ġadding Ġempty Ġnode ( s ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( empty Node Num b Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġco us ins Num b Ġuntil Ġparent Ind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer . add Family Storage Replace Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Layer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi , Ġnull , Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Middle Child ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Person !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnodeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGender Label . F EM ALE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded Person , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs iblings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Tree Drawer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfamily Tree Drawer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Area (): ĠDouble Ġ= ĠPI Ġ* ĠMath . pow ( node Size , Ġ 2 . 0 ) Ċ } Ċ