/* Program to use Metaview to display a whole directory of files, including subdirectories. An assign to Metaview: is needed.  */

/* Written by Don Cox, Nov 97. Copyright, not Public Domain. */
/* $VER:SlideShowMV Nov19 97 */


call open("STDERR","ram:traceSS","W")
trace r

options results
numeric digits 14


/* +++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++ */

address command
dir1 = getclip('FileSortIn')
if dir1 ~= "" then 'requestfile >ram:answer DRAWER "'dir1'" TITLE "Source Directory" DRAWERSONLY'
else 'requestfile >ram:answer TITLE "Source Directory" DRAWERSONLY'
call open("answer","ram:answer",'R')
directory = strip(readln("answer"),'B','"')
call setclip('FileSortIn',directory)

'REQUESTCHOICE >ram:rcnum1 "Display Time"  "Seconds per image" "1|3|5|7|Abort"'

call open("answer3","ram:rcnum1")
rcn = readln("answer3")
SecsPerImage = rcn
if rcn = 0 then exit


/* Looking for our start process */

/*
** Create a new Metaview process:
** first look for the allready running processes
** then the new Port will be the next one
*/

do NUMBER = 0 to 20
    if (SHOW(PORTS,"METAVIEW." || NUMBER) = 0) then
    leave
end

/*
** Searching for MetaView: 1. our path above,
**    2. path in env:MetaView.path
** or 3. you must have a assign "MetaView:"
*/

if (EXISTS(METAVIEW)=0) then do
    if OPEN("MVVAR","env:MetaView.path","Read") then do
        METAVIEW = READLN("MVVAR")
        METAVIEWpath= getpath(METAVIEW)
        address command
        'assign METAVIEW: 'METAVIEWpath
    end
    if (EXISTS(METAVIEW)=0) then do
        METAVIEW = "MetaView:MetaView"
    end
end

/*
** Enable warnings for WaitForPort
*/

OPTIONS FAILAT 5
ADDRESS COMMAND
    "run " || METAVIEW 
    MVPORT = "METAVIEW." || NUMBER
    "WaitForPort " || MVPORT


address value MVPORT


/* Display files in one directory and its descendents */

imagecount = 1
newfile = ""
oldfile = ""

address command
'delete Metaview:dirlist1'
'delete Metaview:dirlist'
'list >Metaview:dirlist1 "'directory'" dirs all LFORMAT="%P%S"'
'sort from Metaview:dirlist1 to Metaview:dirlist'
call open("dirinput","Metaview:dirlist","r")

/* First display pics in root directory */
'delete Metaview:filelist1'
'delete Metaview:filelist'
'list >Metaview:filelist1 "'directory'" files LFORMAT="%P%S"'
call open('input',"Metaview:filelist1","r") /* test in case it's empty */
listtest = readln('input')
call close('input')

if listtest~="" then do
    'sort from Metaview:filelist1 to Metaview:filelist'
    call dirdisplay
    end


/* Now do all the subdirectories */

if~exists("Metaview:dirlist") then wayout()

listtest = readln("dirinput")
call seek("dirinput",0,'B')
dirtrees = 0
if listtest~="" then do
    'REQUEST "Show images in Subdirectories?" "Yes|No"' 
    dirtrees = rc
    end

do d = 1 to 700
    dirname = readln("dirinput")
    if dirname = "" then break
    address command
    'delete Metaview:filelist1'
    'delete Metaview:filelist'
    'list >Metaview:filelist1 "'dirname'" files LFORMAT="%P%S"'
    call open('input2',"Metaview:filelist1","r") /* test in case it's empty */
    listtest = readln('input2')
    call close('input2')

    if listtest~="" then do
        'sort from Metaview:filelist1 to Metaview:filelist'
        call dirdisplay
        end
    end

wayout:
address value MVPORT
'REQUEST "   Finished   "'
exit
end

/* ++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++ */


getpath:
parse arg allname
pos1 = lastpos("/",allname)
if pos1 = 0 then pos1 = lastpos(":",allname)
filepath = left(allname,pos1)
return filepath

getname:
parse arg allname
pos1 = lastpos("/",allname)
if pos1 = 0 then pos1 = lastpos(":",allname)
justname = substr(allname,pos1+1)
return justname 

expandfilename: procedure
  parse arg jfile;
  if index(jfile,':') = 0 then do
    curdir = pragma(D);
    if right(curdir,1) ~= ':' then do
      if right(curdir,1) ~= '/' then do
        if curdir ~= '' then do
          curdir = curdir || '/';
          end;
        end;
      end;
    jfile = curdir||jfile;
    end;
  return jfile

rounded: procedure
parse arg number
originalNumber = number
number = trunc(number)
if (originalNumber-number)>0.5 then number=number+1
return number


/* ++++++++++++++++++++++++++++++  ++++++++++++++++++++++++++++++++++*/

/* Display all the pics in one directory */
dirdisplay:
address value MVPORT


