home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-17 | 24.9 KB | 1,071 lines | [TEXT/KAHL] |
- #include "interface.h"
- #include "window.h"
- #include "menus.h"
- #include "main.h"
-
- #include <limits.h>
-
- extern short nCurrentFont; // from menus.cp
- extern short nDefaultFont; // from menus.cp
- extern short nCurrentSize; // from menus.cp
- extern short nDefaultSize; // from menus.cp
- extern short nCurrentVoice; // from menus.cp
- extern short nDefaultVoice; // from menus.cp
- extern short cVoices; // from menus.cp
- extern short *pVoices; // from menus.cp
-
- // will become part of the application object
- int fContinue = 1;
- RgnHandle hrgnMouse = NULL;
- short fForeground;
- SpeechChannel chan = NULL;
- Ptr pSpoken = NULL;
- DialogPtr pdlgAbout = NULL;
- DialogPtr pdlgGoto = NULL;
- short fScrapChanged;
-
- short selUndoAction;
- short selUndo;
- WindowPtr pwinUndo; // active window
- short mnFontUndo, mnFontRedo; // menu item numbers
- short mnSizeUndo, mnSizeRedo;
- short mnVoiceUndo, mnVoiceRedo;
- int nQuoteUndo, nQuoteRedo; // quote numbers for the document pwinUndo
-
- void LocalToGlobalRect(Rect *pr) {
- Point pt;
- pt.v = pr->top;
- pt.h = pr->left;
- LocalToGlobal(&pt);
- pr->top = pt.v;
- pr->left = pt.h;
- pt.v = pr->bottom;
- pt.h = pr->right;
- LocalToGlobal(&pt);
- pr->bottom = pt.v;
- pr->right = pt.h;
- } // LocalToGlobalRect
-
- void SetMouseRegion(void) {
- SetPort(pdlgGoto);
- if (hrgnMouse) {
- DisposeRgn(hrgnMouse);
- hrgnMouse = NULL;
- }
- short item;
- Rect r;
- Handle hText;
- GetDialogItem(pdlgGoto, 3, &item, &hText, &r);
- Point ptMouse;
- GetMouse(&ptMouse);
- short fInText = PtInRect(ptMouse, &r);
- RgnHandle hrgnText = NewRgn();
- LocalToGlobalRect(&r);
- SetRectRgn(hrgnText, r.left, r.top, r.right, r.bottom);
- if (fInText) {
- hrgnMouse = hrgnText;
- CursHandle hcursor = GetCursor(iBeamCursor);
- if (hcursor) {
- HLock((Handle)hcursor);
- SetCursor(*hcursor);
- HUnlock((Handle)hcursor);
- }
- } else {
- RgnHandle hrgnScreens = NewRgn();
- SetRectRgn(hrgnScreens, -32768, -32768, 32766, 32766);
- hrgnMouse = NewRgn();
- DiffRgn(hrgnScreens, hrgnText, hrgnMouse);
- DisposeRgn(hrgnScreens);
- DisposeRgn(hrgnText);
- InitCursor();
- }
- } // SetMouseRegion
-
- void Resume(void) {
- ExitToShell();
- } // Resume
-
- void EnableUndo(void) {
- MenuHandle hmenuEdit = GetMenuHandle(MENU_EDIT);
- if (!((**hmenuEdit).enableFlags & 1)) {
- EnableItem(hmenuEdit, 0);
- DrawMenuBar();
- }
- } // EnableUndo
-
- void StopSpeaking(void) {
- if (chan) {
- (void) DisposeSpeechChannel(chan);
- chan = NULL;
- DisposePtr(pSpoken);
- pSpoken = NULL;
- }
- } // StopSpeaking
-
- void InitToolbox() {
- InitGraf((Ptr) &qd.thePort); // sets qd.randSeed to 1
- GetDateTime((unsigned long *)&qd.randSeed);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- long response;
- OSErr err = Gestalt(gestaltSystemVersion, &response);
- int fSystem7;
- if (err == noErr)
- fSystem7 = ( 0x0000FFFF & response ) > 0x0700;
- else
- fSystem7 = 0;
- if (fSystem7) // System 7 or later, see Inside Macintosh: Macintosh TB Essentials, page 6-104
- InitDialogs(NULL);
- else
- InitDialogs(Resume);
- FlushEvents(everyEvent,0);
- InitCursor();
- } // InitToolbox
-
- void SetOpenDialogPoint(Point *pPt) {
- Rect r = qd.screenBits.bounds;
- int left = (r.right - r.left - 344) / 2; // 344 is the width of the open dialog
- int top = (r.bottom - r.top - GetMBarHeight() - 166) / 4 + GetMBarHeight(); // 166 is the hight of the open dialog
- SetPt(pPt, left, top);
- } // SetOpenDialogPoint
-
- // the top left corner of the dialog is at 0,0
- void CenterDialog(DialogPtr pdlg) {
- Rect r = qd.screenBits.bounds;
- WindowPtr pwin = GetDialogWindow(pdlg);
- CGrafPtr pPort = GetWindowPort(pwin);
- Rect rdlg = pPort->portRect;
- int left = (r.right - rdlg.right) / 2;
- int top = (r.bottom - GetMBarHeight() - rdlg.bottom) / 4 + GetMBarHeight();
- MoveWindow(pdlg, left, top, 1);
- } // CenterDialog
-
- // the top left corner of the dialog is at 0,0
- void CenterWindow(WindowPtr pwin) {
- Rect r = qd.screenBits.bounds;
- CGrafPtr pPort = GetWindowPort(pwin);
- Rect rdlg = pPort->portRect;
- int left = (r.right - rdlg.right) / 2;
- int top = (r.bottom - GetMBarHeight() - rdlg.bottom) / 4 + GetMBarHeight();
- MoveWindow(pwin, left, top, 1);
- } // CenterWindow
-
- void StaggerWindow(WindowPtr pwin) {
- WindowPtr pwinFront = FrontWindow();
- Point pt;
- if (pwinFront) {
- CGrafPtr pPort = GetWindowPort(pwinFront);
- Rect r = pPort->portRect;
- pt.h = r.left;
- pt.v = r.top;
- SetPort(pwinFront);
- LocalToGlobal(&pt);
- pt.h += 16;
- pt.v += 16;
- Rect rScreen = qd.screenBits.bounds;
- if (pt.h+r.right > rScreen.right)
- pt.h -= pt.h+r.right - rScreen.right;
- if (pt.v+r.bottom > rScreen.bottom)
- pt.v -= pt.v+r.bottom - rScreen.bottom;
- } else {
- pt.h = 4;
- pt.v = 23 + GetMBarHeight();
- }
- MoveWindow (pwin, pt.h, pt.v, 1);
- } // StaggerWindow
-
- void ConvertWD(short wd, unsigned char *pch, FSSpec *pfs) {
- OSErr err;
- short vRefNum;
- long dirID;
- long user;
- err = GetWDInfo(wd, &vRefNum, &dirID, &user);
- if (err == noErr) {
- pfs->vRefNum = vRefNum;
- pfs->parID = dirID;
- for (int i = 0; i <= pch[0]; i++)
- pfs->name[i] = pch[i];
- (void) CloseWD(wd);
- }
- }; // ConvertWD
-
- OSErr SelectCookie(FSSpec *pfsCookie) {
- OSType Types[1] = {'TEXT'};
- long response;
- OSErr err = Gestalt(gestaltStandardFileAttr, &response);
- int fHasStandardFile;
- if (err == noErr)
- fHasStandardFile = response & (1<<gestaltStandardFile58);
- else {
- fHasStandardFile = 0;
- err = noErr;
- }
- fHasStandardFile = 0; // test if SFGetFile short circuits in System 7.5
- if (fHasStandardFile) {
- StandardFileReply reply;
- // does not support Finder short circuit of substituting an opened document
- // which then requires use of Apple events for opening documents
- StandardGetFile(NULL, 1, &Types[0], &reply);
- if (reply.sfGood)
- *pfsCookie = reply.sfFile;
- else
- err = userCanceledErr;
- } else {
- SFReply _reply;
- Point pt;
- SetOpenDialogPoint(&pt);
- SFGetFile(pt, "\p", NULL, 1, &Types[0], NULL, &_reply);
- if (_reply.good)
- ConvertWD(_reply.vRefNum, &_reply.fName[0], pfsCookie);
- else
- err = userCanceledErr;
- }
- return err;
- } // SelectCookie
-
- void Open(void) {
- FSSpec fsQuotes;
- OSErr err = SelectCookie(&fsQuotes);
- if (err == noErr)
- OpenFile(fsQuotes);
- } // Open
-
- void OpenFile(FSSpec fsQuotes) {
- CursHandle hcursor = GetCursor(watchCursor);
- if (hcursor) {
- HLock((Handle)hcursor);
- SetCursor(*hcursor);
- HUnlock((Handle)hcursor);
- }
- OSErr err;
- QuotesDocument *pqd = new QuotesDocument(fsQuotes, err); // construct quotes document
- if (err == noErr) {
- QuotesWindow *pqw = new QuotesWindow(pqd, err); // construct quotes window
- if (err == noErr) {
- WindowPtr pwin = pqw->window();
- SetWTitle(pwin, fsQuotes.name);
- StaggerWindow(pwin);
- ShowWindow(pwin);
- SetPort(pwin);
- nCurrentFont = nDefaultFont;
- pqw->font = FontNumber(nCurrentFont);
- TextFont(pqw->font);
- nCurrentSize = nDefaultSize;
- pqw->size = SizeNumber(nCurrentSize);
- TextSize(pqw->size);
- if (cVoices > 0)
- pqw->voice = pVoices[nDefaultVoice];
- else
- pqw->voice = 0;
- pqw->some();
- } else
- delete pqw;
- } else
- delete pqd;
- InitCursor();
- } // OpenFile
-
- // app parameters are not cleared are reset for subsequent opening of documents
- // may only be used once during application startup
- void OpenStartup(void) {
- short message;
- short count;
- CountAppFiles(&message, &count);
- AppFile theFile;
- short iFile;
- if (count) {
- FSSpec fs;
- if (message == appOpen)
- for (iFile=1; iFile<=count; iFile++) {
- GetAppFiles(iFile, &theFile);
- ConvertWD(theFile.vRefNum, &theFile.fName[0], &fs);
- OpenFile(fs);
- ClrAppFiles(iFile);
- }
- } else
- Open();
- AdjustMenus();
- } // OpenStartup
-
- int Setup(void) {
- fForeground = 1;
- MaxApplZone(); // needed to enable submenus in the Apple menu
- InitToolbox();
- nCurrentSize = 3; // 12 point
- nDefaultSize = 3; // 12 point
- selUndo = CANT_UNDO;
- SetupMenus();
- OpenStartup();
- return noErr;
- } // Setup
-
- void DisplayAbout(void) {
- if (pdlgAbout) {
- SelectWindow(pdlgAbout);
- ShowWindow(pdlgAbout);
- } else {
- pdlgAbout = GetNewDialog(DLOG_ABOUT, NULL, (WindowPtr)-1);
- if (pdlgAbout) {
- SetWRefCon(pdlgAbout, DLOG_ABOUT);
- CenterDialog(pdlgAbout);
- ShowWindow(pdlgAbout);
- }
- }
- } // DisplayAbout
-
- void DisplayGoto(void) {
- if (pdlgGoto == NULL) {
- pdlgGoto = GetNewDialog(DLOG_GOTO, NULL, (WindowPtr)-1);
- if (pdlgGoto) {
- SetWRefCon(pdlgGoto, DLOG_GOTO);
- CenterDialog(pdlgGoto);
- }
- }
- if (pdlgGoto) {
- WindowPtr pwin = FrontWindow();
- short windowKind;
- while (pwin) {
- windowKind = GetWindowKind(pwin);
- if (windowKind == userKind)
- break;
- pwin = GetNextWindow(pwin);
- }
- if (pwin) {
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- Str255 s;
- int cQuotes = pqw->count();
- NumToString(cQuotes, s);
- ParamText(s, "\p", "\p", "\p");
- int iQuotes = pqw->current() + 1; // index into quotes is zero-based
- NumToString(iQuotes, s);
- short item;
- Rect r;
- Handle hText;
- GetDialogItem(pdlgGoto, 3, &item, &hText, &r);
- SetDialogItemText(hText, s);
- SelectDialogItemText(pdlgGoto, 3, 0, s[0]);
- SelectWindow(pdlgGoto);
- ShowWindow(pdlgGoto);
- SetMouseRegion();
- TEFromScrap();
- fScrapChanged = 0;
- }
- }
- } // DisplayGoto
-
- void address_copy(void) {
- Handle hAddress = GetResource('STR ', ADDRESS);
- if (hAddress) {
- OSErr err = ZeroScrap();
- if (err == noErr) {
- unsigned long length = GetHandleSize(hAddress)-1;
- HLock(hAddress);
- err = PutScrap(length, 'TEXT', ((unsigned char *)*hAddress)+1);
- HUnlock(hAddress);
- }
- }
- } // address_copy
-
- void CmdUndo(void) {
- WindowPtr pwin = FrontWindow();
- short windowKind;
- QuotesWindow *pqw;
- if (pwin) {
- windowKind = GetWindowKind(pwin);
- pqw = (QuotesWindow *)GetWRefCon(pwin);
- }
- switch (selUndoAction) {
- case UNDO_QUOTE:
- if (pwin && windowKind == userKind)
- if (pwin == pwinUndo)
- if (selUndo == UNDO) {
- selUndo = REDO;
- nQuoteRedo = pqw->current();
- pqw->select(nQuoteUndo);
- } else {
- selUndo = UNDO;
- nQuoteUndo = pqw->current();
- pqw->select(nQuoteRedo);
- }
- break;
- case UNDO_FONT:
- if (pwin == pwinUndo)
- if (selUndo == UNDO) {
- selUndo = REDO;
- mnFontRedo = nCurrentFont;
- CmdFont(mnFontUndo);
- } else {
- selUndo = UNDO;
- mnFontUndo = nCurrentFont;
- CmdFont(mnFontRedo);
- }
- break;
- case UNDO_SIZE:
- if (pwin == pwinUndo)
- if (selUndo == UNDO) {
- selUndo = REDO;
- mnSizeRedo = nCurrentSize;
- CmdSize(mnSizeUndo);
- } else {
- selUndo = UNDO;
- mnSizeUndo = nCurrentSize;
- CmdSize(mnSizeRedo);
- }
- break;
- case UNDO_VOICE:
- if (pwin == pwinUndo)
- if (selUndo == UNDO) {
- selUndo = REDO;
- mnVoiceRedo = nCurrentVoice;
- CmdVoice(mnVoiceUndo);
- } else {
- selUndo = UNDO;
- mnVoiceUndo = nCurrentVoice;
- CmdVoice(mnVoiceRedo);
- }
- break;
- }
- } // CmdUndo
-
- void CmdVoice(short selItem) {
- MenuHandle hmenu = GetMenuHandle(MENU_VOICES);
- CheckItem(hmenu, nCurrentVoice, 0);
- nCurrentVoice = selItem;
- WindowPtr pwin = FrontWindow();
- if (pwin) {
- short windowKind = GetWindowKind(pwin);
- if (windowKind < 0)
- nDefaultVoice = selItem;
- else {
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- pqw->voice = pVoices[selItem];
- }
- } else
- nDefaultVoice = selItem;
- CheckItem(hmenu, nCurrentVoice, 1);
- } // CmdVoice
-
- void CmdFont(short selItem) {
- WindowPtr pwin = FrontWindow();
- short windowKind = GetWindowKind(pwin);
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- MenuHandle hmenu = GetMenuHandle(MENU_FONT);
- CheckItem(hmenu, nCurrentFont, 0);
- nCurrentFont = selItem;
- if (pwin) {
- if (windowKind == userKind) {
- pqw->invalidate();
- short nFont = FontNumber(nCurrentFont);
- SetPort(pwin);
- TextFont(nFont);
- }
- } else
- nDefaultFont = selItem;
- CheckItem(hmenu, nCurrentFont, 1);
- } // CmdFont
-
- void CmdSize(short selItem) {
- WindowPtr pwin = FrontWindow();
- short windowKind = GetWindowKind(pwin);
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- MenuHandle hmenu = GetMenuHandle(MENU_SIZE);
- CheckItem(hmenu, nCurrentSize, 0);
- nCurrentSize = selItem;
- if (pwin)
- if (windowKind < 0)
- nDefaultSize = selItem;
- else {
- pqw->invalidate();
- short nSize = SizeNumber(nCurrentSize);
- SetPort(pwin);
- TextSize(nSize);
- }
- else
- nDefaultSize = selItem;
- CheckItem(hmenu, nCurrentSize, 1);
- } // CmdSize
-
- void DoMenuCommand(long menuSelection) {
- short selMenu = HiWord(menuSelection);
- short selItem = LoWord(menuSelection);
- WindowPtr pwin = FrontWindow();
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- short windowKind = GetWindowKind(pwin);
- switch (selMenu) {
- case MENU_APPLE:
- if (selItem == APPLE_ABOUT)
- DisplayAbout();
- else {
- Str255 name;
- MenuHandle hmenuApple = GetMenuHandle(selMenu);
- GetMenuItemText(hmenuApple, selItem, name);
- (void) OpenDeskAcc(name);
- }
- break;
- case MENU_FILE:
- switch (selItem) {
- case FILE_OPEN:
- Open();
- break;
- case FILE_CLOSE:
- if (pwin)
- RemoveWindow(pwin);
- break;
- case FILE_QUIT:
- Terminate();
- break;
- }
- break;
- case MENU_EDIT:
- int fSystemEdit = SystemEdit(selItem-1);
- if (!fSystemEdit)
- switch (selItem) {
- case EDIT_UNDO:
- CmdUndo();
- break;
- case EDIT_CUT:
- DialogCut(pwin);
- fScrapChanged = 1;
- break;
- case EDIT_COPY:
- if (windowKind == userKind)
- pqw->copy();
- else if (windowKind == dialogKind) {
- long selDialog = GetWRefCon(pwin);
- switch (selDialog) {
- case DLOG_ABOUT:
- address_copy();
- break;
- case DLOG_GOTO:
- DialogCopy(pwin);
- fScrapChanged = 1;
- break;
- }
- }
- break;
- case EDIT_PASTE:
- DialogPaste(pwin);
- break;
- case EDIT_CLEAR:
- DialogDelete(pwin);
- break;
- case EDIT_SELECT_ALL:
- short item;
- Rect r;
- Handle hText;
- GetDialogItem(pwin, 3, &item, &hText, &r);
- Str255 s;
- GetDialogItemText(hText, s);
- SelectDialogItemText(pwin, 3, 0, s[0]);
- break;
- }
- break;
- case MENU_QUOTES:
- if (windowKind == userKind) {
- int selBefore = pqw->current();
- switch (selItem) {
- case QUOTES_FIRST:
- pqw->first();
- break;
- case QUOTES_PREVIOUS:
- pqw->previous();
- break;
- case QUOTES_NEXT:
- pqw->next();
- break;
- case QUOTES_LAST:
- pqw->last();
- break;
- case QUOTES_RANDOM:
- pqw->some();
- break;
- }
- int selAfter = pqw->current();
- if (selBefore != selAfter) {
- selUndoAction = UNDO_QUOTE;
- selUndo = UNDO;
- nQuoteUndo = selBefore;
- pwinUndo = pwin;
- }
- }
- if (selItem == QUOTES_GOTO)
- DisplayGoto();
- break;
- case MENU_SPEECH:
- switch (selItem) {
- case SPEECH_SPEAK_ALL:
- pqw->speak();
- break;
- case SPEECH_STOP_SPEAKING:
- StopSpeaking();
- break;
- }
- break;
- case MENU_VOICES:
- if (nCurrentVoice != selItem) {
- selUndoAction = UNDO_VOICE;
- selUndo = UNDO;
- mnVoiceUndo = nCurrentVoice;
- pwinUndo = pwin;
- CmdVoice(selItem);
- }
- break;
- case MENU_FONT:
- if (nCurrentFont != selItem) {
- selUndoAction = UNDO_FONT;
- selUndo = UNDO;
- pwinUndo = pwin;
- mnFontUndo = nCurrentFont;
- CmdFont(selItem);
- EnableUndo();
- }
- break;
- case MENU_SIZE:
- if (nCurrentSize != selItem) {
- selUndoAction = UNDO_SIZE;
- selUndo = UNDO;
- pwinUndo = pwin;
- mnSizeUndo = nCurrentSize;
- CmdSize(selItem);
- EnableUndo();
- }
- break;
- case MENU_WINDOW_6:
- SelectUserWindow(selItem-2);
- break;
- case MENU_WINDOW_7:
- SelectUserWindow(selItem);
- break;
- }
- HiliteMenu(0);
- } // DoMenuCommand
-
- void SelectUserWindow(int selWindow) {
- WindowPtr pwin = FrontWindow();
- short windowKind;
- while (pwin) {
- windowKind = GetWindowKind(pwin);
- if (windowKind == userKind)
- selWindow--;
- if (selWindow == 0) {
- SelectWindow(pwin);
- break;
- }
- pwin = GetNextWindow(pwin);
- }
- } // SelectUserWindow
-
- void RemoveWindow(WindowPtr pwin) {
- short windowKind = GetWindowKind(pwin);
- if (windowKind < 0)
- CloseDeskAcc(windowKind);
- else if (windowKind == userKind) {
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- delete pqw;
- if (pwin == pwinUndo)
- selUndo = CANT_UNDO;
- } else if (windowKind == dialogKind) {
- long selDialog = GetWRefCon(pwin);
- if (selDialog == DLOG_GOTO) {
- DisposeRgn(hrgnMouse);
- hrgnMouse = NULL;
- }
- }
- } // RemoveWindow
-
- void Terminate(void) {
- WindowPtr pwin = FrontWindow();
- EventRecord evt;
- while (pwin) {
- RemoveWindow(pwin);
- while (WaitNextEvent(updateMask+activMask, &evt, 0, NULL))
- ProcessEvent(evt);
- pwin = FrontWindow();
- }
- fContinue = 0;
- } // Terminate
-
- void DoGrow(WindowPtr pwin, Point ptMouse) {
- Rect rSize;
- SetRect(&rSize, 64, 64, 32767-1, 32767-1); // subtract 1 for an old region bug, confirmed by sample code
- long winSize = GrowWindow(pwin, ptMouse, &rSize);
- if (winSize) {
- short hSize = HiWord(winSize); // window height
- short wSize = LoWord(winSize); // window width
- SetPort(pwin);
- SizeWindow(pwin, wSize, hSize, 1);
- CGrafPtr pPort = GetWindowPort(pwin);
- Rect r = pPort->portRect;
- InvalRect(&r);
- }
- } // DoGrow
-
- void ContentClick(WindowPtr pwin, Point ptMouse) {
- } // ContentClick
-
- void MouseEvent(EventRecord evt) {
- WindowPtr pwinFront = FrontWindow();
- short windowKind;
- if (pwinFront)
- windowKind = GetWindowKind(pwinFront);
- Point ptMouse = evt.where;
- WindowPtr pwin;
- short part = FindWindow(ptMouse, &pwin);
- switch (part) {
- case inMenuBar:
- AdjustMenus();
- long menuSelection = MenuSelect(ptMouse);
- DoMenuCommand(menuSelection);
- break;
- case inSysWindow:
- if (windowKind==dialogKind)
- SysBeep(10);
- else
- SystemClick(&evt, pwin);
- break;
- case inDrag:
- if (windowKind==dialogKind && pwinFront!=pwin)
- SysBeep(10);
- else {
- RgnHandle hrgn = GetGrayRgn();
- DragWindow(pwin, ptMouse, &(**hrgn).rgnBBox);
- short windowKindDrag = GetWindowKind(pwin);
- if (windowKindDrag == dialogKind) {
- long selDialog = GetWRefCon(pwin);
- if (selDialog == DLOG_GOTO)
- SetMouseRegion();
- }
- }
- break;
- case inGoAway:
- if (TrackGoAway(pwin, ptMouse))
- RemoveWindow(pwin);
- break;
- case inContent:
- if (pwin != pwinFront)
- if (windowKind==dialogKind)
- SysBeep(10);
- else
- SelectWindow(pwin);
- else
- ContentClick(pwin, ptMouse);
- break;
- case inZoomOut:
- case inZoomIn:
- int fZoom = TrackBox(pwin, ptMouse, part);
- if (fZoom) {
- if (part == inZoomOut)
- ; // SetStandardState(pwin);
- SetPort(pwin); // needed because of ZoomWindow bug, confirmed by sample code
- ZoomWindow(pwin, part, 0);
- }
- break;
- case inGrow:
- DoGrow(pwin, ptMouse);
- break;
- }
- } // MouseEvent
-
- int DiskEvent(EventRecord evt) {
- int err = HiWord(evt.message);
- if (err != noErr) {
- DILoad();
- Point pt;
- SetPt(&pt, 100, 100);
- int errDI = DIBadMount(pt, evt.message);
- DIUnload();
- return errDI;
- }
- return err;
- } // DiskEvent
-
- void OsEvent(EventRecord evt) {
- int selMessage = (evt.message & osEvtMessageMask) >> 24;
- switch (selMessage) {
- case suspendResumeMessage:
- WindowPtr pwin = FrontWindow();
- if (evt.message & resumeFlag) {
- fForeground = 1; // resume
- if (pdlgGoto && pwin == pdlgGoto) {
- SetMouseRegion();
- if (evt.message & convertClipboardFlag) {
- TEFromScrap();
- fScrapChanged = 0;
- }
- } else
- InitCursor();
- } else {
- fForeground = 0; // suspend
- StopSpeaking();
- if (pdlgGoto && pwin == pdlgGoto) {
- if (fScrapChanged) {
- fScrapChanged = 0;
- OSErr err = ZeroScrap();
- if (err == noErr)
- TEToScrap();
- }
- }
- }
- // resume - activate the front window, suspend - deactivate the front window
- if (pwin)
- ActivateEvent(pwin, fForeground);
- break;
- case mouseMovedMessage:
- SetMouseRegion();
- break;
- }
- } // OsEvent
-
- #define KEY_UNDO 122
- #define KEY_COPY 99
-
- void KeyEvent(EventRecord evt) {
- char keyChar = evt.message & charCodeMask;
- char keyVirtual = (evt.message & keyCodeMask) >> 8;
- int fCmdKey = evt.modifiers & cmdKey;
- if (fCmdKey && (evt.what == keyDown) ) {
- AdjustMenus();
- long menuSelection = MenuKey(keyChar);
- DoMenuCommand(menuSelection);
- } else {
- WindowPtr pwin = FrontWindow();
- if (pwin) {
- short windowKind = GetWindowKind(pwin);
- if (windowKind == userKind) {
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- switch (keyVirtual) {
- case KEY_UNDO:
- CmdUndo();
- break;
- case KEY_COPY:
- pqw->copy();
- }
- }
- }
- }
- } // KeyEvent
-
- void ActivateEvent(WindowPtr pwin, int fActivate) {
- short windowKind = GetWindowKind(pwin);
- if (windowKind == userKind) {
- DrawGrowIcon(pwin);
- if (fActivate) {
- SetPort(pwin);
- CGrafPtr pPort = GetWindowPort(pwin);
- Rect r = pPort->portRect;
- r.top = r.bottom-15;
- ValidRect(&r);
- r = pPort->portRect;
- r.left = r.right-15;
- ValidRect(&r);
- }
- }
- } // ActivateEvent
-
- void UpdateEvent(WindowPtr pwin) {
- BeginUpdate(pwin);
- short windowKind = GetWindowKind(pwin);
- if (windowKind == userKind) {
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- pqw->draw();
- }
- EndUpdate(pwin);
- } // UpdateEvent
-
- void ProcessEvent(EventRecord evt) {
- WindowPtr pwin;
- switch (evt.what) {
- case mouseDown:
- MouseEvent(evt);
- break;
- case mouseUp:
- case keyUp:
- break; // ignore these events
- case keyDown:
- case autoKey:
- KeyEvent(evt);
- break;
- case diskEvt:
- (void) DiskEvent(evt);
- break;
- case updateEvt:
- pwin = (WindowPtr) evt.message;
- UpdateEvent(pwin);
- break;
- case activateEvt:
- pwin = (WindowPtr) evt.message;
- int fActivate = evt.modifiers & activeFlag;
- ActivateEvent(pwin, fActivate);
- break;
- case osEvt:
- OsEvent(evt);
- break;
- case kHighLevelEvent:
- // (void) HighLevelEvent(evt);
- break;
- }
- } // ProcessEvent
-
- void CleanUp(void) {
- ExitToShell();
- } // CleanUp
-
- void Abort(void) {
- ExitToShell();
- } // Abort
-
- void NullEvent(EventRecord *pEvt) {
- if (chan)
- if (SpeechBusy() == 0)
- StopSpeaking();
- if (fForeground) {
- WindowPtr pwin = FrontWindow();
- if (pwin) {
- short windowKind = GetWindowKind(pwin);
- switch (windowKind) {
- case dialogKind:
- WindowPtr pdlg;
- short item;
- IsDialogEvent(pEvt);
- DialogSelect(pEvt, &pdlg, &item);
- break;
- case userKind:
- long response;
- OSErr err = Gestalt(gestaltHelpMgrAttr, &response);
- int fHasHelpMgr;
- if (err == noErr)
- fHasHelpMgr = response & (1<<gestaltHelpMgrPresent);
- else
- fHasHelpMgr = 0;
- Handle hmenus;
- if (fHasHelpMgr) {
- if (HMGetBalloons()) {
- CGrafPtr pPort = GetWindowPort(pwin);
- Rect r = pPort->portRect;
- r.bottom+=2;
- r.right+=2;
- r.top = r.bottom-16;
- r.left = r.right-16;
- SetPort(pwin);
- Point pt;
- GetMouse(&pt);
- OSErr err;
- if (PtInRect(pt, &r)) {
- if (!HMIsBalloon()) {
- HMMessageRecord message;
- message.hmmHelpType = khmmStringRes;
- message.u.hmmStringRes.hmmResID = BALLOON_STRINGS;
- message.u.hmmStringRes.hmmIndex = STRING_SIZE_BOX;
- Point tip;
- tip.h = (r.left+r.right)/2;
- tip.v = (r.top+r.bottom)/2;
- LocalToGlobal(&tip);
- err = HMShowBalloon(&message, tip, NULL, NULL, 0, 0, kHMRegularWindow);
- }
- } else {
- r = pPort->portRect;
- if (PtInRect(pt, &r))
- if (HMIsBalloon())
- err = HMRemoveBalloon();
- }
- }
- }
- break;
- }
- }
- }
- } // NullEvent
-
- void DialogEvent(DialogPtr pdlg, short item) {
- long selDialog = GetWRefCon(pdlg);
- switch (selDialog) {
- case DLOG_ABOUT:
- if (item == 1)
- HideWindow(pdlg);
- break;
- case DLOG_GOTO:
- if (item == 1) {
- short item;
- Rect r;
- Handle hText;
- GetDialogItem(pdlg, 3, &item, &hText, &r);
- Str255 s;
- GetDialogItemText(hText, s);
- long iQuote;
- StringToNum(s, &iQuote);
- WindowPtr pwin = FrontWindow();
- short windowKind;
- while (pwin) {
- windowKind = GetWindowKind(pwin);
- if (windowKind == userKind)
- break;
- pwin = GetNextWindow(pwin);
- }
- if (pwin) {
- QuotesWindow *pqw = (QuotesWindow *)GetWRefCon(pwin);
- long cQuote = pqw->count();
- if (iQuote>0 && iQuote<=cQuote) {
- int selBefore = pqw->current();
- if (selBefore != iQuote-1) {
- selUndoAction = UNDO_QUOTE;
- selUndo = UNDO;
- nQuoteUndo = selBefore;
- pwinUndo = pwin;
- pqw->select(iQuote-1);
- }
- HideWindow(pdlg);
- DisposeRgn(hrgnMouse);
- hrgnMouse = NULL;
- if (fScrapChanged) {
- OSErr err = ZeroScrap();
- if (err == noErr)
- TEToScrap();
- }
- } else {
- SysBeep(10);
- SelectDialogItemText(pdlg, 3, 0, s[0]);
- }
- }
- }
- if (item == 2)
- HideWindow(pdlg);
- if (fScrapChanged) {
- OSErr err = ZeroScrap();
- if (err == noErr)
- TEToScrap();
- }
- break;
- }
- } // DialogEvent
-
- void main(void) {
- int errSetup = Setup();
- if (errSetup == noErr) {
- EventRecord evt;
- short fEvent;
- WindowPtr pwinPrior, pwinActive;
- DialogPtr pdlg;
- short item;
- while (fContinue) {
- fEvent = WaitNextEvent(everyEvent, &evt, 1, hrgnMouse);
- if (fEvent) {
- pwinPrior = FrontWindow();
- if (IsDialogEvent(&evt)) {
- if (DialogSelect(&evt, &pdlg, &item))
- DialogEvent(pdlg, item);
- else
- ProcessEvent(evt);
- } else
- ProcessEvent(evt);
- pwinActive = FrontWindow();
- if (pwinPrior != pwinActive)
- AdjustMenus();
- } else
- NullEvent(&evt);
- }
- CleanUp();
- } else
- Abort();
- } // main