' Program: Fsel$ replacement.  
' Author : Paul Overy. 
'
' Turbo extension needed.  
' (can be changed to normal Amos without problems)   
'
' This program is designed to be complied & placed inside the  
' main calling program Fsel$.amos.   
' Just for you, the code already compiled in the Fsel$.amos program.   
' Its been writen to pass information back through bank 3. When compiled 
' the program has no other way of passing pramaters.   
' (As Amos is not able to place a procedure inside another procedure)  
'
' This is the closest, Amos can be to a module based system. 
'
Set Buffer 10
Dim DEV$(4),D$(512)
Global TBASE,OFFSETX,OFFSETY,PATH$,SEL$,FILE$
'Erase 3 : Reserve As Data 3,256 
Reserve Check 6
'
OFFSETX=0 : OFFSETY=0
'
'Screen Open 0,640,256,4,Lowres : Curs Off : Cls 0 : Paper 0 
'Limit Mouse 0,0 To 640,256
OFFSETX=Deek(Start(3))
OFFSETY=Deek(Start(3)+2)
'
C1=Colour(0) : C1=Colour(1)
C1=Colour(2) : C1=Colour(3)
Palette $555,$229,$FFF,$0
GOOD_DEV$="DF0:DF1:DH0:DH1:RAM:"
'
Proc _DRAW_ALL
_INTIALISE=True
Set Dir 37
'
'**** MAIN START ****
'
Repeat 
   If Mouse Key=2 or _INTIALISE or RELIST
      If Not RELIST
         OLD_PATH$=PATH$
         PATH$="" : NEW_PATH=True
         _INTIALISE=False
         Ink 0
         Bar OFFSETX+1,1+OFFSETY To 261+OFFSETX,119+OFFSETY
         DEV$=Dev First$("")
         INDEX=0
         While DEV$<>""
            DEV$=Mid$(DEV$,2,Instr(DEV$,":")-1)
            If Hunt(Varptr(GOOD_DEV$) To Varptr(GOOD_DEV$)+Len(GOOD_DEV$),DEV$)>0
               Ink 3,0
               If Exist(DEV$)
                  I$=Disc Info$(DEV$) : INFO$=Left$(I$,Instr(I$,":"))
                  Ink 2 : Text 4+OFFSETX,INDEX*9+TBASE,DEV$
                  Ink 3 : Text Max(Len(DEV$),6)*9+4+OFFSETX,INDEX*9+TBASE,INFO$
                  DEV$(INDEX)=INFO$ : Inc INDEX
               End If 
            End If 
            DEV$=Dev Next$
         Wend 
         OK=False
         Repeat 
            If Left Click
               MX=X Screen(X Mouse)
               MY=Y Screen(Y Mouse)
               BUTTON=Check(3 To 6,MX,MY)-2
               If BUTTON>0
                  B=BUTTON-1
                  _BOX[72*B+1,170,72*B+61,182,3]
                  Repeat 
                     MX=X Screen(X Mouse)
                     MY=Y Screen(Y Mouse)
                     BUTTON=Check(3 To 6,MX,MY)-2
                     If BUTTON<>B+1
                        _BOX[72*B+1,170,72*B+61,182,2]
                     Else 
                        _BOX[72*B+1,170,72*B+61,182,3]
                     End If 
                  Until Not Left Click
                  If BUTTON=1 or BUTTON=4
                     OK=True
                     SEL$=OLD_PATH$+"/"+FILE$
                     PATH$=OLD_PATH$
                     SEL_END=True
                     On BUTTON Proc _OK,_NUL,_NUL,_CANCEL
                  End If 
                  _BOX[72*B+1,170,72*B+61,182,2]
                  BUTTON=False
               End If 
               If MY>OFFSETY and MY<26+OFFSETY
                  If MX>OFFSETX and MX<260+OFFSETX
                     PATH$=DEV$((MY-OFFSETY)/9)
                     Dir$=PATH$
                     OK=True
                     '
                     DISK$=Disc Info$(PATH$)
                     Ink 3
                     N=Instr(DISK$,":")
                     Text 66+OFFSETX,136+TBASE,Left$(DISK$,N)+Space$(35-N)
                     '
                  End If 
               End If 
               Wait Vbl : Repeat : Until Not Left Click
            End If 
         Until OK
      End If 
      '
      If SEL_END=False
         RELIST=False
         Ink 0 : Bar OFFSETX+1,1+OFFSETY To 261+OFFSETX,119+OFFSETY
         Dir$=PATH$
         '
         D$=Dir First$("") : Y=0 : FILES=0
         While D$<>""
            D$(FILES)=D$
            If FILES<13
               If Left$(D$,1)="*"
                  Ink 2,0 : Text 4+OFFSETX,Y+TBASE,Mid$(D$,2,Len(D$))
               Else 
                  Ink 3,0 : Text 4+OFFSETX,Y+TBASE,Mid$(D$,2,Len(D$))
               End If 
               Add Y,9
            End If 
            Inc FILES
            D$=Dir Next$
         Wend 
         YSIZE=FILES*9 : SCRL_AREA=Min(YSIZE,12*9)
         P=0
      End If 
   End If 
   '****************************************************************  
   If Left Click or RELIST
      RELIST=False
      MX=X Screen(X Mouse)
      MY=Y Screen(Y Mouse)
      If FILES>0 and FILES>12
         If Check(2 To 2,MX,MY)
            If ZNE1=FLASE
               _BOX2[266,111,279,120,3] : ZNE1=True
               _BOX2[266,101,279,110,2] : ZNE2=False
            End If 
            If P+13<FILES
               '***UP***
               P=Range(P+1,0 To FILES) : P1=P+12
               Wait Vbl 
               Screen Copy 0,4+OFFSETX,12+OFFSETY,260+OFFSETX,SCRL_AREA+12+OFFSETY To 0,4+OFFSETX,3+OFFSETY
               N$=Mid$(D$(P1),2,Len(D$(P1)))
               If Left$(D$(P1),1)="*"
                  Ink 2,0
                  Text 4+OFFSETX,SCRL_AREA+TBASE,N$
               Else 
                  Ink 3,0
                  Text 4+OFFSETX,SCRL_AREA+TBASE,N$
               End If 
            End If 
         End If 
         If Check(1 To 1,X Screen(X Mouse),Y Screen(Y Mouse))
            If ZNE2=False
               _BOX2[266,101,279,110,3] : ZNE2=True
               _BOX2[266,111,279,120,2] : ZNE1=False
            End If 
            If P>0
               '***DOWN***
               P=Range(P-1,0 To FILES)
               Wait Vbl 
               Screen Copy 0,4+OFFSETX,1+OFFSETY,260+OFFSETX,SCRL_AREA+3+OFFSETY To 0,OFFSETX+4,OFFSETY+10
               N$=Mid$(D$(P),2,Len(D$(P)))
               If Left$(D$(P),1)="*"
                  Ink 2,0
                  Text OFFSETX+4,TBASE,N$
               Else 
                  Ink 3,0
                  Text OFFSETX+4,TBASE,N$
               End If 
            End If 
         End If 
         Wait Vbl 
      End If 
      If MY>OFFSETY and MY<Min(13*9,FILES*9)+OFFSETY
         If MX>OFFSETX and MX<260+OFFSETX
            N$=Mid$(D$((MY-OFFSETY)/9+P),2,29)-" "
            If Left$(D$((MY-OFFSETY)/9+P),1)="*"
               Ink 0 : Bar OFFSETX+1,OFFSETY+1 To OFFSETX+261,OFFSETY+119
               If NEW_PATH
                  NEW_PATH=False
                  PATH$=PATH$+N$
               Else 
                  PATH$=PATH$+"/"+N$
               End If 
               '
               P$=Right$(PATH$,35)
               Ink 3
               Text 66+OFFSETX,136+TBASE,P$+Space$(35-Len(P$))
               '
               Dir$=PATH$
               D$=Dir First$("") : Y=0 : FILES=0
               While D$<>""
                  D$(FILES)=D$
                  If FILES<13
                     If Left$(D$,1)="*"
                        Ink 2,0 : Text 4+OFFSETX,Y+TBASE,Mid$(D$,2,Len(D$))
                     Else 
                        Ink 3,0 : Text 4+OFFSETX,Y+TBASE,Mid$(D$,2,Len(D$))
                     End If 
                     Add Y,9
                  End If 
                  Inc FILES
                  D$=Dir Next$
               Wend 
               YSIZE=FILES*9 : SCRL_AREA=Min(YSIZE,12*9)
               P=0
            Else 
               N=Len(N$)
               For K=N To 1 Step -1
                  If Mid$(FILE$,K,1)<>" "
                     FILE$=Mid$(N$,1,K)
                     Exit 
                  End If 
               Next K
               Ink 3
               Text 66+OFFSETX,150+TBASE,Left$(N$,N)+Space$(35-N)
            End If 
            Wait Vbl : Repeat : Until Not Left Click
         End If 
      End If 
      BUTTON=Check(3 To 6,MX,MY)-2
      If BUTTON>0
         B=BUTTON-1
         _BOX[72*B+1,170,72*B+61,182,3]
         Repeat 
            MX=X Screen(X Mouse)
            MY=Y Screen(Y Mouse)
            BUTTON=Check(3 To 6,MX,MY)-2
            If BUTTON<>B+1
               _BOX[72*B+1,170,72*B+61,182,2]
            Else 
               _BOX[72*B+1,170,72*B+61,182,3]
            End If 
         Until Not Left Click
         If BUTTON>0
            On BUTTON Proc _OK,_VOLUMES,_PARENT,_CANCEL
         End If 
         _BOX[72*B+1,170,72*B+61,182,2]
         BUTTON=False
      End If 
   Else 
      If ZNE1=True
         _BOX2[266,111,279,120,2] : ZNE1=False
      End If 
      If ZNE2=True
         _BOX2[266,101,279,110,2] : ZNE2=False
      End If 
   End If 
