'===========================================================================
' Subject: SIMPLE FILE BROWSER                Date: 02-29-96 (14:39)       
'  Author: Alexander Podkolzin                Code: PB32                   
'  Origin: APP@nw.sbank.e-burg.su           Packet: TEXT.ABC
'===========================================================================
'--------------------------------------------------------------------------
' Simple File Browser. Author: Alexander Podkolzin <APP@nw.sbank.e-burg.su>
' Use it as you want...
' PowerBASIC 3.2
'--------------------------------------------------------------------------
$CPU 8086
$OPTIMIZE SIZE
$COMPILE EXE
$DEBUG MAP OFF
$DEBUG PBDEBUG OFF
$LIB ALL       OFF
$ERROR ALL     OFF
$COM    0
$STRING 4
$STACK  2048
$SOUND  1
$DIM ARRAY
$DYNAMIC
$OPTION CNTLBREAK OFF
'--------------------------------------------------------------------------
  %MaxLines = 5000                      ' Max strings to show
  %MaxLen=240                           ' Max LEN of a string
'
  DEFINT a-z
  DIM txt$(%MaxLines)
'
  InsKey$=CHR$(0,82)                    ' Key codes
  Enter$=CHR$(13)
  Esc$ = CHR$(27)
  Home$ = CHR$(0,71)
  PgUp$ = CHR$(0,73)
  EndKey$ = CHR$(0,79)
  PgDn$ = CHR$(0,81)
  Up$ = CHR$(0,72)
  Down$ = CHR$(0,80)
  LeftKey$ = CHR$(0,75)
  RightKey$ = CHR$(0,77)
  CtrlPgUp$ = CHR$(0,132)
  CtrlPgDn$ = CHR$(0,118)
  CtrlHome$ = CHR$(0,119)
  CtrlEnd$ = CHR$(0,117)
'
  Twin%=1                               ' Win type
  xb%=1 : yb%=2 : xe%=80 : ye%=24       ' Edit window coordinates
'
  ct%=7                                 ' Main colors
  cb%=0                                 '
'
  FileName$ = COMMAND$                  ' File to edit
'
  IF NOT FileExists(FileName$) THEN
     PRINT "Command line <FileName> not found..."
     BEEP
     END
  END IF
'
  src% = FREEFILE
  OPEN FileName$ FOR INPUT AS src%
  i%=0
  DO WHILE EOF(src%)=0 AND i% < %MaxLines
     INCR i%
     LINE INPUT #src%,txt$(i%)
     IF txt$(i%)="" THEN txt$(i%)=" "
     REPLACE CHR$(9) WITH "        " IN txt$(i%)
  LOOP
  CLOSE src%
  nlines%=i%
'
  COLOR 0,7
  LOCATE 1,1
  PRINT SPACE$(80);
  LOCATE 1,4
  PRINT "File = ";FileName$;
  LOCATE 25,1
  PRINT SPACE$(80);
'
  COLOR ct%,cb%
'
  lpage%=ye%-yb%-1
  CALL win(twin%,xb%,yb%,xe%,ye%,ct%,cb%)
  Aprint 3,ye%,"´     :   =   Ã"
'
  begx%=1
  begy%=1
  endy%=MIN(lpage%,nlines%)
  CurY%=1
  CurX%=1
  GOSUB ShowText
  GOSUB ShowCursor
  DO
     GOSUB ShowCursor
     WHILE NOT INSTAT: WEND             ' begy% - first line to show,
     IF nlines%<1 THEN EXIT LOOP        ' endy% - last line to show (array)
     k$=INKEY$                          ' CurY%  - the cursor bar line
     SELECT CASE k$                     ' lpage%- length of window (page)
        CASE InsKey$
           : ITERATE LOOP
        CASE Esc$
           : CurY%=0 : begy%=1:EXIT LOOP
        CASE Enter$
           : EXIT LOOP
        CASE Home$
           : CurX%=2 : begx%=1
        CASE EndKey$
           : l%=LEN(txt$(begy%+CurY%-1))
           : CurX%=MIN(l%+1,78)+1
           : endx%=MAX(l%+1,78)+1
           : begx%=endx%-78
        CASE Up$
           IF CurY%>1 THEN
              DECR CurY%
           ELSE
              begy%=begy%-1
              endy%=endy%-1
           END IF
        CASE Down$
           IF CurY%<lpage% THEN
              INCR CurY%
           ELSE
              begy%=begy%+1
              endy%=endy%+1
           END IF
        CASE LeftKey$
           IF CurX%>2 THEN
              DECR CurX%
           ELSE
              begx%=begx%-1
              IF begx%<1 THEN begx%=1
           END IF
        CASE RightKey$
           IF CurX% < 79 THEN
              INCR CurX
              Show=0
           ELSE
              INCR begx
              IF begx >%MaxLen-79 THEN begx=%MaxLen-79
           END IF
        CASE PgUp$
           : begy%=begy%-lpage%
           : endy%=endy%-lpage%
        CASE PgDn$
           : begy%=begy%+lpage%
           : endy%=endy%+lpage%
        CASE CtrlPgUp$
           : begy%=1
           : endy%=begy%+lpage%-1
           : CurX%=2
           : CurY%=1
        CASE CtrlPgDn$
           : endy%=nlines%
           : begy%=endy%-lpage%+1
           : CurX%=2
           : CurY%=21
        CASE CtrlHome$
           : CurY%=1
        CASE CtrlEnd$
           : CurY%=21
        CASE ELSE
           : k$=""
     END SELECT
     GOSUB ShowText
  LOOP
  CLS
  END
