home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / RandomDot 1.1.0 / source / Help.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-21  |  5.7 KB  |  270 lines  |  [TEXT/KAHL]

  1. /* Help.c 
  2.     by David Phillip Oster October 1994 oster@netcom.com
  3.     for:
  4.     Stuart Inglis singlis@waikato.ac.nz
  5.     Department of Computer Science
  6.     University of Waikato, Hamilton, New Zealand
  7.  */
  8. #include "RandomDotMain.h"
  9. #include "RandomDotRes.h"
  10.  
  11. #include "Help.h"
  12. #include "Utils.h"
  13.  
  14. #define kHelpItem    (kOK+1)
  15.  
  16. static TEHandle            helpTE;
  17. static ControlHandle    helpScroll;
  18.  
  19. static void InitVThumb(ControlHandle);
  20. static pascal void ScrollDown(ControlHandle, Integer);
  21. static pascal void ScrollUp(ControlHandle, Integer);
  22. static pascal void PageDown(ControlHandle, Integer);
  23. static pascal void PageUp(ControlHandle, Integer);
  24. static void VDThumb(ControlHandle, Integer);
  25. static pascal void VThumb(void);
  26. static void ScrollDraw(Integer x, Integer y);
  27. static void DoScrollDraw(Integer x, Integer y);
  28. static Integer PageSize(void);
  29.  
  30. static ScrollBarClassRec vProcs = {
  31.     ScrollUp,        /* inUpButton */
  32.     ScrollDown,    /* inDownButton */
  33.     PageUp,        /* inPageUp */
  34.     PageDown,        /* inPageDn */
  35.     VThumb,        /* inThumb */
  36.     InitVThumb,    /* InitThumb */
  37.     VDThumb        /* DThumb */
  38. };    
  39.  
  40. void InitVThumb(ControlHandle ch){
  41. }
  42.  
  43. pascal void ScrollDown(ControlHandle ch, Integer i){
  44.     ScrollDraw(0, 1);
  45. }
  46.  
  47. pascal void ScrollUp(ControlHandle ch, Integer i){
  48.     ScrollDraw(0, -1);
  49. }
  50.  
  51. pascal void PageDown(ControlHandle ch, Integer i){
  52.     ScrollDraw(0, PageSize());
  53. }
  54.  
  55. pascal void PageUp(ControlHandle ch, Integer i){
  56.     ScrollDraw(0, -PageSize());
  57. }
  58.  
  59. void VDThumb(ControlHandle ch, Integer oldVal){
  60.     if(oldVal != GetCtlValue(ch)){
  61.         DoScrollDraw(0, GetCtlValue(ch) - oldVal);
  62.     }
  63. }
  64.  
  65. pascal void VThumb(void){
  66. }
  67.  
  68. static Integer PageSize(void){
  69.     Rect r;
  70.  
  71.     GetDIRect(kHelpItem, &r);
  72.     return ((r.bottom-r.top)*9)/((**helpTE).lineHeight*10);
  73. }
  74.  
  75. /* TrimScroll - adjust number to preserve min < val < max relationship
  76.  */
  77. static Integer TrimScroll(Integer delta, ControlHandle c){
  78.     Integer newVal;
  79.     newVal = GetCtlValue(c) + delta;
  80.     if(newVal > GetCtlMax(c))
  81.         return GetCtlMax(c) - GetCtlValue(c);
  82.     if(newVal < GetCtlMin(c))
  83.         return GetCtlMin(c) - GetCtlValue(c);
  84.     return delta;
  85. }
  86.  
  87. /* ScrollDraw - scroll the window and change the controls.
  88.  */
  89. static void ScrollDraw(Integer x, Integer y){
  90.     ControlHandle theH, theV;
  91.     
  92.     theH = NIL;
  93.     theV = helpScroll;
  94.  
  95.     y = TrimScroll(y, theV);
  96.  
  97.     if(y == 0){
  98.         return;
  99.     }
  100.     if(y != 0){
  101.         SetCtlValue(theV, GetCtlValue(theV) + y);
  102.     }
  103.     DoScrollDraw(x, y);
  104. }
  105.  
  106. /* DoScrollDraw - actually scrolls the window.
  107.  * doesn't set the controls. Use this when the user directly sets the
  108.  * control thumb.
  109.  */
  110. static void DoScrollDraw(Integer x, Integer y){
  111.     TEScroll(0, -y*(**helpTE).lineHeight, helpTE);
  112. }
  113.  
  114. static pascal Boolean HelpFilter(DialogPtr, EventRecord *, Integer *);
  115.  
  116. /* HelpMouse - 
  117.  */
  118. static Boolean HelpMouse(Point where){
  119.     Rect r;
  120.  
  121.     GlobalToLocal(&where);
  122.     GetDIRect(kHelpItem, &r);
  123.     r.left = r.right - kScrollBarWidth;
  124.     if(PtInRect(where, &r)){
  125.         TrackScroll(where);
  126.         return TRUE;
  127.     }
  128.     return FALSE;
  129. }
  130.  
  131. /* HelpPageHome - 
  132.  */
  133. static Boolean HelpPageHome(void){
  134.     ScrollDraw(0, -GetCtlValue(helpScroll));
  135.     return FALSE;
  136. }
  137.  
  138. /* HelpPageEnd - 
  139.  */
  140. static Boolean HelpPageEnd(void){
  141.     ScrollDraw(0, GetCtlMax(helpScroll)-GetCtlValue(helpScroll));
  142.     return FALSE;
  143. }
  144.  
  145. /* HelpPageUp - 
  146.  */
  147. static Boolean HelpPageUp(void){
  148.     PageUp(NIL, 0);
  149.     return FALSE;
  150. }
  151.  
  152. /* HelpPageDown - 
  153.  */
  154. static Boolean HelpPageDown(void){
  155.     PageDown(NIL, 0);
  156.     return FALSE;
  157. }
  158.  
  159.  
  160.  
  161. /* HelpKey - 
  162.  */
  163. static Boolean HelpKey(EventRecord *event, Integer *item){
  164.     Boolean val;
  165.  
  166.     val = FALSE;
  167.     if(IsReturnEnter((char) event->message) ||
  168.         IsCancel(event)){
  169.         MirrorIt(*item = kOK);
  170.         return TRUE;
  171.     }
  172.     switch((char) event->message){
  173.     case kHomeChar:        val = HelpPageHome();    break;
  174.     case kBackspaceChar:val = HelpPageEnd();    break;
  175.     case kUpChar:
  176.     case kPageUpChar:    val = HelpPageUp();        break;
  177.     case kDownChar:
  178.     case kReturnChar:    val = HelpPageDown();    break;
  179.     }
  180.     event->what = nullEvent;
  181.     return val;
  182. }
  183.  
  184. /* HelpFilter - 
  185.  */
  186. static pascal Boolean HelpFilter(DialogPtr dp,EventRecord *event,Integer *itemp){
  187.     Rect r;
  188.     GrafPtr savePort;
  189.     Boolean val;
  190.     static ModalFilterUPP    stdFilerProc = NIL;
  191.  
  192.     val = FALSE;
  193.     GetPort(&savePort);
  194.     SetPort(dp);
  195.     switch(event->what){
  196.     case updateEvt:
  197.         if((LongInt) dp == event->message){
  198.             GetDIRect(kHelpItem, &r);
  199.             PenPat(&qd.ltGray);
  200.             InsetRect(&r, -1, -1);
  201.             FrameRect(&r);
  202.             PenPat(&qd.black);
  203.             r = (**qd.thePort->visRgn).rgnBBox;
  204.             TEUpdate(&r, helpTE);
  205.             if(NIL == stdFilerProc){
  206.                 GetStdFilterProc(&stdFilerProc);
  207.             }
  208.             CallModalFilterProc(stdFilerProc, dp, event, itemp);
  209.         }
  210.         break;
  211.     case mouseDown:    
  212.         if(HelpMouse(event->where)){
  213.             event->what = nullEvent;
  214.         }
  215.         break;
  216.     case autoKey:
  217.     case keyDown:    val = HelpKey(event, itemp);    break;
  218.     }
  219.     SetPort(savePort);
  220.     return val;
  221. }
  222.  
  223. /* DoHelp - Dialogs.h
  224.  */
  225. void DoHelp(void){
  226.     DialogPtr    dp;
  227.     Integer        n, item;
  228.     Handle        h;
  229.     Rect        r;
  230.     GrafPtr        savePort;
  231.     static ModalFilterUPP helpFilter = NIL;
  232.  
  233.     GetPort(&savePort);
  234.     dp = GetNewDialog(rHelp, NIL, (WindowPtr) -1L);
  235.     SetPort(dp);
  236.     SetDialogDefaultItem(dp, kOK);
  237.     GetDItem(qd.thePort, kHelpItem, &item, &h, &r);
  238.     if(NIL == (h = GetResource('TEXT', 129))){
  239.         return;
  240.     }
  241.     DetachResource(h);
  242.     r.right -= kScrollBarWidth;
  243.     GetFNum("\pGeneva", &n);
  244.     TextFont(n);
  245.     TextSize(9);
  246.     InsetRect(&r, 1, 1);
  247.     helpTE = TENew(&r, &r);
  248.     InsetRect(&r, -1, -1);
  249.     DisposHandle( (**helpTE).hText);
  250.     (**helpTE).hText = h;
  251.     TECalText(helpTE);
  252.     helpScroll = GetNewControl(128, qd.thePort);
  253.     SetCtlMax(helpScroll,  (**helpTE).nLines - (r.bottom - r.top)/(**helpTE).lineHeight);
  254.     r.left = r.right;
  255.     r.right += kScrollBarWidth + 1;
  256.     InitScrollBarClass(&vProcs);
  257.     SetCRefCon(helpScroll, (LongInt) &vProcs);
  258.     MoveControl(helpScroll, r.left-1, r.top);
  259.     SizeControl(helpScroll, r.right-r.left, r.bottom-r.top);
  260.     ShowWindow(dp);
  261.     SelectWindow(dp);
  262.     if(NIL == helpFilter){
  263.         helpFilter = NewModalFilterProc(HelpFilter);
  264.     }
  265.     ModalDialog(helpFilter, &item);
  266.     TEDispose(helpTE);
  267.     DisposDialog(dp);
  268.     SetPort(savePort);
  269. }
  270.