/*
   MARInA System © TNE) 1998

   FileManager.rexx
   Full featured and fast FileManager based on RexxReqTools.

   Date:        07/98
   Author:      Thomas Neidhardt (TNE), Deutschland, Erlangen

   InterNet:    ft112@fen.baynet.de

   Needs:       RexxReqTools Package by Rafael D'Halleweyn ( rdhall@rug.ac.be )
                and the MARInA Configuration Environment.

   Referenced by:  ${RefTable/File-Manager}

   with Options:   ${RefTable/File-CopyServer}
                   ${RefTable/File-MoveServer}
                   ${RefTable/File-MoveAs}
                   ${RefTable/File-SaveAs}
                   ${RefTable/File-Info-Server}
                   ${RefTable/File-ScriptLink}
                   ${RefTable/File-RenameServer}
                   ${RefTable/File-Comment}
*/

PARSE ARG ChosenFiles

OPTIONS RESULTS
OPTIONS FAILAT 21

CALL Init

/* ----------------------- */
Main:

ExitProg = 0

Option = LEFT(ChosenFiles, 6)


IF (Option = '-CopyF' | Option = '-MoveF' | Option = '-Ren_F' | Option = '-InfoF' | Option = '-Fnote' | Option = '-SavAs' | Option = '-MovAs' | Option = '-fLink') THEN
 DO
   Length = LENGTH(ChosenFiles)
   ChosenFiles = RIGHT(ChosenFiles, Length-6)

   IF (ChosenFiles = '') THEN CALL FM_HelpArg

   CALL FileParser

   IF (Option = '-CopyF') THEN
    DO
       AppName = "© TNE) Copy"

       SampleAction = SampleCopy
       SampleDone = SampleCopied

       ActualPathDest = ActualPath
       FilesKill = 0
       CALL Copy_Move
       CALL ExitMe
    END

   IF (Option = '-MoveF') THEN
    DO
       AppName = "© TNE) Move"

       SampleAction = SampleMove
       SampleDone = SampleMoved

       ActualPathDest = ActualPath
       FilesKill = 1
       CALL Copy_Move
       CALL ExitMe
    END

   IF (Option = '-SavAs') THEN
    DO
       AppName = "© TNE) SaveAs"
       DestMsg = 'File_SaveAs.2'

       ActualPathDest = ActualPath
       FilesKill = 0
       CALL SaveMoveAs
       CALL ExitMe
    END

   IF (Option = '-MovAs') THEN
    DO
       AppName = "© TNE) MoveAs"
       DestMsg = 'File_SaveAs.3'

       ActualPathDest = ActualPath
       FilesKill = 1
       CALL SaveMoveAs
       CALL ExitMe
    END

   IF (Option = '-Ren_F') THEN
    DO
       AppName = "© TNE) Rename"

       CALL RenameIt
       CALL ExitMe
    END

   IF (Option = '-InfoF') THEN
    DO
       AppName = "© TNE) Info"

       CALL FileInfo
       CALL ExitMe
    END

   IF (Option = '-Fnote') THEN
    DO
       AppName = "© TNE) FileNote"

       CALL FileNote
       CALL ExitMe
    END

   IF (Option = '-fLink') THEN
    DO
       AppName = "© TNE) File-ScriptLink"

       CALL ScriptLink
       CALL ExitMe
    END
 END
ELSE /* Other or no Arguments */
 DO

  CALL PlaySample(SampleChooseFiles)

  DO FOREVER

   CALL LoadFile
   IF (ExitProg=1) THEN LEAVE

   CALL FileAction

   ChosenFiles = ''
   drop Action
   drop Files

  END

 END

CALL ExitMe

/* ------------------------- */
FM_HelpArg:

 r=ShowMessage('FileManager.0',,,,AppName)

 CALL ExitMe

/*--------------------------------------------*/
FileAction:

CALL PlaySample(SampleChooseOp)

DO FOREVER  /* for online-Help Support and retrace */

 /* Create max. 5 lines FileList and show Action-Request */

 Msg = 'FileManager.2'
 Flist = Files.1
 DO k=2 to 5 WHILE Files.count >= k
    Flist = Flist''CR'   'Files.k
 END

 IF (Files.count > k-1) THEN
  DO
    Msg = 'FileManager.1'
    Flist = Flist''CR'   'Path'...'
    Param3 = Files.count
  END
 ELSE
    Param3 = ''

 Action=ShowMessage(Msg,,,,AppName,Flist,Param3)  /* Ask for Action */


 /* ---------------- */

 IF (Action = Cancel) THEN
  DO
    Target = Path
    LEAVE
  END

 IF (Action = Edit) THEN CALL Edit

 IF (Action = filemoni) THEN CALL FileMon

 /* ---------------- */

 IF (Action=Copy) THEN
  DO
    FilesKill = 0
    SampleAction = SampleCopy
    SampleDone = SampleCopied
    CALL Copy_Move
  END

 IF (Action=Move) THEN
  DO
    FilesKill = 1
    SampleAction = SampleMove
    SampleDone = SampleMoved
    CALL Copy_Move

    LEAVE
  END

 IF (Action=Delete) THEN
  DO
    ADDRESS COMMAND '${RefTable/File-Trash} -FList 'FileList

    LEAVE
  END

 IF (Action=OpenWith) THEN
  DO
    ADDRESS COMMAND '${RefTable/File-Starter} -FList 'FileList

    LEAVE
  END

 IF (Action=Rename) THEN
  DO
    CALL RenameIt
    LEAVE
  END

 IF (Action=info) THEN CALL FileInfo

 IF (Action=help) THEN
  DO
    Action=ShowMessage('FileManager.4',,,,AppName)

    IF (Action=1) THEN r=ShowMessage('FileManager.5',,,,AppName)
  END