Until SEL_END
'
If SEL$<>""
   S=Varptr(SEL$) : L=Len(SEL$) : Poke Start(3),L
   Copy S,S+L To Start(3)+1
End If 
'
Palette C1,C2,C3,C4
'
'**** MAIN END ****
'
Procedure _BOX[X1,Y1,X2,Y2,C]
   Add X1,OFFSETX : Add Y1,OFFSETY : Add X2,OFFSETX : Add Y2,OFFSETY
   Ink C
   Draw X1,Y1 To X1,Y2
   Ink 5-C
   Draw X1+1,Y2 To X2,Y2
   Draw X2,Y2 To X2,Y1+1
   Ink C
   Draw X2,Y1 To X1,Y1
End Proc
Procedure _BOX2[X1,Y1,X2,Y2,C]
   _BOX[X1,Y1,X2,Y2,C]
   _BOX[X1-1,Y1,X2+1,Y2,C]
End Proc
Procedure _BOX3[X1,Y1,X2,Y2,C]
   _BOX[X1,Y1,X2,Y2,2]
   _BOX[X1+1,Y1+1,X2-1,Y2-1,2]
   _BOX[X1+2,Y1+1,X2-2,Y2-1,3]
   _BOX[X1+3,Y1+1,X2-3,Y2-1,3]
