home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / lang / lsc_tran / TinyEdit.c < prev    next >
Text File  |  1989-02-18  |  4KB  |  240 lines

  1. /*
  2.     TinyEdit - Minimal TransEdit Demonstration.
  3.  
  4.     The project should include TinyEdit.c (this file), TransEdit.c (or
  5.     a project made from TransEdit.c), FakeAlert.c, TransSkel.c (or a
  6.     project made from TransSkel.c) and MacTraps.
  7.  
  8.     08 Nov 86 Paul DuBois
  9.     02 Feb 89 Modified to work with TransSkel 2.0 and TransEdit 2.0.
  10.               2-byte and 4-byte integer types are typedef'ed to
  11.               Integer and Longint to ease porting.
  12. */
  13.  
  14. # include    <MenuMgr.h>
  15. # include    <FontMgr.h>
  16. # include    "TransEdit.h"
  17.  
  18.  
  19. typedef    int        Integer;    /* compiler 2-byte integer type */
  20. typedef    long    Longint;    /* compiler 4-byte integer type */
  21.  
  22.  
  23. # define    aboutAlrt    1000    /* "About..." alert number */
  24.  
  25.  
  26. typedef enum        /* File menu item numbers */
  27. {
  28.     new = 1,        /* begin new window */
  29.     open,            /* open existing file */
  30.     close,            /* close window */
  31.     /* --- */
  32.     quit = 5
  33. };
  34.  
  35.  
  36. typedef enum            /* Edit menu item numbers */
  37. {
  38.     undo = 1,
  39.     /* --- */
  40.     cut = 3,
  41.     copy,
  42.     paste,
  43.     clear
  44. };
  45.  
  46.  
  47. WindowPtr    lastFront = nil;    /* keeps track of front window */
  48. WindowPtr    editWind = nil;        /* non-nil if edit window open */
  49. MenuHandle    fileMenu;
  50. MenuHandle    editMenu;
  51.  
  52.  
  53.  
  54. /*
  55.     Set File/Edit menu items according to type of front window.
  56.  
  57.     The general behavior is:
  58.  
  59.     New and Open enabled if an edit window is not open, otherwise they
  60.     are disabled.
  61.  
  62.     Close enabled when an edit or DA window is in front (i.e.,
  63.     when there's a window at all).
  64.  
  65.     Undo disabled when the edit window is in front.
  66. */
  67.  
  68. SetMenus ()
  69. {
  70.     DisableItem (fileMenu, close);    /* assume no window at all */
  71.     EnableItem (editMenu, undo);
  72.  
  73.     if (FrontWindow () != nil)
  74.     {
  75.         EnableItem (fileMenu, close);
  76.         if (IsEWindow (FrontWindow ()))    /* the edit window's in front */
  77.             DisableItem (editMenu, undo);
  78.     }
  79.  
  80.     if (editWind == nil)
  81.     {
  82.         EnableItem (fileMenu, new);
  83.         EnableItem (fileMenu, open);
  84.     }
  85.     else
  86.     {
  87.         DisableItem (fileMenu, new);
  88.         DisableItem (fileMenu, open);
  89.     }
  90. }
  91.  
  92.  
  93. /*
  94.     Got an activate or deactivate.  It doesn't matter which, really.
  95.     Set the text menus appropriately for the front window, and draw
  96.     the menu bar, as these menus might change state from enabled to
  97.     disabled or vice-versa.
  98. */
  99.  
  100. Activate (active)
  101. Boolean    active;
  102. {
  103.     SetMenus ();
  104. }
  105.  
  106.  
  107. /*
  108.     Close selected from File menu, or close box of edit window was
  109.     clicked.
  110. */
  111.  
  112. Close ()
  113. {
  114.     if (EWindowClose (editWind))
  115.         editWind = nil;
  116.     SetMenus ();
  117. }
  118.  
  119.  
  120. /*
  121.     Make a new edit window.  Set the title to "Untitled" if not bound
  122.     to file, so that the window titling works the same whether
  123.     TransEdit is compiled in single or multiple window mode.
  124. */
  125.  
  126. MakeWind (bindToFile)
  127. Boolean    bindToFile;
  128. {
  129. Rect        r;
  130.  
  131.     SetRect (&r, 4, 45, 504, 335);
  132.     editWind = NewEWindow (&r, nil, false, -1L, true, 0L, bindToFile);
  133.     if (editWind != nil)
  134.     {
  135.         if (!bindToFile)
  136.             SetWTitle (editWind, "\pUntitled");
  137.         ShowWindow (editWind);
  138.     }
  139. }
  140.  
  141.  
  142. /*
  143.     File menu handler
  144. */
  145.  
  146. DoFileMenu (item)
  147. Integer    item;
  148. {
  149. WindowPtr    theWind;
  150.  
  151.     theWind = FrontWindow ();
  152.     switch (item)
  153.     {
  154.  
  155.     case new:
  156.         MakeWind (false);
  157.         break;
  158.  
  159.     case open:
  160.         MakeWind (true);
  161.         break;
  162.  
  163.     case close:
  164.         if (IsEWindow (theWind))
  165.             Close ();
  166.         else    /* DA in front */
  167.             CloseDeskAcc (((WindowPeek) theWind)->windowKind);
  168.         break;
  169.  
  170.     case quit:
  171.         if (ClobberEWindows () == true)
  172.             SkelWhoa ();
  173.         break;
  174.  
  175.     }
  176.     SetMenus ();
  177. }
  178.  
  179.  
  180. /*
  181.     Handle selection of About╔ item from Apple menu
  182. */
  183.  
  184. DoAbout ()
  185. {
  186.     (void) Alert (aboutAlrt, nil);
  187. }
  188.  
  189.  
  190. /*
  191.     Background procedure.  Check front window, reset menus if it
  192.     changes.
  193. */
  194.  
  195. CheckFront ()
  196. {
  197.     if (FrontWindow () != lastFront)
  198.     {
  199.         SetMenus ();
  200.         lastFront = FrontWindow ();
  201.     }
  202. }
  203.  
  204.  
  205. main ()
  206. {
  207.  
  208. /*
  209.     Initialize TransSkel, create menus and install handlers.
  210. */
  211.  
  212.     SkelInit (6, nil);
  213.  
  214.     SkelApple ("\pAbout TinyEdit╔", DoAbout);
  215.  
  216.     fileMenu = NewMenu (1000, "\pFile");
  217.     AppendMenu (fileMenu, "\pNew/N;Open.../O;(Close;(-;Quit/Q");
  218.     (void) SkelMenu (fileMenu, DoFileMenu, nil, false);
  219.  
  220.     editMenu = NewMenu (1001, "\pEdit");
  221.     AppendMenu (editMenu, "\pUndo/Z;(-;Cut/X;Copy/C;Paste/V;Clear");
  222.     (void) SkelMenu (editMenu, EWindowEditOp, nil, true);
  223.  
  224. /*
  225.     Do TransEdit-specific setup:  set creator for any files created,
  226.     set default event notification procedures for new windows.
  227. */
  228.  
  229.     SetEWindowProcs (nil, nil, Activate, Close);
  230.  
  231. /*
  232.     Process events until user quits,
  233.     then clean up and exit
  234. */
  235.  
  236.     SkelBackground (CheckFront);
  237.     SkelMain ();
  238.     SkelClobber ();
  239. }
  240.