END /* FOREVER */

RETURN

/*--------------------------------------------*/
LoadFile:

 IF (~EXISTS(ActualPath) | ActualPath = "") THEN
   ActualPath = "SYS:"

 IF (ChosenFiles="" | "CHOSENFILES" = ChosenFiles) THEN
  DO

   IF (FileWas='FILEWAS') THEN FileWas=''

   ChosenFiles=ShowMessage('FileManager.3',ActualPath,FileWas,,AppName)

   IF (ChosenFiles='') THEN
   DO
      ExitProg=1
      RETURN
   END
  END

 CALL FileParser
 ActualPath=Path
 FileWas = FileName.1

 ADDRESS COMMAND
 'setenv ActualPath "'Path'"'
 'copy ENV:ActualPath ENVARC: CLONE QUIET'

RETURN

/*--------------------------------------------*/
Edit:

 CALL PlaySample(SampleEdit)

 DO k=1 to Files.count
    ADDRESS COMMAND '${RefTable/Text-Editor-Starter} "'Files.k'"'
 END

RETURN

/*--------------------------------------------*/
FileMon:

  CALL PlaySample(SampleFileMon)

  DO k=1 to Files.count
     ADDRESS COMMAND 'MARInA_bin:wbrun ${RefTable/File-Monitor} "'Files.k'" ${RefTable/File-Monitor-Opts} SYNC'
  END
RETURN

/*--------------------------------------------*/
FileNote:

 FileCommentDump = 'FN_Comment_'ProcessNumber

 DO k=1 to Files.count

   ADDRESS COMMAND 'SYS:c/list >ENV:'FileCommentDump' "'Files.k'" LFORMAT "%c"'

   ActualComment = MyGetENV(FileCommentDump)

   length   = LENGTH(File)
   IF (length > 55) THEN
    FileString = '...' || RIGHT(File, 52)
   ELSE
    FileString = Files.k

   drop Comment
   Comment=ShowMessage('FileNoteMaker.1',,,ActualComment,AppName,FileString,ActualComment)

   IF (Action=1) THEN ADDRESS COMMAND 'SYS:c/FileNote "'Files.k'" "'Comment'"'

   ADDRESS COMMAND 'delete ENV:'FileCommentDump' QUIET'
 END

drop FileCommentDump

RETURN

/*--------------------------------------------*/
RenameIt:

  CALL PlaySample(SampleRename)

  DO k=1 to Files.count

    NewName=ShowMessage('File_Rename.1',,,FileName.k,FileName.k)
    IF (Action=0) THEN LEAVE

    CALL PRAGMA('DIRECTORY', Path.k)
    ADDRESS COMMAND 'rename "'FileName.k'" "'NewName'" QUIET'

    IF EXISTS(FileName.k'.info') THEN ADDRESS COMMAND 'rename "'FileName.k'.info" "'NewName'.info" QUIET'

    CALL PRAGMA('DIRECTORY', 'T:')
  END

RETURN

/*--------------------------------------------*/
FileInfo:

 CALL PlaySample(SampleFileInfo)


 DO k=1 to Files.count

   ActualFile = Files.k

   DO FOREVER

     str_AttrSource = GetFileAttributes(ActualFile)

     Action=ShowMessage('File_Info.1',,,,AppName,str_AttrSource)

     IF (Action=0 | Action=1) THEN LEAVE

     IF (Action=2) THEN ADDRESS COMMAND '${RefTable/ManualServer} "'FileName.k'"'

     IF (Action=3) THEN
     DO
       TrueCount = Files.count  /* Store State */
       TrueFirstFile = Files.1
       ActualFile = Files.k
       ActualNum = k

       Files.count = 1          /* Manipulate for internal use */
       Files.1 = Files.k

       CALL FileMon

       Files.count = TrueCount   /* Restore */
       Files.1 = TrueFirstFile
       Files.k = ActualFile
       k = ActualNum
     END

     IF (Action=4) THEN
     DO
       TrueCount = Files.count  /* Store State */
       TrueFirstFile = Files.1
       ActualFile = Files.k
       ActualNum = k

       Files.count = 1          /* Manipulate for internal use */
       Files.1 = Files.k

       CALL FileNote

       Files.count = TrueCount   /* Restore */
       Files.1 = TrueFirstFile
       Files.k = ActualFile
       k = ActualNum
     END

     IF (Action=5) THEN ADDRESS COMMAND '${RefTable/IconToolTypes} "'Files.k'"'

   END

  IF (Action=0) THEN LEAVE

 END

