REM> $.Xfer.!WhenUsed.!RunImage
REM> Version 1.00  -  June 1991
REM> written by Uli Reutter
:
ON ERROR PROCerror(%110,ERR,ERL,REPORT$,1)
PROCinit:PROCicondo:PROCget_settings
REPEAT
SYS"Wimp_Poll",0,block% TO action%
CASE action% OF
  WHEN 0:
  WHEN 1: REPEAT
          SYS"Wimp_RedrawWindow",,block% TO i%
          UNTIL i%=0
  WHEN 2: SYS"Wimp_OpenWindow",,block%
  WHEN 3: IF mainopen%=TRUE THEN
            PROCclose_window(mainhand%)
          ELSE
            PROCclose_window(rephand%)
          ENDIF
  WHEN 4: IF infopen%=TRUE PROCclose_window(infhand%)
  WHEN 6: PROCclick(block%!8,block%!16)
  WHEN 8: PROCkey_press(block%!4)
  WHEN 9: PROCmenuaction
  WHEN17,18: PROCreceive
ENDCASE
UNTIL done%
END
:
DEFPROCreceive
CASE block%!16 OF
  WHEN 0: PROCterminate
  WHEN 3: PROCfile_drop
  WHEN &400C2: PROCcheck_duplicate
ENDCASE
ENDPROC
:
DEFPROCclick(x%,z%)
IF block%!12=-2 THEN
  CASE x% OF
    WHEN 4: IF repopen%=FALSE THEN choice%=1:PROCopen_window("Report")
    WHEN 2: PROCmenu("Info,Report,Setup,Quit,")
  ENDCASE
ELSE
  IF x%=4 THEN
    SYS"Wimp_GetPointerInfo",,block%
      CASE z% OF
        WHEN 2,3: IF auto%=FALSE THEN
                    $fpointer%(2)="Auto Delete:  On"
                    i%=FNtextset(mainhand%,2)
                    i%=FNiconset(mainhand%,3,1)
                    auto%=TRUE
                  ELSE
                    $fpointer%(2)="Auto Delete:  Off"
                    i%=FNtextset(mainhand%,2)
                    i%=FNiconset(mainhand%,3,0)
                    auto%=FALSE
                  ENDIF
                  PROCicon_able(4):PROCicon_able(5):PROCset_ok
        WHEN 6:   IF col%=%1010 PROCinstall(wintext$(0))
        WHEN 7:   PROCclose_window(mainhand%):PROCget_settings
        WHEN 0,5: col%=FNcolourset(%1011,6)
      ENDCASE
  ENDIF
ENDIF
ENDPROC
:
DEFPROCerror(f%,e%,l%,e$,term%)
!error%=e%:$(error%+4)=e$+CHR$0
SYS"Wimp_ReportError",error%,f%,title% TO ,f%
IF term%<>0 THEN
  PROCshow(!error%,l%,0,"")
  PROCterminate
  END
ENDIF
ENDPROC
:
DEFPROCterminate
IF task%=0:done%=TRUE:END
IF !error%=26 THEN
   SYS "Wimp_CloseDown",task%,&4B534154
   done%=TRUE
   ENDPROC
ENDIF
SYS "Font_LoseFont",fonthandle%
SYS "Wimp_CloseDown",task%,&4B534154
OSCLI "Close"
done%=TRUE
END
:
DEFPROCmenu(m$)
SYS"Wimp_GetPointerInfo",,block%
X%=(block%!0)-100:Y%=275
M%=menu%:$M%="Usage"
M%!12=&70207:M%!20=44:M%!24=0
I%=M%+28:max%=LEN($M%)
REPEAT
!I%=0:I%!4=0:I%!8=&7000021
A%=INSTR(m$,",")
IF A%>max% max%=A%
$(I%+12)=LEFT$(m$,A%-1)
m$=MID$(m$,A%+1):I%+=24
UNTIL m$=""
I%!-24=&80:M%!16=max%*16
SYS "Wimp_CreateMenu",,M%,X%,Y%
ENDPROC
:
DEFPROCmenuaction
choice%=!block%
CASE choice% OF
  WHEN 3: PROCterminate
  WHEN 2: IF mainopen%=FALSE PROCopen_window("Main")
  WHEN 1: IF repopen%=FALSE PROCopen_window("Report")
  WHEN 0: PROCopen_window("info")
