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

  1. /*
  2.     sdmoudrg.c  8/21/90
  3.  
  4.     % sedmou_Drag
  5.     by Ted
  6.  
  7.     "Dragging" mouse handler.
  8.     Highlights all fields you drag over and returns a "CLICK" code for the
  9.     field you release over. (When the mouse button is released over the field,
  10.     the kb_Stuff code is set to MOU_CLICK.)
  11.     Gets private mouse events while mouse is dragged outside window.
  12.  
  13.     C-scape 3.2
  14.     Copyright (c) 1989 by Oakland Group, Inc.
  15.     ALL RIGHTS RESERVED.
  16.  
  17.     Revision History:
  18.     -----------------
  19.      9/23/90 ted    Made it greedy in EVENT instead of sucking events in ENDEVENT.
  20.     10/04/90 ted    Cancelled the MOU_HERE if GotoField was not successful.
  21. */
  22.  
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include "cscape.h"
  26.  
  27. #include "oakpriv.h"
  28. #include "winpriv.h"        /* For wmgr_lastmev, wmgr_currmev */
  29.  
  30. #include "scancode.h"        /* for MOU codes */
  31. /* -------------------------------------------------------------------------- */
  32.  
  33. int sedmou_Drag(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.     boolean    first;
  48.  
  49.     first = FALSE;
  50.  
  51.     switch (msg) {
  52.     case MEV_STARTOFFER:           /* we're not the current window */
  53.  
  54.         win_SetDebounced(sed, mev_IsButtonDown(mev));
  55.         if (mev_IsFake()) {
  56.             mev_ClearEvent(mev);    /* Don't accept it */
  57.             break;
  58.         }
  59.         /* no break, fall through */
  60.  
  61.     case MEV_OFFER:                /* we're not the current window */
  62.         /* If button pressed accept the offer */
  63.         if (!mev_IsButtonDown(mev)) {
  64.             win_SetDebounced(sed, FALSE);
  65.             mev_ClearEvent(mev);    /* Don't accept it */
  66.         }
  67.         else {    /* button pressed */
  68.             /* Accept the offer */
  69.             win_SetDebounced(sed, TRUE);
  70.             sedmev_acceptoffer(sed, mev, TRUE);
  71.         }
  72.         break;
  73.  
  74.     case MEV_ENDOFFER:                   /* we're not the current window */
  75.         break;
  76.  
  77.     case MEV_REQUEST:    /* we're the current window; another window was
  78.                             selected by the mouse. */
  79.         winmev_grantrequest(sed, mev);
  80.  
  81.         /* Return MOU_THERE as a scancode to kb_Read to tell the sed
  82.             about the request so it can exit */
  83.         return(MOU_THERE);
  84.  
  85.     case MEV_STARTEVENT:
  86.  
  87.         /* If only a border/window transition, treat this event like no start */
  88.         if (!(wmgr_lastmev()->win == wmgr_currmev()->win &&
  89.               wmgr_currmev()->incurrent == wmgr_lastmev()->incurrent)) {
  90.  
  91.             win_SetDebounced(sed, mev_IsButtonDown(mev));
  92.             if (!mev_IsButtonDown(mev)) {
  93.                 if (!sed_IsActive(sed)) {
  94.                     sed_SetActive(sed, TRUE);
  95.                     sed_GotoFirstField(sed);
  96.                 }
  97.             }
  98.             else disp_TrapMouse(sed);    /* Trap mouse while button is down */
  99.  
  100.             first = TRUE;
  101.         }
  102.         /* no break, fall through */
  103.  
  104.     case MEV_EVENT:                    /* we're the current window */
  105.     {
  106.         ocbox      mbox;
  107.  
  108.         if (mev_IsButtonDown(mev)) {
  109.  
  110.             if (!win_GetDebounced(sed)) {
  111.                 disp_TrapMouse(sed);    /* Trap mouse when button goes down */
  112.             }
  113.             if (!mev->inborder && !mev->outside) {
  114.                 mbox.toprow = mbox.botrow = mev_GetRow(mev) + sed_GetYoffset(sed);
  115.                 mbox.leftcol = mbox.rightcol = mev_GetCol(mev) + sed_GetXoffset(sed);
  116.  
  117.                 /* sed_FindField finds the best field in the given box */ 
  118.                 fld = sed_FindField(sed, &mbox, OAK_DOWN);
  119.             }
  120.             else fld = -1;
  121.  
  122.             if (fld >= 0) {        /* In a field, and it's not protected */
  123.                 if (fld != sed_GetFieldNo(sed) ||
  124.                     first || !win_GetDebounced(sed)) {
  125.  
  126.                     win_SetDebounced(sed, TRUE);
  127.  
  128.                     sed_SetActive(sed, TRUE);
  129.                     if (sed_GotoField(sed, fld) == SED_MOVED) {
  130.  
  131.                         /* Return MOU_HERE as a scancode to kb_Read. We return it even if
  132.                             the button hasn't been released because we have changed fields
  133.                             and we want to leave the current field immediately.
  134.                         */
  135.                         return(MOU_HERE);
  136.                     }
  137.                 }
  138.                 else if (!sed_IsActive(sed)) {
  139.                     sed_SetActive(sed, TRUE);
  140.                     sed_GotoField(sed, sed_GetFieldNo(sed));
  141.                 }
  142.             }
  143.             else {    /* In no field or a protected one */
  144.                 /* Turn off any highlighted field while we're dragging */
  145.                 if (sed_IsActive(sed)) {     /* && !mev_IsFake() */
  146.                     sed_SetActive(sed, FALSE);
  147.                     sed_GotoField(sed, sed_GetFieldNo(sed));
  148.                 }
  149.             }
  150.             win_SetDebounced(sed, TRUE);
  151.         }
  152.         else {    /* Button is up */
  153.             if (win_GetDebounced(sed)) {
  154.                 win_SetDebounced(sed, FALSE);
  155.  
  156.                 /* When the mouse is released, if a field is active, CLICK it */
  157.                 if (sed_IsActive(sed)) {    /* A field is highlighted */
  158.                     /* Set our mousecode to tell us that the mouse was released
  159.                         when our field function is eventually called.
  160.                     */
  161.                     kb_Stuff(MOU_CLICK);
  162.                     return(MOU_HERE);
  163.                 }
  164.                 else {
  165.                     /* No field was selected when the mouse was released, so
  166.                         just go back to the first field and reactivate the sed.
  167.                     */
  168.                     sed_SetActive(sed, TRUE);
  169.                     sed_GotoFirstField(sed);
  170.  
  171.                     /* Exit to restore trapwin; re-enter ourselves */
  172.                     win_SetNextWin(sed, sed);
  173.                     return(MOU_THERE);
  174.                 }
  175.             }
  176.         }
  177.         break;
  178.     }
  179.     case MEV_ENDEVENT:                   /* we're the current window */
  180.         break;
  181.     }
  182.     return(MOU_IGNORE);        /* Ignore this mouse event */
  183. }
  184. /* -------------------------------------------------------------------------- */
  185.  
  186.