RETURN

/*--------------------------------------------*/
ScriptLink:

CALL Register
RETURN

/*--------------------------------------------*/
SaveMoveAs:

 k = 1
 Files.count = 1

 IF ~EXISTS(Files.k) THEN
  DO
    r=ShowMessage('File_SaveAs.1',,,,AppName,Files.k)

    RETURN
  END

 CALL PlaySample(SampleSaveAs)

 /* Action = "Save As" */

 CALL RequestDest(DestMsg,'getfile')
 IF (DestFile='') THEN RETURN

 ActualFile = Files.k
 Target = DestFile
 CopyIconsOnly = 0
 CopyIcons = 1
 DoneOnce = 0
 DoIt = 1
 COPYALL = "ALL"
 CALL DoCopy

 COPYALL = ""
 IF (DoneOnce=1) THEN CALL PlaySample(SampleDone)

RETURN

/*--------------------------------------------*/
Copy_Move:

 CALL PlaySample(SampleAction)

    IF (FilesKill = 1) THEN
     DO
       CALL Register
       RETURN
     END

 k=1
 CALL RequestDest("File_Copy.1",'getpath')
 IF (DestDir='') THEN RETURN

 DoneOnce = 0
 CALL FilesLoop

 IF (DoneOnce=1) THEN CALL PlaySample(SampleDone)

RETURN

/* ----------------------------- */
FilesLoop:

 DoIt=1
 CopyIcons = 0
 CopyIconsOnly = 0

 ShowConsole = ConsoleType''ReqLE'/'ReqTE'/584/124/'AppName' Messages...  copying to 'DestDir'/NOCLOSE'
 IF ~(Open(Con, ShowConsole, 'write')) THEN
  DO
     MsgFile = ThisConsole
     CALL Err_ShowMessage
  END

 r = writeln(Con, " ")
 r = writeln(Con, " [1mPlease wait[0m, Searching duplicate files and copying is in progress.")
 r = writeln(Con, " ")
 r = writeln(Con, " From:  "Path.1)
 r = writeln(Con, "   To:  "DestDir)

 DO k=1 to Files.count

   CALL CheckSource

   IF (Source_is_Dir) THEN
     DO
        MainDestDir = DestDir''Filename.k
        MainDirLength = LENGTH(Files.k)

        IF (IsDir(MainDestDir) = 0) THEN /* dest is a file, no folder */
         DO
          r=ShowMessage('FileManager.8',,,,AppName,Files.k,MainDestDir)
          LEAVE
         END

        IF (IsDir(MainDestDir) = -1) THEN ADDRESS COMMAND 'makedir "'MainDestDir'"'

        /* Create Destination Sub-Directories */

        IF (DirCount > 0) THEN
         DO SubCount = 1 to DirCount
            ThisDestDir = MainDestDir''RIGHT(SourceDir.SubCount, LENGTH(SourceDir.SubCount)-MainDirLength)
            MakeDestDir = Strip(ThisDestDir,'T','/')

            IF (IsDir(MakeDestDir) = -1) THEN ADDRESS COMMAND 'makedir "'MakeDestDir'"'
         END

        IF (SourceCount > 0) THEN
         DO SubCount=1 to SourceCount
            ActualFile = SourceDirs.SubCount''SourceFiles.SubCount
            Target = MainDestDir''RIGHT(SourceDirs.SubCount, LENGTH(SourceDirs.SubCount)-MainDirLength)''SourceFiles.SubCount

            CALL DoCopy
            IF (DoIt=0) THEN LEAVE
         END

        IF (DoIt=0) THEN LEAVE

        CopyIconsOnly = 1
     END

   IF (DoIt=0) THEN LEAVE

   CopyIcons = 1

   ActualFile = Files.k          /* Ops on Files.k finally */
   Target = DestDir''Filename.k

   CALL DoCopy

   IF (DoIt=0) THEN LEAVE
 END

 r=Close(Con)
 RETURN

/* ----------------------------- */
DoCopy:

 FilesKillPrev = FilesKill

 IF (CopyIconsOnly=0) THEN
  DO
   IF ~(DoIt=3) THEN CALL CheckExist
   IF (DoIt=0 | DoIt=2) THEN RETURN

   CALL CopyAndCheck
  END

 IF (CopyIcons=1) THEN
  DO
    IF EXISTS(ActualFile'.info') THEN
     DO
       ActualFile = ActualFile'.info'
       Target = Target'.info'

       IF ~(DoIt=3) THEN CALL CheckExist
       IF (DoIt=0 | DoIt=2) THEN RETURN

       CALL CopyAndCheck
     END
  END

 IF (POS('.INFO', UPPER(ActualFile))>0) THEN
  DO
    CpFile = LEFT(Target,LENGTH(Target)-5)
    ADDRESS COMMAND '${RefTable/IconDraw} "'CpFile'"'
  END

 FilesKill = FilesKillPrev
 DoneOnce = 1
 CopyIcons = 0 /* Reset */
 CopyIconsOnly = 0