ENDCASE
ENDPROC
:
DEFPROCshow(a%,b%,c%,d$)
SYS "Wimp_CommandWindow",2:PRINT a%,b%,c%,d$
SYS "Wimp_CommandWindow",0
ENDPROC
:
DEFPROCopen_window(which$)
IF choice%=1 AND mainopen%=TRUE PROCclose_window(mainhand%)
IF choice%=2 AND repopen%=TRUE PROCclose_window(rephand%)
FOR I%=0 TO 255:fontsize%!I%=0:NEXT I%
SYS"Wimp_OpenTemplate",,"<WhenUsed$Dir>.Templates"
SYS"Wimp_LoadTemplate",,temp%,buffer%,buffer%+bsize%,fontsize%,which$,0
FOR x%=0 TO 10:fpointer%(x%)=temp%!(88+(x%*32)+20):NEXT x%
SYS"Wimp_CreateWindow",,temp% TO handle%
SYS"Wimp_CloseTemplate"
FOR i%=0 TO 31 STEP 4:block%!(i%+4)=temp%!i%:NEXT i%
!block%=handle%:block%!28=-1
SYS"Wimp_OpenWindow",,block%
IF choice%=2 THEN mainopen%=TRUE:mainhand%=handle%:PROCrefresh
IF choice%=1 THEN repopen%=TRUE:rephand%=handle%
IF choice%=0 THEN infopen%=TRUE:infhand%=handle%
IF wintext$(0)<>"" THEN
  flag%=1
  PROCcheck_existance(wintext$(0))
  flag%=0
  IF ignore%=TRUE THEN
    PROCmessage(blah$)
    wintext$(0)=""
    $fpointer%(0)=wintext$(0)
    i%=FNtextset(mainhand%,0)
    PROCset_ok
  ENDIF
ENDIF
ENDPROC
:
DEFPROCinit
done%=FALSE:repopen%=FALSE:ignore%=FALSE:infopen%=FALSE:mainopen%=FALSE:auto%=FALSE:bsize%=&300
DIM block% &100, title% &11, error% &100, temp% &1000, buffer% bsize%, menu% &100, icon% &100, fontsize% &100, filesize% &3000
DIM fpointer%(10), wintext$(10), old_wintext$(10), applic$(99)
infhand%=0:status%=0:$title%="Application Usage":col%=%10:handle%=0:fonthandle%=0:flag%=0
SYS"Wimp_Initialise",200,&4B534154,title% TO versn%,task%
ENDPROC
:
DEFPROCicondo
S%=OPENIN"<WhenUsed$Dir>.!Sprites":T%=EXT#S%+16:CLOSE#S%
DIM sprites% T%
!sprites%=T%:sprites%!8=1
SYS "OS_SpriteOp",&109,sprites%
SYS "OS_SpriteOp",&10A,sprites%,"<WhenUsed$Dir>.!Sprites"
!icon%=-1:icon%!4=0:icon%!8=0:icon%!12=63:icon%!16=68:icon%!20=&2102
spname$="!whenused"
DIM icon%!24 (LENspname$+1):$(icon%!24)=spname$:icon%!28=sprites%
icon%!32=LENspname$+1
SYS "Wimp_CreateIcon",,icon% TO ic%
ENDPROC
:
DEFPROCclose_window(handle%)
block%!0=handle%
SYS"Wimp_CloseWindow",,block%
infopen%=FALSE
IF handle%<>infhand% THEN repopen%=FALSE:mainopen%=FALSE
col%=%10
ENDPROC
:
DEFFNiconset(wi%,ic%,set%)
block%!0=wi%:block%!4=ic%:block%!8=set%<<21:block%!12=%1<<21
SYS"Wimp_SetIconState",,block%
=set%
:
DEFFNcolourset(col%,ic%)
block%!0=handle%:block%!4=ic%:block%!8=col%<<28:block%!12=%1111<<28
SYS"Wimp_SetIconState",,block%
=col%
:
DEFPROCicon_able(ic%)
block%!0=handle%:block%!4=ic%:block%!8=%111<<24
SYS"Wimp_SetIconState",,block%
ENDPROC
:
DEFFNtextset(wi%,ic%)
block%!0=wi%:block%!4=ic%:block%!8=0:block%!12=0
SYS"Wimp_SetIconState",,block%
=0
:
DEFFNretoz(p%,ck%)
LOCAL q$
WHILE ?p%<>ck% q$+=CHR$?p%:p%+=1:ENDWHILE
=q$
:
DEFPROCfile_drop
ignore%=TRUE
SYS "Wimp_GetPointerInfo",,block%:ic%=block%!16
CASE ic% OF
  WHEN 0: PROCcheck_type(4096)
  WHEN 1,2,3,4: PROCerror(%11001,0,0,"You can't drop anything here",0)
  WHEN 5: PROCerror(%11001,0,0,"You can't drop anything here,  only write",0)
  WHEN 6,7: PROCerror(%11001,0,0,"Don't be silly!",0)
