Paul DuBois
unread,Dec 4, 1986, 4:35:10 PM12/4/86You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
#!/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