RETURN

/* ----------------------------- */
CopyAndCheck:

 ADDRESS COMMAND 'copy "'ActualFile'" "'Target'" CLONE 'COPYALL' QUIET'

 rCode = RC

 IF (rCode=5) THEN
 DO
   Action=ShowMessage('FileManager.7',,,,AppName,Target)

   IF (Action=1) THEN
    DO
       ADDRESS COMMAND
       'protect "'Target'" +wd'
       'copy "'ActualFile'" "'Target'" CLONE 'COPYALL' QUIET'

       rCode=RC
    END
 END

 IF (rCode=10) THEN
 DO
   DO i=k to Files.count
      j=i-k+1
      Files.j = Files.i
   END

   Files.count = Files.count-k+1
   CALL ShowMessage('FileManager.6',,,,AppName,ActualFile,rCode,Target)

   DoIt=0
   DestFull=1
 END

RETURN

/* ----------------------------- */
CheckExist:

 DoIt = 1 /* Preset */

 IF (Files.count > 1 | Source_is_Dir=1) THEN
     MsgOffset = 3
 ELSE
     MsgOffset = 0

 IF (EXISTS(Target) & EXISTS(ActualFile)) THEN
 DO
   str_AttrSource = GetFileAttributes(ActualFile)
   str_AttrDest = GetFileAttributes(Target)

   Rest = SourceCount-SubCount

   IF (Rest > 1) THEN MsgNr = 2 + MsgOffset
   IF (Rest = 1) THEN MsgNr = 3 + MsgOffset
   IF (Rest < 0) THEN Rest=0
   IF (Rest = 0) THEN MsgNr = 4 + MsgOffset

   DoIt=ShowMessage('File_Copy.'MsgNr,,,,str_AttrDest,str_AttrSource,Rest,k,Files.count,AppName)
 END

 RETURN

/* ----------------------------- */
GetFileAttributes:
PARSE ARG CheckedFile

 BytesTemp = 'ENV:FM_Bytes'ProcessNumber
 AttrFile = 'T:FM_Attr_'ProcessNumber
 DirChecked = 0

 IF (IsDir(CheckedFile)) THEN
  DO
    DirChecked = 1

    FirstFile = Files.1
    FirstPath = Path.1

    i=1
    Files.i=CheckedFile
    CALL Analyze

    CheckedFile=Path1'('FileName.1')'

    Files.1 = FirstFile
    Path.1 = FirstPath

    StrBytes = 'DIRECTORY'
  END
 ELSE
  DO
    ADDRESS COMMAND 'list >'BytesTemp' "'CheckedFile'" LFORMAT "%l"'

    IF (Open(TEMPFILE, BytesTemp, 'read')) THEN
     DO
        Bytes = VALUE(ReadLn(TEMPFILE))
        StrBytes = Bytes' Bytes'
        Result = Close(TEMPFILE)
     END

    ADDRESS COMMAND 'delete 'BytesTemp' QUIET'
  END

 ADDRESS COMMAND 'list >'AttrFile' "'CheckedFile'" LFORMAT "    %n*n    'StrBytes'*n    %p*n    %d   %t*n    Comment: %c"'

 IF (DirChecked=0) THEN
  DO
    IsExecutable = CheckExecutable(CheckedFile)

    Ver = ???
    VerTmp = 'FMver_'ProcessNumber

    IF (Bytes<850000 & (IsExecutable | UPPER(RIGHT(CheckedFile,8))='.CATALOG')) THEN
     DO
      ADDRESS COMMAND 'version >ENV:'VerTmp' "'CheckedFile'"'
      IF (RC<20) THEN
       DO
        Version = MyGetENV(VerTmp)
        IF ~((LEFT(Version, 14)="Could not find") | Words(Version)<2) THEN
         DO
           VersionNr = Word(Version,2)
           a=POS('a0'x,VersionNr)
           IF (a>1) THEN VersionNr=LEFT(VersionNr,a-1)
           IF (POS('.',VersionNr)>0 & POS(' ',VersionNr)=0) THEN Ver = Value(VersionNr)
         END
       END
      ADDRESS COMMAND 'delete ENV:'VerTmp' QUIET'
     END

    ADDRESS COMMAND 'echo >>'AttrFile' "    Version:        'Ver'"'
  END

 IF (Open(TEMPFILE, AttrFile, 'read')) THEN
 DO
   str_Attr = ReadLn(TEMPFILE)
   str_Attr = str_Attr || CR || ReadLn(TEMPFILE)
   str_Attr = str_Attr || CR || LEFT(ReadLn(TEMPFILE), 85)
   str_Attr = str_Attr || CR || ReadLn(TEMPFILE)
   str_Attr = str_Attr || CR || LEFT(ReadLn(TEMPFILE), 85)
   IF (DirChecked=0) THEN str_Attr = str_Attr || CR || LEFT(ReadLn(TEMPFILE), 85)

   Result = Close(TEMPFILE)
 END

 ADDRESS COMMAND 'delete 'AttrFile' QUIET'