ENDCASE
IF ignore%=TRUE ENDPROC
$fpointer%(ic%)=FNretoz((block%+44),0)
wintext$(ic%)=FNretoz((block%+44),0)
x%=FNtextset(handle%,ic%)
PROCset_ok
SYS "Wimp_SetCaretPosition",-1
ENDPROC
:
DEFPROCcheck_type(permit%)
ft%=block%!40
IF ft%=permit% THEN
  ignore%=FALSE
  ENDPROC
ELSE
  PROCerror(%11001,0,0,"I think I said  DIRECTORY.   Didn't I ?!",0)
ENDIF
ENDPROC
:
DEFPROCcheck_duplicate
applic$=FNretoz((block%+28),0):applic$=LEFT$(applic$,LEN(applic$)-3)
IF applic$="Application Usage" AND block%!4<>task% PROCterminate
ENDPROC
:
DEFPROCkey_press(ic%)
IF block%!24=13 THEN
  CASE ic% OF
    WHEN 0: wintext$(0)=FNretoz(temp%!(88+(ic%*32)+20),13)
            PROCcheck_existance(wintext$(0))
            IF ignore%=TRUE ENDPROC
            ELSE
              $fpointer%(0)=wintext$(0)
              i%=FNtextset(handle%,0)
            ENDIF
    WHEN 5: wintext$(5)=FNretoz(temp%!(88+(ic%*32)+20),13)
            PROCcheck_value(wintext$(5),10)
            IF ignore%=TRUE ENDPROC
            ELSE
              $fpointer%(5)=wintext$(5)
              i%=FNtextset(handle%,5)
            ENDIF
  ENDCASE
  PROCset_ok
  SYS "Wimp_SetCaretPosition",-1
ENDIF
ENDPROC
:
DEFPROCinstall(path$)
REM> locked files must first be unlocked! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
REM> beware of directories that have no !applications or are empty! <<<<<
$fpointer%(1)="...... Installing ......"
i%=FNtextset(handle%,1)
IF path$=oldpath$ THEN
  PROCupdate(1)
  PROCterminate
ELSE
  PROCupdate(0)
ENDIF
LOCAL X%,Y%,Z%,L%
PROCsave_settings
PROCmake_list
FOR i%=0 TO count%-1
IF i%=0 THEN 
  destin$=path$+"."+applic$(i%)+".!Run"
  ELSE
  destin$=path$+"."+RIGHT$(applic$(i%),LEN(applic$(i%))-1)+".!Run"
ENDIF
PROCinnoculate(destin$)
NEXT i%
PROCterminate
ENDPROC
:
DEFPROCget_settings
A=OPENIN "<WhenUsed$Dir>.Data.Settings"
INPUT#A, wintext$(0):INPUT#A, wintext$(5):INPUT#A, auto%
CLOSE#A
oldpath$=wintext$(0)
ENDPROC
:
DEFPROCsave_settings
A=OPENOUT "<WhenUsed$Dir>.Data.Settings"
PRINT#A, wintext$(0):PRINT#A, wintext$(5):PRINT#A, auto%
CLOSE#A
ENDPROC
:
DEFPROCrefresh
IF ignore%=FALSE THEN
  IF auto%=TRUE THEN
    $fpointer%(2)="Auto Delete:  On"
    i%=FNtextset(mainhand%,2)
    i%=FNiconset(mainhand%,3,1)
    PROCicon_able(4)
    PROCicon_able(5)
  ENDIF
ENDIF
IF wintext$(0)<>"" THEN
  $fpointer%(0)=wintext$(0)
  i%=FNtextset(mainhand%,0)
ENDIF
IF wintext$(5)<>"" THEN
  $fpointer%(5)=wintext$(5)
  i%=FNtextset(mainhand%,5)
ENDIF
PROCset_ok
SYS "Wimp_SetCaretPosition",-1
ENDPROC
:
DEFPROCset_ok
IF wintext$(0)="" THEN
  col%=FNcolourset(%1011,6)
  PROCmessage("Drop the directory you wish to monitor into the window below")
  ENDPROC
ENDIF
IF auto%=TRUE AND wintext$(5)="" THEN
  col%=FNcolourset(%1011,6)
