Home » Archimedes archive » Archimedes World » AW-1995-06_Disc2.adf » June95_2 » Apps/BigBook/!BigBook/!RunImage
Apps/BigBook/!BigBook/!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-1995-06_Disc2.adf » June95_2 |
| Filename: | Apps/BigBook/!BigBook/!RunImage |
| Read OK: | ✔ |
| File size: | 1166C bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM > <BigBook$Dir>.!RunImage
20PROCinitiate
30ON ERROR PROCerror(REPORT$)
40
50next_time%=0
60WHILE NOTexit
70 null%=dragging%OR(insptr%<inslen%)
80 IF alarm_set% THEN
90 PROCpollidle(0,next_time%)
100 SYS"OS_ReadMonotonicTime" TO new_time%
110 IF new_time%>=next_time% THEN
120 IF FNthis_time>=c_time%(alarm_set%) THEN PROCalarm(alarm_set%,this_date%,1)
130 next_time%=new_time%+1000
140 ENDIF
150 ELSE
160 PROCpoll(1+null%)
170 ENDIF
180ENDWHILE
190PROCclosedown
200
210DEF PROCinitiate
220PROCwimpinit("Big Book","!bigbook","BigBook",19,6000)
230PROCinit_s
240PROCinit_n
250PROCinit_c
260PROCinit_a
270PROCinit_l
280PROCinit_m
290PROCc_alarms
300ENDPROC
310
320DEF PROCinit_m
330DIM mp$(5,20)
340ENDPROC
350
360DEF PROCinit_s
370s_file$=dir$+".Settings"
380IF FNfileexist(s_file$) THEN
390 in_file=OPENIN(s_file$)
400 INPUT#in_file,weekends
410 INPUT#in_file,today
420 INPUT#in_file,fonts
430 INPUT#in_file,beep
440 INPUT#in_file,birthday
450 INPUT#in_file,other$
460 CLOSE#in_file
470ELSE
480 weekends=TRUE
490 today=TRUE
500 fonts=FALSE
510 beep=TRUE
520 birthday=7
530 other$="Other"
540ENDIF
550s_changed%=FALSE
560ENDPROC
570
580DEF PROCsave_s
590out_file=OPENOUT(s_file$)
600PRINT#out_file,weekends
610PRINT#out_file,today
620PRINT#out_file,fonts
630PRINT#out_file,beep
640PRINT#out_file,birthday
650PRINT#out_file,other$
660CLOSE#out_file
670s_changed%=FALSE
680ENDPROC
690
700DEF PROCinit_n
710PROCiconinfo(w%(notepad%),9,q%)
720n_s0%=q%!8+4
730n_s1%=q%!16-q%!8-8
740n_si%=10
750PROCiconinfo(w%(notepad%),n_si%,q%)
760n_s2%=q%!12
770n_s3%=q%!20
780n_sf%=q%!24
790max_n%=64
800DIM note$(max_n%,5),n_num%(max_n%)
810n_file$=dir$+".Notes"
820IF FNfileexist(n_file$) THEN
830 in_file=OPENIN(n_file$)
840 INPUT#in_file,notes%
850 INPUT#in_file,last_n%
860 FOR note%=1 TO notes%
870 FOR i%=0 TO 5
880 INPUT#in_file,note$(note%,i%)
890 NEXT i%
900 INPUT#in_file,n_num%(note%)
910 NEXT note%
920 CLOSE#in_file
930ELSE
940 notes%=1
950 last_n%=1
960 n_num%(notes%)=last_n%
970ENDIF
980this_note%=-1
990n_changed%=FALSE
1000ENDPROC
1010
1020DEF PROCsave_n
1030out_file=OPENOUT(n_file$)
1040PRINT#out_file,notes%
1050PRINT#out_file,last_n%
1060FOR note%=1 TO notes%
1070 FOR i%=0 TO 5
1080 PRINT#out_file,note$(note%,i%)
1090 NEXT i%
1100 PRINT#out_file,n_num%(note%)
1110NEXT note%
1120CLOSE#out_file
1130n_changed%=FALSE
1140ENDPROC
1150
1160DEF PROCinit_c
1170!q%=1
1180SYS"OS_Word",14,q%
1190this_year%=VAL(STR$~(?q%))
1200this_month%=VAL(STR$~(q%?1))
1210this_date%=VAL(STR$~(q%?2))
1220DIM month$(12),ml%(12),day$(6),sd%(12),mo%(12),mml%(12)
1230month$()="","January","February","March","April","May","June","July","August","September","October","November","December"
1240ml%()=0,31,28,31,30,31,30,31,31,30,31,30,31
1250FOR m%=2 TO 12
1260 mo%(m%)=(mo%(m%-1)+ml%(m%-1))MOD7
1270NEXT m%
1280day$()="Sun","Mon","Tue","Wed","Thu","Fri","Sat"
1290FOR m%=0 TO 12
1300 month%=m%+this_month%-1
1310 c_year%=this_year%
1320 IF month%<1 THEN
1330 c_year%-=1
1340 month%+=12
1350 ENDIF
1360 IF month%>12 THEN
1370 c_year%+=1
1380 month%-=12
1390 ENDIF
1400 sd%(m%)=FNday(1,month%,c_year%)
1410 mml%(m%)=ml%(month%)
1420 IF c_year%MOD4=0 AND month%=2 THEN mml%(m%)=29
1430NEXT m%
1440c_width%=350:c_height%=40:border%=32:m_height%=40:d_width%=80
1450p_x0%=-(border%+d_width%):p_y0%=-(c_height%*37+border%)
1460p_x1%=c_width%*13+border%:p_y1%=border%+m_height%
1470PROCsetwindowextent(w%(year%),p_x0%,p_y0%,p_x1%,p_y1%)
1480PROCsetwindowextent(w%(c_horz%),p_x0%,p_y1%-m_height%,p_x1%,p_y1%)
1490PROCsetwindowextent(w%(c_vert%),p_x0%,p_y0%,p_x0%+d_width%,p_y1%)
1500c_max%=300
1510DIM c_first%(12,31),c_colour%(12,31)
1520DIM c_entry$(c_max%),c_type%(c_max%),c_time%(c_max%),c_next%(c_max%),c_link%(1,c_max%)
1530c_first%()=-1
1540c_last%=0
1550DIM d_icon% 40
1560PROCiconinfo(w%(day%),0,d_icon%)
1570d_icon%+=8
1580PROCdeleteicon(w%(day%),0)
1590d_height%=d_icon%!12-d_icon%!4
1600d_date%=-1:d_month%=-1
1610DIM l_icon%(1)
1620FOR i%=0 TO 1
1630 DIM d% 40
1640 PROCiconinfo(w%(day%),i%+1,d%)
1650 l_icon%(i%)=d%+8
1660 PROCdeleteicon(w%(day%),i%+1)
1670NEXT i%
1680DIM e_icon%(7),e_icon$(7)
1690e_icon%()=4,1,2,3,10,11,12,15
1700e_icon$()="none","birthday","todo","alarm","red","blue","green","gold"
1710DIM b_col%(15)
1720FOR i%=0 TO 15
1730 b_col%(i%)=FNiconfc(w%(colours%),i%)
1740NEXT i%
1750in_file=OPENIN(dir$+".Colours")
1760FOR i%=0 TO 15
1770 PROCseticontext(w%(colours%),i%,LEFT$(GET$#in_file,12))
1780NEXT i%
1790CLOSE#in_file
1800PROCload_c
1810a_date%=1:a_month%=0:a_next%=0
1820alarm_set%=0
1830DIM trans% 16,rect% 16,plotat% 8
1840ENDPROC
1850
1860DEF PROCinit_l
1870DIM l_list%(max_a%), l_icon% 40
1880PROCiconinfo(w%(letter%),1,l_icon%)
1890l_icon%+=8
1900l_y0%=l_icon%!4
1910l_y1%=l_icon%!12-l_icon%!4
1920PROCdeleteicon(w%(letter%),1)
1930letters%=-1
1940l_selected%=-1
1950PROCcalc_l
1960ENDPROC
1970
1980DEF PROCinit_a
1990PROCiconinfo(w%(address%),17,q%)
2000a_s0%=q%!8+4
2010a_s1%=q%!16-q%!8-8
2020a_si%=18
2030PROCiconinfo(w%(address%),a_si%,q%)
2040a_s2%=q%!12
2050a_s3%=q%!20
2060a_sf%=q%!24
2070max_a%=256
2080name=0:address=1:phone=6:other=7:dob=8:sent=9:rec=10:file=11
2090DIM a$(max_a%,11), flag%(max_a%), type%(max_a%), a_num%(max_a%), icon%(8), a%(26), g%(max_a%), temp$(max_a%), ind%(max_a%)
2100icon%()=0,2,3,4,5,6,12,13,14
2110PROCload_a
2120this_name%=1
2130DIM index_menu% 1024, sub_block% 2048, sub_index% 2048
2140PROCseticontext(w%(address%),10,other$+":")
2150DIM col_tone%(2),row_tone%(3)
2160col_tone%()=160,167,174
2170row_tone%()=122,130,136,142
2180inslen%=0:insptr%=0:DIM insdata% 400
2190ENDPROC
2200
2210DEF PROCinitwindows
2220info%=FNinfowindow("Big Book","Diary, Address book,...","Barry Wickett","1.20 (17-Dec-1994)")
2230entry%=FNwindow("day","entry",0,%10)
2240record%=FNwindow("record","record",FNmenu("File Link,Unlink"),0)
2250DIM other% 14
2260othermenu%=FNmenu(" Enter date ,14!,,other%")
2270recordmenu%=FNmenu("Date,Today,Yesterday,Other>,othermenu%")
2280insert%=FNwindow("insert","insert",0,0)
2290special%=FNmenu("Specials,Insert at Caret>,w%(insert%),Mark up birthday")
2300address%=FNwindow("addresses","address",FNmenu("Addresses,Add,Delete,Search,Sort-,Save-,Specials>,special%,Print..."),%110)
2310letter%=FNwindow("letters","letter",FNmenu("Letters,Print..."),%1)
2320colours%=FNwindow("colours","colours",0,0)
2330day%=FNwindow("days","day",FNmenu("Day,Colours>,w%(colours%),Add entry,Print..."),%100)
2340alarm%=FNwindow("alarm","alarm",0,%10)
2350print%=FNwindow("print","print",0,0)
2360year%=FNwindow("years","year",FNmenu("Book of Days,Print>-,w%(print%),Save"),%10011)
2370birthday%=FNwindow("birthday","birthday",0,%10)
2380savemenu%=FNmenu("Save,Days,Addresses,Letters,Notes,Settings-,All changes")
2390menu%=FNwindow("menu","menu",FNmenu("Big Book,Info>,w%(info%),Save>,savemenu%,Quit"),0)
2400c_horz%=FNwindow("blank","c_horz",0,0)
2410c_vert%=FNwindow("blank","c_vert",0,0)
2420settings%=FNwindow("system","settings",0,%1)
2430notepad%=FNwindow("notes","notepad",0,%10)
2440search%=FNwindow("search","search",0,0)
2450multi%=FNwindow("multi","multi",0,0)
2460PROCiconbarmenu("Big Book,Info>,w%(info%),Quit")
2470ENDPROC
2480
2490DEF PROCsave_changed
2500IF c_changed% THEN PROCsave_c
2510IF a_changed% THEN PROCsave_a
2520IF n_changed% THEN PROCsave_n
2530IF s_changed% THEN PROCsave_s
2540ENDPROC
2550
2560DEF FNmenu_iconbar
2570IF !blk%=1 THEN PROCquit
2580=0
2590
2600DEF FNclick_iconbar
2610PROCopenup(w%(menu%))
2620=0
2630
2640DEF FNmenu_menu
2650CASE !blk% OF
2660 WHEN 1
2670 CASE blk%!4 OF
2680 WHEN 0 : PROCsave_c
2690 WHEN 1,2 : PROCsave_a
2700 WHEN 3 : PROCsave_n
2710 WHEN 4 : PROCsave_s
2720 WHEN 5 : PROCsave_changed
2730 ENDCASE
2740 WHEN 2 : PROCquit
2750ENDCASE
2760=0
2770
2780DEF FNclick_menu
2790CASE icon% OF
2800 WHEN 1 : PROCopenup(w%(settings%))
2810 WHEN 3 : IF active%(notepad%) THEN PROCopenup(w%(notepad%)) ELSE PROCset_n(1)
2820 WHEN 4 : PROCopenup(w%(year%))
2830 WHEN 5 : IF active%(address%) THEN PROCopenup(w%(address%)) ELSE PROCset_a(1)
2840 WHEN 6 : PROCopenup(w%(letter%))
2850ENDCASE
2860=0
2870
2880DEF FNopen_settings
2890IF NOTactive%(settings%) THEN
2900 PROCselecticon(w%(settings%),14,weekends)
2910 PROCselecticon(w%(settings%),2,today)
2920 PROCselecticon(w%(settings%),3,fonts)
2930 PROCselecticon(w%(settings%),4,beep)
2940 PROCseticonval(w%(settings%),8,birthday)
2950 PROCseticontext(w%(settings%),12,other$)
2960ENDIF
2970=0
2980
2990DEF FNclick_settings
3000CASE icon% OF
3010 WHEN 16
3020 PROCnew_settings
3030 PROCclosewindow(w%(settings%))
3040 WHEN 15 : PROCclosewindow(w%(settings%))
3050 WHEN 17
3060 PROCnew_settings
3070 PROCsave_s
3080 PROCclosewindow(w%(settings%))
3090 WHEN 5,6 : d%=FNincicon(8,5,6,1,9)
3100OTHERWISE
3110ENDCASE
3120=0
3130
3140DEF FNclose_birthday
3150PROCquickclosewindow(w%(birthday%))
3160active%(birthday%)=FALSE
3170IF b_checking% THEN PROCc_birthdays
3180=0
3190
3200DEF FNclose_alarm
3210PROCquickclosewindow(w%(alarm%))
3220active%(alarm%)=FALSE
3230IF a_checking% THEN PROCc_alarms
3240=0
3250
3260DEF FNclick_alarm
3270=0
3280
3290DEF FNclick_colours
3300CASE icon% OF
3310 WHEN 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 : c_chosen%=icon%
3320 WHEN 16 : PROCclosemenu
3330 WHEN 17
3340 c_colour%(d_month%,d_date%)=c_chosen%
3350 PROCredo_c(d_month%,d_date%)
3360 PROCclosemenu
3370ENDCASE
3380=0
3390
3400DEF FNmenu_record
3410IF !blk%=0 THEN
3420 a$(l_selected%,file)=""
3430 type%(l_selected%)=-1
3440 PROCset_l_data
3450ENDIF
3460=0
3470
3480DEF FNclick_record
3490CASE icon% OF
3500 WHEN 4
3510 file$=a$(l_selected%,file)
3520 PROCfileinfo(file$)
3530 IF exist% THEN
3540 PROCmouseinfo
3550 blk%!12=0
3560 blk%!16=5
3570 blk%!20=wind%
3580 blk%!24=icon%
3590 blk%!28=mx%
3600 blk%!32=my%
3610 blk%!36=filesize%
3620 blk%!40=type%(l_selected%)
3630 $(blk%+44)=file$+CHR$0
3640 !blk%=(LENfile$+48)ANDNOT3
3650 SYS"Wimp_SendMessage",18,blk%,0
3660 ELSE
3670 PROCreport("Letter file not found.")
3680 ENDIF
3690 WHEN 5,6
3700 r_which%=6-icon%
3710 $other%=FNicontext(wind%,r_which%+2)
3720 PROCopeniconmenu(wind%,icon%,recordmenu%)
3730 WHEN 10
3740 PROCset_a(l_selected%)
3750 PROCopenup(w%(address%))
3760 WHEN 11 : PROCclosewindow(w%(record%))
3770ENDCASE
3780=0
3790
3800DEF FNkey_search
3810IF key%=13 THEN PROCsearch(0,1)
3820=0
3830
3840DEF FNclick_search
3850IF search_type%=1 THEN this%=this_note% ELSE this%=this_name%
3860CASE icon% OF
3870 WHEN 2 : PROCsearch(0,1)
3880 WHEN 3 : PROCsearch(this%,1)
3890 WHEN 4 : PROCsearch(this%,-1)
3900 WHEN 5 : PROCclosewindow(w%(search%))
3910ENDCASE
3920=0
3930
3940DEF FNdrop_notepad
3950=0
3960
3970DEF FNclose_notepad
3980PROCget_n_data
3990=TRUE
4000
4010DEF FNclick_notepad
4020CASE icon% OF
4030 WHEN 7 : PROCinc_n(-1)
4040 WHEN 8 : PROCinc_n(1)
4050 WHEN n_si% : PROCdrag_n
4060 WHEN 11 : PROCadd_n
4070 WHEN 12 : PROCdelete_n
4080 WHEN 13 : PROCopen_search(1)
4090 WHEN 14 : PROCstart_multi(notepad%)
4100ENDCASE
4110=0
4120
4130DEF FNkey_notepad
4140IF key%>=32 AND key%<=255 THEN
4150 st$=FNicontext(wind%,icon%)
4160 IF key%=127 THEN
4170 IF index%>0 THEN
4180 st$=LEFT$(st$,index%-1)+MID$(st$,index%+1)
4190 PROCseticontext(wind%,icon%,st$)
4200 ENDIF
4210 ELSE
4220 st$=LEFT$(st$,index%)+CHR$(key%)+MID$(st$,index%+1)
4230 index%+=1
4240 rem$=""
4250 first%=TRUE
4260 REPEAT
4270 IF rem$<>"" AND st$<>"" THEN rem$+=" "
4280 st$=rem$+st$
4290 rem$=""
4300 IF LENst$>30 THEN
4310 p%=30
4320 REPEAT
4330 IF MID$(st$,p%,1)=" " THEN p%=-p% ELSE p%-=1
4340 UNTIL p%<=0
4350 IF p%=0 THEN
4360 rem$=MID$(st$,31)
4370 st$=LEFT$(st$,30)
4380 ELSE
4390 p%=-p%
4400 rem$=MID$(st$,p%+1)
4410 st$=LEFT$(st$,p%-1)
4420 ENDIF
4430 ENDIF
4440 PROCseticontext(wind%,icon%,st$)
4450 IF first% THEN
4460 IF index%<=LENst$ THEN
4470 cicon%=icon%
4480 cindex%=index%
4490 ELSE
4500 cicon%=icon%+1
4510 cindex%=index%-LENst$-1
4520 ENDIF
4530 first%=FALSE
4540 ENDIF
4550 icon%+=1
4560 IF icon%<=6 THEN st$=FNicontext(wind%,icon%)
4570 UNTIL rem$="" OR icon%>6
4580 IF cicon%=7 THEN
4590 PROCadd_n
4600 PROCseticontext(wind%,1,rem$)
4610 cicon%=1
4620 ENDIF
4630 PROCputcaret(wind%,cicon%,cindex%)
4640 ENDIF
4650ENDIF
4660IF key%=13 THEN PROCadd_n
4670=0
4680
4690DEF FNkey_address
4700IF key%=13 THEN PROCadd_a
4710=0
4720
4730DEF FNclick_address
4740CASE icon% OF
4750 WHEN 16 : PROCinc_a(-1)
4760 WHEN 19 : PROCinc_a(1)
4770 WHEN a_si% : PROCdrag_a
4780 WHEN 24 : PROCletter_a
4790 WHEN 20 : PROCa_index
4800 WHEN 25 : PROCl_select(this_name%)
4810 WHEN 26 : PROCdial(FNicontext(w%(address%),12))
4820ENDCASE
4830=0
4840
4850DEF FNpremenu_address
4860PROCseticontext(w%(insert%),5,other$)
4870=0
4880
4890DEF FNmenu_address
4900CASE !blk% OF
4910 WHEN 0 : PROCadd_a
4920 WHEN 1 : PROCdelete_a
4930 WHEN 2 : PROCopen_search(2)
4940 WHEN 3 : IF names%>1 THEN PROCsort_a
4950 WHEN 4 : PROCsave_a
4960 WHEN 5 : IF blk%!4=1 THEN PROCmark_birthday
4970 WHEN 6 : PROCstart_multi(address%)
4980ENDCASE
4990=0
5000
5010DEF FNclose_address
5020PROCget_a_data
5030=TRUE
5040
5050DEF FNdrop_address
5060=0
5070
5080DEF FNkey_entry
5090IF key%=13 THEN
5100 PROCget_e
5110 PROCclosewindow(w%(entry%))
5120ENDIF
5130=0
5140
5150DEF FNclose_entry
5160PROCget_e
5170=TRUE
5180
5190DEF FNclick_entry
5200CASE icon% OF
5210 WHEN 1,2,3,4,10,11,12,15 : PROCselecticon(wind%,icon%,TRUE)
5220 WHEN 13
5230 PROCget_e
5240 PROCclosewindow(w%(entry%))
5250 WHEN 5,6,8,9
5260 h%=e_time%DIV60
5270 m%=e_time%MOD60
5280 CASE icon% OF
5290 WHEN 5 : h%-=1
5300 WHEN 6 : h%+=1
5310 WHEN 9 : m%-=1
5320 WHEN 8 : m%+=1
5330 ENDCASE
5340 IF h%>23 THEN h%=0 ELSE IF h%<0 THEN h%=23
5350 IF m%<0 THEN m%=59 ELSE IF m%>59 THEN m%=0
5360 PROCset_e_time(h%*60+m%)
5370 WHEN 16 : PROCstartdrag(entry%,icon%)
5380 WHEN 17
5390 temp_entry%=this_entry%
5400 PROCset_e(-1)
5410 PROCremove_e(d_month%,d_date%,temp_entry%)
5420 PROCcalc_d
5430 WHEN 18,19
5440 c_link%(icon%-18,this_entry%)=0
5450 PROCforceredraw(w%(day%))
5460ENDCASE
5470=0
5480
5490DEF FNdrop_entry
5500CASE wind% OF
5510 WHEN w%(notepad%)
5520 c_link%(1,this_entry%)=n_num%(this_note%)
5530 c_changed%=TRUE
5540 PROCforceredraw(w%(day%))
5550 WHEN w%(address%)
5560 c_link%(0,this_entry%)=a_num%(this_name%)
5570 c_changed%=TRUE
5580 PROCforceredraw(w%(day%))
5590ENDCASE
5600=0
5610
5620DEF FNclick_insert
5630CASE icon% OF
5640 WHEN 7 : PROCinsert
5650 WHEN 8 : PROCclosemenu
5660ENDCASE
5670=0
5680
5690DEF PROCstart_multi(w0%)
5700mp$()=""
5710FOR i%=3 TO 8
5720 PROCseticonvalid(w%(multi%),i%,"Sp")
5730NEXT i%
5740PROCset_multi(w0%,3)
5750PROCopenup(w%(multi%))
5760ENDPROC
5770
5780DEF FNclick_multi
5790CASE icon% OF
5800 WHEN 1 : PROCclosewindow(w%(multi%))
5810 WHEN 2 : PROCprint_multi
5820ENDCASE
5830=0
5840
5850DEF PROCprint_multi
5860SYS "XPDriver_Info" TO ;flags%
5870IF flags% AND 1 THEN PROCreport("Printer manager not installed."):ENDPROC
5880SYS"Hourglass_On"
5890pf%=OPENOUT("printer:")
5900SYS"PDriver_SelectJob",pf%,"Planner"
5910LOCAL ERROR
5920ON ERROR LOCAL:RESTORE ERROR:SYS "PDriver_AbortJob",pf%:CLOSE#pf%:SYS"Hourglass_Off":PROCreport(REPORT$):ENDPROC
5930SYS"PDriver_PageSize" TO ,w%,h%,l%,b%,r%,t%
5940!rect%=0:rect%!4=0
5950rect%!8=1420:rect%!12=1820
5960!trans%=1<<16:trans%!4=0
5970trans%!8=0:trans%!12=1<<16
5980!plotat%=l%:plotat%!4=b%
5990SYS"PDriver_GiveRectangle",0,rect%,trans%,plotat%,&FFFFFF00
6000SYS"PDriver_DrawPage",1,blk%,0,0 TO more%
6010WHILE more%
6020 SYS"Font_FindFont",,"Trinity.Medium",12*16,12*16,0,0 TO handle%
6030 SYS"Font_FindFont",,"Trinity.Bold",12*16,12*16,0,0 TO bold%
6040 SYS"Font_SetFont",handle%
6050 SYS"ColourTrans_SetFontColours",0,&FFFFFF00,0,6
6060 FOR i%=0 TO 5
6070 x0%=(i%MOD2)*700+20
6080 y0%=1820-(i%DIV2)*600
6090 FOR l%=0 TO 20
6100 IF mp$(i%,l%)<>"" THEN
6110 IF LEFT$(mp$(i%,l%),1)="!" THEN
6120 SYS"Font_SetFont",bold%
6130 PROCfancy(MID$(mp$(i%,l%),2),x0%,y0%-(l%+1)*32)
6140 SYS"Font_SetFont",handle%
6150 ELSE
6160 PROCfancy(mp$(i%,l%),x0%,y0%-(l%+1)*32)
6170 ENDIF
6180 ENDIF
6190 NEXT l%
6200 NEXT i%
6210 SYS"PDriver_GetRectangle",,blk% TO more%
6220 SYS"Font_LoseFont",handle%
6230 SYS"Font_LoseFont",bold%
6240ENDWHILE
6250SYS"PDriver_EndJob",pf%
6260RESTORE ERROR
6270CLOSE#pf%
6280SYS"Hourglass_Off"
6290PROCclosewindow(w%(multi%))
6300ENDPROC
6310
6320DEF PROCfancy(st$,x%,y%)
6330LOCAL tab%
6340tab%=INSTR(st$,CHR$9)
6350IF tab%=0 THEN
6360 SYS"Font_Paint",,st$,%10100,x%,y%
6370ELSE
6380 IF tab%>1 THEN PROCfancy(LEFT$(st$,tab%-1),x%,y%)
6390 PROCfancy(MID$(st$,tab%+1),x%+80,y%)
6400ENDPROC
6410
6420DEF FNdrop_multi
6430PROCset_multi(FNid(wind%),dragicon%)
6440=0
6450
6460DEF PROCset_multi(w%,i%)
6470icon$=""
6480FOR l%=0 TO 20
6490 mp$(i%-3,l%)=""
6500NEXT l%
6510CASE w% OF
6520 WHEN address%
6530 icon$="paddress"
6540 FOR type=name TO dob
6550 mp$(i%-3,type-name)=a$(this_name%,type)
6560 NEXT type
6570 mp$(i%-3,0)="!"+mp$(i%-3,0)
6580 WHEN day%
6590 icon$="pdays"
6600 p%=1
6610 mp$(i%-3,0)="!"+t_date$
6620 next%=c_first%(d_month%,d_date%)
6630 WHILE next%<>-1 AND p%<=20
6640 IF c_type%(next%)AND256 THEN time$=FNtime(c_time%(next%))+CHR$9 ELSE time$=""
6650 mp$(i%-3,p%)=time$+c_entry$(next%)
6660 next%=c_next%(next%)
6670 p%+=1
6680 ENDWHILE
6690 WHEN notepad%
6700 icon$="pnotepad"
6710 FOR i2%=0 TO 5
6720 mp$(i%-3,i2%)=FNicontext(w%(notepad%),i2%+1)
6730 NEXT i2%
6740 WHEN letter%
6750 icon$="pletters"
6760 t$=CHR$9+CHR$9+CHR$9+CHR$9+CHR$9
6770 mp$(i%-3,0)="!Name"+t$+"Last Sent"+CHR$9+CHR$9+"Last Received"
6780 IF letters% THEN
6790 FOR l%=1 TO letters%
6800 name%=l_list%(l%)
6810 mp$(i%-3,l%)=a$(name%,name)+t$+a$(name%,sent)+CHR$9+CHR$9+a$(name%,rec)
6820 NEXT l%
6830 ENDIF
6840OTHERWISE
6850 icon$="p"
6860ENDCASE
6870PROCseticonvalid(w%(multi%),i%,"S"+icon$)
6880IF icon$="p" THEN PROCreport("Cannot print this.")
6890ENDPROC
6900
6910DEF FNclick_print
6920CASE icon% OF
6930 WHEN 4 : PROCclosemenu
6940 WHEN 5 : PROCprint_year
6950ENDCASE
6960=0
6970
6980DEF FNpreopen_year
6990IF active%(year%) THEN
7000 !q%=w%(c_horz%)
7010 SYS"Wimp_GetWindowState",,q%
7020 IF q%!28=blk%!28 THEN blk%!28=w%(c_vert%)
7030ENDIF
7040=0
7050
7060DEF FNopen_year
7070IF active%(year%)=FALSE AND today=TRUE THEN PROCnew_day(this_date%,1)
7080PROCwindow_state(w%(year%))
7090!blk%=w%(c_horz%)
7100blk%!8=blk%!16-m_height%
7110blk%!24=0
7120PROCopenwindow
7130PROCwindow_state(w%(year%))
7140!blk%=w%(c_vert%)
7150blk%!12=blk%!4+d_width%
7160blk%!16=blk%!16
7170blk%!20=0
7180blk%!28=w%(c_horz%)
7190PROCopenwindow
7200=0
7210
7220DEF FNclose_year
7230PROCclosewindow(w%(c_horz%))
7240PROCclosewindow(w%(c_vert%))
7250=TRUE
7260
7270DEF FNmenu_year
7280CASE !blk% OF
7290 WHEN 1 : PROCsave_c
7300ENDCASE
7310=0
7320
7330DEF FNclick_year
7340mx%-=wx%(year%)
7350my%-=wy%(year%)
7360m%=mx%DIVc_width%
7370IF m%>=0 AND m%<=12 THEN
7380 d%=((-my%)DIVc_height%)-sd%(m%)+1
7390 IF d%>=1 AND d%<=mml%(m%) THEN PROCnew_day(d%,m%)
7400ENDIF
7410=0
7420
7430DEF FNredraw_year
7440font_col%=-1
7450IF fonts THEN
7460 SYS"Font_FindFont",,"Trinity.Medium",12*16,12*16,0,0 TO handle%
7470 SYS"Font_SetFont",handle%
7480ENDIF
7490m0%=x0%DIVc_width%
7500m1%=x1%DIVc_width%
7510d1%=(-y0%)DIVc_height%
7520d0%=(-y1%)DIVc_height%
7530FOR m%=m0% TO m1%
7540 IF m%>=0 AND m%<=12 THEN
7550 month%=((m%+this_month%+10)MOD12)+1
7560 x_pos%=wx%+m%*c_width%
7570 FOR d%=d0% TO d1%
7580 IF d%>=sd%(m%) AND d%<sd%(m%)+mml%(m%) THEN
7590 y_pos%=wy%-d%*c_height%
7600 date%=d%-sd%(m%)+1
7610 IF opt1% THEN
7620 f_col%=0
7630 ELSE
7640 f_col%=c_colour%(m%,date%)
7650 IF f_col%=0 AND weekends=TRUE AND (d%MOD7=0 OR d%MOD7=6) THEN f_col%=1
7660 ENDIF
7670 IF font_col%<>f_col% AND fonts THEN
7680 SYS"ColourTrans_SetFontColours",0,!(deskpal%+f_col%*4),!(deskpal%+b_col%(f_col%)*4),6
7690 font_col%=f_col%
7700 ENDIF
7710 IF f_col% THEN
7720 SYS"ColourTrans_SetGCOL",!(deskpal%+(f_col%*4))
7730 RECTANGLE FILL x_pos%,y_pos%,c_width%,-c_height%
7740 ENDIF
7750 SYS"ColourTrans_SetGCOL",deskpal%!28
7760 RECTANGLE x_pos%,y_pos%,c_width%,-c_height%
7770 IF b_col%(f_col%)=0 AND fonts=0 THEN SYS"ColourTrans_SetGCOL",!deskpal%
7780 PROCprint(STR$(date%),x_pos%+8,y_pos%-8)
7790 IF c_first%(m%,date%)>-1 AND opt0%=FALSE THEN PROCprint(FNsnip(c_entry$(c_first%(m%,date%)),c_width%-50),x_pos%+46,y_pos%-8)
7800 ENDIF
7810 NEXT d%
7820 ENDIF
7830NEXT m%
7840IF fonts THEN SYS"Font_LoseFont",handle%
7850=0
7860
7870DEF FNsnip(st$,max%)
7880WHILE FNstring_width(st$)>max%
7890 st$=LEFT$(st$,LENst$-1)
7900ENDWHILE
7910=st$
7920
7930DEF PROCprint(st$,x%,y%)
7940IF fonts THEN
7950 SYS"Font_Paint",handle%,st$,%10100,x%,y%-20
7960ELSE
7970 MOVE x%,y%
7980 PRINTst$
7990ENDIF
8000ENDPROC
8010
8020DEF FNstring_width(st$)
8030LOCAL width%,x0%,x1%
8040IF fonts THEN
8050 SYS"Font_StringBBox",handle%,st$ TO ,x0%,,x1%
8060 width%=x1%-x0%
8070 SYS"Font_ConverttoOS",,width% TO ,width%
8080ELSE
8090 width%=LENst$*16
8100ENDIF
8110=width%
8120
8130DEF FNclick_c_horz
8140=0
8150
8160DEF FNredraw_c_horz
8170IF fonts THEN
8180 SYS"Font_FindFont",,"Trinity.Medium",12*16,12*16,0,0 TO handle%
8190 SYS"Font_SetFont",handle%
8200 SYS"ColourTrans_SetFontColours",0,!deskpal%,deskpal%!28,6
8210ELSE
8220 SYS"ColourTrans_SetGCOL",deskpal%!28
8230ENDIF
8240m0%=x0%DIVc_width%
8250m1%=x1%DIVc_width%
8260y_pos%=wy%-8+p_y1%
8270FOR m%=m0% TO m1%
8280 IF m%>=0 AND m%<=12 THEN
8290 month%=((m%+this_month%+10)MOD12)+1
8300 PROCprint(month$(month%),wx%+m%*c_width%+(c_width%-FNstring_width(month$(month%)))/2,y_pos%)
8310 ENDIF
8320NEXT m%
8330IF fonts THEN SYS"Font_LoseFont",handle%
8340=0
8350
8360DEF FNclick_c_vert
8370=0
8380
8390DEF FNredraw_c_vert
8400IF fonts THEN
8410 SYS"Font_FindFont",,"Trinity.Medium",12*16,12*16,0,0 TO handle%
8420 SYS"Font_SetFont",handle%
8430 SYS"ColourTrans_SetFontColours",0,!deskpal%,deskpal%!28,6
8440ELSE
8450 SYS"ColourTrans_SetGCOL",deskpal%!28
8460ENDIF
8470d1%=(-y0%)DIVc_height%
8480d0%=(-y1%)DIVc_height%
8490x_pos%=wx%+8+p_x0%
8500FOR d%=d0% TO d1%
8510 IF d%>=0 AND d%<=36 THEN PROCprint(day$(d%MOD7),x_pos%,wy%-(d%*c_height%+8))
8520NEXT d%
8530IF fonts THEN SYS"Font_LoseFont",handle%
8540=0
8550
8560DEF FNpremenu_day
8570FOR i%=0 TO 15
8580 PROCselecticon(w%(colours%),i%,(c_colour%(d_month%,d_date%)=i%))
8590NEXT i%
8600c_chosen%=c_colour%(d_month%,d_date%)
8610=0
8620
8630DEF FNmenu_day
8640CASE !blk% OF
8650 WHEN 1 : PROCadd_e
8660 WHEN 2 : PROCstart_multi(day%)
8670ENDCASE
8680=0
8690
8700DEF FNclick_day
8710mx%-=wx%(day%)
8720my%-=wy%(day%)
8730next%=c_first%(d_month%,d_date%)
8740e%=0
8750WHILE next%<>-1
8760 PROCcalc_d_ords(e%)
8770 IF mx%>!d_icon% AND my%>d_icon%!4 AND mx%<d_icon%!8 AND my%<d_icon%!12 THEN
8780 link%=-1
8790 FOR i%=0 TO 1
8800 IF mx%>!l_icon%(i%) AND mx%<l_icon%(i%)!8 AND c_link%(i%,next%)>0 THEN link%=i%
8810 NEXT i%
8820 CASE link% OF
8830 WHEN 0
8840 l_name%=-1
8850 FOR n%=1 TO names%
8860 IF a_num%(n%)=c_link%(0,next%) THEN l_name%=n%
8870 NEXT n%
8880 IF l_name%>0 THEN
8890 PROCset_a(l_name%)
8900 PROCopenup(w%(address%))
8910 ELSE
8920 PROCreport("Linked address has been deleted.")
8930 ENDIF
8940 WHEN 1
8950 l_note%=-1
8960 FOR n%=1 TO notes%
8970 IF n_num%(n%)=c_link%(1,next%) THEN l_note%=n%
8980 NEXT n%
8990 IF l_note%>0 THEN
9000 PROCset_n(l_note%)
9010 PROCopenup(w%(notepad%))
9020 ELSE
9030 PROCreport("Linked note has been deleted.")
9040 ENDIF
9050 WHEN -1
9060 PROCset_e(next%)
9070 ENDCASE
9080 ENDIF
9090 next%=c_next%(next%)
9100 e%+=1
9110ENDWHILE
9120=0
9130
9140DEF FNredraw_day
9150next%=c_first%(d_month%,d_date%)
9160e%=0
9170WHILE next%<>-1
9180 PROCcalc_d_ords(e%)
9190 IF c_type%(next%)AND256 THEN time$=FNtime(c_time%(next%))+" " ELSE time$=""
9200 $(d_icon%!20)=time$+c_entry$(next%)
9210 $(d_icon%!24)="S"+e_icon$(c_type%(next%)AND255)
9220 SYS"Wimp_PlotIcon",,d_icon%
9230 FOR i%=0 TO 1
9240 IF c_link%(i%,next%) THEN
9250 l_icon%(i%)!4=d_icon%!4
9260 l_icon%(i%)!12=d_icon%!12
9270 SYS"Wimp_PlotIcon",,l_icon%(i%)
9280 ENDIF
9290 NEXT i%
9300 next%=c_next%(next%)
9310 e%+=1
9320ENDWHILE
9330=0
9340
9350DEF FNopen_letter
9360IF NOTactive%(letter%) THEN
9370 PROCcalc_l
9380 l_selected%=0
9390ENDIF
9400=0
9410
9420DEF FNredraw_letter
9430IF letters% THEN
9440 FOR l%=1 TO letters%
9450 PROCcalc_l_ords(l%)
9460 IF l_icon%!4<=y1% AND l_icon%!12>=y0% THEN
9470 name%=l_list%(l%)
9480 $(l_icon%!20)=" "+a$(name%,name)+STRING$(32-LENa$(name%,name)," ")+a$(name%,sent)+STRING$(15-LENa$(name%,sent)," ")+a$(name%,rec)
9490 SYS"Wimp_PlotIcon",,l_icon%
9500 ENDIF
9510 NEXT l%
9520ENDIF
9530=0
9540
9550DEF FNmenu_letter
9560IF !blk%=0 THEN PROCstart_multi(letter%)
9570=0
9580
9590DEF FNclick_letter
9600mx%-=wx%(letter%)
9610my%-=wy%(letter%)
9620IF letters% THEN
9630 new%=0
9640 FOR l%=1 TO letters%
9650 PROCcalc_l_ords(l%)
9660 IF !l_icon%<=mx% AND l_icon%!4<=my% AND l_icon%!8>=mx% AND l_icon%!12>=my% THEN new%=l_list%(l%)
9670 NEXT l%
9680 PROCl_select(new%)
9690ENDIF
9700=0
9710
9720DEF FNmenu_unknown
9730CASE openmenu% OF
9740 WHEN index_menu%
9750 IF !blk%>=0 AND blk%!4>=0 THEN PROCset_a(?(!(sub_index%+40+blk%!4*24)-1)+1)
9760 WHEN recordmenu%
9770 CASE !blk% OF
9780 WHEN 0 : PROCnew_l_sr(FNdate(this_date%,this_month%,this_year%))
9790 WHEN 1 : PROCnew_l_sr(FNdate(this_date%-1,this_month%,this_year%))
9800 WHEN 2 : PROCnew_l_sr($other%)
9810 ENDCASE
9820ENDCASE
9830=0
9840
9850DEF PROCnew_l_sr(new$)
9860IF new$<>a$(l_selected%,sent+r_which%) THEN
9870 a$(l_selected%,sent+r_which%)=new$
9880 FOR l%=1 TO letters%
9890 IF l_list%(l%)=l_selected% THEN
9900 PROCcalc_l_ords(l%)
9910 SYS"Wimp_ForceRedraw",w%(letter%),!l_icon%,l_icon%!4,l_icon%!8,l_icon%!12
9920 ENDIF
9930 NEXT l%
9940 PROCset_l_data
9950 a_changed%=TRUE
9960ENDIF
9970ENDPROC
9980
9990DEF PROCmenu_warning(sub_menu%,sub_x%,sub_y%,menu%)
10000CASE openmenu% OF
10010 WHEN index_menu%
10020 c%=ASC($(index_menu%+40+menu%*24))-64
10030 ptr%=sub_index%
10040 PROCmenutitle("Select",ptr%)
10050 sub%=sub_block%
10060 FOR name%=1 TO names%
10070 IF g%(name%)=c% THEN
10080 ?sub%=name%-1
10090 len%=LEN(a$(name%,name))
10100 $(sub%+1)=a$(name%,name)
10110 ptr%+=24
10120 !ptr%=0
10130 ptr%!4=0
10140 ptr%!8=(7<<24) OR (%100010001)
10150 ptr%!12=sub%+1
10160 ptr%!16=-1
10170 ptr%!20=len%+1
10180 IF len%>max% THEN max%=len%
10190 sub%+=len%+2
10200 ENDIF
10210 NEXT name%
10220 PROCendmenu(ptr%)
10230 SYS"Wimp_CreateSubMenu",,sub_menu%,sub_x%,sub_y%
10240ENDCASE
10250ENDPROC
10260
10270REM ----Non Wimp routines----
10280
10290DEF PROCprint_year
10300SYS "XPDriver_Info" TO ;flags%
10310IF flags% AND 1 THEN PROCreport("Printer manager not installed."):ENDPROC
10320SYS"Hourglass_On"
10330pf%=OPENOUT("printer:")
10340SYS"PDriver_SelectJob",pf%,"Planner"
10350LOCAL ERROR
10360ON ERROR LOCAL:RESTORE ERROR:SYS "PDriver_AbortJob",pf%:CLOSE#pf%:SYS"Hourglass_Off":PROCreport(REPORT$):ENDPROC
10370SYS"PDriver_PageSize" TO ,w%,h%,l%,b%,r%,t%
10380opt0%=FNselected(w%(print%),2)
10390opt1%=NOT(FNselected(w%(print%),3))
10400times%=-FNselected(w%(print%),6)
10410wx%=-p_x0%:wy%=-p_y0%
10420!rect%=0:rect%!4=0
10430rect%!8=p_x1%-p_x0%:rect%!12=p_y1%-p_y0%
10440!trans%=0:trans%!4=-(1<<15)*(1+times%)*0.8
10450trans%!8=(1<<15)*(1+times%)*0.8:trans%!12=0
10460FOR time%=0 TO times%
10470 !plotat%=b%:plotat%!4=t%+(t%-(b%+8000))*time%
10480 SYS"PDriver_GiveRectangle",0,rect%,trans%,plotat%,&FFFFFF00
10490 SYS"PDriver_DrawPage",1,blk%,0,0 TO more%
10500 WHILE more%
10510 x0%=!blk%-wx%
10520 y0%=blk%!4-wy%
10530 x1%=blk%!8-wx%
10540 y1%=blk%!12-wy%
10550 d%=FNredraw_year
10560 d%=FNredraw_c_horz
10570 d%=FNredraw_c_vert
10580 SYS"PDriver_GetRectangle",,blk% TO more%
10590 ENDWHILE
10600NEXT time%
10610SYS"PDriver_EndJob",pf%
10620RESTORE ERROR
10630CLOSE#pf%
10640SYS"Hourglass_Off"
10650PROCclosemenu
10660ENDPROC
10670
10680DEF PROCinsert
10690insptr%=insdata%
10700IF FNselected(w%(insert%),2) THEN PROCadd_ins(a$(this_name%,name))
10710IF FNselected(w%(insert%),3) THEN
10720 FOR i%=address TO phone-1
10730 PROCadd_ins(a$(this_name%,i%))
10740 NEXT i%
10750ENDIF
10760IF FNselected(w%(insert%),4) THEN PROCadd_ins(a$(this_name%,phone))
10770IF FNselected(w%(insert%),5) THEN PROCadd_ins(a$(this_name%,other))
10780IF FNselected(w%(insert%),6) THEN PROCadd_ins(a$(this_name%,dob))
10790inslen%=insptr%
10800insptr%=insdata%
10810PROCclosemenu
10820a_changed%=TRUE
10830ENDPROC
10840
10850DEF PROCadd_ins(st$)
10860IF LENst$ THEN
10870 $insptr%=st$
10880 insptr%+=LENst$+1
10890ENDIF
10900ENDPROC
10910
10920DEF PROCnew_settings
10930old%=s_changed%
10940PROCsetting_change(14,weekends)
10950PROCsetting_change(2,today)
10960PROCsetting_change(3,fonts)
10970PROCsetting_change(4,beep)
10980new%=FNiconval(w%(settings%),8)
10990IF new%<>birthday THEN
11000 birthday=new%
11010 s_changed%=TRUE
11020ENDIF
11030new$=FNicontext(w%(settings%),12)
11040IF new$<>other$ THEN
11050 other$=new$
11060 s_changed%=TRUE
11070 PROCseticontext(w%(address%),10,other$+":")
11080ENDIF
11090IF s_changed%<>old% AND active%(year%) THEN PROCforceredraw(w%(year%))
11100ENDPROC
11110
11120DEF PROCsetting_change(icon%,RETURN val)
11130new=FNselected(w%(settings%),icon%)
11140IF new<>val THEN
11150 val=new
11160 s_changed%=TRUE
11170ENDIF
11180ENDPROC
11190
11200DEF PROCc_birthdays
11210REPEAT
11220 b_person%+=1
11230 IF b_person%>names% THEN
11240 b_person%=0
11250 b_days%+=1
11260 a_date%+=1
11270 IF a_date%>mml%(a_month%) THEN
11280 a_date%=1
11290 a_month%+=1
11300 ENDIF
11310 ELSE
11320 IF flag%(b_person%)AND2 THEN
11330 st$=a$(b_person%,dob)+"."
11340 d%=FNnext_number(st$)
11350 m%=FNnext_number(st$)
11360 IF d%=a_date% AND m%=((a_month%+this_month%-2)MOD12)+1 THEN PROCbirthday(b_person%,a_date%,a_month%,b_days%)
11370 ENDIF
11380 ENDIF
11390UNTIL active%(birthday%) OR b_days%>birthday
11400b_checking%=active%(birthday%)
11410ENDPROC
11420
11430DEF PROCbirthday(person%,date%,month%,days%)
11440PROCseticontext(w%(birthday%),2,FNdate(date%,month%+this_month%-1,this_year%))
11450PROCseticontext(w%(birthday%),3,a$(person%,name))
11460PROCopenincentre(w%(birthday%))
11470ENDPROC
11480
11490DEF FNnext_number(RETURN st$)
11500LOCAL num%
11510num%=0
11520WHILE LEFT$(st$,1)>="0" AND LEFT$(st$,1)<="9"
11530 num%=VAL(LEFT$(st$,1))+num%*10
11540 st$=MID$(st$,2)
11550ENDWHILE
11560st$=MID$(st$,2)
11570=num%
11580
11590DEF PROCc_alarms2
11600a_next%=c_first%(1,this_date%)
11610alarm_set%=0
11620WHILE a_next%<>-1
11630 IF (c_type%(a_next%)AND255)=3 AND (alarm_set%=0 OR c_time%(a_next%)<c_time%(alarm_set%)) THEN alarm_set%=a_next%
11640 a_next%=c_next%(a_next%)
11650ENDWHILE
11660ENDPROC
11670
11680DEF PROCc_alarms
11690a_checking%=TRUE
11700REPEAT
11710 IF a_next%=0 THEN a_next%=c_first%(a_month%,a_date%) ELSE a_next%=c_next%(a_next%)
11720 IF a_next%=-1 THEN
11730 a_date%+=1
11740 IF a_date%>mml%(a_month%) THEN
11750 a_date%=1
11760 a_month%+=1
11770 ENDIF
11780 a_next%=0
11790 ELSE
11800 IF (c_type%(a_next%)AND255)=3 THEN PROCalarm(a_next%,a_date%,a_month%)
11810 ENDIF
11820UNTIL active%(alarm%) OR (a_date%=this_date% AND a_month%=1)
11830a_checking%=active%(alarm%)
11840IF a_checking%=FALSE THEN
11850 PROCc_alarms2
11860 b_person%=0
11870 b_days%=0
11880 PROCc_birthdays
11890ENDIF
11900ENDPROC
11910
11920DEF PROCalarm(pos%,date%,month%)
11930PROCdial("999999")
11940c_type%(pos%)=c_type%(pos%)AND256
11950time$=FNdate(date%,month%+this_month%-1,this_year%)
11960time$=LEFT$(time$,LENtime$-3)
11970IF c_type%(pos%)AND256 THEN time$=FNtime(c_time%(pos%))+", "+time$
11980PROCseticontext(w%(alarm%),2,time$)
11990PROCseticontext(w%(alarm%),3,c_entry$(pos%))
12000PROCopenincentre(w%(alarm%))
12010IF a_checking%=FALSE THEN PROCc_alarms2
12020ENDPROC
12030
12040DEF PROCopen_search(type%)
12050search_type%=type%
12060PROCseticontext(w%(search%),0,"")
12070PROCopenwindowasmenu(w%(search%))
12080ENDPROC
12090
12100DEF PROCsearch(rec%,inc%)
12110st$=FNicontext(w%(search%),0)
12120CASE search_type% OF
12130 WHEN 1
12140 PROCget_n_data
12150 max%=notes%
12160 WHEN 2
12170 PROCget_a_data
12180 max%=names%
12190ENDCASE
12200match%=FALSE
12210rec%+=inc%
12220WHILE match%=FALSE AND rec%>=1 AND rec%<=max%
12230 CASE search_type% OF
12240 WHEN 1
12250 FOR n%=0 TO 5
12260 IF FNmatch(note$(rec%,n%),st$) THEN match%=TRUE
12270 NEXT n%
12280 WHEN 2
12290 FOR type=name TO dob
12300 IF FNmatch(a$(rec%,type),st$) THEN match%=TRUE
12310 NEXT type
12320 ENDCASE
12330 IF match%=FALSE THEN rec%+=inc%
12340ENDWHILE
12350IF match% THEN
12360 CASE search_type% OF
12370 WHEN 1 : PROCset_n(rec%)
12380 WHEN 2 : PROCset_a(rec%)
12390 ENDCASE
12400ELSE
12410 PROCclosewindow(w%(search%))
12420ENDIF
12430ENDPROC
12440
12450DEF FNmatch(st$,search$)
12460LOCAL match%,i%,i2%
12470match%=FALSE
12480i%=INSTR(search$,"*")
12490IF i%>0 THEN
12500 i2%=INSTR(st$,LEFT$(search$,i%-1))
12510 IF i2%>0 THEN match%=FNmatch(MID$(st$,i2%+i%),MID$(search$,i%+1))
12520ELSE
12530 IF INSTR(st$,search$) THEN match%=TRUE
12540ENDIF
12550=match%
12560
12570DEF PROCset_n(new%)
12580IF active%(notepad%) AND this_note%>-1 THEN PROCget_n_data
12590IF (new%<>this_note% OR active%(notepad%)=FALSE) AND new%<>-1 THEN
12600 this_note%=new%
12610 FOR i%=0 TO 5
12620 PROCseticontext(w%(notepad%),i%+1,note$(this_note%,i%))
12630 NEXT i%
12640 PROCresetcaret(w%(notepad%),-1)
12650 IF active%(notepad%)=FALSE THEN PROCopenup(w%(notepad%))
12660 PROCset_n_scroll
12670ENDIF
12680IF new%=-1 THEN PROCclosewindow(w%(notepad%))
12690ENDPROC
12700
12710DEF PROCget_n_data
12720FOR i%=0 TO 5
12730 new$=FNicontext(w%(notepad%),i%+1)
12740 IF new$<>note$(this_note%,i%) THEN
12750 note$(this_note%,i%)=new$
12760 n_changed%=TRUE
12770 ENDIF
12780NEXT i%
12790ENDPROC
12800
12810DEF PROCblank_n
12820FOR i%=0 TO 5
12830 note$(this_note%,i%)=""
12840NEXT i%
12850ENDPROC
12860
12870DEF PROCinc_n(inc%)
12880IF this_note%+inc%>=1 AND this_note%+inc%<=notes% THEN PROCset_n(this_note%+inc%)
12890ENDPROC
12900
12910DEF PROCdrag_n
12920n_off%=mx%-n_s5%
12930PROCstartuserdrag(notepad%,0,n_s0%+n_off%,my%,n_s4*(notes%-1)+n_s0%+n_off%,my%)
12940ENDPROC
12950
12960DEF PROCset_n_scroll
12970PROCdeleteicon(w%(notepad%),n_si%)
12980n_s4=(n_s1%/notes%)
12990n_s5%=n_s0%+n_s4*(this_note%-1)
13000!q%=w%(notepad%)
13010q%!4=n_s5%
13020q%!8=n_s2%
13030q%!12=q%!4+n_s4
13040q%!16=n_s3%
13050q%!20=n_sf%
13060SYS"Wimp_CreateIcon",,q% TO n_si%
13070PROCredoicon(w%(notepad%),9)
13080ENDPROC
13090
13100DEF PROCadd_n
13110IF notes%<max_n% THEN
13120 notes%+=1
13130 PROCset_n(notes%)
13140 last_n%+=1
13150 n_num%(notes%)=last_n%
13160 PROCputcaret(w%(notepad%),1,0)
13170ELSE
13180 PROCreport("Too many notes.")
13190ENDIF
13200ENDPROC
13210
13220DEF PROCdelete_n
13230PROCblank_n
13240temp%=this_note%
13250WHILE temp%<notes%
13260 FOR i%=0 TO 5
13270 note$(temp%,i%)=note$(temp%+1,i%)
13280 NEXT i%
13290 n_num%(temp%)=n_num%(temp%+1)
13300 temp%+=1
13310ENDWHILE
13320temp%=this_note%-1
13330IF temp%=0 THEN temp%=1
13340this_note%=-1
13350IF notes%>1 THEN notes%-=1
13360PROCset_n(temp%)
13370ENDPROC
13380
13390DEF PROCremove_e(m%,d%,e%)
13400next%=c_first%(m%,d%)
13410IF next%=e% THEN
13420 c_first%(m%,d%)=c_next%(e%)
13430ELSE
13440 WHILE c_next%(next%)<>e%
13450 next%=c_next%(next%)
13460 ENDWHILE
13470 c_next%(next%)=c_next%(e%)
13480ENDIF
13490ENDPROC
13500
13510DEF PROCinsert_e(m%,d%,e%)
13520after%=-1
13530next%=c_first%(m%,d%)
13540c_next%(e%)=e%
13550IF c_type%(e%)AND256 THEN
13560 WHILE next%>-1
13570 IF c_time%(e%)>c_time%(next%) AND c_type%(next%)>=256 THEN after%=next%
13580 next%=c_next%(next%)
13590 ENDWHILE
13600ELSE
13610 WHILE next%>-1
13620 IF c_type%(next%)>c_type%(e%) THEN after%=next%
13630 next%=c_next%(next%)
13640 ENDWHILE
13650ENDIF
13660IF after%=-1 THEN
13670 SWAP c_first%(m%,d%),c_next%(e%)
13680ELSE
13690 SWAP c_next%(e%),c_next%(after%)
13700ENDIF
13710e_changed%=TRUE
13720ENDPROC
13730
13740DEF PROCmark_birthday
13750st$=a$(this_name%,dob)+"."
13760d%=FNnext_number(st$)
13770m%=FNnext_number(st$)
13780IF d%>=1 AND d%<=31 AND m%>=1 AND m%<=12
13790m%=((12+m%-this_month%)MOD12)+1
13800IF c_last%<c_max% THEN
13810 c_last%+=1
13820 c_entry$(c_last%)=LEFT$(a$(this_name%,name),INSTR(a$(this_name%,name)," ")-1)+"'s birthday"
13830 c_type%(c_last%)=1
13840 c_time%(c_last%)=0
13850 c_link%(0,c_last%)=a_num%(this_name%)
13860 c_link%(1,c_last%)=0
13870 PROCinsert_e(m%,d%,c_last%)
13880 IF d_month%=m% AND d_date%=d% AND active%(day%) THEN PROCforceredraw(w%(day%))
13890 c_changed%=TRUE
13900 PROCredo_c(m%,d%)
13910ELSE
13920 PROCreport("Book of days is full.")
13930ENDIF
13940ENDPROC
13950
13960DEF PROCadd_e
13970IF c_last%<c_max% THEN
13980 c_last%+=1
13990 IF d_items%=0 THEN
14000 c_first%(d_month%,d_date%)=c_last%
14010 ELSE
14020 last%=c_first%(d_month%,d_date%)
14030 WHILE c_next%(last%)<>-1
14040 last%=c_next%(last%)
14050 ENDWHILE
14060 c_next%(last%)=c_last%
14070 ENDIF
14080 c_entry$(c_last%)=""
14090 c_type%(c_last%)=0
14100 c_time%(c_last%)=0
14110 c_next%(c_last%)=-1
14120 c_link%(0,c_last%)=0
14130 c_link%(1,c_last%)=0
14140 PROCset_e(c_last%)
14150 PROCcalc_d
14160ELSE
14170 PROCreport("Book of days is full.")
14180ENDIF
14190ENDPROC
14200
14210DEF PROCget_e
14220e_changed%=FALSE
14230o_entry$=c_entry$(this_entry%)
14240o_time%=c_time%(this_entry%)
14250o_type%=c_type%(this_entry%)
14260c_entry$(this_entry%)=FNicontext(w%(entry%),0)
14270FOR i%=0 TO 7
14280 IF FNselected(w%(entry%),e_icon%(i%)) THEN c_type%(this_entry%)=i%
14290NEXT i%
14300IF FNselected(w%(entry%),14) THEN c_type%(this_entry%)=c_type%(this_entry%)OR256 ELSE e_time%=0
14310c_time%(this_entry%)=e_time%
14320IF o_time%<>c_time%(this_entry%) OR o_type%<>c_type%(this_entry%) THEN
14330 PROCremove_e(d_month%,d_date%,this_entry%)
14340 PROCinsert_e(d_month%,d_date%,this_entry%)
14350ELSE
14360 IF o_entry$<>c_entry$(this_entry%) THEN e_changed%=TRUE
14370ENDIF
14380IF e_changed% THEN
14390 PROCforceredraw(w%(day%))
14400 PROCredo_c(d_month%,d_date%)
14410 c_changed%=TRUE
14420ENDIF
14430IF d_month%=1 AND d_date%=this_date% THEN PROCc_alarms2
14440ENDPROC
14450
14460DEF PROCset_e(new%)
14470IF new%<>-1 THEN
14480 IF active%(entry%)=FALSE THEN PROCopenup(w%(entry%))
14490 PROCseticontext(w%(entry%),0,c_entry$(new%))
14500 PROCputcaret(w%(entry%),0,LENc_entry$(new%))
14510 PROCset_e_time(c_time%(new%))
14520 FOR i%=0 TO 7
14530 PROCselecticon(w%(entry%),e_icon%(i%),(i%=(c_type%(new%)AND255)))
14540 NEXT i%
14550 PROCselecticon(w%(entry%),14,c_type%(new%)AND256)
14560ELSE
14570 PROCclosewindow(w%(entry%))
14580ENDIF
14590this_entry%=new%
14600ENDPROC
14610
14620DEF PROCset_e_time(e%)
14630PROCseticontext(w%(entry%),7,FNtime(e%))
14640e_time%=e%
14650ENDPROC
14660
14670DEF FNtime(time%)
14680=RIGHT$("0"+STR$(time%DIV60),2)+":"+RIGHT$("0"+STR$(time%MOD60),2)
14690
14700DEF FNday(date%,month%,year%)
14710=(date%+year%+(year%DIV4)+mo%(month%)+(year%MOD4=0 AND month%<=2))MOD7
14720
14730DEF FNdate(date%,month%,year%)
14740IF year%MOD4=0 THEN ml%(2)=29
14750IF date%<1 THEN month%-=1
14760IF month%>12 THEN
14770 month%-=12
14780 year%+=1
14790ENDIF
14800IF month%<1 THEN
14810 month%+=12
14820 year%-=1
14830ENDIF
14840IF date%<1 THEN date%=ml%(month%)
14850=day$(FNday(date%,month%,year%))+" "+STR$(date%)+" "+LEFT$(month$(month%),3)+" "+STR$(year%)
14860
14870DEF PROCnew_day(d%,m%)
14880IF d%<>d_date% OR m%<>d_month% THEN
14890 d_month%=m%
14900 d_date%=d%
14910 PROCcalc_d
14920 t_date$=FNdate(d_date%,d_month%+this_month%-1,this_year%)
14930 PROCnewtitle(w%(day%),t_date$)
14940 IF active%(entry%) THEN PROCclosewindow(w%(entry%))
14950 PROCnewtitle(w%(entry%),t_date$)
14960ENDIF
14970PROCopenup(w%(day%))
14980ENDPROC
14990
15000DEF PROCredo_c(m%,d%)
15010d%=d%-1+sd%(m%)
15020PROCredobox(w%(year%),m%*c_width%,-(d%*c_height%+c_height%),m%*c_width%+c_width%,-d%*c_height%)
15030ENDPROC
15040
15050DEF PROCcalc_d
15060d_items%=0
15070next%=c_first%(d_month%,d_date%)
15080WHILE next%<>-1
15090 d_items%+=1
15100 next%=c_next%(next%)
15110ENDWHILE
15120PROCsetwindowextent(w%(day%),!d_icon%-8,-d_height%*d_items%,d_icon%!8+8,0)
15130PROCreopen(w%(day%))
15140ENDPROC
15150
15160DEF PROCcalc_d_ords(e%)
15170d_icon%!4=-(e%+1)*d_height%
15180d_icon%!12=d_icon%!4+d_height%
15190ENDPROC
15200
15210DEF PROCload_c
15220c_file$=dir$+".Days"
15230IF FNfileexist(c_file$) THEN
15240 in_file=OPENIN(c_file$)
15250 mf%=this_month%+this_year%*12-1
15260 WHILE NOTEOF#in_file
15270 INPUT#in_file,m%
15280 INPUT#in_file,d%
15290 INPUT#in_file,colour%
15300 INPUT#in_file,end%
15310 m%-=mf%
15320 IF m%>=0 AND m%<=12 THEN
15330 c_colour%(m%,d%)=colour%
15340 prev%=-1
15350 WHILE PTR#in_file<>end%
15360 c_last%+=1
15370 INPUT#in_file,c_entry$(c_last%)
15380 INPUT#in_file,c_type%(c_last%)
15390 INPUT#in_file,c_time%(c_last%)
15400 INPUT#in_file,c_link%(0,c_last%)
15410 INPUT#in_file,c_link%(1,c_last%)
15420 c_next%(c_last%)=-1
15430 IF prev%=-1 THEN c_first%(m%,d%)=c_last% ELSE c_next%(prev%)=c_last%
15440 prev%=c_last%
15450 ENDWHILE
15460 ELSE
15470 PTR#in_file=end%
15480 ENDIF
15490 ENDWHILE
15500 CLOSE#in_file
15510ENDIF
15520c_changed%=FALSE
15530ENDPROC
15540
15550DEF PROCsave_c
15560out_file=OPENOUT(c_file$)
15570mf%=this_month%+this_year%*12-1
15580FOR m%=0 TO 12
15590 FOR d%=1 TO mml%(m%)
15600 IF c_colour%(m%,d%)>0 OR c_first%(m%,d%)>-1 THEN
15610 PRINT#out_file,m%+mf%
15620 PRINT#out_file,d%
15630 PRINT#out_file,c_colour%(m%,d%)
15640 start%=PTR#out_file
15650 PRINT#out_file,0
15660 next%=c_first%(m%,d%)
15670 WHILE next%>-1
15680 PRINT#out_file,c_entry$(next%)
15690 PRINT#out_file,c_type%(next%)
15700 PRINT#out_file,c_time%(next%)
15710 PRINT#out_file,c_link%(0,next%)
15720 PRINT#out_file,c_link%(1,next%)
15730 next%=c_next%(next%)
15740 ENDWHILE
15750 end%=PTR#out_file
15760 PTR#out_file=start%
15770 PRINT#out_file,end%
15780 PTR#out_file=end%
15790 ENDIF
15800 NEXT d%
15810NEXT m%
15820CLOSE#out_file
15830c_changed%=FALSE
15840ENDPROC
15850
15860DEF PROCl_select(new%)
15870l_selected%=new%
15880IF l_selected%=0 AND active%(record%) THEN PROCclosewindow(w%(record%))
15890IF l_selected% THEN
15900 PROCopenup(w%(record%))
15910 PROCset_l_data
15920ENDIF
15930ENDPROC
15940
15950DEF PROCset_l_data
15960PROCseticontext(w%(record%),2,a$(l_selected%,sent))
15970PROCseticontext(w%(record%),3,a$(l_selected%,rec))
15980IF type%(l_selected%)>-1 THEN
15990 PROCshadeicon(w%(record%),4,FALSE)
16000 PROCseticontext(w%(record%),4,FNlastbit(a$(l_selected%,file)))
16010 PROCsetfileicon(w%(record%),4,type%(l_selected%))
16020ELSE
16030 PROCseticontext(w%(record%),4,"<no link>")
16040 PROCseticonvalid(w%(record%),4,"Sfile_xxx")
16050 PROCshadeicon(w%(record%),4,TRUE)
16060ENDIF
16070PROCnewtitle(w%(record%),a$(l_selected%,name))
16080ENDPROC
16090
16100DEF PROCcalc_l_ords(l%)
16110l_icon%!4=l_y0%-(l%-1)*l_y1%
16120l_icon%!12=l_icon%!4+l_y1%
16130ENDPROC
16140
16150DEF PROCcalc_l
16160old%=letters%
16170l_change%=FALSE
16180letters%=0
16190FOR name%=1 TO names%
16200 IF flag%(name%)AND1 THEN
16210 letters%+=1
16220 IF l_list%(letters%)<>name% THEN l_list%(letters%)=name%
16230 ENDIF
16240NEXT name%
16250IF letters%<>old% THEN l_change%=TRUE
16260IF l_change% THEN PROCsetwindowextent(w%(letter%),!l_icon%,l_y0%-(letters%-1)*l_y1%,l_icon%!8,0)
16270IF active%(letter%) THEN PROCreopen(w%(letter%))
16280ENDPROC
16290
16300DEF PROCdial(num$)
16310SYS"Sound_Configure" TO i%
16320IF i%<2 THEN VOICES 2
16330*channelvoice 1 1
16340*channelvoice 2 1
16350SYS"Sound_QBeat",-2
16360WHILE num$<>""
16370digit%=INSTR(" 123456789*0#",LEFT$(num$,1))-2
16380IF digit%>-1 THEN
16390col%=digit%MOD3
16400row%=digit%DIV3
16410SYS"Sound_QSchedule",i%*30+5,,&FFF80001,&40000 OR col_tone%(col%)
16420SYS"Sound_QSchedule",-1,,&FFF80002,&40000 OR row_tone%(row%)
16430i%+=1
16440ENDIF
16450num$=MID$(num$,2)
16460ENDWHILE
16470ENDPROC
16480
16490DEF PROCsave_a
16500PROCget_a_data
16510out_file=OPENOUT(a_file$)
16520PRINT#out_file,last_a%
16530PRINT#out_file,names%
16540FOR name%=1 TO names%
16550 FOR type=name TO file
16560 PRINT#out_file,a$(name%,type)
16570 NEXT type
16580 PRINT#out_file,flag%(name%)
16590 PRINT#out_file,type%(name%)
16600 PRINT#out_file,a_num%(name%)
16610NEXT name%
16620CLOSE#out_file
16630a_changed%=FALSE
16640ENDPROC
16650
16660DEF PROCload_a
16670a_file$=dir$+".Address"
16680IF FNfileexist(a_file$) THEN
16690 in_file=OPENIN(a_file$)
16700 INPUT#in_file,last_a%
16710 INPUT#in_file,names%
16720 FOR name%=1 TO names%
16730 FOR type=name TO file
16740 INPUT#in_file,a$(name%,type)
16750 NEXT type
16760 INPUT#in_file,flag%(name%)
16770 INPUT#in_file,type%(name%)
16780 INPUT#in_file,a_num%(name%)
16790 NEXT name%
16800 CLOSE#in_file
16810ELSE
16820 last_a%=1
16830 names%=1
16840 this_name%=1
16850 a_num%(this_name%)=last_a%
16860 PROCget_a_data
16870ENDIF
16880a_changed%=FALSE
16890ENDPROC
16900
16910DEF PROCsort_a
16920PROCget_a_data
16930SYS"Hourglass_On"
16940FOR n%=1 TO names%
16950 ind%(n%)=n%
16960 temp$(n%)=FNlast_name(n%)
16970 temp$(n%)+=LEFT$(a$(n%,name),LENa$(n%,name)-LENtemp$(n%))
16980NEXT n%
16990REPEAT
17000 swap%=FALSE
17010 FOR n%=1 TO names%-1
17020 IF temp$(ind%(n%))>temp$(ind%(n%+1)) AND temp$(ind%(n%+1))<>"" THEN
17030 SWAP ind%(n%),ind%(n%+1)
17040 swap%=TRUE
17050 ENDIF
17060 NEXT n%
17070UNTIL swap%=FALSE
17080FOR i%=name TO file
17090 FOR n%=1 TO names%
17100 temp$(n%)=a$(n%,i%)
17110 NEXT n%
17120 FOR n%=1 TO names%
17130 a$(n%,i%)=temp$(ind%(n%))
17140 NEXT n%
17150NEXT i%
17160FOR n%=1 TO names%
17170 g%(n%)=flag%(n%)
17180NEXT n%
17190FOR n%=1 TO names%
17200 flag%(n%)=g%(ind%(n%))
17210NEXT n%
17220FOR n%=1 TO names%
17230 g%(n%)=type%(n%)
17240NEXT n%
17250FOR n%=1 TO names%
17260 type%(n%)=g%(ind%(n%))
17270NEXT n%
17280FOR n%=1 TO names%
17290 g%(n%)=a_num%(n%)
17300NEXT n%
17310FOR n%=1 TO names%
17320 a_num%(n%)=g%(ind%(n%))
17330NEXT n%
17340SYS"Hourglass_Off"
17350new%=this_name%
17360this_name%=-1
17370PROCset_a(new%)
17380IF active%(record%) THEN PROCclosewindow(w%(record%))
17390IF active%(letter%) THEN
17400 PROCcalc_l
17410 PROCforceredraw(w%(letter%))
17420ENDIF
17430ENDPROC
17440
17450DEF PROCletter_a
17460PROCshadeicon(w%(address%),25,NOT FNselected(w%(address%),24))
17470PROCget_a_data
17480IF l_selected%=this_name% AND active%(record%) THEN PROCclosewindow(w%(record%))
17490IF active%(letter%) THEN PROCcalc_l
17500ENDPROC
17510
17520DEF PROCa_index
17530a%()=0
17540ptr%=index_menu%
17550FOR name%=1 TO names%
17560 c%=ASC(FNlast_name(name%))-64
17570 IF c%>=33 AND c%<=58 THEN c%-=32
17580 IF c%>=1 AND c%<=26 THEN
17590 a%(c%)+=1
17600 g%(name%)=c%
17610 ENDIF
17620NEXT name%
17630PROCmenutitle("Index",ptr%)
17640FOR a%=1 TO 26
17650 st$=CHR$(a%+64)+">+,sub_index%,"
17660 IF a%(a%) THEN PROCmenuitem(st$,ptr%)
17670NEXT a%
17680PROCendmenu(ptr%)
17690PROCopeniconmenu(w%(address%),20,index_menu%)
17700ENDPROC
17710
17720DEF PROCdrag_a
17730a_off%=mx%-a_s5%
17740PROCstartuserdrag(address%,0,a_off%+a_s0%,my%,a_s4*(names%-1)+a_off%+a_s0%,my%)
17750ENDPROC
17760
17770DEF PROCnull
17780PROCmouseinfo
17790CASE dragid% OF
17800 WHEN address%
17810 new%=((mx%-(a_off%+a_s0%))/a_s4)+1.5
17820 IF new%<1 THEN new%=1 ELSE IF new%>names% THEN new%=names%
17830 PROCset_a(new%)
17840 WHEN notepad%
17850 new%=((mx%-(n_off%+n_s0%))/n_s4)+1.5
17860 IF new%<1 THEN new%=1 ELSE IF new%>notes% THEN new%=notes%
17870 PROCset_n(new%)
17880ENDCASE
17890IF but%=0 AND dragid%>0 THEN PROCenddrag
17900IF insptr%<inslen% THEN
17910 PROCgetcaret
17920 IF cwind%<>w%(address%) THEN
17930 SYS"Wimp_ProcessKey",?insptr%
17940 insptr%+=1
17950 ENDIF
17960ENDIF
17970ENDPROC
17980
17990DEF FNthis_time
18000!q%=1
18010SYS"OS_Word",14,q%
18020=VAL(STR$~(q%?4))*60+VAL(STR$~(q%?5))
18030
18040DEF PROCinc_a(inc%)
18050IF this_name%+inc%>=1 AND this_name%+inc%<=names% THEN PROCset_a(this_name%+inc%)
18060ENDPROC
18070
18080DEF PROCset_a(new%)
18090IF active%(address%) AND this_name%>-1 THEN PROCget_a_data
18100IF (this_name%<>new% OR active%(address%)=FALSE) AND new%<>-1 THEN
18110 this_name%=new%
18120 FOR type=name TO dob
18130 PROCseticontext(w%(address%),icon%(type),a$(this_name%,type))
18140 NEXT type
18150 PROCselecticon(w%(address%),24,flag%(this_name%)AND1)
18160 PROCselecticon(w%(address%),15,flag%(this_name%)AND2)
18170 PROCshadeicon(w%(address%),25,(NOTflag%(this_name%))AND1)
18180 PROCresetcaret(w%(address%),-1)
18190 PROCset_a_scroll
18200 IF active%(address%)=FALSE THEN PROCopenup(w%(address%))
18210ENDIF
18220IF new%=-1 THEN PROCclosewindow(w%(address%))
18230ENDPROC
18240
18250DEF PROCget_a_data
18260LOCAL new%
18270FOR type=name TO dob
18280 new$=FNicontext(w%(address%),icon%(type))
18290 IF new$<>a$(this_name%,type) THEN
18300 a_changed%=TRUE
18310 a$(this_name%,type)=new$
18320 ENDIF
18330NEXT type
18340new%=0
18350IF FNselected(w%(address%),24) THEN new%=new%OR1
18360IF FNselected(w%(address%),15) THEN new%=new%OR2
18370IF new%<>flag%(this_name%) THEN
18380 a_changed%=TRUE
18390 flag%(this_name%)=new%
18400ENDIF
18410ENDPROC
18420
18430DEF PROCset_a_scroll
18440PROCseticonval(w%(address%),21,this_name%)
18450PROCseticonval(w%(address%),23,names%)
18460PROCdeleteicon(w%(address%),a_si%)
18470a_s4=(a_s1%/names%)
18480a_s5%=a_s0%+a_s4*(this_name%-1)
18490!q%=w%(address%)
18500q%!4=a_s5%
18510q%!8=a_s2%
18520q%!12=q%!4+a_s4
18530q%!16=a_s3%
18540q%!20=a_sf%
18550SYS"Wimp_CreateIcon",,q% TO a_si%
18560PROCredoicon(w%(address%),17)
18570ENDPROC
18580
18590DEF PROCblank_a
18600FOR type=name TO file
18610 a$(this_name%,type)=""
18620NEXT type
18630flag%(this_name%)=0
18640type%(this_name%)=-1
18650ENDPROC
18660
18670DEF PROCadd_a
18680IF names%=max_a% THEN
18690 PROCreport("256 names is the maximum.")
18700ELSE
18710 names%+=1
18720 type%(names%)=-1
18730 last_a%+=1
18740 a_num%(names%)=last_a%
18750 PROCset_a(names%)
18760 PROCputcaret(w%(address%),icon%(0),0)
18770ENDIF
18780ENDPROC
18790
18800DEF PROCdelete_a
18810PROCblank_a
18820IF this_name%<names% THEN
18830 FOR a%=this_name% TO names%-1
18840 FOR type=name TO file
18850 a$(a%,type)=a$(a%+1,type)
18860 NEXT type
18870 flag%(a%)=flag%(a%+1)
18880 type%(a%)=type%(a%+1)
18890 a_num%(a%)=a_num%(a%+1)
18900 NEXT a%
18910ENDIF
18920IF names%>1 THEN names%-=1
18930IF this_name%>names% THEN this_name%=names%
18940new%=this_name%
18950this_name%=-1
18960PROCset_a(new%)
18970a_changed%=TRUE
18980ENDPROC
18990
19000DEF FNlast_name(name%)
19010LOCAL st$
19020st$=a$(name%,name)
19030WHILE INSTR(st$," ")
19040 st$=MID$(st$,INSTR(st$," ")+1)
19050ENDWHILE
19060=st$
19070
19080DEF FNfileokay(filetype%)
19090ok%=FALSE
19100PROCmouseinfo
19110CASE wind% OF
19120 WHEN w%(record%) : ok%=TRUE
19130ENDCASE
19140=ok%
19150
19160DEF PROCdo_load
19170CASE wind% OF
19180 WHEN w%(record%)
19190 type%(l_selected%)=filetype%
19200 a$(l_selected%,file)=file$
19210 PROCset_l_data
19220ENDCASE
19230ENDPROC
19240
19250REM ----WIMP Library routines----
19260
19270DEF PROCnewspritearea(RETURN sprite%,size%)
19280IF sprite%>-1 THEN PROCloseblock(sprite%)
19290sprite%=FNgetblock(size%+16)
19300IF sprite%>-1 THEN
19310!sprite%=size%+16
19320sprite%!4=0
19330sprite%!8=16
19340sprite%!12=16
19350ENDIF
19360ENDPROC
19370
19380REM ==== message routines ====
19390
19400DEF PROCpoll(poll_flags%)
19410SYS"Wimp_Poll",poll_flags%,blk% TO reason%
19420PROCsort_reason
19430ENDPROC
19440
19450DEF PROCpollidle(poll_flags%,time%)
19460SYS"Wimp_PollIdle",poll_flags%,blk%,time% TO reason%
19470PROCsort_reason
19480ENDPROC
19490
19500DEF PROCsort_reason
19510CASE reason% OF
19520 WHEN 0:IF null% THEN PROCnull
19530 WHEN 1:PROCredraw
19540 WHEN 2:PROCopenwindow
19550 WHEN 3:PROCclosewindow(!blk%)
19560 WHEN 4:IF sysflags%(FNid(!blk%))AND8 THEN d%=EVAL("FNleave_"+id$(FNid(!blk%)))
19570 WHEN 5:IF sysflags%(FNid(!blk%))AND8 THEN d%=EVAL("FNenter_"+id$(FNid(!blk%)))
19580 WHEN 6:PROCclick(!blk%,blk%!4,blk%!8,blk%!12,blk%!16)
19590 WHEN 7:PROCenddrag
19600 WHEN 8:PROCkey(!blk%,blk%!4,blk%!20,blk%!24)
19610 WHEN 9:PROCmenuselect
19620 WHEN 10:REM scroll request
19630 WHEN 11:mycaret%=FALSE
19640 WHEN 12:mycaret%=TRUE
19650 WHEN 17,18:PROCmessage(blk%!4,blk%!8,blk%!16)
19660 WHEN 19:PROCmessage_returned(blk%!16)
19670ENDCASE
19680ENDPROC
19690
19700DEF PROCmessage_returned(message%)
19710CASE message% OF
19720 WHEN 5 : SYS"Wimp_StartTask","Run "+FNstring(blk%+44)
19730ENDCASE
19740ENDPROC
19750
19760DEF PROCmessage(task%,ref%,message%)
19770IF (status%>0 AND message%>=1 AND message%<=7) OR task%=mytask% THEN message%=-1
19780CASE message% OF
19790 WHEN 0 : exit=TRUE
19800 WHEN 1
19810 wind%=blk%!20
19820 icon%=blk%!24
19830 filetype%=blk%!40
19840 IF FNfileokay(filetype%) THEN
19850 itrans%=0
19860 filesize%=blk%!36
19870 file$=FNstring(blk%+44)
19880 heapfile%=-1
19890 file%=EVAL("FNtransblock(filetype%)")
19900 IF heapfile%=-1 THEN heapfile%=file%
19910 blk%!20=file%
19920 blk%!24=filesize%
19930 IF blk%!20>-1 THEN PROCreply(18,6)
19940 ENDIF
19950 WHEN 2
19960 PROCsave(dragid%,FNstring(blk%+44),prepared%)
19970 IF saved% THEN PROCtelltoload ELSE PROCreport("Could not save file")
19980 WHEN 3 : PROCload(FNstring(blk%+44),blk%!40)
19990 WHEN 5 : PROCload(FNstring(blk%+44),blk%!40)
20000 WHEN 6
20010 togo%=filesize%-otrans%
20020 IF togo%>blk%!24 THEN togo%=blk%!24
20030 IF togo%+otrans%>filesize% THEN togo%=filesize%-otrans%
20040 SYS"Wimp_TransferBlock",mytask%,savebuff%+otrans%,task%,blk%!20,togo%
20050 blk%!24=togo%
20060 PROCreply(18,7)
20070 otrans%+=togo%
20080 IF otrans%=filesize% THEN d%=EVAL("FNfinishedtrans"+STR$~(misc%(dragid%)))
20090 WHEN 7
20100 itrans%+=blk%!24
20110 IF itrans%<filesize% THEN
20120 filesize%=itrans%
20130 d%=EVAL("FNloaded"+STR$~(filetype%))
20140 ELSE
20150 IF FNextendblock(heapfile%,1024) THEN
20160 filesize%+=1024
20170 blk%!20=file%+itrans%
20180 blk%!24=filesize%-itrans%
20190 PROCreply(18,6)
20200 ELSE
20210 PROCloseblock(file%)
20220 PROCreport("Out of room.")
20230 ENDIF
20240 ENDIF
20250 WHEN 8 : PROCprequit
20260 WHEN 10: PROCaddtobootfile(blk%!20)
20270 WHEN 9,&400C1 : PROCnewmode
20280 WHEN &400C9 :
20290 id%=FNid(blk%!20)
20300 IF id%>-1 THEN
20310 IF sysflags%(id%)AND2 THEN d%=EVAL("FNclose_"+id$(id%))
20320 ENDIF
20330 WHEN &400C0 : PROCmenu_warning(blk%!20,blk%!24,blk%!28,blk%!32)
20340ENDCASE
20350ENDPROC
20360
20370DEF PROCreply(type%,blk%!16)
20380blk%!12=ref%
20390SYS"Wimp_SendMessage",type%,blk%,task%
20400ENDPROC
20410
20420DEF PROCnewmode
20430!q%=11:q%!4=12:q%!8=4:q%!12=5:q%!16=3:q%!20=-1
20440SYS"OS_ReadVduVariables",q%,q%
20450scx%=(!q%+1)<<(q%!8)
20460scy%=(q%!4+1)<<(q%!12)
20470pixelw%=1<<q%!8:pixelh%=1<<q%!12
20480dcols%=q%!16
20490SYS"Wimp_ReadPalette",,deskpal%
20500ENDPROC
20510
20520DEF PROCprequit
20530IF a_changed% OR s_changed% OR n_changed% OR c_changed% THEN
20540 IF FNcheck("There is unsaved data, click Cancel to abort exit.")=FALSE THEN PROCreply(17,8)
20550ENDIF
20560ENDPROC
20570
20580DEF PROCaddtobootfile(handle%)
20590BPUT#file,"Run "+dir$
20600ENDPROC
20610
20620DEF PROCtelltoload
20630PROCmouseinfo
20640blk%!20=wind%
20650blk%!24=icon%
20660blk%!28=mx%
20670blk%!32=my%
20680blk%!36=filesize%
20690blk%!40=filetype%
20700PROCreply(17,3)
20710ENDPROC
20720
20730DEF PROCdropfile(filename$,filetype%,filesize%)
20740PROCmouseinfo
20750blk%!12=0
20760blk%!16=1
20770blk%!20=wind%
20780blk%!24=icon%
20790blk%!28=mx%
20800blk%!32=my%
20810blk%!36=filesize%
20820blk%!40=filetype%
20830$(blk%+44)=FNlastbit(filename$)+CHR$0
20840!blk%=(LEN$(blk%+44)+48)ANDNOT3
20850SYS"Wimp_SendMessage",17,blk%,blk%!20,blk%!24
20860otrans%=0
20870ENDPROC
20880
20890REM - Sprite routines -
20900
20910DEF PROCloadsprites
20920spritefile$=dir$+".Sprites"
20930PROCfileinfo(spritefile$)
20940IF exist%=1 THEN
20950ssize%=filesize%+16
20960DIM sprites% ssize%
20970!sprites%=ssize%
20980sprites%!4=0
20990sprites%!8=16
21000sprites%!12=16
21010SYS"OS_SpriteOp",10+256,sprites%,spritefile$
21020ELSE
21030sprites%=-1
21040ENDIF
21050ENDPROC
21060
21070DEF PROCputsprite(sprite%,sprite$,x%,y%,z1%,z2%)
21080SYS"OS_SpriteOp",24+256,sprite%,sprite$ TO ,,addr%
21090SYS"OS_SpriteOp",40+256,sprite%,sprite$ TO ,,,,,,mode%
21100s%=FNtables(addr%,mode%,spmode%,spal%,1,1,dgcol%,dscale%)
21110SYS"OS_SpriteOp",52+512,sprite%,addr%,x%,y%,8,dscale%,dgcol%
21120ENDPROC
21130
21140DEF FNtables(saddr%,spmode%,dmode%,pal%,z1%,z2%,gcol%,scale%)
21150LOCAL spal%,palblock%
21160palblock%=palblock2%
21170!scale%=(1<<FNmodevar(spmode%,4))*z1%
21180scale%!4=(1<<FNmodevar(spmode%,5))*z1%
21190scale%!8=(1<<FNmodevar(dmode%,4))*z2%
21200scale%!12=(1<<FNmodevar(dmode%,5))*z2%
21210spritepal%=(saddr%!32<>44)
21220scols%=FNmodevar(spmode%,3)
21230IF saddr%!32<>44 THEN spal%=FNspritepalette(saddr%) ELSE spal%=FNwpal(spmode%)
21240s%=FALSE
21250SYS"ColourTrans_SelectTable",spmode%,spal%,dmode%,pal%,gcol%
21260IF !scale%=scale%!8 AND scale%!4=scale%!12 AND FNmodevar(spmode%,3)=FNmodevar(dmode%,3) THEN
21270 cols%=FNmodevar(dmode%,3)
21280 IF cols%=63 THEN cols%=255
21290 s%=TRUE
21300 FOR c%=0 TO cols%
21310 IF gcol%?c%<>c% THEN s%=FALSE
21320 NEXT c%
21330ENDIF
21340=s%
21350
21360DEF FNspritepalette(saddr%)
21370cols%=FNmodevar(spmode%,3)
21380IF cols%>15 THEN cols%=15
21390FOR c%=0 TO cols%
21400palblock%!(c%<<2)=saddr%!(44+(c%<<3))
21410NEXT c%
21420=palblock%
21430
21440DEF PROCcopypalette(faddr%,taddr%)
21450FOR a%=44 TO faddr%!32-4 STEP 4
21460 taddr%!a%=faddr%!a%
21470NEXT a%
21480ENDPROC
21490
21500REM - file handling -
21510
21520DEF PROCfileinfo(file$)
21530SYS"OS_File",5,file$ TO exist%,,,,filesize%
21540ENDPROC
21550
21560DEF FNfilesize(file$)
21570LOCAL exist%,filesize%
21580PROCfileinfo(file$)
21590=filesize%
21600
21610DEF FNfileexist(file$)
21620LOCAL exist%,filesize%
21630PROCfileinfo(file$)
21640=exist%
21650
21660DEF FNloadtemplate(title$)
21670SYS"Wimp_LoadTemplate",,blk%,ind%,indend%,fonttable%,title$ TO ,,ind%,,,,found%
21680IF found%=0 THEN
21690 PROCreport("Window "+title$+" not found.")
21700 wind%=0
21710ELSE
21720 IF sprites%<>-1 THEN blk%!64=sprites%
21730 SYS"Wimp_CreateWindow",,blk% TO wind%
21740ENDIF
21750=wind%
21760
21770DEF FNnameok(file$)
21780result%=TRUE
21790IF INSTR(file$,":")+INSTR(file$,".")=0 AND file$<>"<Wimp$Scrap>" THEN
21800PROCreport("To save, drag icon to a directory viewer.")
21810result%=FALSE
21820ENDIF
21830=result%
21840
21850REM - menus -
21860
21870DEF FNchange_menu_option(menu%,item%,RETURN olditem%,wind%,icon%)
21880d%=FALSE
21890IF item%>-1 AND item%<>olditem% THEN
21900 d%=TRUE
21910 PROCtickmenu(menu%,olditem%,FALSE)
21920 PROCtickmenu(menu%,item%,TRUE)
21930 olditem%=item%
21940 IF wind%<>0 THEN
21950 p%=menu%+28+item%*24
21960 IF p%!8 AND 1<<8 THEN a$=$(p%!12) ELSE a$=$(p%+12)
21970 PROCseticontext(wind%,icon%,a$)
21980 ENDIF
21990ENDIF
22000=d%
22010
22020DEF PROCtickmenu(menu%,item%,tick%)
22030p%=menu%+28+item%*24
22040IF tick% THEN !p%=!p% OR1 ELSE !p%=!p% ANDNOT1
22050ENDPROC
22060
22070DEF PROCmenutitle(title$,RETURN menuptr%)
22080oldptr%=menuptr%
22090$menuptr%=title$
22100max%=LENtitle$
22110menuptr%!12=&70207
22120menuptr%!20=44
22130menuptr%!24=0
22140menuptr%+=4
22150ENDPROC
22160
22170DEF PROCmenuitem(RETURN text$,RETURN menuptr%)
22180menuptr%+=24
22190!menuptr%=0
22200menuptr%!4=0
22210word$=FNnextword(text$)
22220token$=FNtoken(word$)
22230i1%=-1
22240WHILE token$<>""
22250CASE token$ OF
22260WHEN ">" : menuptr%!4=EVAL(FNnextword(text$))
22270WHEN "/" : !menuptr%=!menuptr% OR 1
22280WHEN "-" : !menuptr%=!menuptr% OR 2
22290WHEN "+" : !menuptr%=!menuptr% OR 8
22300WHEN "!"
22310 !menuptr%=!menuptr% OR 4
22320 valid$=FNnextword(text$)
22330 IF LENvalid$ THEN
22340 DIM i1% LENvalid$+1
22350 $i1%=valid$
22360 ENDIF
22370ENDCASE
22380token$=FNtoken(word$)
22390ENDWHILE
22400menuptr%!8=(7<<24) OR %10001
22410IF !menuptr% AND 4 OR token$="#" THEN
22420PROCinditem(EVAL(FNnextword(text$)),i1%,EVAL(word$))
22430ELSE
22440IF LENword$<=12 THEN
22450$(menuptr%+12)=word$
22460ELSE
22470DIM i0% LENword$+1
22480$i0%=word$
22490PROCinditem(i0%,-1,LENword$+1)
22500ENDIF
22510IF LENword$>max% THEN max%=LENword$
22520ENDIF
22530ENDPROC
22540
22550DEF PROCendmenu(RETURN menuptr%)
22560!menuptr%=!menuptr% OR &80
22570menuptr%+=24
22580oldptr%!16=max%*16+12
22590ENDPROC
22600
22610DEF FNmenu(text$)
22620stext$=text$
22630items%=0
22640text$+=","
22650title$=FNnextword(text$)
22660PROCmenutitle(title$,menuptr%)
22670WHILE text$<>""
22680items%+=1
22690PROCmenuitem(text$,menuptr%)
22700ENDWHILE
22710PROCendmenu(menuptr%)
22720=oldptr%
22730
22740DEF PROCinditem(i0%,i1%,i2%)
22750menuptr%!8=menuptr%!8 OR 1<<8
22760menuptr%!12=i0%
22770menuptr%!16=i1%
22780menuptr%!20=i2%
22790IF i2%-1>max% AND (!menuptr% AND 4)=0 THEN max%=i2%-1
22800ENDPROC
22810
22820DEF FNtoken(RETURN word$)
22830token$=""
22840IF INSTR(">/!#-+",RIGHT$(word$)) THEN
22850token$=RIGHT$(word$,1)
22860word$=LEFT$(word$,LENword$-1)
22870ENDIF
22880=token$
22890
22900DEF FNnextword(RETURN text$)
22910LOCAL word$,pos%
22920pos%=INSTR(text$,",")
22930word$=LEFT$(text$,pos%-1)
22940text$=MID$(text$,pos%+1)
22950=word$
22960
22970DEF PROCclosemenu
22980SYS"Wimp_CreateMenu",,-1
22990ENDPROC
23000
23010REM - icons -
23020
23030DEF PROCshadeicon(!q%,q%!4,shade%)
23040SYS"Wimp_GetIconState",,q%
23050IF shade% THEN q%!8=1<<22 ELSE q%!8=0
23060q%!12=1<<22
23070IF (q%!24 AND q%!12)<>q%!8 THEN SYS"Wimp_SetIconState",,q%
23080ENDPROC
23090
23100DEF FNicontext(!q%,q%!4)
23110SYS"Wimp_GetIconState",,q%
23120IF q%!24AND(1<<8) THEN text$=$(q%!28) ELSE text$=$(q%+28)
23130=text$
23140
23150DEF FNiconval(!q%,q%!4)
23160=VAL(FNicontext(!q%,q%!4))
23170
23180DEF PROCredoicon(!q%,q%!4)
23190SYS"Wimp_GetIconState",,q%
23200SYS"Wimp_ForceRedraw",!q%,q%!8,q%!12,q%!16,q%!20
23210ENDPROC
23220
23230DEF PROCdeleteicon(!q%,q%!4)
23240SYS"Wimp_DeleteIcon",,q%
23250ENDPROC
23260
23270DEF PROCiconinfo(wind%,icon%,data%)
23280!data%=wind%
23290data%!4=icon%
23300SYS"Wimp_GetIconState",,data%
23310ENDPROC
23320
23330DEF FNselected(!q%,q%!4)
23340SYS"Wimp_GetIconState",,q%
23350=(((q%!24)AND(1<<21))>0)
23360
23370DEF FNcricon(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,$(q%+24))
23380SYS"Wimp_CreateIcon",,q% TO icon%
23390=icon%
23400
23410DEF FNbuttype(!q%,q%!4)
23420IF q%!4>=0 THEN SYS"Wimp_GetIconState",,q% ELSE q%!24=0
23430=((q%!24)>>12)AND15
23440
23450DEF PROCselecticon(!q%,q%!4,select%)
23460SYS"Wimp_GetIconState",,q%
23470IF select% THEN q%!8=1<<21 ELSE q%!8=0
23480q%!12=1<<21
23490IF (q%!24 AND q%!12)<>q%!8 THEN SYS"Wimp_SetIconState",,q%
23500ENDPROC
23510
23520DEF FNiconfc(!q%,q%!4)
23530SYS"Wimp_GetIconState",,q%
23540=((q%!24)>>24)AND15
23550
23560DEF PROCseticonfc(!q%,q%!4,col%)
23570SYS"Wimp_GetIconState",,q%
23580q%!8=col%<<24
23590q%!12=15<<24
23600IF (q%!24 AND q%!12)<>q%!8 THEN SYS"Wimp_SetIconState",,q%
23610ENDPROC
23620
23630DEF PROCseticonval(!q%,q%!4,val%)
23640PROCseticontext(!q%,q%!4,STR$(val%))
23650ENDPROC
23660
23670DEF PROCseticontext(!q%,q%!4,text$)
23680SYS"Wimp_GetIconState",,q%
23690text$=LEFT$(text$,q%!36-1)
23700IF $(q%!28)<>text$ THEN
23710$(q%!28)=text$
23720q%!8=0
23730q%!12=0
23740SYS"Wimp_SetIconState",,q%
23750ENDIF
23760ENDPROC
23770
23780DEF PROCseticonvalid(!q%,q%!4,text$)
23790SYS"Wimp_GetIconState",,q%
23800IF $(q%!32)<>text$ THEN
23810$(q%!32)=text$
23820q%!8=0
23830q%!12=0
23840SYS"Wimp_SetIconState",,q%
23850ENDIF
23860ENDPROC
23870
23880DEF PROCsetfileicon(wind%,icon%,filetype%)
23890LOCAL rom%,ram%,sprite$,not%
23900IF filetype%<&1000 THEN
23910sprite$="file_"+RIGHT$("00"+STR$~(filetype%),3)
23920SYS"Wimp_BaseOfSprites" TO rom%,ram%
23930SYS"XOS_SpriteOp",24+256,rom%,sprite$ TO ;not%
23940not%=not%AND1
23950IF not% THEN SYS"XOS_SpriteOp",24+256,ram%,sprite$ TO ;not%
23960not%=not%AND1
23970ELSE
23980CASE filetype% OF
23990 WHEN &1000 : sprite$="directory"
24000 WHEN &2000 : sprite$="application"
24010OTHERWISE
24020 not%=TRUE
24030ENDCASE
24040ENDIF
24050IF not% THEN sprite$="file_xxx"
24060PROCseticonvalid(wind%,icon%,"S"+sprite$)
24070ENDPROC
24080
24090DEF FNicontp(!q%,q%!4)
24100SYS"Wimp_GetIconState",,q%
24110=q%!28
24120
24130DEF PROCstartuserdrag(id%,type%,blk%!24,blk%!28,blk%!32,blk%!36)
24140IF type%>256 THEN
24150 PROCwindowinfo(w%(id%))
24160 blk%!24=blk%!4
24170 blk%!28=blk%!8
24180 blk%!32=blk%!12
24190 blk%!36=blk%!16
24200 type%-=256
24210ENDIF
24220!blk%=0
24230blk%!4=7
24240dragging%=TRUE
24250dragid%=id%
24260drag_type%=type%
24270SYS"Wimp_DragBox",,blk%
24280ENDPROC
24290
24300DEF PROCstartdrag(id%,icon%)
24310dragid%=id%
24320dragicon%=icon%
24330wind%=w%(dragid%)
24340PROCwindowinfo(wind%)
24350PROCiconinfo(wind%,icon%,blk%)
24360!blk%=0
24370blk%!4=5
24380blk%!8+=wx%
24390blk%!12+=wy%
24400blk%!16+=wx%
24410blk%!20+=wy%
24420blk%!24=0
24430blk%!28=0
24440blk%!32=scx%
24450blk%!36=scy%
24460IF drag% THEN
24470PROCiconinfo(wind%,icon%,q%)
24471sprite%=1
24472sprite$=FNicontext(wind%,icon%)
24480IF (q%!24)AND3=3 THEN sprite$=$((q%!32)+1):sprite%=sprites%
24490SYS"DragASprite_Start",197,sprite%,sprite$,blk%+8,blk%+24
24500ELSE
24510SYS"Wimp_DragBox",,blk%
24520ENDIF
24530ENDPROC
24540
24550REM - user interogation -
24560
24570DEF FNcheck(message$)
24580SYS"Wimp_DragBox",,-1
24590!q%=0
24600$(q%+4)=message$
24610SYS"Wimp_ReportError",q%,19,"Message from "+program$ TO ,answer%
24620IF answer%=1 THEN =TRUE ELSE =FALSE
24630
24640DEF PROCreport(message$)
24650d%=FNquestion(message$,"OK","","")
24660ENDPROC
24670
24680DEF FNquestion(ans$(0),ans$(1),ans$(2),ans$(3))
24690LOCAL status%
24700status%=2
24710PROCclosemenu
24720FOR i%=0 TO 3
24730 IF ans$(i%)="" THEN
24740 PROCremoveicon(w%(report%),i%)
24750 ELSE
24760 PROCreiniticon(w%(report%),i%)
24770 PROCseticontext(w%(report%),i%,ans$(i%))
24780 ENDIF
24790NEXT i%
24800PROClosecaret
24810PROCopenincentre(w%(report%))
24820IF beep% THEN VDU 7
24830answer%=0
24840REPEAT
24850 PROCpoll(1)
24860UNTIL answer%
24870PROCclosewindow(w%(report%))
24880=answer%
24890
24900DEF FNclick_report
24910IF icon%>0 THEN answer%=icon%
24920=0
24930
24940REM - misc -
24950
24960DEF PROCquit
24970PROCclose_if_active(address%)
24980PROCclose_if_active(entry%)
24990PROCclose_if_active(letter%)
25000PROCclose_if_active(day%)
25010PROCclose_if_active(year%)
25020PROCclose_if_active(notepad%)
25030IF a_changed% OR s_changed% OR n_changed% OR c_changed% THEN
25040 CASE FNquestion("There is unsaved data.","Save","Quit","Cancel") OF
25050 WHEN 1
25060 PROCsave_changed
25070 exit=TRUE
25080 WHEN 2 : exit=TRUE
25090 ENDCASE
25100ELSE
25110 exit=TRUE
25120ENDIF
25130IF exit=TRUE THEN PROCpoll(0)
25140ENDPROC
25150
25160DEF PROCclosedown
25170PROCresetslot
25180FOR i%=1 TO 255
25190WHILE fonttable%?i%
25200SYS"Font_LoseFont",i%
25210fonttable%?i%-=1
25220ENDWHILE
25230NEXT i%
25240SYS"Wimp_CloseDown",mytask%
25250END
25260ENDPROC
25270
25280DEF FNmodevar(mode%,var%)
25290SYS"OS_ReadModeVariable",mode%,var% TO ,,val%
25300=val%
25310
25320DEF FNstring(b%)
25330LOCAL s$
25340s$=""
25350WHILE ?b%>31
25360s$+=CHR$(?b%)
25370b%+=1
25380ENDWHILE
25390=s$
25400
25410REM - windows -
25420
25430DEF PROCsetwindowextent(wind%,!q%,q%!4,q%!8,q%!12)
25440SYS"Wimp_SetExtent",wind%,q%
25450ENDPROC
25460
25470DEF PROCopenincentre(!blk%)
25480SYS"Wimp_GetWindowState",,blk%
25490m1%=blk%!12-blk%!4
25500m2%=blk%!16-blk%!8
25510blk%!4=(scx%-m1%)>>1
25520blk%!8=(scy%-m2%)>>1
25530blk%!12=(scx%+m1%)>>1
25540blk%!16=(scy%+m2%)>>1
25550blk%!28=-1
25560PROCopenwindow
25570ENDPROC
25580
25590DEF PROCnewtitle(!blk%,title$)
25600SYS"Wimp_GetWindowInfo",,blk%
25610IF $(blk%!76)<>title$ THEN
25620$(blk%!76)=title$
25630IF active%(FNid(!blk%)) THEN
25640 SYS"Wimp_GetWindowOutline",,blk%
25650 SYS"Wimp_ForceRedraw",-1,blk%!4,blk%!16-44,blk%!12,blk%!16
25660ENDIF
25670ENDIF
25680ENDPROC
25690
25700DEF PROCforceredraw(!blk%)
25710SYS"Wimp_GetWindowInfo",,blk%
25720SYS"Wimp_ForceRedraw",!blk%,blk%!44,blk%!48,blk%!52,blk%!56
25730ENDPROC
25740
25750DEF PROCupdatewindow(!blk%)
25760SYS"Wimp_GetWindowInfo",,blk%
25770blk%!4=blk%!44
25780blk%!8=blk%!48
25790blk%!12=blk%!52
25800blk%!16=blk%!56
25810SYS"Wimp_UpdateWindow",,blk% TO more%
25820ENDPROC
25830
25840DEF PROCopenfully(!blk%,top%)
25850SYS"Wimp_GetWindowInfo",,blk%
25860blk%!12=blk%!4+(blk%!52-blk%!44)
25870blk%!8=blk%!16-(blk%!56-blk%!48)
25880IF top% THEN blk%!28=-1
25890PROCopenwindow
25900ENDPROC
25910
25920DEF PROCclosewindow(wind%)
25930LOCAL cid%,close%
25940cid%=FNid(wind%)
25950IF sysflags%(cid%)AND2 THEN close%=EVAL("FNclose_"+id$(cid%)) ELSE close%=TRUE
25960IF close% THEN
25970 active%(cid%)=FALSE
25980 PROCquickclosewindow(w%(cid%))
25990ENDIF
26000ENDPROC
26010
26020DEF PROCclose_if_active(id%)
26030IF active%(id%) THEN PROCclosewindow(w%(id%))
26040ENDPROC
26050
26060DEF PROCquickclosewindow(!q%)
26070SYS"Wimp_CloseWindow",,q%
26080ENDPROC
26090
26100DEF PROCreopen(wind%)
26110id%=FNid(wind%)
26120IF active%(id%) THEN
26130 !blk%=wind%
26140 SYS"Wimp_GetWindowState",,blk%
26150 PROCopenwindow
26160 PROCforceredraw(wind%)
26170ELSE
26180 PROCopenup(wind%)
26190ENDIF
26200ENDPROC
26210
26220DEF PROCwindowinfo(wind%)
26230!blk%=wind%
26240SYS"Wimp_GetWindowInfo",,blk%
26250wx%=blk%!4-blk%!20
26260wy%=blk%!16-blk%!24
26270ww%=blk%!12-blk%!4
26280wh%=blk%!16-blk%!8
26290ENDPROC
26300
26310DEF PROCinitwindords(id%)
26320PROCwindowinfo(w%(id%))
26330wx%(id%)=wx%
26340wy%(id%)=wy%
26350ww%(id%)=ww%
26360wh%(id%)=wh%
26370ENDPROC
26380
26390DEF FNsavebox(filetype%,standard$,flags%)
26400wind%=FNwindow("save","save",0,0)
26410PROCseticontext(w%(wind%),3,"file_"+RIGHT$("00"+STR$~(filetype%),3))
26420PROCseticontext(w%(wind%),1,standard$)
26430PROCseticontext(w%(wind%),2,standard$)
26440misc%(wind%)=filetype%
26450sysflags%(wind%)=flags%
26460=wind%
26470
26480DEF FNlastbit(file$)
26490WHILE INSTR(file$,".")
26500file$=MID$(file$,INSTR(file$,".")+1)
26510ENDWHILE
26520=file$
26530
26540DEF PROCmouseinfo
26550SYS"Wimp_GetPointerInfo",,q%
26560mx%=!q%
26570my%=q%!4
26580but%=q%!8
26590wind%=q%!12
26600icon%=q%!16
26610ENDPROC
26620
26630DEF PROCsetfiletype(file$,filetype%)
26640SYS"OS_File",&12,file$,filetype%
26650ENDPROC
26660
26670DEF PROCshademenu(menu%,item%,shade%)
26680p%=menu%+36+item%*24
26690!p%=!p% ANDNOT(1<<22)
26700IF shade% THEN !p%=!p% OR(1<<22)
26710ENDPROC
26720
26730DEF PROCgetcaret
26740SYS"Wimp_GetCaretPosition",,q%
26750cwind%=!q%
26760cicon%=q%!4
26770cxoff%=q%!8
26780cyoff%=q%!12
26790cheight%=q%!16
26800cindex%=q%!20
26810ENDPROC
26820
26830DEF PROCputcaret(wind%,icon%,index%)
26840len%=LENFNicontext(wind%,icon%)
26850IF index%>len% THEN index%=len%
26860SYS"Wimp_SetCaretPosition",wind%,icon%,,,-1,index%
26870ENDPROC
26880
26890DEF PROCresetcaret(wind%,icon%)
26900SYS"Wimp_GetCaretPosition",,q%
26910IF (!q%=wind% AND (q%!4=icon% OR icon%=-1)) THEN
26920 icon%=q%!4
26930 index%=q%!20
26940 len%=LENFNicontext(wind%,icon%)
26950 IF index%>len% THEN index%=len%
26960 SYS"Wimp_SetCaretPosition",wind%,icon%,,,-1,index%
26970ENDIF
26980IF wind%=0 THEN SYS"Wimp_SetCaretPosition",!q%,q%!4,q%!8,q%!12,q%!16,q%!20
26990ENDPROC
27000
27010DEF PROClosecaret
27020IF mycaret% THEN SYS"Wimp_SetCaretPosition",-1
27030ENDPROC
27040
27050DEF PROCflashicon(!q%,q%!4)
27060FOR f%=1 TO 3
27070WAIT:WAIT
27080PROCselecticon(!q%,q%!4,FALSE)
27090WAIT:WAIT
27100PROCselecticon(!q%,q%!4,TRUE)
27110NEXT f%
27120ENDPROC
27130
27140DEF PROCopeniconmenu(!q%,q%!4,wind%)
27150openmenu%=wind%
27160SYS"Wimp_GetIconState",,q%
27170menux%=q%!16
27180menuy%=q%!20
27190PROCwindowinfo(!q%)
27200menux%+=wx%
27210menuy%+=wy%
27220SYS"Wimp_CreateMenu",,openmenu%,menux%,menuy%
27230menuid%=windows%+1
27240ENDPROC
27250
27260DEF FNinfowindow(i1$,i2$,i3$,i4$)
27270wind%=FNwindow("info","",0,0)
27280PROCseticontext(w%(wind%),1,i1$)
27290PROCseticontext(w%(wind%),2,i2$)
27300PROCseticontext(w%(wind%),3,i3$)
27310PROCseticontext(w%(wind%),4,i4$)
27320=wind%
27330
27340DEF PROCwimpinit(name$,sprite$,work$,no%,isize%)
27350pointermine%=FALSE
27360SYS"OS_GetEnv" TO autoload$
27370autoload$=MID$(autoload$,INSTR(autoload$,CHR$34,INSTR(autoload$,CHR$34)+1)+2)
27380dragging%=0:drag_type%=0:dragid%=0
27390status%=0:mycaret%=FALSE
27400windows%=no%+1
27410program$=name$
27420DIM blk% 10000,q% 256,ind% isize%,deskpal% 256,dgcol% 256,dscale% 16,palblock% 256,palblock2% 256
27430indend%=ind%+isize%
27440DIM messagelist% 100
27450p%=0
27460REPEAT
27470 READ message%
27480 messagelist%!p%=message%
27490 p%+=4
27500UNTIL message%=0
27510DATA 1,2,3,5,6,7,8,9,10,&400C0,&400C1,&400C9,0
27520$blk%="TASK"
27530SYS"Wimp_Initialise",310,!blk%,program$,messagelist% TO ,mytask%
27540iconbar%=FNcricon(-1,0,0,68,68,&2002,sprite$)
27550dir$=FNreadvar(work$+"$Dir")
27560SYS"XOS_SWINumberFromString",,"DragASprite_Start" TO ;drag%
27570drag%=(drag% AND 1)=0
27580SYS"OS_Byte",161,28 TO ,,bit%
27590IF (bit% AND 2)=0 THEN drag%=FALSE
27600SYS"Wimp_SlotSize",-1,-1 TO appsize%
27610PROCloadsprites
27620tft%=&FFF
27630dft%=&AFF
27640sft%=&FF9
27650exit=FALSE
27660DIM gcol% 256,pal2% 80,pal4% 80,scale% 16
27670FOR i%=0 TO 1
27680 pal2%!(4*(1-i%))=(&FFFFFF*i%)<<8
27690NEXT i%
27700FOR i%=0 TO 3
27710 pal4%!(4*(3-i%))=(&555555*i%)<<8
27720NEXT i%
27730PROCnewmode
27740DIM menubuffer% 4000,fonttable% 256
27750twind%=0
27760DIM w%(windows%),menu%(windows%),id$(windows%+1),misc%(windows%),active%(windows%),default%(5,windows%),sysflags%(windows%),wx%(windows%),wy%(windows%),ww%(windows%),wh%(windows%)
27770id$(windows%+1)="unknown"
27780DIM ans$(3)
27790menuptr%=menubuffer%
27800FOR i%=1 TO 255
27810fonttable%?i%=0
27820NEXT i%
27830w%(0)=-2:id$(0)="iconbar"
27840SYS"Wimp_OpenTemplate",,dir$+".Templates"
27850PROCinitwindows
27860report%=FNwindow("report","report",0,0)
27870SYS"Wimp_CloseTemplate"
27880beep%=TRUE
27890instant%=FALSE
27900ENDPROC
27910
27920REM ==== memory management ====
27930
27940DEF FNspace(size%)
27950LOCAL room%,noroom%,new%
27960SYS"XWimp_SlotSize",appsize%+size%,-1 TO new%;noroom%
27970room%=((noroom%AND1)=0)
27980IF new%<appsize%+size% THEN room%=FALSE
27990IF room% THEN appinc%=new%-appsize%
28000=room%
28010
28020DEF PROCinitheap
28030heap%=HIMEM
28040heapsize%=8*1024
28050IF FNspace(heapsize%) THEN
28060 SYS"OS_Heap",0,heap%,,heapsize%
28070ELSE
28080 PROCerror("Out of room.")
28090ENDIF
28100ENDPROC
28110
28120DEF FNlargestblock
28130SYS"OS_Heap",1,heap% TO ,,largest%
28140=largest%
28150
28160DEF FNgetblock(size%)
28170LOCAL ok%
28180ok%=TRUE
28190WHILE ok% AND FNlargestblock<size%
28200 ok%=FNextendheap(8*1024)
28210ENDWHILE
28220IF ok% THEN
28230 SYS"OS_Heap",2,heap%,,size% TO ,,block%
28240ELSE
28250 block%=-1
28260 PROCreport("No room for operation.")
28270ENDIF
28280=block%
28290
28300DEF PROCloseblock(RETURN block%)
28310IF block%>-1 THEN SYS"OS_Heap",3,heap%,block%
28320block%=-1
28330PROCshrinkheap
28340ENDPROC
28350
28360DEF PROCshrinkheap
28370LOCAL ok%,size%
28380ok%=TRUE
28390size%=-1024*8
28400WHILE ok%
28410 SYS"XOS_Heap",5,heap%,,size% TO ;ok%
28420 ok%=((ok%AND1)=0)
28430 IF ok% THEN
28440 heapsize%=heap%!12
28450 ok%=FNspace(heapsize%)
28460 ENDIF
28470ENDWHILE
28480ENDPROC
28490
28500DEF FNextendheap(size%)
28510LOCAL ok%
28520ok%=FNspace(heapsize%+size%)
28530IF ok% THEN
28540 SYS"OS_Heap",5,heap%,,size%
28550 heapsize%=heap%!12
28560ELSE
28570 PROCreport("No room for this operation.")
28580ENDIF
28590=ok%
28600
28610DEF FNextendblock(RETURN block%,inc%)
28620LOCAL ok%, heapfull%
28630heapfull%=FALSE
28640REPEAT
28650 SYS"XOS_Heap",4,heap%,block%,inc% TO ,,block%;ok%
28660 ok%=((ok%AND1)=0)
28670 IF NOTok% THEN heapfull%=NOTFNextendheap(8*1024)
28680UNTIL ok% OR heapfull%
28690=ok%
28700
28710DEF PROCresetslot
28720SYS"Wimp_SlotSize",appsize%,-1
28730appinc%=0
28740ENDPROC
28750
28760REM ==== filing system routines ====
28770
28780DEF FNstandardfilename(wind%)
28790=FNicontext(wind%,1)
28800
28810DEF PROCresetfilename(wind%)
28820PROCseticontext(wind%,2,FNstandardfilename(wind%))
28830ENDPROC
28840
28850DEF PROCsave(id%,file$,prepared%)
28860saved%=FALSE
28870IF FNnameok(file$) THEN
28880IF prepared%=FALSE THEN prepared%=EVAL("FNprepare"+STR$~(misc%(id%)))
28890CASE prepared% OF
28900 WHEN -1
28910 SYS"OS_File",10,file$,misc%(id%),,savebuff%,savebuff%+filesize%
28920 d%=EVAL("FNsaved"+STR$~(misc%(id%)))
28930 WHEN -2
28940 d%=EVAL("FNsave"+STR$~(misc%(id%)))
28950ENDCASE
28960PROCclosemenu
28970PROCseticontext(w%(id%),2,filename$)
28980saved%=TRUE
28990ENDIF
29000ENDIF
29010ENDPROC
29020
29030REM ==== menu routines ====
29040
29050DEF PROCopenwindowasmenu(window%)
29060PROCwindowinfo(window%)
29070PROCmouseinfo
29080IF my%-wh%/2<96 THEN my%=96+wh%/2
29090menux%=mx%-ww%/2
29100menuy%=my%+wh%/2
29110openmenu%=window%
29120id%=FNid(window%)
29130PROCreopenmenu
29140IF sysflags%(id%)AND1 THEN d%=EVAL("FNopen_"+id$(id%))
29150ENDPROC
29160
29170DEF PROCiconbarmenu(text$)
29180menu%(0)=FNmenu(text$)
29190barheight%=items%*44+96
29200ENDPROC
29210
29220DEF PROCmenuselect
29230d%=EVAL("FNmenu_"+id$(menuid%))
29240PROCmouseinfo
29250IF but%=1 THEN PROCreopenmenu
29260ENDPROC
29270
29280DEF PROCreopenmenu
29290IF sysflags%(id%)AND4 THEN d%=EVAL("FNpremenu_"+id$(id%))
29300SYS"Wimp_CreateMenu",,openmenu%,menux%,menuy%
29310ENDPROC
29320
29330DEF PROCopenmenu(id%)
29340IF menu%(id%) THEN
29350menuid%=id%
29360openmenu%=menu%(id%)
29370IF id%=0 THEN menuy%=barheight% ELSE menuy%=my%
29380menux%=mx%-(openmenu%!16)/2-16
29390PROCreopenmenu
29400ENDIF
29410ENDPROC
29420
29430REM ==== window routines ====
29440
29450DEF FNwindow(wind$,name$,menu%,flags%)
29460twind%+=1
29470IF twind%>windows% THEN ERROR 255,"More windows than declared."
29480w%(twind%)=FNloadtemplate(wind$)
29490PROCwindowinfo(w%(twind%))
29500FOR d%=0 TO 5
29510default%(d%,twind%)=!(blk%+(d%<<2)+4)
29520NEXT d%
29530id$(twind%)=name$
29540menu%(twind%)=menu%
29550sysflags%(twind%)=flags%
29560=twind%
29570
29580DEF PROCredraw
29590id%=FNid(!blk%)
29600SYS"Wimp_RedrawWindow",,blk% TO more%
29610PROCrectangleloop
29620ENDPROC
29630
29640DEF PROCrectangleloop
29650wx%=wx%(id%):wy%=wy%(id%):opt0%=FALSE:opt1%=FALSE
29660WHILE more%
29670x0%=blk%!28-wx%
29680y0%=blk%!32-wy%
29690x1%=blk%!36-wx%
29700y1%=blk%!40-wy%
29710d%=EVAL("FNredraw_"+id$(id%))
29720SYS"Wimp_GetRectangle",,blk% TO more%
29730ENDWHILE
29740ENDPROC
29750
29760DEF FNid(find%)
29770found%=0
29780FOR i%=1 TO windows%
29790IF w%(i%)=find% THEN found%=i%
29800NEXT i%
29810=found%
29820
29830DEF PROCopenup(wind%)
29840!blk%=wind%
29850id%=FNid(wind%)
29860IF NOTactive%(id%) THEN
29870FOR d%=0 TO 5
29880!(blk%+(d%<<2)+4)=default%(d%,id%)
29890NEXT d%
29900ELSE
29910SYS"Wimp_GetWindowState",,blk%
29920ENDIF
29930blk%!28=-1
29940PROCopenwindow
29950ENDPROC
29960
29970DEF PROCopenwindow
29980LOCAL open_id%
29990open_id%=FNid(!blk%)
30000IF sysflags%(open_id%)AND16 THEN d%=EVAL("FNpreopen_"+id$(open_id%))
30010SYS"Wimp_OpenWindow",,blk%
30020wx%(open_id%)=blk%!4-blk%!20
30030wy%(open_id%)=blk%!16-blk%!24
30040ww%(open_id%)=blk%!12-blk%!4
30050wh%(open_id%)=blk%!16-blk%!8
30060IF sysflags%(open_id%)AND1 THEN d%=EVAL("FNopen_"+id$(open_id%))
30070active%(open_id%)=TRUE
30080ENDPROC
30090
30100DEF FNopen(!q%)
30110LOCAL open%
30120open%=FALSE
30130SYS"Wimp_GetWindowState",,q%
30140IF q%!32AND(1<<16) THEN open%=TRUE
30150=open%
30160
30170DEF PROCwindow_state(!blk%)
30180SYS"Wimp_GetWindowState",,blk%
30190ENDPROC
30200
30210DEF PROCredobox(wind%,x0%,y0%,x1%,y1%)
30220IF x1%<x0% THEN SWAP x0%,x1%
30230IF y1%<y0% THEN SWAP y0%,y1%
30240SYS"Wimp_ForceRedraw",wind%,x0%,y0%,x1%,y1%
30250ENDPROC
30260
30270DEF PROCinstantredobox(wind%,x0%,y0%,x1%,y1%)
30280IF x1%<x0% THEN SWAP x0%,x1%
30290IF y1%<y0% THEN SWAP y0%,y1%
30300id%=FNid(wind%)
30310!blk%=w%(id%)
30320blk%!4=x0%
30330blk%!8=y0%
30340blk%!12=x1%
30350blk%!16=y1%
30360SYS"Wimp_UpdateWindow",,blk% TO more%
30370instant%=TRUE
30380PROCrectangleloop
30390instant%=FALSE
30400ENDPROC
30410
30420DEF PROCstartupdatewindow(wind%,x0%,y0%,x1%,y1%)
30430!blk%=wind%
30440blk%!4=x0%
30450blk%!8=y0%
30460blk%!12=x1%
30470blk%!16=y1%
30480SYS"Wimp_UpdateWindow",,blk% TO more%
30490ENDPROC
30500
30510DEF PROCstartupdatewindowblock(wind%,x0%,y0%,x1%,y1%)
30520!blk%=wind%
30530IF x0%>x1% THEN SWAP x0%,x1%
30540IF y0%>y1% THEN SWAP y0%,y1%
30550blk%!4=x0%-4
30560blk%!8=y0%-4
30570blk%!12=x1%+4
30580blk%!16=y1%+4
30590SYS"Wimp_UpdateWindow",,blk% TO more%
30600ENDPROC
30610
30620DEF PROCdeletewindow(RETURN !q%)
30630SYS"Wimp_DeleteWindow",,q%
30640!q%=0
30650ENDPROC
30660
30670REM ==== icon routines ====
30680
30690DEF PROCclick(mx%,my%,but%,wind%,icon%)
30700IF FNbuttype(wind%,icon%)=9 THEN PROCflashicon(wind%,icon%)
30710id%=FNid(wind%)
30720CASE but% OF
30730WHEN 64
30740 CASE FNbuttype(w%(id%),icon%) OF
30750 WHEN 6,7,8,10,14 : PROCstartdrag(id%,icon%)
30760 ENDCASE
30770WHEN 2 : PROCopenmenu(id%)
30780OTHERWISE
30790d%=EVAL("FNclick_"+id$(id%))
30800ENDCASE
30810ENDPROC
30820
30830DEF PROCenddrag
30840dragging%=FALSE
30850drag_type%=0
30860SYS"Wimp_DragBox",,-1
30870PROCmouseinfo
30880IF drag% THEN SYS"DragASprite_Stop"
30890d%=EVAL("FNdrop_"+id$(dragid%))
30900dragid%=0
30910ENDPROC
30920
30930DEF PROCstartdragbox(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28,q%!32,q%!36)
30940SYS"Wimp_DragBox",,q%
30950ENDPROC
30960
30970DEF PROCsetpointer(ptr$,ox%,oy%)
30980SYS"Wimp_SpriteOp",36,1,ptr$,2,ox%,oy%,0,0
30990IF ptr$<>"ptr_default" THEN pointermine%=TRUE ELSE pointermine%=FALSE
31000ENDPROC
31010
31020DEF PROCkey(wind%,icon%,index%,key%)
31030taken=EVAL("FNkey_"+id$(FNid(wind%)))
31040IF taken=FALSE THEN SYS"Wimp_ProcessKey",key%
31050ENDPROC
31060
31070DEF FNincicon(iicon%,dec%,inc%,lb%,ub%)
31080change%=FALSE
31090IF icon%=dec% OR icon%=inc% THEN
31100val%=VALFNicontext(wind%,iicon%)
31110val%+=(icon%=dec%)*2+1
31120IF val%>ub% THEN val%=ub% ELSE IF val%<lb% THEN val%=lb%
31130PROCseticontext(wind%,iicon%,STR$(val%))
31140PROCresetcaret(wind%,iicon%)
31150change%=TRUE
31160ENDIF
31170ENDIF
31180=change%
31190
31200DEF PROCremoveicon(!q%,q%!4)
31210q%!8=(1<<24)
31220q%!12=(1<<2)OR(1<<5)OR(15<<24)OR(15<<12)
31230SYS"Wimp_SetIconState",,q%
31240ENDPROC
31250
31260DEF PROCreiniticon(!q%,q%!4)
31270q%!8=(1<<2)OR(1<<5)OR(7<<24)OR(3<<12)
31280q%!12=(1<<2)OR(1<<5)OR(15<<12)OR(15<<24)
31290SYS"Wimp_SetIconState",,q%
31300ENDPROC
31310
31320DEF FNiconkeys(data%)
31330taken=TRUE
31340icons%=0
31350WHILE data%?icons%<255
31360 icons%+=1
31370ENDWHILE
31380icons%-=1
31390found%=-1
31400FOR p%=0 TO icons%
31410 IF data%?p%=icon% THEN found%=p%
31420NEXT p%
31430newicon%=-1
31440IF found%>=0 THEN
31450 CASE key% OF
31460 WHEN 13 : newicon%=found%+1
31470 WHEN &18E : IF found%<icons% THEN newicon%=found%+1
31480 WHEN &18F : IF found%>0 THEN newicon%=found%-1
31490 WHEN &19E,&1AE,&1BE : newicon%=icons%
31500 WHEN &19F,&1AF,&1BF : newicon%=0
31510 OTHERWISE
31520 taken=FALSE
31530 ENDCASE
31540ENDIF
31550IF newicon%>icons% THEN taken=-2:newicon%=-1
31560IF newicon%>=0 THEN
31570 PROCgetcaret
31580 PROCputcaret(wind%,data%?newicon%,cindex%)
31590ENDIF
31600=taken
31610
31620REM ==== and the rest ====
31630
31640DEF FNclick_=0
31650
31660DEF FNredraw_=0
31670
31680DEF FNkey_=0
31690
31700DEF FNdrop_=0
31710
31720DEF PROCerror(error$)
31730SYS"Hourglass_Smash"
31740CASE status% OF
31750 WHEN 1
31760 IF print THEN CLOSE#print
31770 report$="Print error, print cancelled"
31780OTHERWISE
31790 report$="An uncontrolable error has occured ("+error$+STR$(ERL)+"), shall I exit?"
31800ENDCASE
31810exit=FNcheck(report$)
31820status%=0
31830ENDPROC
31840
31850DEF FNwpal(mode%)
31860CASE FNmodevar(mode%,3) OF
31870 WHEN 63:p%=0
31880 WHEN 15:p%=deskpal%
31890 WHEN 3:p%=pal4%
31900 WHEN 1:p%=pal2%
31910ENDCASE
31920=p%
31930
31940DEF FNdrop_save
31950filetype%=misc%(dragid%)
31960id%=dragid%
31970prepared%=EVAL("FNprepare"+STR$~(filetype%))
31980IF prepared% THEN PROCdropfile(FNicontext(w%(dragid%),2),filetype%,filesize%)
31990=0
32000
32010DEF FNclick_save
32020IF icon%=0 THEN PROCsave(id%,FNicontext(wind%,2),FALSE)
32030=0
32040
32050DEF FNkey_save
32060IF key%=13 THEN PROCsave(id%,FNicontext(wind%,2),FALSE):=TRUE
32070=0
32080
32090DEF FNspritename(sprite%,number%)
32100SYS"OS_SpriteOp",13+256,sprite%,q%,256,number% TO ,,,len%
32110q%?len%=13
32120=$q%
32130
32140DEF PROCload(file$,filetype%)
32150ok%=FNfileokay(filetype%)
32160IF ok% THEN ok%=FNfileexist(file$)
32170IF ok% THEN
32180 PROCreply(18,4)
32190 PROCdo_load
32200ENDIF
32210ENDPROC
32220
32230DEF FNreadvar($q%)
32240SYS"OS_ReadVarVal",q%,blk%,256,0,3 TO ,,len%
32250blk%?len%=13
32260=$blk%
� > <BigBook$Dir>.!RunImage
�initiate
� � �error(�$)
(
2next_time%=0
<ȕ �exit
F' null%=dragging%�(insptr%<inslen%)
P � alarm_set% �
Z �pollidle(0,next_time%)
d, ș"OS_ReadMonotonicTime" � new_time%
n! � new_time%>=next_time% �
xM � �this_time>=c_time%(alarm_set%) � �alarm(alarm_set%,this_date%,1)
�# next_time%=new_time%+1000
� �
� �
� �poll(1+null%)
� �
��
��closedown
�
�� �initiate
�6�wimpinit("Big Book","!bigbook","BigBook",19,6000)
��init_s
��init_n
��init_c
�init_a
�init_l
�init_m
"
�c_alarms
,�
6
@
� �init_m
J� mp$(5,20)
T�
^
h
� �init_s
rs_file$=dir$+".Settings"
|� �fileexist(s_file$) �
� in_file=�(s_file$)
� �#in_file,weekends
� �#in_file,today
� �#in_file,fonts
� �#in_file,beep
� �#in_file,birthday
� �#in_file,other$
� �#in_file
��
� weekends=�
�
today=�
�
fonts=�
� beep=�
birthday=7
other$="Other"
�
&s_changed%=�
0�
:
D
� �save_s
Nout_file=�(s_file$)
X�#out_file,weekends
b�#out_file,today
l�#out_file,fonts
v�#out_file,beep
��#out_file,birthday
��#out_file,other$
��#out_file
�s_changed%=�
��
�
�
� �init_n
� �iconinfo(w%(notepad%),9,q%)
�n_s0%=q%!8+4
�n_s1%=q%!16-q%!8-8
�n_si%=10
�$�iconinfo(w%(notepad%),n_si%,q%)
�n_s2%=q%!12
n_s3%=q%!20
n_sf%=q%!24
max_n%=64
$� note$(max_n%,5),n_num%(max_n%)
*n_file$=dir$+".Notes"
4� �fileexist(n_file$) �
> in_file=�(n_file$)
H �#in_file,notes%
R �#in_file,last_n%
\ � note%=1 � notes%
f � i%=0 � 5
p# �#in_file,note$(note%,i%)
z � i%
� �#in_file,n_num%(note%)
�
� note%
� �#in_file
��
� notes%=1
� last_n%=1
� n_num%(notes%)=last_n%
��
�this_note%=-1
�n_changed%=�
��
�
�
� �save_n
out_file=�(n_file$)
�#out_file,notes%
�#out_file,last_n%
$� note%=1 � notes%
. � i%=0 � 5
8" �#out_file,note$(note%,i%)
B
� i%
L �#out_file,n_num%(note%)
V� note%
`�#out_file
jn_changed%=�
t�
~
�
� �init_c
� !q%=1
�ș"OS_Word",14,q%
�this_year%=�(�~(?q%))
�this_month%=�(�~(q%?1))
�this_date%=�(�~(q%?2))
�9� month$(12),ml%(12),day$(6),sd%(12),mo%(12),mml%(12)
�}month$()="","January","February","March","April","May","June","July","August","September","October","November","December"
�/ml%()=0,31,28,31,30,31,30,31,31,30,31,30,31
�� m%=2 � 12
�% mo%(m%)=(mo%(m%-1)+ml%(m%-1))�7
�� m%
4day$()="Sun","Mon","Tue","Wed","Thu","Fri","Sat"
� m%=0 � 12
month%=m%+this_month%-1
c_year%=this_year%
( � month%<1 �
2 c_year%-=1
< month%+=12
F �
P � month%>12 �
Z c_year%+=1
d month%-=12
n �
x$ sd%(m%)=�day(1,month%,c_year%)
� mml%(m%)=ml%(month%)
�, � c_year%�4=0 � month%=2 � mml%(m%)=29
�� m%
�Ac_width%=350:c_height%=40:border%=32:m_height%=40:d_width%=80
�;p_x0%=-(border%+d_width%):p_y0%=-(c_height%*37+border%)
�5p_x1%=c_width%*13+border%:p_y1%=border%+m_height%
�7�setwindowextent(w%(year%),p_x0%,p_y0%,p_x1%,p_y1%)
�C�setwindowextent(w%(c_horz%),p_x0%,p_y1%-m_height%,p_x1%,p_y1%)
�B�setwindowextent(w%(c_vert%),p_x0%,p_y0%,p_x0%+d_width%,p_y1%)
�c_max%=300
�&� c_first%(12,31),c_colour%(12,31)
�X� c_entry$(c_max%),c_type%(c_max%),c_time%(c_max%),c_next%(c_max%),c_link%(1,c_max%)
�c_first%()=-1
c_last%=0
� d_icon% 40
!�iconinfo(w%(day%),0,d_icon%)
"d_icon%+=8
,�deleteicon(w%(day%),0)
6"d_height%=d_icon%!12-d_icon%!4
@d_date%=-1:d_month%=-1
J� l_icon%(1)
T� i%=0 � 1
^
� d% 40
h! �iconinfo(w%(day%),i%+1,d%)
r l_icon%(i%)=d%+8
| �deleteicon(w%(day%),i%+1)
�� i%
�� e_icon%(7),e_icon$(7)
�!e_icon%()=4,1,2,3,10,11,12,15
�Je_icon$()="none","birthday","todo","alarm","red","blue","green","gold"
�� b_col%(15)
�� i%=0 � 15
�) b_col%(i%)=�iconfc(w%(colours%),i%)
�� i%
�in_file=�(dir$+".Colours")
�� i%=0 � 15
�2 �seticontext(w%(colours%),i%,��#in_file,12))
�� i%
�
�#in_file
�load_c
"a_date%=1:a_month%=0:a_next%=0
alarm_set%=0
&"� trans% 16,rect% 16,plotat% 8
0�
:
D
� �init_l
N!� l_list%(max_a%), l_icon% 40
X$�iconinfo(w%(letter%),1,l_icon%)
bl_icon%+=8
ll_y0%=l_icon%!4
vl_y1%=l_icon%!12-l_icon%!4
��deleteicon(w%(letter%),1)
�letters%=-1
�l_selected%=-1
��calc_l
��
�
�
� �init_a
�!�iconinfo(w%(address%),17,q%)
�a_s0%=q%!8+4
�a_s1%=q%!16-q%!8-8
�a_si%=18
�$�iconinfo(w%(address%),a_si%,q%)
�a_s2%=q%!12
a_s3%=q%!20
a_sf%=q%!24
max_a%=256
@name=0:address=1:phone=6:other=7:dob=8:sent=9:rec=10:file=11
*|� a$(max_a%,11), flag%(max_a%), type%(max_a%), a_num%(max_a%), icon%(8), a%(26), g%(max_a%), temp$(max_a%), ind%(max_a%)
4 icon%()=0,2,3,4,5,6,12,13,14
>�load_a
Hthis_name%=1
R8� index_menu% 1024, sub_block% 2048, sub_index% 2048
\,�seticontext(w%(address%),10,other$+":")
f� col_tone%(2),row_tone%(3)
pcol_tone%()=160,167,174
zrow_tone%()=122,130,136,142
�&inslen%=0:insptr%=0:� insdata% 400
��
�
�� �initwindows
�`info%=�infowindow("Big Book","Diary, Address book,...","Barry Wickett","1.20 (17-Dec-1994)")
�'entry%=�window("day","entry",0,%10)
�Brecord%=�window("record","record",�menu("File Link,Unlink"),0)
�� other% 14
�2othermenu%=�menu(" Enter date ,14!,,other%")
�?recordmenu%=�menu("Date,Today,Yesterday,Other>,othermenu%")
�*insert%=�window("insert","insert",0,0)
�Lspecial%=�menu("Specials,Insert at Caret>,w%(insert%),Mark up birthday")
�}address%=�window("addresses","address",�menu("Addresses,Add,Delete,Search,Sort-,Save-,Specials>,special%,Print..."),%110)
Dletter%=�window("letters","letter",�menu("Letters,Print..."),%1)
-colours%=�window("colours","colours",0,0)
Yday%=�window("days","day",�menu("Day,Colours>,w%(colours%),Add entry,Print..."),%100)
$)alarm%=�window("alarm","alarm",0,%10)
.'print%=�window("print","print",0,0)
8Vyear%=�window("years","year",�menu("Book of Days,Print>-,w%(print%),Save"),%10011)
B2birthday%=�window("birthday","birthday",0,%10)
LNsavemenu%=�menu("Save,Days,Addresses,Letters,Notes,Settings-,All changes")
VYmenu%=�window("menu","menu",�menu("Big Book,Info>,w%(info%),Save>,savemenu%,Quit"),0)
`)c_horz%=�window("blank","c_horz",0,0)
j)c_vert%=�window("blank","c_vert",0,0)
t/settings%=�window("system","settings",0,%1)
~-notepad%=�window("notes","notepad",0,%10)
�*search%=�window("search","search",0,0)
�'multi%=�window("multi","multi",0,0)
�1�iconbarmenu("Big Book,Info>,w%(info%),Quit")
��
�
�� �save_changed
�� c_changed% � �save_c
�� a_changed% � �save_a
�� n_changed% � �save_n
�� s_changed% � �save_s
��
�
� �menu_iconbar
� !blk%=1 � �quit
=0
(� �click_iconbar
2�openup(w%(menu%))
<=0
F
P� �menu_menu
ZȎ !blk% �
d � 1
n Ȏ blk%!4 �
x � 0 : �save_c
� � 1,2 : �save_a
� � 3 : �save_n
� � 4 : �save_s
� � 5 : �save_changed
� �
� � 2 : �quit
��
�=0
�
�� �click_menu
�Ȏ icon% �
�" � 1 : �openup(w%(settings%))
�C � 3 : � active%(notepad%) � �openup(w%(notepad%)) � �set_n(1)
� 4 : �openup(w%(year%))
C � 5 : � active%(address%) � �openup(w%(address%)) � �set_a(1)
� 6 : �openup(w%(letter%))
"�
,=0
6
@� �open_settings
J� �active%(settings%) �
T, �selecticon(w%(settings%),14,weekends)
^( �selecticon(w%(settings%),2,today)
h( �selecticon(w%(settings%),3,fonts)
r' �selecticon(w%(settings%),4,beep)
|+ �seticonval(w%(settings%),8,birthday)
�+ �seticontext(w%(settings%),12,other$)
��
�=0
�
�� �click_settings
�Ȏ icon% �
�
� 16
� �new_settings
�# �closewindow(w%(settings%))
�( � 15 : �closewindow(w%(settings%))
�
� 17
� �new_settings
� �save_s
# �closewindow(w%(settings%))
$ � 5,6 : d%=�incicon(8,5,6,1,9)
&�
0=0
:
D� �close_birthday
N$�quickclosewindow(w%(birthday%))
Xactive%(birthday%)=�
b � b_checking% � �c_birthdays
l=0
v
�� �close_alarm
�!�quickclosewindow(w%(alarm%))
�active%(alarm%)=�
�� a_checking% � �c_alarms
�=0
�
�� �click_alarm
�=0
�
�� �click_colours
�Ȏ icon% �
�? � 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 : c_chosen%=icon%
� � 16 : �closemenu
� 17
- c_colour%(d_month%,d_date%)=c_chosen%
! �redo_c(d_month%,d_date%)
�closemenu
*�
4=0
>
H� �menu_record
R� !blk%=0 �
\ a$(l_selected%,file)=""
f type%(l_selected%)=-1
p �set_l_data
z�
�=0
�
�� �click_record
�Ȏ icon% �
� � 4
�" file$=a$(l_selected%,file)
� �fileinfo(file$)
� � exist% �
� �mouseinfo
� blk%!12=0
� blk%!16=5
� blk%!20=wind%
� blk%!24=icon%
blk%!28=mx%
blk%!32=my%
blk%!36=filesize%
$$ blk%!40=type%(l_selected%)
. $(blk%+44)=file$+�0
8 !blk%=(�file$+48)��3
B( ș"Wimp_SendMessage",18,blk%,0
L �
V+ �report("Letter file not found.")
` �
j � 5,6
t r_which%=6-icon%
~+ $other%=�icontext(wind%,r_which%+2)
�. �openiconmenu(wind%,icon%,recordmenu%)
�
� 10
� �set_a(l_selected%)
� �openup(w%(address%))
�& � 11 : �closewindow(w%(record%))
��
�=0
�
�� �key_search
�� key%=13 � �search(0,1)
�=0
�
� �click_search
:� search_type%=1 � this%=this_note% � this%=this_name%
Ȏ icon% �
� 2 : �search(0,1)
( � 3 : �search(this%,1)
2 � 4 : �search(this%,-1)
<% � 5 : �closewindow(w%(search%))
F�
P=0
Z
d� �drop_notepad
n=0
x
�� �close_notepad
��get_n_data
�=�
�
�� �click_notepad
�Ȏ icon% �
� � 7 : �inc_n(-1)
� � 8 : �inc_n(1)
� � n_si% : �drag_n
� � 11 : �add_n
� � 12 : �delete_n
� � 13 : �open_search(1)
�# � 14 : �start_multi(notepad%)
�
=0
"� �key_notepad
,� key%>=32 � key%<=255 �
6 st$=�icontext(wind%,icon%)
@ � key%=127 �
J � index%>0 �
T+ st$=�st$,index%-1)+�st$,index%+1)
^' �seticontext(wind%,icon%,st$)
h �
r �
|/ st$=�st$,index%)+�(key%)+�st$,index%+1)
� index%+=1
� rem$=""
� first%=�
� �
�* � rem$<>"" � st$<>"" � rem$+=" "
� st$=rem$+st$
� rem$=""
� � �st$>30 �
� p%=30
�
�
�/ � �st$,p%,1)=" " � p%=-p% � p%-=1
� � p%<=0
� � p%=0 �
rem$=�st$,31)
st$=�st$,30)
�
& p%=-p%
0 rem$=�st$,p%+1)
: st$=�st$,p%-1)
D
�
N �
X' �seticontext(wind%,icon%,st$)
b � first% �
l � index%<=�st$ �
v cicon%=icon%
� cindex%=index%
�
�
� cicon%=icon%+1
�# cindex%=index%-�st$-1
�
�
� first%=�
� �
� icon%+=1
�1 � icon%<=6 � st$=�icontext(wind%,icon%)
� � rem$="" � icon%>6
� � cicon%=7 �
� �add_n
�$ �seticontext(wind%,1,rem$)
cicon%=1
�
' �putcaret(wind%,cicon%,cindex%)
�
*�
4� key%=13 � �add_n
>=0
H
R� �key_address
\� key%=13 � �add_a
f=0
p
z� �click_address
�Ȏ icon% �
� � 16 : �inc_a(-1)
� � 19 : �inc_a(1)
� � a_si% : �drag_a
� � 24 : �letter_a
� � 20 : �a_index
�" � 25 : �l_select(this_name%)
�. � 26 : �dial(�icontext(w%(address%),12))
��
�=0
�
�� �premenu_address
�&�seticontext(w%(insert%),5,other$)
=0
� �menu_address
$Ȏ !blk% �
. � 0 : �add_a
8 � 1 : �delete_a
B � 2 : �open_search(2)
L � 3 : � names%>1 � �sort_a
V � 4 : �save_a
`' � 5 : � blk%!4=1 � �mark_birthday
j" � 6 : �start_multi(address%)
t�
~=0
�
�� �close_address
��get_a_data
�=�
�
�� �drop_address
�=0
�
�� �key_entry
�� key%=13 �
� �get_e
� �closewindow(w%(entry%))
�
=0
� �close_entry
(
�get_e
2=�
<
F� �click_entry
PȎ icon% �
Z8 � 1,2,3,4,10,11,12,15 : �selecticon(wind%,icon%,�)
d
� 13
n �get_e
x �closewindow(w%(entry%))
� � 5,6,8,9
� h%=e_time%�60
� m%=e_time%�60
� Ȏ icon% �
� � 5 : h%-=1
� � 6 : h%+=1
� � 9 : m%-=1
� � 8 : m%+=1
� �
�' � h%>23 � h%=0 � � h%<0 � h%=23
�' � m%<0 � m%=59 � � m%>59 � m%=0
� �set_e_time(h%*60+m%)
�% � 16 : �startdrag(entry%,icon%)
� 17
temp_entry%=this_entry%
�set_e(-1)
"/ �remove_e(d_month%,d_date%,temp_entry%)
, �calc_d
6
� 18,19
@' c_link%(icon%-18,this_entry%)=0
J �forceredraw(w%(day%))
T�
^=0
h
r� �drop_entry
|Ȏ wind% �
� � w%(notepad%)
�1 c_link%(1,this_entry%)=n_num%(this_note%)
� c_changed%=�
� �forceredraw(w%(day%))
� � w%(address%)
�1 c_link%(0,this_entry%)=a_num%(this_name%)
� c_changed%=�
� �forceredraw(w%(day%))
��
�=0
�
�� �click_insert
�Ȏ icon% �
� 7 : �insert
� 8 : �closemenu
�
&=0
0
:� �start_multi(w0%)
Dmp$()=""
N� i%=3 � 8
X' �seticonvalid(w%(multi%),i%,"Sp")
b� i%
l�set_multi(w0%,3)
v�openup(w%(multi%))
��
�
�� �click_multi
�Ȏ icon% �
�$ � 1 : �closewindow(w%(multi%))
� � 2 : �print_multi
��
�=0
�
�� �print_multi
� ș "XPDriver_Info" � ;flags%
�>� flags% � 1 � �report("Printer manager not installed."):�
�ș"Hourglass_On"
pf%=�("printer:")
'ș"PDriver_SelectJob",pf%,"Planner"
� �
M� � �:� �:ș "PDriver_AbortJob",pf%:�#pf%:ș"Hourglass_Off":�report(�$):�
*-ș"PDriver_PageSize" � ,w%,h%,l%,b%,r%,t%
4!rect%=0:rect%!4=0
>rect%!8=1420:rect%!12=1820
H!trans%=1<<16:trans%!4=0
Rtrans%!8=0:trans%!12=1<<16
\!plotat%=l%:plotat%!4=b%
f>ș"PDriver_GiveRectangle",0,rect%,trans%,plotat%,&FFFFFF00
p+ș"PDriver_DrawPage",1,blk%,0,0 � more%
zȕ more%
�C ș"Font_FindFont",,"Trinity.Medium",12*16,12*16,0,0 � handle%
�? ș"Font_FindFont",,"Trinity.Bold",12*16,12*16,0,0 � bold%
� ș"Font_SetFont",handle%
�4 ș"ColourTrans_SetFontColours",0,&FFFFFF00,0,6
� � i%=0 � 5
� x0%=(i%�2)*700+20
� y0%=1820-(i%�2)*600
� � l%=0 � 20
� � mp$(i%,l%)<>"" �
�" � �mp$(i%,l%),1)="!" �
�$ ș"Font_SetFont",bold%
�6 �fancy(�mp$(i%,l%),2),x0%,y0%-(l%+1)*32)
�& ș"Font_SetFont",handle%
�
2 �fancy(mp$(i%,l%),x0%,y0%-(l%+1)*32)
�
$ �
. � l%
8
� i%
B, ș"PDriver_GetRectangle",,blk% � more%
L ș"Font_LoseFont",handle%
V ș"Font_LoseFont",bold%
`�
jș"PDriver_EndJob",pf%
t� �
~ �#pf%
�ș"Hourglass_Off"
��closewindow(w%(multi%))
��
�
�� �fancy(st$,x%,y%)
�
� tab%
�tab%=�st$,�9)
�� tab%=0 �
�& ș"Font_Paint",,st$,%10100,x%,y%
��
�+ � tab%>1 � �fancy(�st$,tab%-1),x%,y%)
�# �fancy(�st$,tab%+1),x%+80,y%)
�
� �drop_multi
$�set_multi(�id(wind%),dragicon%)
(=0
2
<� �set_multi(w%,i%)
Ficon$=""
P� l%=0 � 20
Z mp$(i%-3,l%)=""
d� l%
nȎ w% �
x � address%
� icon$="paddress"
� � type=name � dob
�1 mp$(i%-3,type-name)=a$(this_name%,type)
� � type
�# mp$(i%-3,0)="!"+mp$(i%-3,0)
� � day%
� icon$="pdays"
� p%=1
� mp$(i%-3,0)="!"+t_date$
�( next%=c_first%(d_month%,d_date%)
� ȕ next%<>-1 � p%<=20
�J � c_type%(next%)�256 � time$=�time(c_time%(next%))+�9 � time$=""
�, mp$(i%-3,p%)=time$+c_entry$(next%)
next%=c_next%(next%)
p%+=1
�
" � notepad%
, icon$="pnotepad"
6 � i2%=0 � 5
@5 mp$(i%-3,i2%)=�icontext(w%(notepad%),i2%+1)
J
� i2%
T � letter%
^ icon$="pletters"
h t$=�9+�9+�9+�9+�9
r@ mp$(i%-3,0)="!Name"+t$+"Last Sent"+�9+�9+"Last Received"
| � letters% �
� � l%=1 � letters%
� name%=l_list%(l%)
�M mp$(i%-3,l%)=a$(name%,name)+t$+a$(name%,sent)+�9+�9+a$(name%,rec)
� � l%
� �
�
� icon$="p"
��
�*�seticonvalid(w%(multi%),i%,"S"+icon$)
�/� icon$="p" � �report("Cannot print this.")
��
�
�� �click_print
Ȏ icon% �
� 4 : �closemenu
� 5 : �print_year
&�
0=0
:
D� �preopen_year
N� active%(year%) �
X !q%=w%(c_horz%)
b! ș"Wimp_GetWindowState",,q%
l+ � q%!28=blk%!28 � blk%!28=w%(c_vert%)
v�
�=0
�
�� �open_year
�9� active%(year%)=� � today=� � �new_day(this_date%,1)
��window_state(w%(year%))
�!blk%=w%(c_horz%)
�blk%!8=blk%!16-m_height%
�
blk%!24=0
��openwindow
��window_state(w%(year%))
�!blk%=w%(c_vert%)
�blk%!12=blk%!4+d_width%
�blk%!16=blk%!16
blk%!20=0
blk%!28=w%(c_horz%)
�openwindow
=0
*
4� �close_year
>�closewindow(w%(c_horz%))
H�closewindow(w%(c_vert%))
R=�
\
f� �menu_year
pȎ !blk% �
z � 1 : �save_c
��
�=0
�
�� �click_year
�mx%-=wx%(year%)
�my%-=wy%(year%)
�m%=mx%�c_width%
�� m%>=0 � m%<=12 �
�% d%=((-my%)�c_height%)-sd%(m%)+1
�. � d%>=1 � d%<=mml%(m%) � �new_day(d%,m%)
��
�=0
�
� �redraw_year
font_col%=-1
� fonts �
$C ș"Font_FindFont",,"Trinity.Medium",12*16,12*16,0,0 � handle%
. ș"Font_SetFont",handle%
8�
Bm0%=x0%�c_width%
Lm1%=x1%�c_width%
Vd1%=(-y0%)�c_height%
`d0%=(-y1%)�c_height%
j� m%=m0% � m1%
t � m%>=0 � m%<=12 �
~) month%=((m%+this_month%+10)�12)+1
� x_pos%=wx%+m%*c_width%
� � d%=d0% � d1%
�/ � d%>=sd%(m%) � d%<sd%(m%)+mml%(m%) �
�# y_pos%=wy%-d%*c_height%
� date%=d%-sd%(m%)+1
� � opt1% �
� f_col%=0
�
�
�( f_col%=c_colour%(m%,date%)
�D � f_col%=0 � weekends=� � (d%�7=0 � d%�7=6) � f_col%=1
�
�
�) � font_col%<>f_col% � fonts �
b ș"ColourTrans_SetFontColours",0,!(deskpal%+f_col%*4),!(deskpal%+b_col%(f_col%)*4),6
font_col%=f_col%
�
� f_col% �
(< ș"ColourTrans_SetGCOL",!(deskpal%+(f_col%*4))
25 ȓ Ȑ x_pos%,y_pos%,c_width%,-c_height%
<
�
F/ ș"ColourTrans_SetGCOL",deskpal%!28
P0 ȓ x_pos%,y_pos%,c_width%,-c_height%
ZL � b_col%(f_col%)=0 � fonts=0 � ș"ColourTrans_SetGCOL",!deskpal%
d. �print(�(date%),x_pos%+8,y_pos%-8)
nz � c_first%(m%,date%)>-1 � opt0%=� � �print(�snip(c_entry$(c_first%(m%,date%)),c_width%-50),x_pos%+46,y_pos%-8)
x �
� � d%
� �
�� m%
�'� fonts � ș"Font_LoseFont",handle%
�=0
�
�� �snip(st$,max%)
�ȕ �string_width(st$)>max%
� st$=�st$,�st$-1)
��
�=st$
�
�� �print(st$,x%,y%)
� fonts �
0 ș"Font_Paint",handle%,st$,%10100,x%,y%-20
�
"
� x%,y%
,
�st$
6�
@�
J
T� �string_width(st$)
^� width%,x0%,x1%
h
� fonts �
r1 ș"Font_StringBBox",handle%,st$ � ,x0%,,x1%
| width%=x1%-x0%
�, ș"Font_ConverttoOS",,width% � ,width%
��
� width%=�st$*16
��
�=width%
�
�� �click_c_horz
�=0
�
�� �redraw_c_horz
�
� fonts �
�C ș"Font_FindFont",,"Trinity.Medium",12*16,12*16,0,0 � handle%
� ș"Font_SetFont",handle%
> ș"ColourTrans_SetFontColours",0,!deskpal%,deskpal%!28,6
�
) ș"ColourTrans_SetGCOL",deskpal%!28
&�
0m0%=x0%�c_width%
:m1%=x1%�c_width%
Dy_pos%=wy%-8+p_y1%
N� m%=m0% � m1%
X � m%>=0 � m%<=12 �
b) month%=((m%+this_month%+10)�12)+1
l` �print(month$(month%),wx%+m%*c_width%+(c_width%-�string_width(month$(month%)))/2,y_pos%)
v �
�� m%
�'� fonts � ș"Font_LoseFont",handle%
�=0
�
�� �click_c_vert
�=0
�
�� �redraw_c_vert
�
� fonts �
�C ș"Font_FindFont",,"Trinity.Medium",12*16,12*16,0,0 � handle%
� ș"Font_SetFont",handle%
�> ș"ColourTrans_SetFontColours",0,!deskpal%,deskpal%!28,6
��
!) ș"ColourTrans_SetGCOL",deskpal%!28
!�
!d1%=(-y0%)�c_height%
! d0%=(-y1%)�c_height%
!*x_pos%=wx%+8+p_x0%
!4� d%=d0% � d1%
!>G � d%>=0 � d%<=36 � �print(day$(d%�7),x_pos%,wy%-(d%*c_height%+8))
!H� d%
!R'� fonts � ș"Font_LoseFont",handle%
!\=0
!f
!p� �premenu_day
!z� i%=0 � 15
!�C �selecticon(w%(colours%),i%,(c_colour%(d_month%,d_date%)=i%))
!�� i%
!�)c_chosen%=c_colour%(d_month%,d_date%)
!�=0
!�
!�� �menu_day
!�Ȏ !blk% �
!� � 1 : �add_e
!� � 2 : �start_multi(day%)
!��
!�=0
!�
!�� �click_day
"mx%-=wx%(day%)
"my%-=wy%(day%)
"$next%=c_first%(d_month%,d_date%)
"$e%=0
".ȕ next%<>-1
"8 �calc_d_ords(e%)
"BG � mx%>!d_icon% � my%>d_icon%!4 � mx%<d_icon%!8 � my%<d_icon%!12 �
"L link%=-1
"V � i%=0 � 1
"`Q � mx%>!l_icon%(i%) � mx%<l_icon%(i%)!8 � c_link%(i%,next%)>0 � link%=i%
"j � i%
"t Ȏ link% �
"~
� 0
"� l_name%=-1
"� � n%=1 � names%
"�8 � a_num%(n%)=c_link%(0,next%) � l_name%=n%
"� � n%
"� � l_name%>0 �
"� �set_a(l_name%)
"�# �openup(w%(address%))
"�
�
"�9 �report("Linked address has been deleted.")
"�
�
"�
� 1
"� l_note%=-1
# � n%=1 � notes%
#
8 � n_num%(n%)=c_link%(1,next%) � l_note%=n%
# � n%
# � l_note%>0 �
#( �set_n(l_note%)
#2# �openup(w%(notepad%))
#<
�
#F6 �report("Linked note has been deleted.")
#P
�
#Z � -1
#d �set_e(next%)
#n �
#x �
#� next%=c_next%(next%)
#� e%+=1
#��
#�=0
#�
#�� �redraw_day
#�$next%=c_first%(d_month%,d_date%)
#�e%=0
#�ȕ next%<>-1
#� �calc_d_ords(e%)
#�G � c_type%(next%)�256 � time$=�time(c_time%(next%))+" " � time$=""
#�) $(d_icon%!20)=time$+c_entry$(next%)
#�3 $(d_icon%!24)="S"+e_icon$(c_type%(next%)�255)
$ ș"Wimp_PlotIcon",,d_icon%
$ � i%=0 � 1
$ � c_link%(i%,next%) �
$"! l_icon%(i%)!4=d_icon%!4
$,# l_icon%(i%)!12=d_icon%!12
$6( ș"Wimp_PlotIcon",,l_icon%(i%)
$@ �
$J
� i%
$T next%=c_next%(next%)
$^ e%+=1
$h�
$r=0
$|
$�� �open_letter
$�� �active%(letter%) �
$�
�calc_l
$� l_selected%=0
$��
$�=0
$�
$�� �redraw_letter
$�� letters% �
$� � l%=1 � letters%
$� �calc_l_ords(l%)
$�, � l_icon%!4<=y1% � l_icon%!12>=y0% �
$� name%=l_list%(l%)
%y $(l_icon%!20)=" "+a$(name%,name)+�32-�a$(name%,name)," ")+a$(name%,sent)+�15-�a$(name%,sent)," ")+a$(name%,rec)
%$ ș"Wimp_PlotIcon",,l_icon%
% �
%&
� l%
%0�
%:=0
%D
%N� �menu_letter
%X%� !blk%=0 � �start_multi(letter%)
%b=0
%l
%v� �click_letter
%�mx%-=wx%(letter%)
%�my%-=wy%(letter%)
%�� letters% �
%� new%=0
%� � l%=1 � letters%
%� �calc_l_ords(l%)
%�^ � !l_icon%<=mx% � l_icon%!4<=my% � l_icon%!8>=mx% � l_icon%!12>=my% � new%=l_list%(l%)
%�
� l%
%� �l_select(new%)
%��
%�=0
%�
%�� �menu_unknown
&Ȏ openmenu% �
& � index_menu%
&J � !blk%>=0 � blk%!4>=0 � �set_a(?(!(sub_index%+40+blk%!4*24)-1)+1)
& � recordmenu%
&* Ȏ !blk% �
&4C � 0 : �new_l_sr(�date(this_date%,this_month%,this_year%))
&>E � 1 : �new_l_sr(�date(this_date%-1,this_month%,this_year%))
&H" � 2 : �new_l_sr($other%)
&R �
&\�
&f=0
&p
&z� �new_l_sr(new$)
&�+� new$<>a$(l_selected%,sent+r_which%) �
&�( a$(l_selected%,sent+r_which%)=new$
&� � l%=1 � letters%
&�# � l_list%(l%)=l_selected% �
&� �calc_l_ords(l%)
&�R ș"Wimp_ForceRedraw",w%(letter%),!l_icon%,l_icon%!4,l_icon%!8,l_icon%!12
&� �
&�
� l%
&� �set_l_data
&� a_changed%=�
&��
&��
&�
'2� �menu_warning(sub_menu%,sub_x%,sub_y%,menu%)
'Ȏ openmenu% �
' � index_menu%
'$+ c%=�($(index_menu%+40+menu%*24))-64
'. ptr%=sub_index%
'8! �menutitle("Select",ptr%)
'B sub%=sub_block%
'L � name%=1 � names%
'V � g%(name%)=c% �
'` ?sub%=name%-1
'j" len%=�(a$(name%,name))
't$ $(sub%+1)=a$(name%,name)
'~ ptr%+=24
'� !ptr%=0
'� ptr%!4=0
'�) ptr%!8=(7<<24) � (%100010001)
'� ptr%!12=sub%+1
'� ptr%!16=-1
'� ptr%!20=len%+1
'�# � len%>max% � max%=len%
'� sub%+=len%+2
'� �
'� � name%
'� �endmenu(ptr%)
'�7 ș"Wimp_CreateSubMenu",,sub_menu%,sub_x%,sub_y%
( �
(
�
(
(� ----Non Wimp routines----
((
(2� �print_year
(< ș "XPDriver_Info" � ;flags%
(F>� flags% � 1 � �report("Printer manager not installed."):�
(Pș"Hourglass_On"
(Zpf%=�("printer:")
(d'ș"PDriver_SelectJob",pf%,"Planner"
(n� �
(xM� � �:� �:ș "PDriver_AbortJob",pf%:�#pf%:ș"Hourglass_Off":�report(�$):�
(�-ș"PDriver_PageSize" � ,w%,h%,l%,b%,r%,t%
(�!opt0%=�selected(w%(print%),2)
(�$opt1%=�(�selected(w%(print%),3))
(�#times%=-�selected(w%(print%),6)
(�wx%=-p_x0%:wy%=-p_y0%
(�!rect%=0:rect%!4=0
(�,rect%!8=p_x1%-p_x0%:rect%!12=p_y1%-p_y0%
(�.!trans%=0:trans%!4=-(1<<15)*(1+times%)*0.8
(�/trans%!8=(1<<15)*(1+times%)*0.8:trans%!12=0
(�� time%=0 � times%
(�3 !plotat%=b%:plotat%!4=t%+(t%-(b%+8000))*time%
(�@ ș"PDriver_GiveRectangle",0,rect%,trans%,plotat%,&FFFFFF00
(�- ș"PDriver_DrawPage",1,blk%,0,0 � more%
) ȕ more%
) x0%=!blk%-wx%
) y0%=blk%!4-wy%
)" x1%=blk%!8-wx%
), y1%=blk%!12-wy%
)6 d%=�redraw_year
)@ d%=�redraw_c_horz
)J d%=�redraw_c_vert
)T. ș"PDriver_GetRectangle",,blk% � more%
)^ �
)h� time%
)rș"PDriver_EndJob",pf%
)|� �
)� �#pf%
)�ș"Hourglass_Off"
)��closemenu
)��
)�
)�
� �insert
)�insptr%=insdata%
)�>� �selected(w%(insert%),2) � �add_ins(a$(this_name%,name))
)� � �selected(w%(insert%),3) �
)� � i%=address � phone-1
)�# �add_ins(a$(this_name%,i%))
)�
� i%
)��
*?� �selected(w%(insert%),4) � �add_ins(a$(this_name%,phone))
*?� �selected(w%(insert%),5) � �add_ins(a$(this_name%,other))
*=� �selected(w%(insert%),6) � �add_ins(a$(this_name%,dob))
*&inslen%=insptr%
*0insptr%=insdata%
*:�closemenu
*Da_changed%=�
*N�
*X
*b� �add_ins(st$)
*l� �st$ �
*v $insptr%=st$
*� insptr%+=�st$+1
*��
*��
*�
*�� �new_settings
*�old%=s_changed%
*� �setting_change(14,weekends)
*��setting_change(2,today)
*��setting_change(3,fonts)
*��setting_change(4,beep)
*�"new%=�iconval(w%(settings%),8)
*�� new%<>birthday �
*� birthday=new%
+ s_changed%=�
+�
+$new$=�icontext(w%(settings%),12)
+ � new$<>other$ �
+* other$=new$
+4 s_changed%=�
+>. �seticontext(w%(address%),10,other$+":")
+H�
+RA� s_changed%<>old% � active%(year%) � �forceredraw(w%(year%))
+\�
+f
+p"� �setting_change(icon%,� val)
+z&new=�selected(w%(settings%),icon%)
+�� new<>val �
+�
val=new
+� s_changed%=�
+��
+��
+�
+�� �c_birthdays
+��
+� b_person%+=1
+� � b_person%>names% �
+� b_person%=0
+� b_days%+=1
+� a_date%+=1
," � a_date%>mml%(a_month%) �
, a_date%=1
, a_month%+=1
,$ �
,. �
,8 � flag%(b_person%)�2 �
,B# st$=a$(b_person%,dob)+"."
,L d%=�next_number(st$)
,V m%=�next_number(st$)
,`k � d%=a_date% � m%=((a_month%+this_month%-2)�12)+1 � �birthday(b_person%,a_date%,a_month%,b_days%)
,j �
,t �
,~+� active%(birthday%) � b_days%>birthday
,�"b_checking%=active%(birthday%)
,��
,�
,�+� �birthday(person%,date%,month%,days%)
,�N�seticontext(w%(birthday%),2,�date(date%,month%+this_month%-1,this_year%))
,�2�seticontext(w%(birthday%),3,a$(person%,name))
,� �openincentre(w%(birthday%))
,��
,�
,�� �next_number(� st$)
,�
� num%
,�
num%=0
- "ȕ �st$,1)>="0" � �st$,1)<="9"
-
num%=�(�st$,1))+num%*10
- st$=�st$,2)
-�
-(st$=�st$,2)
-2 =num%
-<
-F� �c_alarms2
-P"a_next%=c_first%(1,this_date%)
-Zalarm_set%=0
-dȕ a_next%<>-1
-nm � (c_type%(a_next%)�255)=3 � (alarm_set%=0 � c_time%(a_next%)<c_time%(alarm_set%)) � alarm_set%=a_next%
-x a_next%=c_next%(a_next%)
-��
-��
-�
-�� �c_alarms
-�a_checking%=�
-��
-�Q � a_next%=0 � a_next%=c_first%(a_month%,a_date%) � a_next%=c_next%(a_next%)
-� � a_next%=-1 �
-� a_date%+=1
-�" � a_date%>mml%(a_month%) �
-� a_date%=1
-� a_month%+=1
-� �
. a_next%=0
. �
.E � (c_type%(a_next%)�255)=3 � �alarm(a_next%,a_date%,a_month%)
." �
.,9� active%(alarm%) � (a_date%=this_date% � a_month%=1)
.6a_checking%=active%(alarm%)
.@� a_checking%=� �
.J �c_alarms2
.T b_person%=0
.^ b_days%=0
.h �c_birthdays
.r�
.|�
.�
.�� �alarm(pos%,date%,month%)
.��dial("999999")
.�#c_type%(pos%)=c_type%(pos%)�256
.�6time$=�date(date%,month%+this_month%-1,this_year%)
.�time$=�time$,�time$-3)
.�?� c_type%(pos%)�256 � time$=�time(c_time%(pos%))+", "+time$
.�$�seticontext(w%(alarm%),2,time$)
.�-�seticontext(w%(alarm%),3,c_entry$(pos%))
.��openincentre(w%(alarm%))
.� � a_checking%=� � �c_alarms2
.��
.�
/� �open_search(type%)
/search_type%=type%
/"�seticontext(w%(search%),0,"")
/&"�openwindowasmenu(w%(search%))
/0�
/:
/D� �search(rec%,inc%)
/N st$=�icontext(w%(search%),0)
/XȎ search_type% �
/b � 1
/l �get_n_data
/v max%=notes%
/� � 2
/� �get_a_data
/� max%=names%
/��
/�match%=�
/�rec%+=inc%
/�&ȕ match%=� � rec%>=1 � rec%<=max%
/� Ȏ search_type% �
/� � 1
/� � n%=0 � 5
/�3 � �match(note$(rec%,n%),st$) � match%=�
/� � n%
/� � 2
0 � type=name � dob
02 � �match(a$(rec%,type),st$) � match%=�
0 � type
0 �
0* � match%=� � rec%+=inc%
04�
0>� match% �
0H Ȏ search_type% �
0R � 1 : �set_n(rec%)
0\ � 2 : �set_a(rec%)
0f �
0p�
0z �closewindow(w%(search%))
0��
0��
0�
0�� �match(st$,search$)
0�� match%,i%,i2%
0�match%=�
0�i%=�search$,"*")
0�� i%>0 �
0� i2%=�st$,�search$,i%-1))
0�: � i2%>0 � match%=�match(�st$,i2%+i%),�search$,i%+1))
0��
0� � �st$,search$) � match%=�
0��
1=match%
1
1� �set_n(new%)
1$5� active%(notepad%) � this_note%>-1 � �get_n_data
1.;� (new%<>this_note% � active%(notepad%)=�) � new%<>-1 �
18 this_note%=new%
1B � i%=0 � 5
1L< �seticontext(w%(notepad%),i%+1,note$(this_note%,i%))
1V
� i%
1`" �resetcaret(w%(notepad%),-1)
1j3 � active%(notepad%)=� � �openup(w%(notepad%))
1t �set_n_scroll
1~�
1�*� new%=-1 � �closewindow(w%(notepad%))
1��
1�
1�� �get_n_data
1�� i%=0 � 5
1�' new$=�icontext(w%(notepad%),i%+1)
1�$ � new$<>note$(this_note%,i%) �
1�! note$(this_note%,i%)=new$
1� n_changed%=�
1� �
1�� i%
1��
2
2
� �blank_n
2� i%=0 � 5
2 note$(this_note%,i%)=""
2(� i%
22�
2<
2F� �inc_n(inc%)
2PL� this_note%+inc%>=1 � this_note%+inc%<=notes% � �set_n(this_note%+inc%)
2Z�
2d
2n
� �drag_n
2xn_off%=mx%-n_s5%
2�P�startuserdrag(notepad%,0,n_s0%+n_off%,my%,n_s4*(notes%-1)+n_s0%+n_off%,my%)
2��
2�
2�� �set_n_scroll
2�#�deleteicon(w%(notepad%),n_si%)
2�n_s4=(n_s1%/notes%)
2�#n_s5%=n_s0%+n_s4*(this_note%-1)
2�!q%=w%(notepad%)
2�q%!4=n_s5%
2�q%!8=n_s2%
2�q%!12=q%!4+n_s4
2�q%!16=n_s3%
2�q%!20=n_sf%
3#ș"Wimp_CreateIcon",,q% � n_si%
3�redoicon(w%(notepad%),9)
3�
3"
3,� �add_n
36� notes%<max_n% �
3@ notes%+=1
3J �set_n(notes%)
3T last_n%+=1
3^ n_num%(notes%)=last_n%
3h! �putcaret(w%(notepad%),1,0)
3r�
3| �report("Too many notes.")
3��
3��
3�
3�� �delete_n
3��blank_n
3�temp%=this_note%
3�ȕ temp%<notes%
3� � i%=0 � 5
3�) note$(temp%,i%)=note$(temp%+1,i%)
3�
� i%
3�# n_num%(temp%)=n_num%(temp%+1)
3� temp%+=1
3��
4temp%=this_note%-1
4� temp%=0 � temp%=1
4this_note%=-1
4&� notes%>1 � notes%-=1
40�set_n(temp%)
4:�
4D
4N� �remove_e(m%,d%,e%)
4Xnext%=c_first%(m%,d%)
4b� next%=e% �
4l! c_first%(m%,d%)=c_next%(e%)
4v�
4� ȕ c_next%(next%)<>e%
4� next%=c_next%(next%)
4� �
4� c_next%(next%)=c_next%(e%)
4��
4��
4�
4�� �insert_e(m%,d%,e%)
4�
after%=-1
4�next%=c_first%(m%,d%)
4�c_next%(e%)=e%
4�� c_type%(e%)�256 �
4� ȕ next%>-1
5I � c_time%(e%)>c_time%(next%) � c_type%(next%)>=256 � after%=next%
5 next%=c_next%(next%)
5 �
5 �
5* ȕ next%>-1
543 � c_type%(next%)>c_type%(e%) � after%=next%
5> next%=c_next%(next%)
5H �
5R�
5\� after%=-1 �
5f$ Ȕ c_first%(m%,d%),c_next%(e%)
5p�
5z$ Ȕ c_next%(e%),c_next%(after%)
5��
5�e_changed%=�
5��
5�
5�� �mark_birthday
5�st$=a$(this_name%,dob)+"."
5�d%=�next_number(st$)
5�m%=�next_number(st$)
5�%� d%>=1 � d%<=31 � m%>=1 � m%<=12
5�!m%=((12+m%-this_month%)�12)+1
5�� c_last%<c_max% �
5� c_last%+=1
5�W c_entry$(c_last%)=�a$(this_name%,name),�a$(this_name%,name)," ")-1)+"'s birthday"
6 c_type%(c_last%)=1
6 c_time%(c_last%)=0
6+ c_link%(0,c_last%)=a_num%(this_name%)
6$ c_link%(1,c_last%)=0
6. �insert_e(m%,d%,c_last%)
68I � d_month%=m% � d_date%=d% � active%(day%) � �forceredraw(w%(day%))
6B c_changed%=�
6L �redo_c(m%,d%)
6V�
6`& �report("Book of days is full.")
6j�
6t�
6~
6�� �add_e
6�� c_last%<c_max% �
6� c_last%+=1
6� � d_items%=0 �
6�* c_first%(d_month%,d_date%)=c_last%
6� �
6�( last%=c_first%(d_month%,d_date%)
6� ȕ c_next%(last%)<>-1
6� last%=c_next%(last%)
6� �
6� c_next%(last%)=c_last%
6� �
7 c_entry$(c_last%)=""
7
c_type%(c_last%)=0
7 c_time%(c_last%)=0
7 c_next%(c_last%)=-1
7( c_link%(0,c_last%)=0
72 c_link%(1,c_last%)=0
7< �set_e(c_last%)
7F
�calc_d
7P�
7Z& �report("Book of days is full.")
7d�
7n�
7x
7�� �get_e
7�e_changed%=�
7�"o_entry$=c_entry$(this_entry%)
7� o_time%=c_time%(this_entry%)
7� o_type%=c_type%(this_entry%)
7�1c_entry$(this_entry%)=�icontext(w%(entry%),0)
7�� i%=0 � 7
7�C � �selected(w%(entry%),e_icon%(i%)) � c_type%(this_entry%)=i%
7�� i%
7�Z� �selected(w%(entry%),14) � c_type%(this_entry%)=c_type%(this_entry%)�256 � e_time%=0
7� c_time%(this_entry%)=e_time%
7�E� o_time%<>c_time%(this_entry%) � o_type%<>c_type%(this_entry%) �
7�- �remove_e(d_month%,d_date%,this_entry%)
8- �insert_e(d_month%,d_date%,this_entry%)
8�
86 � o_entry$<>c_entry$(this_entry%) � e_changed%=�
8"�
8,� e_changed% �
86 �forceredraw(w%(day%))
8@ �redo_c(d_month%,d_date%)
8J c_changed%=�
8T�
8^2� d_month%=1 � d_date%=this_date% � �c_alarms2
8h�
8r
8|� �set_e(new%)
8�� new%<>-1 �
8�/ � active%(entry%)=� � �openup(w%(entry%))
8�/ �seticontext(w%(entry%),0,c_entry$(new%))
8�- �putcaret(w%(entry%),0,�c_entry$(new%))
8� �set_e_time(c_time%(new%))
8� � i%=0 � 7
8�D �selecticon(w%(entry%),e_icon%(i%),(i%=(c_type%(new%)�255)))
8�
� i%
8�2 �selecticon(w%(entry%),14,c_type%(new%)�256)
8��
8� �closewindow(w%(entry%))
8��
8�this_entry%=new%
9�
9
9� �set_e_time(e%)
9&(�seticontext(w%(entry%),7,�time(e%))
90e_time%=e%
9:�
9D
9N� �time(time%)
9X0=�"0"+�(time%�60),2)+":"+�"0"+�(time%�60),2)
9b
9l� �day(date%,month%,year%)
9vB=(date%+year%+(year%�4)+mo%(month%)+(year%�4=0 � month%<=2))�7
9�
9�� �date(date%,month%,year%)
9�� year%�4=0 � ml%(2)=29
9�� date%<1 � month%-=1
9�� month%>12 �
9� month%-=12
9� year%+=1
9��
9�� month%<1 �
9� month%+=12
9� year%-=1
9��
9�!� date%<1 � date%=ml%(month%)
:T=day$(�day(date%,month%,year%))+" "+�(date%)+" "+�month$(month%),3)+" "+�(year%)
:
:� �new_day(d%,m%)
: "� d%<>d_date% � m%<>d_month% �
:* d_month%=m%
:4 d_date%=d%
:>
�calc_d
:H> t_date$=�date(d_date%,d_month%+this_month%-1,this_year%)
:R! �newtitle(w%(day%),t_date$)
:\2 � active%(entry%) � �closewindow(w%(entry%))
:f# �newtitle(w%(entry%),t_date$)
:p�
:z�openup(w%(day%))
:��
:�
:�� �redo_c(m%,d%)
:�d%=d%-1+sd%(m%)
:�`�redobox(w%(year%),m%*c_width%,-(d%*c_height%+c_height%),m%*c_width%+c_width%,-d%*c_height%)
:��
:�
:�
� �calc_d
:�d_items%=0
:�$next%=c_first%(d_month%,d_date%)
:�ȕ next%<>-1
:� d_items%+=1
:� next%=c_next%(next%)
;�
;K�setwindowextent(w%(day%),!d_icon%-8,-d_height%*d_items%,d_icon%!8+8,0)
;�reopen(w%(day%))
;$�
;.
;8� �calc_d_ords(e%)
;Bd_icon%!4=-(e%+1)*d_height%
;L"d_icon%!12=d_icon%!4+d_height%
;V�
;`
;j
� �load_c
;tc_file$=dir$+".Days"
;~� �fileexist(c_file$) �
;� in_file=�(c_file$)
;�% mf%=this_month%+this_year%*12-1
;� ȕ ��#in_file
;� �#in_file,m%
;� �#in_file,d%
;� �#in_file,colour%
;� �#in_file,end%
;� m%-=mf%
;� � m%>=0 � m%<=12 �
;�" c_colour%(m%,d%)=colour%
;� prev%=-1
;� ȕ �#in_file<>end%
<