RETURN str_Attr

/*-----------------------------*/
CheckExecutable:
PARSE ARG CheckExeFile

 Flag = 0

 IF (Open(TEMPFILE, CheckExeFile, 'read')) THEN
 DO
  Head = ReadCh(TEMPFILE, 4)
  HeaderBytes = c2x(Head)
  Result = Close(TEMPFILE)
 END

 IF (HeaderBytes = "000003F3") THEN     /* Executable */
    Flag = 1

RETURN Flag

/* ----------------------------- */
CheckSource:

 Source_is_Dir = 0   /* Preset */
 SourceCount = Files.count - k
 SubCount = 0

 IF ~(IsDir(Files.k) = 1) THEN RETURN
 ELSE
  DO
    Source_is_Dir = 1

    ADDRESS COMMAND
    'list "'Files.k'" >'CheckSourceDirs' ALL DIRS LFORMAT="%p%s"'
    'list "'Files.k'" >'CheckSourceFile' ALL FILES LFORMAT="%p*n%s"'

    SourceCount = 1
    IF (Open(TEMPFILE, CheckSourceFile, 'read')) THEN
    DO
      DO UNTIL (EOF(TEMPFILE))
          SourceDirs.SourceCount = ReadLn(TEMPFILE)
          SourceFiles.SourceCount = ReadLn(TEMPFILE)
          SourceCount = SourceCount + 1
      END

      SourceCount = SourceCount - 2  /* 2 Lines Overhead in each "list" File */

      Result = Close(TEMPFILE)
      ADDRESS COMMAND 'delete' CheckSourceFile 'QUIET'
    END

    IF (Open(TEMPFILE, CheckSourceDirs, 'read')) THEN
    DO
      DirCount = 1
      DO UNTIL (EOF(TEMPFILE))
          SourceDir.DirCount = ReadLn(TEMPFILE)
          DirCount = DirCount + 1
      END

      DirCount = DirCount - 2  /* 2 Lines Overhead in each "list" File */

      Result = Close(TEMPFILE)

      ADDRESS COMMAND 'delete' CheckSourceDirs 'QUIET'
    END
  END

 RETURN

/*--------------------------------------------*/
IsDir:     PROCEDURE
PARSE ARG name

 returned = PRAGMA('DIRECTORY', name)

 IF ~(returned = '') THEN
     DirFlag = 1
 ELSE
  DO
   IF ~Exists(name) THEN
     DirFlag = -1
   ELSE
     DirFlag = 0
  END

 CALL PRAGMA('DIRECTORY', 'T:')

 RETURN DirFlag

/* ----------------------------- */
RequestDest:
PARSE ARG Mesg,Mode

 Parameter2 = FileName.k
 IF (Files.count > 1) THEN Parameter2 = FileName.k' ...'

 Chosen=ShowMessage(Mesg,ActualPathDest,FileName.k,,AppName,Parameter2)

 IF (Mode='getpath') THEN
  DO
   DestDir = Chosen
   IF (DestDir='') THEN RETURN

  END
 ELSE
  DO
   DestFile = Chosen
   IF (DestFile='') THEN RETURN

   DevicePos = LastPos(':',DestFile)
   DirPos = LastPos('/',DestFile)
   IF (DirPos>0) THEN
      DestDir=LEFT(DestFile,DirPos)
   ELSE
      DestDir=LEFT(DestFile,DevicePos)
  END

 ActualPathDest=DestDir
 ADDRESS COMMAND
 'setenv ActualPathDest $ActualPath'
 'copy ENV:ActualPathDest ENVARC: CLONE QUIET'

 'setenv ActualPath "'DestDir'"'
 'copy ENV:ActualPath ENVARC: CLONE QUIET'

RETURN

