macintosh@felix.UUCP (11/27/86)
#!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # TEDemos/TinyEdit.c # TEDemos/DumbEdit.c # # MODERATOR'S NOTE: Tab-width is 4 # sed 's/^X//' << 'SHAR_EOF' > TEDemos/TinyEdit.c X/* X TinyEdit - Minimal TransEdit Demonstration. X X The project should include TinyEdit.c (this file), TransEdit.c, X FakeAlert.c, TransSkel.c (or a project made from TransSkel.c) X and MacTraps. X X 8 November 1986 Paul DuBois X*/ X X# include <MenuMgr.h> X# include <FontMgr.h> X# include "TransEdit.h" X X X# define aboutAlrt 1000 /* "About..." alert number */ X X Xtypedef enum /* File menu item numbers */ X{ X new = 1, /* begin new window */ X open, /* open existing file */ X close, /* close window */ X /* --- */ X quit = 5 X}; X X Xtypedef enum /* Edit menu item numbers */ X{ X undo = 1, X /* --- */ X cut = 3, X copy, X paste, X clear X}; X X XWindowPtr lastFront = nil; /* keeps track of front window */ XWindowPtr editWind = nil; /* non-nil if edit window open */ XMenuHandle fileMenu; XMenuHandle editMenu; X X X X/* X Set File/Edit menu items according to type of front window. X X The general behavior is: X X New and Open enabled if an edit window is not open, otherwise they X are disabled. X X Close enabled when an edit or DA window is in front (i.e., X when there's a window at all). X X Undo disabled when the edit window is in front. X*/ X XSetMenus () X{ X DisableItem (fileMenu, close); /* assume no window at all */ X EnableItem (editMenu, undo); X X if (FrontWindow () != nil) X { X EnableItem (fileMenu, close); X if (IsEWindow (FrontWindow ())) /* the edit window's in front */ X DisableItem (editMenu, undo); X } X X if (editWind == nil) X { X EnableItem (fileMenu, new); X EnableItem (fileMenu, open); X } X else X { X DisableItem (fileMenu, new); X DisableItem (fileMenu, open); X } X} X X X/* X Got an activate or deactivate. It doesn't matter which, really. X Set the text menus appropriately for the front window, and draw X the menu bar, as these menus might change state from enabled to X disabled or vice-versa. X*/ X XActivate (active) XBoolean active; X{ X SetMenus (); X} X X X/* X Close selected from File menu, or close box of edit window was X clicked. X*/ X XClose () X{ X if (EWindowClose (editWind)) X editWind = nil; X SetMenus (); X} X X X/* X Make a new edit window. Set the title to "Untitled" if not bound X to file, so that the window titling works the same whether X TransEdit is compiled in single or multiple window mode. X*/ X XMakeWind (bindToFile) XBoolean bindToFile; X{ XRect r; X X SetRect (&r, 4, 45, 504, 335); X editWind = NewEWindow (&r, nil, false, -1L, true, 0L, bindToFile); X if (editWind != nil) X { X if (!bindToFile) X SetWTitle (editWind, "\pUntitled"); X ShowWindow (editWind); X } X} X X X/* X File menu handler X*/ X XDoFileMenu (item) Xint item; X{ XWindowPtr theWind; X X theWind = FrontWindow (); X switch (item) X { X X case new: X MakeWind (false); X break; X X case open: X MakeWind (true); X break; X X case close: X if (IsEWindow (theWind)) X Close (); X else /* DA in front */ X CloseDeskAcc (((WindowPeek) theWind)->windowKind); X break; X X case quit: X if (ClobberEWindows () == true) X SkelWhoa (); X break; X X } X SetMenus (); X} X X X/* X Handle selection of AboutI item from Apple menu X*/ X XDoAbout () X{ X (void) Alert (aboutAlrt, nil); X} X X X/* X Background procedure. Check front window, reset menus if it X changes. X*/ X XCheckFront () X{ X if (FrontWindow () != lastFront) X { X SetMenus (); X lastFront = FrontWindow (); X } X} X X Xmain () X{ X X/* X Initialize TransSkel, create menus and install handlers. X*/ X X SkelInit (); X X SkelApple ("\pAbout TinyEditI", DoAbout); X X fileMenu = NewMenu (1000, "\pFile"); X AppendMenu (fileMenu, "\pNew/N;Open.../O;(Close/K;(-;Quit/Q"); X SkelMenu (fileMenu, DoFileMenu, nil); X X editMenu = NewMenu (1001, "\pEdit"); X AppendMenu (editMenu, "\pUndo/Z;(-;Cut/X;Copy/C;Paste/V;Clear"); X SkelMenu (editMenu, EWindowEditOp, nil); X X/* X Do TransEdit-specific setup: set creator for any files created, X set default event notification procedures for new windows. X*/ X X SetEWindowProcs (nil, nil, Activate, Close); X X/* X Process events until user quits, X then clean up and exit X*/ X X SkelBackground (CheckFront); X SkelMain (); X SkelClobber (); X} SHAR_EOF sed 's/^X//' << 'SHAR_EOF' > TEDemos/DumbEdit.c X/* X DumbEdit - Multiple-window TransEdit Demonstration. X X The project should include DumbEdit.c (this file), TransEdit.c, X FakeAlert.c, TransSkel.c (or a project made from TransSkel.c) X and MacTraps. X X 28 October 1986 Paul DuBois X*/ X X# include <MenuMgr.h> X# include <FontMgr.h> X# include "TransEdit.h" X X X# define maxSize 8 /* no. font sizes made available */ X# define hSize 300 /* horiz, vert size of new windows */ X# define vSize 205 X# define aboutAlrt 1000 X X Xtypedef enum /* File menu item numbers */ X{ X new = 1, /* begin new window */ X open, /* open existing file */ X close, /* close file */ X /* --- */ X save = 5, /* save file */ X saveAs, /* save under another name */ X saveCopy, /* save a copy w/o switching file binding */ X revert, /* revert to version on disk */ X /* --- */ X quit = 10 X}; X X Xtypedef enum /* Edit menu item numbers */ X{ X undo = 1, X /* --- */ X cut = 3, X copy, X paste, X clear X}; X X X Xtypedef enum /* Format menu item numbers */ X{ X wordWrap = 1, X noWrap, X /* --- */ X leftJust = 4, X centerJust, X rightJust X}; X X XWindowPtr lastFront = nil; /* keeps track of front window */ XMenuHandle fileMenu; XMenuHandle editMenu; XMenuHandle fontMenu; XMenuHandle sizeMenu; XMenuHandle formatMenu; X Xint sizes[maxSize] = { 9, 10, 12, 14, 18, 20, 24, 48 }; X X X/* X Uncheck all the items in a menu X*/ X XUncheckMenu (theMenu) XMenuHandle theMenu; X{ Xregister int i, nItems; X X nItems = CountMItems (theMenu); X X for (i = 1; i <= nItems; ++i) X { X CheckItem (theMenu, i, false); X SetItemStyle (theMenu, i, 0); X } X} X X X/* X Set the Font, Size and Format menus so that the items corresponding X to the text characteristics of the window are checked. If the X window isn't an edit window, dim all three menus. X*/ X XSetTextMenus (drawBar) XBoolean drawBar; X{ XWindowPtr theWind; XStr255 wFontName; XStr255 mFontName; Xregister int i, nItems; Xregister TEHandle te; X X theWind = FrontWindow (); X UncheckMenu (fontMenu); /* toss current check marks */ X UncheckMenu (sizeMenu); X UncheckMenu (formatMenu); X X if (!IsEWindow (theWind)) /* disable the menus */ X { X DisableItem (fontMenu, 0); X DisableItem (sizeMenu, 0); X DisableItem (formatMenu, 0); X } X else X { X EnableItem (fontMenu, 0); X EnableItem (sizeMenu, 0); X EnableItem (formatMenu, 0); X X te = GetEWindowTE (theWind); X X/* X Check appropriate word wrap item X*/ X X CheckItem (formatMenu, (**te).crOnly < 0 ? noWrap : wordWrap, true); X X/* X Check appropriate justification item X*/ X X switch ((**te).just) X { X X case teJustLeft: X CheckItem (formatMenu, leftJust, true); X break; X X case teJustRight: X CheckItem (formatMenu, rightJust, true); X break; X X case teJustCenter: X CheckItem (formatMenu, centerJust, true); X break; X X } X X/* X Check appropriate font size item, and outline items for sizes X present in resource files X*/ X X for (i = 0; i < maxSize; ++i) X { X if ((**te).txSize == sizes[i]) X CheckItem (sizeMenu, i + 1, true); X X if (RealFont ((**te).txFont, sizes[i])) X SetItemStyle (sizeMenu, i + 1, outline); X else X SetItemStyle (sizeMenu, i + 1, 0); /* plain */ X } X X/* X Check appropriate font name item X*/ X X GetFontName ((**te).txFont, wFontName); /* name of window font */ X nItems = CountMItems (fontMenu); /* # fonts in menu */ X for (i = 1; i <= nItems; ++i) X { X GetItem (fontMenu, i, mFontName); /* get font name */ X if (EqualString (wFontName, mFontName, false, true)) X { X CheckItem (fontMenu, i, true); X break; X } X } X X } X X if (drawBar) X DrawMenuBar (); X} X X X X/* X Set File/Edit menu items according to type of front window. X X The general behavior is: X X New and Open always enabled, since a new edit window can always be X opened. X X Close enabled when an edit or DA window in front (i.e., when there's X a window at all). X X Save enabled for edit windows not bound to a file, and edit windows X bound to a file when they're dirty (typed into, Edit menu used to X do something to them). X X Save As and Save a Copy As enabled for edit windows. X X Revert enabled for edit windows bound to a file when they're dirty. X X Undo disabled when there's an edit window in front. X*/ X XSetNonTextMenus () X{ XWindowPtr theWind; Xint theKind; X X DisableItem (fileMenu, close); /* assume no window at all */ X DisableItem (fileMenu, save); X DisableItem (fileMenu, saveAs); X DisableItem (fileMenu, saveCopy); X DisableItem (fileMenu, revert); X EnableItem (editMenu, undo); X X theKind = 0; X if ((theWind = FrontWindow ()) != nil) X theKind = ((WindowPeek) theWind)->windowKind; X X if (theKind < 0) /* DA in front */ X { X EnableItem (fileMenu, close); X } X else if (IsEWindow (theWind)) /* edit window in front */ X { X EnableItem (fileMenu, close); X EnableItem (fileMenu, saveAs); X EnableItem (fileMenu, saveCopy); X if (GetEWindowFile (theWind, nil) == false) /* not bound to file */ X { X EnableItem (fileMenu, save); X } X else if (IsEWindowDirty (theWind)) /* bound - is it dirty? */ X { X EnableItem (fileMenu, save); X EnableItem (fileMenu, revert); X } X DisableItem (editMenu, undo); X } X} X X X/* X Got an activate or deactivate. It doesn't matter which, really. X Set the text menus appropriately for the front window, and draw X the menu bar, as these menus might change state from enabled to X disabled or vice-versa. X*/ X XActivate (active) XBoolean active; X{ X CheckFront (); X} X X X/* X Got a keyclick in an edit window. X*/ X XKey () X{ X SetNonTextMenus (); X} X X X/* X Close selected from File menu, or close box of edit window X clicked. X*/ X XClose () X{ XWindowPtr theWind; X X GetPort (&theWind); X (void) EWindowClose (theWind); X CheckFront (); X} X X XMakeWind (bindToFile) XBoolean bindToFile; X{ XRect r; Xstatic int windCount = 0; Xint offset; X X if (FrontWindow () == nil) X windCount = 0; X SetRect (&r, 0, 0, hSize, vSize); X offset = 50 + 25 * (windCount++ % 4); X OffsetRect (&r, offset, offset); X (void) NewEWindow (&r, nil, true, -1L, true, 0L, bindToFile); X} X X X/* X File menu handler X*/ X XDoFileMenu (item) Xint item; X{ XWindowPtr theWind; X X theWind = FrontWindow (); X switch (item) X { X X case new: X MakeWind (false); X break; X X case open: X MakeWind (true); X break; X X case close: X if (IsEWindow (theWind)) X (void) EWindowClose (theWind); X else X CloseDeskAcc (((WindowPeek) theWind)->windowKind); /* DA in front */ X break; X X case save: X (void) EWindowSave (theWind); X break; X X case saveAs: X (void) EWindowSaveAs (theWind); X break; X X case saveCopy: X (void) EWindowSaveCopy (theWind); X break; X X case revert: X (void) EWindowRevert (theWind); X break; X X case quit: X if (ClobberEWindows () == true) X SkelWhoa (); X break; X X } X SetNonTextMenus (); X} X X X/* X Handle Font menu items X*/ X XDoFontMenu (item) Xint item; X{ Xint font; XTEHandle te; XWindowPtr theWind; XStr255 theFontName; X X theWind = FrontWindow (); X if ((te = GetEWindowTE (theWind)) == nil) X return; /* not an edit window */ X GetItem (fontMenu, item, theFontName); X GetFNum (theFontName, &font); X SetEWindowStyle (theWind, font, (**te).txSize, (**te).crOnly, (**te).just); X SetTextMenus (false); X X} X X X/* X Handle Size menu items X*/ X XDoSizeMenu (item) Xint item; X{ XTEHandle te; XWindowPtr theWind; X X theWind = FrontWindow (); X if ((te = GetEWindowTE (theWind)) == nil) X return; /* not an edit window */ X SetEWindowStyle (theWind, (**te).txFont, sizes[item-1], (**te).crOnly, (**te).just); X SetTextMenus (false); X} X X X/* X Handle Format menu items X*/ X XDoFormatMenu (item) Xint item; X{ Xint font, size, just, wrap; XTEHandle te; XWindowPtr theWind; X X theWind = FrontWindow (); X if ((te = GetEWindowTE (theWind)) == nil) X return; /* not an edit window */ X font = (**te).txFont; X size = (**te).txSize; X just = (**te).just; X wrap = (**te).crOnly; X X switch (item) X { X X case wordWrap: X wrap = 0; X break; X X case noWrap: X wrap = -1; X break; X X case leftJust: X just = teJustLeft; X break; X X case centerJust: X just = teJustCenter; X break; X X case rightJust: X just = teJustRight; X break; X } X SetEWindowStyle (theWind, font, size, wrap, just); X SetTextMenus (false); X} X X X/* X Handle selection of AboutI item from Apple menu X*/ X XDoAbout () X{ X (void) Alert (aboutAlrt, nil); X} X X X/* X Background procedure. Check front window, reset menus if it X changes. The menu bar doesn't need redrawing by SetTextMenus X if the previous and current front window are either both edit X windows or both not edit windows. This check eliminates some X needless menu flashing. X*/ X XCheckFront () X{ X if (FrontWindow () != lastFront) X { X SetNonTextMenus (); X if (IsEWindow (FrontWindow ()) == IsEWindow (lastFront)) X SetTextMenus (false); X else X SetTextMenus (true); X lastFront = FrontWindow (); X } X} X X Xmain () X{ X X/* X Initialize TransSkel, create menus and install handlers. X*/ X X SkelInit (); X X SkelApple ("\pAbout DumbEditI", DoAbout); X X fileMenu = NewMenu (1000, "\pFile"); X AppendMenu (fileMenu, "\pNew/N;Open.../O;Close/K;(-;Save/S;Save As..."); X AppendMenu (fileMenu, "\pSave a Copy As...;Revert/R;(-;Quit/Q"); X SkelMenu (fileMenu, DoFileMenu, nil); X X editMenu = NewMenu (1001, "\pEdit"); X AppendMenu (editMenu, "\pUndo/Z;(-;Cut/X;Copy/C;Paste/V;Clear"); X SkelMenu (editMenu, EWindowEditOp, nil); X X fontMenu = NewMenu (1002, "\pFont"); X DisableItem (fontMenu, 0); X AddResMenu (fontMenu, 'FONT'); X SkelMenu (fontMenu, DoFontMenu, nil); X X sizeMenu = NewMenu (1003, "\pSize"); X DisableItem (sizeMenu, 0); X AppendMenu (sizeMenu, "\p9 Point;10 Point;12 Point;14 Point"); X AppendMenu (sizeMenu, "\p18 Point;20 Point;24 Point; 48 Point"); X SkelMenu (sizeMenu, DoSizeMenu, nil); X X formatMenu = NewMenu (1004, "\pFormat"); X DisableItem (formatMenu, 0); X AppendMenu (formatMenu, "\pWord Wrap;No Word Wrap;(-;Left;Center;Right"); X SkelMenu (formatMenu, DoFormatMenu, nil); X X SetNonTextMenus (); X SetTextMenus (true); X X/* X Do TransEdit-specific setup: set creator for any files created, X set default text style and event notification procedures for X new windows. X*/ X X SetEWindowCreator ('DUMB'); X SetEWindowStyle (nil, monaco, 9, 0, teJustLeft); X SetEWindowProcs (nil, Key, Activate, Close); X X/* X Process events until user quits, X then clean up and exit X*/ X X SkelBackground (CheckFront); X SkelMain (); X SkelClobber (); X} SHAR_EOF exit