Home » Archimedes archive » Archimedes World » AW-1991-09.adf » AWSept91 » !AWSep91/Goodies/Family/!Family/!RUNIMAGE
!AWSep91/Goodies/Family/!Family/!RUNIMAGE
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Archimedes World » AW-1991-09.adf » AWSept91 |
Filename: | !AWSep91/Goodies/Family/!Family/!RUNIMAGE |
Read OK: | ✔ |
File size: | CF41 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM >!FAMILY.!RUNIMAGE 20: 30f$="" 40SYS "OS_GetEnv" TO EnvStr$ 50IF INSTR(EnvStr$," -quit ") THEN 60 I%=INSTR(EnvStr$,"""") 70 I%=INSTR(EnvStr$,"""",I%+1) 80 REPEATI%+=1:UNTILMID$(EnvStr$,I%,1)<>" " 90 f$=MID$(EnvStr$,I%) 100ENDIF 110: 120: 130ON ERROR PROCerror 140PROCsetup 150PROCloadfile(f$) 160PROCmain 170PROCfinish 180END 190: 200DEFPROCsetup 210alias$="<Family$Dir>" 220treefile%=0:csvfile%=&CDE 230nil%=&FFFFFFFF:root%=nil%:delete%=nil% 240current_menu$="" 250addstatus%=FALSE 260addmenu$="":filesave%=-1 270update%=FALSE:split$="/" 280savestatus%=0:charspc%=4096*1.5 290personnode%=nil%:spoused%=FALSE 300overview%=FALSE:maxgen%=30:DIM column%(maxgen%) 310dataview%=FALSE 320DIM scale% 10:$scale%="1" 330scaleover=1 340DIM q% 100, block% 2000, menblk% 10000,checkdata% 100 350DIMvdata% 30,au% 30,pur% 40,pname% 30,icw% 30 360version$="2.40 <18.06.91>" 370DIM iconblk% 200,findicon% 400, genpointers% 100 380DIM fileicon% 400 390DIM find_icon_num(6,6) 400DIM file_dat% 255 410 DIM datamask$(16),dataset$(16) 420PROCdataviewinit 430dataset$()=STRING$(60,CHR$(32)) 440titfcol%=7:titbcol%=2:fgcol%=7:bgcol%=0 450scrbcol%=3:scrfcol%=1:high%=12 460current_per%=root% 470PROCoffsets 480DIM persd% personlength%,fpersd% personlength% 490findblk%=FNdimperson 500$q%="TASK" 510SYS "Wimp_Initialise",200,!q%,"Family" TO ,handle% 520PROCsprites(alias$+".!Sprites") 530iconh%=FNiconbar("!Family") 540oldtree$="treefile" 550olddraw$="drawfile" 560oldcsv$="csvfile" 570PROCwindows 580datasx%=0:datasy%=0 590datatx%=0:dataty%=0 600ENDPROC 610: 620DEFPROCmain 630REPEAT 640PROCpoll(%10011111110110110011) 650UNTIL (reason%=17 OR reason%=18) AND block%!16=0 660ENDPROC 670: 680DEFFNiconbar(spname$) 690!block%=-1 700block%!4=0 710block%!8=0 720block%!12=63 730block%!16=64 740block%!20=&2102 750DIM block%!24 (LENspname$+1) 760$(block%!24)=spname$ 770block%!28=sprite% 780block%!32=(LENspname$+1) 790SYS "Wimp_CreateIcon",,block% TO icon% 800=icon% 810: 820DEFPROCsprites(file$) 830sp=OPENIN(file$) 840dim%=EXT#sp+16 850CLOSE#sp 860DIM sprite% dim% 870!sprite%=dim% 880sprite%!4=0 890sprite%!8=16 900sprite%!12=16 910SYS "OS_SpriteOp",256+10,sprite%,file$ 920ENDPROC 930: 940DEFPROCpoll(mask%) 950!block%=mask% 960SYS "Wimp_Poll",0,block% TO reason% 970IF reason% PROCaction(reason%) 980ENDPROC 990: 1000DEFPROCaction(reason%) 1010CASE reason% OF 1020WHEN 1 : PROCredrawwin(block%!0) 1030WHEN 2 : PROCopen 1040WHEN 3 : PROCclose 1050WHEN 6 : PROCcheck_mouse(!block%,block%!4,block%!8,block%!12) 1060WHEN 7 : PROCdragend 1070WHEN 8 : PROCcharent 1080WHEN 9 : PROCmenu_select 1090WHEN 17,18 : PROCmessage(block%) 1100ENDCASE 1110ENDPROC 1120: 1130DEFPROCcheck_mouse(mx%,my%,but%,hnd%) 1140CASE but% OF 1150WHEN 2 : mx%-=64:CASE hnd% OF 1160 WHEN -2 :PROCcreate_icon_menu(mx%,my%) 1170 WHEN main% : PROCcreate_menu(mx%,my%) 1180 WHEN over% : PROCcreate_over(mx%,my%) 1190 WHEN datawindow% : PROCcreate_data(mx%,my%) 1200ENDCASE 1210WHEN 4 : CASE hnd% OF 1220WHEN -2 : PROCcreate_window 1230WHEN datawindow% : PROCputcaretintodata(mx%,my%) 1240WHEN main% : addstatus%=FALSE:CASE block%!16 OF 1250 WHEN ok% : addstatus%=TRUE:VDU7:IF root%=nil% THEN PROCnewtree ELSE PROCresortbranch 1260 WHEN ileft% : PROCleftsib 1270 WHEN iright% : PROCrightsib 1280 WHEN idown% : PROCchild 1290 WHEN iup% : PROCparent 1300 WHEN ispouse% : PROCspouse 1310 ENDCASE 1320 IF block%!16<>-1 THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 1330WHEN check% : PROCdeleteperson(block%!16) 1340WHEN findwind% : PROCfindclick 1350WHEN over% : PROCgotoperson(mx%,my%) 1360WHEN filewindow% : IF block%!16=fileok% THEN 1370 CASE filesave% OF 1380 WHEN 0 : o%=FNsave_tree($(fileicon%+44)) 1390 WHEN 1 : PROCsavevertdraw($(fileicon%+44)) 1400 WHEN 2 : PROCsavehoridraw($(fileicon%+44),TRUE) 1410 WHEN 3 : PROCsavecsv($(fileicon%+44)) 1420 ENDCASE 1430 SYS "Wimp_CreateMenu",-1 1440 ENDIF 1450ENDCASE 1460WHEN 1 : CASE hnd% OF 1470ENDCASE 1480 WHEN 64 : PROCdragfile 1490ENDCASE 1500ENDPROC 1510: 1520DEFPROCset_version(pt%,H%,ver$) 1530!q%=pt% 1540q%!4=H% 1550SYS "Wimp_GetIconState",,q% 1560$q%!28=ver$ 1570q%!8=0 1580q%!12=0 1590SYS "Wimp_SetIconState",,q% 1600ENDPROC 1610: 1620DEFPROCfinish 1630SYS "Wimp_CloseDown",handle%,!q% 1640END 1650ENDPROC 1660: 1670DEFPROCerror 1680SYS "Wimp_DragBox",,0 1690!block%=ERR 1700error=FALSE 1710CASE ERR OF 1720WHEN 222 : $(block%+4)="This file does not exist"+CHR$(0) 1730WHEN 204 : $(block%+4)="Invalid Filename for Saving"+CHR$(0) 1740OTHERWISE 1750$(block%+4)="(Internal error code"+STR$(ERL)+") "+REPORT$+CHR$0 1760ENDCASE 1770flags=1 1780SYS "Wimp_ReportError",block%,flags,"Family" 1790IF error THEN PROCfinish ELSE PROCmain:END 1800ENDPROC 1810: 1820DEFPROCcreate_window 1830!block%=main% 1840block%!4=300 1850block%!12=1300 1860block%!16=800 1870block%!20=0 1880block%!24=500 1890block%!28=-1 1900SYS "Wimp_OpenWindow",,block% 1910ENDPROC 1920: 1930DEFPROCclose 1940IF !block%=over% THEN overview%=FALSE 1950IF !block%=datawindow% THEN dataview%=FALSE 1960SYS "Wimp_CloseWindow",,block% 1970ENDPROC 1980: 1990DEFPROCopen 2000SYS "Wimp_OpenWindow",,block% 2010ENDPROC 2020: 2030DEFFNfin 2040PROCfinish 2050=0 2060: 2070DEFFNcreatewindow(title$,flags%,fgcol%,bgcol%,maxX%,maxY%,waL%,waB%,waR%,waT%,filer%) 2080LOCAL h% 2090block%!0=waL%:block%!4=waB% 2100block%!8=waR%:block%!12=waT% 2110block%!16=0:block%!20=maxY% 2120block%!24=-1:block%!28=flags% 2130block%?32=titfcol% 2140block%?33=titbcol% 2150block%?34=fgcol% 2160block%?35=bgcol% 2170block%?36=scrbcol% 2180block%?37=scrfcol% 2190block%?38=high% 2200CASE filer% OF 2210 WHEN 1 : block%?35=1:block%?38=titbcol% 2220 WHEN 2 : block%?27=&18 2230ENDCASE 2240block%?39=0 2250block%!40=0 2260block%!44=0 2270block%!48=maxX% 2280block%!52=maxY% 2290block%!56=&2D 2300block%!60=&3000 2310block%!64=0 2320block%!68=0 2330$(block%+72)=LEFT$(title$,11) 2340block%!84=0 2350SYS "Wimp_CreateWindow",0,block% TO h% 2360=h% 2370: 2380DEFPROCwindows 2390main%=FNcreatewindow("Family Tree",&F,7,0,1000,500,0,0,500,500,0) 2400over%=FNcreatewindow("Overview",&F,7,0,1279,1023,50,50,950,550,0) 2410check%=FNcreatewindow("Delete",&91,7,0,900,400,150,250,1050,750,1) 2420findwind%=FNcreatewindow("Find Person",&1F,7,0,1000,500,250,250,1250,740,0) 2430filewindow%=FNcreatewindow("Save as:",131,7,0,250,160,0,0,600,160,1) 2440infowindow%=FNcreatewindow("Information",131,7,0,625,250,0,0,700,500,1) 2450datawindow%=FNcreatewindow("Person Data",&100F,7,0,16*60,16*32,0,0,500,500,2) 2460REM datawindow is 40 x 16 characters 2470PROCfilewinicons 2480PROCinfoicons 2490ileft%=FNplaceicon(main%,825,95,CHR$(136)) 2500ispouse%=FNplaceicon(main%,880,95,"S") 2510iright%=FNplaceicon(main%,935,95,CHR$(137)) 2520iup%=FNplaceicon(main%,880,155,CHR$(139)) 2530idown%=FNplaceicon(main%,880,35,CHR$(138)) 2540PROCmainicons(TRUE,iconblk%) 2550PROCmainicons(FALSE,findicon%) 2560PROCfindicons 2570PROCcheckicons 2580ENDPROC 2590 2600: 2610DEFPROCoffsets 2620fname%=0 2630surname%=40 2640birthdate%=80 2650deathdate%=84 2660marriagedate%=88 2670divorcedate%=92 2680sibling%=96 2690child%=100 2700spouse%=104 2710gen%=108 2720col%=112 2730row%=116 2740sex%=120 2750personlength%=200+16*65 2760next%=0 2770ENDPROC 2780: 2790DEFPROCredrawwin(h%) 2800column%()=0 2810IF addstatus% THEN PROCmaketree(root%,640,1023-40,0,0, current_per%, TRUE) 2820addstatus%=FALSE 2830SYS "Wimp_RedrawWindow",0,block% TO m% 2840b%=block%+4 2850x0%=b%!0-b%!16 2860y0%=b%!12-b%!20 2870WHILE m% 2880ORIGIN x0%,y0% 2890CASE !block% OF 2900 WHEN main% : PROCredrawmain 2910 WHEN over% : PROCredrawover 2920 WHEN datawindow% : PROCredrawdata 2930ENDCASE 2940ORIGIN 0,0 2950 SYS "Wimp_GetRectangle",0,block% TO m% 2960ENDWHILE 2970ENDPROC 2980: 2990DEFPROCredrawmain 3000 SYS "Wimp_SetColour",7 3010 RECTANGLE 815,25,175,185 3020ENDPROC 3030: 3040DATA "First Names" 3050DATA "Surname" 3060DATA "Date of Birth" 3070DATA "Date of Death" 3080DATA "Marriage Date" 3090DATA "Divorce Date" 3100: 3110DEFFNplaceicon(h%,x%,y%,a$) 3120!block%=h%:block%!4=x%:block%!8=y% 3130block%!12=x%+LEN(a$)*16+29:block%!16=y%+50 3140block%!20=&C700403D 3150$(block%+24)=a$ 3160SYS "Wimp_CreateIcon",0,block% TO h% 3170 =h% 3180: 3190DEFPROCinfoicons 3200LOCAL i%,Y%,a$,b$,a% 3210RESTORE 3360 3220FORY%=10 TO 190 STEP60 3230READ a$,b$,a% 3240IFY%=10 THEN b$=version$ 3250 i%=FNjusttexti(infowindow%,10,Y%,150,a$,&7000011,0) 3260 i%=FNjusttexti(infowindow%,150,Y%,465,b$,&700013D,a%) 3270NEXT 3280ENDPROC 3290: 3300DEFFNjusttexti(h%,x%,y%,w%,a$,f%,a%) 3310!block%=h%:block%!4=x%:block%!8=y% 3320block%!12=x%+w%:block%!16=y%+50 3330block%!20=f% 3340IF a%=0 THEN $(block%+24)=a$ ELSE block%!24=a%:block%!28=-1:block%!32=LEN(a$)+1:$a%=a$ 3350SYS "Wimp_CreateIcon",0,block% TO h% 3360DATA "Version:",version$,vdata%,"Author:","David Breakwell",au%,"Purpose:","Family Tree Program",pur%,"Name:","!FAMILY",pname% 3370DATA "!FAMILY","Family Tree Program","David Breakwell",version$ 3380: 3390DEFFNdimperson 3400LOCAL person% 3410IF HIMEM-END<personlength%+100 THEN END=HIMEM+1024 3420IF delete%=nil% THEN DIM person% personlength% ELSE person%=delete%:delete%=delete%!next% 3430=person% 3440: 3450DEFPROCmainicons(M%,mem%) 3460LOCAL iconblk% 3470iconblk%=mem% 3480RESTORE 3040 3490FORloop%=1 TO 6 3500 IF M% THEN !block%=main% ELSE !block%=findwind% 3510 block%!24=(iconblk%+(17*loop%)):block%!28=&FFFFFFFF 3520 block%!20=&C7000125 3530 READ $(iconblk%+(17*loop%)):block%!4=20:block%!8=390-(loop%*60) 3540 block%!32=LEN$(iconblk%+(17*loop%)) 3550 block%!12=block%!4+270:block%!16=block%!8+50 3560 SYS "Wimp_CreateIcon",0,block% 3570 block%!4=300:block%!20=&700F125 3580 CASE loop% OF 3590 WHEN 1 : l%=0 3600 WHEN 2 : l%=40 3610 WHEN 3 : l%=80 3620 WHEN 4 : l%=91 3630 WHEN 5 : l%=102 3640 WHEN 6 : l%=113 3650 ENDCASE 3660 IF M% THEN block%!24=persd%+l% ELSE block%!24=fpersd%+l% 3670 IF loop%<3 THEN block%!32=41:$(block%!24)="" ELSE block%!32=12:!(block%!24)=0 3680 block%!12=block%!4+(block%!32+1)*16 3690 SYS "Wimp_CreateIcon",0,block% TO I% 3700IFM% AND loop%=1 THEN mainbase%=I% 3710IFNOTM% AND loop%=1 THEN findbase%=I% 3720NEXT 3730PROCclearperson 3740block%!20=&C700013D:block%!4=20:block%!8=420 3750block%!12=block%!4+960:block%!16=block%!8+50 3760block%!24=(iconblk%+7*17) 3770IF M% THEN 3780 $(iconblk%+7*17)="Personal Data" 3790ELSE 3800 $(iconblk%+7*17)="Find Person" 3810ENDIF 3820SYS "Wimp_CreateIcon",0,block% 3830block%!4=550:block%!20=&C700913D:block%!8=30 3840block%!12=block%!4+200:block%!16=block%!8+50 3850block%!24=(iconblk%+8*17):$(iconblk%+8*17)="OK":block%!32=2 3860IF NOT(M%) THEN 3870 block%!4=880:block%!8=30 3880 block%!12=970:block%!16=260 3890 SYS "Wimp_CreateIcon",0,block% TO fok% 3900ELSE 3910 SYS "Wimp_CreateIcon",0,block% TO ok% 3920ENDIF 3930IF M% THEN 3940 !block%=main% 3950 block%!4=550:block%!8=210 3960 block%!12=650:block%!16=260 3970 block%!20=&C700003D 3980 $(block%+24)="Sex" 3990 SYS "Wimp_CreateIcon",,block% 4000 block%!4=670:block%!12=770 4010 block%!20=%111000000001111000000111101 4020 $(block%+24)="" 4030 SYS "Wimp_CreateIcon",,block% TO personsex% 4040ENDIF 4050ENDPROC 4060: 4070DEFPROCcharent 4080LOCAL f% 4090IF !block%=datawindow% THEN PROCenterdata:ENDPROC 4100IF !block% <>main% AND !block% <>findwind% THEN 4110 SYS "Wimp_ProcessKey",block%!24 4120 ENDPROC 4130ENDIF 4140CASE block%!24 OF 4150 WHEN 13 : RESTORE 4410 4160 WHEN 399 : RESTORE 4420 4170 WHEN 398 : RESTORE 4410 4180 OTHERWISE : SYS "Wimp_ProcessKey",block%!24 4190ENDCASE 4200f%=block%!24 4210IF f%<>13 AND f%<>399 AND f%<>398 THEN ENDPROC 4220SYS "Wimp_GetCaretPosition",,block% 4230IF !block%=findwind% THEN block%!4=block%!4+5 4240REPEAT 4250 READ l% 4260UNTIL block%!4=l% 4270READ l% 4280IF !block%=findwind% AND l%=20 THEN 4290 IF f%=399 THEN l%=16 ELSE l%=6 4300ENDIF 4310IF !block%=findwind% THEN l%-=5 4320SYS "Wimp_SetCaretPosition",!block%,l%,,,-1 4330ENDPROC 4340IF !block%=main% THEN 4350 SYS "Wimp_SetCaretPosition",main%,mainbase%+((335-l%)/60)*2,b%,l%,&1000028,0 4360ELSE 4370 SYS "Wimp_SetCaretPosition",findwind%,findbase%+((335-l%)/60)*2,b%,l%,&1000028,0 4380ENDIF 4390ENDPROC 4400: 4410DATA 6,8,10,12,14,16,20,6 4420DATA 6,20,16,14,12,10,8,6 4430DEFFNconvstrdate(d$):LOCAL l%,d%,d1%,d2% 4440IF d$=" " THEN =0 4450d%=FNnumber(d$,1,l%) 4460d1%=FNnumber(d$,l%+1,l%) 4470d2%=FNnumber(d$,l%+1,l%) 4480IF d%<1 OR d1%<1 OR d2%<0 THEN =0 4490IF d%>31 OR d1%>12 THEN =0 4500CASE d1% OF 4510 WHEN 9,4,6,11 : l%=30 4520 WHEN 2 : l%=28 4530 OTHERWISE : l%=31 4540ENDCASE 4550IF d%>l% THEN =0 4560=d%+(d1%<<8)+(d2%<<16) 4570: 4580DEFFNconvnumdate(d%) 4590LOCALd$,l$ 4600d$="":l$="" 4610IF d%=0 THEN="" 4620d$=STR$(d% AND &FF):IFLENd$=1 THEN d$="0"+d$ 4630l$=STR$((d% AND &FF00)>>8):IF LENl$=1 THEN l$="0"+l$ 4640d$=d$+split$+l$ 4650l$=STR$((d% AND &FFFF0000)>>16):l$=STRING$(4-LENl$," ")+l$ 4660=d$+split$+l$ 4670: 4680DEFPROCcopyto(h%) 4690REM Copy h% TO persd% 4700FOR o%=1 TO 7 4710 CASE o% OF 4720 WHEN 1 : $persd%=$h% 4730 WHEN 2 :$(persd%+40)=$(h%+surname%) 4740 WHEN 3 : $(persd%+80)=FNconvnumdate(h%!birthdate%) 4750 WHEN 4 : $(persd%+91)=FNconvnumdate(h%!deathdate%) 4760 WHEN 5 : $(persd%+102)=FNconvnumdate(h%!marriagedate%) 4770 WHEN 6 : $(persd%+113)=FNconvnumdate(h%!divorcedate%) 4780 WHEN 7 : !icw%=main%:icw%!4=personsex%:SYS "Wimp_GetIconState",,icw%:SYS "Wimp_DeleteIcon",,icw%:$(icw%+28)=CHR$(h%!sex%):icw%!4=!icw%:SYS "Wimp_CreateIcon",,icw%+4 4790 ENDCASE 4800NEXT 4810FOR o%=0 TO 15 4820 dataset$(o%)=$(h%+(personlength%-(16*65))+o%*65) 4830NEXT 4840ENDPROC 4850: 4860DEFPROCcopyfrom(h%,mem%) 4870FOR o%=1 TO 7 4880 CASE o% OF 4890 WHEN 1 :$h%=$mem% 4900 WHEN 2 : $(h%+surname%)=$(mem%+surname%) 4910 WHEN 3 : !(h%+birthdate%)=FNconvstrdate($(mem%+80)) 4920 WHEN 4 : !(h%+deathdate%)=FNconvstrdate($(mem%+91)) 4930 WHEN 5 : !(h%+marriagedate%)=FNconvstrdate($(mem%+102)) 4940 WHEN 6 : !(h%+divorcedate%)=FNconvstrdate($(mem%+113)) 4950 WHEN 7 : !icw%=main%:icw%!4=personsex%:SYS "Wimp_GetIconState",,icw%: h%!sex%=ASC(LEFT$($(icw%+28),1)) 4960 ENDCASE 4970NEXT 4980FOR o%=0 TO 15 4990 $(h%+(personlength%-(16*65))+o%*65)=dataset$(o%) 5000NEXT 5010ENDPROC 5020: 5030DEFFNnumber(d$,O%,RETURN O%) 5040LOCAL n%,n$:n%=0:n$="0123456789" 5050IF INSTR(n$,MID$(d$,O%,1))=0 THEN i%=i%+1:=-1 5060WHILE INSTR(n$,MID$(d$,O%,1))<>0 AND O%<=LENd$ 5070 n%=n%*10+(INSTR(n$,MID$(d$,O%,1))-1) 5080 O%=O%+1 5090ENDWHILE 5100=n% 5110: 5120DEFPROCnewtree 5130root%=FNdimperson:PROCcopyfrom(root%,persd%):current_per%=root% 5140root%!sibling%=nil%:root%!spouse%=nil%:root%!child%=nil% 5150root%!gen%=0 5160personnode%=root% 5170ENDPROC 5180: 5190DEFFNnew_tree 5200PROCcreate_window 5210PROCnewtree 5220=0 5230: 5240DEFFNadd_sib 5250LOCAL g% 5260PROCcopyfrom(current_per%,persd%) 5270IF spoused% THEN current_per%=personnode%:spoused%=FALSE 5280WHILE current_per%!sibling%<>nil% 5290 current_per%=current_per%!sibling% 5300ENDWHILE 5310current_per%!sibling%=FNdimperson 5320!(current_per%!sibling%+gen%)=current_per%!gen% 5330g%=current_per%!gen% 5340current_per%=current_per%!sibling% 5350PROCnils(current_per%) 5360PROCclearperson 5370current_per%!gen%=g% 5380SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 5390IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 5400IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 5410=0 5420: 5430DEFPROCclearperson 5440$(persd%)="":$(persd%+40)="" 5450$(persd%+80)=FNconvnumdate(0):$(persd%+91)=$(persd%+80) 5460$(persd%+102)=$(persd%+80):$(persd%+113)=$(persd%+80) 5470persd%!sex%=32 5480dataset$()=STRING$(60," ") 5490ENDPROC 5500: 5510DEFPROCgenpointers(h%) 5520LOCALsave% 5530save%=TRUE:PROCtraverse(h%,root%) 5540ENDPROC 5550: 5560DEFPROCtraverse(h%,troot%) 5570IFtroot%=nil% THEN ENDPROC 5580IF save% THEN genpointers%!((troot%!gen%)*4)=troot% 5590IF troot%=h% THEN save%=FALSE 5600PROCtraverse(h%,troot%!child%) 5610IF save% THEN PROCtraverse(h%,troot%!sibling%) 5620ENDPROC 5630: 5640DEFPROCleftsib 5650IFroot%=nil% THEN ENDPROC 5660 IF root%=current_per% THEN ENDPROC 5670PROCcopyfrom(current_per%,persd%) 5680IF spoused% THEN current_per%=personnode%:spoused%=FALSE:PROCcopyto(current_per%):SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 5690PROCgenpointers(current_per%) 5700IFcurrent_per%!gen%<>0 AND !(genpointers%!(((current_per%!gen%)-1)*4)+child%)=current_per% THEN ENDPROC 5710IF current_per%!gen%=0 THEN 5720 current_per%=FNfindprevsib(root%,current_per%) 5730ELSE 5740 current_per%=FNfindprevsib(!(genpointers%!(((current_per%!gen%)-1)*4)+child%),current_per%) 5750ENDIF 5760PROCcopyto(current_per%) 5770SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 5780IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 5790IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 5800ENDPROC 5810: 5820DEFFNfindprevsib(start%,comp%) 5830IF comp%=start% THEN =comp% 5840WHILE start%!sibling%<>comp% 5850 start%=start%!sibling% 5860ENDWHILE 5870=start% 5880: 5890DEFPROCrightsib 5900 5910IFroot%=nil% THEN ENDPROC 5920PROCcopyfrom(current_per%,persd%) 5930IF spoused% THEN current_per%=personnode%:spoused%=FALSE:PROCcopyto(current_per%):SYS "Wimp_ForceRedraw",main%,0,0,1280,1023 5940IF current_per%!sibling%=nil% THEN ENDPROC 5950current_per%=current_per%!sibling% 5960PROCcopyto(current_per%) 5970SYS "Wimp_ForceRedraw",main%,0,0,1280,1023 5980IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 5990IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 6000ENDPROC 6010: 6020DEFFNadd_parent 6030PROCcopyfrom(current_per%,persd%) 6040IF spoused% THEN current_per%=personnode%:spoused%=FALSE 6050s%=FNdimperson 6060PROCclearperson 6070PROCnils(s%) 6080s%!child%=root% 6090s%!gen%=-1 6100root%=s% 6110PROCincgen(root%) 6120current_per%=root% 6130SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 6140IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 6150IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 6160=0 6170: 6180DEFPROCincgen(root%) 6190IF root%=nil% THEN ENDPROC 6200root%!gen%+=1 6210PROCincgen(root%!child%) 6220PROCincgen(root%!sibling%) 6230ENDPROC 6240: 6250DEFPROCnils(s%) 6260s%!sibling%=nil%:s%!spouse%=nil%:s%!child%=nil% 6270ENDPROC 6280: 6290DEFPROCparent 6300PROCcopyfrom(current_per%,persd%) 6310IF current_per%!gen%=0 THEN ENDPROC 6320IF spoused% THEN current_per%=personnode%:spoused%=FALSE 6330PROCgenpointers(current_per%) 6340current_per%=genpointers%!(((current_per%!gen%)-1)*4) 6350PROCcopyto(current_per%) 6360SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 6370IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 6380IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 6390ENDPROC 6400: 6410DEFPROCchild 6420IFroot%=nil% THEN ENDPROC 6430PROCcopyfrom(current_per%,persd%) 6440IF spoused% THEN current_per%=personnode%:spoused%=FALSE:PROCcopyto(current_per%):SYS "Wimp_ForceRedraw",main%,0,0,1280,1023 6450IF current_per%!child% = nil% THEN ENDPROC 6460current_per%=current_per%!child% 6470PROCcopyto(current_per%) 6480SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 6490IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 6500IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 6510ENDPROC 6520: 6530DEFPROCresortbranch 6540LOCAL s%,p%,e%,c% 6550PROCgenpointers(current_per%) 6560c%=current_per% 6570PROCcopyfrom(c%,persd%) 6580IF spoused% THEN PROCsortspouse:ENDPROC 6590IF c%=root% THEN 6600 root%=c%!sibling%:s%=root% 6610ELSE 6620 IF c%!gen%=0 THEN 6630 s%=root%:p%=nil% 6640 ELSE 6650 p%=(genpointers%!(((c%!gen%)-1)*4)):s%=p%!child% 6660 ENDIF 6670 IF p%<>nil% AND p%!child%=c% THEN 6680 p%!child%=c%!sibling%:s%=c%!sibling% 6690 ELSE 6700 e%=FNfindprevsib(s%,c%) 6710 e%!sibling%=c%!sibling% 6720 ENDIF 6730ENDIF 6740IF root%=nil% THEN root%=c%:ENDPROC 6750IF s%=nil% THEN p%!child%=c%:ENDPROC 6760os%=s% 6770WHILE s%!sibling%<>nil% AND !(s%!sibling%+birthdate%)<c%!birthdate% 6780 s%=s%!sibling% 6790ENDWHILE 6800IF os%=s% AND s%!birthdate%>c%!birthdate% THEN 6810 IF c%!gen%=0 THEN 6820 c%!sibling%=root%:root%=c% 6830 ELSE 6840 c%!sibling%=p%!child% 6850 p%!child%=c% 6860 ENDIF 6870ENDPROC 6880ENDIF 6890c%!sibling%=s%!sibling% 6900s%!sibling%=c% 6910ENDPROC 6920: 6930DEFFNadd_child 6940PROCcopyfrom(current_per%,persd%) 6950IFspoused% THEN current_per%=personnode%:spoused%=FALSE 6960IF current_per%!child%=nil% THEN 6970 current_per%!child%=FNdimperson 6980 !(current_per%!child%+gen%)=current_per%!gen%+1 6990 current_per%=current_per%!child% 7000ELSE 7010 current_per%=current_per%!child% 7020 WHILE current_per%!sibling%<>nil% 7030 current_per%=current_per%!sibling% 7040 ENDWHILE 7050 current_per%!sibling%=FNdimperson 7060 !(current_per%!sibling%+gen%)=current_per%!gen% 7070 current_per%=current_per%!sibling% 7080ENDIF 7090PROCclearperson 7100PROCnils(current_per%) 7110SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 7120IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 7130IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 7140=0 7150: 7160DEFFNadd_spouse 7170PROCcopyfrom(current_per%,persd%) 7180IF NOTspoused% THEN spoused%=TRUE:personnode%=current_per% 7190WHILE current_per%!spouse%<>nil% 7200current_per%=current_per%!spouse% 7210ENDWHILE 7220current_per%!spouse%=FNdimperson 7230!(current_per%!spouse%+gen%)=current_per%!gen% 7240current_per%=current_per%!spouse% 7250PROCclearperson 7260PROCnils(current_per%) 7270SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 7280IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 7290IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 7300=0 7310: 7320DEFPROCspouse 7330IFroot%=nil% THEN ENDPROC 7340IF current_per%!spouse%=nil% AND NOT(spoused%) THEN ENDPROC 7350IF current_per%!spouse%=nil% THEN 7351current_per%=personnode%:spoused%=FALSE:PROCcopyto(current_per%) 7352ELSE 7360IF NOTspoused% THEN spoused%=TRUE:personnode%=current_per% 7370current_per%=current_per%!spouse% 7380PROCcopyto(current_per%) 7381ENDIF 7390SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 7391IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 7392IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 7400ENDPROC 7410 7420 DEFPROCsortspouse 7430 LOCAL s%,c% 7440s%=personnode%!spouse%:c%=current_per% 7450IFs%=c% AND c%!spouse%=nil% THEN ENDPROC 7460WHILE s%!spouse%<>c% 7470 s%=s%!spouse% 7480ENDWHILE 7490s%!spouse%=c%!spouse% 7500s%=personnode%!spouse% 7510IFs%!marriagedate%>c%!marriagedate% THEN c%!spouse%=s%:personnode%!spouse%=c%:ENDPROC 7520WHILE s%!spouse%<>nil% AND !(s%!spouse%+marriagedate%)<c%!marriagedate% 7530 s%=s%!spouse% 7540ENDWHILE 7550t%=s%!spouse%:s%!spouse%=c% 7560c%!spouse%=t%:ENDPROC 7570: 7580DEFPROCcheckicons 7590LOCALa$ 7600a$="Are You Sure You wish to Delete?" 7610block%!0=check% 7620block%!4=100:block%!8=50:block%!12=400:block%!16=100 7630block%!20=&C700903D:$(block%+24)="YES" 7640SYS "Wimp_CreateIcon",0,block% TO dok% 7650block%!4=500:block%!12=800 7660$(block%+24)="NO" 7670SYS "Wimp_CreateIcon",0,block% TO dcancel% 7680block%!20=&17000339 7690block%!4=100:block%!8=300:block%!12=800:block%!16=400 7700block%!24=checkdata%:block%!28=&FFFFFFFF 7710block%!32=LEN(a$):$checkdata%=a$ 7720namedata%=checkdata%+LENa$+2 7730SYS "Wimp_CreateIcon",0,block% 7740$(checkdata%+LENa$+2)="David Peter Breakwell" 7750block%!24=namedata% 7760block%!32=LEN($(namedata%)) 7770block%!8=200:block%!16=300 7780SYS "Wimp_CreateIcon",0,block% 7790ENDPROC 7800DEFFNdelete 7810PROCcopyfrom(current_per%,persd%) 7820IFroot%=nil% THEN =0 7830$(namedata%)=$current_per%+" "+$(current_per%+surname%) 7840IFabove% THEN $(namedata%)=$(namedata%)+"'s Parents" 7850!block%=check% 7860SYS "Wimp_GetWindowState",0,block% 7870SYS "Wimp_OpenWindow",0,block% 7880 MOUSE RECTANGLE block%!4,block%!8,block%!12-block%!4,block%!16-block%!8 7890=0 7900: 7910DEFPROCdeleteperson(i%) 7920LOCALs%,t% 7930IF i%<>dcancel% AND above% THEN PROCdeleteparent:ENDPROC 7940IF i%=dcancel% THEN 7950ELSE 7960 IF spoused% THEN 7970 s%=personnode% 7980 WHILE s%!spouse%<>current_per% 7990 s%=s%!spouse% 8000 ENDWHILE 8010 s%!spouse%=current_per%!spouse% 8020 PROCaddtolist(current_per%) 8030 current_per%=personnode% 8040 spoused%=FALSE 8050 ELSE 8060 WHILE current_per%!spouse%<>nil% 8070 s%=!(current_per%!spouse%+spouse%) 8080 PROCaddtolist(current_per%!spouse%) 8090 current_per%!spouse%=s% 8100 ENDWHILE 8110 IF current_per%!gen%=0 THEN 8120 PROCadjustroot 8130 current_per%!sibling%=nil% 8140 PROCdeletetree(current_per%) 8150 current_per%=root% 8160 ELSE 8170 PROCadjustnorm 8180 current_per%!sibling%=nil% 8190 PROCdeletetree(current_per%) 8200 current_per%=root% 8210 ENDIF 8220 ENDIF 8230ENDIF 8240PROCenddelete 8250ENDPROC 8260: 8270DEFPROCenddelete 8280!block%=check% 8290SYS "Wimp_CloseWindow",0,block% 8300 MOUSE RECTANGLE 0,0,1280,1024 8310IF current_per%<>nil% THEN PROCcopyto(current_per%) ELSE PROCclearperson 8320SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 8330addstatus%=TRUE 8340IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 8350IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 8360ENDPROC 8370: 8380DEFPROCaddtolist(d%) 8390d%!next%=delete% 8400delete%=d% 8410ENDPROC 8420: 8430DEFPROCadjustroot 8440IF current_per%=root% THEN 8450 IF current_per%!sibling%<>nil% THEN 8460 root%=current_per%!sibling% 8470 ELSE 8480 root%=current_per%!sibling% 8490 IF root%<>nil% THEN PROCdecgen(root%) 8500 ENDIF 8510ELSE 8520 s%=root% 8530 WHILE s%!sibling%<>current_per% 8540 s%=s%!sibling% 8550 ENDWHILE 8560 s%!sibling%=current_per%!sibling% 8570ENDIF 8580ENDPROC 8590: 8600DEFPROCadjustnorm 8610PROCgenpointers(current_per%) 8620p%=genpointers%!(((current_per%!gen%)-1)*4) 8630IFp%!child%=current_per% THEN 8640 p%!child%=current_per%!sibling% 8650ELSE 8660 p%=p%!child% 8670 WHILEp%!sibling%<>current_per% 8680 p%=p%!sibling% 8690 ENDWHILE 8700 p%!sibling%=current_per%!sibling% 8710ENDIF 8720ENDPROC 8730: 8740DEFPROCdecgen(oroot%) 8750IF oroot%<>nil% THEN 8760 oroot%!gen%-=1 8770 PROCdecgen(oroot%!child%) 8780 PROCdecgen(oroot%!sibling%) 8790ENDIF 8800ENDPROC 8810: 8820DEFPROCdeletetree(o%) 8830 LOCAL t% 8840IF o%<>nil% THEN 8850 PROCdeletetree(o%!child%) 8860 PROCdeletetree(o%!sibling%) 8870 WHILE o%!spouse%<>nil% 8880 t%=!(o%!spouse%+spouse%) 8890 PROCaddtolist(o%!spouse%) 8900 o%!spouse%=t% 8910 ENDWHILE 8920 PROCaddtolist(o%) 8930ENDIF 8940ENDPROC 8950: 8960DEFFNload_tree 8970file$=$file_dat% 8980spoused%=FALSE 8990PROCloadfile(file$) 9000=0 9010: 9020DEFPROCloadfile(file$) 9030IF file$="" THEN ENDPROC 9040oldtree$=file$ 9050F%=OPENIN(file$) 9060T%=BGET#F%:PTR#F%=0 9070IF root%<>nil% THEN PROCdeletetree(root%) 9080root%=FNdimperson 9090PROCload_recur(root%) 9100CLOSE#F% 9110PROCcopyto(root%):current_per%=root% 9120SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 9130addstatus%=TRUE 9140IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 9150IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 9160ENDPROC 9170: 9180DEFPROCload_recur(lroot%) 9190PROCload_per(lroot%):T%=lroot% 9200WHILE lroot%!spouse%<>nil% 9210 lroot%!spouse%=FNdimperson 9220 lroot%=lroot%!spouse% 9230 PROCload_per(lroot%) 9240ENDWHILE 9250lroot%=T% 9260IF lroot%!sibling%<>nil% THEN 9270 lroot%!sibling%=FNdimperson 9280 PROCload_recur(lroot%!sibling%) 9290ENDIF 9300IF lroot%!child%<>nil% THEN 9310 lroot%!child%=FNdimperson 9320 PROCload_recur(lroot%!child%) 9330ENDIF 9340ENDPROC 9350: 9360DEFPROCload_per(mem%) 9370LOCAL o% 9380INPUT#F%,$(mem%+fname%),$(mem%+surname%) 9390INPUT#F%,mem%!birthdate%,mem%!deathdate% 9400INPUT#F%,mem%!marriagedate%,mem%!divorcedate% 9410INPUT#F%,mem%!sibling%,mem%!child%,mem%!spouse% 9420INPUT#F%,mem%!gen%:INPUT#F%,mem%!sex% 9430FOR o%=0 TO 15: INPUT#F%, $(mem%+(personlength%-16*65)+o%*65):NEXT 9440ENDPROC 9450: 9460DEFPROCsave_per(mem%) 9470LOCAL o% 9480PRINT#F%,$(mem%+fname%),$(mem%+surname%) 9490PRINT#F%,mem%!birthdate%,mem%!deathdate% 9500PRINT#F%,mem%!marriagedate%,mem%!divorcedate% 9510PRINT#F%,mem%!sibling%,mem%!child%,mem%!spouse% 9520PRINT#F%,mem%!gen%:PRINT#F%,mem%!sex% 9530FOR o%=0 TO 15: PRINT#F%,$(mem%+(personlength%-16*65)+o%*65):NEXT 9540ENDPROC 9550: 9560DEFFNsave_tree(file$) 9570IF root%=nil% THEN =0 9580IF file$="" THEN =0 9590oldtree$=file$ 9600 F%=OPENIN(file$):CLOSE#F%:IF F%<>0 THEN OSCLI("DELETE "+file$) 9610F%=OPENOUT(file$) 9620PROCsave_recur(root%) 9630CLOSE#F% 9640OSCLI("SETTYPE "+file$+" Familyfile") 9650=0 9660: 9670DEFPROCsave_recur(lroot%) 9680PROCsave_per(lroot%) 9690T%=lroot% 9700WHILE lroot%!spouse%<>nil% 9710 PROCsave_per(lroot%!spouse%) 9720 lroot%=lroot%!spouse% 9730ENDWHILE 9740lroot%=T% 9750IF lroot%!sibling%<>nil% THEN 9760 PROCsave_recur(lroot%!sibling%) 9770ENDIF 9780IF lroot%!child%<>nil% THEN 9790 PROCsave_recur(lroot%!child%) 9800ENDIF 9810ENDPROC 9820: 9830DATA"=","<",">","<=",">=","<>" 9840: 9850DEFPROCfindicons 9860LOCALi%,l%,loop%,inner% 9870l%=17*7+20+findicon% 9880!block%=findwind% 9890FORloop%=1 TO 4 9900RESTORE 9830 9910FORinner%=1 TO 6 9920block%!24=l%+inner%*3+loop%*20 9930block%!28=&FFFFFFFF 9940IF inner%=1 THEN block%!20=&C720312D ELSE block%!20=&C700312D 9950READ $(block%!24):block%!4=520+((inner%-1)*60) 9960block%!8=390-((loop%+2)*60) 9970block%!32=LEN$(block%!24) 9980block%!12=block%!4+50 9990block%!16=block%!8+50 10000SYS "Wimp_CreateIcon",0,block% TO i% 10010find_icon_num(loop%,inner%)=i% 10020find_icon_num(loop%,0)=find_icon_num(loop%,1) 10030NEXT, 10040ENDPROC 10050: 10060DEFPROCfindclick 10070IF block%!16 = fok% THEN PROCfindperson:ENDPROC 10080FOR loop%=1 TO 4 10090FOR inner%=1 TO 6 10100IF block%!16=find_icon_num(loop%,inner%) THEN 10110 block%!20=findwind% 10120 block%!24=find_icon_num(loop%,0) 10130 find_icon_num(loop%,0)=block%!16 10140 block%!32=0 10150 block%!28=1<<21 10160 SYS "Wimp_SetIconState",0,block%+20 10170 block%!24=find_icon_num(loop%,0) 10180 find_icon_num(loop%,0)=block%!16 10190 block%!32=0 10200 block%!28=1<<21 10210 SYS "Wimp_SetIconState",0,block%+20 10220ENDIF 10230NEXT, 10240ENDPROC 10250: 10260DEFPROCfindperson 10270LOCAL find% 10280PROCcopyfrom(findblk%,fpersd%) 10290find%=nil% 10300PROCfindrecur(root%,find%) 10310IF find%<>nil% THEN 10320 spoused%=FALSE 10330 personnode%=nil% 10340 current_per%=find% 10350 PROCcopyto(current_per%) 10360ELSE 10370ENDIF 10380!block%=findwind% 10390SYS "Wimp_CloseWindow",,block% 10400SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 10410SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 10420ENDPROC 10430: 10440DEFPROCfindrecur(lroot%,RETURN find%) 10450IF find%<>nil% THEN ENDPROC 10460IF FNmatch(lroot%) THEN find%=lroot% :ENDPROC 10470T%=lroot% 10480WHILE lroot%!spouse%<>nil% AND find%=nil% 10490 IF FNmatch(lroot%!spouse%) THEN find%=lroot% 10500 lroot%=lroot%!spouse% 10510ENDWHILE 10520lroot%=T% 10530IF lroot%!sibling%<>nil% THEN PROCfindrecur(lroot%!sibling%,find%) 10540IF lroot%!child%<>nil% THEN PROCfindrecur(lroot%!child%,find%) 10550ENDPROC 10560: 10570DEFFNmatch(lroot%) 10580LOCAL m% 10590m%=TRUE 10600FOR loop%=1 TO 6 10610CASE loop% OF 10620 WHEN 1 : IF $(fpersd%)<>"" AND $(lroot%)<>"" THEN 10630 m%=INSTR($lroot%,$fpersd%) 10640 ENDIF 10650 10660 IF $(fpersd%) ="" THEN m%=TRUE 10670 WHEN 2 : IF $(fpersd%+surname%)<>"" AND $(lroot%+surname%)<>"" THEN 10680 m%=m% AND INSTR($(lroot%+surname%),$(fpersd%+surname%)) 10690 ENDIF 10700 10710 IF $(fpersd%+surname%)="" THEN m%=m% AND TRUE 10720 WHEN 3 : IF findblk%!birthdate%<>0 THEN m%=m% AND FNdate(loop%,birthdate%,m%) 10730 WHEN 4 : IF findblk%!deathdate%<>0 THEN m%=m% AND FNdate(loop%,deathdate%,m%) 10740 WHEN 5 : IF findblk%!marriagedate%<>0 THEN 10750 m%=m% AND FNdate(loop%,marriagedate%,m%) 10760 ENDIF 10770 WHEN 6 : IF findblk%!divorcedate%<>0 THEN 10780 m%=m% AND FNdate(loop%,divorcedate%,m%) 10790 ENDIF 10800ENDCASE 10810NEXT 10820=m% 10830: 10840DEFFNdate(loop%,O%,m%) 10850LOCAL fdate%,cdate% 10860fdate%=findblk%!O% 10870cdate%=lroot%!O% 10880IF cdate%=0 AND fdate%<>0 THEN =FALSE ELSE IF cdate%=0 THEN =m% 10890CASE FNfindw(loop%-2) OF 10900 WHEN 1 : M%=fdate%=cdate% 10910 WHEN 2 : M%=cdate%<fdate% 10920 WHEN 3 : M%=cdate%>fdate% 10930 WHEN 4 : M%=cdate%<=fdate% 10940 WHEN 5 : M%=cdate%>=fdate% 10950 WHEN 6 : M%=cdate%<>fdate% 10960ENDCASE 10970=M% 10980: 10990DEFFNfindw(loop%) 11000LOCAL T% 11010T%=1 11020WHILE find_icon_num(loop%,T%)<>find_icon_num(loop%,0) 11030 T%=T%+1 11040ENDWHILE 11050=T% 11060: 11070DEFFNfind 11080!block%=findwind% 11090SYS "Wimp_GetWindowState",0,block% 11100SYS "Wimp_OpenWindow",0,block% 11110=0 11120: 11130DEFFNoverview 11140IF overview% THEN 11150 overview%=FALSE:!block%=over% 11160 SYS "Wimp_GetWindowState",0,block% 11170 SYS "Wimp_CloseWindow",0,block% 11180ELSE 11190 overview%=TRUE 11200 !block%=over% 11210 addstatus%=TRUE 11220 SYS "Wimp_GetWindowState",0,block% 11230 SYS "Wimp_OpenWindow",0,block% 11240ENDIF 11250=0 11260: 11270DEFPROCredrawover 11280 PROCdrawtree(root%) 11290ENDPROC 11300: 11310DEFPROCmaketree(lroot%,x%,y%,mx%,my%, RETURN c% , draw%) 11320LOCAL g%,ox%:r%=32*scaleover 11330IF lroot%=nil% THEN ENDPROC 11340lroot%!col%=x% 11350lroot%!row%=y% 11360column%(lroot%!gen%)=x% 11370IF NOT(draw%) THEN c%=FNcheck(x%,y%,r%,mx%,my%,c%,lroot%) 11380IF lroot%!child%<>nil% THEN 11390ox%=x% 11400 x%=x%-(r%*2.5)*INT(FNcen(lroot%)/2) 11410 IF column%(1+lroot%!gen%)>=x% THEN 11420 x%=column%(1+lroot%!gen%)+2.5*r% 11430 column%(1+lroot%!gen%)=x% 11440 ELSE 11450 column%(1+lroot%!gen%)=x% 11460 ENDIF 11470 PROCmaketree(lroot%!child%,x%,y%-r%*2.75,mx%,my%, c%, draw%) 11480 x%=ox% 11490ENDIF 11500 PROCmaketree(lroot%!sibling%,x%+r%*2.5,y%,mx%,my%, c%, draw%) 11510ENDPROC 11520: 11530DEFPROCdrawtree(lroot%) 11540LOCAL g%,r%:r%=32*scaleover 11550IF lroot%=nil% THEN ENDPROC 11560x%=lroot%!col%:y%=lroot%!row% 11570IF lroot%!gen%<>0 THEN MOVE x%,y%+r%:DRAW x%,y%+(r%*1.25) 11580IF lroot%!gen%=0 AND lroot%<>root% THEN MOVE x%,y%:DRAW x%-1.5*r%,y% 11590IF lroot%!sibling%<>nil% AND lroot%!gen%<>0 THEN 11600 MOVE x%,y%+r%*1.25 11610 DRAW x%+2.5*r%,y%+r%*1.25 11620ENDIF 11630IF lroot%=current_per% THEN g%=8 ELSE g%=12 11640IF spoused% AND personnode%=lroot% THEN g%=13 11650SYS "Wimp_SetColour",g% 11660CIRCLE FILL x%,y%,r% 11670SYS "Wimp_SetColour",7 11680CIRCLE x%,y%,r% 11690IF lroot%!child%<>nil% THEN 11700 MOVE x%,y%-r%:DRAW x%,y%-r%*1.25 11710 ox%=!(lroot%!child%+col%) 11720 n%=INT(FNcen(lroot%)/2) 11730 IF ox%=x% THEN n%=0 11740 DRAW ox%+n%*r%*2.5,y%-r%*1.25 11750 DRAW ox%+n%*r%*2.5,y%-r%*1.75 11760ENDIF 11770PROCdrawtree(lroot%!child%) 11780PROCdrawtree(lroot%!sibling%) 11790ENDPROC 11800: 11810DEFFNcheck(x%,y%,r%,mx%,my%,c%,lroot%) 11820IF mx%>=x%-r% AND mx%<=x%+r% THEN 11830 IF my%>=y%-r% AND my%<=y%+r% THEN c%=lroot% 11840ENDIF 11850=c% 11860: 11870DEFFNcen(lroot%) 11880LOCAL T% 11890lroot%=lroot%!child% 11900 IF lroot%!sibling%=nil% THEN =0 11910T%=0 11920WHILE lroot%<>nil% 11930 T%+=1 11940 lroot%=lroot%!sibling% 11950ENDWHILE 11960=T% 11970: 11980DEFPROCcreate_menu(menx%,meny%) 11990menu$="Main Menu|*@~Save Tree`filewindow%`|Browse<browsemenu$>|*Output<outputmenu$>|" 12000IF root%<>nil% THEN menu$=FNstripstar(menu$) 12010browsemenu$="Browse|*Find{find}|@^Overview{overview}|@^View Data{datawindow}|*Delete<deletemenu$>|*Add<addmenu$>|" 12020deletemenu$="Delete|*Parents{deleteabove}|Person{deletebelow}|" 12030IF root%<>nil% THEN browsemenu$=FNstripstar(browsemenu$) 12040IF current_per%!gen%<>0 THEN deletemenu$=FNstripstar(deletemenu$) 12050IFoverview% THEN MID$(browsemenu$,21,1)="#" 12060IFdataview% THEN MID$(browsemenu$,42,1)="#" 12070outputmenu$="Output|~Main Line`filewindow%`|~Full Tree`filewindow%`|~Export`filewindow%`|" 12080addmenu$="Add|Child{add_child}|Sibling{add_sib}|*Parent{add_parent}|Spouse{add_spouse}|" 12090IF root%<>nil% AND current_per%!gen%=0 THEN addmenu$=FNstripstar(addmenu$) 12100menu%=menblk% 12110PROCmakemenu(menu$,menu%) 12120SYS "Wimp_CreateMenu",,menblk%,menx%,meny% 12130current_menu$=menu$ 12140ENDPROC 12150: 12160DEFPROCmakemenu(menu$, RETURN mem% ) 12170LOCAL t$,loop%,stringtrace%,i%,memcopy% 12180t$=menu$:memcopy%=mem% 12190$mem%=LEFT$(t$,INSTR(t$,"|")-1) 12200t$=MID$(t$,INSTR(t$,"|")+1) 12210mem%?12=7 12220mem%?13=2 12230mem%?14=7 12240mem%?15=0 12250mem%!16=172 12260mem%!20=44 12270mem%!24=0 12280mem%!28=mem%+32 12290 mem%+=28 12300memcopy%=mem% 12310pre$="*@#%^~":post$="{[<|`" 12320REPEAT 12330 flags%=0:shade%=FALSE 12340 WHILE INSTR(pre$,LEFT$(t$,1))<>0 12350 CASE LEFT$(t$,1) OF 12360 WHEN "*" : shade%=TRUE 12370 WHEN "@" : flags%+=2 12380 WHEN "%" : flags%+=4 12390 WHEN "#" : flags%+=1 12400 WHEN "~" : flags%+=8 12410 ENDCASE 12420 t$=MID$(t$,2) 12430 ENDWHILE 12440 IF INSTR(t$,"|")=LEN(t$) THEN flags%+=&80 12450 mem%!0=flags% 12460 mem%!4=-1 12470 IF shade% THEN mem%!8=&7400021 ELSE mem%!8=&7000021 12480 IF (flags%AND4)<>4 THEN 12490 loop%=0:i%=1000 12500 REPEAT 12510 loop%+=1 12520 l%=INSTR(t$,MID$(post$,loop%,1)) 12530 IF i%>l% AND l%<>0 THEN i%=l% 12540 UNTIL loop%=LEN(post$) 12550 $(mem%+12)=LEFT$(t$,i%-1) 12560 t$=MID$(t$,INSTR(t$,"|")+1) 12570 ELSE 12580 mem%!8=&7000F29 12590 !(mem%+16)=-1 12600 i%=INSTR(t$,"[")+1 12610 !(mem%+12)=EVAL(MID$(t$,i%,INSTR(t$,",")-i%)) 12620 i%=INSTR(t$,",")+1 12630 !(mem%+20)=EVAL(MID$(t$,i%,INSTR(t$,"]")-i%)) 12640 t$=MID$(t$,INSTR(t$,"|")+1) 12650 ENDIF 12660 mem%=mem%+24 12670UNTIL t$="" 12680t$=menu$ 12690loop%=memcopy%:stringtrace%=INSTR(t$,"|")+1 12700REPEAT 12710REPEAT 12720 stringtrace%+=1 12730 i%=INSTR("|<`",MID$(t$,stringtrace%,1)) 12740UNTIL i%<>0 12750IF i%=1 THEN loop%=loop%+24:stringtrace%+=1 12760IF i%=2 THEN 12770 !(loop%+4)=mem% 12780 s$=MID$(t$,stringtrace%+1,INSTR(t$,">",stringtrace%)-stringtrace%-1) 12790 PROCmakemenu(EVAL(s$),mem%) 12800 stringtrace%=INSTR(t$,">",stringtrace%) 12810ENDIF 12820IF i%=3 THEN 12830 s$=MID$(t$,stringtrace%+1,INSTR(t$,"`",stringtrace%)-stringtrace%-1) 12840 !(loop%+4)=EVAL(s$) 12850 stringtrace%=INSTR(t$,"`",stringtrace%+1) 12860ENDIF 12870UNTIL stringtrace%>=LEN(t$) 12880ENDPROC 12890: 12900DEFPROCcreate_icon_menu(menx%,meny%) 12910meny%=96+(3*44) 12920menu$="Family Tree|~Info`infowindow%`|New Tree{new_tree}|Quit{fin}|" 12930menu%=menblk% 12940PROCmakemenu(menu$,menu%) 12950SYS "Wimp_CreateMenu",,menblk%,menx%,meny% 12960current_menu$=menu$ 12970ENDPROC 12980: 12990DEFPROCcreate_over(menx%,meny%) 13000 menu$="Overview|Scale<scalemenu$>|Default{defaultover}|Quit{overquit}|" 13010 scalemenu$="Scale|%1[scale%,9]{rescale_over}|" 13020 menu%=menblk% 13030 PROCmakemenu(menu$,menu%) 13040 SYS "Wimp_CreateMenu",,menblk%,menx%,meny% 13050 current_menu$=menu$ 13060ENDPROC 13070: 13080DEFPROCcreate_data(mx%,my%) 13090menu$="Data|Print Data{printper}|" 13100 menu%=menblk% 13110 PROCmakemenu(menu$,menu%) 13120 SYS "Wimp_CreateMenu",,menblk%,mx%,my% 13130 current_menu$=menu$ 13140ENDPROC 13150: 13160DEFFNprintper 13170PROCcopyfrom(current_per%,persd%) 13180VDU 2 13190PRINT"Printout for ";$(current_per%);" "; 13200PRINT$(current_per%+surname%);" ("; 13210PRINTFNconvnumdate(current_per%!birthdate%);" - "; 13220PRINTFNconvnumdate(current_per%!deathdate%);")" 13230IF current_per%!spouse%<>nil% THEN 13240 PRINT"Married on ";FNconvnumdate(current_per%!marriagedate%);" to "; 13250 PRINT$(current_per%!spouse%);" ";$(surname%+current_per%!spouse%) 13260 PRINT"Divorced: ";FNconvnumdate(current_per%!divorcedate%) 13270ENDIF 13280IF current_per%!child%<>nil% THEN 13290 o%=1:l%=current_per%!child% 13291 PRINT"Children:" 13300 WHILE l%<>nil% 13310 PRINTFNconvnumdate(l%!birthdate%);": ";$(l%);" ";$(l%+surname%) 13320 l%=l%!sibling% 13330ENDWHILE 13340PRINT'"Personal Details"' 13350FOR o%=0 TO 15:FOR l%=1 TO 60 13360 IF MID$(dataset$(o%),l%,1)<>" " THEN PRINTMID$(dataset$(o%),l%,1); ELSE PRINTMID$(datamask$(o%),l%,1); 13370NEXT:PRINT:NEXT 13380VDU3 13390=0 13400DEFFNoverquit 13410 overview%=FALSE 13420 !block%=over% 13430 SYS "Wimp_CloseWindow",,block% 13440=0 13450: 13460DEFFNrescale_over 13470 scaleover=VAL($scale%) 13480 addstatus%=TRUE 13490 SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 13500=0 13510: 13520DEFFNdefaultover 13530$scale%="1" 13540=FNrescale_over 13550: 13560: 13570DEFPROCmenu_select 13580menu$=current_menu$ 13590SYS "Wimp_GetPointerInfo",,q% 13600but%=q%!8 13610IFblock%!0<>-1 THEN PROCrec_decode(menu$,block%) 13620IF (but%AND1)=1 THEN 13630 PROCcreate_menu(menx%,meny%) 13640FORloop%=0TOmaxgen%:column%(loop%)=0:NEXT 13650ELSE 13660 current_menu$="" 13670ENDIF 13680ENDPROC 13690: 13700DEFPROCrec_decode(menu$,mem%) 13710LOCAL i%,l% 13720fn$="" 13730i%=1+!mem%:l%=1 13740REPEAT 13750 l%=INSTR(menu$,"|",l%+1) 13760 i%-=1 13770UNTIL i%=0 13780i%=INSTR(menu$,"{",l%) 13790IF mem%!4=-1 THEN 13800 IF i%<INSTR(menu$,"|",l%+1) AND i%<>0 THEN 13810 fn$=MID$(menu$,i%+1,INSTR(menu$,"}",i%)-i%-1) 13820 ENDIF 13830ELSE 13840 i%=INSTR(menu$,"<",l%) 13850 l%=INSTR(menu$,">",l%) 13860 PROCrec_decode(EVAL(MID$(menu$,i%+1,l%-i%-1)),mem%+4) 13870ENDIF 13880IFmenu$=addmenu$ THEN addstatus%=TRUE 13890IF fn$<>"" THEN i%=EVAL("FN"+fn$) 13900IFmenu$=addmenu$ THEN !block%=over%:SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 13910 fn$="" 13920ENDPROC 13930: 13940DEFFNstripstar(a$) 13950LOCAL l% 13960FORl%=1TOLENa$ 13970 IF MID$(a$,l%,1)="*" THEN MID$(a$,l%,1)="^" 13980NEXT 13990=a$ 14000: 14010DEFPROCgotoperson(mx%,my%) 14020IF POINT(mx%,my%)=0 THEN ENDPROC 14030!block%=over% 14040SYS "Wimp_GetWindowState",0,block% 14050b%=block%+4 14060x%=(b%!0-b%!16) 14070y%=(b%!12-b%!20) 14080column%()=0 14090r%=32*scaleover 14100PROCcopyfrom(current_per%,persd%) 14110personnode%=nil%:spoused%=FALSE 14120PROCfindp(root%,mx%-x%,my%-y%, current_per%) 14130PROCcopyto(current_per%) 14140addstatus%=FALSE 14150SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 14160SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 14170IF dataview% THEN SYS "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 14180ENDPROC 14190: 14200DEFPROCfindp(lroot%,mx%,my%, RETURN c%) 14210r%=32*scaleover 14220IF lroot%=nil% THEN ENDPROC 14230c%=FNcheck(lroot%!col%,lroot%!row%,r%,mx%,my%,c%,lroot%) 14240PROCfindp(lroot%!sibling%,mx%,my%,c%) 14250PROCfindp(lroot%!child%,mx%,my%, c%) 14260ENDPROC 14270: 14280DEFPROCmessage(mem%) 14290CASE block%!16 OF 14300 WHEN 3 : PROCloadfromfiler(block%) 14310 WHEN &400C0 : PROCfilesavewindow 14320 WHEN 2 : PROCsavetofiler(block%) 14330 WHEN 1 : PROCsavetoscrap 14340ENDCASE 14350ENDPROC 14360: 14370DEFPROCloadfromfiler(mem%) 14380LOCAL loop%,F%,a$ 14390IF mem%!40<>treefile% THEN ENDPROC 14400a$="" 14410a$=FNzerostring(44+mem%) 14420$(fileicon%+44)=a$ 14430F%=OPENIN(a$) 14440oldtree$=a$ 14450IF root%<>nil% THEN PROCdeletetree(root%) 14460root%=FNdimperson 14470PROCload_recur(root%) 14480CLOSE#F% 14490PROCcopyto(root%):current_per%=root% 14500SYS "Wimp_ForceRedraw",main%,0,0,1280,1024 14510addstatus%=TRUE:spoused%=FALSE 14520IF overview% THEN SYS "Wimp_ForceRedraw",over%,0,0,1280,1024 14530IF mem%!12<>0 THEN END 14540mem%!16=4:mem%!12=1 14550SYS "Wimp_SendMessage",18,block%,block%!4 14560ENDPROC 14570: 14580DEFPROCfilewinicons 14590fileok%=FNplaceicon(filewindow%,180,10,"OK") 14600!fileicon%=filewindow% 14610fileicon%!4=10:fileicon%!8=10 14620fileicon%!12=170:fileicon%!16=60 14630fileicon%!20=&700F125 14640fileicon%!24=fileicon%+44 14650$(fileicon%+44)="treefile" 14660fileicon%!28=-1:fileicon%!32=255 14670SYS "Wimp_CreateIcon",,fileicon% 14680PROCplacefileicon(0) 14690ENDPROC 14700: 14710DEFPROCplacefileicon(N%) 14720fileblock%=fileicon%+300 14730!fileblock%=filewindow% 14740fileblock%!4=2 14750SYS "Wimp_DeleteIcon",,fileblock% 14760fileblock%!4=90:fileblock%!8=80 14770fileblock%!12=160:fileblock%!16=150 14780fileblock%!20=&700613A 14790fileblock%!24=fileblock%+40 14800fileblock%!28=1 14810CASE N% OF 14820 WHEN 0 : $(fileblock%+40)="file_000":$(fileicon%+44)=oldtree$ 14830 WHEN 1 : $(fileblock%+40)="file_aff":$(fileicon%+44)=olddraw$ 14840 WHEN 2 : $(fileblock%+40)="file_cde":$(fileicon%+44)=oldcsv$ 14850ENDCASE 14860fileblock%!32=LEN($(fileblock%+40)) 14870SYS "Wimp_CreateIcon",,fileblock% TO filetypeicon% 14880ENDPROC 14890: 14900DEFPROCdragfile 14910!block%=filewindow% 14920SYS "Wimp_GetWindowState",,block% 14930b%=block%+20 14940b%!0=0 14950b%!4=5:b%!8=block%!4+90 14960b%!12=block%!8+80 14970b%!16=b%!8+70 14980b%!20=b%!12+70 14990b%!24=0:b%!28=0:b%!32=1279:b%!36=1024:b%!40=0:b%!44=0:b%!48=0:b%!52=0 15000q%!0=11:q%!4=4:q%!8=-1 15010SYS "OS_ReadVduVariables",q%,q% 15020b%!32=(q%!0+1)<<(q%!4) 15030SYS "Wimp_DragBox",,b% 15040ENDPROC 15050: 15060DEFPROCfilesavewindow 15070CASE block%!32 OF 15080 WHEN 0 : PROCplacefileicon(0):filesave%=0 15090 SYS "Wimp_CreateSubMenu",,block%!20,block%!24,block%!28 15100 WHEN 2 : IF block%!36=2 THEN PROCplacefileicon(2) ELSE PROCplacefileicon(1) 15110 SYS "Wimp_CreateSubMenu",,block%!20,block%!24,block%!28 15120 filesave%=block%!36+1 15130 ENDCASE 15140ENDCASE 15150ENDPROC 15160: 15170DEFPROCdragend 15180SYS "Wimp_GetPointerInfo",,block% 15190IF block%!12=over% OR block%!12=filewindow% OR block%!12=main% OR block%!12=findwind% THEN ENDPROC 15200b%=block%+20 15210!b%=44+LEN($(fileicon%+44)) 15220!b%+=4-(!b% MOD 4) 15230b%!4=0:b%!8=0 15240b%!12=0 15250b%!16=1 15260b%!20=block%!12 15270b%!24=block%!16 15280b%!28=block%!0 15290b%!32=block%!4 15300b%!36=2000 15310CASE filesave% OF 15320 WHEN 0 : b%!40=treefile% 15330 WHEN 3 : b%!40=csvfile% 15340 OTHERWISE : b%!40=&AFF 15350ENDCASE 15360$(b%+44)=FNzerostring(fileicon%+44) 15370SYS "Wimp_SendMessage",17,b%,block%!12 15380IF block%!12=-2 THEN SYS "Wimp_SendMessage",17,b%,-2,block%!16 15390ENDPROC 15400: 15410DEFPROCsavetofiler(block%) 15420CASE filesave% OF 15430 WHEN 0 : o%=FNsave_tree(FNzerostring(block%+44)) 15440 oldtree$=FNzerostring(block%+44) 15450 WHEN 1 : PROCsavevertdraw(FNzerostring(block%+44)) 15460 olddraw$=FNzerostring(block%+44) 15470 WHEN 2 : PROCsavehoridraw(FNzerostring(block%+44),TRUE) 15480 olddraw$=FNzerostring(block%+44) 15490 WHEN 3 : PROCsavecsv(FNzerostring(block%+44)) 15500 oldcsv$ =FNzerostring(block%+44) 15510ENDCASE 15520block%!16=3:SYS "Wimp_SendMessage",17,block%,block%!4 15530SYS "Wimp_CreateMenu",-1 15540filesave%=-1 15550ENDPROC 15560: 15570DEFFNzerostring(mem%) 15580LOCAL a$ 15590WHILE ?mem%>31 15600 a$+=CHR$(?mem%) 15610 mem%+=1 15620ENDWHILE 15630=a$ 15640: 15650DEFPROCsavetoscrap 15660$(block%+44)="<Wimp$Scrap>" 15670?(block%+44+LEN($(block%+44)))=0 15680block%!0=44+LEN($(block%+44))+1 15690block%!0+=4-(block%!0 MOD 4) 15700block%!16=2 15710block%!36=-1 15720block%!12=block%!8 15730SYS "Wimp_SendMessage",17,block%,block%!4 15740ENDPROC 15750: 15760DEFPROCsavevertdraw(file$) 15770F%=FNopendraw(file$) 15780PROCdrawvert(F%) 15790CLOSE#F% 15800OSCLI("SETTYPE "+file$+" &AFF") 15810addstatus%=TRUE 15820ENDPROC 15830: 15840DEFFNopendraw(file$) 15850F%=OPENOUT(file$) 15860 BPUT#F%,"Draw"; 15870 PROCint(201) 15880 PROCint(0) 15890 BPUT#F%,"FAMILYTREE "; 15900=F% 15910: 15920DEFFNmaxycalc 15930LOCAL l%,h%,h1%,h2%,loop% 15940loop%=genpointers%:h%=0 15950REPEAT 15960h2%=0 15970 h2%=charspc%*5 15980 l%=!loop% 15990 WHILE l%<>nil% AND l%!spouse%<>nil% 16000 h2%+=charspc%*7 16010 l%=l%!spouse% 16020 ENDWHILE 16030 h1%=0 16040 IF !(gen%+!loop%)=0 THEN l%=root% ELSE l%=!(!(loop%-4)+child%) 16050 WHILE l%!sibling%<>nil% 16060 h1%+=charspc% 16070 l%=l%!sibling% 16080ENDWHILE 16090 IF h1%>h2% THEN h2%=h1% 16100 h%+=h2% 16110 loop%+=4 16120UNTIL !(loop%-4)=current_per% 16130=h% 16140: 16150DEFPROCtypesimple(p%,xpos%,ypos%,F%) 16160LOCAL l%,l$ 16170l$=$(p%)+" "+$(p%+surname%)+" ( " 16180IF p%!birthdate%<>0 THEN l$+=STR$INT((p%!birthdate% AND &FFFF0000)/&FFFF) 16190l$+=" - " 16200IF p%!deathdate%<>0 THEN l$+=STR$INT((p%!deathdate% AND &FFFF0000)/&FFFF) 16210l$+=" )" 16220PROCplacetext(l$,xpos%,ypos%,F%) 16230ENDPROC 16240: 16250DEFPROCplacetext(l$,xpos%,ypos%,F%) 16260LOCAL l% 16270l%=4-(LEN(l$)MOD4) 16280PROCint(1):PROCint(24+28+LEN(l$)+l%) 16290PROCint(xpos%):PROCint(ypos%):PROCint(xpos%+LEN(l$)*(charspc%/2)) 16300PROCint(ypos%+charspc%):PROCint(0):PROCint(0):PROCint(0) 16310PROCint(charspc%/2):PROCint(charspc%):PROCint(xpos%) 16320PROCint(ypos%) 16330BPUT#F%,l$; 16340WHILE l%<>0 16350 BPUT#F%,0 16360 l%-=1 16370ENDWHILE 16380ENDPROC 16390: 16400DEFPROCint(I%) 16410BPUT#F%,I% 16420BPUT#F%,I%>>8 16430BPUT#F%,I%>>16 16440BPUT#F%,I%>>32 16450ENDPROC 16460: 16470DEFPROCdrawvert(F%) 16480LOCAL col%,spcol%,sibcol%,colspc%,yloop%,ynow%,firstchild% 16490col%=0:spcol%=charspc%*15:sibcol%=charspc%*30 16500colspc%=charspc%*15 16510PROCgenpointers(current_per%) 16520yloop%=FNmaxycalc:yparent%=yloop% 16530ynow%=yloop% 16540PROCint(0):PROCint(0):PROCint(charspc%*300):PROCint(yloop%) 16550ploop%=genpointers% 16560REPEAT 16570yparent%=ynow% 16580ynow%=yloop% 16590 person%=!ploop% 16600 IF person%!gen%=0 THEN 16610 firstchild%=root% 16620 ELSE 16630 firstchild%=!(!(ploop%-4)+child%) 16640 ENDIF 16650 y%=yloop% 16660 WHILE firstchild%<>nil% 16670 IF firstchild%<>person% THEN 16680 PROCtypesimple(firstchild%,sibcol%,y%,F%) 16690 y%-=charspc% 16700 ENDIF 16710 firstchild%=firstchild%!sibling% 16720 ENDWHILE 16730 yloop%=FNplaceperson(person%,col%,yloop%,spcol%,colspc%,person%!spouse%,F%,yparent%) 16740 person%=person%!spouse% 16750 WHILE person%!spouse%<>nil% AND person%<>nil% 16760 yloop%=FNplaceperson(nil%,col%,yloop%,spcol%,colspc%,person%!spouse%,F%,yparent%) 16770 person%=person%!spouse% 16780 ENDWHILE 16790 IF y%<yloop% THEN 16800 yloop%=y% 16810 ENDIF 16820 yloop%-=3*charspc% 16830 ploop%+=4 16840UNTIL !(ploop%-4)=current_per% 16850ENDPROC 16860: 16870DEFFNplaceperson(p%,xpos%,ypos%,spos%,colspc%,sp%,F%,yp%) 16880LOCAL xs%,ys%,xe%,ye% 16890IF p%<>nil% THEN 16900 PROCplacetext($p%,xpos%+(colspc%-((charspc%/2)*LEN$p%))/2,ypos%,F%) 16910 PROCplacetext($(p%+surname%),xpos%+(colspc%-((charspc%/2)*LEN$(p%+surname%)))/2,ypos%-charspc%,F%) 16920 PROCplacedate(p%,birthdate%,xpos%,ypos%-(2*charspc%),"Born: ",F%) 16930 PROCplacedate(p%,deathdate%,xpos%,ypos%-(3*charspc%),"Died: ",F%) 16940ENDIF 16950IF sp%<>nil% THEN 16960 PROCplacetext($sp%,spos%+(colspc%-(charspc%/2)*LEN$sp%)/2,ypos%,F%) 16970 PROCplacetext($(sp%+surname%),spos%+(colspc%-(charspc%/2)*LEN$(sp%+surname%))/2,ypos%-charspc%,F%) 16980 PROCplacedate(sp%,birthdate%,spos%,ypos%-(2*charspc%),"Born: ",F%) 16990 PROCplacedate(sp%,deathdate%,spos%,ypos%-(3*charspc%),"Died: ",F%) 17000 PROCplacedate(sp%,marriagedate%,spos%,ypos%-(4*charspc%),"Married: ",F%) 17010 PROCplacedate(sp%,divorcedate%,spos%,ypos%-(5*charspc%),"Divorced: ",F%) 17020ENDIF 17030IF p%<>nil% AND sp%<>nil% THEN 17040 xs%=xpos%+colspc%-(colspc%-((charspc%/2)*LEN$p%))/2 17050 ys%=ypos%+(charspc%/2):ye%=ys% 17060 xe%=spos%+(colspc%-(charspc%/2)*LEN$sp%)/2 17070 PROClineheader(1,xs%,ys%,ye%,ys%) 17080 PROClinecoord(2,xs%+charspc%/2,ys%):PROClinecoord(8,xe%-charspc%/2,ye%) 17090 PROClineend 17100 ELSE 17110 IF p%=nil% AND sp%<>nil% THEN 17120 xs%=spos%-(charspc%/2)*10 17130 xe%=spos%+(colspc%-(charspc%/2)*LEN$sp%)/2 17140 PROClineheader(2,xs%,ypos%,xe%,ypos%+5*charspc%) 17150 PROClinecoord(2,xe%-charspc%/2,ypos%+charspc%/2) 17160 PROClinecoord(8,xs%,ypos%+charspc%/2) 17170 PROClinecoord(8,xs%,ypos%+charspc%*5.5) 17180 PROClineend 17190 ENDIF 17200ENDIF 17210IF p%<>nil% AND p%!gen%<>0 THEN 17220 xs%=xpos%+colspc%/2 17230 xe%=xpos%+colspc% 17240 ys%=ypos%+1.5*charspc% 17250 ye%=yp%+charspc%/2 17260 PROClineheader(3,xs%,ys%,xe%,ye%) 17270 PROClinecoord(2,xs%,ys%):PROClinecoord(8,xs%,ys%+charspc%/2) 17280 PROClinecoord(8,xe%,ys%+charspc%/2):PROClinecoord(8,xe%,ye%) 17290 PROClineend 17300ENDIF 17310ypos%-=5*charspc% 17320IF sp%<>nil% THEN ypos%-=2*charspc% 17330=ypos% 17340: 17350DEFPROClineheader(n%,xs%,ys%,xe%,ye%) 17360PROCint(2) 17370PROCint(24+16+4+12+n%*12) 17380PROCint(xs%):PROCint(ys%) 17390PROCint(xe%):PROCint(ye%) 17400PROCint(-1):PROCint(0) 17410PROCint(0):PROCint(0) 17420ENDPROC 17430: 17440DEFPROClinecoord(n%,xs%,ys%) 17450PROCint(n%) 17460PROCint(xs%):PROCint(ys%) 17470ENDPROC 17480: 17490DEFPROClineend 17500PROCint(0) 17510ENDPROC 17520: 17530DEFPROCplacedate(p%,d%,xpos%,ypos%,add$,F%) 17540IF p%!d%<>0 THEN 17550 d$=add$+FNconvnumdate(p%!d%) 17560 PROCplacetext(d$,xpos%+(colspc%-(charspc%/2)*LENd$)/2,ypos%,F%) 17570ENDIF 17580ENDPROC 17590: 17600DEFPROCsavehoridraw(file$,full%) 17610F%=FNopendraw(file$) 17620PROCdrawhori(F%,full%) 17630CLOSE#F% 17640OSCLI("SETTYPE "+file$+" &AFF") 17650addstatus%=TRUE 17660ENDPROC 17670: 17680DEFPROCdrawhori(F%,full%) 17690LOCAL x% 17700mincol%=&FFFFFFF:maxcol%=0 17710column%()=-&FFFFFFF:maxg%=0 17720PROCsetcolumn(root%,200,mincol%,maxg%) 17730maxg%+=1 17740PROCadjustcolumn(root%,mincol%,maxcol%) 17750pcol%=15*charspc% 17760x%=pcol%*maxcol% 17770PROCint(0):PROCint(0) 17780PROCint(x%):PROCint(maxg%*10*charspc%) 17790PROCdrawhoritree(root%,maxg%*10*charspc%,pcol%,FALSE,F%) 17800ENDPROC 17810: 17820DEFPROCsetcolumn(root%,column%, RETURN mcol%, RETURN mg%) 17830LOCAL lroot% 17840IF root%=nil% THEN ENDPROC 17850IF root%!gen%>mg% THEN mg%=root%!gen% 17860IF column%<mcol% THEN mcol%=column% 17870IF column%<=column%(root%!gen%) THEN 17880 column%=column%(root%!gen%)+1 17890ENDIF 17900root%!col%=column% 17910n%=FNnoofchildren(root%) 17920PROCsetcolumn(root%!child%,column%+1-(n%/2),mcol%,mg%) 17930lroot%=root%!spouse% 17940WHILE lroot%<>nil% 17950 column%+=1 17960 lroot%!col%=column% 17970 lroot%=lroot%!spouse% 17980ENDWHILE 17990column%(root%!gen%)=column% 18000PROCsetcolumn(root%!sibling%,column%+1,mcol%,mg%) 18010ENDPROC 18020: 18030DEFPROCadjustcolumn(root%,mincol%, RETURN maxcol%) 18040LOCAL lroot% 18050IF root%=nil% THEN ENDPROC 18060root%!col%-=mincol% 18070IF root%!col%>maxcol% THEN maxcol%=root%!col% 18080lroot%=root%!spouse% 18090WHILE lroot%<>nil% 18100 lroot%!col%-=mincol% 18110 IF root%!col%>maxcol% THEN maxcol%=root%!col% 18120 lroot%=lroot%!spouse% 18130ENDWHILE 18140PROCadjustcolumn(root%!child%,mincol%,maxcol%) 18150PROCadjustcolumn(root%!sibling%,mincol%,maxcol%) 18160ENDPROC 18170: 18180DEFPROCdrawhoritree(p%,ypos%,colspc%,sp%,F%) 18190IFp%=nil% THEN ENDPROC 18200height%=ypos%-8*charspc% 18210xpos%=p%!col%*colspc% 18220IF NOTsp% THEN 18230PROCplacetext($p%,xpos%+(colspc%-((charspc%/2)*LEN$p%))/2,ypos%,F%) 18240PROCplacetext($(p%+surname%),xpos%+(colspc%-((charspc%/2)*LEN$(p%+surname%)))/2,ypos%-charspc%,F%) 18250PROCplacedate(p%,birthdate%,xpos%,ypos%-(2*charspc%),"Born: ",F%) 18260PROCplacedate(p%,deathdate%,xpos%,ypos%-(3*charspc%),"Died: ",F%) 18270ENDIF 18280IF sp% THEN 18290 PROCplacetext("And "+$p%,xpos%+(colspc%-((charspc%/2)*(LEN$p%+4)))/2,ypos%,F%) 18300 PROCplacetext($(p%+surname%),xpos%+(colspc%-((charspc%/2)*LEN$(p%+surname%)))/2,ypos%-charspc%,F%) 18310 PROCplacedate(p%,marriagedate%,xpos%,ypos%-5*charspc%,"Married:",F%) 18320 PROCplacedate(p%,birthdate%,xpos%,ypos%-(3*charspc%),"Born: ",F%) 18330 PROCplacedate(p%,deathdate%,xpos%,ypos%-(4*charspc%),"Died: ",F%) 18340 PROCplacedate(p%,divorcedate%,xpos%,ypos%-(6*charspc%),"Divorced: ",F%) 18350ENDIF 18360IF p%!gen%<>0 AND NOT(sp%) THEN 18370 xs%=xpos%+colspc%/2:xe%=xs% 18380 ys%=ypos%+charspc%+charspc%/4:ye%=ys%+charspc%/4 18390 PROClineheader(1,xs%,ys%,xe%,ye%) 18400 PROClinecoord(2,xs%,ys%):PROClinecoord(8,xe%,ye%) 18410 PROClineend 18420ENDIF 18430IF p%!spouse%<>nil% AND p%!child%<>nil% THEN 18440 xs%=xpos%+colspc%/2:xe%=xs%+colspc% 18450 ys%=ypos%-7*charspc%:ye%=ys%+charspc%/2 18460 IF !(p%!spouse%+divorcedate%)=0 THEN ye%+=charspc%:ys%+=charspc% 18470 IF !(p%!spouse%+marriagedate%)=0 AND ys%=ypos%-6*charspc% THEN ye%+=charspc%:ys%+=charspc% 18480 IF ys%=ypos%-5*charspc% THEN ye%+=charspc%/2 18490 PROClineheader(2,xs%,ys%,xe%,ye%) 18500 PROClinecoord(2,xs%,ys%):PROClinecoord(8,xe%,ys%) 18510 PROClinecoord(8,xe%,ye%):PROClineend 18520ENDIF 18530IF p%!spouse%<>nil% AND p%!child%=nil% THEN 18540 xs%=xpos%+colspc%-charspc%*3:xe%=xpos%+colspc%+charspc%*3 18550 ys%=ypos%+charspc%/2:ye%=ys% 18560 PROClineheader(1,xs%,ys%,xe%,ye%) 18570 PROClinecoord(2,xs%,ys%):PROClinecoord(8,xe%,ys%) 18580 PROClineend 18590ENDIF 18600IF sp% THEN ENDPROC 18610lp%=p%!spouse% 18620WHILE lp%<>nil% 18630 PROCdrawhoritree(lp%,ypos%,colspc%,TRUE,F%) 18640 lp%=lp%!spouse% 18650ENDWHILE 18660PROCdrawhoritree(p%!child%,ypos%-10*charspc%,colspc%,FALSE,F%) 18670PROCdrawhoritree(p%!sibling%,ypos%,colspc%,FALSE,F%) 18680IF p%!child%<>nil% THEN 18690 n%=FNlastchild(p%!child%) 18700 c%=!(p%!child%+col%) 18710 xs%=c%*colspc%+colspc%/2:xe%=(n%+.5)*colspc% 18720 ys%=ypos%-8.5*charspc%:ye%=ys% 18730 PROClineheader(1,xs%,ys%,xe%,ye%) 18740 PROClinecoord(2,xs%,ys%):PROClinecoord(8,xe%,ye%) 18750 PROClineend 18760 xs%=p%!col%*colspc%+(colspc%/2):ye%=ypos%-4*charspc% 18770 n%=n%/2 18780 xe%=(FNcolumn(p%!child%,p%!col%)+.5)*colspc% 18790 ys%=ypos%-8.5*charspc% 18800 IF xe%>xs% THEN 18810 PROClineheader(3,xs%,ys%,xe%,ye%) 18820 ELSE 18830 PROClineheader(3,xe%,ys%,xs%,ye%) 18840 ENDIF 18850 PROClinecoord(2,xs%,ye%):PROClinecoord(8,xs%,ys%+height%) 18860 PROClinecoord(8,xe%,ys%+height%):PROClinecoord(8,xe%,ys%) 18870 PROClineend 18880ENDIF 18890ENDPROC 18900: 18910DEFFNnoofchildren(root%) 18920LOCAL lroot% 18930root%=root%!child% 18940no%=0 18950WHILE root%<>nil% 18960 no%+=1 18970 lroot%=root% 18980 WHILE lroot%!spouse%<>nil% 18990 no%+=1 19000 lroot%=lroot%!spouse% 19010 ENDWHILE 19020 root%=root%!sibling% 19030ENDWHILE 19040=no% 19050: 19060DEFFNcolumn(p%,n%) 19070LOCAL c%,pl% 19080c%=-10 19090WHILE p%<>nil% 19100 IF ((p%!col%-n%)^2)<((c%-n%)^2) THEN c%=p%!col% 19110 pl%=p% 19120 WHILE pl%!spouse%<>nil% 19130 pl%=pl%!spouse% 19140 IF ((pl%!col%-n%)^2)<((c%-n%)^2) THEN c%=pl%!col% 19150 ENDWHILE 19160 p%=p%!sibling% 19170ENDWHILE 19180=c% 19190: 19200DEFFNlastchild(p%) 19210WHILE p%!sibling%<>nil% 19220 p%=p%!sibling% 19230ENDWHILE 19240=p%!col% 19250: 19260DEFFNdeleteabove 19270above%=TRUE:=FNdelete 19280: 19290DEFFNdeletebelow 19300above%=FALSE:=FNdelete 19310: 19320DEFPROCdeleteparent 19330PROCgenpointers(current_per%) 19340p%=genpointers%!(((current_per%!gen%)-1)*4) 19350troot%=p%!child% 19360p%!child%=nil% 19370PROCdeletetree(root%) 19380root%=troot% 19390WHILE root%!gen%<>0 19400 PROCdecgen(root%) 19410ENDWHILE 19420PROCenddelete 19430ENDPROC 19440: 19450DEFPROCsavecsv(file$) 19460LOCAL f% 19470f%=OPENOUT(file$) 19480PROCsavetreecsv(root%,f%) 19490CLOSE#f% 19500OSCLI("SETTYPE "+file$+" CSVFile") 19510ENDPROC 19520: 19530DEFPROCsavetreecsv(troot%,f%) 19540LOCAL lroot% 19550IF troot%<>nil% THEN 19560 PROCsavepersoncsv(troot%,f%,"M") 19570 lroot%=troot%!spouse% 19580 WHILE lroot%<>nil% 19590 PROCsavepersoncsv(lroot%,f%,"S") 19600 lroot%=lroot%!spouse% 19610 ENDWHILE 19620 PROCsavetreecsv(troot%!sibling%,f%) 19630 PROCsavetreecsv(troot%!child%,f%) 19640ENDIF 19650ENDPROC 19660: 19670DEFPROCsavepersoncsv(troot%,f%,t$) 19680LOCALa$,loop%,par%,point% 19690IF troot%=nil% THEN ENDPROC 19700a$="" 19710a$+=$(troot%)+","+$(troot%+surname%)+"," 19720a$+=CHR$(troot%!sex%)+"," 19730a$+=FNconvnumdate(troot%!birthdate%)+"," 19740a$+=FNconvnumdate(troot%!deathdate%)+"," 19750a$+=FNconvnumdate(troot%!marriagedate%)+"," 19760a$+=FNconvnumdate(troot%!divorcedate%)+"," 19770a$+=STR$(troot%!gen%)+"," 19780PROCgenpointers(troot%) 19790IF troot%!gen%=0 OR t$="S" THEN 19800 a$+="," 19810ELSE 19820 par%=!(genpointers%+((troot%!gen%)-1)*4) 19830 loop%=1:point%=par%!child% 19840 WHILE point%<>troot% 19850 loop%+=1:point%=point%!sibling% 19860 ENDWHILE 19870 a$+=STR$(loop%)+FNending(loop%)+"," 19880 a$+=$(par%)+" "+$(par%+surname%) 19890ENDIF 19900a$+=","+t$ 19910BPUT#f%,a$ 19911REM Datacard Data is held as strings in memory 19912REM at troot%+personlength%-(16*65)+l%*65 (l%= 0..15) 19920ENDPROC 19930: 19940DEFFNending(l%) 19950LOCALend$ 19960IF l%>3 AND l%<21 THEN ="th" 19970CASE l%MOD 10 OF 19980WHEN 1 : end$="st" 19990WHEN 2 : end$="nd" 20000WHEN 3 : end$="rd" 20010OTHERWISE :end$="th" 20020ENDCASE 20030=end$ 20040: 20050DEFFNdatawindow 20060IF dataview% THEN 20070 dataview%=FALSE:!block%=datawindow% 20080 SYS "Wimp_GetWindowState",0,block% 20090 SYS "Wimp_CloseWindow",0,block% 20100ELSE 20110 dataview%=TRUE:!block%=datawindow% 20120 SYS "Wimp_GetWindowState",0,block% 20130 SYS "Wimp_OpenWindow",0,block% 20140ENDIF 20150=0 20160: 20170DEFPROCdataviewinit 20180RESTORE 20240 20190FOR l%=1 TO 16 20200 READ datamask$(l%) 20210NEXT 20220ENDPROC 20230: 20240DATA "Location of Birth:" 20250DATA " of Death:" 20260DATA "Occupation:" 20270DATA "Address:" 20280DATA "Address:" 20290DATA "Address:" 20300DATA "Reference:" 20310DATA "" 20320DATA "" 20330DATA "Comments:" 20340DATA "" 20350DATA "" 20360DATA "" 20370DATA "Nicknames:" 20380DATA "" 20390DATA "" 20400: 20410DEFPROCredrawdata 20420LOCAL loop%,w%,h%,ox%,oy% 20430h%=((block%!40+16)DIV 32)-((block%!32-16)DIV 32) 20440w%=((block%!36+8)DIV 16)-((block%!28-9)DIV 16) 20450ox%=(block%!28-(block%!4-block%!20))DIV 16 20460oy%=(block%!40-(block%!16-block%!24))DIV 32 20470IF ox%<=0 THEN ox%=0 20480IF oy%>15 THEN oy%=15 20490FOR loop%=oy%+1 TO oy%-h%+1 STEP -1 20500IF loop%<=16 AND loop%>0 THEN 20510 SYS "Wimp_SetColour",11 20520 MOVE ox%*16,loop%*32-1 20530 PRINTMID$(datamask$(17-loop%),ox%+1,(ox%+w%+1)) 20540 SYS "Wimp_SetColour",7 20550 MOVE ox%*16,loop%*32-1 20560 PRINTMID$(dataset$(17-loop%),ox%+1,(ox%+w%+1)) 20570ENDIF 20580NEXT 20590ENDPROC 20600: 20610DEFPROCputcaretintodata(mx%,my%) 20620!block%=datawindow% 20630SYS "Wimp_GetWindowState",,block% 20640rx%=(mx%-block%!4)+block%!20 20650ry%=(my%-block%!8)+(block%!24-(block%!16-block%!8)) 20660rx%=rx%DIV16 20670ry%=ry%DIV32 20680SYS "Wimp_SetCaretPosition",datawindow%,-1,rx%*16,(ry%*32),&1000020,0 20690datatx%=rx%:dataty%=ry% 20700datasx%=rx%*16:datasy%=32*ry% 20710ENDPROC 20720: 20730DEFPROCenterdata 20740CASE block%!24 OF 20750 WHEN &18C : datasx%-=16 20760 WHEN &18D : datasx%+=16 20770 WHEN &18E : datasy%-=32 20780 WHEN &18F : datasy%+=32 20790 OTHERWISE PROCchardata 20800ENDCASE 20810IF datasy%>15*32 THEN datasy%=0 20820IF datasy%<0 THEN datasy%=15*32 20830IF datasx%<0 THEN datasx%=60*16 20840IF datasx%>60*16 THEN datasx%=0 20850datatx%=datasx%/16 20860dataty%=datasy%/32 20870SYS "Wimp_SetCaretPosition",datawindow%,-1,datasx%,datasy%,&1000020,0 20880ENDPROC 20890: 20900DEFPROCchardata 20910mx%=datatx% 20920my%=16-dataty% 20930CASE block%!24 OF 20940 WHEN 8 : MID$(dataset$(my%),mx%)=MID$(dataset$(my%),mx%+1) 20950 MID$(dataset$(my%),60)=" " 20960 datasx%-=16 20970 SYS "Wimp_ForceRedraw",datawindow%,0,datasy%,60*16,datasy%+32 20980 WHEN&1CD:dataset$(my%)=LEFT$(dataset$(my%),mx%)+" "+MID$(dataset$(my%),mx%+1) 20990 dataset$(my%)=LEFT$(dataset$(my%),60) 21000 SYS "Wimp_ForceRedraw",datawindow%,0,datasy%,60*16,datasy%+32 21010 OTHERWISE IF block%!24<127 THEN 21020 MID$(dataset$(my%),mx%+1,1)=CHR$(block%!24) 21030 datasx%+=16 21040 SYS "Wimp_ForceRedraw",datawindow%,datasx%-16,datasy%,datasx%+16,datasy%+32 21050 ELSE 21060 SYS "Wimp_ProcessKey",block%!24 21070 ENDIF 21080ENDCASE 21090IF datasx%>=(60*16) THEN datasy%-=32:datasx%=0 21100ENDPROC
� >!FAMILY.!RUNIMAGE : f$="" (ș "OS_GetEnv" � EnvStr$ 2� �EnvStr$," -quit ") � < I%=�EnvStr$,"""") F I%=�EnvStr$,"""",I%+1) P �I%+=1:��EnvStr$,I%,1)<>" " Z f$=�EnvStr$,I%) d� n: x: �� � �error � �setup ��loadfile(f$) � �main ��finish �� �: ���setup �alias$="<Family$Dir>" �treefile%=0:csvfile%=&CDE �*nil%=&FFFFFFFF:root%=nil%:delete%=nil% �current_menu$="" �addstatus%=� addmenu$="":filesave%=-1 update%=�:split$="/" #savestatus%=0:charspc%=4096*1.5 "personnode%=nil%:spoused%=� ,-overview%=�:maxgen%=30:� column%(maxgen%) 6dataview%=� @� scale% 10:$scale%="1" Jscaleover=1 T7� q% 100, block% 2000, menblk% 10000,checkdata% 100 ^/�vdata% 30,au% 30,pur% 40,pname% 30,icw% 30 hversion$="2.40 <18.06.91>" r2� iconblk% 200,findicon% 400, genpointers% 100 |� fileicon% 400 �� find_icon_num(6,6) �� file_dat% 255 �! � datamask$(16),dataset$(16) ��dataviewinit �dataset$()=�60,�(32)) �+titfcol%=7:titbcol%=2:fgcol%=7:bgcol%=0 �"scrbcol%=3:scrfcol%=1:high%=12 �current_per%=root% ��offsets �0� persd% personlength%,fpersd% personlength% �findblk%=�dimperson �$q%="TASK" �4ș "Wimp_Initialise",200,!q%,"Family" � ,handle% �sprites(alias$+".!Sprites") iconh%=�iconbar("!Family") oldtree$="treefile" &olddraw$="drawfile" 0oldcsv$="csvfile" :�windows Ddatasx%=0:datasy%=0 Ndatatx%=0:dataty%=0 X� b: l ��main v� � �poll(%10011111110110110011) �-� (reason%=17 � reason%=18) � block%!16=0 �� �: �ݤiconbar(spname$) �!block%=-1 �block%!4=0 �block%!8=0 �block%!12=63 �block%!16=64 �block%!20=&2102 �� block%!24 (�spname$+1) �$(block%!24)=spname$ block%!28=sprite% block%!32=(�spname$+1) (ș "Wimp_CreateIcon",,block% � icon% =icon% *: 4��sprites(file$) >sp=�(file$) Hdim%=�#sp+16 R�#sp \� sprite% dim% f!sprite%=dim% psprite%!4=0 zsprite%!8=16 �sprite%!12=16 �)ș "OS_SpriteOp",256+10,sprite%,file$ �� �: ���poll(mask%) �!block%=mask% �%ș "Wimp_Poll",0,block% � reason% �� reason% �action(reason%) �� �: ���action(reason%) �Ȏ reason% � �� 1 : �redrawwin(block%!0) � 2 : �open � 3 : �close ;� 6 : �check_mouse(!block%,block%!4,block%!8,block%!12) $� 7 : �dragend .� 8 : �charent 8� 9 : �menu_select B� 17,18 : �message(block%) L� V� `: j$��check_mouse(mx%,my%,but%,hnd%) t Ȏ but% � ~� 2 : mx%-=64:Ȏ hnd% � �% � -2 :�create_icon_menu(mx%,my%) �$ � main% : �create_menu(mx%,my%) �$ � over% : �create_over(mx%,my%) �* � datawindow% : �create_data(mx%,my%) �� �� 4 : Ȏ hnd% � �� -2 : �create_window �.� datawindow% : �putcaretintodata(mx%,my%) �)� main% : addstatus%=�:Ȏ block%!16 � �D � ok% : addstatus%=�:�7:� root%=nil% � �newtree � �resortbranch � � ileft% : �leftsib � � iright% : �rightsib � idown% : �child � iup% : �parent � ispouse% : �spouse � (@ � block%!16<>-1 � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 2'� check% : �deleteperson(block%!16) <� findwind% : �findclick F"� over% : �gotoperson(mx%,my%) P)� filewindow% : � block%!16=fileok% � Z& Ȏ filesave% � d= � 0 : o%=�save_tree($(fileicon%+44)) n= � 1 : �savevertdraw($(fileicon%+44)) x? � 2 : �savehoridraw($(fileicon%+44),�) �8 � 3 : �savecsv($(fileicon%+44)) � � �/ ș "Wimp_CreateMenu",-1 � � �� �� 1 : Ȏ hnd% � �� � � 64 : �dragfile �� �� �: ���set_version(pt%,H%,ver$) �!q%=pt% q%!4=H% ș "Wimp_GetIconState",,q% $q%!28=ver$ " q%!8=0 ,q%!12=0 6ș "Wimp_SetIconState",,q% @� J: T��finish ^#ș "Wimp_CloseDown",handle%,!q% h� r� |: ���error �ș "Wimp_DragBox",,0 � !block%=� �error=� � Ȏ � � �7� 222 : $(block%+4)="This file does not exist"+�(0) �:� 204 : $(block%+4)="Invalid Filename for Saving"+�(0) � �6$(block%+4)="(Internal error code"+�(�)+") "+�$+�0 �� �flags=1 �/ș "Wimp_ReportError",block%,flags,"Family" �� error � �finish � �main:� � : ��create_window &!block%=main% 0block%!4=300 :block%!12=1300 Dblock%!16=800 Nblock%!20=0 Xblock%!24=500 bblock%!28=-1 l ș "Wimp_OpenWindow",,block% v� �: ���close �!� !block%=over% � overview%=� �'� !block%=datawindow% � dataview%=� �!ș "Wimp_CloseWindow",,block% �� �: � ��open � ș "Wimp_OpenWindow",,block% �� �: � ݤfin ��finish =0 : Vݤcreatewindow(title$,flags%,fgcol%,bgcol%,maxX%,maxY%,waL%,waB%,waR%,waT%,filer%) � h% *block%!0=waL%:block%!4=waB% 4 block%!8=waR%:block%!12=waT% >block%!16=0:block%!20=maxY% H!block%!24=-1:block%!28=flags% Rblock%?32=titfcol% \block%?33=titbcol% fblock%?34=fgcol% pblock%?35=bgcol% zblock%?36=scrbcol% �block%?37=scrfcol% �block%?38=high% �Ȏ filer% � �) � 1 : block%?35=1:block%?38=titbcol% � � 2 : block%?27=&18 �� �block%?39=0 �block%!40=0 �block%!44=0 �block%!48=maxX% �block%!52=maxY% �block%!56=&2D �block%!60=&3000 block%!64=0 block%!68=0 $(block%+72)=�title$,11) $block%!84=0 .(ș "Wimp_CreateWindow",0,block% � h% 8=h% B: L ��windows VDmain%=�createwindow("Family Tree",&F,7,0,1000,500,0,0,500,500,0) `Dover%=�createwindow("Overview",&F,7,0,1279,1023,50,50,950,550,0) jEcheck%=�createwindow("Delete",&91,7,0,900,400,150,250,1050,750,1) tNfindwind%=�createwindow("Find Person",&1F,7,0,1000,500,250,250,1250,740,0) ~Gfilewindow%=�createwindow("Save as:",131,7,0,250,160,0,0,600,160,1) �Jinfowindow%=�createwindow("Information",131,7,0,625,250,0,0,700,500,1) �Pdatawindow%=�createwindow("Person Data",&100F,7,0,16*60,16*32,0,0,500,500,2) �&� datawindow is 40 x 16 characters ��filewinicons ��infoicons �*ileft%=�placeicon(main%,825,95,�(136)) �)ispouse%=�placeicon(main%,880,95,"S") �+iright%=�placeicon(main%,935,95,�(137)) �)iup%=�placeicon(main%,880,155,�(139)) �*idown%=�placeicon(main%,880,35,�(138)) ��mainicons(�,iconblk%) ��mainicons(�,findicon%) �findicons �checkicons � (: 2 ��offsets <fname%=0 Fsurname%=40 Pbirthdate%=80 Zdeathdate%=84 dmarriagedate%=88 ndivorcedate%=92 xsibling%=96 �child%=100 �spouse%=104 �gen%=108 �col%=112 �row%=116 �sex%=120 �personlength%=200+16*65 �next%=0 �� �: ���redrawwin(h%) �column%()=0 �D� addstatus% � �maketree(root%,640,1023-40,0,0, current_per%, �) addstatus%=� (ș "Wimp_RedrawWindow",0,block% � m% b%=block%+4 "x0%=b%!0-b%!16 ,y0%=b%!12-b%!20 6 ȕ m% @ȑ x0%,y0% JȎ !block% � T � main% : �redrawmain ^ � over% : �redrawover h � datawindow% : �redrawdata r� | ȑ 0,0 �) ș "Wimp_GetRectangle",0,block% � m% �� �� �: ���redrawmain � ș "Wimp_SetColour",7 � ȓ 815,25,175,185 �� �: �� "First Names" �� "Surname" �� "Date of Birth" �� "Date of Death" � "Marriage Date" � "Divorce Date" : &ݤplaceicon(h%,x%,y%,a$) 0&!block%=h%:block%!4=x%:block%!8=y% :,block%!12=x%+�(a$)*16+29:block%!16=y%+50 Dblock%!20=&C700403D N$(block%+24)=a$ X&ș "Wimp_CreateIcon",0,block% � h% b =h% l: v��infoicons �� i%,Y%,a$,b$,a% � � �T`M ��Y%=10 � 190 �60 �� a$,b$,a% ��Y%=10 � b$=version$ �7 i%=�justtexti(infowindow%,10,Y%,150,a$,&7000011,0) �9 i%=�justtexti(infowindow%,150,Y%,465,b$,&700013D,a%) �� �� �: �%ݤjusttexti(h%,x%,y%,w%,a$,f%,a%) �&!block%=h%:block%!4=x%:block%!8=y% �#block%!12=x%+w%:block%!16=y%+50 block%!20=f% Q� a%=0 � $(block%+24)=a$ � block%!24=a%:block%!28=-1:block%!32=�(a$)+1:$a%=a$ &ș "Wimp_CreateIcon",0,block% � h% � "Version:",version$,vdata%,"Author:","David Breakwell",au%,"Purpose:","Family Tree Program",pur%,"Name:","!FAMILY",pname% *@� "!FAMILY","Family Tree Program","David Breakwell",version$ 4: >ݤdimperson H � person% R&� �-�<personlength%+100 � �=�+1024 \T� delete%=nil% � � person% personlength% � person%=delete%:delete%=delete%!next% f=person% p: z��mainicons(M%,mem%) �� iconblk% �iconblk%=mem% � � �d`K ��loop%=1 � 6 �- � M% � !block%=main% � !block%=findwind% �8 block%!24=(iconblk%+(17*loop%)):block%!28=&FFFFFFFF � block%!20=&C7000125 �A � $(iconblk%+(17*loop%)):block%!4=20:block%!8=390-(loop%*60) �& block%!32=�$(iconblk%+(17*loop%)) �1 block%!12=block%!4+270:block%!16=block%!8+50 �" ș "Wimp_CreateIcon",0,block% �$ block%!4=300:block%!20=&700F125 � Ȏ loop% � � 1 : l%=0 � 2 : l%=40 � 3 : l%=80 $ � 4 : l%=91 . � 5 : l%=102 8 � 6 : l%=113 B � L6 � M% � block%!24=persd%+l% � block%!24=fpersd%+l% VK � loop%<3 � block%!32=41:$(block%!24)="" � block%!32=12:!(block%!24)=0 `( block%!12=block%!4+(block%!32+1)*16 j' ș "Wimp_CreateIcon",0,block% � I% t �M% � loop%=1 � mainbase%=I% ~!�M% � loop%=1 � findbase%=I% �� ��clearperson �0block%!20=&C700013D:block%!4=20:block%!8=420 �0block%!12=block%!4+960:block%!16=block%!8+50 �block%!24=(iconblk%+7*17) � � M% � �% $(iconblk%+7*17)="Personal Data" �� �# $(iconblk%+7*17)="Find Person" �� �!ș "Wimp_CreateIcon",0,block% �0block%!4=550:block%!20=&C700913D:block%!8=30 0block%!12=block%!4+200:block%!16=block%!8+50 ?block%!24=(iconblk%+8*17):$(iconblk%+8*17)="OK":block%!32=2 � �(M%) � block%!4=880:block%!8=30 ( block%!12=970:block%!16=260 2) ș "Wimp_CreateIcon",0,block% � fok% <� F( ș "Wimp_CreateIcon",0,block% � ok% P� Z � M% � d !block%=main% n block%!4=550:block%!8=210 x block%!12=650:block%!16=260 � block%!20=&C700003D � $(block%+24)="Sex" �! ș "Wimp_CreateIcon",,block% � block%!4=670:block%!12=770 �+ block%!20=%111000000001111000000111101 � $(block%+24)="" �. ș "Wimp_CreateIcon",,block% � personsex% �� �� �: � ��charent �� f% �(� !block%=datawindow% � �enterdata:� -� !block% <>main% � !block% <>findwind% � # ș "Wimp_ProcessKey",block%!24 � "� ,Ȏ block%!24 � 6 � 13 : � �TzQ @ � 399 : � �DDQ J � 398 : � �TzQ T' : ș "Wimp_ProcessKey",block%!24 ^� hf%=block%!24 r$� f%<>13 � f%<>399 � f%<>398 � � |&ș "Wimp_GetCaretPosition",,block% �-� !block%=findwind% � block%!4=block%!4+5 �� � � l% �� block%!4=l% �� l% �!� !block%=findwind% � l%=20 � � � f%=399 � l%=16 � l%=6 �� �� !block%=findwind% � l%-=5 �.ș "Wimp_SetCaretPosition",!block%,l%,,,-1 �� �� !block%=main% � �P ș "Wimp_SetCaretPosition",main%,mainbase%+((335-l%)/60)*2,b%,l%,&1000028,0 � T ș "Wimp_SetCaretPosition",findwind%,findbase%+((335-l%)/60)*2,b%,l%,&1000028,0 � &� 0: :� 6,8,10,12,14,16,20,6 D� 6,20,16,14,12,10,8,6 N%ݤconvstrdate(d$):� l%,d%,d1%,d2% X� d$=" " � =0 bd%=�number(d$,1,l%) ld1%=�number(d$,l%+1,l%) vd2%=�number(d$,l%+1,l%) �� d%<1 � d1%<1 � d2%<0 � =0 �� d%>31 � d1%>12 � =0 �Ȏ d1% � � � 9,4,6,11 : l%=30 � � 2 : l%=28 � : l%=31 �� �� d%>l% � =0 �=d%+(d1%<<8)+(d2%<<16) �: �ݤconvnumdate(d%) � �d$,l$ �d$="":l$="" � d%=0 �="" %d$=�(d% � &FF):�d$=1 � d$="0"+d$ -l$=�((d% � &FF00)>>8):� �l$=1 � l$="0"+l$ d$=d$+split$+l$ *0l$=�((d% � &FFFF0000)>>16):l$=�4-�l$," ")+l$ 4=d$+split$+l$ >: H��copyto(h%) R� Copy h% TO persd% \� o%=1 � 7 f Ȏ o% � p � 1 : $persd%=$h% z& � 2 :$(persd%+40)=$(h%+surname%) �4 � 3 : $(persd%+80)=�convnumdate(h%!birthdate%) �4 � 4 : $(persd%+91)=�convnumdate(h%!deathdate%) �8 � 5 : $(persd%+102)=�convnumdate(h%!marriagedate%) �7 � 6 : $(persd%+113)=�convnumdate(h%!divorcedate%) �� � 7 : !icw%=main%:icw%!4=personsex%:ș "Wimp_GetIconState",,icw%:ș "Wimp_DeleteIcon",,icw%:$(icw%+28)=�(h%!sex%):icw%!4=!icw%:ș "Wimp_CreateIcon",,icw%+4 � � �� �� o%=0 � 15 �5 dataset$(o%)=$(h%+(personlength%-(16*65))+o%*65) �� �� �: ���copyfrom(h%,mem%) � o%=1 � 7 Ȏ o% � � 1 :$h%=$mem% $+ � 2 : $(h%+surname%)=$(mem%+surname%) .5 � 3 : !(h%+birthdate%)=�convstrdate($(mem%+80)) 85 � 4 : !(h%+deathdate%)=�convstrdate($(mem%+91)) B9 � 5 : !(h%+marriagedate%)=�convstrdate($(mem%+102)) L8 � 6 : !(h%+divorcedate%)=�convstrdate($(mem%+113)) Va � 7 : !icw%=main%:icw%!4=personsex%:ș "Wimp_GetIconState",,icw%: h%!sex%=�(�$(icw%+28),1)) ` � j� t� o%=0 � 15 ~5 $(h%+(personlength%-(16*65))+o%*65)=dataset$(o%) �� �� �: �ݤnumber(d$,O%,� O%) � � n%,n$:n%=0:n$="0123456789" �$� �n$,�d$,O%,1))=0 � i%=i%+1:=-1 �"ȕ �n$,�d$,O%,1))<>0 � O%<=�d$ � n%=n%*10+(�n$,�d$,O%,1))-1) � O%=O%+1 �� �=n% �: ��newtree ?root%=�dimperson:�copyfrom(root%,persd%):current_per%=root% <root%!sibling%=nil%:root%!spouse%=nil%:root%!child%=nil% root%!gen%=0 (personnode%=root% 2� <: Fݤnew_tree P�create_window Z�newtree d=0 n: x ݤadd_sib �� g% �"�copyfrom(current_per%,persd%) �4� spoused% � current_per%=personnode%:spoused%=� �"ȕ current_per%!sibling%<>nil% �' current_per%=current_per%!sibling% �� �$current_per%!sibling%=�dimperson �3!(current_per%!sibling%+gen%)=current_per%!gen% �g%=current_per%!gen% �¤t_per%=current_per%!sibling% ��nils(current_per%) ��clearperson �current_per%!gen%=g% -ș "Wimp_ForceRedraw",main%,0,0,1280,1024 ;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 A� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 "=0 ,: 6��clearperson @ $(persd%)="":$(persd%+40)="" J:$(persd%+80)=�convnumdate(0):$(persd%+91)=$(persd%+80) T9$(persd%+102)=$(persd%+80):$(persd%+113)=$(persd%+80) ^persd%!sex%=32 hdataset$()=�60," ") r� |: ���genpointers(h%) � �save% �save%=�:�traverse(h%,root%) �� �: ���traverse(h%,troot%) ��troot%=nil% � � �3� save% � genpointers%!((troot%!gen%)*4)=troot% �� troot%=h% � save%=� ��traverse(h%,troot%!child%) �+� save% � �traverse(h%,troot%!sibling%) �� �: ��leftsib �root%=nil% � � � root%=current_per% � � &"�copyfrom(current_per%,persd%) 0t� spoused% � current_per%=personnode%:spoused%=�:�copyto(current_per%):ș "Wimp_ForceRedraw",main%,0,0,1280,1024 :�genpointers(current_per%) D_�current_per%!gen%<>0 � !(genpointers%!(((current_per%!gen%)-1)*4)+child%)=current_per% � � N� current_per%!gen%=0 � X2 current_per%=�findprevsib(root%,current_per%) b� l_ current_per%=�findprevsib(!(genpointers%!(((current_per%!gen%)-1)*4)+child%),current_per%) v� ��copyto(current_per%) �-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 �;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 �A� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 �� �: �ݤfindprevsib(start%,comp%) �� comp%=start% � =comp% �ȕ start%!sibling%<>comp% � start%=start%!sibling% �� �=start% �: ��rightsib �root%=nil% � � "�copyfrom(current_per%,persd%) *t� spoused% � current_per%=personnode%:spoused%=�:�copyto(current_per%):ș "Wimp_ForceRedraw",main%,0,0,1280,1023 4$� current_per%!sibling%=nil% � � >¤t_per%=current_per%!sibling% H�copyto(current_per%) R-ș "Wimp_ForceRedraw",main%,0,0,1280,1023 \;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 fA� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 p� z: �ݤadd_parent �"�copyfrom(current_per%,persd%) �4� spoused% � current_per%=personnode%:spoused%=� �s%=�dimperson ��clearperson � �nils(s%) �s%!child%=root% �s%!gen%=-1 �root%=s% ��incgen(root%) �current_per%=root% �-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 �;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 A� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 =0 : $��incgen(root%) .� root%=nil% � � 8root%!gen%+=1 B�incgen(root%!child%) L�incgen(root%!sibling%) V� `: j��nils(s%) t3s%!sibling%=nil%:s%!spouse%=nil%:s%!child%=nil% ~� �: ���parent �"�copyfrom(current_per%,persd%) �� current_per%!gen%=0 � � �4� spoused% � current_per%=personnode%:spoused%=� ��genpointers(current_per%) �9current_per%=genpointers%!(((current_per%!gen%)-1)*4) ��copyto(current_per%) �-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 �;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 �A� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 �� : ��child �root%=nil% � � "�copyfrom(current_per%,persd%) (t� spoused% � current_per%=personnode%:spoused%=�:�copyto(current_per%):ș "Wimp_ForceRedraw",main%,0,0,1280,1023 2$� current_per%!child% = nil% � � <$current_per%=current_per%!child% F�copyto(current_per%) P-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 Z;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 dA� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 n� x: ���resortbranch �� s%,p%,e%,c% ��genpointers(current_per%) �c%=current_per% ��copyfrom(c%,persd%) �� spoused% � �sortspouse:� �� c%=root% � � root%=c%!sibling%:s%=root% �� � � c%!gen%=0 � � s%=root%:p%=nil% � � �6 p%=(genpointers%!(((c%!gen%)-1)*4)):s%=p%!child% � � p%<>nil% � p%!child%=c% � * p%!child%=c%!sibling%:s%=c%!sibling% " � , e%=�findprevsib(s%,c%) 6 e%!sibling%=c%!sibling% @ � J� T� root%=nil% � root%=c%:� ^� s%=nil% � p%!child%=c%:� h os%=s% rBȕ s%!sibling%<>nil% � !(s%!sibling%+birthdate%)<c%!birthdate% | s%=s%!sibling% �� �,� os%=s% � s%!birthdate%>c%!birthdate% � � � c%!gen%=0 � � c%!sibling%=root%:root%=c% � � � c%!sibling%=p%!child% � p%!child%=c% � � �� �� �c%!sibling%=s%!sibling% �s%!sibling%=c% �� : ݤadd_child "�copyfrom(current_per%,persd%) &3�spoused% � current_per%=personnode%:spoused%=� 0 � current_per%!child%=nil% � :# current_per%!child%=�dimperson D4 !(current_per%!child%+gen%)=current_per%!gen%+1 N% current_per%=current_per%!child% X� b% current_per%=current_per%!child% l# ȕ current_per%!sibling%<>nil% v( current_per%=current_per%!sibling% � � �% current_per%!sibling%=�dimperson �4 !(current_per%!sibling%+gen%)=current_per%!gen% �' current_per%=current_per%!sibling% �� ��clearperson ��nils(current_per%) �-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 �;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 �A� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 �=0 �: �ݤadd_spouse "�copyfrom(current_per%,persd%) 5� �spoused% � spoused%=�:personnode%=current_per% !ȕ current_per%!spouse%<>nil% %current_per%=current_per%!spouse% *� 4#current_per%!spouse%=�dimperson >2!(current_per%!spouse%+gen%)=current_per%!gen% H%current_per%=current_per%!spouse% R�clearperson \�nils(current_per%) f-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 p;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 zA� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 �=0 �: ���spouse ��root%=nil% � � �1� current_per%!spouse%=nil% � �(spoused%) � � �!� current_per%!spouse%=nil% � �=current_per%=personnode%:spoused%=�:�copyto(current_per%) �� �5� �spoused% � spoused%=�:personnode%=current_per% �%current_per%=current_per%!spouse% ��copyto(current_per%) �� �-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 �;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 �A� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 �� � � ��sortspouse � s%,c% *s%=personnode%!spouse%:c%=current_per% �s%=c% � c%!spouse%=nil% � � $ȕ s%!spouse%<>c% . s%=s%!spouse% 8� Bs%!spouse%=c%!spouse% Ls%=personnode%!spouse% VO�s%!marriagedate%>c%!marriagedate% � c%!spouse%=s%:personnode%!spouse%=c%:� `Fȕ s%!spouse%<>nil% � !(s%!spouse%+marriagedate%)<c%!marriagedate% j s%=s%!spouse% t� ~t%=s%!spouse%:s%!spouse%=c% �c%!spouse%=t%:� �: ���checkicons ��a$ �)a$="Are You Sure You wish to Delete?" �block%!0=check% �8block%!4=100:block%!8=50:block%!12=400:block%!16=100 �*block%!20=&C700903D:$(block%+24)="YES" �(ș "Wimp_CreateIcon",0,block% � dok% �block%!4=500:block%!12=800 �$(block%+24)="NO" �,ș "Wimp_CreateIcon",0,block% � dcancel% block%!20=&17000339 9block%!4=100:block%!8=300:block%!12=800:block%!16=400 ,block%!24=checkdata%:block%!28=&FFFFFFFF "block%!32=�(a$):$checkdata%=a$ (namedata%=checkdata%+�a$+2 2!ș "Wimp_CreateIcon",0,block% </$(checkdata%+�a$+2)="David Peter Breakwell" Fblock%!24=namedata% Pblock%!32=�($(namedata%)) Zblock%!8=200:block%!16=300 d!ș "Wimp_CreateIcon",0,block% n� xݤdelete �"�copyfrom(current_per%,persd%) ��root%=nil% � =0 �;$(namedata%)=$current_per%+" "+$(current_per%+surname%) �4�above% � $(namedata%)=$(namedata%)+"'s Parents" �!block%=check% �%ș "Wimp_GetWindowState",0,block% �!ș "Wimp_OpenWindow",0,block% �B ȗ ȓ block%!4,block%!8,block%!12-block%!4,block%!16-block%!8 �=0 �: ���deleteperson(i%) � �s%,t% �-� i%<>dcancel% � above% � �deleteparent:� � i%=dcancel% � � � spoused% � " s%=personnode% ,! ȕ s%!spouse%<>current_per% 6 s%=s%!spouse% @ � J% s%!spouse%=current_per%!spouse% T �addtolist(current_per%) ^ current_per%=personnode% h spoused%=� r � |# ȕ current_per%!spouse%<>nil% �) s%=!(current_per%!spouse%+spouse%) �' �addtolist(current_per%!spouse%) � current_per%!spouse%=s% � � � � current_per%!gen%=0 � � �adjustroot �" current_per%!sibling%=nil% �! �deletetree(current_per%) � current_per%=root% � � � �adjustnorm �! current_per%!sibling%=nil% � �deletetree(current_per%) current_per%=root% � � &� 0�enddelete :� D: N��enddelete X!block%=check% b"ș "Wimp_CloseWindow",0,block% l ȗ ȓ 0,0,1280,1024 v?� current_per%<>nil% � �copyto(current_per%) � �clearperson �-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 �addstatus%=� �;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 �A� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 �� �: ���addtolist(d%) �d%!next%=delete% �delete%=d% �� �: ���adjustroot �� current_per%=root% � !$ � current_per%!sibling%<>nil% � !! root%=current_per%!sibling% ! � ! ! root%=current_per%!sibling% !*$ � root%<>nil% � �decgen(root%) !4 � !>� !H s%=root% !R! ȕ s%!sibling%<>current_per% !\ s%=s%!sibling% !f � !p& s%!sibling%=current_per%!sibling% !z� !�� !�: !���adjustnorm !��genpointers(current_per%) !�/p%=genpointers%!(((current_per%!gen%)-1)*4) !��p%!child%=current_per% � !�$ p%!child%=current_per%!sibling% !�� !� p%=p%!child% !� ȕp%!sibling%<>current_per% !� p%=p%!sibling% !� � !�& p%!sibling%=current_per%!sibling% "� "� ": "$��decgen(oroot%) ".� oroot%<>nil% � "8 oroot%!gen%-=1 "B �decgen(oroot%!child%) "L �decgen(oroot%!sibling%) "V� "`� "j: "t��deletetree(o%) "~ � t% "�� o%<>nil% � "� �deletetree(o%!child%) "� �deletetree(o%!sibling%) "� ȕ o%!spouse%<>nil% "� t%=!(o%!spouse%+spouse%) "� �addtolist(o%!spouse%) "� o%!spouse%=t% "� � "� �addtolist(o%) "�� "�� "�: # ݤload_tree # file$=$file_dat% #spoused%=� #�loadfile(file$) #(=0 #2: #<��loadfile(file$) #F� file$="" � � #Poldtree$=file$ #ZF%=�(file$) #dT%=�#F%:�#F%=0 #n&� root%<>nil% � �deletetree(root%) #xroot%=�dimperson #��load_recur(root%) #��#F% #�%�copyto(root%):current_per%=root% #�-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 #�addstatus%=� #�;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 #�A� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 #�� #�: #���load_recur(lroot%) #��load_per(lroot%):T%=lroot% #�ȕ lroot%!spouse%<>nil% #� lroot%!spouse%=�dimperson $ lroot%=lroot%!spouse% $ �load_per(lroot%) $� $" lroot%=T% $,� lroot%!sibling%<>nil% � $6 lroot%!sibling%=�dimperson $@! �load_recur(lroot%!sibling%) $J� $T� lroot%!child%<>nil% � $^ lroot%!child%=�dimperson $h �load_recur(lroot%!child%) $r� $|� $�: $���load_per(mem%) $�� o% $�(�#F%,$(mem%+fname%),$(mem%+surname%) $�(�#F%,mem%!birthdate%,mem%!deathdate% $�-�#F%,mem%!marriagedate%,mem%!divorcedate% $�/�#F%,mem%!sibling%,mem%!child%,mem%!spouse% $�!�#F%,mem%!gen%:�#F%,mem%!sex% $�<� o%=0 � 15: �#F%, $(mem%+(personlength%-16*65)+o%*65):� $�� $�: $���save_per(mem%) $�� o% %(�#F%,$(mem%+fname%),$(mem%+surname%) %(�#F%,mem%!birthdate%,mem%!deathdate% %-�#F%,mem%!marriagedate%,mem%!divorcedate% %&/�#F%,mem%!sibling%,mem%!child%,mem%!spouse% %0!�#F%,mem%!gen%:�#F%,mem%!sex% %:;� o%=0 � 15: �#F%,$(mem%+(personlength%-16*65)+o%*65):� %D� %N: %Xݤsave_tree(file$) %b� root%=nil% � =0 %l� file$="" � =0 %voldtree$=file$ %�2 F%=�(file$):�#F%:� F%<>0 � �("DELETE "+file$) %�F%=�(file$) %��save_recur(root%) %��#F% %�%�("SETTYPE "+file$+" Familyfile") %�=0 %�: %���save_recur(lroot%) %��save_per(lroot%) %� T%=lroot% %�ȕ lroot%!spouse%<>nil% %� �save_per(lroot%!spouse%) %� lroot%=lroot%!spouse% &� & lroot%=T% &� lroot%!sibling%<>nil% � & ! �save_recur(lroot%!sibling%) &*� &4� lroot%!child%<>nil% � &> �save_recur(lroot%!child%) &H� &R� &\: &f�"=","<",">","<=",">=","<>" &p: &z��findicons &��i%,l%,loop%,inner% &�l%=17*7+20+findicon% &�!block%=findwind% &��loop%=1 � 4 &� � �Dff &��inner%=1 � 6 &�"block%!24=l%+inner%*3+loop%*20 &�block%!28=&FFFFFFFF &�:� inner%=1 � block%!20=&C720312D � block%!20=&C700312D &�/� $(block%!24):block%!4=520+((inner%-1)*60) &�block%!8=390-((loop%+2)*60) &�block%!32=�$(block%!24) &�block%!12=block%!4+50 'block%!16=block%!8+50 '&ș "Wimp_CreateIcon",0,block% � i% '"find_icon_num(loop%,inner%)=i% '$1find_icon_num(loop%,0)=find_icon_num(loop%,1) '.�, '8� 'B: 'L��findclick 'V&� block%!16 = fok% � �findperson:� '`� loop%=1 � 4 'j� inner%=1 � 6 't-� block%!16=find_icon_num(loop%,inner%) � '~ block%!20=findwind% '�% block%!24=find_icon_num(loop%,0) '�% find_icon_num(loop%,0)=block%!16 '� block%!32=0 '� block%!28=1<<21 '�' ș "Wimp_SetIconState",0,block%+20 '�% block%!24=find_icon_num(loop%,0) '�% find_icon_num(loop%,0)=block%!16 '� block%!32=0 '� block%!28=1<<21 '�' ș "Wimp_SetIconState",0,block%+20 '�� '��, ( � ( : (��findperson (� find% ((�copyfrom(findblk%,fpersd%) (2find%=nil% (<�findrecur(root%,find%) (F� find%<>nil% � (P spoused%=� (Z personnode%=nil% (d current_per%=find% (n �copyto(current_per%) (x� (�� (�!block%=findwind% (�!ș "Wimp_CloseWindow",,block% (�-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 (�-ș "Wimp_ForceRedraw",over%,0,0,1280,1024 (�� (�: (���findrecur(lroot%,� find%) (�� find%<>nil% � � (�&� �match(lroot%) � find%=lroot% :� (� T%=lroot% (�(ȕ lroot%!spouse%<>nil% � find%=nil% (�, � �match(lroot%!spouse%) � find%=lroot% ) lroot%=lroot%!spouse% )� ) lroot%=T% )"?� lroot%!sibling%<>nil% � �findrecur(lroot%!sibling%,find%) ),;� lroot%!child%<>nil% � �findrecur(lroot%!child%,find%) )6� )@: )Jݤmatch(lroot%) )T� m% )^m%=� )h� loop%=1 � 6 )rȎ loop% � )|- � 1 : � $(fpersd%)<>"" � $(lroot%)<>"" � )�$ m%=�$lroot%,$fpersd%) )� � )� )�% � $(fpersd%) ="" � m%=� )�? � 2 : � $(fpersd%+surname%)<>"" � $(lroot%+surname%)<>"" � )�? m%=m% � �$(lroot%+surname%),$(fpersd%+surname%)) )� � )� )�2 � $(fpersd%+surname%)="" � m%=m% � � )�H � 3 : � findblk%!birthdate%<>0 � m%=m% � �date(loop%,birthdate%,m%) )�H � 4 : � findblk%!deathdate%<>0 � m%=m% � �date(loop%,deathdate%,m%) )�( � 5 : � findblk%!marriagedate%<>0 � )�4 m%=m% � �date(loop%,marriagedate%,m%) * � *' � 6 : � findblk%!divorcedate%<>0 � *3 m%=m% � �date(loop%,divorcedate%,m%) *& � *0� *:� *D=m% *N: *Xݤdate(loop%,O%,m%) *b� fdate%,cdate% *lfdate%=findblk%!O% *vcdate%=lroot%!O% *�2� cdate%=0 � fdate%<>0 � =� � � cdate%=0 � =m% *�Ȏ �findw(loop%-2) � *� � 1 : M%=fdate%=cdate% *� � 2 : M%=cdate%<fdate% *� � 3 : M%=cdate%>fdate% *� � 4 : M%=cdate%<=fdate% *� � 5 : M%=cdate%>=fdate% *� � 6 : M%=cdate%<>fdate% *�� *�=M% *�: *�ݤfindw(loop%) *�� T% +T%=1 +6ȕ find_icon_num(loop%,T%)<>find_icon_num(loop%,0) + T%=T%+1 + � +*=T% +4: +> ݤfind +H!block%=findwind% +R%ș "Wimp_GetWindowState",0,block% +\!ș "Wimp_OpenWindow",0,block% +f=0 +p: +zݤoverview +�� overview% � +� overview%=�:!block%=over% +�& ș "Wimp_GetWindowState",0,block% +�# ș "Wimp_CloseWindow",0,block% +�� +� overview%=� +� !block%=over% +� addstatus%=� +�& ș "Wimp_GetWindowState",0,block% +�" ș "Wimp_OpenWindow",0,block% +�� +�=0 +�: ,��redrawover , �drawtree(root%) ,� ,$: ,.2��maketree(lroot%,x%,y%,mx%,my%, � c% , draw%) ,8� g%,ox%:r%=32*scaleover ,B� lroot%=nil% � � ,Llroot%!col%=x% ,Vlroot%!row%=y% ,`column%(lroot%!gen%)=x% ,j6� �(draw%) � c%=�check(x%,y%,r%,mx%,my%,c%,lroot%) ,t� lroot%!child%<>nil% � ,~ ox%=x% ,�% x%=x%-(r%*2.5)*�(�cen(lroot%)/2) ,�# � column%(1+lroot%!gen%)>=x% � ,�& x%=column%(1+lroot%!gen%)+2.5*r% ,� column%(1+lroot%!gen%)=x% ,� � ,� column%(1+lroot%!gen%)=x% ,� � ,�? �maketree(lroot%!child%,x%,y%-r%*2.75,mx%,my%, c%, draw%) ,� x%=ox% ,�� ,�@ �maketree(lroot%!sibling%,x%+r%*2.5,y%,mx%,my%, c%, draw%) ,�� - : - ��drawtree(lroot%) -� g%,r%:r%=32*scaleover -� lroot%=nil% � � -(!x%=lroot%!col%:y%=lroot%!row% -23� lroot%!gen%<>0 � � x%,y%+r%:� x%,y%+(r%*1.25) -<<� lroot%!gen%=0 � lroot%<>root% � � x%,y%:� x%-1.5*r%,y% -F.� lroot%!sibling%<>nil% � lroot%!gen%<>0 � -P � x%,y%+r%*1.25 -Z � x%+2.5*r%,y%+r%*1.25 -d� -n(� lroot%=current_per% � g%=8 � g%=12 -x+� spoused% � personnode%=lroot% � g%=13 -�ș "Wimp_SetColour",g% -�ȏ Ȑ x%,y%,r% -�ș "Wimp_SetColour",7 -�ȏ x%,y%,r% -�� lroot%!child%<>nil% � -� � x%,y%-r%:� x%,y%-r%*1.25 -� ox%=!(lroot%!child%+col%) -� n%=�(�cen(lroot%)/2) -� � ox%=x% � n%=0 -� � ox%+n%*r%*2.5,y%-r%*1.25 -� � ox%+n%*r%*2.5,y%-r%*1.75 -�� -��drawtree(lroot%!child%) .�drawtree(lroot%!sibling%) .� .: ."'ݤcheck(x%,y%,r%,mx%,my%,c%,lroot%) .,� mx%>=x%-r% � mx%<=x%+r% � .6* � my%>=y%-r% � my%<=y%+r% � c%=lroot% .@� .J=c% .T: .^ݤcen(lroot%) .h� T% .rlroot%=lroot%!child% .| � lroot%!sibling%=nil% � =0 .�T%=0 .�ȕ lroot%<>nil% .� T%+=1 .� lroot%=lroot%!sibling% .�� .�=T% .�: .���create_menu(menx%,meny%) .�Ymenu$="Main Menu|*@~Save Tree`filewindow%`|Browse<browsemenu$>|*Output<outputmenu$>|" .�+� root%<>nil% � menu$=�stripstar(menu$) .�vbrowsemenu$="Browse|*Find{find}|@^Overview{overview}|@^View Data{datawindow}|*Delete<deletemenu$>|*Add<addmenu$>|" .�Cdeletemenu$="Delete|*Parents{deleteabove}|Person{deletebelow}|" .�7� root%<>nil% � browsemenu$=�stripstar(browsemenu$) /@� current_per%!gen%<>0 � deletemenu$=�stripstar(deletemenu$) /'�overview% � �browsemenu$,21,1)="#" /'�dataview% � �browsemenu$,42,1)="#" /&^outputmenu$="Output|~Main Line`filewindow%`|~Full Tree`filewindow%`|~Export`filewindow%`|" /0\addmenu$="Add|Child{add_child}|Sibling{add_sib}|*Parent{add_parent}|Spouse{add_spouse}|" /:G� root%<>nil% � current_per%!gen%=0 � addmenu$=�stripstar(addmenu$) /Dmenu%=menblk% /N�makemenu(menu$,menu%) /X-ș "Wimp_CreateMenu",,menblk%,menx%,meny% /bcurrent_menu$=menu$ /l� /v: /���makemenu(menu$, � mem% ) /�'� t$,loop%,stringtrace%,i%,memcopy% /�t$=menu$:memcopy%=mem% /�$mem%=�t$,�t$,"|")-1) /�t$=�t$,�t$,"|")+1) /� mem%?12=7 /� mem%?13=2 /� mem%?14=7 /� mem%?15=0 /�mem%!16=172 /�mem%!20=44 /� mem%!24=0 /�mem%!28=mem%+32 0 mem%+=28 0memcopy%=mem% 0pre$="*@#%^~":post$="{[<|`" 0 � 0* flags%=0:shade%=� 04 ȕ �pre$,�t$,1))<>0 0> Ȏ �t$,1) � 0H � "*" : shade%=� 0R � "@" : flags%+=2 0\ � "%" : flags%+=4 0f � "#" : flags%+=1 0p � "~" : flags%+=8 0z � 0� t$=�t$,2) 0� � 0�# � �t$,"|")=�(t$) � flags%+=&80 0� mem%!0=flags% 0� mem%!4=-1 0�1 � shade% � mem%!8=&7400021 � mem%!8=&7000021 0� � (flags%�4)<>4 � 0� loop%=0:i%=1000 0� � 0� loop%+=1 0� l%=�t$,�post$,loop%,1)) 0� � i%>l% � l%<>0 � i%=l% 0� � loop%=�(post$) 1 $(mem%+12)=�t$,i%-1) 1 t$=�t$,�t$,"|")+1) 1 � 1$ mem%!8=&7000F29 1. !(mem%+16)=-1 18 i%=�t$,"[")+1 1B' !(mem%+12)=�(�t$,i%,�t$,",")-i%)) 1L i%=�t$,",")+1 1V' !(mem%+20)=�(�t$,i%,�t$,"]")-i%)) 1` t$=�t$,�t$,"|")+1) 1j � 1t mem%=mem%+24 1~� t$="" 1�t$=menu$ 1�*loop%=memcopy%:stringtrace%=�t$,"|")+1 1�� 1�� 1� stringtrace%+=1 1�# i%=�"|<`",�t$,stringtrace%,1)) 1�� i%<>0 1�+� i%=1 � loop%=loop%+24:stringtrace%+=1 1�� i%=2 � 1� !(loop%+4)=mem% 1�@ s$=�t$,stringtrace%+1,�t$,">",stringtrace%)-stringtrace%-1) 1� �makemenu(�(s$),mem%) 2 ' stringtrace%=�t$,">",stringtrace%) 2 � 2� i%=3 � 2@ s$=�t$,stringtrace%+1,�t$,"`",stringtrace%)-stringtrace%-1) 2( !(loop%+4)=�(s$) 22) stringtrace%=�t$,"`",stringtrace%+1) 2<� 2F� stringtrace%>=�(t$) 2P� 2Z: 2d#��create_icon_menu(menx%,meny%) 2nmeny%=96+(3*44) 2xHmenu$="Family Tree|~Info`infowindow%`|New Tree{new_tree}|Quit{fin}|" 2�menu%=menblk% 2��makemenu(menu$,menu%) 2�-ș "Wimp_CreateMenu",,menblk%,menx%,meny% 2�current_menu$=menu$ 2�� 2�: 2���create_over(menx%,meny%) 2�L menu$="Overview|Scale<scalemenu$>|Default{defaultover}|Quit{overquit}|" 2�3 scalemenu$="Scale|%1[scale%,9]{rescale_over}|" 2� menu%=menblk% 2� �makemenu(menu$,menu%) 2�. ș "Wimp_CreateMenu",,menblk%,menx%,meny% 2� current_menu$=menu$ 3� 3: 3��create_data(mx%,my%) 3"&menu$="Data|Print Data{printper}|" 3, menu%=menblk% 36 �makemenu(menu$,menu%) 3@* ș "Wimp_CreateMenu",,menblk%,mx%,my% 3J current_menu$=menu$ 3T� 3^: 3hݤprintper 3r"�copyfrom(current_per%,persd%) 3|� 2 3�)�"Printout for ";$(current_per%);" "; 3�#�$(current_per%+surname%);" ("; 3�1�convnumdate(current_per%!birthdate%);" - "; 3�.�convnumdate(current_per%!deathdate%);")" 3�"� current_per%!spouse%<>nil% � 3�D �"Married on ";�convnumdate(current_per%!marriagedate%);" to "; 3�B �$(current_per%!spouse%);" ";$(surname%+current_per%!spouse%) 3�: �"Divorced: ";�convnumdate(current_per%!divorcedate%) 3�� 3�!� current_per%!child%<>nil% � 3� o%=1:l%=current_per%!child% 3� �"Children:" 3� ȕ l%<>nil% 3�@ �convnumdate(l%!birthdate%);": ";$(l%);" ";$(l%+surname%) 4 l%=l%!sibling% 4� 4�'"Personal Details"' 4&� o%=0 � 15:� l%=1 � 60 40P � �dataset$(o%),l%,1)<>" " � �dataset$(o%),l%,1); � �datamask$(o%),l%,1); 4: �:�:� 4D�3 4N=0 4Xݤoverquit 4b overview%=� 4l !block%=over% 4v" ș "Wimp_CloseWindow",,block% 4�=0 4�: 4�ݤrescale_over 4� scaleover=�($scale%) 4� addstatus%=� 4�. ș "Wimp_ForceRedraw",over%,0,0,1280,1024 4�=0 4�: 4�ݤdefaultover 4�$scale%="1" 4�=�rescale_over 4�: 4�: 5��menu_select 5menu$=current_menu$ 5 ș "Wimp_GetPointerInfo",,q% 5 but%=q%!8 5*-�block%!0<>-1 � �rec_decode(menu$,block%) 54� (but%�1)=1 � 5> �create_menu(menx%,meny%) 5H'�loop%=0�maxgen%:column%(loop%)=0:� 5R� 5\ current_menu$="" 5f� 5p� 5z: 5���rec_decode(menu$,mem%) 5�� i%,l% 5� fn$="" 5�i%=1+!mem%:l%=1 5�� 5� l%=�menu$,"|",l%+1) 5� i%-=1 5� � i%=0 5�i%=�menu$,"{",l%) 5�� mem%!4=-1 � 5�$ � i%<�menu$,"|",l%+1) � i%<>0 � 5�* fn$=�menu$,i%+1,�menu$,"}",i%)-i%-1) 5� � 6� 6 i%=�menu$,"<",l%) 6 l%=�menu$,">",l%) 6$0 �rec_decode(�(�menu$,i%+1,l%-i%-1)),mem%+4) 6.� 68"�menu$=addmenu$ � addstatus%=� 6B� fn$<>"" � i%=�("FN"+fn$) 6LM�menu$=addmenu$ � !block%=over%:ș "Wimp_ForceRedraw",over%,0,0,1280,1024 6V fn$="" 6`� 6j: 6tݤstripstar(a$) 6~� l% 6� �l%=1��a$ 6�$ � �a$,l%,1)="*" � �a$,l%,1)="^" 6�� 6�=a$ 6�: 6���gotoperson(mx%,my%) 6�� �mx%,my%)=0 � � 6�!block%=over% 6�%ș "Wimp_GetWindowState",0,block% 6�b%=block%+4 6�x%=(b%!0-b%!16) 6�y%=(b%!12-b%!20) 7 column%()=0 7 r%=32*scaleover 7"�copyfrom(current_per%,persd%) 7personnode%=nil%:spoused%=� 7(-�findp(root%,mx%-x%,my%-y%, current_per%) 72�copyto(current_per%) 7<addstatus%=� 7F-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 7P-ș "Wimp_ForceRedraw",over%,0,0,1280,1024 7ZA� dataview% � ș "Wimp_ForceRedraw",datawindow%,0,0,1280,1024 7d� 7n: 7x!��findp(lroot%,mx%,my%, � c%) 7�r%=32*scaleover 7�� lroot%=nil% � � 7�;c%=�check(lroot%!col%,lroot%!row%,r%,mx%,my%,c%,lroot%) 7�&�findp(lroot%!sibling%,mx%,my%,c%) 7�%�findp(lroot%!child%,mx%,my%, c%) 7�� 7�: 7���message(mem%) 7�Ȏ block%!16 � 7�! � 3 : �loadfromfiler(block%) 7� � &400C0 : �filesavewindow 7� � 2 : �savetofiler(block%) 7� � 1 : �savetoscrap 8� 8� 8: 8"��loadfromfiler(mem%) 8,� loop%,F%,a$ 86� mem%!40<>treefile% � � 8@ a$="" 8Ja$=�zerostring(44+mem%) 8T$(fileicon%+44)=a$ 8^F%=�(a$) 8holdtree$=a$ 8r&� root%<>nil% � �deletetree(root%) 8|root%=�dimperson 8��load_recur(root%) 8��#F% 8�%�copyto(root%):current_per%=root% 8�-ș "Wimp_ForceRedraw",main%,0,0,1280,1024 8�addstatus%=�:spoused%=� 8�;� overview% � ș "Wimp_ForceRedraw",over%,0,0,1280,1024 8�� mem%!12<>0 � � 8�mem%!16=4:mem%!12=1 8�,ș "Wimp_SendMessage",18,block%,block%!4 8�� 8�: 8���filewinicons 8�/fileok%=�placeicon(filewindow%,180,10,"OK") 9!fileicon%=filewindow% 9!fileicon%!4=10:fileicon%!8=10 9$fileicon%!12=170:fileicon%!16=60 9&fileicon%!20=&700F125 90fileicon%!24=fileicon%+44 9:$(fileicon%+44)="treefile" 9D$fileicon%!28=-1:fileicon%!32=255 9N#ș "Wimp_CreateIcon",,fileicon% 9X�placefileicon(0) 9b� 9l: 9v��placefileicon(N%) 9�fileblock%=fileicon%+300 9�!fileblock%=filewindow% 9�fileblock%!4=2 9�$ș "Wimp_DeleteIcon",,fileblock% 9�#fileblock%!4=90:fileblock%!8=80 9�'fileblock%!12=160:fileblock%!16=150 9�fileblock%!20=&700613A 9�fileblock%!24=fileblock%+40 9�fileblock%!28=1 9�Ȏ N% � 9�? � 0 : $(fileblock%+40)="file_000":$(fileicon%+44)=oldtree$ 9�? � 1 : $(fileblock%+40)="file_aff":$(fileicon%+44)=olddraw$ 9�> � 2 : $(fileblock%+40)="file_cde":$(fileicon%+44)=oldcsv$ :� :%fileblock%!32=�($(fileblock%+40)) :4ș "Wimp_CreateIcon",,fileblock% � filetypeicon% : � :*: :4��dragfile :>!block%=filewindow% :H$ș "Wimp_GetWindowState",,block% :Rb%=block%+20 :\ b%!0=0 :fb%!4=5:b%!8=block%!4+90 :pb%!12=block%!8+80 :zb%!16=b%!8+70 :�b%!20=b%!12+70 :�Ib%!24=0:b%!28=0:b%!32=1279:b%!36=1024:b%!40=0:b%!44=0:b%!48=0:b%!52=0 :�q%!0=11:q%!4=4:q%!8=-1 :�"ș "OS_ReadVduVariables",q%,q% :�b%!32=(q%!0+1)<<(q%!4) :�ș "Wimp_DragBox",,b% :�� :�: :���filesavewindow :�Ȏ block%!32 � :�( � 0 : �placefileicon(0):filesave%=0 :�D ș "Wimp_CreateSubMenu",,block%!20,block%!24,block%!28 :�@ � 2 : � block%!36=2 � �placefileicon(2) � �placefileicon(1) ;D ș "Wimp_CreateSubMenu",,block%!20,block%!24,block%!28 ;# filesave%=block%!36+1 ; � ;$� ;.� ;8: ;B ��dragend ;L$ș "Wimp_GetPointerInfo",,block% ;VY� block%!12=over% � block%!12=filewindow% � block%!12=main% � block%!12=findwind% � � ;`b%=block%+20 ;j!b%=44+�($(fileicon%+44)) ;t!b%+=4-(!b% � 4) ;~b%!4=0:b%!8=0 ;�b%!12=0 ;�b%!16=1 ;�b%!20=block%!12 ;�b%!24=block%!16 ;�b%!28=block%!0 ;�b%!32=block%!4 ;�b%!36=2000 ;�Ȏ filesave% � ;� � 0 : b%!40=treefile% ;� � 3 : b%!40=csvfile% ;� : b%!40=&AFF ;�� <