home *** CD-ROM | disk | FTP | other *** search
/ CD-ROM Today - The Disc! 8 / cdrt08.iso / mac / Shareware / HyperCard / demoCdef 120 ƒ / demo Source ƒ / movableModal.c < prev    next >
Encoding:
Text File  |  1994-12-12  |  2.2 KB  |  105 lines  |  [TEXT/KAHL]

  1. //----------------------------------------------------------------------------------
  2. //    File        : movableModal.c
  3. //    Date        : April 4, 1994
  4. //    Author        : Jim Stout
  5. //    Purpose        : Implements movableModal dialogs
  6. //------------------------------------------------------------------------------------
  7. #include "movableModal.h"
  8.  
  9. extern void updateWindow(WindowPtr);        // must be in your application code!!
  10.  
  11. pascal void movableModalDialog(filterProc filter, short *theItem)
  12. {
  13.     EventRecord theEvent;
  14.     DialogPtr    d,thisDialog;
  15.     
  16.     thisDialog = FrontWindow();
  17.     
  18.     for(;;) {
  19.         WaitNextEvent(everyEvent, &theEvent, 20, 0L);
  20.         if(*theItem = preFilterEvent(thisDialog, &theEvent))
  21.             break;
  22.         
  23.         if (filter != nil)
  24.             if (filter(thisDialog, &theEvent, theItem))
  25.                 break;
  26.  
  27.         if (IsDialogEvent(&theEvent))
  28.             if (DialogSelect(&theEvent, &d, theItem))
  29.                 break;
  30.     }
  31. }
  32.  
  33. static short preFilterEvent(DialogPtr d, EventRecord *theEvent)
  34. {
  35.     short ret=0;
  36.     
  37.     switch (theEvent->what) {
  38.         case mouseDown:
  39.             ret = doMouseDialog(d,theEvent);         /* handle drag etc. of dialog        */
  40.         break;
  41.         case diskEvt:
  42.             diskEvent(theEvent);
  43.         break;
  44.         case updateEvt:
  45.             if(d != (DialogPtr)theEvent->message)
  46.                 updateWindow((WindowPtr)theEvent->message);    /* pass update evt back to mainline    */
  47.         break;
  48.     }
  49.     return (ret);
  50. }
  51.  
  52. static short doMouseDialog(DialogPtr d, EventRecord *theEvent)
  53. {
  54.     WindowPtr    theWindow;
  55.     short        partCode, ret=0;
  56.     
  57.     switch (partCode = FindWindow(theEvent->where,&theWindow)) {
  58.         case inDrag:
  59.             if(theWindow == d) {
  60.                 DragWindow(d, theEvent->where, &screenBits.bounds);
  61.                 theEvent->what = nullEvent;
  62.             }
  63.         break;
  64.         
  65.         case inMenuBar:
  66.             MenuSelect(theEvent->where);
  67.             HiliteMenu(0);
  68.         break;
  69.  
  70.         case inGoAway:
  71.             if (TrackBox (theWindow, theEvent->where, partCode)) {
  72.                 ret = cancel;
  73.                 theEvent->what = nullEvent;
  74.             }
  75.         break;
  76.         
  77. /* add code if you need to deal with these mouseDown events╔    */
  78.  
  79.         case inGrow:
  80.         break;
  81.         case inZoomIn:
  82.         case inZoomOut:
  83.         break;
  84.         case inContent:
  85.         break;
  86.         default:
  87.         break;
  88.     }
  89.     return(ret);
  90. }
  91.  
  92. extern void diskEvent(EventRecord *theEvent)
  93. {
  94.     Point diskInitPt;
  95.  
  96.     if (HiWord (theEvent->message) != noErr) {
  97.         diskInitPt.v = 120;
  98.         diskInitPt.h = 100;
  99.         DILoad ();
  100.         (void) DIBadMount (diskInitPt, theEvent->message);
  101.         DIUnload ();
  102.         theEvent->what = nullEvent;
  103.     }
  104. }
  105.