/*--------------------------------------------*/
ShowMessage:

 PARSE ARG Mesg,ReqPath,ReqFile,PresetString,Parameter1,Parameter2,Parameter3,Parameter4,Parameter5,Parameter6

 drop Action
 ReqType = ""

 MsgFile = 'MARInA_rexx:'Language'/'Mesg
 IF (Open(TEMPFILE, MsgFile, 'read')) THEN
  DO
    ReqType = ReadLn(TEMPFILE)  /* read Requester-Type */

    Line = ReadLn(TEMPFILE)  /* read Title-Line */
    CALL Substitutions
    ReqTitle = Line

    Line = ReadLn(TEMPFILE)  /* free line after Title */

    Message = ""

    DO UNTIL EOF(TEMPFILE)

      Line = ReadLn(TEMPFILE)
      CALL Substitutions

      IF POS(">>>", Line) > 0 THEN
        DO
          rtBtns = STRIP(Line, 'L', '>')
          LEAVE
        END
      ELSE
          Message = Message || CR || Line
    END

    r = Close(TEMPFILE)
  END
 ELSE
    CALL Err_ShowMessage

  uReqType = UPPER(ReqType)

  IF (uReqType = 'MULTI REQUEST') THEN
   DO
      r = rtezrequest(Message,rtBtns,ReqTitle,PosTags)
      RETURN r
   END

  IF (uReqType = 'GET ONE FILE') THEN
   DO
      r = rtfilerequest(ReqPath,ReqFile,ReqTitle,rtBtns,ONEFILE_TAG, Files)
      RETURN r
   END

  IF (uReqType = 'GETFILES') THEN
   DO
      r = rtfilerequest(ReqPath,ReqFile,ReqTitle,rtBtns, FILE_TAGS, Files)
      RETURN r
   END

  IF (uReqType = 'GETPATH') THEN
   DO
      r = rtfilerequest(ReqPath,,ReqTitle,rtBtns, DIR_TAGS)
      RETURN r
   END

  IF (uReqType = 'GETSTRING') THEN
   DO
      r = rtgetstring(PresetString,Message,ReqTitle,rtBtns,GStags,Action)
      RETURN r
   END

  IF (uReqType = 'GETSTRING SIMPLE') THEN
   DO
      r = rtgetstring(PresetString,Message,ReqTitle,,GStags,Action)
      RETURN r
   END

  CALL Err_ShowMessage  /* Error if arrived here */

RETURN

Register:
 rtText = "MARInA © TNE):"||CR||CR||"The FileManager will support FileMove and Scriptlinks"CR"in your registered Version of MARInA!"
 rtBtns = " Register... | Ok"
 Action = rtezrequest(rtText, rtBtns,AppName,FILE_TAGS)
 If (Action=0) THEN RETURN

 ADDRESS COMMAND '${RefTable/Text-Editor} MARInA_rexx:'Language'/Register.txt'

 RETURN
/*--------------------------------------------*/
Substitutions:

 IF POS("%1", Line) > 0 THEN             /* substitution parameters for each message */
 DO UNTIL POS("%1", Line) = 0            /* and per line */
     parse var Line part1 '%1' part2
     Line = part1''parameter1''part2
 END

 IF POS("%2", Line) > 0 THEN
 DO UNTIL POS("%2", Line) = 0
     parse var Line part1 '%2' part2
     Line = part1''parameter2''part2
 END

 IF POS("%3", Line) > 0 THEN
 DO UNTIL POS("%3", Line) = 0
     parse var Line part1 '%3' part2
     Line = part1''parameter3''part2
 END

 IF POS("%4", Line) > 0 THEN
 DO UNTIL POS("%4", Line) = 0
     parse var Line part1 '%4' part2
     Line = part1''parameter4''part2
 END

 IF POS("%5", Line) > 0 THEN
 DO UNTIL POS("%5", Line) = 0
     parse var Line part1 '%5' part2
     Line = part1''parameter5''part2
 END

 IF POS("%6", Line) > 0 THEN
 DO UNTIL POS("%6", Line) = 0
     parse var Line part1 '%6' part2
     Line = part1''parameter6''part2
 END

RETURN

/*--------------------------------------------*/
Err_ShowMessage:

 Message = AppName':' CR CR "Sorry, an error has occured accessing the MessageFile" CR CR "    "MsgFile CR CR "... exiting."
 rtBtns = 'Oh no!'
 Action = rtezrequest(Message,rtBtns,ReqTitle,PosTags)
 CALL ExitMe

RETURN

/*--------------------------------------------*/
FileParser:

IF ( (Files.1 = 'FILES.1') | (POS(':',ChosenFiles) = 0)  ) THEN
 DO
  i=0

  DO forever
   i=i+1

   Files.i = ""
   PrognameBegPos = 0
   DevicePos = 0
   DirPos = 0
   SfxBegin = 0

   IF ( POS('"', ChosenFiles) = 0 ) THEN
    PARSE VAR ChosenFiles Files.i ChosenFiles
   ELSE
    PARSE VAR ChosenFiles Files.i '"' ChosenFiles       /* parse the line */

   IF ( Files.i = " ") THEN
   DO
    IF ( POS('"', ChosenFiles) = 0 ) THEN
       PARSE VAR ChosenFiles Files.i ChosenFiles
    ELSE
       PARSE VAR ChosenFiles Files.i '"' ChosenFiles       /* parse the line */
   END

   Files.i = strip(Files.i, T, ' ')
   Files.i = strip(Files.i, B, '"')

   IF (Files.i = "") THEN
    DO                    /* Break if end of Command-line */
      Files.count=i-1
      LEAVE
    END

   DevicePos=LASTPOS(':',Files.i)

   IF (DevicePos = 0) THEN
     DO
      ADDRESS COMMAND 'cd >ENV:'TempPath
      Path.i=MyGetENV(TempPath)
      ADDRESS COMMAND 'delete ENV:'TempPath 'QUIET'

      IF (RIGHT(Path.i,1) = ':') THEN
        Files.i = Path.i || Files.i
      ELSE
        Files.i = Path.i || '/' || Files.i

     END

   CALL Analyze

  END
 END
