home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / acc / utility / theacc12 / theaccsy.mod < prev   
Encoding:
Text File  |  1988-07-19  |  106.7 KB  |  3,245 lines

  1. MODULE TRYIT;
  2. (*$S-,$T-*)
  3. FROM AESApplications IMPORT ApplInitialise;
  4. FROM SYSTEM IMPORT ADDRESS,ADR,CODE,BYTE,NULL,REGISTER,SETREG;
  5. FROM AESForms IMPORT FormDo,FormCenter,FormAlert,FormDialogue;
  6. FROM AESObjects IMPORT ObjectDraw,ObjectOffset,ObjectChange,
  7.                        ObjectFind;
  8. FROM AESGraphics IMPORT GrafDragBox,GrafMouseKeyboardState(*GrafGrowBox,
  9.                         GrafShrinkBox*);
  10. FROM GEMAESbase IMPORT Object,TEdInfo,Arrow,HourGlass,AESCallResult,
  11.                        MesageEvent;
  12. FROM BIOS IMPORT DriveMap,DriveSet,BPB,BPBPtr,GetBPB,RW,RWAbs,BCosStat,
  13.                  Device,BConStat,BConIn;
  14. FROM XBIOS IMPORT FloppyFormat,FloppyWrite,PrototypeBootSector,SuperExec,
  15.                   FloppyRead,GetResolution;
  16. FROM InOut IMPORT WriteString,WriteLn,WriteInt,WriteCard,OpenOutputFile;
  17. IMPORT Terminal;
  18. IMPORT GEMDOS;
  19. FROM Strings IMPORT String,Length,Concat,Compare,CompareResults,Insert,
  20.                     Delete,Pos,Copy;
  21. FROM AESGraphics IMPORT GrafMouse;
  22. FROM LongInOut IMPORT WriteLongCard;
  23. FROM M2Conversions IMPORT ConvertReal,ConvertInteger,ConvertCardinal,
  24.                           ConvertToInteger,ConvertAddrDec;
  25. FROM AESWindows IMPORT WindowCreate,WindowOpen,WindowClose,WindowDelete;
  26. FROM AESEvents IMPORT EventMultiple;
  27. FROM AESMenus IMPORT MenuRegister;
  28. FROM Conversions IMPORT ConvertToString;
  29. FROM VDIControls IMPORT OpenVirtualWorkstation;
  30. FROM GEMVDIbase IMPORT VDIWorkInType,VDIWorkOutType;
  31. IMPORT SYSTEM;
  32. IMPORT AESResources;
  33.  
  34. (* THE MODULE FOR EMBEDDING THE RESOURCE HAS BEEN REMOVED SO TO SAVE SPACE *)
  35. (* INSTEAD OF TWO COMPLETE SOURCE CODE LISTINGS.                           *)
  36. (* MERGE EITHER MODULE FOR THE RESOURCE CODE AT THIS POINT, USE RESOURCC.MOD*)
  37. (* FOR  MEDIUM *)
  38. (* RESOLUTION OR RESOURCM.MOD FOR HIGH RESOLUTION *)
  39.  
  40. MODULE Theaccm;
  41.  
  42. EXPORT 
  43.         tree1, dialogbx, fpath, drvfree, fup, fwind,
  44.         fname2, fname3, fname4, fname5, fname6, fname7,
  45.         fname8, fname9, fname10, fname11, fname12, fname13,
  46.         fntrack, fnslider, frspc, ftofile, ftoname, drivea,
  47.         driveb, drivec, drived, drivee, drivef, driveg,
  48.         driveh, drivei, drivej, drivek, drivel, drivem,
  49.         driven, driveo, drivep, printbx, fprint, fall,
  50.         fnone, fdown, mask, finfobx, fbytes, fro,
  51.         fdate, frw, ftime, fset, filename, finfo,
  52.         formatbx, format, fdrva, fdrvb, fspt, fss,
  53.         fdd, slidebox, ftrack, fslider, folderbx, ferase,
  54.         fcreate, fldok, fileopts, filedlg, cpyoptns, cpyfile,
  55.         cpydisk, cpycopy, cpycancl, cpyscr, cpydst, cpyfoldr,
  56.         verify, options, erase, mainexit, tree3, errdlg,
  57.         cfdest, cfok, cfcancel, tree2, cpydlg, cpyatob,
  58.         cpybtoa, cpyslide, scrtrack, scrslide, dsttrack, dstslide,
  59.         cpyok, cpyexit, tree4, optdlg, cpyyes, cpyno,
  60.         dltyes, dltno, conok, concancl, tree5, copydlg,
  61.         fntocpy, numtocpy, condlgok, condlgcl, tree6, dltdlg,
  62.         fldtodlt, numtodlt, dltdlgok, dltdlgcl;
  63.  
  64.  
  65. CONST
  66.         tree1    = 0;   (* form/dialog *)
  67.         dialogbx = 1;   (* BOX in tree TREE1 *)
  68.         fpath    = 2;   (* BOXTEXT in tree TREE1 *)
  69.         drvfree  = 3;   (* BOXTEXT in tree TREE1 *)
  70.         fup      = 4;   (* BOXTEXT in tree TREE1 *)
  71.         fwind    = 5;   (* BOX in tree TREE1 *)
  72.         fname2   = 6;   (* TEXT in tree TREE1 *)
  73.         fname3   = 7;   (* TEXT in tree TREE1 *)
  74.         fname4   = 8;   (* TEXT in tree TREE1 *)
  75.         fname5   = 9;   (* TEXT in tree TREE1 *)
  76.         fname6   = 10;  (* TEXT in tree TREE1 *)
  77.         fname7   = 11;  (* TEXT in tree TREE1 *)
  78.         fname8   = 12;  (* TEXT in tree TREE1 *)
  79.         fname9   = 13;  (* TEXT in tree TREE1 *)
  80.         fname10  = 14;  (* TEXT in tree TREE1 *)
  81.         fname11  = 15;  (* TEXT in tree TREE1 *)
  82.         fname12  = 16;  (* TEXT in tree TREE1 *)
  83.         fname13  = 17;  (* TEXT in tree TREE1 *)
  84.         fntrack  = 18;  (* BOX in tree TREE1 *)
  85.         fnslider = 19;  (* BOX in tree TREE1 *)
  86.         frspc    = 20;  (* BOXTEXT in tree TREE1 *)
  87.         ftofile  = 22;  (* BOXTEXT in tree TREE1 *)
  88.         ftoname  = 23;  (* FTEXT in tree TREE1 *)
  89.         drivea   = 24;  (* BOXTEXT in tree TREE1 *)
  90.         driveb   = 25;  (* BOXTEXT in tree TREE1 *)
  91.         drivec   = 26;  (* BOXTEXT in tree TREE1 *)
  92.         drived   = 27;  (* BOXTEXT in tree TREE1 *)
  93.         drivee   = 28;  (* BOXTEXT in tree TREE1 *)
  94.         drivef   = 29;  (* BOXTEXT in tree TREE1 *)
  95.         driveg   = 30;  (* BOXTEXT in tree TREE1 *)
  96.         driveh   = 31;  (* BOXTEXT in tree TREE1 *)
  97.         drivei   = 32;  (* BOXTEXT in tree TREE1 *)
  98.         drivej   = 33;  (* BOXTEXT in tree TREE1 *)
  99.         drivek   = 34;  (* BOXTEXT in tree TREE1 *)
  100.         drivel   = 35;  (* BOXTEXT in tree TREE1 *)
  101.         drivem   = 36;  (* BOXTEXT in tree TREE1 *)
  102.         driven   = 37;  (* BOXTEXT in tree TREE1 *)
  103.         driveo   = 38;  (* BOXTEXT in tree TREE1 *)
  104.         drivep   = 39;  (* BOXTEXT in tree TREE1 *)
  105.         printbx  = 40;  (* BOX in tree TREE1 *)
  106.         fprint   = 41;  (* BOXTEXT in tree TREE1 *)
  107.         fall     = 42;  (* BOXTEXT in tree TREE1 *)
  108.         fnone    = 43;  (* BOXTEXT in tree TREE1 *)
  109.         fdown    = 44;  (* BOXTEXT in tree TREE1 *)
  110.         mask     = 45;  (* FBOXTEXT in tree TREE1 *)
  111.         finfobx  = 46;  (* BOX in tree TREE1 *)
  112.         fbytes   = 47;  (* BOXTEXT in tree TREE1 *)
  113.         fro      = 48;  (* BOXTEXT in tree TREE1 *)
  114.         fdate    = 49;  (* FBOXTEXT in tree TREE1 *)
  115.         frw      = 50;  (* BOXTEXT in tree TREE1 *)
  116.         ftime    = 51;  (* FBOXTEXT in tree TREE1 *)
  117.         fset     = 52;  (* BOXTEXT in tree TREE1 *)
  118.         filename = 53;  (* FBOXTEXT in tree TREE1 *)
  119.         finfo    = 54;  (* BOXTEXT in tree TREE1 *)
  120.         formatbx = 55;  (* BOX in tree TREE1 *)
  121.         format   = 56;  (* BOXTEXT in tree TREE1 *)
  122.         fdrva    = 58;  (* BOXTEXT in tree TREE1 *)
  123.         fdrvb    = 59;  (* BOXTEXT in tree TREE1 *)
  124.         fspt     = 60;  (* BOXTEXT in tree TREE1 *)
  125.         fss      = 62;  (* BOXTEXT in tree TREE1 *)
  126.         fdd      = 63;  (* BOXTEXT in tree TREE1 *)
  127.         slidebox = 64;  (* BOX in tree TREE1 *)
  128.         ftrack   = 65;  (* BOX in tree TREE1 *)
  129.         fslider  = 66;  (* BOX in tree TREE1 *)
  130.         folderbx = 67;  (* BOX in tree TREE1 *)
  131.         ferase   = 69;  (* BOXTEXT in tree TREE1 *)
  132.         fcreate  = 70;  (* BOXTEXT in tree TREE1 *)
  133.         fldok    = 71;  (* BOXTEXT in tree TREE1 *)
  134.         fileopts = 72;  (* BOX in tree TREE1 *)
  135.         filedlg  = 73;  (* BOX in tree TREE1 *)
  136.         cpyoptns = 74;  (* BOXTEXT in tree TREE1 *)
  137.         cpyfile  = 76;  (* BOXTEXT in tree TREE1 *)
  138.         cpydisk  = 77;  (* BOXTEXT in tree TREE1 *)
  139.         cpycopy  = 78;  (* BOXTEXT in tree TREE1 *)
  140.         cpycancl = 79;  (* BOXTEXT in tree TREE1 *)
  141.         cpyscr   = 81;  (* BOXTEXT in tree TREE1 *)
  142.         cpydst   = 82;  (* BOXTEXT in tree TREE1 *)
  143.         cpyfoldr = 83;  (* BOXTEXT in tree TREE1 *)
  144.         verify   = 84;  (* BOXTEXT in tree TREE1 *)
  145.         options  = 85;  (* BOXTEXT in tree TREE1 *)
  146.         erase    = 87;  (* BOXTEXT in tree TREE1 *)
  147.         mainexit = 88;  (* BOXTEXT in tree TREE1 *)
  148.         tree3    = 1;   (* form/dialog *)
  149.         errdlg   = 0;   (* BOX in tree TREE3 *)
  150.         cfdest   = 1;   (* FTEXT in tree TREE3 *)
  151.         cfok     = 2;   (* BUTTON in tree TREE3 *)
  152.         cfcancel = 3;   (* BUTTON in tree TREE3 *)
  153.         tree2    = 2;   (* form/dialog *)
  154.         cpydlg   = 0;   (* BOX in tree TREE2 *)
  155.         cpyatob  = 2;   (* BOXTEXT in tree TREE2 *)
  156.         cpybtoa  = 3;   (* BOXTEXT in tree TREE2 *)
  157.         cpyslide = 4;   (* IBOX in tree TREE2 *)
  158.         scrtrack = 5;   (* BOX in tree TREE2 *)
  159.         scrslide = 6;   (* BOX in tree TREE2 *)
  160.         dsttrack = 7;   (* BOX in tree TREE2 *)
  161.         dstslide = 8;   (* BOX in tree TREE2 *)
  162.         cpyok    = 9;   (* BUTTON in tree TREE2 *)
  163.         cpyexit  = 10;  (* BUTTON in tree TREE2 *)
  164.         tree4    = 3;   (* form/dialog *)
  165.         optdlg   = 0;   (* BOX in tree TREE4 *)
  166.         cpyyes   = 2;   (* BUTTON in tree TREE4 *)
  167.         cpyno    = 3;   (* BUTTON in tree TREE4 *)
  168.         dltyes   = 5;   (* BUTTON in tree TREE4 *)
  169.         dltno    = 6;   (* BUTTON in tree TREE4 *)
  170.         conok    = 7;   (* BUTTON in tree TREE4 *)
  171.         concancl = 8;   (* BUTTON in tree TREE4 *)
  172.         tree5    = 4;   (* form/dialog *)
  173.         copydlg  = 0;   (* BOX in tree TREE5 *)
  174.         fntocpy  = 3;   (* TEXT in tree TREE5 *)
  175.         numtocpy = 5;   (* TEXT in tree TREE5 *)
  176.         condlgok = 6;   (* BUTTON in tree TREE5 *)
  177.         condlgcl = 7;   (* BUTTON in tree TREE5 *)
  178.         tree6    = 5;   (* form/dialog *)
  179.         dltdlg   = 0;   (* BOX in tree TREE6 *)
  180.         fldtodlt = 3;   (* TEXT in tree TREE6 *)
  181.         numtodlt = 5;   (* TEXT in tree TREE6 *)
  182.         dltdlgok = 6;   (* BUTTON in tree TREE6 *)
  183.         dltdlgcl = 7;   (* BUTTON in tree TREE6 *)
  184.  
  185. END Theaccm;
  186.  
  187. CONST
  188.         Normal = 0;
  189.         selected = 1;
  190.         disabled = 8;
  191.         RTS = 04E75H;
  192.         stacksize = 4096;
  193.  
  194.  
  195.  
  196. TYPE
  197.   
  198.   PTRTOTEDINFO = POINTER TO TEdInfo;
  199.   etree = POINTER TO TEdInfo;
  200.   objtree = RECORD
  201.               next : INTEGER;
  202.               head : INTEGER;
  203.               tail : INTEGER;
  204.               type : INTEGER;
  205.               flags : INTEGER;
  206.               state : INTEGER;
  207.               spec : etree;
  208.               x  : INTEGER;
  209.               y : INTEGER;
  210.               width :INTEGER;
  211.               height : INTEGER;
  212.             END;
  213.   
  214.   bootsectortype = RECORD
  215.                      bbi     : CARDINAL;
  216.                      loader  : ARRAY[0..5] OF CHAR;
  217.                      snum    : ARRAY[0..2] OF CHAR;
  218.                      bps     : CARDINAL;
  219.                      spc     : CARDINAL;
  220.                      res     : CARDINAL;
  221.                      fat     : CHAR;
  222.                      dir     : CARDINAL;
  223.                      sec     : CARDINAL;
  224.                      media   : CARDINAL;
  225.                      spf     : CARDINAL;
  226.                      spt     : CARDINAL;
  227.                      filler1 : ARRAY[0..5] OF CHAR;
  228.                      side    : CARDINAL;
  229.                      hid     : CARDINAL;
  230.                      filler2 : ARRAY[0..479] OF CHAR;
  231.                      check   : CARDINAL;
  232.                   END;             
  233.  
  234.   Tree = POINTER TO ARRAY[1..300] OF objtree;
  235.   objstate = (Selected);
  236.   
  237.   str = ARRAY[1..80] OF CHAR;
  238.   
  239.   pathrecord = RECORD
  240.                 reserved : ARRAY[0..20] OF BYTE;
  241.                 attrib   : BYTE;
  242.                 time     : CARDINAL;
  243.                 date     : CARDINAL;
  244.                 size     : LONGCARD;
  245.                 name     : String;
  246.                END;
  247.  
  248.     nametype = ARRAY[1..500] OF  String;
  249.     oned = ARRAY[1..500] OF INTEGER;
  250.     twod = ARRAY[1..500],[1..2] OF INTEGER;
  251.     PATHS = ARRAY[0..80] OF String;
  252.         
  253. VAR 
  254.   tree1ptr,tree2ptr,tree3ptr,tree4ptr,tree5ptr,tree6ptr,
  255.   obtedinfo,treeaddr : Tree;
  256.   handle,x,y,w,h,xx,yy,ww,hh,showit,disktype,execflag,result,oldyoff,
  257.   nine,vint,ccount,index,fcount,fnslidery,fnsliderh,fntrackh
  258.   ,th,sh,fnametemp,ii,newwind,menuid,apid,event,dummy,cresult
  259.    ,fileselection,foundit,resolution,numberoffilenames,numberofpaths
  260.    ,outfile : INTEGER;
  261.  
  262.   workIn : VDIWorkInType;
  263.   workOut : VDIWorkOutType;
  264.     
  265.   bootsector : ARRAY[0..511] OF CHAR;
  266.   
  267.   selection,maskaddr : POINTER TO String;       
  268.   
  269.   paths,sourcepaths,destpaths : PATHS;
  270.   vobspec,gobspec : etree;
  271.   
  272.   pbuffer : ARRAY[0..7] OF CARDINAL;
  273.   
  274.   stack : ARRAY[1..4096] OF CARDINAL;
  275.            
  276.   d : [0..31];
  277.   drv : DriveSet;
  278.   buffer,ptextaddr,bufferaddr,freememory : ADDRESS;
  279.   loaded,done,initialized,therewasanerror,confirmcopy,confirmdlt,
  280.   clearfirst : BOOLEAN;
  281.   errorstring : ARRAY[0..100] OF CHAR;
  282.   drive,spt,interleave,virgin,
  283.   defaultdrive,numberofsides,tracksperdisk,sectorspertrack,count,
  284.   ct,year,month,ryear,hour,minute,rhour,day,appldrive,COUNT : CARDINAL;
  285.   dtarecord : pathrecord;  
  286.   selobspec : etree;
  287.  
  288.   writeverify [0444H] : BYTE;
  289.   verifyflag,defaultverify : BYTE;
  290.   
  291.   swidth,tswidth,ttswidth : REAL;
  292.  
  293.   keypressed,free,drivemap,tsize,Count,sizebuffer : LONGCARD;
  294.   path,rpath,temp,temp2 : ARRAY[0..300] OF String;
  295.   atrib : ARRAY[0..100] OF CARDINAL;
  296.   
  297.   farray,match,rfarray,r1,r2,r3,r4,temp1,result2
  298.   ,p1,p2,p3,p4,ffpath,ppath,Temp1,Temp2,Temp3,filearray,
  299.   globlepath,clear,ptextstr,
  300.   clearstr,currentname,newname,presult,pathdrive,
  301.   hourstr,minutestr,rhourstr,rminutestr,timestr,yearstr,monthstr,
  302.   daystr,datestr,modystr,mresultstr,tresultstr,rdaystr,pathstr : String;
  303.   sourcename,destname,sourcepathstr,accname,fffpath,freestr,
  304.   gverifystr,selpathstr,maskstr,oldmaskstr : String;
  305.  
  306.   i1,i,j,j1,k,p,t : INTEGER;
  307.   s : BOOLEAN;
  308.   n : oned;
  309.   s9 : twod;
  310.   
  311. PROCEDURE KeyPressed():  BOOLEAN;
  312.  
  313. BEGIN
  314.   IF BConStat(CON) THEN
  315.      keypressed := BConIn(CON);
  316.      IF (keypressed DIV 65536) = 61H THEN
  317.         showit := FormAlert(1,"[1][Opteration interrupted!][ CANCEL | CONTINUE ]");END;
  318.         IF showit = 1 THEN 
  319.            RETURN(FALSE);
  320.         ELSE 
  321.            RETURN(TRUE);END;   
  322.   END; (* IF BConStat *)
  323.   RETURN(TRUE);
  324. END KeyPressed;
  325.            
  326. PROCEDURE MakeCardinal(a,b : CHAR) : CARDINAL;
  327.  
  328. VAR
  329.    aa,bb : CARDINAL;
  330.    
  331. BEGIN
  332.    aa := CARDINAL(a);
  333.    bb := CARDINAL(b);
  334.    RETURN (CARDINAL(a) + CARDINAL(b) * 256);
  335. END MakeCardinal;
  336.    
  337. PROCEDURE ClearIt;
  338.  
  339.  
  340. VAR
  341.    fromobspec,bobspec,tobspec,dobspec : etree;
  342.    bytesstr,timestr,datestr,pathstr : String;
  343.    selection : POINTER TO String;
  344.    blank : String;
  345.    where : CARDINAL;
  346.  
  347. BEGIN
  348.   IF (initialized) AND NOT ((GetObjectState(tree1ptr,tree1,cpyfile,Selected))
  349.                    OR      (GetObjectState(tree1ptr,tree1,cpyfoldr,Selected))) THEN
  350.     blank := ''; 
  351.     tree1ptr^[ftoname + 1].spec^.ptext := ADR(blank);
  352.     tree1ptr^[filename + 1].spec^.ptext := ADR(blank);
  353.     ObjectDraw(tree1ptr,ftoname,1,x,y,w,h);
  354.     ObjectDraw(tree1ptr,filename,1,x,y,w,h);
  355.     bytesstr := '000000';
  356.     datestr := '000000';
  357.     timestr := '0000  ';
  358.     tree1ptr^[fbytes + 1].spec^.ptext := ADR(bytesstr);
  359.     tree1ptr^[fdate + 1].spec^.ptext := ADR(datestr);
  360.     tree1ptr^[ftime + 1].spec^.ptext := ADR(timestr);
  361.     ObjectDraw(tree1ptr,fbytes,1,x,y,w,h);
  362.     ObjectDraw(tree1ptr,fdate,1,x,y,w,h);
  363.     ObjectDraw(tree1ptr,ftime,1,x,y,w,h);
  364.     ObjectChange(tree1ptr,fro,0,x,y,w,h,Normal,1);
  365.     ObjectChange(tree1ptr,frw,0,x,y,w,h,Normal,0);
  366.     ObjectDraw(tree1ptr,frw,1,x,y,w,h);
  367.     ObjectChange(tree1ptr,fset,0,x,y,w,h,disabled,1);
  368.     clearfirst := TRUE;
  369.   ELSE
  370.     selection := tree1ptr^[ftoname + 1].spec^.ptext;
  371.     pathstr := selection^;
  372.     IF (Pos(pathstr,'*.',0,where) AND (clearfirst)) THEN     
  373.     tree1ptr^[ftoname + 1].spec^.ptext := ADR(pathstr);
  374.     clearfirst := FALSE;END;
  375.   END;
  376. END ClearIt;
  377.  
  378. PROCEDURE ChecktheState(treeaddr : Tree ; tree,index : INTEGER) : BITSET;
  379.  
  380. BEGIN
  381. (*  ResourceGetAddr(0,tree,treeaddr);*)
  382.   RETURN BITSET(treeaddr^[index + 1].state);
  383. END ChecktheState;
  384.    
  385. PROCEDURE GetObjectState(treeaddr : Tree ; tree,index : INTEGER ; mask : objstate) : BOOLEAN;
  386.  
  387. TYPE
  388.    state = SET OF objstate;
  389.  
  390. VAR
  391.   value : BITSET;
  392.     
  393. BEGIN
  394.  (* ResourceGetAddr(0,tree1,tree1ptr);*)
  395.   value := ChecktheState(treeaddr,tree,index);
  396.   RETURN (mask IN state(value));
  397.  
  398. END GetObjectState;  
  399.  
  400. PROCEDURE CalcSliderSize;
  401.  
  402. BEGIN
  403.    th := tree1ptr^[fntrack + 1].height;
  404.   IF ii < 12 THEN
  405.      tree1ptr^[fnslider + 1].height := th;
  406.   ELSE
  407.      swidth := FLOAT(CARDINAL(th))/FLOAT(CARDINAL(ii));
  408.      swidth := swidth * 12.0;
  409.      ttswidth := swidth;
  410.      IF swidth < 5.00 THEN
  411.         tree1ptr^[fnslider + 1].height := 5;
  412.         swidth := swidth/12.0;
  413.      ELSE
  414.         tree1ptr^[fnslider + 1].height := INTEGER(TRUNC(swidth));
  415.         swidth := swidth/12.0;
  416.      END;
  417.      sh := tree1ptr^[fnslider + 1].height;   
  418.   END; (* IF ELSE *)
  419.   tree1ptr^[fnslider + 1].y := 0;
  420.   IF initialized THEN 
  421.      ObjectDraw(tree1ptr,fntrack,1,x,y,w,h);
  422.   END;
  423.   
  424. END CalcSliderSize;
  425.   
  426. PROCEDURE updateslider(tree,index :INTEGER; treeaddr:Tree);
  427.  
  428. VAR
  429.   curx,curw : INTEGER;
  430.   
  431. BEGIN
  432.   curx := tree1ptr^[fslider + 1].x;
  433.   curw := tree1ptr^[fslider + 1].width;
  434.   curx := curx + 1;
  435.   curw := curw - 1;
  436.   tree1ptr^[fslider + 1].x := curx;
  437.   tree1ptr^[fslider + 1].width := curw;
  438.   ObjectDraw(tree1ptr,ftrack,1,x,y,w,h);
  439.   ObjectDraw(tree1ptr,fslider,1,x,y,w,h);
  440. END updateslider;
  441.   
  442. PROCEDURE Bootsector;
  443.  
  444. VAR
  445.   bootsector : ARRAY[0..511] OF CHAR;
  446.   sec,sec2,spt : CARDINAL;
  447.   serialno : LONGINT;
  448.   disktype,execflag,result : INTEGER;
  449.   side,track,sector,count : CARDINAL;
  450.   buffer : ADDRESS;
  451.     
  452. BEGIN
  453.   serialno := 00FFFFFFEH;
  454.   side := 0;
  455.   execflag := 0;
  456.   track := 0;
  457.   sector := 1;
  458.   count := 1;
  459.   buffer := ADR(bootsector);
  460.   IF GetObjectState(tree1ptr,tree1,fdd,Selected) THEN
  461.      disktype := 3;
  462.      IF tracksperdisk = 79 THEN
  463.         sec := 160;
  464.         sec2 := 5;
  465.      ELSE   
  466.         sec := 104;
  467.         sec2 := 6;
  468.      END;   
  469.   ELSE
  470.      disktype := 2;
  471.      IF tracksperdisk = 79 THEN
  472.         sec := 208;
  473.         sec2 := 2;
  474.      ELSE   
  475.         sec := 52;
  476.         sec2 := 3;
  477.      END;   
  478.   END;
  479.  
  480.   PrototypeBootSector(buffer,serialno,disktype,execflag);
  481.   bootsector[24] := CHAR(sectorspertrack);
  482.   bootsector[19] := CHAR(sec);
  483.   bootsector[20] := CHAR(sec2);
  484.   buffer := ADR(bootsector);
  485.   result := FloppyWrite(buffer,drive,sector,track,side,count);
  486.   GrafMouse(Arrow,NIL);
  487. END Bootsector;  
  488.                     
  489.  
  490.                     
  491. PROCEDURE Formatdisk(tree,index : INTEGER; treeaddr:Tree);
  492.  
  493. VAR
  494.   defaultx,defaultwidth,result : INTEGER;
  495.   thestring,errorstr : String;
  496.   spt,track,side,interleave,virgin : CARDINAL;
  497.   buffer : ADDRESS;
  498.   
  499. BEGIN
  500.   showit := FormAlert(1,"[2][All the contents of the disk|will be ERASED, do you wish|to continue?][ CANCEL | OK ]");
  501.   IF showit # 1 THEN
  502.      IF GetObjectState(tree1ptr,tree1,fdrva,Selected) THEN drive := 0 ELSE
  503.                        drive := 1; END;
  504.      spt := sectorspertrack;
  505.      track := 0;
  506.      side := 0;
  507.      interleave := 1;
  508.      virgin := 000H;
  509.      GEMDOS.Alloc(10000,buffer);
  510.      defaultx := treeaddr^[index + 1].x;
  511.      defaultwidth := treeaddr^[index + 1].width;
  512.      GrafMouse(HourGlass,NIL);
  513.      LOOP
  514.        result := FloppyFormat(buffer,drive,spt,track,side,interleave,virgin);
  515.        IF GetObjectState(tree1ptr,tree1,fdd,Selected) THEN
  516.           side := 1;
  517.           virgin := 0E5E5H;
  518.           result := FloppyFormat(buffer,drive,spt,track,side,interleave,virgin);      IF track < 2 THEN virgin := 000H; END;
  519.           side := 0;
  520.        END;
  521.        IF NOT KeyPressed() THEN EXIT; END;
  522.        GrafMouse(HourGlass,NIL);
  523.        IF (result < 0) OR (track = tracksperdisk) THEN EXIT ; END;
  524.        INC(track);
  525.        updateslider(tree,index,treeaddr);
  526.        IF track > 1 THEN virgin := 0E5E5H; END;
  527.      END; (* LOOP *)
  528.      IF result < 0 THEN
  529.         CASE result OF
  530.             -13 : errorstring := "[1][Disk is WRITE|protected! ][ OK ]"|
  531.             -16 : errorstring := "[1][An error occured|during format! ][ OK ]";
  532.         END; (* CASE *)
  533.         showit := FormAlert(1,errorstring);
  534.      END;      
  535.      treeaddr^[index + 1].x := defaultx;
  536.      treeaddr^[index + 1].width := defaultwidth;
  537.      ObjectDraw(tree1ptr,fslider,1,x,y,w,h);
  538.      done := GEMDOS.Free(buffer);
  539.      IF result >= 0 THEN Bootsector; END;
  540.   END;
  541.   ObjectChange(tree1ptr,format,0,x,y,w,h,Normal,1);
  542. END Formatdisk;  
  543.  
  544. PROCEDURE ConvertDateTime(date,time : CARDINAL);
  545.  
  546. BEGIN
  547.        year := (date DIV 512) + 80;
  548.        ryear := date MOD 512;
  549.        month := ryear DIV 32;
  550.        day := ryear MOD 32;
  551.        ConvertToString(LONGCARD(year),10,FALSE,yearstr,done);
  552.        ConvertToString(LONGCARD(month),10,FALSE,monthstr,done);
  553.        ConvertToString(LONGCARD(day),10,FALSE,daystr,done);
  554.        IF (day < 10) AND (month < 10) THEN
  555.           Concat('0',monthstr,mresultstr);
  556.           monthstr := mresultstr;
  557.           Concat('0',daystr,rdaystr);
  558.           daystr := rdaystr;
  559.        ELSE
  560.           IF month < 10 THEN Concat('0',monthstr,mresultstr);
  561.           monthstr := mresultstr;END;
  562.           IF day < 10 THEN Concat('0',daystr,rdaystr);
  563.           daystr := rdaystr;END;      
  564.        END;
  565.        Concat(monthstr,daystr,modystr);
  566.        Concat(modystr,yearstr,datestr);
  567.        hour := time DIV 2048;
  568.        rhour := time MOD 2048;
  569.        minute := rhour DIV 32;
  570.        ConvertToString(LONGCARD(hour),10,FALSE,hourstr,done);
  571.        ConvertToString(LONGCARD(minute),10,FALSE,minutestr,done);
  572.        IF hour < 1 THEN
  573.           Delete(hourstr,0,1);
  574.           Concat('12',hourstr,rhourstr);
  575.           hourstr := rhourstr;
  576.        END;
  577.        IF (hour >= 1) AND (hour < 10) THEN
  578.           Concat(' ',hourstr,rhourstr);
  579.           hourstr := rhourstr;
  580.        END;
  581.        IF minute < 10 THEN
  582.           Concat('0',minutestr,rminutestr);
  583.           minutestr := rminutestr;
  584.        END;
  585.        Concat(hourstr,minutestr,timestr);
  586.        IF hour < 12 THEN
  587.           Concat(timestr,'A',tresultstr);
  588.        ELSE
  589.           Concat(timestr,'P',tresultstr);
  590.        END;
  591.        
  592. END ConvertDateTime;
  593.                
  594. PROCEDURE GetFreeSpace;
  595.  
  596. TYPE
  597.   diskinfo = GEMDOS.DiskInfoBuffer;
  598.   
  599. VAR
  600.   freeinfo : diskinfo;
  601.   drive : CARDINAL;
  602.   freestr : String;
  603.   obspec : etree;
  604.   
  605. BEGIN
  606.   IF GetObjectState(tree1ptr,tree1,drivea,Selected) THEN drive := 1; END;
  607.   IF GetObjectState(tree1ptr,tree1,driveb,Selected) THEN drive := 2; END;
  608.   IF GetObjectState(tree1ptr,tree1,drivec,Selected) THEN drive := 3; END;
  609.   IF GetObjectState(tree1ptr,tree1,drived,Selected) THEN drive := 4; END;
  610.   IF GetObjectState(tree1ptr,tree1,drivee,Selected) THEN drive := 5; END;
  611.   IF GetObjectState(tree1ptr,tree1,drivef,Selected) THEN drive := 6; END;
  612.   IF GetObjectState(tree1ptr,tree1,driveg,Selected) THEN drive := 7; END;
  613.   IF GetObjectState(tree1ptr,tree1,driveh,Selected) THEN drive := 8; END;
  614.   IF GetObjectState(tree1ptr,tree1,drivei,Selected) THEN drive := 9; END;
  615.   IF GetObjectState(tree1ptr,tree1,drivej,Selected) THEN drive := 10; END;
  616.   IF GetObjectState(tree1ptr,tree1,drivek,Selected) THEN drive := 11; END;
  617.   IF GetObjectState(tree1ptr,tree1,drivel,Selected) THEN drive := 12; END;
  618.   IF GetObjectState(tree1ptr,tree1,drivem,Selected) THEN drive := 13; END;
  619.   IF GetObjectState(tree1ptr,tree1,driven,Selected) THEN drive := 14; END;
  620.   IF GetObjectState(tree1ptr,tree1,driveo,Selected) THEN drive := 15; END;
  621.   IF GetObjectState(tree1ptr,tree1,drivep,Selected) THEN drive := 16; END;
  622.   GrafMouse(HourGlass,NIL);
  623.   GEMDOS.DFree(freeinfo,drive);
  624.   free := freeinfo.freeSpace * freeinfo.sectorSize * freeinfo.clusterSize;
  625.   IF NOT (GetObjectState(tree1ptr,tree1,fprint,Selected) AND
  626.          (GetObjectState(tree1ptr,tree1,cpyfile,Selected) AND
  627.          GetObjectState(tree1ptr,tree1,cpycopy,Selected))) THEN
  628.      ConvertToString(LONGCARD(free),10,FALSE,freestr,done);    
  629.      tree1ptr^[frspc + 1].spec^.ptext := ADR(freestr);
  630.      ObjectDraw(tree1ptr,frspc,1,x,y,w,h);
  631.      GrafMouse(Arrow,NIL);
  632.      ObjectChange(tree1ptr,drvfree,0,x,y,w,h,Normal,1);
  633.   ELSE 
  634.    ConvertToString(LONGCARD(free),10,FALSE,freestr,done);
  635.    WriteString(freestr);
  636.    GrafMouse(Arrow,NIL);
  637.   END; 
  638. END GetFreeSpace;
  639.  
  640. (*$P-*)
  641. PROCEDURE SetVerifyOn;
  642.  
  643. BEGIN
  644.   writeverify := BYTE(-1);
  645.   CODE(RTS);
  646. END SetVerifyOn;
  647.  
  648. (*$P-*)
  649. PROCEDURE SetVerifyOff;
  650.  
  651. BEGIN
  652.   writeverify := BYTE(0);
  653.   CODE(RTS);
  654. END SetVerifyOff;  
  655.  
  656. (*$P-*)
  657. PROCEDURE GetVerifyFlag;
  658.  
  659. BEGIN
  660.    verifyflag := writeverify;
  661.    CODE(RTS);
  662. END GetVerifyFlag;
  663.  
  664. PROCEDURE DoVerify;
  665.  
  666.    
  667. VAR
  668.    verifystr : String;
  669.    obspec : etree;
  670.  
  671. BEGIN
  672.   IF vint = 0 THEN
  673.      verifystr  := 'WRITE VERIFY OFF ';
  674.      SuperExec(PROC(SetVerifyOff));
  675.      vint := -1
  676.   ELSE
  677.      verifystr := 'WRITE VERIFY ON ';
  678.      SuperExec(PROC(SetVerifyOn));
  679.      vint := 0;
  680.   END;
  681.   tree1ptr^[verify + 1].spec^.ptext := ADR(verifystr);
  682.   gverifystr := verifystr;
  683.   ObjectChange(tree1ptr,verify,0,x,y,w,h,Normal,1);
  684.   IF initialized THEN
  685.      ObjectDraw(tree1ptr,verify,1,x,y,w,h);END;
  686. END DoVerify;                
  687.  
  688. PROCEDURE BPBparameters(source,dest : BPB) : BOOLEAN;
  689.  
  690. BEGIN
  691.   IF source.recsiz <> dest.recsiz THEN RETURN(FALSE); END;
  692.   IF source.clsiz <> dest.clsiz THEN RETURN(FALSE); END;
  693.   IF source.clsizb <> dest.clsizb THEN RETURN(FALSE); END;
  694.   IF source.rdlen <> dest.rdlen THEN RETURN(FALSE); END;
  695.   IF source.fsiz <> dest.fsiz THEN RETURN(FALSE); END;
  696.   IF source.fatrec <> dest.fatrec THEN RETURN(FALSE); END;
  697.   IF source.datrec <> dest.datrec THEN RETURN(FALSE); END;
  698.   IF source.numcl <> dest.numcl THEN RETURN(FALSE); END;
  699.   IF source.bflags <> dest.bflags THEN RETURN(FALSE); END;
  700.   IF source.numcl > 500 THEN numberofsides := 2; 
  701.   ELSE numberofsides := 1;END;
  702.   RETURN(TRUE);
  703. END BPBparameters;
  704.   
  705. PROCEDURE DoCopy;
  706.  
  707. VAR
  708.    sourcedrv,destdrv : BPB;
  709.    sourceptr,destptr : BPBPtr;
  710.    source,dest,side,track,spt,bps,bside,sec,numberoftracks,
  711.    strack,dtrack,temp1,temp2,totaltracks : CARDINAL;
  712.    bufferaddr,baseaddr,addr,freememory,bootaddr : ADDRESS;
  713.    bytes,buffersize,bufferptr,endofbuffer : LONGCARD;
  714.    Done,reading,done : BOOLEAN;
  715.    curx,curw,scrdefx,scrdefw,dstdefx,dstdefw,snum,dnum,result : INTEGER;
  716.    obspec : etree;
  717.    sresult,dresult : String;
  718.         
  719. BEGIN
  720.   IF GetObjectState(tree2ptr,tree2,cpyatob,Selected) THEN
  721.      source := 0;
  722.      dest := 1;
  723.   END;
  724.   IF GetObjectState(tree2ptr,tree2,cpybtoa,Selected) THEN
  725.      dest := 0;
  726.      source := 1;
  727.   END;      
  728.   sourceptr := GetBPB(source);
  729.   destptr := GetBPB(dest);
  730.   ConvertAddrDec(sourceptr,2,sresult);
  731.   ConvertAddrDec(destptr,2,dresult);
  732.   ConvertToInteger(sresult,done,snum);
  733.   ConvertToInteger(dresult,done,dnum);
  734.   IF (snum # 0 ) AND (dnum # 0) THEN
  735.   sourcedrv := destptr^;
  736.   destdrv := sourceptr^;
  737.   IF NOT BPBparameters(sourcedrv,destdrv) THEN
  738.      showit := FormAlert(1,"[1][Disk Formats are|not the same!][ OK ]");
  739.      Done := FALSE;
  740.      RETURN;
  741.   END;
  742.   endofbuffer := 0;
  743.   bufferptr := 0;
  744.   bytes := 0;
  745.   bufferaddr := ADR(bufferptr);
  746.   GEMDOS.Alloc(0FFFFFFFFH,bufferaddr);
  747.   bytes := LONGCARD(bufferaddr);
  748.   bytes := bytes - 2000H;
  749.   bytes := (bytes DIV 512) * 512;
  750.   GEMDOS.Alloc(bytes,bufferaddr);
  751.   baseaddr := bufferaddr;
  752.   endofbuffer := LONGCARD(baseaddr) + bytes;
  753.   bootaddr := ADR(bootsector);
  754.   result := FloppyRead(bootaddr,0,1,0,0,1);
  755.   sec := MakeCardinal(bootsector[19],bootsector[20]);
  756.   bside := MakeCardinal(bootsector[26],bootsector[27]);
  757.   spt := MakeCardinal(bootsector[24],bootsector[25]);
  758.   numberoftracks := sec DIV spt;
  759.   IF numberoftracks > 82 THEN numberoftracks := numberoftracks DIV 2;END;
  760.   tree2ptr^[scrtrack + 1].width := numberoftracks + 2;
  761.   tree2ptr^[scrslide + 1].width := numberoftracks;
  762.   tree2ptr^[scrslide + 1].x := (tree2ptr^[scrtrack + 1].x) + 1;
  763.   tree2ptr^[dsttrack + 1].width := numberoftracks + 2;
  764.   tree2ptr^[dstslide + 1].width := numberoftracks;
  765.   tree2ptr^[dstslide + 1].x := (tree2ptr^[dsttrack + 1].x) + 1;
  766.   ObjectDraw(tree2ptr,cpyslide,3,x,y,w,h);
  767.   bps := 512;
  768.   totaltracks := 0;
  769.   temp1 := 0;
  770.   temp2 := 0;
  771.   side := 0;
  772.   strack := 0;
  773.   dtrack := 0;
  774.   reading := TRUE;
  775.   bufferptr := LONGCARD(baseaddr);
  776.   scrdefx := tree2ptr^[scrslide + 1].x;
  777.   scrdefw := tree2ptr^[scrslide + 1].width;
  778.   dstdefx := tree2ptr^[dstslide + 1].x;
  779.   dstdefw := tree2ptr^[dstslide + 1].width;
  780.   GrafMouse(HourGlass,NIL);
  781.   LOOP 
  782.     IF reading THEN
  783.        result := FloppyRead(bufferaddr,source,1,strack,side,spt);
  784.        IF side = 0 THEN
  785.           curx := tree2ptr^[scrslide + 1].x;
  786.           curw := tree2ptr^[scrslide + 1].width;
  787.           INC(curx);
  788.           DEC(curw);
  789.           tree2ptr^[scrslide + 1].x := curx;
  790.           tree2ptr^[scrslide + 1].width := curw;
  791.           ObjectDraw(tree2ptr,scrtrack,1,x,y,w,h);
  792.           ObjectDraw(tree2ptr,scrslide,1,x,y,w,h);
  793.        END;    
  794.     ELSE
  795.       REPEAT 
  796.        result := FloppyWrite(bufferaddr,dest,1,dtrack,side,spt);
  797.        IF result < 0 THEN
  798.           GrafMouse(Arrow,NIL);
  799.           showit := FormAlert(1, "[1][ Disk Is Write Protected!][ Retry | Cancel ]");
  800.           CASE showit OF
  801.                2  : result := -1;
  802.           END;  
  803.        END;
  804.       UNTIL (result >= 0) OR (result = -1);
  805.        IF (side = 0) AND (result >= 0) THEN
  806.           curx := tree2ptr^[dstslide + 1].x;
  807.           curw := tree2ptr^[dstslide + 1].width;
  808.           INC(curx);
  809.           DEC(curw);
  810.           tree2ptr^[dstslide + 1].x := curx;
  811.           tree2ptr^[dstslide + 1].width := curw;
  812.           ObjectDraw(tree2ptr,dsttrack,1,x,y,w,h);
  813.           ObjectDraw(tree2ptr,dstslide,1,x,y,w,h);
  814.        END;   
  815.     END;
  816.     IF (side = 0) AND (bside = 2) THEN
  817.        side := 1;
  818.     ELSE   
  819.        INC(totaltracks);
  820.        IF reading THEN INC(strack);
  821.        ELSE INC(dtrack);END;
  822.        side := 0;
  823.     END;
  824.     IF NOT KeyPressed() THEN EXIT; END;
  825.     GrafMouse(HourGlass,NIL);
  826.     IF (side = 0) AND (totaltracks = numberoftracks) AND (NOT reading)
  827.       OR (result < 0) THEN EXIT; END;
  828.     bufferptr := bufferptr + LONGCARD(spt * bps);
  829.     bufferaddr := ADDRESS(bufferptr);
  830.     IF (bufferptr > endofbuffer) OR
  831.        ((side = 0) AND (totaltracks = numberoftracks)) THEN
  832.        temp1 := totaltracks;
  833.        totaltracks := temp2;
  834.        temp2 := temp1;
  835.        reading := NOT reading;
  836.        bufferaddr := baseaddr;
  837.        bufferptr := LONGCARD(bufferaddr);
  838.     END;
  839.   END; (* LOOP *)
  840.   GrafMouse(Arrow,NIL);           
  841.   tree2ptr^[scrslide + 1].x := scrdefx;
  842.   tree2ptr^[scrslide + 1].width := scrdefw;
  843.   tree2ptr^[dstslide + 1].x := dstdefx;
  844.   tree2ptr^[dstslide + 1].width := dstdefw;
  845.   ObjectDraw(tree2ptr,scrslide,1,x,y,w,h);
  846.   ObjectDraw(tree2ptr,dstslide,1,x,y,w,h);
  847.   Done := GEMDOS.Free(baseaddr);
  848.   Done := TRUE;
  849.   END; (* IF sourceptr and destptr *)
  850. END DoCopy;
  851.         
  852. PROCEDURE CopyDialog;
  853.  
  854. VAR
  855.  xoff,yoff,bx,by,bw,bh,stw,sth,stx,sty,ewidth,eheight : INTEGER;
  856.                               
  857. BEGIN
  858.   ObjectOffset(tree1ptr,filedlg,xoff,yoff);
  859.   tree2ptr^[cpydlg + 1].x := xoff;
  860.   tree2ptr^[cpydlg + 1].y := yoff;
  861.   tree2ptr^[scrtrack + 1].width := 82;
  862.   tree2ptr^[scrslide + 1].width := 80;
  863.   tree2ptr^[scrslide + 1].x := (tree2ptr^[scrtrack + 1].x) + 1;
  864.   tree2ptr^[dsttrack + 1].width := 82;
  865.   tree2ptr^[dstslide + 1].width := 80;
  866.   tree2ptr^[dstslide + 1].x := (tree2ptr^[dsttrack + 1].x) + 1;
  867.   ewidth := tree1ptr^[filedlg + 1].width;
  868.   eheight := tree1ptr^[filedlg + 1].height;
  869.   (*stx := (xoff + ewidth) DIV 2;
  870.   sty := (yoff + eheight) DIV 2;
  871.   stw := 5;
  872.   sth := 2;
  873.   GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  874.   GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  875.   ObjectDraw(tree2ptr,cpydlg,3,x,y,w,h);
  876.   REPEAT  
  877.     showit := FormDo(tree2ptr,0);
  878.     IF GetObjectState(tree2ptr,tree2,cpyok,Selected) THEN
  879.        DoCopy;
  880.        GrafMouse(Arrow,NIL);
  881.        ObjectChange(tree2ptr,cpyok,0,x,y,w,h,Normal,1);
  882.        ObjectDraw(tree2ptr,cpyok,1,x,y,w,h);
  883.     END;
  884.   UNTIL GetObjectState(tree2ptr,tree2,cpyexit,Selected);
  885.   (*GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  886.   GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  887.   ObjectChange(tree2ptr,cpyexit,0,x,y,w,h,Normal,1);
  888.   ObjectChange(tree1ptr,cpydisk,0,x,y,w,h,Normal,1);
  889.   ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);
  890. END CopyDialog;
  891.  
  892. PROCEDURE Changespt;
  893.  
  894. VAR
  895.  sptstr : String;
  896.  sptobspec : etree;
  897.           
  898. BEGIN
  899.   IF nine = 0 THEN
  900.      sptstr := '9/80';
  901.      nine := 1;
  902.      sectorspertrack := 9;
  903.      tracksperdisk := 79;
  904.      tree1ptr^[ftrack + 1].width := 82;
  905.      tree1ptr^[fslider + 1].width := 80;
  906.   ELSE
  907.      sptstr := '10/82';
  908.      nine := 0;
  909.      sectorspertrack := 10;
  910.      tracksperdisk := 81;
  911.      tree1ptr^[ftrack + 1].width := 84;
  912.      tree1ptr^[fslider + 1].width := 82;
  913.   END;
  914.   tree1ptr^[fspt +1].spec^.ptext := ADR(sptstr);
  915.   ObjectDraw(tree1ptr,fspt,0,x,y,w,h);
  916.   ObjectChange(tree1ptr,fspt,0,x,y,w,h,Normal,1);
  917.   ObjectDraw(tree1ptr,slidebox,3,x,y,w,h);
  918. END Changespt;
  919.  
  920. PROCEDURE switch(VAR a,b: String ; VAR s1 : BOOLEAN);
  921.   
  922. VAR
  923.  t : String;
  924.  
  925.   BEGIN
  926.     t := a;
  927.     a := b;
  928.     b := t;
  929.     s1 := NOT s1;
  930.   END switch;
  931.  
  932. PROCEDURE save1(VAR q : INTEGER ;VAR s8 : twod ;a ,k1 : INTEGER);
  933.  
  934.   BEGIN
  935.     q := q+1;
  936.     s8[q,1] := a+1;
  937.     s8[q,2] := k1
  938.   END save1;
  939.  
  940. PROCEDURE restore(s8:twod ; VAR i2,j2,q : INTEGER);
  941.  
  942.   BEGIN
  943.     i2 := s8[q,1];
  944.     j2 := s8[q,2];
  945.     q := q - 1
  946.   END restore;
  947.  
  948. PROCEDURE init(VAR a,b,a1,b1 : INTEGER ; VAR es : BOOLEAN);
  949.  
  950.  BEGIN
  951.     a := a1;
  952.     b := b1;
  953.     es := FALSE;
  954.  END init;
  955.  
  956. PROCEDURE sort;
  957.  
  958. BEGIN  
  959.   
  960.   REPEAT
  961.     IF (Compare(path[i],path[j]) = Greater) THEN switch(path[i],path[j],s);END;
  962.     IF s THEN i := i + 1
  963.            ELSE j := j - 1;END;
  964.   UNTIL  i = j;
  965.     IF NOT(i+1 >= j1) THEN save1(p,s9,i,j1);END;
  966.     j1 := i - 1;
  967.     IF i1 < j1 THEN
  968.         init(i,j,i1,j1,s);
  969.         sort;
  970.     END;
  971.     IF p <> 0 THEN
  972.        restore(s9,i1,j1,p);
  973.        init(i,j,i1,j1,s);
  974.        j := ii;
  975.        sort;
  976.     END;
  977.   END sort;
  978.  
  979. PROCEDURE AddSpaces(atrib : CARDINAL);
  980.  
  981. VAR
  982.    directchr : String;
  983.    l : INTEGER;
  984.  
  985. BEGIN
  986.    directchr := CHR(5);
  987.             Concat(directchr," ",directchr);
  988.             (* if the file name attribute is a sub directory, add a *)
  989.             (* CHR(5) to the front of the name to indicate a folder *)
  990.             IF atrib = 16 THEN
  991.                Concat(directchr,path[ii],rpath[ii]);
  992.             ELSE
  993.                (* add a space to the beginning to the file name to keep *)
  994.                (* all the file names lined up                           *)
  995.                Concat('  ',path[ii],rpath[ii]);
  996.             END; (* IF atrib *)
  997.             path[ii] := rpath[ii];
  998.             (* add spaces to the end of the file name if the length is *)
  999.             (* less than 14, why? it makes the file name selecting and *)
  1000.             (* deselecting visually more pleasent.                     *)
  1001.             IF Length(rpath[ii]) < 14 THEN
  1002.                FOR l := Length(rpath[ii]) + 1 TO 14 DO
  1003.                      Concat(rpath[ii],' ',rpath[ii]);
  1004.                END; (* FOR l *)
  1005.             END; (* IF Length *)   
  1006.             path[ii] := rpath[ii];
  1007. END AddSpaces;
  1008.    
  1009.              
  1010. PROCEDURE MakeArray(VAR ppath : ARRAY OF CHAR);
  1011.  
  1012. VAR
  1013.   addr : ADDRESS;
  1014.   pathdrive,presult,match,directchr,tempmaskstr : String;
  1015.   obspec : etree;
  1016.   i2,l : INTEGER;
  1017.   atrib,where,start : CARDINAL;
  1018.   found : BOOLEAN;
  1019.    
  1020. BEGIN
  1021.   ii := 0;
  1022.   fnslidery := 0;
  1023.   tswidth := 0.0;
  1024.   ttswidth := 0.0;
  1025.   maskaddr := tree1ptr^[mask + 1].spec^.ptext;
  1026.   maskstr := maskaddr^;
  1027.   tempmaskstr := maskstr;
  1028.   Delete(tempmaskstr,0,1);
  1029.   pathdrive := CHR(ORD(defaultdrive) + ORD('A'));
  1030.   Concat(pathdrive,':',presult);
  1031.   Concat(presult,ppath,pathstr);
  1032.   addr := ADR(dtarecord);
  1033.   GEMDOS.SetDTA(addr);
  1034.   GrafMouse(HourGlass,NIL);
  1035.   GEMDOS.SFirst(pathstr,16,result);
  1036.   IF result >= 0 THEN
  1037.      REPEAT
  1038.        WITH dtarecord DO;
  1039.          IF (Compare(name,'.') # Equal) AND (Compare(name,'..')
  1040.                                                        # Equal) THEN
  1041.            atrib := CARDINAL(attrib);
  1042.             IF Compare(maskstr,'*.*') = Equal THEN
  1043.                INC(ii);
  1044.                path[ii] := name;
  1045.                AddSpaces(atrib);
  1046.             ELSE   
  1047.                IF (Pos(name,tempmaskstr,0,where)) OR (atrib = 16) THEN 
  1048.                   INC(ii);
  1049.                   path[ii] := name;
  1050.                   AddSpaces(atrib);END;
  1051.             END;
  1052.  
  1053.          END; (* IF *)      
  1054.        END; (* WITH *)  
  1055.        IF ii < 300 THEN 
  1056.          GEMDOS.SNext(result);
  1057.        ELSE 
  1058.          showit := FormAlert(1,'[1][The maximum number of files|has been exceeded!][ OK ]');
  1059.          result := -1;END;
  1060.      UNTIL result < 0;
  1061.   END;  (* IF *)
  1062.       match := ' ';
  1063.       start := 0;
  1064.       where := 0;
  1065.       FOR i2 := 0 TO Length(pathstr) DO
  1066.           IF Pos(pathstr,match,start,where) THEN
  1067.           Delete(pathstr,where,1); END;
  1068.           INC(start); 
  1069.       END; (* FOR *)
  1070.       IF ii > 1 THEN
  1071.          i1 := 1;
  1072.          i := 0;
  1073.          p := 0;
  1074.          j1 := ii;
  1075.          init(i,j,i1,j1,s);
  1076.           j := ii;
  1077.          sort;
  1078.       END; (* IF ii > *)   
  1079.       found := Pos(pathstr,'*.',0,where);
  1080.       Delete(pathstr,where,Length(pathstr) - where);
  1081.       Concat(pathstr,maskstr,pathstr);
  1082.       tree1ptr^[fpath + 1].spec^.ptext := ADR(pathstr);
  1083.       IF initialized THEN
  1084.       ObjectDraw(tree1ptr,fpath,1,x,y,w,h);END;
  1085.       GrafMouse(Arrow,NIL);
  1086. END MakeArray;
  1087.     
  1088. PROCEDURE Directory;
  1089.  
  1090. VAR
  1091.   i : INTEGER;
  1092.   obspec : etree;
  1093.   
  1094. BEGIN
  1095.      FOR i := 1 TO 12 DO
  1096.         tree1ptr^[fname2 + i].spec^.ptext := ADR(path[i]);END;
  1097. END Directory;         
  1098.  
  1099. PROCEDURE ClearArray;
  1100.  
  1101. VAR
  1102.   clearstr : String;
  1103.   obspec : etree;
  1104.   i : INTEGER;
  1105.   
  1106. BEGIN
  1107.   clearstr := '           ';
  1108.   FOR i := 0 TO ii DO
  1109.       path[i] := clearstr;
  1110.       tree1ptr^[fname2 + 1].spec^.ptext := ADR(path[i]);
  1111.   END; (* FOR *)
  1112.   
  1113. END ClearArray;
  1114.  
  1115. PROCEDURE ScrollDown;
  1116.  
  1117. VAR
  1118.   obspec : etree;
  1119.   i,j : INTEGER;
  1120.  
  1121. BEGIN
  1122.   ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  1123.   ObjectDraw(tree1ptr,fnametemp,1,x,y,w,h);
  1124.   j := 0;
  1125.   IF fcount < ii THEN
  1126.      DEC(index,11);
  1127.      FOR i := 1 TO 12 DO
  1128.        INC(index);
  1129. (*       obspec^.ptext := ADR(path[index]);*)
  1130.        tree1ptr^[fname2 + i].spec^.ptext := ADR(path[index]);
  1131.        ObjectDraw(tree1ptr,fname2 + j,1,x,y,w,h);
  1132.        INC(j);
  1133.      END; (* FOR *)
  1134.      INC(fcount);
  1135.      tswidth := tswidth + swidth;
  1136.      tree1ptr^[fnslider + 1].y := INTEGER(TRUNC(tswidth));
  1137.      ObjectDraw(tree1ptr,fntrack,1,x,y,w,h);
  1138.   END; (* IF *)
  1139. END ScrollDown;
  1140.  
  1141. PROCEDURE ScrollUp;
  1142.  
  1143. VAR 
  1144.   i,j : INTEGER;
  1145.   obspec : etree;
  1146.   
  1147. BEGIN
  1148.   ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  1149.   IF fcount > 12 THEN
  1150.      i := 12;
  1151.      j := 0;
  1152.      INC(index,11);
  1153.      WHILE i # 0 DO
  1154.          tree1ptr^[fname2 + i].spec^.ptext := ADR(path[index - 12]);
  1155.          ObjectDraw(tree1ptr,fname13 - j,1,x,y,w,h);
  1156.          DEC(i);
  1157.          INC(j);
  1158.          DEC(index);
  1159.      END; (* WHILE *)
  1160.      DEC(fcount);
  1161.      tswidth := tswidth - swidth;
  1162.      IF tswidth < 0.0 THEN tswidth := 0.0; END;
  1163.      tree1ptr^[fnslider + 1].y := INTEGER(TRUNC(tswidth));
  1164.      ObjectDraw(tree1ptr,fntrack,1,x,y,w,h);      
  1165.   END; (* IF *)
  1166. END ScrollUp;
  1167.  
  1168. PROCEDURE Scroll12;
  1169.  
  1170. VAR
  1171.   obspec : etree;
  1172.   temp,i,mx,my,mstate,kstate,xoff,yoff : INTEGER;
  1173.   
  1174. BEGIN
  1175.   ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  1176.   GrafMouseKeyboardState(mx,my,mstate,kstate);
  1177.   ObjectOffset(tree1ptr,fnslider,xoff,yoff);
  1178.   IF my > yoff THEN
  1179.     IF fcount < ii THEN
  1180.        temp := ii - fcount;
  1181.        IF temp < 12 THEN
  1182.           temp := 12 - temp;
  1183.           fcount := fcount - temp;
  1184.           index := index - temp;
  1185.        END;   
  1186.        FOR i := 1 TO 12 DO
  1187.            INC(fcount);
  1188.            INC(index);
  1189.            tree1ptr^[fname2 + i].spec^.ptext := ADR(path[index]);
  1190.            tswidth := tswidth + swidth;
  1191.        END;  (* FOR *)
  1192.        IF tswidth + FLOAT(CARDINAL(sh)) > FLOAT(CARDINAL(th)) THEN
  1193.           tswidth := FLOAT(CARDINAL(th)) - ttswidth;
  1194.        END;
  1195.        tree1ptr^[fnslider + 1].y := INTEGER(TRUNC(tswidth));
  1196.        ObjectDraw(tree1ptr,fntrack,1,x,y,w,h);
  1197.        ObjectDraw(tree1ptr,fwind,2,x,y,w,h);
  1198.     END;
  1199.   ELSE
  1200.      IF fcount > 12 THEN
  1201.        i := 12;
  1202.        IF index < 24 THEN
  1203.           temp := 24 - index;
  1204.           index := index + temp;
  1205.           fcount := index;
  1206.        END;   
  1207.        WHILE  i <> 0 DO
  1208.            tree1ptr^[fname2 + i].spec^.ptext := ADR(path[CARDINAL(index) - 12]);
  1209.            tswidth := tswidth - swidth;
  1210.            DEC(index);
  1211.            DEC(fcount);
  1212.            DEC(i);
  1213.        END;  (* WHILE *)
  1214.        IF tswidth < 0.0  THEN  tswidth := 0.0 ; END;
  1215.        tree1ptr^[fnslider + 1].y := INTEGER(TRUNC(tswidth));
  1216.        ObjectDraw(tree1ptr,fntrack,1,x,y,w,h);
  1217.        ObjectDraw(tree1ptr,fwind,2,x,y,w,h);
  1218.      END;
  1219.   END;   
  1220. END Scroll12;
  1221.  
  1222. PROCEDURE FileInfo;
  1223.  
  1224.  VAR
  1225.   fobspec,toobspec,obspec : etree;
  1226.   fname : POINTER TO String;
  1227.   start,mode,where,count,RESULT : CARDINAL;
  1228.   fnameaddr,addr : ADDRESS;
  1229.   which,get : GEMDOS.SetOrGet;
  1230.   drivepath,fnamestr,resultdrive,resultpath,thestring,temp,match,
  1231.   tempcurrentname : String;
  1232.   f,done,p : BOOLEAN;
  1233.   result,c,i : INTEGER;
  1234.   
  1235. BEGIN
  1236.   fname := tree1ptr^[ftoname + 1].spec^.ptext;
  1237.   currentname := fname^;
  1238.   tempcurrentname := currentname;
  1239.   FOR c := 1 TO ii DO
  1240.     IF NOT Pos(path[c],'*',0,where) THEN
  1241.       temp := path[c];
  1242.       Delete(temp,0,2);
  1243.       match := ' ';
  1244.       start := 0;
  1245.       where := 0;
  1246.       FOR i := 1 TO Length(temp) DO
  1247.           IF Pos(temp,match,start,where) THEN
  1248.           Delete(temp,where,Length(temp) - where); END;
  1249.           INC(start); 
  1250.       END;
  1251.     END;
  1252.     IF Compare(temp,tempcurrentname) = Equal THEN
  1253.        foundit := c; END;
  1254.   END;  
  1255.      
  1256.   IF Length(tempcurrentname) > 0 THEN
  1257.       tree1ptr^[filename +1].spec^.ptext := tree1ptr^[ftoname +1].spec^.ptext;
  1258.       fname := tree1ptr^[ftoname + 1].spec^.ptext;
  1259.       currentname := fname^;
  1260.       tempcurrentname := currentname;
  1261.      drivepath := CHR(ORD(defaultdrive) + ORD('A'));
  1262.      Concat(drivepath,':\',resultdrive);
  1263.      Concat(resultdrive,tempcurrentname,resultpath);
  1264.      IF Length(ffpath) > 4 THEN
  1265.         Copy(ffpath,0,Length(ffpath),temp);
  1266.         f := Pos(temp,'\*.*',0,where);
  1267.         Delete(temp,where,4);
  1268.         f := Pos(resultpath,':\',0,where);
  1269.         Insert(temp,resultpath,where + 1);
  1270.      END; (* IF *)   
  1271.      which := get;
  1272.      mode := 0;
  1273.      GrafMouse(HourGlass,NIL);
  1274.      GEMDOS.Attrib(resultpath,GEMDOS.get,mode);
  1275.      addr := ADR(dtarecord);
  1276.      GEMDOS.SetDTA(addr);
  1277.      GEMDOS.SFirst(resultpath,0,result);
  1278.      IF result >= 0 THEN
  1279.         WITH dtarecord DO
  1280.           ConvertToString(LONGCARD(size),10,FALSE,thestring,done);
  1281.           tree1ptr^[fbytes + 1].spec^.ptext := ADR(thestring);
  1282.           ObjectDraw(tree1ptr,fbytes,1,x,y,w,h);
  1283.           ConvertDateTime(date,time);
  1284.           tree1ptr^[fdate + 1].spec^.ptext := ADR(datestr);
  1285.           ObjectDraw(tree1ptr,fdate,1,x,y,w,h);
  1286.           tree1ptr^[ftime + 1].spec^.ptext := ADR(tresultstr);
  1287.           ObjectDraw(tree1ptr,ftime,1,x,y,w,h);               
  1288.         END;(* WITH *)
  1289.      END; (* IF *)
  1290.      IF Pos(tempcurrentname,'.',0,where) THEN
  1291.           IF where < 8 THEN
  1292.              RESULT := 9 - where - 1;
  1293.              start := where;
  1294.              count := 0;
  1295.              REPEAT
  1296.                Insert(' ',tempcurrentname,start);
  1297.                INC(count);
  1298.              UNTIL count = RESULT;
  1299.              p := Pos(tempcurrentname,'.',0,where);
  1300.           END; (* IF where *)
  1301.           Delete(tempcurrentname,where,1);
  1302.           (*fobspec^.ptext := ADR(tempcurrentname);*)
  1303.           tree1ptr^[filename + 1].spec^.ptext := ADR(tempcurrentname);
  1304.        END; (* IF Pos *)         
  1305.      ObjectDraw(tree1ptr,filename,1,x,y,w,h);
  1306.      IF mode = 0 THEN
  1307.         ObjectChange(tree1ptr,frw,0,x,y,w,h,selected,1);
  1308.         ObjectChange(tree1ptr,fro,0,x,y,w,h,Normal,1);
  1309.         ObjectDraw(tree1ptr,fro,1,x,y,w,h);
  1310.         ObjectDraw(tree1ptr,frw,1,x,y,w,h);
  1311.      ELSE
  1312.         ObjectChange(tree1ptr,fro,0,x,y,w,h,selected,1);   
  1313.         ObjectChange(tree1ptr,frw,0,x,y,w,h,Normal,1);
  1314.         ObjectDraw(tree1ptr,frw,1,x,y,w,h);
  1315.         ObjectDraw(tree1ptr,fro,1,x,y,w,h);
  1316.      END;
  1317.      ObjectChange(tree1ptr,finfo,0,x,y,w,h,Normal,1);
  1318.      ObjectDraw(tree1ptr,finfo,1,x,y,w,h);
  1319.      ObjectChange(tree1ptr,fset,0,x,y,w,h,Normal,1);
  1320.      GrafMouse(Arrow,NIL);
  1321.   ELSE
  1322.      ObjectChange(tree1ptr,finfo,0,x,y,w,h,Normal,1);
  1323.   END;      
  1324. END FileInfo;
  1325.         
  1326. PROCEDURE SetTheDrive;
  1327.  
  1328. VAR
  1329.   drvmap : LONGCARD;
  1330.   obspec : etree;
  1331.  
  1332. BEGIN
  1333.   IF GetObjectState(tree1ptr,tree1,drivea,Selected) THEN drive := 0; END;
  1334.   IF GetObjectState(tree1ptr,tree1,driveb,Selected) THEN drive := 1; END;
  1335.   IF GetObjectState(tree1ptr,tree1,drivec,Selected) THEN drive := 2; END;
  1336.   IF GetObjectState(tree1ptr,tree1,drived,Selected) THEN drive := 3; END;
  1337.   IF GetObjectState(tree1ptr,tree1,drivee,Selected) THEN drive := 4; END;
  1338.   IF GetObjectState(tree1ptr,tree1,drivef,Selected) THEN drive := 5; END;
  1339.   IF GetObjectState(tree1ptr,tree1,driveg,Selected) THEN drive := 6; END;
  1340.   IF GetObjectState(tree1ptr,tree1,driveh,Selected) THEN drive := 7; END;
  1341.   IF GetObjectState(tree1ptr,tree1,drivei,Selected) THEN drive := 8; END;
  1342.   IF GetObjectState(tree1ptr,tree1,drivej,Selected) THEN drive := 9; END;
  1343.   IF GetObjectState(tree1ptr,tree1,drivek,Selected) THEN drive := 10; END;
  1344.   IF GetObjectState(tree1ptr,tree1,drivel,Selected) THEN drive := 11; END;
  1345.   IF GetObjectState(tree1ptr,tree1,drivem,Selected) THEN drive := 12; END;
  1346.   IF GetObjectState(tree1ptr,tree1,driven,Selected) THEN drive := 13; END;
  1347.   IF GetObjectState(tree1ptr,tree1,driveo,Selected) THEN drive := 14; END;
  1348.   IF GetObjectState(tree1ptr,tree1,drivep,Selected) THEN drive := 15; END;
  1349.   GrafMouse(HourGlass,NIL);
  1350.   GEMDOS.SetDrv(drive,drvmap);
  1351.   GEMDOS.GetDrv(defaultdrive);
  1352.   (*ppath := '';
  1353.   p1 := '';
  1354.   p2 := '';
  1355.   p3 := '';
  1356.   p4 := '';
  1357.   ffpath := '';
  1358.   Temp1 := '';
  1359.   Temp2 := '';
  1360.   Temp3 := '';
  1361.   r1 := '';
  1362.   r2 := '';
  1363.   r3 := '';
  1364.   r4 := '';*)
  1365.   COUNT := 0;
  1366.   fcount := 12;
  1367.   ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1); 
  1368.   ClearArray; 
  1369.   MakeArray(globlepath);
  1370.   ffpath := globlepath;
  1371.   Directory;
  1372.   index := 12;
  1373.   CalcSliderSize;
  1374.   ObjectDraw(tree1ptr,fwind,2,x,y,w,h);
  1375.   GrafMouse(Arrow,NIL);
  1376.   ClearIt;
  1377. END SetTheDrive;
  1378.  
  1379. PROCEDURE FirstPath;
  1380.  
  1381.   BEGIN 
  1382.     Concat('\',farray,r1);
  1383.     Concat(r1,'\*.*',p1);
  1384.     ffpath := p1;
  1385.   END FirstPath;
  1386.  
  1387. PROCEDURE SecondPath;
  1388.  
  1389.   BEGIN
  1390.     Concat('\',farray,r2);
  1391.     Concat(r1,r2,Temp1);
  1392.     Concat(Temp1,'\*.*',p2);
  1393.     ffpath := p2;
  1394.   END SecondPath;
  1395.  
  1396. PROCEDURE ThirdPath;
  1397.  
  1398. BEGIN
  1399.    Concat('\',farray,r3);
  1400.    Concat(Temp1,r3,Temp2);
  1401.    Concat(Temp2,'\*.*',p3);
  1402.    ffpath := p3;
  1403. END ThirdPath;
  1404.  
  1405. PROCEDURE FourthPath;
  1406.  
  1407. BEGIN
  1408.   Concat('\',farray,r4);
  1409.   Concat(Temp2,r4,Temp3);
  1410.   Concat(Temp3,'\*.*',p4);
  1411.   ffpath := p4;
  1412. END FourthPath;
  1413.            
  1414.  
  1415. PROCEDURE MoveName(fname : INTEGER);
  1416.  
  1417. VAR
  1418.  nameobspec,toobspec : etree;
  1419.  fnameaddr : POINTER TO String;
  1420.  nothin : String;
  1421.  l : INTEGER;
  1422.  where,start : CARDINAL;
  1423.                              
  1424. BEGIN
  1425.   fnameaddr := tree1ptr^[fname + 1].spec^.ptext;
  1426.   farray := fnameaddr^;
  1427.   match := CHR(5);
  1428.   IF Pos(farray,match,0,where) THEN
  1429.      ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  1430.      ObjectChange(tree1ptr,fname,0,x,y,w,h,selected,1);
  1431.      IF COUNT < 4 THEN              
  1432.             INC(COUNT);END;
  1433.      Delete(farray,0,2);
  1434.      IF COUNT < 5 THEN
  1435.         CASE COUNT OF
  1436.            1 : FirstPath;|   
  1437.            2 : SecondPath;|          
  1438.            3 : ThirdPath;| 
  1439.            4 : FourthPath; 
  1440.          END; (* CASE *)
  1441.          ClearArray;
  1442.          MakeArray(ffpath);
  1443.          Directory;
  1444.          CalcSliderSize;
  1445.          index := 12;
  1446.          fcount := 12;
  1447.          ObjectChange(tree1ptr,fname,0,x,y,w,h,Normal,1);
  1448.          ObjectDraw(tree1ptr,fname,1,x,y,w,h);
  1449.          ObjectDraw(tree1ptr,fwind,2,x,y,w,h);
  1450.          globlepath := ffpath;
  1451.          ClearIt;
  1452.      END;
  1453.   ELSE 
  1454.      IF NOT Pos(farray,match,0,where) THEN
  1455.      fnameaddr := tree1ptr^[fname + 1].spec^.ptext;
  1456.      filearray := fnameaddr^;
  1457.        Delete(filearray,0,2);
  1458.        IF Pos(filearray,' ',0,where) THEN
  1459.           FOR l := where TO Length(filearray) DO
  1460.               Delete(filearray,where,1);
  1461.           END; (* FOR  *)
  1462.        END; (* IF *)
  1463.        nothin := '';
  1464.        IF Compare(filearray,nothin) <> Equal THEN
  1465.        fileselection := fname;
  1466.        tree1ptr^[ftoname + 1].spec^.ptext := ADR(filearray);
  1467.        ObjectDraw(tree1ptr,ftoname,1,x,y,w,h);
  1468.        ObjectChange(tree1ptr,fname,0,x,y,w,h,selected,1);
  1469.          IF fname > fnametemp THEN
  1470.           ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);END;
  1471.          IF fname < fnametemp THEN
  1472.           ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);END;
  1473.          fnametemp := fname;       
  1474.        END;  
  1475.     END;   
  1476.   END; (* IF ELSE *)       
  1477. END MoveName;
  1478.  
  1479. PROCEDURE RenameOrSetAttrib;
  1480.  
  1481. VAR
  1482.   start,nb,l,mode,where,regresult,numberofspaces : CARDINAL;
  1483.   obspec,nobspec : etree;
  1484.   fnameaddr : POINTER TO String;
  1485.   which,get,set : GEMDOS.SetOrGet;
  1486.   pathdrive,newstr,oldstr,npathstr,temp,
  1487.   tempstr,rnewstr,result,thestring,newname : String;
  1488.   i,errorcheck : INTEGER;
  1489.   p,f,done,noerror : BOOLEAN;
  1490.   
  1491. BEGIN
  1492.   start := 0;
  1493.   noerror := TRUE;
  1494.   fnameaddr := tree1ptr^[filename + 1].spec^.ptext;
  1495.   newname := fnameaddr^;
  1496.   IF Length(newname) > 8 THEN
  1497.      IF Pos(newname,' ',0,where) THEN
  1498.         IF (where > 8) OR (where = 0) THEN
  1499.            Insert('.',newname,where);END;
  1500.         IF where # 0 THEN
  1501.            Insert('.',newname,where);
  1502.            p := Pos(newname,' ',0,where);
  1503.            nb := where;
  1504.            Delete(newname,where,9 - where);
  1505. END; (* IF where *)
  1506.      ELSE
  1507.        Insert('.',newname,8);
  1508.      END; (* IF Pos(newname) *)        
  1509.   END; (* IF Length(newname) *) 
  1510.   pathdrive := CHR(ORD(defaultdrive) + ORD('A'));
  1511.   Concat(pathdrive,':\',npathstr);
  1512.   Concat(npathstr,currentname,oldstr);
  1513.   Concat(npathstr,newname,newstr);
  1514.   IF Length(ffpath) > 0 THEN
  1515.      Copy(ffpath,0,Length(ffpath),temp);
  1516.      f := Pos(temp,'\*.*',0,where);
  1517.      Delete(temp,where,4);
  1518.      f := Pos(oldstr,':\',0,where);
  1519.      Insert(temp,oldstr,where + 1);
  1520.      Insert(temp,newstr,where + 1);
  1521.   END; (* IF *)
  1522.   IF Compare(currentname,newname) # Equal THEN
  1523.      IF Length(newname) > 0 THEN  
  1524.         GEMDOS.Rename(oldstr,newstr);
  1525.         Concat('  ',newname,rnewstr);
  1526.         tree1ptr^[fileselection + 1].spec^.ptext := ADR(rnewstr);
  1527.         IF Length(rnewstr) < 14 THEN
  1528.            numberofspaces := 14 - Length(rnewstr) + 1;
  1529.            FOR i := 1 TO numberofspaces DO
  1530.            Concat(rnewstr,' ',rnewstr);result := rnewstr; END;
  1531.         ELSE 
  1532.            result := rnewstr;
  1533.         END;      
  1534.         path[foundit] := result;
  1535.         ObjectDraw(tree1ptr,fileselection,1,x,y,w,h);
  1536.      ELSE
  1537.         showit := FormAlert(1,'[1][You did not specify|a name!][ OK ]');        noerror := FALSE;    
  1538.      END;
  1539.   END;(* IF Compare *) 
  1540.   IF noerror THEN     
  1541.      IF GetObjectState(tree1ptr,tree1,frw,Selected) THEN
  1542.         mode := 0;
  1543.      ELSE 
  1544.        mode := 1;
  1545.      END;
  1546.      which := GEMDOS.set;
  1547.      GEMDOS.Attrib(oldstr,GEMDOS.set,mode);
  1548.      ClearIt;
  1549.      ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  1550.   END;   
  1551.      ObjectChange(tree1ptr,fset,0,x,y,w,h,disabled,1);
  1552.      ObjectDraw(tree1ptr,fset,1,x,y,w,h);
  1553. END RenameOrSetAttrib;
  1554.  
  1555. PROCEDURE FilePath;
  1556.  
  1557. VAR
  1558.   obspec : etree;
  1559.   start,where : CARDINAL;
  1560.   found : BOOLEAN;
  1561.   nothin,clear : String;
  1562.  
  1563. BEGIN
  1564.    ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  1565.    IF COUNT > 0  THEN
  1566.       CASE COUNT OF
  1567.        1 : ppath := '\*.*';
  1568.            ffpath := '\*.*';
  1569.            p1 := '';|
  1570.        
  1571.        2 : ppath := p1;
  1572.            ffpath := p1;
  1573.            p2 := '';|
  1574.            
  1575.        3 : ppath := p2;
  1576.            ffpath := p2;
  1577.            p3 := '';|
  1578.        
  1579.        4 : ppath := p3;
  1580.            ffpath := p3;
  1581.            p4 := '';
  1582.      END;
  1583.      IF COUNT >= 1 THEN
  1584.         DEC(COUNT);END;             
  1585.      ClearArray;   
  1586.      MakeArray(ppath);
  1587.      Directory;
  1588.      index := 12;
  1589.      fcount := 12;
  1590.      CalcSliderSize;
  1591.      ObjectDraw(tree1ptr,fwind,2,x,y,w,h);
  1592.      globlepath := ppath;
  1593.      nothin := '';
  1594.      IF NOT GetObjectState(tree1ptr,tree1,cpyfile,Selected) THEN
  1595.      filearray := nothin;END;
  1596.      clear := '';
  1597.    END; 
  1598.    ClearIt;
  1599. END FilePath;  
  1600.  
  1601. PROCEDURE PrintLine(path : String ; atrib : CARDINAL ; size : LONGCARD);
  1602.  
  1603. VAR
  1604.    rblank,rpath,rrpath : String;
  1605.    l : CARDINAL;
  1606.    
  1607. BEGIN
  1608.   l := Length(path);
  1609.   IF l < 13 THEN
  1610.      FOR t := l TO 12 DO
  1611.          Concat(rblank,' ',rblank);
  1612.      END; (* FOR *)
  1613.      Concat(path,rblank,rpath);
  1614.      rblank := '';   
  1615.   END; (* IF *)
  1616.   IF atrib = 16 THEN
  1617.      Concat('*',rpath,rrpath);
  1618.   ELSE
  1619.      Concat(' ',rpath,rrpath);
  1620.   END; (* IF *)
  1621.   INC(ct);
  1622.   WriteString(rrpath);
  1623.   WriteString(' ');
  1624.   WriteLongCard(size,6);
  1625.   WriteString('  ');
  1626.   IF ct = 3 THEN 
  1627.      WriteLn;
  1628.      ct := 0;
  1629.   END;(* IF *)
  1630. END PrintLine;
  1631.           
  1632. PROCEDURE PrintThePath;
  1633.  
  1634. VAR
  1635.   result : INTEGER;
  1636.   blanks,blank,rblank,astek, 
  1637.   rpath,path,rrpath,single,double,tsizestr,temppathstr,tempmaskstr : String;
  1638.   l,i,t,atrib,where,start : CARDINAL;
  1639.   count : INTEGER;
  1640.  
  1641. BEGIN
  1642.   maskaddr := tree1ptr^[mask + 1].spec^.ptext;
  1643.   maskstr := maskaddr^;
  1644.   tempmaskstr := maskstr;
  1645.   Delete(tempmaskstr,0,1);
  1646.   WriteString('PATH: ');
  1647.   temppathstr := pathstr;
  1648.       match := ' ';
  1649.       start := 0;
  1650.       where := 0;
  1651.       FOR i := 0 TO Length(temppathstr) DO
  1652.           IF Pos(temppathstr,match,start,where) THEN
  1653.           Delete(temppathstr,where,1); END;
  1654.           INC(start); 
  1655.       END; (* FOR *)
  1656.   WriteString(temppathstr);
  1657.   WriteLn;
  1658.   WriteLn;
  1659.   REPEAT
  1660.     WITH dtarecord DO
  1661.        single := '.';
  1662.        double := '..';
  1663.        IF (Compare(name,single) # Equal) AND 
  1664.           (Compare(name,double) # Equal) THEN
  1665.           (* path := name;*)
  1666.           atrib := CARDINAL(attrib);
  1667.           IF Compare(maskstr,'*.*') = Equal THEN
  1668.                path := name;
  1669.                PrintLine(path,atrib,size);
  1670.                tsize := tsize + size;
  1671.           ELSE   
  1672.                IF (Pos(name,tempmaskstr,0,where)) OR (atrib = 16) THEN 
  1673.                   path := name;
  1674.                   PrintLine(path,atrib,size);
  1675.                   tsize := tsize + size;
  1676.                END;
  1677.           END;
  1678.        END; (* IF *)  
  1679.     END; (* WITH *)
  1680.     GEMDOS.SNext(result);
  1681.     IF NOT KeyPressed() THEN
  1682.        result := -1;END;
  1683.     GrafMouse(HourGlass,NIL);
  1684.   UNTIL result < 0; 
  1685.   ct := 0;
  1686.   WriteLn;
  1687.   WriteLn;
  1688.   ConvertToString(LONGCARD(tsize),10,FALSE,tsizestr,done);
  1689.   WriteString(tsizestr);
  1690.   WriteString(' Bytes used in ');
  1691.   WriteString(temppathstr);
  1692.   WriteLn;
  1693.   WriteLn;
  1694.   GetFreeSpace;
  1695.   ConvertToString(LONGCARD(free),10,FALSE,freestr,done);
  1696.   WriteString(freestr);
  1697.   WriteString(' BYTES Remaining');
  1698.   WriteLn; 
  1699.   tsize := 0;
  1700.    
  1701. END PrintThePath;
  1702.  
  1703.  
  1704. PROCEDURE PrintOneLine(path : String ; atrib,time,date : CARDINAL ; size : LONGCARD);
  1705.  
  1706. VAR
  1707.   rblank,rpath,rrpath : String;
  1708.   l : INTEGER;
  1709. BEGIN
  1710.   l := Length(path);
  1711.   IF l < 13 THEN
  1712.      FOR t := l TO 12 DO
  1713.          Concat(rblank,' ',rblank);
  1714.      END; (* FOR *)
  1715.      Concat(path,rblank,rpath);
  1716.      rblank := '';   
  1717.   END; (* IF *)
  1718.   
  1719.   IF atrib = 16 THEN
  1720.      Concat('*',rpath,rrpath);
  1721.   ELSE
  1722.      Concat(' ',rpath,rrpath);
  1723.   END; (* IF *)                                  
  1724.   WriteString(rrpath);
  1725.   ConvertDateTime(date,time);
  1726.   Insert('-',datestr,2);
  1727.   Insert('-',datestr,5);
  1728.   Insert(':',tresultstr,2);
  1729.   WriteString('   ');
  1730.   WriteString(tresultstr);
  1731.   WriteString('   ');
  1732.   WriteString(datestr);
  1733.   WriteString('   ');                        
  1734.   WriteLongCard(size,6);
  1735.   WriteString('  ');
  1736.   WriteLn;
  1737. END PrintOneLine;
  1738.  
  1739. PROCEDURE PrintAll;
  1740.  
  1741. VAR
  1742.   result : INTEGER;
  1743.   blanks,blank,rblank,astek,
  1744.   rpath,path,rrpath,single,double,tsizestr,temppathstr,tempmaskstr : String;
  1745.   l,i,t,atrib,where,start,count : CARDINAL;
  1746.   
  1747. BEGIN
  1748.   maskaddr := tree1ptr^[mask + 1].spec^.ptext;
  1749.   maskstr := maskaddr^;
  1750.   tempmaskstr := maskstr;
  1751.   Delete(tempmaskstr,0,1);
  1752.   WriteString('PATH: ');
  1753.   temppathstr := pathstr;
  1754.       match := ' ';
  1755.       count := 0;
  1756.       start := 0;
  1757.       where := 0;
  1758.       FOR i := 0 TO Length(temppathstr) DO
  1759.           IF Pos(temppathstr,match,start,where) THEN
  1760.           Delete(temppathstr,where,1); END;
  1761.           INC(start); 
  1762.       END; (* FOR *)
  1763.   WriteString(temppathstr);
  1764.   WriteLn;
  1765.   WriteLn;
  1766.   WriteString('  File Name       Time     Date       Size');
  1767.   WriteLn;
  1768.   WriteLn;
  1769.   REPEAT
  1770.     WITH dtarecord DO
  1771.        single := '.';
  1772.        double := '..';
  1773.        IF (Compare(name,single) # Equal) AND 
  1774.           (Compare(name,double) # Equal) THEN  
  1775.           atrib := CARDINAL(attrib);
  1776.           IF Compare(maskstr,'*.*') = Equal THEN
  1777.                path := name;
  1778.                PrintOneLine(path,atrib,time,date,size);
  1779.                tsize := tsize + size;
  1780.           ELSE   
  1781.                IF (Pos(name,tempmaskstr,0,where)) OR (atrib = 16) THEN 
  1782.                   path := name;
  1783.                   PrintOneLine(path,atrib,time,date,size);
  1784.                   tsize := tsize + size;
  1785.                END;
  1786.           END;
  1787.        END; (* IF *)   
  1788.     END; (* WITH *)
  1789.     GEMDOS.SNext(result);
  1790.     IF NOT KeyPressed() THEN
  1791.        result := -1;END;
  1792.     GrafMouse(HourGlass,NIL);
  1793.   UNTIL result < 0;
  1794.     WriteLn;
  1795.     WriteLn;
  1796.     ConvertToString(LONGCARD(tsize),10,FALSE,tsizestr,done);
  1797.     WriteString(tsizestr);
  1798.     WriteString(' Bytes used in ');
  1799.     WriteString(temppathstr);
  1800.     WriteLn;
  1801.     WriteLn;
  1802.     GetFreeSpace;
  1803.     ConvertToString(LONGCARD(free),10,FALSE,freestr,done);
  1804.     WriteString(freestr);
  1805.     WriteString(' BYTES Remaining');
  1806.     WriteLn; 
  1807.     tsize := 0;
  1808. END PrintAll;
  1809.  
  1810. PROCEDURE HardCopy;
  1811.  
  1812. VAR
  1813.   addr : ADDRESS;
  1814.   rprint,found : BOOLEAN;
  1815.   temppathstr : String;
  1816.   where : CARDINAL;
  1817.   
  1818. BEGIN
  1819.   addr := ADR(dtarecord);
  1820.   GEMDOS.SetDTA(addr);
  1821.   temppathstr := pathstr;
  1822.   found := Pos(temppathstr,'*.',0,where);
  1823.   Delete(temppathstr,where,Length(temppathstr) - where);
  1824.   Concat(temppathstr,'*.*',temppathstr);
  1825.   GEMDOS.SFirst(temppathstr,16,result);
  1826.   rprint := BCosStat(PRT);
  1827.   GrafMouse(HourGlass,NIL);
  1828.   IF rprint = TRUE THEN
  1829.      OpenOutputFile("PRN:");
  1830.      WriteLn;
  1831.      IF GetObjectState(tree1ptr,tree1,fnone,Selected) THEN
  1832.         PrintThePath;
  1833.         WriteLn;
  1834.         OpenOutputFile("CON:");
  1835.      ELSE
  1836.         PrintAll;
  1837.         WriteLn;
  1838.         OpenOutputFile("CON:");
  1839.      END; (* IF *)
  1840.    ELSE
  1841.      showit := FormAlert(1,"[1][Printer is not|responding!][ OK ]");
  1842.    END; (* IF *)
  1843.    GrafMouse(Arrow,NIL);
  1844.    ObjectChange(tree1ptr,fprint,0,x,y,w,h,Normal,1);
  1845. END HardCopy;
  1846.  
  1847. PROCEDURE MoveSlider;
  1848.  
  1849. VAR
  1850.    i,sw,sh,tw,th,fx,fy,trackx,tracky,sliderx,slidery,
  1851.    curyoff : INTEGER;
  1852.    obspec : etree;
  1853.    count : REAL;
  1854.       
  1855. BEGIN
  1856.    ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  1857.    sw := tree1ptr^[fnslider + 1].width + 1;
  1858.    sh := tree1ptr^[fnslider + 1].height;
  1859.    tw := tree1ptr^[fntrack + 1].width;
  1860.    th := tree1ptr^[fntrack + 1].height;     
  1861.    ObjectOffset(tree1ptr,fntrack,trackx,tracky);
  1862.    ObjectOffset(tree1ptr,fnslider,sliderx,slidery);
  1863.    GrafDragBox(sw,sh,sliderx,slidery,trackx,tracky,tw,th,fx,fy);
  1864.    tree1ptr^[fnslider + 1].y := fy - tracky;
  1865.    ObjectDraw(tree1ptr,fntrack,1,x,y,w,h);
  1866.    count := FLOAT(CARDINAL(fy - tracky)) / swidth;
  1867.    index := INTEGER(TRUNC(count));
  1868.    fcount := index;
  1869.    curyoff := tree1ptr^[fnslider + 1].y;
  1870.    tswidth := count * swidth;
  1871.       FOR i := 1 TO 12 DO
  1872.           INC(fcount);
  1873.           INC(index);
  1874.           tree1ptr^[fname2 + i].spec^.ptext := ADR(path[index]);
  1875.       END; (* FOR *)
  1876.       ObjectDraw(tree1ptr,fwind,1,x,y,w,h);
  1877.    oldyoff := curyoff;
  1878. END MoveSlider;
  1879.  
  1880. PROCEDURE copy(rsfile,rdfile : String);
  1881.  
  1882. VAR 
  1883.    infile, xoff,yoff,ewidth,eheight,stx,sty,stw,sth : INTEGER;
  1884.    endof : GEMDOS.SeekMode;
  1885.    position,count : LONGCARD;
  1886.    done,p,f : BOOLEAN;
  1887.    cftree,cf2tree : etree;
  1888.    tempstr,newstr,newnamestr,temp2str,errorstr,thestring : String;
  1889.    l,where,start,count2,RESULT,nb : CARDINAL;
  1890.    i : INTEGER;
  1891.    newnameaddr : POINTER TO String;
  1892.  
  1893. BEGIN
  1894.    start := 0;
  1895.    where := 0;
  1896.    GrafMouse(HourGlass,NIL);
  1897.    GEMDOS.Open(rdfile,0,outfile);
  1898.    IF outfile >= 0 THEN
  1899.       match := '\';
  1900.       FOR i := 0 TO Length(rdfile) DO
  1901.           IF Pos(rdfile,match,start,where) THEN
  1902.           INC(start); END;
  1903.       END;     
  1904.       tempstr := rdfile;
  1905.       Delete(tempstr,0,start);
  1906.       
  1907.       start := 0;
  1908.       where := 0;
  1909.  
  1910.       IF Pos(tempstr,'.',0,where) THEN
  1911.           IF where < 8 THEN
  1912.              RESULT := 9 - where - 1;
  1913.              start := where;
  1914.              count2 := 0;
  1915.              REPEAT
  1916.                Insert(' ',tempstr,start);
  1917.                INC(count2);
  1918.              UNTIL count2 = RESULT;
  1919.              p := Pos(tempstr,'.',0,where);
  1920.           END; (* IF where *)
  1921.           Delete(tempstr,where,1);
  1922.        END; (* IF Pos *)
  1923.        
  1924.      
  1925.       tree3ptr^[cfdest + 1].spec^.ptext := ADR(tempstr);
  1926.       ObjectOffset(tree1ptr,filedlg,xoff,yoff);
  1927.       tree3ptr^[errdlg + 1].x := xoff;
  1928.       tree3ptr^[errdlg + 1].y := yoff;
  1929.       ewidth := tree3ptr^[errdlg + 1].width;
  1930.       eheight := tree3ptr^[errdlg + 1].height;
  1931.       (*stx := (xoff + ewidth) DIV 2;
  1932.       sty := (yoff + eheight) DIV 2;
  1933.       stw := 5;
  1934.       sth := 2;
  1935.       GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  1936.       GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  1937.       ObjectDraw(tree3ptr,errdlg,1,xx,yy,ww,hh);
  1938.       ObjectChange(tree3ptr,cfcancel,0,x,y,w,h,Normal,1);
  1939.       GrafMouse(Arrow,NIL);
  1940.       showit := FormDo(tree3ptr,0);
  1941.       therewasanerror := TRUE;
  1942.       match := '\';
  1943.       start := 0;
  1944.       where := 0;
  1945.       FOR i := 0 TO Length(rdfile) DO
  1946.           IF Pos(rdfile,match,start,where) THEN
  1947.           INC(start); END;
  1948.       END;     
  1949.       temp2str := rdfile;
  1950.       Delete(temp2str,start,Length(rdfile) - start);
  1951.       newnameaddr := tree3ptr^[cfdest + 1].spec^.ptext;
  1952.       newnamestr := newnameaddr^;
  1953.  
  1954.       
  1955.       where := 0;
  1956.       start := 0;
  1957.       nb := 0;
  1958.         
  1959.       IF Length(newnamestr) > 8 THEN
  1960.          IF Pos(newnamestr,' ',0,where) THEN
  1961.             IF (where > 8) OR (where = 0) THEN
  1962.                Insert('.',newnamestr,where);END;
  1963.             IF where # 0 THEN
  1964.                Insert('.',newnamestr,where);
  1965.                p := Pos(newnamestr,' ',0,where);
  1966.                nb := where;
  1967.                Delete(newnamestr,where,9 - where);
  1968.             END; (* IF where *)
  1969.          ELSE
  1970.             Insert('.',newnamestr,8);
  1971.          END; (* IF Pos(newnamestr) *)        
  1972.       END; (* IF Length(newnamestr) *) 
  1973.  
  1974.       Concat(temp2str,newnamestr,newstr);
  1975.       rdfile := newstr;
  1976.       (*GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  1977.       GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  1978.       
  1979.       IF confirmcopy THEN
  1980.          ObjectDraw(tree5ptr,copydlg,2,x,y,w,h);
  1981.       ELSE   
  1982.         ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);END;
  1983.    END;
  1984.    IF GetObjectState(tree3ptr,tree3,cfok,Selected) THEN
  1985.       ObjectChange(tree3ptr,cfok,0,x,y,w,h,Normal,0);
  1986.    END; (* IF *)
  1987.    IF NOT GetObjectState(tree3ptr,tree3,cfcancel,Selected) THEN
  1988.       GrafMouse(HourGlass,NIL);
  1989.       GEMDOS.Create(rdfile,0,outfile);
  1990.       IF outfile >= 0 THEN
  1991.          GEMDOS.Open(rsfile,0,infile);
  1992.          REPEAT
  1993.            done := GEMDOS.Close(outfile);
  1994.            GEMDOS.Open(rdfile,1,outfile);
  1995.            GEMDOS.Seek(0,outfile,GEMDOS.end,position);
  1996.            GEMDOS.Read(infile,Count,bufferaddr);
  1997.            
  1998.              
  1999.            IF NOT therewasanerror THEN
  2000.               sizebuffer := sizebuffer + Count;
  2001.               therewasanerror := FALSE;END;
  2002.            IF sizebuffer < free THEN
  2003.               GEMDOS.Write(outfile,Count,bufferaddr);
  2004.               cresult := 0;
  2005.            ELSE
  2006.               Count := 0;
  2007.               cresult := -1;
  2008.               showit := FormAlert(1,'[1][There is not enough room|in the destination!][ok]');
  2009.               done := GEMDOS.Close(outfile);
  2010.               f := GEMDOS.Delete(rdfile);END;
  2011.               IF NOT KeyPressed() THEN
  2012.                  done := GEMDOS.Close(outfile);
  2013.                  f := GEMDOS.Delete(rdfile);
  2014.                  Count := 0;
  2015.                  cresult := -1;END;
  2016.               GrafMouse(HourGlass,NIL);   
  2017.          UNTIL Count = 0;
  2018.          done := GEMDOS.Close(outfile);
  2019.          done := GEMDOS.Close(infile);
  2020.       END; (* outfile *) 
  2021.    ELSE 
  2022.       ObjectChange(tree3ptr,cfcancel,0,x,y,w,h,Normal,0);
  2023.       done := GEMDOS.Close(outfile);
  2024.    END; (* IF ELSE*)     
  2025. END copy;
  2026.           
  2027. PROCEDURE CopytheFile(sfile,dfile : String);
  2028.   
  2029. VAR
  2030.   sourceobspec,destobspec,conobspec,toobspec : etree;
  2031.   sfilename,destfilename,fname : POINTER TO String;
  2032.   tempstr,rsfile,rdfile,errorstr,match,thestring,rstr,currentname : String;
  2033.   p,wildcard : BOOLEAN;
  2034.   l,i,start,where,start2,where2 : CARDINAL;
  2035.   dtaaddr : ADDRESS;
  2036.   result,numberoffiles : INTEGER;
  2037.   fnrecord : pathrecord;
  2038.   sizeaccum,memory : LONGCARD;
  2039.   
  2040. BEGIN
  2041.   sizebuffer := 0;
  2042.   numberoffiles := 0;
  2043.   wildcard := FALSE;
  2044.   sizeaccum := 0; 
  2045.   fname := tree1ptr^[ftoname + 1].spec^.ptext;
  2046.   currentname := fname^;
  2047.   IF Length(currentname) > 0 THEN           
  2048.   IF confirmcopy THEN
  2049.      GEMDOS.SetDTA(ADR(fnrecord));
  2050.      GrafMouse(HourGlass,NIL);
  2051.      GEMDOS.SFirst(sfile,0,result);
  2052.      IF result >= 0  THEN
  2053.         REPEAT
  2054.           INC(numberoffiles);
  2055.           GEMDOS.SNext(result);
  2056.         UNTIL result < 0;END; 
  2057.      ConvertInteger(numberoffiles,1,thestring);
  2058.      tree5ptr^[numtocpy + 1].spec^.ptext := ADR(thestring);
  2059.      GrafMouse(Arrow,NIL);
  2060.      ConfirmCopys;
  2061.   END;
  2062.   IF (GetObjectState(tree5ptr,tree5,condlgok,Selected) OR
  2063.      (GetObjectState(tree4ptr,tree4,cpyno,Selected)))  THEN
  2064.      IF GetObjectState(tree1ptr,tree1,cpydst,Selected) THEN
  2065.         GrafMouse(HourGlass,NIL);
  2066.         GEMDOS.Alloc(LONGCARD(-1),freememory);
  2067.         IF LONGCARD(freememory) < 100000 THEN
  2068.            GEMDOS.Alloc((LONGCARD(freememory) - 20000),bufferaddr);
  2069.            memory := LONGCARD(freememory);
  2070.         ELSE   
  2071.            GEMDOS.Alloc(100000,bufferaddr);
  2072.            memory := 100000;END;
  2073.         dtaaddr := ADR(fnrecord);
  2074.         GEMDOS.SetDTA(dtaaddr);
  2075.         GetFreeSpace;
  2076.         GrafMouse(HourGlass,NIL);
  2077.         GEMDOS.SFirst(sfile,0,result);
  2078.         start := 0;
  2079.         where := 0;     
  2080.         match := '*.';
  2081.         start2 := 0;
  2082.         where2 := 0;
  2083.         IF Pos(dfile,match,start,where) THEN
  2084.            wildcard := TRUE;
  2085.            match := "\";
  2086.            FOR i := 0 TO Length(dfile) DO
  2087.               IF Pos(dfile,match,start2,where2) THEN
  2088.                  start2 := where2 + 1;END;
  2089.            END; 
  2090.            IF start2  # start THEN
  2091.               start := start2;END; 
  2092.            Delete(dfile,start,Length(dfile) - start); END; 
  2093.         start := 0;
  2094.         where := 0; 
  2095.         start2 := 0;
  2096.         where2 := 0;    
  2097.         match := '*.';
  2098.         IF Pos(sfile,match,start,where) THEN
  2099.            wildcard := TRUE;
  2100.            match := "\";
  2101.            FOR i := 0 TO Length(sfile) DO
  2102.               IF Pos(sfile,match,start2,where2) THEN
  2103.                  start2 := where2 + 1;END;
  2104.            END; 
  2105.            IF start2 # start THEN
  2106.               start := start2;END; 
  2107.            Delete(sfile,start,Length(sfile) - start); END;
  2108.         IF result >= 0 THEN
  2109.            REPEAT
  2110.              IF wildcard THEN        
  2111.                 Concat(sfile,fnrecord.name,rsfile);
  2112.                 Concat(dfile,fnrecord.name,rdfile);
  2113.              ELSE
  2114.                 rsfile := sfile;
  2115.                 rdfile := dfile;END;
  2116.              Count := memory;
  2117.              copy(rsfile,rdfile);
  2118.              
  2119.              IF cresult >= 0 THEN
  2120.                 GEMDOS.SNext(result);END;
  2121.              therewasanerror := FALSE;      
  2122.              IF confirmcopy THEN
  2123.                  DEC(numberoffiles);
  2124.                  ConvertInteger(numberoffiles,1,thestring);
  2125.                  IF ((numberoffiles >= 10) AND (numberoffiles < 100)) THEN
  2126.                     Concat(' ',thestring,rstr);thestring := rstr;END;
  2127.                  IF numberoffiles < 10 THEN
  2128.                     Concat('  ',thestring,rstr);thestring := rstr;END;
  2129.                  (*conobspec^.ptext := ADR(thestring); *)
  2130.                  tree5ptr^[numtocpy + 1].spec^.ptext := ADR(thestring);  
  2131.                  ObjectDraw(tree5ptr,numtocpy,1,x,y,w,h);END;
  2132.            UNTIL (cresult < 0) OR (result < 0) OR (outfile < 0);
  2133.         END;(* IF *)
  2134.         cresult := 0;
  2135.         done := GEMDOS.Free(bufferaddr);
  2136.         IF NOT GetObjectState(tree3ptr,tree3,cfcancel,Selected) THEN
  2137.            ClearArray;
  2138.            MakeArray(globlepath);
  2139.            Directory;
  2140.            index := 12;
  2141.            fcount := 12;
  2142.            CalcSliderSize;
  2143.            ObjectDraw(tree1ptr,fwind,2,x,y,w,h);
  2144.            GetFreeSpace;
  2145.         ELSE
  2146.            ObjectChange(tree3ptr,cfcancel,0,x,y,w,h,Normal,0);END;   
  2147.         IF therewasanerror THEN
  2148.            therewasanerror := FALSE; END;
  2149.      ELSE
  2150.         errorstr := '[1][A destination path has|not been Selected!][ OK ]';
  2151.         showit := FormAlert(1,errorstr); 
  2152.      END; (* IF ELSE *)
  2153.   ELSE
  2154.      IF NOT confirmcopy THEN 
  2155.      CancelCopy;
  2156.      ObjectChange(tree5ptr,condlgcl,0,x,y,w,h,Normal,0);END;
  2157.   END;(* IF ELSE *)
  2158.     
  2159.   IF confirmcopy THEN
  2160.                  ObjectChange(tree5ptr,condlgok,0,x,y,w,h,Normal,0);
  2161.                  ObjectDraw(tree1ptr,filedlg,4,x,y,w,h);
  2162.                  tree1ptr^[verify + 1].spec^.ptext := ADR(gverifystr);
  2163.                  ObjectDraw(tree1ptr,verify,1,x,y,w,h);END;
  2164.   ELSE
  2165.      showit := FormAlert(1,'[1][A file(s) not Specified!][ OK ]');
  2166.   END;                
  2167.   ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  2168.   ObjectDraw(tree1ptr,fnametemp,1,x,y,w,h); 
  2169.   tree1ptr^[verify + 1].spec^.ptext := ADR(gverifystr);
  2170.   ObjectDraw(tree1ptr,verify,1,x,y,w,h);
  2171.   GrafMouse(Arrow,NIL);
  2172. END CopytheFile;
  2173.  
  2174. PROCEDURE CopyDiskorFile;
  2175.  
  2176. VAR
  2177.    totree,fromtree,foptstree : etree;
  2178.    tostring,fromstring,fileoptstr,
  2179.    tempstr,sourcename,sourcefile,destfile : String;
  2180.    result : ARRAY[0..79] OF CHAR;
  2181.    destobspec,sourceobspec : etree;
  2182.    destfilename,sfilename : POINTER TO String;
  2183.    p : BOOLEAN;
  2184.    l,i,start,where : CARDINAL;
  2185.    
  2186. BEGIN
  2187.   IF GetObjectState(tree1ptr,tree1,cpydisk,Selected) THEN
  2188.      CopyDialog;
  2189.      ObjectChange(tree1ptr,cpydisk,0,x,y,w,h,Normal,0);
  2190.      tree1ptr^[verify + 1].spec^.ptext := ADR(gverifystr);
  2191.      ObjectDraw(tree1ptr,verify,1,x,y,w,h);
  2192.   END;
  2193.   start := 0;
  2194.      p := Pos(sourcepathstr,'*.',start,where);
  2195.      Delete(sourcepathstr,where,Length(sourcepathstr) - where );
  2196.      start := 0;       
  2197.      FOR i := 0 TO Length(sourcepathstr) DO
  2198.       IF Pos(sourcepathstr,' ',start,where) THEN
  2199.          Delete(sourcepathstr,where,1);
  2200.          INC(start);
  2201.       END; (* IF *)
  2202.      END; (* FOR *)
  2203.      sfilename := tree1ptr^[ftoname + 1].spec^.ptext;
  2204.      sourcename := sfilename^;
  2205.      Concat(sourcepathstr,sourcename,sourcefile);
  2206.      destfilename := tree1ptr^[ftoname + 1].spec^.ptext;
  2207.      destname := destfilename^;
  2208.      tempstr := pathstr;
  2209.      start := 0;
  2210.      p := Pos(tempstr,'*.',start,where);
  2211.      Delete(tempstr,where,Length(tempstr) - where );
  2212.      where := 0;
  2213.      start := 0;
  2214.      FOR i := 0 TO Length(tempstr) DO
  2215.       IF Pos(tempstr,' ',start,where) THEN
  2216.          Delete(tempstr,where,1);
  2217.          INC(start);
  2218.       END; (* IF *)
  2219.      END; (* FOR *)
  2220.      Concat(tempstr,destname,destfile);
  2221.   IF GetObjectState(tree1ptr,tree1,cpyfile,Selected) THEN
  2222.      CopytheFile(sourcefile,destfile);
  2223.      ObjectChange(tree1ptr,cpyfile,0,x,y,w,h,Normal,1);
  2224.      ObjectChange(tree1ptr,cpydisk,0,x,y,w,h,Normal,1);
  2225.      ObjectChange(tree1ptr,verify,0,x,y,w,h,Normal,1);
  2226.      ObjectChange(tree1ptr,cpydst,0,x,y,w,h,Normal,1);
  2227.      ObjectChange(tree1ptr,cpyscr,0,x,y,w,h,selected,1);
  2228.   END;
  2229.   IF GetObjectState(tree1ptr,tree1,cpyfoldr,Selected) THEN
  2230.      IF FindAllThePaths(sourcefile,destfile) THEN
  2231.         IF CreateFolders() THEN
  2232.            GetFreeSpace;
  2233.            CopyFolders;
  2234.            GetFreeSpace;
  2235.         ELSE
  2236.            IF confirmcopy THEN
  2237.               ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);
  2238.               tree1ptr^[verify + 1].spec^.ptext := ADR(gverifystr);
  2239.               ObjectDraw(tree1ptr,verify,1,x,y,w,h);
  2240.               END;
  2241.         END;
  2242.      ELSE      
  2243.        IF confirmcopy THEN
  2244.           ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);
  2245.           tree1ptr^[verify + 1].spec^.ptext := ADR(gverifystr);
  2246.           ObjectDraw(tree1ptr,verify,1,x,y,w,h);
  2247.           END;
  2248.      END;     
  2249.      ObjectChange(tree5ptr,condlgcl,0,x,y,w,h,Normal,0);
  2250.      ObjectChange(tree5ptr,condlgok,0,x,y,w,h,Normal,0);     
  2251.      ObjectChange(tree1ptr,cpyfoldr,0,x,y,w,h,Normal,1);
  2252.      ObjectChange(tree1ptr,cpyfile,0,x,y,w,h,Normal,1);
  2253.      ObjectChange(tree1ptr,cpydisk,0,x,y,w,h,Normal,1);
  2254.      ObjectChange(tree1ptr,verify,0,x,y,w,h,Normal,1);
  2255.      ObjectChange(tree1ptr,cpydst,0,x,y,w,h,Normal,1);
  2256.      ObjectChange(tree1ptr,cpyscr,0,x,y,w,h,selected,1);
  2257.   END;   
  2258.   ObjectChange(tree1ptr,cpycopy,0,x,y,w,h,Normal,1); 
  2259.   ClearIt;
  2260. END CopyDiskorFile;        
  2261.  
  2262. PROCEDURE FindAllThePaths(path,destpath : String) : BOOLEAN;
  2263.  
  2264.   
  2265. VAR
  2266.   rname,temppath,rpath,destname : String;
  2267.   dtarecord : pathrecord;
  2268.   result : INTEGER;
  2269.   where,atribute : CARDINAL;
  2270.   found : BOOLEAN;
  2271.   destfilename : POINTER TO String;
  2272.   
  2273. BEGIN
  2274.   GrafMouse(HourGlass,NIL);
  2275.   GEMDOS.SetDTA(ADR(dtarecord));
  2276.     Concat(path,'\*.*',rpath);
  2277.     path := rpath;
  2278.     temppath := path;
  2279.     numberofpaths := 1;
  2280.     numberoffilenames := 0;
  2281.     count := 1;
  2282.     GEMDOS.SFirst(path,16,result);
  2283.     IF result >= 0 THEN
  2284.        paths[numberofpaths] := path;
  2285.        destfilename := tree1ptr^[ftoname + 1].spec^.ptext;
  2286.        destname := destfilename^;
  2287.        IF Pos(destpath,destname,0,where) THEN
  2288.           Delete(destpath,where,Length(destname));END;
  2289.        WHILE count - 1 # CARDINAL(numberofpaths) DO
  2290.         GEMDOS.SFirst(paths[count],16,result);
  2291.         temppath := paths[count];
  2292.         IF result >= 0 THEN
  2293.            REPEAT
  2294.              WITH dtarecord DO
  2295.              IF NOT KeyPressed() THEN RETURN(FALSE);END;
  2296.                IF (Compare(name,'.') # Equal) AND (Compare(name,'..')
  2297.                                                        # Equal) THEN
  2298.                   atribute := CARDINAL(attrib);
  2299.                   IF atribute = 16 THEN
  2300.                      INC(numberofpaths);
  2301.                      found := Pos(paths[count],'\*.',0,where);
  2302.                      Concat('\',name,rname);
  2303.                      Insert(rname,paths[count],where);
  2304.                      paths[numberofpaths] := paths[count];
  2305.                      paths[count] := temppath;
  2306.                   ELSE
  2307.                      INC(numberoffilenames);
  2308.                   END; (* IF ELSE *)
  2309.                END; (* IF *)      
  2310.                GEMDOS.SNext(result);
  2311.              END; (* WITH *) 
  2312.            UNTIL result < 0;
  2313.            sourcepaths[count] := paths[count];
  2314.            destpaths[count]:= paths[count];
  2315.            found := Pos(destpaths[count],destname,0,where);
  2316.            IF where # 3 THEN
  2317.               Delete(destpaths[count],3,(where - 1) - 2);END;
  2318.            found := Pos(destpaths[count],'\*.*',0,where);
  2319.            Delete(destpaths[count],where,4);
  2320.            found := Pos(destpaths[count],':\',0,where);
  2321.            Delete(destpaths[count],where - 1,3);
  2322.            Concat(destpath,destpaths[count],rpath);
  2323.            destpaths[count] := rpath;
  2324.         END; (* IF result *)
  2325.         INC(count,1);
  2326.        END; (* WHILE *)
  2327.        RETURN TRUE;
  2328.     ELSE
  2329.       showit := FormAlert(1,'[1][Source Folder not found!][ OK ]');
  2330.       GrafMouse(Arrow,NIL);
  2331.       RETURN FALSE;
  2332.     END; (* IF result ELSE *)     
  2333. END FindAllThePaths;
  2334.  
  2335. PROCEDURE CreateFolders() : BOOLEAN;
  2336.  
  2337. VAR
  2338.   create,done,doloopagain : BOOLEAN;
  2339.   outfile,result : INTEGER;
  2340.   dtarecord : pathrecord;
  2341.   temp,thestring,thestring2 : String;
  2342.   
  2343. BEGIN
  2344.   IF confirmcopy THEN
  2345.      ConvertToString(LONGCARD(numberoffilenames),10,FALSE,thestring,done);
  2346.      tree5ptr^[numtocpy + 1].spec^.ptext := ADR(thestring);
  2347.      ConvertToString(LONGCARD(numberofpaths),10,FALSE,thestring2,done);
  2348.      tree5ptr^[fntocpy + 1].spec^.ptext := ADR(thestring2);
  2349.      GrafMouse(Arrow,NIL);
  2350.      ConfirmCopys;END;
  2351.   IF (GetObjectState(tree5ptr,tree5,condlgok,Selected) OR
  2352.      (GetObjectState(tree4ptr,tree4,cpyno,Selected)))  THEN
  2353.      GrafMouse(HourGlass,NIL);
  2354.     FOR count := 1 TO numberofpaths DO
  2355.       REPEAT
  2356.         IF NOT KeyPressed() THEN RETURN(FALSE);END;
  2357.         doloopagain := FALSE;
  2358.         GrafMouse(HourGlass,NIL);
  2359.         IF NOT GEMDOS.DirCreate(destpaths[count]) THEN
  2360.          IF DuplicateFolder() THEN
  2361.             doloopagain := TRUE;
  2362.          ELSE
  2363.             ObjectChange(tree5ptr,condlgok,0,x,y,w,h,Normal,0);   
  2364.             RETURN FALSE;
  2365.          END; (* IF Duplicate *)   
  2366.         END;(* IF NOT GEMDOS *)
  2367.       UNTIL doloopagain = FALSE;   
  2368.     END;(* FOR *)
  2369.     ObjectChange(tree5ptr,condlgok,0,x,y,w,h,Normal,0);
  2370.     RETURN TRUE;
  2371.   ELSE
  2372.     (*IF confirmcopy THEN ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);END;
  2373.     ObjectChange(tree5ptr,condlgcl,0,x,y,w,h,Normal,0);*)
  2374.     RETURN FALSE;
  2375.   END;  
  2376. END CreateFolders;  
  2377.  
  2378. PROCEDURE DuplicateFolder() : BOOLEAN;
  2379.  
  2380. VAR
  2381.   where,start,RESULT,count2,nb : CARDINAL;
  2382.   p : BOOLEAN;
  2383.   newstr,temp2str,tempstr,match,newpathstr,dupnamestr : String;
  2384.   count,xoff,yoff,stx,sty,stw,sth,ewidth,eheight : INTEGER;
  2385.   newpathaddr,tempstraddr : POINTER TO String;
  2386.  
  2387.   
  2388. BEGIN
  2389.    tempstraddr := tree1ptr^[ftoname + 1].spec^.ptext;
  2390.    tempstr := tempstraddr^;
  2391.    dupnamestr := tempstr;
  2392.   REPEAT 
  2393.    IF Pos(tempstr,'.',0,where) THEN
  2394.           IF where < 8 THEN
  2395.              RESULT := 9 - where - 1;
  2396.              start := where;
  2397.              count2 := 0;
  2398.              REPEAT
  2399.                Insert(' ',tempstr,start);
  2400.                INC(count2);
  2401.              UNTIL count2 = RESULT;
  2402.              p := Pos(tempstr,'.',0,where);
  2403.           END; (* IF where *)
  2404.           Delete(tempstr,where,1);
  2405.        END; (* IF Pos *)
  2406.        
  2407.      
  2408.       tree3ptr^[cfdest + 1].spec^.ptext := ADR(tempstr);
  2409.       ObjectOffset(tree1ptr,filedlg,xoff,yoff);
  2410.       tree3ptr^[errdlg + 1].x := xoff;
  2411.       tree3ptr^[errdlg + 1].y := yoff;
  2412.       ewidth := tree3ptr^[errdlg + 1].width;
  2413.       eheight := tree3ptr^[errdlg + 1].height;
  2414.       (*stx := (xoff + ewidth) DIV 2;
  2415.       sty := (yoff + eheight) DIV 2;
  2416.       stw := 5;
  2417.       sth := 2;
  2418.       GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  2419.       GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  2420.       ObjectDraw(tree3ptr,errdlg,1,xx,yy,ww,hh);
  2421.       ObjectChange(tree3ptr,cfcancel,0,x,y,w,h,Normal,1);
  2422.       GrafMouse(Arrow,NIL);
  2423.       showit := FormDo(tree3ptr,0);
  2424.       GrafMouse(HourGlass,NIL);
  2425.       newpathaddr := tree3ptr^[cfdest + 1].spec^.ptext;
  2426.       newpathstr := newpathaddr^;
  2427.       where := 0;
  2428.       start := 0;
  2429.       nb := 0;
  2430.         
  2431.       IF Length(newpathstr) > 8 THEN
  2432.          IF Pos(newpathstr,' ',0,where) THEN
  2433.             IF (where > 8) OR (where = 0) THEN
  2434.                Insert('.',newpathstr,where);END;
  2435.             IF where # 0 THEN
  2436.                Insert('.',newpathstr,where);
  2437.                p := Pos(newpathstr,' ',0,where);
  2438.                nb := where;
  2439.                Delete(newpathstr,where,9 - where);
  2440.             END; (* IF where *)
  2441.          ELSE
  2442.             Insert('.',newpathstr,8);
  2443.          END; (* IF Pos(newpathstr) *)        
  2444.       END; (* IF Length(newpathstr) *) 
  2445.       (*GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  2446.       IF Pos(destpaths[1],':\',0,where) THEN
  2447.          FOR count := 1 TO numberofpaths DO
  2448.              Delete(destpaths[count],where + 2,Length(dupnamestr));
  2449.              IF count > 1 THEN
  2450.                 Insert(newpathstr,destpaths[count],where + 2);
  2451.              ELSE
  2452.                 Concat(destpaths[count],newpathstr,destpaths[count]);
  2453.              END;      
  2454.          END;
  2455.       END;       
  2456.       ObjectChange(tree3ptr,cfok,0,x,y,w,h,Normal,0);
  2457.      UNTIL (Compare(dupnamestr,newpathstr) # Equal) OR (GetObjectState(tree3ptr,tree3,cfcancel,Selected)); 
  2458.      IF confirmcopy THEN
  2459.         ObjectDraw(tree5ptr,copydlg,2,x,y,w,h);
  2460.      ELSE
  2461.         ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);
  2462.      END;
  2463.      IF GetObjectState(tree3ptr,tree3,cfcancel,Selected) THEN
  2464.         GrafMouse(Arrow,NIL);
  2465.         ObjectChange(tree3ptr,cfcancel,0,x,y,w,h,Normal,0);
  2466.         (*GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  2467.         ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);*)
  2468.         RETURN FALSE;
  2469.      ELSE   
  2470.         ObjectChange(tree3ptr,cfok,0,x,y,w,h,Normal,0);
  2471.         (*GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  2472.         GrafMouse(HourGlass,NIL);
  2473.         RETURN TRUE;END;  
  2474.       
  2475. END DuplicateFolder;
  2476.  
  2477. PROCEDURE CopyFolders;
  2478.  
  2479. VAR
  2480.    dtarecord : pathrecord;
  2481.    where : CARDINAL;
  2482.    found,done,interupt :  BOOLEAN;
  2483.    rspath,rdpath,thestring,thestring2,rstr,passarray : String;
  2484.    memory : LONGCARD;
  2485.    count : INTEGER;
  2486.    
  2487. BEGIN
  2488.   
  2489.   sizebuffer := 0;
  2490.   GEMDOS.SetDTA(ADR(dtarecord));
  2491.   
  2492.   GEMDOS.Alloc(LONGCARD(-1),freememory);
  2493.   IF LONGCARD(freememory) < 100000 THEN
  2494.      GEMDOS.Alloc((LONGCARD(freememory) - 20000),bufferaddr);
  2495.      memory := LONGCARD(freememory);
  2496.   ELSE
  2497.      GEMDOS.Alloc(100000,bufferaddr);
  2498.      memory := LONGCARD(freememory);END;
  2499.   interupt := FALSE;   
  2500.   count := numberofpaths;   
  2501.   REPEAT
  2502.       GrafMouse(HourGlass,NIL);      
  2503.       GEMDOS.SFirst(sourcepaths[count],16,result);
  2504.       found := Pos(sourcepaths[count],'\*.',0,where);
  2505.       Delete(sourcepaths[count],where + 1,3);
  2506.       Concat(destpaths[count],'\',destpaths[count]);
  2507.       REPEAT
  2508.         WITH dtarecord DO
  2509.           IF (Compare(name,'.') # Equal) AND (Compare(name,'..')
  2510.                                                        # Equal) THEN
  2511.              Concat(sourcepaths[count],name,rspath);
  2512.              Concat(destpaths[count],name,rdpath);
  2513.              Count := memory;
  2514.              sizebuffer := sizebuffer + size;
  2515.              IF sizebuffer < free THEN
  2516.                 IF NOT CopyThePath(rspath,rdpath) THEN
  2517.                    count := 0;
  2518.                    result := -1;
  2519.                    interupt := TRUE;END;
  2520.                 IF (Compare(name,'.') # Equal) AND (Compare(name,'..')
  2521.                                                        # Equal) THEN
  2522.                     IF confirmcopy THEN
  2523.                        DEC(numberoffilenames);
  2524.                        ConvertToString(LONGCARD(numberoffilenames),10,FALSE,thestring,done);
  2525.                        IF ((numberoffilenames >= 10) AND (numberoffilenames < 100)) THEN
  2526.                           Concat(' ',thestring,rstr);thestring := rstr;END;
  2527.                        IF numberoffilenames < 10 THEN
  2528.                           Concat('  ',thestring,rstr);thestring := rstr;END;
  2529.                           tree5ptr^[numtocpy + 1].spec^.ptext := ADR(thestring);  
  2530.                        ObjectDraw(tree5ptr,numtocpy,1,x,y,w,h);
  2531.                     END; (* IF confirmcopy *)
  2532.                 END;    
  2533.              ELSE
  2534.                 sizebuffer := free + 1;
  2535.              END;
  2536.           END; (* IF *)
  2537.         END; (* WITH *)
  2538.         IF NOT interupt THEN GEMDOS.SNext(result); END;
  2539.         IF sizebuffer > free THEN
  2540.            showit := FormAlert(1,'[1][There is not enough room|in the destination!][ok]');     
  2541.            count := 0;
  2542.            result := -1;
  2543.            GrafMouse(Arrow,NIL);
  2544.         END;
  2545.       UNTIL result < 0;
  2546.       IF count # 0 THEN
  2547.          DEC(count);
  2548.          IF confirmcopy THEN
  2549.             ConvertToString(LONGCARD(count),10,FALSE,thestring2,done);
  2550.             tree5ptr^[fntocpy + 1].spec^.ptext := ADR(thestring2);
  2551.             ObjectDraw(tree5ptr,fntocpy,1,x,y,w,h);END;
  2552.       END;
  2553.   UNTIL count = 0;   
  2554.   IF confirmcopy THEN
  2555.      ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);END;
  2556.   done := GEMDOS.Free(bufferaddr);
  2557.   ClearArray;
  2558.   MakeArray(ffpath);
  2559.   Directory;
  2560.   CalcSliderSize;
  2561.   ObjectDraw(tree1ptr,fwind,2,x,y,w,h);
  2562.   index := 12;
  2563.   fcount := 12;    
  2564.   GrafMouse(Arrow,NIL);
  2565. END CopyFolders;
  2566.  
  2567. PROCEDURE CopyThePath(spath,dpath : String): BOOLEAN;
  2568.  
  2569.  
  2570. VAR
  2571.    infile,outfile : INTEGER;
  2572.    f,done : BOOLEAN;
  2573.    position : LONGCARD;
  2574.    
  2575. BEGIN
  2576.   GEMDOS.Create(dpath,0,outfile);
  2577.   IF outfile >= 0 THEN
  2578.      GEMDOS.Open(spath,0,infile);
  2579.      REPEAT
  2580.        done := GEMDOS.Close(outfile);
  2581.        GEMDOS.Open(dpath,1,outfile);
  2582.        GEMDOS.Seek(0,outfile,GEMDOS.end,position);
  2583.        GEMDOS.Read(infile,Count,bufferaddr);
  2584.        
  2585.        GEMDOS.Write(outfile,Count,bufferaddr);
  2586.        IF NOT KeyPressed() THEN
  2587.           done := GEMDOS.Close(outfile);
  2588.           f := GEMDOS.Delete(dpath);
  2589.           Count := 0;
  2590.           GrafMouse(HourGlass,NIL);
  2591.           RETURN(FALSE);END;
  2592.      UNTIL Count = 0;
  2593.      done := GEMDOS.Close(outfile);
  2594.      done := GEMDOS.Close(infile);
  2595.      GrafMouse(HourGlass,NIL);
  2596.      RETURN(TRUE);
  2597.   END; (* outfile *)
  2598. END CopyThePath;
  2599.  
  2600.  
  2601. PROCEDURE CancelCopy;
  2602.  
  2603. BEGIN
  2604.   IF GetObjectState(tree1ptr,tree1,cpydisk,Selected) THEN
  2605.      ObjectChange(tree1ptr,cpydisk,0,x,y,w,h,Normal,1); 
  2606.      ObjectDraw(tree1ptr,cpydisk,1,x,y,w,h);
  2607.   END;
  2608.   IF GetObjectState(tree1ptr,tree1,cpyfile,Selected) THEN
  2609.      ObjectChange(tree1ptr,cpyfile,0,x,y,w,h,Normal,1);
  2610.      ObjectChange(tree1ptr,cpydisk,0,x,y,w,h,Normal,1);
  2611.      ObjectChange(tree1ptr,cpydst,0,x,y,w,h,Normal,1);
  2612.      ObjectChange(tree1ptr,cpyscr,0,x,y,w,h,selected,1);
  2613.   END;
  2614.   IF GetObjectState(tree1ptr,tree1,cpyfoldr,Selected) THEN
  2615.      ObjectChange(tree1ptr,cpyfoldr,0,x,y,w,h,Normal,1);
  2616.      ObjectChange(tree1ptr,cpydst,0,x,y,w,h,Normal,1);
  2617.      ObjectChange(tree1ptr,cpyscr,0,x,y,w,h,selected,1);
  2618.   END;
  2619.   ObjectChange(tree1ptr,cpycancl,0,x,y,w,h,Normal,1);
  2620. END CancelCopy;
  2621.  
  2622. PROCEDURE ErasetheFile;
  2623.  
  2624. VAR
  2625.    dltobspec,toobspec : etree;
  2626.    fname : POINTER TO String;
  2627.    currentname,drivepath,resultdrive,resultpath,temp,rpath,tempstr
  2628.    ,match,thestring,rstr : String;
  2629.    result,i,numberoffiles : INTEGER;
  2630.    where,start,l,start2,where2 : CARDINAL;
  2631.    f : BOOLEAN;
  2632.    fnrecord : pathrecord;
  2633.    addr : ADDRESS;
  2634.  
  2635. BEGIN
  2636.   numberoffiles := 0;
  2637.   fname := tree1ptr^[ftoname + 1].spec^.ptext;
  2638.   currentname := fname^;
  2639.   IF Length(currentname) > 0 THEN 
  2640.      drivepath := CHR(ORD(defaultdrive) + ORD('A'));
  2641.      Concat(drivepath,':\',resultdrive);
  2642.      Concat(resultdrive,currentname,resultpath);
  2643.      IF Length(ffpath) > 4 THEN
  2644.         Copy(ffpath,0,Length(ffpath),temp);
  2645.         f := Pos(temp,'\*.*',0,where);
  2646.         Delete(temp,where,4);
  2647.         f := Pos(resultpath,':\',0,where);
  2648.         Insert(temp,resultpath,where + 1);
  2649.      END;
  2650.      IF confirmdlt THEN
  2651.         GEMDOS.SetDTA(ADR(fnrecord));
  2652.         GEMDOS.SFirst(resultpath,0,result);
  2653.         IF result >= 0 THEN
  2654.            GrafMouse(HourGlass,NIL);
  2655.            REPEAT
  2656.              INC(numberoffiles);
  2657.              GEMDOS.SNext(result);
  2658.            UNTIL result < 0;END; 
  2659.            GrafMouse(Arrow,NIL);
  2660.            ConvertInteger(numberoffiles,1,thestring);
  2661.            tree6ptr^[numtodlt + 1].spec^.ptext := ADR(thestring);
  2662.            ConfirmDeletes;END;
  2663.         IF (GetObjectState(tree6ptr,tree6,dltdlgok,Selected) OR 
  2664.            (GetObjectState(tree4ptr,tree4,dltno,Selected))) THEN   
  2665.            addr := ADR(fnrecord);
  2666.            GEMDOS.SetDTA(addr);
  2667.            GrafMouse(HourGlass,NIL);
  2668.            GEMDOS.SFirst(resultpath,0,result);
  2669.            IF result >= 0 THEN
  2670.            
  2671.            match := '*.';
  2672.               start := 0;
  2673.               where := 0; 
  2674.               start2 := 0;
  2675.               where2 := 0;    
  2676.               IF Pos(resultpath,match,start,where) THEN
  2677.                  match := "\";
  2678.                  FOR i := 0 TO Length(resultpath) DO
  2679.                     IF Pos(resultpath,match,start2,where2) THEN
  2680.                        start2 := where2 + 1;END;
  2681.                  END; 
  2682.                  IF start2 # start THEN
  2683.                     start := start2;END;
  2684.               ELSE
  2685.                  match := '\';
  2686.                  FOR i := 0 TO Length(resultpath) DO
  2687.                      IF Pos(resultpath,match,start,where) THEN
  2688.                         start := where + 1;END;
  2689.                  END;
  2690.               END;                
  2691.               Delete(resultpath,start,Length(resultpath) - start);
  2692.  
  2693.            REPEAT
  2694.              Concat(resultpath,fnrecord.name,rpath);
  2695.              f := GEMDOS.Delete(rpath);
  2696.              IF confirmdlt THEN
  2697.                 DEC(numberoffiles);
  2698.                 ConvertInteger(numberoffiles,1,thestring);
  2699.                 IF ((numberoffiles > 10) AND (numberoffiles < 100)) THEN
  2700.                   Concat(' ',thestring,rstr);thestring := rstr;END;
  2701.                 IF numberoffiles < 10 THEN
  2702.                   Concat('  ',thestring,rstr);thestring := rstr;END;
  2703.                    (*dltobspec^.ptext := ADR(thestring);*)
  2704.                    tree6ptr^[numtodlt + 1].spec^.ptext := ADR(thestring);
  2705.              ObjectDraw(tree6ptr,numtodlt,1,x,y,w,h);END;
  2706.              GEMDOS.SNext(result);
  2707.              IF NOT KeyPressed() THEN
  2708.                 result := -1;END;
  2709.              GrafMouse(HourGlass,NIL);   
  2710.            UNTIL (result < 0) OR (f = FALSE);
  2711.            GrafMouse(Arrow,NIL);
  2712.   ELSE
  2713.      showit := FormAlert(1,'[1][File not Found!][OK]');
  2714.   END; (* IF ELSE *)
  2715.   ObjectChange(tree1ptr,erase,0,x,y,w,h,Normal,1);         
  2716.   tempstr := pathstr;
  2717.   Delete(tempstr,0,2);
  2718.   ClearArray;
  2719.   MakeArray(tempstr);
  2720.   Directory;
  2721.   ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  2722.   ObjectDraw(tree1ptr,fwind,3,x,y,w,h);
  2723.   CalcSliderSize;
  2724.   ObjectChange(tree6ptr,dltdlgok,0,x,y,w,h,Normal,1);
  2725.   GetFreeSpace;
  2726.   ELSE
  2727.    ObjectChange(tree6ptr,dltdlgcl,0,x,y,w,h,Normal,1);
  2728.   END; (* IF ELSE *)
  2729.   
  2730.   IF confirmdlt THEN
  2731.       ObjectDraw(tree1ptr,filedlg,4,x,y,w,h);END;
  2732.   ELSE
  2733.     showit := FormAlert(1,'[1][No File(s) was Specified!][ OK ]');
  2734.     ObjectChange(tree1ptr,erase,0,x,y,w,h,Normal,1);
  2735.   END;    
  2736.   tree1ptr^[verify + 1].spec^.ptext := ADR(gverifystr);
  2737.   ObjectDraw(tree1ptr,verify,1,x,y,w,h);
  2738.   ObjectChange(tree1ptr,erase,0,x,y,w,h,Normal,1);
  2739.   ClearIt;
  2740.   ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  2741.   GrafMouse(Arrow,NIL);
  2742. END ErasetheFile;
  2743.  
  2744. PROCEDURE CreateFolder;
  2745.   
  2746. VAR
  2747.    toobspec : etree;
  2748.    fname : POINTER TO String;
  2749.    currentname,drivepath,resultdrive,temp,resultpath,tempstr : String;
  2750.    where : CARDINAL;
  2751.    f,done :BOOLEAN;
  2752.    outfile : INTEGER;
  2753.    
  2754. BEGIN
  2755.   where := 0;
  2756.   fname := tree1ptr^[ftoname + 1].spec^.ptext;
  2757.   currentname := fname^;
  2758.   IF Length(currentname) > 0 THEN
  2759.      drivepath := CHR(ORD(defaultdrive) + ORD('A'));
  2760.      Concat(drivepath,':\',resultdrive);
  2761.      Concat(resultdrive,currentname,resultpath);
  2762.      IF Length(ffpath) > 4 THEN
  2763.         Copy(ffpath,0,Length(ffpath),temp);
  2764.         f := Pos(temp,'\*.*',0,where);
  2765.         Delete(temp,where,4);
  2766.         f := Pos(resultpath,':\',0,where);
  2767.         Insert(temp,resultpath,where + 1);
  2768.      END;
  2769.      GrafMouse(HourGlass,NIL);
  2770.      GEMDOS.Open(resultpath,0,outfile);
  2771.      IF outfile < 0 THEN
  2772.         IF NOT GEMDOS.DirCreate(resultpath) THEN
  2773.            GrafMouse(Arrow,NIL);
  2774.            showit := FormAlert(1,'[1][A Folder with that name|already exists!][OK]');
  2775.         ELSE
  2776.            tempstr := pathstr;
  2777.            Delete(tempstr,0,2);
  2778.            ClearArray;
  2779.            MakeArray(tempstr);
  2780.            Directory;
  2781.            ObjectDraw(tree1ptr,fwind,3,x,y,w,h);
  2782.            CalcSliderSize;
  2783.            GrafMouse(Arrow,NIL);END;
  2784.      ELSE
  2785.         GrafMouse(Arrow,NIL);
  2786.         showit := FormAlert(1,'[1][A File with that name|already exists!][ OK ]');
  2787.         done := GEMDOS.Close(outfile); 
  2788.      END; (* IF GEMDOS.Open *)     
  2789.   ELSE 
  2790.      showit := FormAlert(1,'[1][A folder name was|not specified!][ OK ]');
  2791.      END; 
  2792.   ObjectChange(tree1ptr,fcreate,0,x,y,w,h,Normal,1);   
  2793. END CreateFolder;  
  2794.  
  2795. PROCEDURE EraseFolder;
  2796.  
  2797. VAR
  2798.    toobspec : etree;
  2799.    fname : POINTER TO String;
  2800.    currentname,drivepath,resultdrive,resultpath,temp,rpath,tempstr
  2801.    ,match,amendpath,thestring,thestring2,rstr,zero : String;
  2802.    result,i,findit : INTEGER;
  2803.    where,start,l : CARDINAL;
  2804.    f,interrupt : BOOLEAN;
  2805.    fnrecord : pathrecord;
  2806.    addr : ADDRESS;
  2807.  
  2808. BEGIN
  2809.   fname := tree1ptr^[ftoname + 1].spec^.ptext;
  2810.   currentname := fname^;
  2811.   IF Length(currentname) > 0 THEN
  2812.      drivepath := CHR(ORD(defaultdrive) + ORD('A'));
  2813.      Concat(drivepath,':\',resultdrive);
  2814.      Concat(resultdrive,currentname,resultpath);
  2815.      IF Length(ffpath) > 4 THEN
  2816.         Copy(ffpath,0,Length(ffpath),temp);
  2817.         f := Pos(temp,'\*.*',0,where);
  2818.         Delete(temp,where,4);
  2819.         f := Pos(resultpath,':\',0,where);
  2820.         Insert(temp,resultpath,where + 1);
  2821.     END;
  2822.     start := 0;
  2823.     where := 0;
  2824.     GrafMouse(HourGlass,NIL);
  2825.     IF FindAllThePaths(resultpath,resultpath) THEN
  2826.        IF confirmdlt THEN
  2827.           ConvertInteger(numberoffilenames,1,thestring);
  2828.           tree6ptr^[numtodlt + 1].spec^.ptext := ADR(thestring);
  2829.           ConvertInteger(numberofpaths,1,thestring2);
  2830.           tree6ptr^[fldtodlt + 1].spec^.ptext := ADR(thestring2);
  2831.           GrafMouse(Arrow,NIL);
  2832.           ConfirmDeletes;END;
  2833.        IF (GetObjectState(tree6ptr,tree6,dltdlgok,Selected) OR
  2834.           (GetObjectState(tree4ptr,tree4,dltno,Selected))) THEN   
  2835.            GrafMouse(HourGlass,NIL);
  2836.            count := numberofpaths;
  2837.            interrupt := FALSE;
  2838.            REPEAT
  2839.                GEMDOS.SetDTA(ADR(fnrecord));
  2840.                resultpath := destpaths[count];
  2841.                Concat(resultpath,'\*.*',resultpath);
  2842.                GEMDOS.SFirst(resultpath,16,result);
  2843.                IF result >= 0 THEN
  2844.                   match := '*.';
  2845.                   IF Pos(resultpath,match,start,where) THEN
  2846.                      Delete(resultpath,where,Length(resultpath) - where);
  2847.                      start := 0;
  2848.                      where := 0;END;
  2849.                   REPEAT
  2850.                      WITH fnrecord DO
  2851.                            Concat(resultpath,name,rpath);
  2852.                            f := GEMDOS.Delete(rpath);
  2853.                            IF (Compare(name,'.') # Equal) AND (Compare(name,'..')
  2854.                                                        # Equal) THEN
  2855.                               IF confirmdlt THEN
  2856.                                  DEC(numberoffilenames);
  2857.                                  ConvertInteger(numberoffilenames,1,thestring);
  2858.                                  IF ((numberoffilenames > 10) AND (numberoffilenames < 100)) THEN
  2859.                                     Concat(' ',thestring,rstr);thestring := rstr;END;
  2860.                                  IF numberoffilenames < 10 THEN
  2861.                                     Concat('  ',thestring,rstr);
  2862.                                     thestring := rstr;END;
  2863.                                  tree6ptr^[numtodlt + 1].spec^.ptext := ADR(thestring);
  2864.                                  ObjectDraw(tree6ptr,numtodlt,1,x,y,w,h);
  2865.                               END;
  2866.                            END;       
  2867.                      END; (* WITH *)
  2868.                      GEMDOS.SNext(result);
  2869.                      IF NOT KeyPressed() THEN
  2870.                         interrupt := TRUE;
  2871.                         count := 0;
  2872.                         result := -1;END;
  2873.                     GrafMouse(HourGlass,NIL);    
  2874.                   UNTIL result < 0;
  2875.                   FOR findit := 1 TO Length(resultpath) DO
  2876.                       IF Pos(resultpath,'\',start,where) THEN
  2877.                       END;
  2878.                       INC(start);
  2879.                   END;
  2880.                   IF Pos(resultpath,'\*.*',0,where) THEN END;   
  2881.                   Delete(resultpath,where,Length(resultpath)- where);
  2882.                   f := GEMDOS.DirDelete(resultpath);
  2883.                   IF confirmdlt THEN
  2884.                      DEC(numberofpaths);
  2885.                      ConvertInteger(numberofpaths,1,thestring);
  2886.                      IF numberofpaths < 10 THEN
  2887.                         Concat('  ',thestring,rstr);
  2888.                         thestring := rstr;END;
  2889.                         tree6ptr^[fldtodlt + 1].spec^.ptext := ADR(thestring);
  2890.                         ObjectDraw(tree6ptr,fldtodlt,1,x,y,w,h);END;
  2891.                ELSE
  2892.                  showit := FormAlert(1,'[1][ |File not Found!][OK]');
  2893.                END;
  2894.                start := 0;
  2895.                where := 0;
  2896.                IF NOT interrupt THEN DEC(count,1);END;
  2897.            UNTIL count = 0;
  2898.            tempstr := pathstr;
  2899.            Delete(tempstr,0,2);
  2900.            ClearArray;
  2901.            MakeArray(tempstr);
  2902.            Directory;
  2903.            ObjectChange(tree1ptr,ferase,0,x,y,w,h,Normal,1);
  2904.            ObjectDraw(tree1ptr,fwind,3,x,y,w,h);
  2905.            CalcSliderSize;
  2906.            GetFreeSpace; 
  2907.            ObjectChange(tree6ptr,dltdlgok,0,x,y,w,h,Normal,1);
  2908.            ObjectDraw(tree1ptr,filedlg,4,x,y,w,h);
  2909.        ELSE
  2910.           ObjectChange(tree6ptr,dltdlgcl,0,x,y,w,h,Normal,1);
  2911.           ObjectChange(tree1ptr,ferase,0,x,y,w,h,Normal,1);
  2912.           ObjectDraw(tree1ptr,filedlg,4,x,y,w,h);
  2913.        END;(* IF GetObjectState *)       
  2914.     END;(* IF FindAllPaths *)
  2915.   ELSE
  2916.     showit := FormAlert(1,'[1][A folder name was|not specified!][ OK ]');
  2917.     ObjectChange(tree1ptr,ferase,0,x,y,w,h,Normal,1);
  2918.   END;
  2919.   GrafMouse(Arrow,NIL);
  2920.   zero := '  0';
  2921.   tree6ptr^[fldtodlt + 1].spec^.ptext := ADR(zero);
  2922.   tree6ptr^[numtodlt + 1].spec^.ptext := ADR(zero);
  2923. END EraseFolder;
  2924.  
  2925. PROCEDURE EraseOrCreate;
  2926.  
  2927. BEGIN
  2928.   IF GetObjectState(tree1ptr,tree1,fcreate,Selected) THEN
  2929.      CreateFolder;
  2930.      ObjectChange(tree1ptr,fcreate,0,x,y,w,h,Normal,1);END;
  2931.   IF GetObjectState(tree1ptr,tree1,ferase,Selected) THEN
  2932.      EraseFolder;
  2933.      ObjectChange(tree1ptr,ferase,0,x,y,w,h,Normal,1);END;
  2934.   ObjectChange(tree1ptr,fldok,0,x,y,w,h,Normal,1);   
  2935.   ClearIt;
  2936. END EraseOrCreate;  
  2937.  
  2938. PROCEDURE GetOptions;
  2939.  
  2940. VAR
  2941.    stx,sty,stw,sth,ewidth,eheight,xoff,yoff : INTEGER;
  2942.    copyyes,deleteyes : BOOLEAN;
  2943.    
  2944. BEGIN
  2945.       ObjectOffset(tree1ptr,fileopts,xoff,yoff);
  2946.       tree4ptr^[optdlg + 1].x := xoff;
  2947.       tree4ptr^[optdlg + 1].y := yoff;
  2948.       ewidth := tree4ptr^[optdlg + 1].width;
  2949.       eheight := tree4ptr^[optdlg + 1].height;
  2950.       (*stx := (xoff + ewidth) DIV 2;
  2951.       sty := (yoff + eheight) DIV 2;
  2952.       stw := 5;
  2953.       sth := 2;
  2954.       GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  2955.       GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  2956.       ObjectDraw(tree4ptr,optdlg,2,xx,yy,ww,hh);
  2957.       IF GetObjectState(tree4ptr,tree4,cpyyes,Selected) THEN 
  2958.          copyyes := TRUE; ELSE copyyes := FALSE;END;
  2959.       IF GetObjectState(tree4ptr,tree4,dltyes,Selected) THEN
  2960.          deleteyes := TRUE; ELSE deleteyes := FALSE;END;   
  2961.       showit := FormDo(tree4ptr,0);
  2962.       IF GetObjectState(tree4ptr,tree4,conok,Selected) THEN
  2963.          IF GetObjectState(tree4ptr,tree4,cpyyes,Selected) THEN
  2964.             confirmcopy := TRUE; ELSE confirmcopy := FALSE; END;
  2965.          IF GetObjectState(tree4ptr,tree4,dltyes,Selected) THEN
  2966.             confirmdlt := TRUE; ELSE confirmdlt := FALSE; END;
  2967.          ObjectChange(tree4ptr,conok,0,x,y,w,h,Normal,0);   
  2968.       END; (* IF *)
  2969.       IF GetObjectState(tree4ptr,tree4,concancl,Selected) THEN
  2970.          IF copyyes THEN 
  2971.             ObjectChange(tree4ptr,cpyyes,0,x,y,w,h,selected,0);
  2972.             ObjectChange(tree4ptr,cpyno,0,x,y,w,h,Normal,0);
  2973.          ELSE
  2974.             ObjectChange(tree4ptr,cpyyes,0,x,y,w,h,Normal,0);
  2975.             ObjectChange(tree4ptr,cpyno,0,x,y,w,h,selected,0);END;
  2976.          IF deleteyes THEN 
  2977.             ObjectChange(tree4ptr,dltyes,0,x,y,w,h,selected,0);
  2978.             ObjectChange(tree4ptr,dltno,0,x,y,w,h,Normal,0);
  2979.          ELSE
  2980.             ObjectChange(tree4ptr,dltyes,0,x,y,w,h,Normal,0);
  2981.             ObjectChange(tree4ptr,dltno,0,x,y,w,h,selected,0);END;      
  2982.          ObjectChange(tree4ptr,concancl,0,x,y,w,h,Normal,0);
  2983.       END;            
  2984.       (*GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  2985.       GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  2986.       ObjectChange(tree1ptr,options,0,x,y,w,h,Normal,0);
  2987.       ObjectDraw(tree1ptr,fileopts,4,x,y,w,h);
  2988.       tree1ptr^[verify + 1].spec^.ptext := ADR(gverifystr);
  2989.       ObjectDraw(tree1ptr,verify,1,x,y,w,h);        
  2990. END GetOptions;
  2991.  
  2992. PROCEDURE ConfirmCopys;
  2993.  
  2994. VAR
  2995.    stx,sty,stw,sth,ewidth,eheight,xoff,yoff : INTEGER;
  2996.  
  2997. BEGIN
  2998.   ObjectOffset(tree1ptr,filedlg,xoff,yoff);
  2999.       tree5ptr^[copydlg + 1].x := xoff;
  3000.       tree5ptr^[copydlg + 1].y := yoff;
  3001.       ewidth := tree5ptr^[copydlg + 1].width;
  3002.       eheight := tree5ptr^[copydlg + 1].height;
  3003.       (*stx := (xoff + ewidth) DIV 2;
  3004.       sty := (yoff + eheight) DIV 2;
  3005.       stw := 5;
  3006.       sth := 2;
  3007.       GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  3008.       GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  3009.       ObjectDraw(tree5ptr,copydlg,2,xx,yy,ww,hh);
  3010.       showit := FormDo(tree5ptr,0);
  3011.       IF GetObjectState(tree5ptr,tree5,condlgcl,Selected) THEN
  3012.          (*GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  3013.          GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)END;
  3014.       ObjectChange(tree5ptr,condlgcl,0,x,y,w,h,Normal,0);   
  3015.       ObjectChange(tree1ptr,options,0,x,y,w,h,Normal,0);
  3016. END ConfirmCopys;
  3017.  
  3018. PROCEDURE ConfirmDeletes;
  3019.  
  3020. VAR
  3021.    stx,sty,stw,sth,ewidth,eheight,xoff,yoff : INTEGER;
  3022.  
  3023. BEGIN
  3024.   ObjectOffset(tree1ptr,filedlg,xoff,yoff);
  3025.       tree6ptr^[dltdlg + 1].x := xoff;
  3026.       tree6ptr^[dltdlg + 1].y := yoff;
  3027.       ewidth := tree6ptr^[dltdlg + 1].width;
  3028.       eheight := tree6ptr^[dltdlg + 1].height;
  3029.       stx := (xoff + ewidth) DIV 2;
  3030.       sty := (yoff + eheight) DIV 2;
  3031.       stw := 5;
  3032.       sth := 2;
  3033.       (*GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  3034.       GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)
  3035.       ObjectDraw(tree6ptr,copydlg,2,xx,yy,ww,hh);
  3036.       showit := FormDo(tree6ptr,0);
  3037.       IF GetObjectState(tree6ptr,tree6,dltdlgcl,Selected) THEN
  3038.          (*GrafShrinkBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);
  3039.          GrafGrowBox(stx,sty,stw,sth,xoff,yoff,ewidth,eheight);*)END;
  3040.       ObjectChange(tree6ptr,dltdlgcl,0,x,y,w,h,Normal,0);   
  3041.       ObjectChange(tree1ptr,options,0,x,y,w,h,Normal,0);
  3042. END ConfirmDeletes;
  3043.  
  3044.  
  3045. PROCEDURE ChangeMask;
  3046.  
  3047.  
  3048. BEGIN
  3049.        (*ShowPath(Path);*)
  3050.        maskaddr := tree1ptr^[mask + 1].spec^.ptext;
  3051.        maskstr := maskaddr^;
  3052.        IF Compare(maskstr,oldmaskstr) # Equal THEN
  3053.           ClearArray;
  3054.           MakeArray(ffpath);
  3055.           Directory;
  3056.           index := 12;
  3057.           CalcSliderSize;
  3058.           ObjectChange(tree1ptr,fnametemp,0,x,y,w,h,Normal,1);
  3059.           ObjectDraw(tree1ptr,fnametemp,1,x,y,w,h);
  3060.           ObjectDraw(tree1ptr,fwind,2,x,y,w,h);
  3061.           oldmaskstr := maskstr;
  3062.        END;
  3063.   ObjectChange(tree1ptr,mask,0,x,y,w,h,Normal,1);
  3064. END ChangeMask; 
  3065.  
  3066. PROCEDURE CheckDrivesAvail;
  3067.  
  3068. BEGIN
  3069.   FOR d := 0 TO 15 DO
  3070.       ObjectChange(tree1ptr,drivea + d,0,x,y,w,h,disabled,0);
  3071.   END;
  3072.   drv := DriveMap();
  3073.     FOR d := 0 TO 15 DO
  3074.         IF d IN drv THEN
  3075.                 ObjectChange(tree1ptr,drivea + d,0,x,y,w,h,Normal,0);END;
  3076.     END; (* FOR *)                       
  3077. END CheckDrivesAvail;
  3078.   
  3079. PROCEDURE SelectDrive;
  3080.  
  3081. BEGIN
  3082.   ObjectChange(tree1ptr,drivea + INTEGER(defaultdrive),0,x,y,w,h,selected,0);
  3083. END SelectDrive;
  3084.  
  3085. (*PROCEDURE LoadResource;
  3086.  
  3087. CONST 
  3088.    CRFilename = ':\THEACCC.RSC';
  3089.    MRFilename = ':\THEACCM.RSC';
  3090. VAR 
  3091.    rname,pathdrive,path : String;
  3092.    
  3093. BEGIN
  3094.   GEMDOS.GetDrv(defaultdrive);
  3095.   pathdrive := CHR(ORD(defaultdrive) + ORD('A'));
  3096.   IF resolution = 1 THEN
  3097.      rname := CRFilename;
  3098.   ELSE
  3099.      rname := MRFilename;
  3100.   END;   
  3101.   Concat(pathdrive,rname,path);
  3102.   ResourceLoad(path);
  3103.   IF AESCallResult = 0 THEN
  3104.      loaded  := FALSE; ELSE loaded := TRUE; END;
  3105. END LoadResource;
  3106.   *)                        
  3107. PROCEDURE Initialize;
  3108.  
  3109.   VAR
  3110.      fromobspec : etree;
  3111.      path,blank,zero : String;
  3112.      objflagsint,x,y,w,h,showit,objstate,objtype,objx,objy,
  3113.      xoff,yoff,i : INTEGER;
  3114.      objflags : BITSET;
  3115.      
  3116. BEGIN
  3117.   blank := '';
  3118.   sectorspertrack := 9;
  3119.   fcount := 12;
  3120.   COUNT := 0;
  3121.   count := 0;
  3122.   tracksperdisk := 79;
  3123.   nine := 1;
  3124.   (*ResourceGetAddr(0,tree1,tree1ptr);
  3125.   ResourceGetAddr(0,tree2,tree2ptr);
  3126.   ResourceGetAddr(0,tree3,tree3ptr);
  3127.   ResourceGetAddr(0,tree4,tree4ptr);
  3128.   ResourceGetAddr(0,tree5,tree5ptr);
  3129.   ResourceGetAddr(0,tree6,tree6ptr);*)
  3130.   tree1ptr := TreeAddr^[tree1];
  3131.   tree2ptr := TreeAddr^[tree2];
  3132.   tree3ptr := TreeAddr^[tree3];
  3133.   tree4ptr := TreeAddr^[tree4];
  3134.   tree5ptr := TreeAddr^[tree5];
  3135.   tree6ptr := TreeAddr^[tree6];
  3136.   initialized := FALSE;
  3137.   clearfirst := TRUE;
  3138.   tree1ptr^[ftrack + 1].width := 82;
  3139.   tree1ptr^[fslider + 1].width := 80;
  3140.   tree1ptr^[fslider + 1].x := tree1ptr^[ftrack + 1].x + 1;
  3141.   SuperExec(PROC(GetVerifyFlag));
  3142.   vint := INTEGER(verifyflag);
  3143.   DoVerify;
  3144.     CheckDrivesAvail;
  3145.     GEMDOS.GetDrv(defaultdrive);
  3146.     GEMDOS.SetDrv(defaultdrive,drivemap);
  3147.     maskstr := '*.*';
  3148.     oldmaskstr := maskstr;
  3149.     tree1ptr^[mask + 1].spec^.ptext := ADR(maskstr);
  3150.     fnametemp := fname2;       
  3151.     fffpath := '\*.*';
  3152.     ClearArray;
  3153.     MakeArray(fffpath);
  3154.     globlepath := fffpath;
  3155.     ffpath := fffpath;
  3156.     Directory;
  3157.     pathdrive := CHR(ORD(defaultdrive) + ORD('A'));
  3158.     Concat(pathdrive,':\*.*',presult);
  3159.     pathstr := presult;
  3160.     sourcepathstr := pathstr;
  3161.     tree1ptr^[ftoname + 1].spec^.ptext := ADR(blank);
  3162.     tree1ptr^[filename + 1].spec^.ptext := ADR(blank);
  3163.     zero := '  0';
  3164.     tree5ptr^[fntocpy + 1].spec^.ptext := ADR(zero);
  3165.     tree6ptr^[fldtodlt + 1].spec^.ptext := ADR(zero);
  3166.     CalcSliderSize;
  3167.     initialized := TRUE;
  3168.     confirmcopy := TRUE;
  3169.     confirmdlt := TRUE;
  3170.     therewasanerror := FALSE;
  3171.     
  3172.     index := 12;
  3173.     ObjectChange(tree1ptr,fset,0,x,y,w,h,disabled,0);
  3174.     apid := ApplInitialise();
  3175.     FOR i := 0 TO 9 DO
  3176.       workIn[i] := 1 ;
  3177.   END ;
  3178.  
  3179.   workIn[10] := 2 ; (* Set RC *)
  3180.  
  3181.   OpenVirtualWorkstation(workIn,handle,workOut) ;
  3182. END Initialize;   
  3183.  
  3184. PROCEDURE EventLoop;
  3185.  
  3186. BEGIN
  3187.     CheckDrivesAvail;
  3188.     GEMDOS.GetDrv(appldrive);
  3189.     GEMDOS.SetDrv(defaultdrive,drivemap);
  3190.     SelectDrive;
  3191.     newwind := WindowCreate(0,0,0,640,200);
  3192.     FormCenter(tree1ptr,x,y,w,h);
  3193.     FormDialogue(1,0,0,0,0,x,y,w,h);
  3194.     WindowOpen(newwind,x,y,w,h);
  3195.     ObjectDraw(tree1ptr,0,5,x,y,w,h);
  3196.     tree1ptr^[verify + 1].spec^.ptext := ADR(gverifystr);
  3197.     ObjectDraw(tree1ptr,verify,1,x,y,w,h);
  3198.     GrafMouse(Arrow,NIL);
  3199.   REPEAT
  3200.     selobspec := etree(tree1ptr^[ftoname + 1].spec);  
  3201.     selection := selobspec^.ptext;
  3202.     (*selection := tree1ptr^[ftoname].spec^.ptext;*)
  3203.     selpathstr := selection^;
  3204.     selobspec^.ptext := ADR(selpathstr);
  3205. (*    tree1ptr^[ftoname + 1].spec^.ptext := ADR(selpathstr);*)
  3206.     
  3207.     IF GetObjectState(tree1ptr,tree1,cpyscr,Selected) THEN
  3208.        sourcepathstr := pathstr;
  3209.        globlepath := fffpath; END;
  3210.     showit := FormDo(tree1ptr,ftoname);
  3211.     CASE showit OF
  3212.            format            : Formatdisk(tree1,fslider,tree1ptr);|
  3213.            drvfree           : GetFreeSpace;|
  3214.            verify            : DoVerify;|
  3215.            cpycopy           : CopyDiskorFile;|
  3216.            fspt              : Changespt;|
  3217.            fup               : ScrollUp;|
  3218.            fdown             : ScrollDown;|
  3219.            fname2..fname13   : MoveName(showit);|
  3220.            finfo             : FileInfo;|
  3221.            fset              : RenameOrSetAttrib;|
  3222.            fpath             : FilePath;|
  3223.            fprint            : HardCopy;|
  3224.            fnslider          : MoveSlider;|
  3225.            cpycancl          : CancelCopy;|
  3226.            fntrack           : Scroll12;|
  3227.            erase             : ErasetheFile;|
  3228.            fldok             : EraseOrCreate;|
  3229.            options           : GetOptions;|
  3230.            drivea..drivep    : SetTheDrive;|
  3231.            mask              : ChangeMask;|
  3232.     END; (* CASE *)
  3233.     
  3234.   UNTIL GetObjectState(tree1ptr,tree1,mainexit,Selected); 
  3235.   WindowClose(newwind);
  3236.   WindowDelete(newwind);    
  3237.   FormDialogue(2,0,0,0,0,x,y,w,h);
  3238.   ObjectChange(tree1ptr,mainexit,0,x,y,w,h,Normal,0);
  3239.   GEMDOS.SetDrv(appldrive,drivemap);
  3240. END EventLoop;
  3241.     
  3242. (* MERGE THE MAIN PROGRAM AT THIS POINT, USE MAINC.MOD FOR MEDIUM OR  *)
  3243. (* MAINM.MOD FOR HIGH RESOLUTION. THE ROUTINES ARE SLIGHTLY DIFFERENT *)
  3244. (* FOR CHECKING WHICH RESOLUTION IS BEING USED DURING BOOTING.        *)
  3245.