home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / clarion / dirdemo.zip / DIRECT.CLA < prev    next >
Text File  |  1990-03-21  |  13KB  |  350 lines

  1.          MEMBER('DIRDEMO')             !DIRECT.CLA
  2. DIREC_SHOW   FUNCTION( DIRECTORY, PATTERN )
  3.  
  4. SCREEN         SCREEN      WINDOW(15,71),PRE(SCR),HUE(15,1)
  5.            ROW(2,3)      PAINT(10,67),HUE(0,7)
  6.            ROW(1,1)      STRING('╔═══╡<0{13}>═{52}╗')
  7.            ROW(2,1)      REPEAT(10);STRING('║<0{69}>║') .
  8.            ROW(12,1)  STRING('╠═{9}<0{51}>═{9}╣')
  9.            ROW(13,1)  REPEAT(2);STRING('║<0{69}>║') .
  10.            ROW(15,1)  STRING('╚═{60}<0{8}>═╝')
  11.            ROW(13,31) STRING('<24,25>'),HUE(14,1)
  12.          COL(34)  STRING('PgUp PgDn'),HUE(14,1)
  13.            ROW(14,30) STRING('Enter = Select'),HUE(14,1)
  14.            ROW(15,62) STRING('Esc=Quit'),HUE(14,1)
  15. LU           ROW(2,3)      STRING(1),HUE(0,7)
  16. RU         COL(69)  STRING(1),HUE(0,7)
  17. LD           ROW(11,3)  STRING(1),HUE(0,7)
  18. RD         COL(69)  STRING(1),HUE(0,7)
  19. S_PATT           ROW(1,6)      STRING(13)
  20. MSG           ROW(12,11) STRING(51)
  21.            ROW(15,44) ENTRY,USE(?FIRST_FIELD)
  22.               REPEAT(10),INDEX(NDX)
  23.            ROW(2,4)        POINT(1,65),USE(?POINT),ESC(?-1)
  24. NAME         COL(5)        STRING(63)
  25.          .          .
  26.  
  27. PTR         LONG                 !ENTRY POINTER FOR KEY TABLE
  28. NDX         BYTE                 !REPEAT INDEX FOR POINT AREA
  29. ROW         BYTE                 !ACTUAL ROW OF SCROLL AREA
  30. COL         BYTE                 !ACTUAL COLUMN OF SCROLL AREA
  31. COUNT         BYTE(10)                 !NUMBER OF ITEMS TO SCROLL
  32. ROWS         BYTE(10)                 !NUMBER OF ROWS TO SCROLL
  33. COLS         BYTE(65)                 !NUMBER OF COLUMNS TO SCROLL
  34.  
  35.  
  36. DIRGRP         GROUP,PRE(GRP)
  37. DIRREC           GROUP
  38.          BYTE,DIM(21)             !USED BY NEXTDIR
  39. ATTRIB         BYTE                 !FILE ATTRIBUTE IN DOS FORMAT
  40. TIME         SHORT                 !FILE TIME IN DOS FORMAT
  41. DATE         SHORT                 !FILE DATE IN DOS FORMAT
  42. FILESIZE     LONG                 !FILE SIZE IN BYTES
  43. NAME         STRING(13)             !FILENAME
  44. PORS         STRING(9)             !PREVIOUS OR SUBDIRECTORY
  45.          . .
  46.  
  47. DIRTBL         TABLE,PRE(TBL)
  48. DIRECTRY       STRING(60)             !DIRECTORY
  49.          .
  50.  
  51. NO_FILES     EQUATE('NO MORE FILES')
  52. DIRECTORY    STRING(60)
  53. PATTERN         STRING(12)
  54. RET_STRING   STRING(60)
  55. SAVE_DIR     STRING(60),DIM(80)             !FOR DIRECTORY LEVEL READING
  56. SAVE_NAME    STRING(12),DIM(80)
  57. COUNTER         BYTE                 !LOOP COUNTER
  58. BACKING_UP   BYTE                 !FLAG
  59. FIRST_N_ROOT BYTE                 !FLAG
  60.  
  61.  
  62.   EJECT
  63.   CODE
  64.  
  65.   RET_STRING = ''
  66.  
  67.   IF OMITTED(1) OR DIRECTORY = ''         !IF PATH NOT SUPPLIED
  68.     DIRECTORY = PATH()                 !USE DEFAULT
  69.   .   ! END IF OMITTED(1) OR DIRECTORY = ''
  70.  
  71.   IF OMITTED(2) OR PATTERN = ''             !IF PATTERN NOT SUPPLIED
  72.     PATTERN = '*.*'                 !USE ALL
  73.   .   ! END IF OMITTED(2) OR PATTERN = ''
  74.  
  75.   CLEAR(SAVE_DIR[])                 !CLEAR ARRAY
  76.   SAVE_DIR[1] = DIRECTORY             !SAVE STARTING DIR
  77.  
  78.   ACTION# = ACTION                 !SAVE ACTION
  79.   OPEN(SCREEN)                     !OPEN THE SCREEN
  80.   SETCURSOR                     !TURN OFF ANY CURSOR
  81.   PTR = 1                     !START AT TABLE ENTRY
  82.   NDX = 1                     !PUT SELECTOR BAR ON TOP ITEM
  83.   ROW = ROW(?POINT)                 !REMEMBER TOP ROW AND
  84.   COL = COL(?POINT)                 !LEFT COLUMN OF SCROLL AREA
  85.   RECORDS# = TRUE                 !INITIALIZE RECORDS FLAG
  86.   LOOP                         !LOOP UNTIL USER EXITS
  87.     ACTION = ACTION#                 !RESTORE ACTION
  88.     ALERT                     !RESET ALERTED KEYS
  89.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  90.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  91.     ACCEPT                     !READ A FIELD
  92.     MEM:MESSAGE = ''                 !CLEAR MESSAGE AREA
  93.     IF KEYCODE() = REJECT_KEY THEN BREAK.     !RETURN ON SCREEN REJECT KEY
  94.  
  95.     EDIT_RANGE# = FIELD()             !SET ONE FIELD EDIT RANGE
  96.     IF KEYCODE() = ACCEPT_KEY AND |         !ON SCREEN ACCEPT KEY
  97.        EDIT_RANGE# <> ?POINT             ! AND NOT ON THE POINT FIELD
  98.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  99.       EDIT_RANGE# = ?POINT - 1             !  AND EDIT REMAINING FIELDS
  100.       SELECT(?POINT)                 !  IF OK THEN START HERE NEXT
  101.     .                         !
  102.  
  103.     LOOP FIELD# = FIELD() TO EDIT_RANGE#     !EDIT FIELDS IN THE EDIT RANGE
  104.  
  105.       CASE FIELD#                 !JUMP TO FIELD EDIT ROUTINE
  106.  
  107.       OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  108.     IF KEYCODE() = ESC_KEY OR |         !  RETURN ON ESC KEY
  109.        RECORDS# = FALSE             !  OR NO RECORDS
  110.          GOTO DONE                 !  TO SET RETURN AND CLEAR
  111.     .
  112.   PTR = 1                     !START AT TABLE ENTRY
  113.   NDX = 1                     !PUT SELECTOR BAR ON TOP ITEM
  114.   DO BUILD_TABLE                 !BUILD MEMORY TABLE OK KEYS
  115.     RECORDS# = TRUE                 !  ASSUME THERE ARE RECORDS
  116.       OF ?POINT                     !PROCESS THE POINT FIELD
  117.  
  118.     IF ~RECORDS(DIRTBL)             !IF THERE ARE NO RECORDS
  119.       TBL:DIRECTRY = '<<NO SUBS>'
  120.       ADD(DIRTBL)
  121.       PTR = 1                 !  POINT TO FIRST RECORD
  122.       NDX = 1                 !  POINT TO TOP ITEM
  123.       DO SHOW_TABLE
  124.       BREAK                     !    END THE EDITS
  125.     .   ! END IF ~RECORDS(DIRTBL)         !IF THERE ARE NO RECORDS
  126.  
  127.     CASE KEYCODE()                 !PROCESS THE KEYSTROKE
  128.  
  129.     OF ENTER_KEY                 !ENTER KEY OR
  130.     OROF ACCEPT_KEY                 !CTRL-ENTER KEY
  131.       DO GET_RECORD                 !  READ THE SELECTED RECORD
  132.       IF ERROR()                 !  IF RECORD HAS BEEN DELETED
  133.         MEM:MESSAGE = ERROR()         !    TELL USER WHAT HAPPENED
  134.         SELECT(?)                 !    STAY IN THE POINT FIELD
  135.         DO BUILD_TABLE             !    REBUILD TABLE
  136.         BREAK                 !    AND GET ANOTHER KEY
  137.       .
  138.  
  139.       ACTION = 0                 !    SET ACTION TO COMPLETE
  140.       GOTO DONE                 !  TO SET RETURN AND CLEAR
  141.  
  142.      !    OF INS_KEY                 !INS KEY
  143.  
  144.      !    OF DEL_KEY                 !DEL KEY
  145.  
  146.     OF DOWN_KEY                 !DOWN ARROW KEY
  147.       IF PTR <= RECORDS(DIRTBL)-COUNT     !  IF THERE ARE MORE ENTRIES
  148.         SCROLL(ROW,COL,ROWS,COLS,ROWS(?POINT)) !  SCROLL THE SCREEN UP
  149.         PTR += 1                 !    SET TO THE NEXT ENTRY
  150.         DO SHOW_RECORD             !    AND DISPLAY THE RECORD
  151.       .
  152.       DO ARROW_CHECK             ! SHOW OR REMOVE ARROWS
  153.  
  154.     OF PGDN_KEY                 !PAGE DOWN KEY
  155.       IF PTR >= RECORDS(DIRTBL)-COUNT+1     !  ON THE LAST PAGE
  156.         NDX = COUNT.             !    POINT TO BOTTOM ITEM
  157.       PTR += COUNT                 !  OTHERWISE
  158.       DO SHOW_TABLE                 !    DISPLAY THE NEXT PAGE
  159.  
  160.     OF CTRL_PGDN                 !CTRL-PAGE DOWN KEY
  161.       PTR = RECORDS(DIRTBL) - COUNT + 1     !  SET TO LAST PAGE
  162.       NDX = COUNT                 !  POINT TO BOTTOM ITEM
  163.       DO SHOW_TABLE                 !  DISPLAY THE LAST PAGE
  164.  
  165.     OF UP_KEY                 !UP ARROW KEY
  166.       IF PTR > 1                 !  IF THERE IS A PRIOR RECORD
  167.         PTR -= 1                 !    SET TO PRIOR RECORD
  168.         SCROLL(ROW,COL,ROWS,COLS,-(ROWS(?POINT)))! SCROLL THE SCREEN DOWN
  169.         DO SHOW_RECORD             !    DISPLAY THE RECORD
  170.       .
  171.       DO ARROW_CHECK             ! SHOW OR REMOVE ARROWS
  172.  
  173.     OF PGUP_KEY                 !PAGE UP KEY
  174.       IF PTR = 1 THEN NDX = 1.         !  ON FIRST PAGE POINT TO TOP
  175.       PTR -= COUNT                 !  OTHERWISE BACK UP 1 PAGE
  176.       DO SHOW_TABLE                 !  AND DISPLAY IT
  177.  
  178.     OF CTRL_PGUP                 !CTRL-PAGE UP
  179.       PTR = 1                 !  POINT TO FIRST RECORD
  180.       NDX = 1                 !  POINT TO TOP ITEM
  181.       DO SHOW_TABLE                 !  AND DISPLAY THE FIRST PAGE
  182.     .
  183.   . . .                         !
  184.  
  185.  
  186. DONE                         ! GOTO LABEL FOR RETURN
  187.   IF CLIP(TBL:DIRECTRY) <> '<<NO SUBS>'         ! IF OK SET RETURN STRING
  188.     RET_STRING = TBL:DIRECTRY
  189.   .   ! END IF CLIP(TBL:DIRECTRY <> '<<NO SUBS>'
  190.  
  191.   FREE(DIRTBL)                     !FREE MEMORY TABLE
  192.   RETURN(RET_STRING)                 !AND RETURN TO CALLER
  193.  
  194. BUILD_TABLE ROUTINE                 !BUILD MEMORY TABLE
  195.   SETHUE(31,1)
  196.   SCR:MSG = CENTER( 'Building List, Please Wait', SIZE(SCR:MSG) )
  197.   SETHUE()
  198.   FREE(DIRTBL)                     !EMPTY THE TABLE
  199.  
  200.   DIRECTORY = FULL_PATH(SAVE_DIR[1], PATTERN)     !SET TO PATH + PATTERN
  201.  
  202.   SCR:S_PATT = CLIP(PATTERN) & '<198>' & ALL('<205>')
  203.  
  204.   COUNTER = 1                     !START COUNTER
  205.   BACKING_UP = FALSE                 !FLAG FOR UP OR DOWN TREE
  206.   IF CLIP(SAVE_DIR[1]) = '\' OR LEN(CLIP(SAVE_DIR[1])) = 3 ! IF SEARCH IN ROOT
  207.     FIRST_N_ROOT = FALSE             !FLAG TO CORRECT DOS1 LEM ERR
  208.   ELSE
  209.     FIRST_N_ROOT = TRUE                 !FLAG TO CORRECT DOS1 LEM ERR
  210.   .   ! END IF CLIP(SAVE_DIR[1]) = '\'
  211.  
  212.   OMIT('END')
  213.  ╔═══════════════════════════════════════════════════════════════════════════╗
  214.  ║   The FIRST_N_ROOT flag simply alerts a later check that this search         ║
  215.  ║   started in a root directory.  This is because the DOS1.LEM seem to         ║
  216.  ║   return '.' and '..' if in subdirectory as the very first two entries.   ║
  217.  ║   However, if in the root dir, the DOS1.LEM sets itself to the first         ║
  218.  ║   name in the dir when SETDIR is called.  GRP:NAME can be checked after   ║
  219.  ║   a SETDIR call and it will be equal to the first dir entry.     I do not    ║
  220.  ║   believe it should get set until NEXTDIR, but it does get set.  This     ║
  221.  ║   caused problems backing up the Dir Tree into the root the first time.   ║
  222.  ║   (see loop below on backing up)  This is why the FIRST_N_ROOT variable   ║
  223.  ║   is used.                                     ║
  224.  ╚═══════════════════════════════════════════════════════════════════════════╝
  225.   END OMISSION
  226.  
  227.   SETDIR(DIRECTORY,DIRGRP)             !SET PATTERN FOR DIRECTORY
  228.   LOOP         !THRU ALL DIRECTORIES
  229.     LOOP       !LOOP THRU A DIRECTORY
  230.       NEXTDIR(DIRGRP)                 !  GET A DIRECTORY ENTRY
  231.       IF ERROR() =  NO_FILES             !  END LOOP IF NO MORE FILES
  232.     COUNTER -= 1                 !  SET COUNTER TO BACK UP LEVEL
  233.     BACKING_UP = TRUE             !  FLAG BACK UP ONE LEVEL
  234.     BREAK
  235.       ELSIF ERROR()
  236.     STOP(ERROR())
  237.       .      ! END IF ERROR() = NO_FILES         ! END LOOP IF NO MORE FILES
  238.  
  239.       IF GRP:NAME = '.'                 !  IF PREVIOUS DIR THEN CYCLE
  240.     CYCLE
  241.       ELSIF GRP:NAME = '..'             !  IF PREVIOUS DIR THEN CYCLE
  242.     CYCLE
  243.       ELSIF ~BAND(GRP:ATTRIB,10H)         !  IF ENTRY IS NOT SUB DIR
  244.     CYCLE
  245.       .                         !  END IF
  246.  
  247.       TBL:DIRECTRY = FULL_PATH(SAVE_DIR[COUNTER], GRP:NAME)
  248.  
  249.       ADD(DIRTBL)                 !  ADD TO TABLE
  250.       IF ERROR()                 !  IF THERE WAS AN ERROR
  251.     STOP(ERROR())                 !    DISPLAY ERROR MESSAGE
  252.       .                         !  END IF
  253.       COUNTER += 1                 !SET TO GO DOWN ONE LEVEL
  254.       SAVE_DIR[COUNTER] = TBL:DIRECTRY         !SAVE CURRENT DIR NAME
  255.       SAVE_NAME[COUNTER] = GRP:NAME         !SAVE CURRENT GRP:NAME
  256.       BREAK
  257.     .           !END LOOP THRU A DIRECTORY
  258.  
  259.     IF COUNTER < 1 THEN BREAK.             !NO FILES LEFT IN ROOT
  260.     DIRECTORY = FULL_PATH(SAVE_DIR[COUNTER], PATTERN)
  261.     SETDIR(DIRECTORY,DIRGRP)             !SET PATTERN FOR DIRECTORY
  262.     IF BACKING_UP                 !BACKING UP DIR TREE
  263.       BACKING_UP = FALSE
  264.       IF COUNTER = 1 AND ~FIRST_N_ROOT         !CAN NOT EXPLAIN THIS ONE
  265.                          !WHENEVER SETDIR SETS TO
  266.                          !ROOT, GRP:NAME RETURNS AS
  267.                          !FIRST DIR ENTRY, EVEN BEFORE
  268.                          !DOING NEXTDIR. THIS WOULD NOT
  269.                          !ALLOW BACKUP LOOP TO EVEN
  270.                          !START.  SEEMS TO BE A BUG
  271.                          !IN THE DOS LEM.
  272.     FIRST_N_ROOT = TRUE
  273.     NEXTDIR(DIRGRP)                 !  GET A DIRECTORY ENTRY
  274.       ELSE
  275.     LOOP UNTIL CLIP(SAVE_NAME[COUNTER + 1]) = CLIP(GRP:NAME) !RE-POSITION
  276.       NEXTDIR(DIRGRP)             !  GET A DIRECTORY ENTRY
  277.       IF ERROR() THEN STOP(ERROR()).     !
  278.     .   ! END LOOP UNTIL CLIP(SAVE_NAME[COUNTER + 1]) = CLIP(GRP:NAME)
  279.       .      ! END IF COUNTER = 1 AND ~FIRST_N_ROOT
  280.     .    ! END IF BACKING_UP
  281.  
  282.   .  ! END LOOP THRU ALL DIRECTORIES
  283.  
  284.   DO SORT_TABLE
  285.   SCR:MSG = ALL('<205>')             !RE-FILL TRACK
  286.   DO SHOW_TABLE                     !DISPLAY A PAGE OF RECORDS
  287.  
  288.  
  289. SORT_TABLE ROUTINE                 !SORT TABLE ENTRIES
  290.   SETHUE(31,1)
  291.   SCR:MSG = CENTER( 'Sorting List', SIZE(SCR:MSG) )
  292.   SETHUE()
  293.   SORT(DIRTBL,TBL:DIRECTRY)             !SORT TABLE INTO KEY SEQUENCE
  294.  
  295. SHOW_TABLE ROUTINE                 !DISPLAY A PAGE OF RECORDS
  296.   IF PTR > RECORDS(DIRTBL)-COUNT+1         !  FOR A PARTIAL PAGE
  297.     PTR = RECORDS(DIRTBL)-COUNT+1.         !    SET TO THE LAST RECORD
  298.   IF PTR < 1 THEN PTR = 1.             !    AND BACK UP ONE PAGE
  299.   NDX# = NDX                     !  SAVE REPEAT INDEX
  300.   LOOP NDX = 1 TO COUNT                 !  LOOP THRU THE SCROLL AREA
  301.     IF NDX > RECORDS(DIRTBL) THEN BREAK.
  302.     DO SHOW_RECORD                 !    DISPLAY A RECORD
  303.   .                         !
  304.   NDX = NDX#                     !  RESTORE REPEAT INDEX
  305.   IF NDX > RECORDS(DIRTBL) THEN NDX = RECORDS(DIRTBL).!SHOWING THE LAST
  306.   IF RECORDS(DIRTBL) < COUNT             !  IF RECORDS DO NOT FILL
  307.      NDX#= RECORDS(DIRTBL) * 1             !     GET NUMBER TIMES SIZE
  308.      BLANK(ROW + NDX#,COL,ROWS-NDX#,COLS)     !     BLANK REMAINING AREA
  309.   .
  310.  
  311.   DO ARROW_CHECK                 ! SHOW OR REMOVE ARROWS
  312.  
  313. SHOW_RECORD ROUTINE                 !DISPLAY A RECORD
  314.   GET(DIRTBL,PTR+NDX-1)                 !  GET THE TABLE ENTRY
  315.   IF ~ERROR()
  316.     DO SHOW_LINE                 !    DISPLAY SCROLLING LINE
  317.   .   ! END IF ~ERROR()
  318.  
  319. SHOW_LINE    ROUTINE                 !DISPLAY SCROLLING LINE
  320.   SCR:NAME = TBL:DIRECTRY
  321.  
  322. GET_RECORD ROUTINE                 !READ SELECTED RECORD
  323.   GET(DIRTBL,PTR+NDX-1)                 !  GET THE TABLE ENTRY
  324.  
  325. FIND_RECORD ROUTINE                 !LOCATE REQUESTED RECORD
  326.   GET(DIRTBL,TBL:DIRECTRY)             !  GET THE TABLE ENTRY
  327.   PTR = POINTER(DIRTBL)                 !  SET RECORD POINTER
  328.   IF ~PTR THEN PTR = RECORDS(DIRTBL).         !  SET TO LAST IF NO POINTER
  329.   GET(DIRTBL,PTR)                 !  AND READ THE DATA RECORD
  330.   DO SHOW_TABLE                     !  DISPLAY THAT PAGE
  331.  
  332.  
  333. ARROW_CHECK  ROUTINE
  334.  
  335.   IF PTR = 1
  336.     SCR:LU = ''
  337.     SCR:RU = ''
  338.   ELSE
  339.     SCR:LU = '<24>'
  340.     SCR:RU = '<24>'
  341.   .   ! END IF PTR = 1
  342.  
  343.   IF PTR >= RECORDS(DIRTBL)-COUNT+1         !  ON THE LAST PAGE
  344.     SCR:LD = ''
  345.     SCR:RD = ''
  346.   ELSIF PTR <= RECORDS(DIRTBL)-COUNT         !  IF THERE ARE MORE ENTRIES
  347.     SCR:LD = '<25>'
  348.     SCR:RD = '<25>'
  349.   .   ! END IF PTR >= RECORDS(DIRTBL)-COUNT+1     !  ON THE LAST PAGE
  350.