ELSE
 DO i=1 TO Files.count

   PrognameBegPos = 0
   DevicePos = 0
   DirPos = 0
   SfxBegin = 0

   CALL Analyze

 END

 i=Files.count  /* set last path to Actual path */
 Path = Path.i

 CALL WriteFileList  /* Prepare a FileList for external Processes */

RETURN 1

/*----------------------------------*/
Analyze:

 Laenge = LENGTH(Files.i)
 DevicePos=LASTPOS(':',Files.i)
 DirPos=LASTPOS('/',Files.i)

 IF (DirPos > 1) THEN
  DO
    PrognameBegPos=DirPos
    Path1 = LEFT(Files.i, DirPos)
    Path.i = strip(Path1, T, '/')
  END
 ELSE
  DO
    PrognameBegPos=DevicePos
    Path.i = LEFT(Files.i, DevicePos)
    Path1 = Path.i
  END

 Numchars = Laenge - PrognameBegPos
 Device.i = LEFT(Files.i, Devicepos)
 FileName.i = RIGHT(Files.i, Laenge-PrognameBegPos)

 SfxBegin = LASTPOS('.',FileName.i)

 IF (SfxBegin=0) THEN
  DO
      Prefix.i = FileName.i
      Suffix.i = ""
  END
 ELSE
  DO
      Prefix.i = LEFT(FileName.i,SfxBegin-1)
      Suffix.i = UPPER(RIGHT(Files.i, NumChars-SfxBegin))
  END

RETURN 1

/*--------------------------------------------*/
WriteFileList:

 IF (Open(TEMPFILE, FileList, 'write')) THEN
  DO
    DO k=1 to Files.count
      Result = WriteLn(TEMPFILE, Files.k)
      Result = WriteLn(TEMPFILE, Path.k)
      Result = WriteLn(TEMPFILE, FileName.k)
      Result = WriteLn(TEMPFILE, Prefix.k)
      Result = WriteLn(TEMPFILE, Suffix.k)
    END

    Result = Close(TEMPFILE)
  END
 ELSE
     CALL ExitMe

RETURN

/*--------------------------------------------*/
PlaySample:
PARSE ARG Sample

 IF (TalkToUser="0") THEN RETURN

 IF EXISTS('ENV:ProcessTalk') THEN
 DO
   ProcessTalk = Strip(SubWord(MyGetENV("ProcessTalk"),2), T, ']')

   ADDRESS COMMAND 'status >ENV:VoiceSTATUS PROCESS 'ProcessTalk
   VStatus = MyGetENV('VoiceSTATUS')

   IF POS(Play_Voice_Cmd,VStatus)>0 THEN
       ADDRESS COMMAND 'break' ProcessTalk 'c'
 END


 ADDRESS COMMAND Play_Voice Sample

RETURN

/*--------------------------------------------*/
MyGetENV:     PROCEDURE
PARSE ARG name

 TheFile = "ENV:" || name
 IF (Open(TEMPFILE, TheFile, 'read')) THEN
   DO
     ENVvalue = ReadLn(TEMPFILE)
     Result = Close(TEMPFILE)
   END
  ELSE
     ENVvalue = ""

RETURN ENVvalue

/*----------------------------------------------------------------*/
GetLanguage:

LanguageNumber = 1      /* Presets */
Language = ''

IF (open(TEMPFILE, 'ENV:sys/locale.prefs', 'read')) THEN
 DO
   DO i = 1 to 50
       r = READCH(TEMPFILE)
   END

   Land = ''

   i=0
   DO UNTIL EOF(TEMPFILE)
       i = i+1
       Char = ReadCh(TEMPFILE)
       IF (C2D(Char) = 0) THEN
           LEAVE
       ELSE
           Land = Land''Char
   END

   /* 32 characters from begin of Lang_x to begin of Lang_y */
   DO j = i to 31 UNTIL EOF(TEMPFILE)
    r = READCH(TEMPFILE)
   END

   Language = ReadLanguage()
   r = Close(TEMPFILE)
 END

 IF (Language='') THEN Language = 'english'

 drop Char
 drop r

 ADDRESS COMMAND 'setenv LANGUAGE 'Language

 IF ~EXISTS('MARInA_rexx:'Language'/FileManager.1') THEN
     Language = 'english'

RETURN

/*----------------------------------*/
ReadLanguage:

 Langua = ''

 Langua = ReadCh(TEMPFILE)
 IF (C2D(Langua)=0) THEN RETURN ''

 i=1
 DO UNTIL EOF(TEMPFILE)
    i=i+1
    Char = ReadCh(TEMPFILE)
    IF (C2D(Char)=0) THEN
      LEAVE
    ELSE
      Langua = Langua''Char
 END

 /* 30 characters from begin of Lang_x to begin of Lang_y */
 DO j = i to 29 UNTIL EOF(TEMPFILE)
    r = READCH(TEMPFILE)
 END

RETURN Langua

/*--------------------------------------------*/
Init:

AppName = "© TNE) MARInA FileManager "

CR = '0a'x

CALL GetLanguage

IF ~show('L','rexxreqtools.library') THEN
   Result=ADDLIB('rexxreqtools.library',0,-30,0)

IF ~show('L','rexxsupport.library') THEN
   Result=ADDLIB('rexxsupport.library',0,-30,0)

ProcessNumber=PRAGMA('ID')


CALL FORBID

Intui  = showlist(l, 'intuition.library',, a)
Screen = next(intui, 56)
Font   = next(screen, 136)
FontSize = c2d(import(offset(font, 20), 2))

CALL PERMIT


MaxTitleChars = MyGetENV("RefTable/GUI-ShellTitleChars")

ConsoleType = MyGetENV("RefTable/GUI-ConsoleType")
IF (ConsoleType = "") THEN ConsoleType = "CON:"

ConsoleSize = MyGetENV("SHELLsize")
IF (ConsoleSize = "") THEN ConsoleSize = "40/50/600/200"

ReqLE = MyGetENV("RefTable/GUI-ReqLE")  /* Main Window */
ReqTE = MyGetENV("RefTable/GUI-ReqTE")

ReqHeight = MyGetENV("RefTable/GUI-ReqHeight")

rt_TE1 = ReqTE + FontSize + 4  /* Requester-Windows */
rt_LE1 = ReqLE + 6

PosTags = "rt_reqpos=reqpos_topleftscr rt_leftoffset=" ReqLE " rt_topoffset=" ReqTE
EZtags = PosTags
GLtags = PosTags || "rtgl_min=0 rtgl_max=1500 rtgl_backfill=true "
GStags = PosTags || " rtgs_backfill=false rtgs_width=300"

POINTER_TAGS = "rt_reqpos=reqpos_pointer"
DIR_TAGS = PosTags || " rtfi_flags=freqf_nofiles|freqf_save rtfi_height=" ReqHeight
FILE_TAGS = PosTags || " rtfi_flags=freqf_multiselect|freqf_selectdirs" || " rtfi_height=" ReqHeight
ONEFILE_TAG = PosTags || " rtfi_height=" ReqHeight

Console = '>"'ConsoleType || ConsoleSize'/'AppName' Messages.../AUTO/NOClose/ALT'ReqLE'/'ReqTE'/500/40"'

/* --------- TempFiles -------- */

TempPath = 'FM_path_'ProcessNumber

CheckSourceFile = 'T:FM_FileList_'ProcessNumber
CheckSourceDirs = 'T:FM_DirsList_'ProcessNumber
FileList = 'T:FM_FileList_'ProcessNumber

/* --------- Voice ------------ */

TalkToUser = MyGetENV("Flags/TalkToUser")
Play_Voice = 'run >ENV:ProcessTalk ${RefTable/Sound-voice}'
Play_Voice_Cmd = SubWord(MyGetENV('RefTable/Sound-voice'),1,1)
SampleDir = 'SysVoice:'Language'/'

SampleCopy = SampleDir || 'FileManagerCopy.8SVX'
SampleCopied = SampleDir || 'FileManagerCopied.8SVX'
SampleChooseFiles = SampleDir || 'FileManagerChooseFile.8SVX'
SampleChooseOp = SampleDir || 'FileManagerChooseOp.8SVX'
SampleEdit = SampleDir || 'FileManagerStartEdit.8SVX'
SampleFileInfo = SampleDir || 'FileManagerFileInfo.8SVX'
SampleFileMon = SampleDir || 'FileManagerFileMon.8SVX'
SampleMove = SampleDir || 'FileManagerMove.8SVX'
SampleMoved = SampleDir || 'FileManagerMoved.8SVX'
SampleRename = SampleDir || 'FileManagerRename.8SVX'
SampleSaveAs = SampleDir || 'FileSaveAs.8SVX'

SampleBye = SampleDir || 'AppSayBye.8SVX'

/* --------- Special ------------ */

ActualPath = MyGetENV("ActualPath")
ActualPathDest = MyGetENV("ActualPathDest")

CALL PRAGMA('DIRECTORY', 'T:')

cancel = 0
copy = 1
move = 2
delete = 3
rename = 4
info = 5
Edit = 6
Filemoni = 7
OpenWith = 8
help = 9

COPYALL = ""

RETURN

/*--------------------------------------------*/
ExitMe:

 CALL PRAGMA('DIRECTORY', 'T:')

 drop ChosenFiles
 drop Files
 drop FileName
 drop Suffix
 drop Prefix
 drop Path

 drop SourceDir
 drop SourceDirs
 drop SourceFiles

 IF EXISTS('ENV:ProcessTalk') THEN ADDRESS COMMAND 'delete ENV:ProcessTalk quiet'
 IF EXISTS('ENV:VoiceSTATUS') THEN ADDRESS COMMAND 'delete ENV:VoiceSTATUS quiet'
 IF EXISTS(FileList) THEN ADDRESS COMMAND 'delete 'FileList' QUIET'

EXIT 0

