home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / SDMOUCKF.C < prev    next >
Text File  |  1990-09-24  |  4KB  |  136 lines

  1. /*
  2.     sdmouckf.c
  3.  
  4.     % sedmou_ClickField
  5.  
  6.     12/23/89 by Ted.
  7.  
  8.     The "click field" mouse handler.
  9.     Jumps to a field when a mouse button is clicked over the field.
  10.     Doesn't jump to the sed when a button is clicked in it but in no field.
  11.  
  12.     If the field is in a different sed, and both seds have mouse handlers,
  13.     then the first sed is exited and control is passed to the new sed.
  14.  
  15.     C-scape 3.2
  16.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  17.     ALL RIGHTS RESERVED.
  18.  
  19.     Revision History:
  20.     -----------------
  21.      3/03/90 ted/pmcm Added support for sed_FindField -2 return in case of protected fields.
  22.      3/28/90 jmd    ansi-fied
  23.      5/12/90 jmd    mouse handlers now return ints
  24.      8/17/90 ted    Changed references from sed_SetMouseCode to kb_Stuff.
  25.      9/24/90 ted    Cancelled the click if GotoField was not successful.
  26. */
  27.  
  28. #include <stdio.h>
  29. #include "cscape.h"
  30.  
  31. #include "scancode.h"        /* for MOU codes */
  32.  
  33. int sedmou_ClickField(sed_type sed, int msg, mev_struct *mev)
  34. /*
  35.     Messages a mouse handler receives when its window is current
  36.     MEV_REQUEST            someone else wants to be it
  37.     MEV_STARTEVENT        current, mouse entered
  38.     MEV_EVENT            current, event in win
  39.     MEV_ENDEVENT        current, mouse left
  40.     Messages a mouse handler receives when its window is not current
  41.     MEV_STARTOFFER        not current, mouse entered
  42.     MEV_OFFER            not current, event in win
  43.     MEV_ENDOFFER        not current, mouse left
  44. */
  45. {
  46.     int      fld;
  47.     ocbox      mbox;
  48.  
  49.     switch (msg) {
  50.     case MEV_STARTOFFER:           /* we're not the current window */
  51.         win_SetDebounced(sed, mev_IsButtonDown(mev));
  52.         /* no break, fall through */
  53.  
  54.     case MEV_OFFER:                /* we're not the current window */
  55.         /* If button pressed accept the event */
  56.         if (!mev_IsButtonDown(mev)) {
  57.             win_SetDebounced(sed, FALSE);
  58.             mev_ClearEvent(mev);    /* Don't accept it */
  59.         }
  60.         else {    /* button pressed */
  61.             if (win_GetDebounced(sed)) {
  62.                 mev_ClearEvent(mev);    /* Don't accept it */
  63.             }
  64.             else {
  65.                 win_SetDebounced(sed, TRUE);
  66.  
  67.                 /* Accept the offer */
  68.                 if (sedmev_acceptoffer(sed, mev, FALSE) != -2) {
  69.                     /* Set our mousecode to tell us that the mouse was clicked
  70.                         when our field function is eventually called. */
  71.  
  72.                     kb_Stuff(MOU_CLICK);
  73.                 }
  74.  
  75.                 /* We don't care what code we return because we accepted the
  76.                     offer, which means the REQUEST message gets to decide what
  77.                     to return from this particular kb_Read call */
  78.             }
  79.         }
  80.         break;
  81.  
  82.     case MEV_ENDOFFER:                   /* we're not the current window */
  83.         break;
  84.  
  85.     case MEV_REQUEST:    /* we're the current window;
  86.                             another window was selected by the mouse. */
  87.         winmev_grantrequest(sed, mev);
  88.  
  89.         /* Return MOU_THERE as a scancode to kb_Read to tell the sed
  90.             about the request so it can exit */
  91.         return(MOU_THERE);
  92.  
  93.     case MEV_STARTEVENT:
  94.         win_SetDebounced(sed, mev_IsButtonDown(mev));
  95.         /* no break, fall through */
  96.  
  97.     case MEV_EVENT:                    /* we're the current window */
  98.         /* Test if event occurred (button pressed) */
  99.         if (!mev_IsButtonDown(mev)) {
  100.             win_SetDebounced(sed, FALSE);
  101.         }
  102.         else {
  103.             if (!win_GetDebounced(sed)) {
  104.                 win_SetDebounced(sed, TRUE);
  105.  
  106.                 mbox.toprow = mbox.botrow = mev_GetRow(mev) + sed_GetYoffset(sed);
  107.                 mbox.leftcol = mbox.rightcol = mev_GetCol(mev) + sed_GetXoffset(sed);
  108.  
  109.                 /* sed_FindField finds the best field in the given box */ 
  110.                 if ((fld = sed_FindField(sed, &mbox, OAK_DOWN)) >= 0) {
  111.                     if (fld != sed_GetFieldNo(sed)) {
  112.                         if (sed_GotoField(sed, fld) != SED_MOVED) {
  113.                             break;    /* If GotoField fails, don't click */
  114.                         }
  115.                     }
  116.                     /* Set our mousecode to tell us that the mouse was clicked
  117.                         when our field function is eventually called. */
  118.  
  119.                     kb_Stuff(MOU_CLICK);
  120.  
  121.                     /* Return MOU_HERE as a scancode to kb_Read to tell the sed
  122.                         there was an event in it, but possibly in a new field,
  123.                         so it can re-enter in the new field */
  124.                     return(MOU_HERE);
  125.                 }
  126.             }
  127.         }
  128.         break;
  129.  
  130.     case MEV_ENDEVENT:                   /* we're the current window */
  131.         break;
  132.     }
  133.     return(MOU_IGNORE);        /* Ignore this mouse event */
  134. }
  135.  
  136.