call open('input3',"Metaview:filelist","r")
do i = 1 to 7000   /* safety limit of 7000 files  */
    filename = readln('input3')
    if filename = "" then break
    
    slashpos = lastpos("/",filename)
    dotpos = lastpos(".",filename)
    if dotpos<slashpos then dotpos = 0 /* not dots in directory names */
    if dotpos~=0 then extension = upper(substr(filename,dotpos))
    else extension = ""
    extensionlist = ".INFO .ILBM .GIF .PSFONT .FONT .PDFONT .PFB .AFM .METRIC .LIB .DEM .DOC .TXT .WP .README .ME .ZIP .ARC .ME .DAT .EXE .PIF .INI .TF .DB .C .H .GF .PPRX .PDRX .REXX .ADPRO .CFG .PREFS .HTM .HTML"
    if pos(upper(extension),extensionlist)~=0 then iterate i
    if word(filename,2) = "files" then iterate i /* This line not a file name */
    if filename="Ram:traceSS" then iterate i
    if word(filename,1) = "TOTAL:" then break  /* or this one */

    if upper(extension) = ".LHA" then call UnArc()
    else success = showpic()


    end    /* end of directory */

call close('input3')


return

/* +++++++++++++++++++++++++++++++  +++++++++++++++++++++++++++++++++ */

showpic:

if ~open("picinput",filename,"R") then return 1
chunks = readch("picinput",1000)
call close("picinput")

address value MVPORT

'LOAD "'filename'"' /* Quotes allow file names with spaces */
if rc ~=0 then return 1 /* if load fails, try the next one */
newfile = result

address command
"wait "SecsPerImage
address value MVPORT

return 0

/* ++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++ */

/* Unarchive LHA files to HD and display temporary dir */
UnArc:
if ~exists("c:lha") then return 1
address command
if exists("Metaview:ssarc") then 'delete Metaview:ssarc all' /* gets rid of any crash-producing files left from previous run */
'makedir Metaview:ssarc'

'lha e -f "'filename'" Metaview:ssarc/'


/* Display files in archive directory and its descendents. LHA files within LHA files are NOT expanded. */

arcimagecount = 1

address command
'delete Metaview:arcdirlist1'
'delete Metaview:arcdirlist'
'list >Metaview:arcdirlist1 Metaview:ssarc dirs all LFORMAT="%P%S"'
'sort from Metaview:arcdirlist1 to Metaview:arcdirlist'
call open("arcdirinput","Metaview:arcdirlist","r")

/* First display pics in root directory */
'delete Metaview:arcfilelist1'
'delete Metaview:arcfilelist'
'list >Metaview:arcfilelist1 Metaview:ssarc files LFORMAT="%P%S"'
call open('arcinput',"Metaview:arcfilelist1","r") /* test in case it's empty */
listtest = readln('arcinput')
call close('arcinput')

if listtest~="" then do
    'sort from Metaview:arcfilelist1 to Metaview:arcfilelist'
    call arcdirdisplay
    end


/* Now do all the archive subdirectories */

if~exists("Metaview:arcdirlist") then return

listtest = readln("arcdirinput")
call seek("arcdirinput",0,'B')

do d = 1 to 700
    arcdirname = readln("arcdirinput")
    if arcdirname = "" then break
    address command
    'delete Metaview:arcfilelist1'
    'delete Metaview:arcfilelist'
    'list >Metaview:arcfilelist1 "'arcdirname'" files LFORMAT="%P%S"'
    call open('arcinput2',"Metaview:arcfilelist1","r") /* test in case it's empty */
    listtest = readln('arcinput2')
    call close('arcinput2')

    if listtest~="" then do
        'sort from Metaview:arcfilelist1 to Metaview:arcfilelist'
        address "IMAGEENGINEER"
        call arcdirdisplay
        end
    end
call close("arcdirinput")
'delete Metaview:ssarc all'
return

/* +++++++++++++++++++++++++++++  ++++++++++++++++++++++++++++++++++  */

arcdirdisplay:

call open('inputarc',"Metaview:arcfilelist","r")
do a = 1 to 7000   /* safety limit of 7000 files  */
    address command
    filename = readln('inputarc')
    if filename = "" then break
    
    slashpos = lastpos("/",filename)
    dotpos = lastpos(".",filename)
    if dotpos<slashpos then dotpos = 0 /* not dots in directory names */
    if dotpos~=0 then extension = upper(substr(filename,dotpos))
    else extension = ""
    /* Note: this time filter out LHA files */
    extensionlist = extensionlist||" .LHA"
    if pos(upper(extension),extensionlist)~=0 then iterate a
    if word(filename,2) = "files" then iterate /* This line not a file name */
    if left(filename,9)="Ram:trace" then iterate
    if word(filename,1) = "TOTAL:" then break  /* or this one */

    success = showpic()
    end    /* end of directory */

call close('inputarc')


return 0

