home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / Split_GUI.lha / Split_v1.0 / Sources.lha / Sources / window.c < prev   
Encoding:
C/C++ Source or Header  |  1995-03-09  |  7.9 KB  |  349 lines

  1. #include <intuition/intuition.h>
  2. #include <libraries/gadtools.h>
  3. #include <dos/dos.h>
  4.  
  5. #include <proto/intuition.h>
  6. #include <proto/gadtools.h>
  7. #include <string.h>
  8.  
  9. /* for debug purposes */
  10. #include <stdio.h>
  11.  
  12. #include "split.h"
  13.  
  14. extern struct List *vlist;
  15.  
  16. extern BOOL stay;
  17.  
  18. extern BOOL setUpGadgets( void );
  19. extern void removeGadgets( void );
  20.  
  21. extern struct List *getVolumeList( struct List * );
  22. extern void freeVolumeList( struct List * );
  23.  
  24. extern struct Gadget *glist, *vlist_gad, *chunkoffs_gad,
  25.     *chunknam2_gad, *chunksize_gad;
  26. extern struct VisualInfo *vi;
  27.  
  28. extern char filename[128];
  29. extern ULONG filesize;
  30. extern STRPTR status_title, msg_ok, msg_warnbadpatch;
  31. extern STRPTR statname[4];
  32. extern UBYTE status;
  33. extern char chunkname[128];
  34. extern UBYTE chunk_number;
  35. extern ULONG chunksize, chunkoffset;
  36. extern void updateGadgets( void );
  37. extern void newChunkList( void );
  38. extern BOOL checkChunk( void );
  39. extern void getNextChunk( void );
  40. extern void goIdle( void );
  41. extern void writeNextChunk( void );
  42.  
  43. /* in handler.s */
  44. extern BOOL resetDOSlibrary( void );
  45.  
  46. extern void askSource( void );
  47. extern void askDest( void );
  48.  
  49. STRPTR msg_author, msg_cool,
  50.     msg_warnfilenotproc, msg_filenotprocgadgets, msg_filenotprocquitgad,
  51.     msg_warninvalidchunk, msg_invalidchunkgadgets;
  52.  
  53. #define MENUID_ABOUT 1
  54. #define MENUID_HIDE  2
  55. #define MENUID_QUIT  3
  56.  
  57. struct EasyStruct easyr = {
  58.     sizeof(struct EasyStruct), 0, NULL, NULL, NULL };
  59.  
  60. struct Menu *menus;
  61.  
  62. struct NewMenu newmenus[] = {
  63.     { NM_TITLE, NULL,         0, 0, 0, 0 },
  64.     { NM_ITEM,  NULL,         0, 0, 0, (APTR)MENUID_ABOUT },
  65.     { NM_ITEM,  NULL,         0, 0, 0, (APTR)MENUID_HIDE },
  66.     { NM_ITEM,  NULL,          0, 0, 0, (APTR)MENUID_QUIT },
  67.     { NM_END,   NULL,         0, 0, 0, 0 } };
  68.  
  69. struct Window *window;
  70. ULONG windowSig;
  71. UWORD wwidth, wheight, wleft = (UWORD)~0, wtop = (UWORD)~0;
  72.  
  73. void openGUI( void )
  74. {
  75. vlist = getVolumeList( vlist );
  76.  
  77. if ( window )
  78.     return;
  79.  
  80. if ( setUpGadgets() )
  81.     {
  82.     if ( window = OpenWindowTags( NULL,
  83.         WA_Left, wleft,
  84.         WA_Top, wtop,
  85.         WA_Width, wwidth,
  86.         WA_Height, wheight,
  87.         WA_Gadgets, glist,
  88.         WA_Title, "Split",
  89.         WA_ScreenTitle, "Split 1.0 © 1995 by Stefano Reksten of 3AM",
  90.         WA_Flags, WFLG_CLOSEGADGET|WFLG_DEPTHGADGET|WFLG_DRAGBAR|WFLG_ACTIVATE,
  91.         WA_IDCMP, IDCMP_CLOSEWINDOW|IDCMP_GADGETDOWN|IDCMP_REFRESHWINDOW|IDCMP_MENUPICK|LISTVIEWIDCMP,
  92.         TAG_END ) )
  93.         {
  94.         if ( menus = CreateMenus( newmenus, TAG_END ) )
  95.             {
  96.             if ( LayoutMenus( menus, vi, TAG_END ) )
  97.                 {
  98.                 if ( SetMenuStrip( window, menus ) )
  99.                     {
  100.                     GT_RefreshWindow( window, NULL );
  101.                     ScreenToFront( window->WScreen );
  102.                     windowSig = 1L<<window->UserPort->mp_SigBit;
  103.                     updateGadgets();
  104.                     return;
  105.                     }
  106.                 }
  107.             FreeMenus( menus );
  108.             }
  109.         CloseWindow( window );
  110.         }
  111.     else
  112.         removeGadgets();
  113.     }
  114. }
  115.  
  116.  
  117. void closeGUI( void )
  118. {
  119. if ( window )
  120.     {
  121.     wleft = window->LeftEdge;
  122.     wtop = window->TopEdge;
  123.     CloseWindow( window );
  124.     window = NULL;
  125.     removeGadgets();
  126.     freeVolumeList( vlist );
  127.     vlist = NULL;
  128.     }
  129. }
  130.  
  131.  
  132. ULONG sec, mic, oldsec, oldmic;
  133.  
  134.  
  135. void quit( void )
  136. {
  137. if ( status != STATUS_IDLE )
  138.     {
  139.     easyr.es_TextFormat = msg_warnfilenotproc;
  140.     easyr.es_GadgetFormat = msg_filenotprocquitgad;
  141.     if ( !EasyRequestArgs( window, &easyr, NULL, NULL ) )
  142.         return;
  143.     }
  144. if ( !resetDOSlibrary() )
  145.     {
  146.     easyr.es_TextFormat = msg_warnbadpatch;
  147.     easyr.es_GadgetFormat = msg_ok;
  148.     EasyRequestArgs( NULL, &easyr, NULL, NULL );
  149.     return;
  150.     }
  151. stay = FALSE;
  152. }
  153.  
  154.  
  155. UWORD lastnumber;
  156. void updateVolumeList( UWORD number )
  157. {
  158. if ( window )
  159.     GT_SetGadgetAttrs( vlist_gad, window, NULL, GTLV_Labels, ~0, TAG_END );
  160. vlist = getVolumeList( vlist );
  161. if ( window )
  162.     {
  163.     if ( number != (UWORD)~0 )
  164.         lastnumber = number;
  165.     GT_SetGadgetAttrs( vlist_gad, window, NULL, GTLV_Labels, vlist, GTLV_Selected, lastnumber, TAG_END );
  166.     }
  167. }
  168.  
  169.  
  170. ULONG maxChunkSize( UWORD code )
  171. {
  172. register struct volumeInfo *vi =(struct volumeInfo *)vlist->lh_Head;
  173. UBYTE n;
  174. ULONG blkptrPerBlock, freeblocks, fileblocks;
  175.  
  176. for ( n = 0; n < code; n++ )
  177.     vi = (struct volumeInfo *)vi->volumeNode.ln_Succ;
  178.  
  179. if ( vi->diskType != ID_MSDOS_DISK )
  180.     {
  181.     blkptrPerBlock = ( vi->diskType == ID_DOS_DISK || vi->diskType == ID_INTER_DOS_DISK || vi->diskType == ID_FASTDIR_DOS_DISK ) ? 72 : (vi->bytesPerBlock >> 2) - 56;
  182.     freeblocks = vi->freeBlocks;
  183.     fileblocks = 0;
  184.     while( freeblocks )
  185.         {
  186.         freeblocks--;
  187.         if ( freeblocks > blkptrPerBlock )
  188.             {
  189.             fileblocks += blkptrPerBlock;
  190.             freeblocks -= blkptrPerBlock;
  191.             }
  192.         else
  193.             {
  194.             fileblocks += freeblocks;
  195.             freeblocks = 0;
  196.             }
  197.         }
  198.     return fileblocks * vi->bytesPerBlock;
  199.     }
  200. else
  201.     {
  202.     return vi->freeSpace;
  203.     }
  204. }
  205.  
  206.  
  207. void handleWindowSig( void )
  208. {
  209. register struct IntuiMessage *msg;
  210. register ULONG class, menuid;
  211. register UWORD code, msgID;
  212.  
  213. while( window && stay && ( msg = GT_GetIMsg(window->UserPort) ) )
  214.     {
  215.     class = msg->Class;
  216.     if (class & (BUTTONIDCMP|IDCMP_GADGETDOWN))
  217.         {
  218.         code = msg->Code;
  219.         msgID = ((struct Gadget *)msg->IAddress)->GadgetID;
  220.         }
  221.     if (class == IDCMP_VANILLAKEY || class == IDCMP_MENUPICK )
  222.         msgID = msg->Code;
  223.     GT_ReplyIMsg( msg );
  224.  
  225.     switch( class )
  226.         {
  227.         case IDCMP_REFRESHWINDOW:
  228.             GT_BeginRefresh( window );
  229.             GT_EndRefresh( window, TRUE );
  230.             break;
  231.  
  232.         case IDCMP_MENUPICK:
  233.             if ( msgID != MENUNULL )
  234.                 {
  235.                 menuid = (ULONG)GTMENUITEM_USERDATA( ItemAddress( menus, msgID ) );
  236.                 switch ( menuid )
  237.                     {
  238.                     case MENUID_ABOUT:
  239.                         easyr.es_TextFormat = msg_author;
  240.                         easyr.es_GadgetFormat = msg_cool;
  241.                         EasyRequestArgs( window, &easyr, NULL, NULL );
  242.                         break;
  243.                     case MENUID_HIDE:
  244.                         closeGUI();
  245.                         break;
  246.                     case MENUID_QUIT:
  247.                         quit();
  248.                         break;
  249.                     }
  250.                 }
  251.             break;
  252.  
  253.         case IDCMP_CLOSEWINDOW:
  254.             closeGUI();
  255.             break;
  256.  
  257.         case BUTTONIDCMP:
  258.         case IDCMP_GADGETDOWN:
  259.             switch ( msgID )
  260.                 {
  261.                 case DOSLIST_GDG:
  262.                     vlist = getVolumeList( vlist );
  263.                     updateVolumeList( code );
  264.                     oldsec = sec;
  265.                     oldmic = mic;
  266.                     CurrentTime( &sec, &mic );
  267.                     if ( DoubleClick( oldsec, oldmic, sec, mic ) )
  268.                         {
  269.                         struct volumeInfo *vi =(struct volumeInfo *)vlist->lh_Head;
  270.                         UBYTE n;
  271.  
  272.                         chunksize = maxChunkSize( code ) - sizeof(struct Header);
  273.                         if ( filesize && ( chunksize + chunkoffset > filesize ) )
  274.                                 chunksize = filesize - chunkoffset;
  275.                         for ( n = 0; n < code; n++ )
  276.                             vi = (struct volumeInfo *)vi->volumeNode.ln_Succ;
  277.                         strcpy( chunkname, vi->deviceName );
  278.                         updateGadgets();
  279.                         }
  280.                     break;
  281.                 case CHUNK_GDG:
  282.                     getNextChunk();
  283.                     break;
  284.                 case CHUNKSIZE_GDG:
  285.                     GT_GetGadgetAttrs( chunksize_gad, window, NULL, GTIN_Number, &chunksize, TAG_END );
  286.                     if ( filesize && ( chunkoffset + chunksize > filesize ) )
  287.                         {
  288.                         chunksize = filesize - chunkoffset;
  289.                         updateGadgets();
  290.                         }
  291.                     break;
  292.                 case CHUNKOFFS_GDG:
  293.                     GT_GetGadgetAttrs( chunkoffs_gad, window, NULL, GTIN_Number, &chunkoffset, TAG_END );
  294.                     if ( filesize )
  295.                         {
  296.                         if ( chunkoffset > filesize )
  297.                             chunkoffset = 0;
  298.                         else if ( chunkoffset + chunksize > filesize )
  299.                             chunksize = filesize - chunkoffset;
  300.                         updateGadgets();
  301.                         }
  302.                     break;
  303.                 case WRITE_GDG:
  304.                     if ( checkChunk() )
  305.                         writeNextChunk();
  306.                     else
  307.                         {
  308.                         easyr.es_TextFormat = msg_warninvalidchunk;
  309.                         easyr.es_GadgetFormat = msg_invalidchunkgadgets;
  310.                         if ( EasyRequestArgs( window, &easyr, NULL, NULL ) )
  311.                             getNextChunk();
  312.                         }
  313.                     break;
  314.                 case CHUNKNAM1_GDG:
  315.                     askDest();
  316.                     break;
  317.                 case CHUNKNAM2_GDG:
  318.                     strcpy( chunkname, ((struct StringInfo *)chunknam2_gad->SpecialInfo)->Buffer );
  319.                     break;
  320.                 case FILENAM1_GDG:
  321.                     if ( status != STATUS_IDLE )
  322.                         {
  323.                         easyr.es_TextFormat = msg_warnfilenotproc;
  324.                         easyr.es_GadgetFormat = msg_filenotprocgadgets;
  325.                         if ( !EasyRequestArgs( window, &easyr, NULL, NULL ) )
  326.                             break;
  327.                         else
  328.                             goIdle();
  329.                         }
  330.                     askSource();
  331.                     if ( filesize < chunksize + chunkoffset )
  332.                         {
  333.                         chunksize = filesize - chunkoffset;
  334.                         updateGadgets();
  335.                         }
  336.                     getNextChunk();
  337.                     break;
  338.                 case HIDE_GDG:
  339.                     closeGUI();
  340.                     break;
  341.                 case QUIT_GDG:
  342.                     quit();
  343.                     break;
  344.                 }
  345.             break;
  346.         }
  347.     }
  348. }
  349.