'--------------------------------------------------------------------------

ShowText:
  CALL Numerer(nlines%,lpage%,begy%,endy%)
  GOSUB MakeRuler
  FOR i%=begy% TO endy%
     Aprint xb%+1,yb%+i%-begy%+1,_
     MID$(txt$(i%)+SPACE$(xe%-xb%+1),begx%,78)
  NEXT i%
  RETURN
'--------------------------------------------------------------------------

ShowCursor:
  LOCATE ye%,4,0
  PRINT RIGHT$("0000"+LTRIM$(STR$(begy%+CurY%-1)),5)
  LOCATE ye%,10,0
  PRINT RIGHT$("00"+LTRIM$(STR$(begx%+Curx%-2)),3)
  IF CurX%< 2 THEN CurX%= 2
  IF CurX%>79 THEN CurX%=79
  LOCATE ye%,14,0
  PRINT RIGHT$("00"+LTRIM$(STR$(SCREEN(CurY%+2,CurX%))),3)
  LOCATE yb%+CurY%,CurX,1
  RETURN
'--------------------------------------------------------------------------

MakeRuler:
  FOR i%=yb%+1 TO ye%-1
     Aprint xe%,i%,CHR$(177)
  NEXT
  k%=((begy%+CurY%-1)/nlines%)*(ye%-yb%-1)
  IF k%=0 THEN k%=1
  Aprint xe%,yb%+k%,CHR$(219)
  RETURN
'--------------------------------------------------------------------------
  SUB Numerer(nlines%,lpage%,begy%,endy%)
     IF nlines%<=lpage% THEN
        begy%=1
        endy%=nlines%
        EXIT SUB
     END IF
     IF begy%<1 THEN
        begy%=1
        endy%=begy%+lpage%-1
        EXIT SUB
     END IF
     IF begy%+lpage%-1>=nlines% THEN
        endy%=nlines%
        begy%=nlines%-lpage%+1
        EXIT SUB
     END IF
     endy%=begy%+lpage%-1
  END SUB
'--------------------------------------------------------------------------
  SUB Win(t%,xb%,yb%,xe%,ye%,ct%,cb%)
'
     OldColor% = pbvScrnTxtAttr         ' Internal PB variable
     SELECT CASE t%                     ' Window types
'                                       ' (you can make as much types,
'                                       '  as you want):
        CASE 1
           a%=218:b%=196:c%=191         'ÚÄÄÄÄÄÄÄ¿
           h%=179:      :d%=179         '³   1   ³
           g%=192:f%=196:e%=217         'ÀÄÄÄÄÄÄÄÙ
        CASE 2
           a%=201:b%=205:c%=187         'ÉÍÍÍÍÍÍÍ»
           h%=186:      :d%=186         'º   2   º
           g%=200:f%=205:e%=188         'ÈÍÍÍÍÍÍÍ¼
        CASE ELSE
           a%=032:b%= a%:c%= a%         '
           h%= a%:      :d%= a%         ' Blanks only
           g%= a%:f%= a%:e%= a%         '
     END SELECT
     COLOR ct%,cb%
     LOCATE yb%,xb%
     PRINT CHR$(a%)+REPEAT$(xe%-xb%-1,CHR$(b%))+CHR$(c%);
     FOR i%=yb%+1 TO ye%-1
        LOCATE i%,xb%
        PRINT CHR$(h%)+ SPACE$(xe%-xb%-1) +CHR$(d%);
     NEXT
     LOCATE ye%,xb%
     PRINT CHR$(g%)+REPEAT$(xe%-xb%-1,CHR$(f%))+CHR$(e%);
     ct%=OldColor% AND 15               ' restore colors
     cb%=OldColor%\16
     COLOR ct%,cb%
  END SUB
'--------------------------------------------------------------------------
  SUB Aprint(x%,y%,st$)
     ox%=POS(0)
     oy%=CSRLIN
     LOCATE y%,x%,0
     PRINT st$;
     LOCATE oy%,ox%,1
  END SUB
'--------------------------------------------------------------------------
FUNCTION FileExists%(FileName$)
  S$=DIR$(FileName$)
  IF LEN(S$) = 0 THEN
     FileExists% =  0
  ELSE
     FileExists% = -1
  END IF
END FUNCTION
'--------------------------------------------------------------------------
