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
;��
<