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

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