PROCmessage("You must enter the number of days (or turn auto-delete off)")
  ENDPROC
ENDIF
col%=FNcolourset(%1010,6)
PROCmessage("These are your current settings")
FOR i%=0 TO 10:old_wintext$(i%)=wintext$(i%):NEXT i%
ENDPROC
:
DEFPROCmessage(blurb$)
$fpointer%(1)=blurb$
i%=FNtextset(mainhand%,1)
ENDPROC
:
DEFPROCcheck_existance(path$)
ignore%=FALSE
blurb$="There is no such directory!"
blah$="Type it right this time (or better yet, drag...)"
IF flag%=1 THEN
  blurb$="The last specified directory cannot be found!  Has it been renamed, moved, or deleted?"
  blah$="Drop the directory you wish to monitor into the window below"
ENDIF
SYS"OS_File",15,path$ TO ,,,,,attrib%
IF attrib%>0 THEN
  ignore%=TRUE
  PROCerror(%11001,0,0,blurb$,0)
  PROCmessage(blah$)
ENDIF
ENDPROC
:
DEFPROCcheck_value(string$,min%)
ignore%=FALSE
IF string$="" ENDPROC
i%=VAL(string$)
IF i%<min% THEN
  ignore%=TRUE
  blurb$="Auto deletion of applications which were not used for less than "  +STR$(min%)+" days is considered unreasonable."
  PROCerror(%11001,0,0,blurb$,0)
  wintext$(5)="10"
  PROCrefresh
ENDIF
ENDPROC
:
DEFPROCupdate(status%)
REM> status%=0 means erase date stamping, status 1 is to update newcomers.
LOCAL X%,Y%,Z%,L%
A=OPENIN "<WhenUsed$Dir>.Data.List"
INPUT#A, count%
FOR i%=0 TO count%-1
INPUT#A, applic$(i%)
NEXT i%
CLOSE#A
FOR i%=0 TO count%-1
IF i%=0 THEN 
  destin$=oldpath$+"."+applic$(i%)+".!Run"
  ELSE
  destin$=oldpath$+"."+RIGHT$(applic$(i%),LEN(applic$(i%))-1)+".!Run"
ENDIF
wd$="Stamp "
X%=0:Y%=1
A=OPENIN destin$
WHILE NOT EOF#A:filesize%?+X%=BGET#A:X%+=1:ENDWHILE
CLOSE #A
blurb$="":FOR Z%=0 TO 5:blurb$=blurb$+CHR$(filesize%?+Z%):NEXT Z%
IF blurb$=wd$ THEN
  IFstatus%=1 THEN
    PROCmake_list
    REM> now find out whether there is a new file around, and innoculate it           <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    NEXT i%
  ELSE
    WHILE filesize%?+Z%<>10
      Z%+=1
    ENDWHILE
    A=OPENOUT destin$
    FOR Y%=Z%+1 TO X%-1:BPUT#A,filesize%?+Y%:NEXT Y%
    CLOSE #A
    NEXT i%
  ENDIF
ELSE
  IF status%=1 THEN
    PROCinnoculate(destin$)
    NEXT i%
  ENDIF
ENDIF 
ENDPROC
:
DEFPROCmake_list
LOCAL X%
REPEAT
SYS"OS_GBPB",9,path$,filesize%,99,0,buffer%,"!*" TO ,,,count%,offset%
UNTIL offset%=-1
blurb$="":counter%=0:X%=0
WHILE counter%<count%
  IF filesize%?+X%<&21 THEN
    applic$(counter%)=blurb$
    blurb$=""
    counter%+=1
   ENDIF
    blurb$=blurb$+CHR$(filesize%?+X%)
    X%+=1
ENDWHILE
A=OPENOUT "<WhenUsed$Dir>.Data.List"
PRINT#A, count%
FOR X%=0 TO count%-1
PRINT#A, applic$(X%)
NEXT X%
CLOSE#A
ENDPROC
:
DEFPROCinnoculate(target$)
wd$="Stamp "+target$+CHR$(10):L%=LEN(wd$)+1
X%=L%:Y%=1
A=OPENIN target$
WHILE NOT EOF#A:filesize%?+X%=BGET#A:X%+=1:ENDWHILE
CLOSE #A
X%-=1
WHILE Y%<L%:filesize%?+Y%=ASC(MID$(wd$,Y%,1)):Y%+=1:ENDWHILE
A=OPENOUT target$
FOR Z%=1 TO X%:BPUT#A,filesize%?+Z%:NEXT Z%
CLOSE #A
ENDPROC
:
