/********************************************************************** * * Event.c * * Copyright (c) * Apple Computer, Inc. 1986-1989 * All Rights Reserved. * * This file contains the code which implements the * main event loop used by the scanner program. * **********************************************************************/ #include #include #include #include #include #include #include "Scan.h" extern WmTaskRec event; extern unsigned int quitFlag; extern GrafPortPtr previewWindowPtr; extern GrafPortPtr settingsWindowPtr; static GrafPortPtr lastWindow; /* This private global is used in checkFrontW() ** to prevent extra work when the windows ** have not changed. It is initialized ** at the beginning of mainEvent(). */ /********************************************************************** * * doSetPageScroll * * This procedure is called when an inGrow or inZoom message is returned * by TaskMaster. * * This procedure resets the values used to scroll the content region * when the page areas are clicked on in the scroll bars. * ***********************************************************************/ static void doSetPageScroll() { int tempH, tempV; tempV = lastWindow->portRect.v2-lastWindow->portRect.v1; /* calculate vertical size */ tempH = lastWindow->portRect.h2-lastWindow->portRect.h1; /* calculate width */ SetPage(tempH-10, tempV-10, lastWindow); } /********************************************************************** * * doControls * * This procedure is called when an inControl message is returned * by TaskMaster. * * When this routine gets control, the ID of the control that was * hit is in TaskDATA4. The control handle is in TaskData2 and * the part code is in taskData 3. * **********************************************************************/ void doControls() { LongWord theID, thePartCode; LongWord theControlHandle; theID = event.wmTaskData4; thePartCode = event.wmTaskData3; theControlHandle = event.wmTaskData2; if (( 0 <= theID) && (theID <= 0xFFFFFFFF )) { switch(theID) { case ScanButton: doScanButton(); break; case PreviewButton: doPreviewButton(); break; } } } /********************************************************************** * * doInContent * * This procedure is called when an InContent message is returned * by TaskMaster. * * When this routine gets control, the ID of the control that was * hit is in TaskDATA4. The control handle is in TaskData2 and * the part code is in taskData 3. * **********************************************************************/ void doInContent() { LongWord theID, thePartCode; LongWord theControlHandle; theID = event.wmTaskData4; thePartCode = event.wmTaskData3; theControlHandle = event.wmTaskData2; SelectWindow(event.wmTaskData); #if 0 if (event.what == 0x01) { /* was it a mouse down event? */ if ((GrafPortPtr) event.wmTaskData == previewWindowPtr){ doInPreview(event.where); } } #endif } /********************************************************************** * * checkFrontW * * This routine checks the front window to see if any changes need * to be made to the menu items. * * We do this so that the edit items are only active when a desk * accessory is active. * **********************************************************************/ void checkFrontW() { GrafPortPtr theWindow; extern int cTable[], defCTable[]; theWindow = FrontWindow(); /* Get the front window into local storage.*/ if (theWindow == lastWindow) return; /* If the lastWindow is this window, we are all set. */ /* If there are no windows, everything should be disabled */ if (!theWindow) { SetMenuFlag(0x0080, EditMenuID); HiliteMenu(0,EditMenuID); SetColorTable(0,defCTable); } /* if the front window is an image window, then we want to enable the edit items */ if (!( (theWindow == previewWindowPtr)||(theWindow == settingsWindowPtr))) { EnableMItem(SaveAsID); /* allow Save As... */ SetMenuFlag (0xFF7F, EditMenuID); /* Set up for da windows. */ HiliteMenu(0,EditMenuID); } else { DisableMItem(SaveAsID); /* don't allow saving */ /* Otherwise we look at the window and see what to do. */ if (GetSysWFlag(theWindow)) { SetMenuFlag (0xFF7F, EditMenuID); /* Set up for da windows. */ HiliteMenu(0,EditMenuID); } else { SetMenuFlag (0x0080, EditMenuID); /* Set up for our windows. */ HiliteMenu(0,EditMenuID); } } /* use grayscale pallette for Preview or Image windows */ if((theWindow != settingsWindowPtr) && !GetSysWFlag(theWindow)) SetColorTable(0,cTable); else SetColorTable(0,defCTable); lastWindow = theWindow; /* Remember this for next time. */ /* here we want to update the hor/vert text if need be */ } /********************************************************************** * * mainEvent * * This is the main part of the program. The program cycles in this * loop until the user choose select. * **********************************************************************/ void mainEvent() { unsigned int code; unsigned temp; event.wmTaskMask = 0x001FFF7F; /* Allow TaskMaster to do everything, and return inContents */ quitFlag = 0; /* Done flag will be set by Quit item. */ lastWindow = NULL; /* Init this for checkFrontW(). */ for (;;) { checkFrontW(); code = TaskMaster(0xFFFF, &event); switch(code) { case wNoHit: /* null event, but TaskMaster might have handled something */ temp = event.wmTaskData & 0xffff; /* get the event code */ if(temp == wInGrow || temp == wInZoom) /* if the window changed sizes */ doSetPageScroll(); break; case wInGoAway: doCloseTop(); break; case wInSpecial: case wInMenuBar: doMenu(); break; case wInControl: doControls(); break; case wInContent: doInContent(); break; } if (quitFlag) break; } }