home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / polski_aminet / marcin_zawadowicz / bfw.e < prev    next >
Text File  |  1996-11-19  |  15KB  |  462 lines

  1. /*==========================================================================*/
  2.  
  3. -> PROGRAM       BFW
  4. -> VERSION       3.1b
  5. -> AUTHOR        Martin 'Bay-Tek' Zawadowicz
  6. -> GUI DESIGN BY Bay-Tek
  7. -> MAKE          ECDEMO v3.1
  8.  
  9. /*==========================================================================*/
  10. /* NOTE: SOURCE IS FREEWARE!!!                                              */
  11. /*==========================================================================*/
  12.  
  13. OPT PREPROCESS
  14.  
  15. MODULE 'intuition/intuition','gadtools','libraries/gadtools','intuition/gadgetclass',
  16.        'intuition/screens','graphics/text','utility/tagitem','graphics/rastport',
  17.        'dos/dos','dos/dosextens','dos/exall','dos/filehandler','dos/dostags',
  18.        'exec/nodes','exec/lists','asl','libraries/asl'
  19.  
  20.  
  21. ENUM ERR_NONE,ERR_KICK,ERR_CONTEXT,ERR_GADGET,ERR_LOCKSCREEN,ERR_VISUAL,
  22.      ERR_GTOPEN,ERR_WINDOW,ERR_SCREEN,ERR_MENUS,ERR_DEVLIST,ERR_FORMAT,
  23.      ERR_BFNAME,ERR_DISKNAME
  24.  
  25. CONST WNDIDCMP = IDCMP_MOUSEMOVE OR IDCMP_REFRESHWINDOW OR IDCMP_RAWKEY OR
  26.                  IDCMP_GADGETUP OR IDCMP_CLOSEWINDOW OR LISTVIEWIDCMP OR
  27.                  SCROLLERIDCMP
  28.  
  29. CONST WNDFLAGS = WFLG_DRAGBAR OR WFLG_DEPTHGADGET OR WFLG_CLOSEGADGET OR
  30.                  WFLG_SMART_REFRESH OR WFLG_ACTIVATE OR WFLG_RMBTRAP
  31.  
  32. DEF    screen:PTR TO screen,
  33.     quit_bfw=FALSE,
  34.     bfw_wnd:PTR TO window,
  35.     visual=NIL,
  36.     tattr:PTR TO textattr,
  37.     offx,offy,
  38.     bfw_glist,
  39.     bfw_Zoom[4]:ARRAY OF INT,
  40.     getfileimagedata_g:PTR TO image,getfileimagedata
  41.  
  42. DEF    g_dname=NIL:PTR TO gadget,
  43.     g_drives=NIL:PTR TO gadget,
  44.     g_system=NIL:PTR TO gadget,
  45.     g_speed=NIL:PTR TO gadget,
  46.     g_quiet=NIL:PTR TO gadget,
  47.     g_getfile=NIL:PTR TO gadget,
  48.     g_bfname=NIL:PTR TO gadget,
  49.     g_format=NIL:PTR TO gadget,
  50.     g_about=NIL:PTR TO gadget
  51.  
  52. DEF     drivesList=NIL:PTR TO mlh,
  53.         fileReq=NIL:PTR TO filerequester
  54.  
  55. DEF     nameValue,
  56.         pathValue,
  57.         quiet_info[5]:STRING,
  58.         drive_info[50]:STRING,
  59.         system_info[5]:STRING,
  60.         speed_info[5]:STRING,
  61.         pubScrName[$50]:STRING,
  62.         pathBuff[256]:STRING
  63.  
  64. /*==========================================================================*/
  65.  
  66.  
  67. PROC p_OpenLibraries()
  68.     IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN Raise(ERR_GTOPEN)
  69. ENDPROC
  70.  
  71. PROC p_CloseLibraries()
  72.     IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  73. ENDPROC
  74.  
  75. PROC p_SetUpScreen()
  76.     IF (screen:=LockPubScreen(pubScrName))=NIL THEN Raise(ERR_LOCKSCREEN)
  77.         ScreenToFront(screen)
  78.     IF (visual:=GetVisualInfoA(screen,NIL))=NIL THEN Raise(ERR_VISUAL)
  79.     offy:=screen.wbortop+Int(screen.rastport+58)-10
  80. ENDPROC
  81.  
  82. PROC p_SetDownScreen()
  83.     IF getfileimagedata THEN Dispose(getfileimagedata)
  84.     IF visual THEN FreeVisualInfo(visual)
  85.     IF screen THEN UnlockPubScreen(NIL,screen)
  86. ENDPROC
  87.  
  88. PROC p_bfwGui()
  89. DEF g=NIL:PTR TO gadget
  90. DEF stringInfo_dn:PTR TO stringinfo,stringInfo_p:PTR TO stringinfo
  91.  
  92.    drivesList:=New(SIZEOF mlh)
  93.      p_InitList(drivesList)
  94.  
  95.  IF ( g:=CreateContext({bfw_glist}))=NIL THEN Raise (ERR_CONTEXT)
  96.   IF (g_dname:=g:=CreateGadgetA(STRING_KIND,g,
  97.     [offx+94,offy+17,169,14,'Disk Name',tattr,0,1,visual,0]:newgadget,
  98.     [$80032013,1,
  99.      GTST_STRING,'Empty',
  100.      GTST_MAXCHARS,256,
  101.      NIL]))=NIL THEN Raise (ERR_GADGET)
  102.      stringInfo_dn:=g_dname.specialinfo
  103.      nameValue:=stringInfo_dn.buffer
  104.  
  105.   IF (g_drives:=g:=CreateGadgetA(LISTVIEW_KIND,g,
  106.     [offx+14,offy+55,91,56,'Drives:',tattr,1,4,visual,0]:newgadget,
  107.     [GTLV_LABELS,NIL,
  108.      GTLV_SHOWSELECTED,NIL,
  109.      NIL]))=NIL THEN Raise (ERR_GADGET)
  110.   IF (g_system:=g:=CreateGadgetA(CYCLE_KIND,g,
  111.     [offx+174,offy+55,89,13,'System:',tattr,2,1,visual,0]:newgadget,
  112.     [GTCY_LABELS,['FFS','OFS',0],
  113.      NIL]))=NIL THEN Raise (ERR_GADGET)
  114.   IF (g_speed:=g:=CreateGadgetA(CYCLE_KIND,g,
  115.     [offx+174,offy+75,89,13,'Speed:',tattr,3,1,visual,0]:newgadget,
  116.     [GTCY_LABELS,['FAST','QUICK','SLOW',0],
  117.      NIL]))=NIL THEN Raise (ERR_GADGET)
  118.   IF (g_quiet:=g:=CreateGadgetA(CHECKBOX_KIND,g,
  119.     [offx+237,offy+96,26,11,'Quiet:',tattr,4,1,visual,0]:newgadget,
  120.      NIL))=NIL THEN Raise (ERR_GADGET)
  121.   IF (g_getfile:=g:=CreateGadgetA(GENERIC_KIND,g,
  122.     [offx+243,offy+119,20,14,'',tattr,5,0,visual,0]:newgadget,
  123.     [NIL]))=NIL THEN Raise (ERR_GADGET)
  124.         g_getfile.flags:=GFLG_GADGIMAGE
  125.         g_getfile.activation:=GACT_RELVERIFY
  126.         g_getfile.gadgetrender:=getfileimagedata_g
  127.   IF (g_bfname:=g:=CreateGadgetA(STRING_KIND,g,
  128.     [offx+14,offy+119,227,14,'',tattr,6,0,visual,0]:newgadget,
  129.     [$80032013,1,
  130.      GTST_STRING,pathBuff,
  131.      GTST_MAXCHARS,256,
  132.      NIL]))=NIL THEN Raise (ERR_GADGET)
  133.      stringInfo_p:=g_bfname.specialinfo
  134.      pathValue:=stringInfo_p.buffer
  135.  
  136.   IF (g_format:=g:=CreateGadgetA(BUTTON_KIND,g,
  137.     [offx+14,offy+145,124,15,'_FORMAT',tattr,7,16,visual,0]:newgadget,
  138.     [GT_UNDERSCORE,"_",
  139.      NIL]))=NIL THEN Raise (ERR_GADGET)
  140.   IF (g_about:=g:=CreateGadgetA(BUTTON_KIND,g,
  141.     [offx+139,offy+145,124,15,'_ABOUT',tattr,8,16,visual,0]:newgadget,
  142.     [GT_UNDERSCORE,"_",
  143.      NIL]))=NIL THEN Raise (ERR_GADGET)
  144. ENDPROC
  145.  
  146. PROC  p_OpenbfwWindow()
  147.  bfw_Zoom[0]:=NIL
  148.  bfw_Zoom[1]:=NIL
  149.  bfw_Zoom[2]:=TextLength(screen.rastport,'BFW v3.1b',8)+85
  150.  bfw_Zoom[3]:=screen.wbortop+screen.rastport.txheight+1
  151.  
  152.  IF (bfw_wnd:=OpenWindowTagList(NIL,
  153.          [WA_LEFT,(screen.width-277)/2,
  154.                WA_TOP,(screen.height-offy-168)/2,
  155.                WA_WIDTH,277,
  156.                WA_HEIGHT,offy+168,
  157.                WA_FLAGS,WNDFLAGS,
  158.                WA_IDCMP,WNDIDCMP,
  159.                WA_TITLE,'BFW v3.1b',
  160.                WA_SCREENTITLE,'BFW by Bay-Tek/MAWI^SCUM^TSI',
  161.                WA_GADGETS,bfw_glist,
  162.                WA_ZOOM,bfw_Zoom,
  163.                WA_AUTOADJUST,TRUE,
  164.                   WA_CUSTOMSCREEN,screen,
  165.                WA_NEWLOOKMENUS,TRUE,
  166.                TAG_DONE]))=NIL THEN Raise (ERR_WINDOW)
  167.  
  168.    p_bfwRender()
  169. ENDPROC
  170.  
  171. PROC p_ClosebfwWindow()
  172.   IF bfw_wnd THEN CloseWindow(bfw_wnd)
  173.   IF bfw_glist THEN FreeGadgets(bfw_glist)
  174. ENDPROC
  175.  
  176. PROC p_bfwRender()
  177.   DrawBevelBoxA(bfw_wnd.rport,12+offx,144+offy,253,17,
  178.     [GT_VISUALINFO,visual,GTBB_RECESSED,TRUE,NIL])
  179.   DrawBevelBoxA(bfw_wnd.rport,4+offx,11+offy,269,26,
  180.     [GT_VISUALINFO,visual,NIL])
  181.   DrawBevelBoxA(bfw_wnd.rport,4+offx,113+offy,269,26,
  182.     [GT_VISUALINFO,visual,NIL])
  183.   DrawBevelBoxA(bfw_wnd.rport,4+offx,139+offy,269,27,
  184.     [GT_VISUALINFO,visual,NIL])
  185.   DrawBevelBoxA(bfw_wnd.rport,4+offx,37+offy,269,76,
  186.     [GT_VISUALINFO,visual,NIL])
  187.   Gt_RefreshWindow(bfw_wnd,NIL)
  188. ENDPROC
  189.  
  190. /*==========================================================================*/
  191.  
  192. PROC p_LookbfwMessage()
  193. DEF mes:PTR TO intuimessage,g:PTR TO gadget,
  194.     type=0,infos=NIL,listItemPosition=1
  195.  
  196.   REPEAT
  197.    IF mes:=Gt_GetIMsg(bfw_wnd.userport)
  198.        type:=mes.class
  199.         infos:=mes.code
  200.        SELECT type
  201.           CASE IDCMP_CLOSEWINDOW
  202.              quit_bfw:=TRUE
  203.           CASE IDCMP_REFRESHWINDOW
  204.              Gt_BeginRefresh(bfw_wnd)
  205.              Gt_EndRefresh(bfw_wnd,TRUE)
  206.               p_bfwRender()
  207.              type:=0
  208.            CASE IDCMP_RAWKEY
  209.                 IF infos=69
  210.                    quit_bfw:=TRUE
  211.                 ELSEIF infos=35
  212.                    p_Format()
  213.                 ELSEIF infos=32
  214.                    JUMP about
  215.                 ENDIF
  216.            CASE IDCMP_GADGETUP
  217.               g:=mes.iaddress
  218.               SELECT g
  219.                  CASE  g_drives
  220.                    listItemPosition:=infos
  221.                    p_DriveName(listItemPosition)
  222.                  CASE  g_system
  223.                    IF infos=1
  224.                       StrCopy(system_info,'NOFFS')
  225.                    ELSEIF infos=0
  226.                       StrCopy(system_info,'FFS')
  227.                    ENDIF
  228.  
  229.                  CASE  g_speed
  230.                    IF infos=1
  231.                       StrCopy(speed_info,'QUICK')
  232.                    ELSEIF infos=2
  233.                       StrCopy(speed_info,'SLOW')
  234.                    ELSEIF infos=0
  235.                       StrCopy(speed_info,'FAST')
  236.                    ENDIF
  237.  
  238.                  CASE  g_quiet
  239.                    IF infos THEN quiet_info:='QuIeT' ELSE quiet_info:=FALSE
  240.  
  241.                  CASE  g_getfile
  242.                    p_FileReqester()
  243.                  CASE  g_format
  244.                    p_Format()
  245.                  CASE  g_about
  246. about:             reqest({about_txt},'OK')
  247.  
  248.               ENDSELECT
  249.        ENDSELECT
  250.        Gt_ReplyIMsg(mes)
  251.      ELSE
  252.       WaitPort(bfw_wnd.userport)
  253.    ENDIF
  254.   UNTIL type
  255. ENDPROC
  256.  
  257. PROC main() HANDLE
  258. DEF errlist:PTR TO LONG,args:PTR TO LONG,rdarg
  259.  
  260.  args:=['SYS:C/BFormat','Workbench']
  261.  
  262.    tattr:=['topaz.font',8,0,0]:textattr
  263.     IF KickVersion(37)=FALSE THEN Raise (ERR_KICK)
  264.      rdarg:=ReadArgs('BFNAME/K/A,PUBSCR/K/A',args,NIL)
  265.       StrCopy(pathBuff,args[0],ALL)
  266.         StrCopy(pubScrName,args[1],ALL)
  267.     p_OpenLibraries()
  268.     p_SetUpScreen()
  269.     p_AllocGetFileImage()
  270.     p_bfwGui()
  271.     p_OpenbfwWindow()
  272.     p_HuntDrives()
  273.     p_DriveName(0)
  274.       IF rdarg THEN FreeArgs(rdarg)
  275.        StrCopy(system_info,'FFS')
  276.         StrCopy(speed_info,'FAST')
  277.  
  278.     REPEAT
  279.         p_LookbfwMessage()
  280.     UNTIL quit_bfw=TRUE
  281.  
  282.     Raise(ERR_NONE)
  283.  EXCEPT
  284.     p_ClosebfwWindow()
  285.     p_SetDownScreen()
  286.     p_CloseLibraries()
  287.  
  288.   IF exception="MEM"
  289.       WriteF('Sorry, out of memory!!!\n') ; JUMP exit
  290.   ENDIF
  291.  
  292.   IF exception=ERR_KICK THEN WriteF('Sorry, you need KickStart v37+!!!\n')
  293.   IF exception>1
  294.      errlist:=['get context','create gadget','lock screen','get visual infos',
  295.                'open "gadtools.library" v37+','open window','open screen','create menus']
  296.      EasyRequestArgs(0,[20,0,'Error!!!','Could not \s!','OK'],0,[errlist[exception-2]])
  297.   ENDIF
  298. exit:
  299. ENDPROC
  300.  
  301. /*=======================================================================*/
  302.  
  303. PROC p_InitList(l:PTR TO mlh)
  304.   l.head:=l+4
  305.   l.tail:=NIL
  306.   l.tailpred:=l
  307. ENDPROC
  308.  
  309.  
  310. PROC p_AddToList(string)
  311. DEF newNode=NIL:PTR TO ln, node:PTR TO ln,done=FALSE,itemPosition=0
  312.   newNode:=New(SIZEOF ln)
  313.   newNode.name:=String(StrLen(string))
  314.   StrCopy(newNode.name,string,ALL)
  315.   Gt_SetGadgetAttrsA (g_drives,bfw_wnd , NIL, [GTLV_LABELS, -1, TAG_DONE])
  316.   node:=drivesList.head
  317.   IF drivesList.tailpred=drivesList
  318.     AddHead(drivesList, newNode)
  319.   ELSEIF Char(node.name)>string[]
  320.     AddHead(drivesList, newNode)
  321.   ELSEIF node=drivesList.tailpred
  322.     AddTail(drivesList,newNode)
  323.   ELSE
  324.     WHILE done=FALSE
  325.       node:=node.succ
  326.       INC itemPosition
  327.       IF Char(node.name)>string[]
  328.         done:=TRUE
  329.       ELSEIF node.succ=NIL
  330.         done:=TRUE
  331.       ENDIF
  332.     ENDWHILE
  333.     Insert(drivesList, newNode, node.pred)
  334.   ENDIF
  335.   Gt_SetGadgetAttrsA (g_drives,bfw_wnd, NIL,
  336.                       [GTLV_LABELS, drivesList,
  337.                        GTLV_TOP,    0,
  338.                        GTLV_SELECTED,0,
  339.                        TAG_DONE])
  340. ENDPROC
  341.  
  342.  
  343. PROC p_DriveName(itemPosition)
  344. DEF node:PTR TO ln, i=0
  345.     node:=drivesList.head
  346.     WHILE i<>itemPosition
  347.          node:=node.succ
  348.          INC i
  349.     ENDWHILE
  350.     StrCopy(drive_info,node.name)
  351. ENDPROC
  352.  
  353. /*==========================================================================*/
  354.  
  355. PROC reqest(body,gad)
  356. ENDPROC  EasyRequestArgs(bfw_wnd,[20,0,'BFW requester',body,gad],0,0)
  357.  
  358. /*==========================================================================*/
  359.  
  360. PROC p_HuntDrives()
  361. DEF dl=NIL:PTR TO doslist,dlist=NIL,srtBuff[50]:STRING,
  362.     fss:PTR TO filesysstartupmsg,dosenv:PTR TO dosenvec
  363.  
  364.    dl:=(dlist:=LockDosList(LDF_DEVICES OR LDF_READ))
  365.     IF dlist=NIL THEN Raise (ERR_DEVLIST)
  366.      WHILE dl:=NextDosEntry(dl,LDF_DEVICES)
  367.       IF (dl.task<>0) AND (dl.startup>0)
  368.         fss:=BADDR(dl.startup) ; dosenv:=BADDR(fss.environ)
  369.        IF ((dosenv.dostype=$444F5300)  OR (dosenv.dostype=$444F5301)) AND ((dosenv.blockspertrack=11) OR (dosenv.blockspertrack=63) OR (dosenv.blockspertrack=51))
  370.          StringF(srtBuff,'\s:',BADDR(dl.name)+1)
  371.          p_AddToList(srtBuff)
  372.        ENDIF
  373.      ENDIF
  374.    ENDWHILE
  375.  UnLockDosList(LDF_DEVICES OR LDF_READ)
  376. ENDPROC
  377.  
  378. PROC p_FileReqester()
  379.  IF (aslbase:=OpenLibrary('asl.library',37))=NIL
  380.      reqest('Could not open "asl.library" v37+','OK')
  381.      RETURN
  382.  ELSE
  383.  
  384.   IF (fileReq:=AllocAslRequest(ASL_FILEREQUEST,[ASLFR_TITLETEXT,'BFormatWin',ASLFR_WINDOW,bfw_wnd,ASLFR_SLEEPWINDOW,TAG_DONE]))=NIL
  385.       reqest('Could not alloc requester','OK')
  386.       JUMP closeLib
  387.   ENDIF
  388.  
  389.  ENDIF
  390.  
  391.   IF (AslRequest(fileReq,0))=NIL THEN JUMP nofile
  392.  
  393.                         MOVE.L    fileReq,A0
  394.             MOVE.L    8(A0),A0
  395.             MOVE.L    pathValue,A1
  396.         cp0:    MOVE.B    (A0)+,(A1)+
  397.             BNE.S    cp0
  398.  
  399.             AddPart(pathValue,fileReq.file,256)
  400.  
  401.  
  402.        Gt_SetGadgetAttrsA(g_bfname,bfw_wnd,NIL,[GTST_STRING,pathValue,NIL])
  403. nofile:
  404.        FreeAslRequest(fileReq)
  405. closeLib:
  406.        CloseLibrary(aslbase)
  407. ENDPROC
  408.  
  409. /*==========================================================================*/
  410.  
  411. PROC p_Format() HANDLE
  412. DEF bformat_exe[256]:STRING,fh=NIL,err,con[256]:STRING
  413.  IF pathValue[]=NIL THEN Raise(ERR_BFNAME)
  414.   IF nameValue[]=NIL THEN Raise(ERR_DISKNAME)
  415.  
  416.  IF  (reqest('You are sure ?!?','Yes|No!'))=FALSE THEN RETURN
  417.     StringF(bformat_exe,'"\s" DRIVE \s NAME "\s" \s \s \s',pathValue,drive_info,nameValue,system_info,speed_info,quiet_info)
  418.     StringF(con,'CON:////BFW output window/CLOSE/SCREEN\s',pubScrName)
  419.        IF (fh:=Open(con,NEWFILE))=NIL THEN Raise ("OPEN")
  420.        IF (err:=SystemTagList(bformat_exe,[SYS_INPUT,fh,
  421.                                            SYS_OUTPUT,fh,
  422.                                            SYS_ASYNCH,FALSE,NIL]))<>NIL THEN Raise (ERR_FORMAT)
  423.  
  424.  EXCEPT DO
  425.    IF fh ; Delay(50) ; Close(fh) ; ENDIF
  426.  IF exception
  427.    SELECT exception
  428.     CASE ERR_DISKNAME ;  reqest('Disk name is bad!!!','OK')
  429.     CASE ERR_BFNAME   ;  reqest('BadFormat name is bad!!!','OK')
  430.     CASE ERR_FORMAT   ;  reqest('Format error!!!','OK')
  431.     CASE "OPEN"       ;  reqest('Could not open output window!!!','OK')
  432.   ENDSELECT
  433.  ENDIF
  434. ENDPROC
  435.  
  436. /*==========================================================================*/
  437.  
  438. PROC p_AllocGetFileImage()
  439. IF  (CopyMem([$0000,$1000,$0000,$3000,$003C,$3000,$0042,$3000,
  440.               $0F81,$3000,$0FC1,$3000,$0C3F,$3000,$0C01,$3000,
  441.               $0C01,$3000,$0C01,$3000,$0FFF,$3000,$0000,$3000,
  442.               $0000,$3000,$7FFF,$F000,
  443.               $FFFF,$E000,$C000,$0000,$C000,$0000,$C000,$0000,
  444.               $C000,$0000,$C000,$0000,$C000,$0000,$C000,$0000,
  445.               $C000,$0000,$C000,$0000,$C000,$0000,$C000,$0000,
  446.               $C000,$0000,$8000,$0000]:INT,getfileimagedata:=NewM(112,2),112))=NIL THEN Raise("MEM")
  447.  
  448.               getfileimagedata_g:=[ 0,0,20,14,2,getfileimagedata,$3,0,NIL]:image
  449. ENDPROC
  450.  
  451. /*==========================================================================*/
  452. about_txt:
  453.            CHAR   '»This program is FREEWARE«\n\n',
  454.                   'If you have any sugestions\n',
  455.                   'write to:\n\n',
  456.                   '    Martin Zawadowicz\n',
  457.                   '       Lipowa 4/19\n',
  458.                   '      76-200 Slupsk\n',
  459.                   '         POLAND',NIL
  460. /*==========================================================================*/
  461.  
  462.