End Proc
Procedure _DRAW_ALL
   Ink 0
   Bar OFFSETX,OFFSETY To OFFSETX+296,OFFSETY+192
   _BOX3[0,0,296,192,3]
   Add OFFSETX,8 : Add OFFSETY,4
   TBASE=Text Base+OFFSETY+3
   _BOX2[0,0,262,120,2]
   _BOX2[266,0,279,100,2]
   Ink 3 : Bar 269+OFFSETX,3+OFFSETY To 276+OFFSETX,98+OFFSETY
   _BOX2[266,101,279,110,2]
   _BOX2[266,111,279,120,2]
   Ink 2
   Set Check 1,266+OFFSETX,101+OFFSETY To 280+OFFSETX,110+OFFSETY
   Set Check 2,266+OFFSETX,111+OFFSETY To 280+OFFSETX,120+OFFSETY
   _BOX3[60,122,280,135,2]
   Ink 3,0 : Text 6+OFFSETX,126+TBASE,"Pattern"
   _BOX3[60,137,280,149,2]
   Text 12+OFFSETX,140+TBASE,"Drawer"
   _BOX3[60,151,280,163,2]
   Text 24+OFFSETX,154+TBASE,"File"
   Text 28+OFFSETX,170+TBASE,"Ok       Volumes      Parent      Cancel"
   _BOX[1,170,61,182,2]
   _BOX[73,170,133,182,2]
   _BOX[145,170,205,182,2]
   _BOX[217,170,277,182,2]
   Ink 3
   X1=OFFSETX+270 : X2=OFFSETX+273 : X3=OFFSETX+276
   Draw X1,114+OFFSETY To X2,117+OFFSETY : Draw X2,117+OFFSETY To X3,114+OFFSETY
   Draw X1,115+OFFSETY To X2,118+OFFSETY : Draw X2,118+OFFSETY To X3,115+OFFSETY
   Draw X1,107+OFFSETY To X2,104+OFFSETY : Draw X2,104+OFFSETY To X3,107+OFFSETY
   Draw X1,108+OFFSETY To X2,105+OFFSETY : Draw X2,105+OFFSETY To X3,108+OFFSETY
   Y2=OFFSETY+182 : Y1=OFFSETY+170
   Set Check 3,OFFSETX+1,Y1 To OFFSETX+61,Y2
   Set Check 4,OFFSETX+73,Y1 To OFFSETX+133,Y2
   Set Check 5,OFFSETX+145,Y1 To OFFSETX+205,Y2
   Set Check 6,OFFSETX+217,Y1 To OFFSETX+277,Y2
End Proc
Procedure _OK
   Shared SEL_END
   If Right$(PATH$,1)=":"
      SEL$=PATH$+FILE$
   Else 
      SEL$=PATH$+"/"+FILE$
   End If 
   SEL_END=True
End Proc
Procedure _VOLUMES
   Shared _INTIALISE
   _INTIALISE=True
End Proc
Procedure _PARENT
   Shared NEW_PATH,TBASE,RELIST
   RELIST=True
   Wait Vbl : Repeat : Until Not Left Click
   For K=Len(PATH$) To 1 Step -1
      P$=Mid$(PATH$,K,1)
      If P$="/"
         PATH$=Mid$(PATH$,1,K-1)
         Exit 
      End If 
      If P$=":"
         PATH$=Mid$(PATH$,1,K)
         NEW_PATH=True
         Exit 
      End If 
   Next K
   P$=Right$(PATH$,35)
   Ink 3
   Text 66+OFFSETX,136+TBASE,P$+Space$(35-Len(P$))
End Proc
Procedure _CANCEL
   Shared SEL_END
   SEL$=""
   SEL_END=True
End Proc
Procedure _NUL
End Proc
