home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / mac / source / tarsrc.sit / menu.c < prev    next >
Text File  |  1989-09-14  |  5KB  |  257 lines

  1. /*
  2.  * Macintosh Tar
  3.  *
  4.  * Written by Craig Ruff.
  5.  *
  6.  * Menu handling routines.
  7.  */
  8.  
  9. #include "tar.h"
  10. #include <Resources.h>
  11.  
  12. /*
  13.  * Resource IDs for menus
  14.  */
  15. #define appleID        128
  16. #define fileID        129
  17. #define editID        130
  18. #define optionID    131
  19.  
  20. /*
  21.  * Index for each menu
  22.  */
  23. #define appleMenu    0
  24. #define fileMenu    1
  25. #define editMenu    2
  26. #define optionMenu    3
  27. #define menuCount    4
  28.  
  29. /*
  30.  * Item in Apple Menu
  31.  */
  32. #define aboutItem    1
  33.  
  34. /*
  35.  * Items in File Menu
  36.  */
  37. #define createItem    1        /* Create archive */
  38. #define extractItem    2        /* Extract archive */
  39. #define listItem    3        /* List archive */
  40. #define closeItem    5        /* Close (only for Desk Acc) */
  41. #define pgsetItem    6        /* Page setup */
  42. #define quitItem    8
  43.  
  44. /*
  45.  * Items in Edit Menu
  46.  *
  47.  * For use by Desk Accessories.
  48.  */
  49. #define undoItem    1
  50. #define cutItem        3
  51. #define copyItem    4
  52. #define pasteItem    5
  53. #define clearItem    6
  54.  
  55. /*
  56.  * Items in Options Menu
  57.  */
  58. #define convertItem    1        /* Convert newlines */
  59. #define    oldArchItem    2        /* Old tar compatible archive creation */
  60. #define blockItem    3        /* Set block size */
  61. #define pageItem    5        /* Control paging of screen listing */
  62. #define printItem    6        /* Use printer instead of screen */
  63. #define typeItem    8        /* Creator/Type dialog */
  64.  
  65.  
  66. /*
  67.  * Menu related variables
  68.  */
  69.  
  70. MenuHandle    menus[menuCount];
  71. Boolean        menusOK;
  72.  
  73. /*
  74.  * MenuInit - set up menu bar
  75.  *
  76.  *    Reads non-apple menus from resource file.
  77.  */
  78. Boolean
  79. MenuInit() {
  80.     int    i;
  81.     char    *routine = "\pMenuInit";
  82.  
  83.     if ((menus[appleMenu] = GetMenu(appleID)) == nil) {
  84.         OSAlert(routine, "\pGetMenu Apple Menu", nil, ResError());
  85.         return(true);
  86.     }
  87.  
  88.     AddResMenu(menus[appleMenu], 'DRVR');
  89.     if ((menus[fileMenu] = GetMenu(fileID)) == nil) {
  90.         OSAlert(routine, "\pGetMenu File Menu", nil, ResError());
  91.         return(true);
  92.     }
  93.  
  94.     if ((menus[editMenu] = GetMenu(editID)) == nil) {
  95.         OSAlert(routine, "\pGetMenu Edit Menu", nil, ResError());
  96.         return(true);
  97.     }
  98.  
  99.     if ((menus[optionMenu] = GetMenu(optionID)) == nil) {
  100.         OSAlert(routine, "\pGetMenu Option Menu", nil, ResError());
  101.         return(true);
  102.     }
  103.  
  104.  
  105.     CheckItem(menus[optionMenu], pageItem, autoPage);
  106.     for (i = appleMenu; i < menuCount; i++)
  107.         InsertMenu(menus[i], 0);
  108.  
  109.     DDaMenus();
  110.     DrawMenuBar();
  111.     return(false);
  112. }
  113.  
  114. /*
  115.  * MenuCmd - handle a menu pick or keyboard equivalent
  116.  */
  117. MenuCmd(result)
  118. long    result;
  119. {
  120.     WindowPeek    wp;
  121.     short        theItem = result & 0xffff;
  122.     short        theMenu = (result >> 16) & 0xffff;
  123.     char        name[256];
  124.     OSErr        err;
  125.     char        *routine = "\pMenuCmd";
  126.     GrafPtr        savedPort;
  127.  
  128.     switch (theMenu) {
  129.     case appleID:
  130.         if (theItem == aboutItem)
  131.             DoAboutBox();
  132.         else {
  133.             /*
  134.              * Oh boy, set up for a desk accessory.
  135.              */
  136.             GetItem(menus[appleMenu], theItem, name);
  137.             GetPort(&savedPort);
  138.             if ((err = ZeroScrap()) != noErr) {
  139.                 OSAlert(routine, "\pZeroScrap", nil, err);
  140.                 break;
  141.             }
  142.  
  143.             if ((err = TEToScrap()) != noErr) {
  144.                 OSAlert(routine, "\pTEToScrap", nil, err);
  145.                 break;
  146.             }
  147.  
  148.             (void) OpenDeskAcc(name);
  149.             SetPort(savedPort);
  150.             if (FrontWindow() != nil) {
  151.                 EDaMenus();
  152.             }
  153.         }
  154.         break;
  155.  
  156.     case fileID:
  157.         switch (theItem) {
  158.         case createItem:
  159.             ArCreate();
  160.             break;
  161.  
  162.         case extractItem:
  163.             Extract();
  164.             break;
  165.  
  166.         case listItem:
  167.             List();
  168.             break;
  169.  
  170.         case closeItem:
  171.             /*
  172.              * If the front window belongs to a Desk Acc, close it!
  173.              */
  174.             if ((wp = (WindowPeek) FrontWindow()) == nil)
  175.                 break;
  176.  
  177.             if (wp->windowKind < 0) {
  178.                 CloseDeskAcc(wp->windowKind);
  179.                 DDaMenus();
  180.             }
  181.             break;
  182.  
  183.         case pgsetItem:
  184.             if (!PrSetup())
  185.                 (void) PrStlDialog(prRecHdl);
  186.             break;
  187.  
  188.         case quitItem:
  189.             doneFlag = true;
  190.             break;
  191.         }
  192.         break;
  193.  
  194.     case editID:
  195.         /*
  196.          * Send to a Desk Acc.
  197.          */
  198.         (void) SystemEdit(theItem - 1);
  199.         break;
  200.  
  201.     case optionID:
  202.         switch (theItem) {
  203.         case convertItem:
  204.             cvtNl ^= true;
  205.             CheckItem(menus[optionMenu], convertItem, cvtNl);
  206.             break;
  207.  
  208.         case oldArchItem:
  209.             oldArch ^= true;
  210.             CheckItem(menus[optionMenu], oldArchItem, oldArch);
  211.             break;
  212.  
  213.         case blockItem:
  214.             DoBlockSize();
  215.             break;
  216.  
  217.         case pageItem:
  218.             autoPage ^= true;
  219.             CheckItem(menus[optionMenu], pageItem, autoPage);
  220.             break;
  221.  
  222.         case printItem:
  223.             doPrint ^= true;
  224.             CheckItem(menus[optionMenu], printItem, doPrint);
  225.             break;
  226.  
  227.         case typeItem:
  228.             DoCreatorType();
  229.             break;
  230.         }
  231.         break;
  232.     }
  233.  
  234.     HiliteMenu(0);
  235.     FlushEvents(everyEvent, 0);
  236. }
  237.  
  238. /*
  239.  * DDaMenus - disable Desk Acc specific menu and menu item
  240.  */
  241. DDaMenus() {
  242.     DisableItem(menus[editMenu], 0);
  243.     DisableItem(menus[fileMenu], closeItem);
  244.     DrawMenuBar();
  245.     menusOK = true;
  246. }
  247.  
  248. /*
  249.  * EDaMenus - enable Desk Acc specific menu and menu item
  250.  */
  251. EDaMenus() {
  252.     EnableItem(menus[editMenu], 0);
  253.     EnableItem(menus[fileMenu], closeItem);
  254.     DrawMenuBar();
  255.     menusOK = false;
  256. }
  257.