home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Entertainment / Concentration / Menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-25  |  3.7 KB  |  218 lines  |  [TEXT/KAHL]

  1. /*
  2.     Menu.c - Concentration menu handlers.
  3. */
  4.  
  5. # include    "TransSkel.h"
  6. # include    "TransDisplay.h"
  7. # if ENABLE_DEBUG
  8. # include    "Debug.h"
  9. # endif
  10.  
  11. # include    "Concentration.h"
  12.  
  13.  
  14. typedef enum            /* File menu items */
  15. {
  16.     closeWind = 1,
  17.     /* --- */
  18.     quitApp = 3
  19. };
  20.  
  21. typedef enum            /* Edit menu items */
  22. {
  23.     undo = 1,
  24.     /* --- */
  25.     cut = 3,
  26.     copy,
  27.     paste,
  28.     clear
  29. };
  30.  
  31.  
  32. typedef enum            /* Game menu items */
  33. {
  34.     newGame = 1,
  35.     showAnswer,
  36.     /* --- */
  37.     useLargePieces = 4,
  38.     useSmallPieces,
  39.     /* --- */
  40.     boardSize = 7,
  41.     players,
  42.     /* --- */
  43.     help = 10,
  44.     /* --- */
  45.     showDebug = 12
  46. };
  47.  
  48.  
  49. static MenuHandle    fileMenu;
  50. static MenuHandle    editMenu;
  51. static MenuHandle    gameMenu;
  52.  
  53.  
  54. static pascal void
  55. DoAppleMenu (short item)
  56. {
  57.     (void) SkelAlert (aboutAlrtNum, SkelDlogFilter (nil, true),
  58.                                             skelPositionOnParentDevice);
  59.     SkelRmveDlogFilter ();
  60. }
  61.  
  62.  
  63. static pascal void
  64. DoFileMenu (short item)
  65. {
  66.     switch (item)
  67.     {
  68.     case closeWind:
  69.         SkelClose (FrontWindow ());
  70.         break;
  71.     case quitApp:
  72.         SkelStopEventLoop ();    /* tell SkelEventLoop() to quit */
  73.         break;
  74.     }
  75. }
  76.  
  77.  
  78. static pascal void
  79. DoEditMenu (short item)
  80. {
  81.     (void) SystemEdit (item - 1);    /* route to DA if appropriate */
  82. }
  83.  
  84.  
  85. static pascal void
  86. DoGameMenu (short item)
  87. {
  88.     switch (item)
  89.     {
  90.  
  91.     case newGame:
  92.         NewGameRound ();
  93.         break;
  94.  
  95.     case showAnswer:
  96.         ShowAnswer ();
  97.         break;
  98.  
  99.     case useLargePieces:
  100.         if (gb->sizeType != largePiece)
  101.         {
  102.             InitBoard (largePiece);
  103.             NewGameRound ();
  104.         }
  105.         break;
  106.  
  107.     case useSmallPieces:
  108.         if (gb->sizeType != smallPiece)
  109.         {
  110.             InitBoard (smallPiece);
  111.             NewGameRound ();
  112.         }
  113.         break;
  114.  
  115.     case boardSize:
  116.         BoardDialog ();
  117.         break;
  118.  
  119.     case players:
  120.         PlayerDialog ();
  121.         break;
  122.  
  123.     case help:
  124.         HelpWindow ();
  125.         break;
  126.  
  127. # if ENABLE_DEBUG
  128.     case showDebug:
  129.         ShowDebugWindow ();
  130.         break;
  131. # endif
  132.     }
  133. }
  134.  
  135.  
  136.  
  137. /*
  138.  * Enable or disable a menu item.
  139.  */
  140.  
  141. static void
  142. SetMenuItemState (MenuHandle m, short item, Boolean enable)
  143. {
  144.     if (enable)
  145.         EnableItem (m, item);
  146.     else
  147.         DisableItem (m, item);
  148. }
  149.  
  150.  
  151. /*
  152.  * Adjust menus to match game state.  There is always some window
  153.  * (the game window at least), so there's no need to check whether
  154.  * or not the front window is nil.
  155.  *
  156.  * File/Quit and Game/Help are always enabled.
  157.  */
  158.  
  159. static pascal void
  160. AdjustMenus (void)
  161. {
  162. WindowPtr    w;
  163. Boolean        daWind;
  164. Boolean        enable;
  165.  
  166.     w = FrontWindow ();
  167.     daWind = (((WindowPeek) w)->windowKind < 0);
  168.  
  169.     SetMenuItemState (fileMenu, closeWind, IsDWindow (w) || daWind);
  170.  
  171.     SetMenuItemState (editMenu, undo, daWind);
  172.     SetMenuItemState (editMenu, cut, daWind);
  173.     SetMenuItemState (editMenu, copy, daWind);
  174.     SetMenuItemState (editMenu, paste, daWind);
  175.     SetMenuItemState (editMenu, clear, daWind);
  176.  
  177.     enable = (w == gameWind);
  178.     SetMenuItemState (gameMenu, newGame, enable);
  179.     SetMenuItemState (gameMenu, showAnswer, enable);
  180.     SetMenuItemState (gameMenu, useLargePieces, enable);
  181.     SetMenuItemState (gameMenu, useSmallPieces, enable);
  182.     SetMenuItemState (gameMenu, boardSize, enable);
  183.     SetMenuItemState (gameMenu, players, enable);
  184.     SetItemMark (gameMenu, useLargePieces,
  185.                     gb->sizeType == largePiece ? checkMark : noMark);
  186.     SetItemMark (gameMenu, useSmallPieces,
  187.                     gb->sizeType == smallPiece ? checkMark : noMark);
  188. }
  189.  
  190.  
  191. /*
  192.  * Set up menus:  Tell TransSkel to make a default Apple menu handler,
  193.  * create handlers for the File, Edit and Game menus.
  194.  */
  195.  
  196. void
  197. SetupMenus (void)
  198. {
  199.  
  200.     SkelApple ("\pAbout Concentration\311", DoAppleMenu);
  201.  
  202.     fileMenu = GetMenu (fileMenuNum);
  203.     SkelMenu (fileMenu, DoFileMenu, nil, false, false);
  204.  
  205.     editMenu = GetMenu (editMenuNum);
  206.     SkelMenu (editMenu, DoEditMenu, nil, false, false);
  207.  
  208.     gameMenu = GetMenu (gameMenuNum);
  209. # if ENABLE_DEBUG
  210.     AppendMenu (gameMenu, "\p(-;Show Debug Window");
  211. # endif
  212.     SkelMenu (gameMenu, DoGameMenu, nil, false, false);
  213.  
  214.     DrawMenuBar ();
  215.  
  216.     SkelSetMenuHook (AdjustMenus);
  217. }
  218.