home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / owlsrc.pak / EVENTHAN.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-24  |  13.4 KB  |  257 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // (C) Copyright 1992, 1994 by Borland International, All Rights Reserved
  4. //
  5. //   Implementation of class TEventHandler
  6. //----------------------------------------------------------------------------
  7. #include <owl/owlpch.h>
  8. #include <owl/point.h>
  9. #include <owl/eventhan.h>
  10. #include <stdlib.h>
  11.  
  12. DIAG_DEFINE_GROUP_INIT(OWL_INI, OwlMsg, 1, 0);
  13.                              // diagnostic group for message tracing
  14.  
  15. #if defined(__TRACE) || defined(__WARN)
  16.   struct WMSTR {
  17.     uint    msg;
  18.     char*   str;
  19.   };
  20.  
  21.   static  WMSTR  StrTab[] = {
  22.     { WM_CREATE,                "WM_CREATE"               },  // 0x0001
  23.     { WM_DESTROY,               "WM_DESTROY"              },  // 0x0002
  24.     { WM_MOVE,                  "WM_MOVE"                 },  // 0x0003
  25.     { WM_SIZE,                  "WM_SIZE"                 },  // 0x0005
  26.     { WM_ACTIVATE,              "WM_ACTIVATE"             },  // 0x0006
  27.     { WM_SETFOCUS,              "WM_SETFOCUS"             },  // 0x0007
  28.     { WM_KILLFOCUS,             "WM_KILLFOCUS"            },  // 0x0008
  29.     { 0x0009,                   "wm_setvisible"           },  // 0x0009
  30.     { WM_ENABLE,                "WM_ENABLE"               },  // 0x000A
  31.     { WM_SETREDRAW,             "WM_SETREDRAW"            },  // 0x000B
  32.     { WM_SETTEXT,               "WM_SETTEXT"              },  // 0x000C
  33.     { WM_GETTEXT,               "WM_GETTEXT"              },  // 0x000D
  34.     { WM_GETTEXTLENGTH,         "WM_GETTEXTLENGTH"        },  // 0x000E
  35.     { WM_PAINT,                 "WM_PAINT"                },  // 0x000F
  36.     { WM_CLOSE,                 "WM_CLOSE"                },  // 0x0010
  37.     { WM_QUERYENDSESSION,       "WM_QUERYENDSESSION"      },  // 0x0011
  38.     { WM_QUIT,                  "WM_QUIT"                 },  // 0x0012
  39.     { WM_QUERYOPEN,             "WM_QUERYOPEN"            },  // 0x0013
  40.     { WM_ERASEBKGND,            "WM_ERASEBKGND"           },  // 0x0014
  41.     { WM_SYSCOLORCHANGE,        "WM_SYSCOLORCHANGE"       },  // 0x0015
  42.     { WM_ENDSESSION,            "WM_ENDSESSION"           },  // 0x0016
  43.     { 0x0017,                   "WM_SYSTEMERROR"          },  // 0x0017
  44.     { WM_SHOWWINDOW,            "WM_SHOWWINDOW"           },  // 0x0018
  45.     { WM_CTLCOLOR,              "WM_CTLCOLOR"             },  // 0x0019
  46.     { WM_WININICHANGE,          "WM_WININICHANGE"         },  // 0x001A
  47.     { WM_DEVMODECHANGE,         "WM_DEVMODECHANGE"        },  // 0x001B
  48.     { WM_ACTIVATEAPP,           "WM_ACTIVATEAPP"          },  // 0x001C
  49.     { WM_FONTCHANGE,            "WM_FONTCHANGE"           },  // 0x001D
  50.     { WM_TIMECHANGE,            "WM_TIMECHANGE"           },  // 0x001E
  51.     { WM_CANCELMODE,            "WM_CANCELMODE"           },  // 0x001F
  52.     { WM_SETCURSOR,             "WM_SETCURSOR"            },  // 0x0020
  53.     { WM_MOUSEACTIVATE,         "WM_MOUSEACTIVATE"        },  // 0x0021
  54.     { WM_CHILDACTIVATE,         "WM_CHILDACTIVATE"        },  // 0x0022
  55.     { WM_QUEUESYNC,             "WM_QUEUESYNC"            },  // 0x0023
  56.     { WM_GETMINMAXINFO,         "WM_GETMINMAXINFO"        },  // 0x0024
  57.     { 0x0026,                   "wm_painticon"            },  // 0x0026
  58.     { WM_ICONERASEBKGND,        "WM_ICONERASEBKGND"       },  // 0x0027
  59.     { WM_NEXTDLGCTL,            "WM_NEXTDLGCTL"           },  // 0x0028
  60.     { 0x0029,                   "wm_alttabactive"         },  // 0x0029
  61.     { WM_SPOOLERSTATUS,         "WM_SPOOLERSTATUS"        },  // 0x002A
  62.     { WM_DRAWITEM,              "WM_DRAWITEM"             },  // 0x002B
  63.     { WM_MEASUREITEM,           "WM_MEASUREITEM"          },  // 0x002C
  64.     { WM_DELETEITEM,            "WM_DELETEITEM"           },  // 0x002D
  65.     { WM_VKEYTOITEM,            "WM_VKEYTOITEM"           },  // 0x002E
  66.     { WM_CHARTOITEM,            "WM_CHARTOITEM"           },  // 0x002F
  67.     { WM_SETFONT,               "WM_SETFONT"              },  // 0x0030
  68.     { WM_GETFONT,               "WM_GETFONT"              },  // 0x0031
  69.     { 0x0032,                   "wm_sethotkey"            },  // 0x0032
  70.     { 0x0033,                   "wm_gethotkey"            },  // 0x0033
  71.     { 0x0034,                   "wm_filesyschange"        },  // 0x0034
  72.     { 0x0035,                   "wm_isactiveicon"         },  // 0x0035
  73.     { 0x0036,                   "wm_queryparkicon"        },  // 0x0036
  74.     { WM_QUERYDRAGICON,         "WM_QUERYDRAGICON"        },  // 0x0037
  75.     { WM_COMPAREITEM,           "WM_COMPAREITEM"          },  // 0x0039
  76.     { WM_COMPACTING,            "WM_COMPACTING"           },  // 0x0041
  77.     { 0x0042,                   "wm_otherwindowcreated"   },  // 0x0042
  78.     { 0x0043,                   "wm_otherwindowdestroyed" },  // 0x0043
  79.     { WM_COMMNOTIFY,            "WM_COMMNOTIFY"           },  // 0x0044
  80.     { WM_WINDOWPOSCHANGING,     "WM_WINDOWPOSCHANGING"    },  // 0x0046
  81.     { WM_WINDOWPOSCHANGED,      "WM_WINDOWPOSCHANGED"     },  // 0x0047
  82.     { WM_POWER,                 "WM_POWER"                },  // 0x0048
  83.     { WM_NCCREATE,              "WM_NCCREATE"             },  // 0x0081
  84.     { WM_NCDESTROY,             "WM_NCDESTROY"            },  // 0x0082
  85.     { WM_NCCALCSIZE,            "WM_NCCALCSIZE"           },  // 0x0083
  86.     { WM_NCHITTEST,             "WM_NCHITTEST"            },  // 0x0084
  87.     { WM_NCPAINT,               "WM_NCPAINT"              },  // 0x0085
  88.     { WM_NCACTIVATE,            "WM_NCACTIVATE"           },  // 0x0086
  89.     { WM_GETDLGCODE,            "WM_GETDLGCODE"           },  // 0x0087
  90.     { 0x0088,                   "wm_syncpaint"            },  // 0x0088
  91.     { 0x0089,                   "wm_synctask"             },  // 0x0089
  92.     { WM_NCMOUSEMOVE,           "WM_NCMOUSEMOVE"          },  // 0x00A0
  93.     { WM_NCLBUTTONDOWN,         "WM_NCLBUTTONDOWN"        },  // 0x00A1
  94.     { WM_NCLBUTTONUP,           "WM_NCLBUTTONUP"          },  // 0x00A2
  95.     { WM_NCLBUTTONDBLCLK,       "WM_NCLBUTTONDBLCLK"      },  // 0x00A3
  96.     { WM_NCRBUTTONDOWN,         "WM_NCRBUTTONDOWN"        },  // 0x00A4
  97.     { WM_NCRBUTTONUP,           "WM_NCRBUTTONUP"          },  // 0x00A5
  98.     { WM_NCRBUTTONDBLCLK,       "WM_NCRBUTTONDBLCLK"      },  // 0x00A6
  99.     { WM_NCMBUTTONDOWN,         "WM_NCMBUTTONDOWN"        },  // 0x00A7
  100.     { WM_NCMBUTTONUP,           "WM_NCMBUTTONUP"          },  // 0x00A8
  101.     { WM_NCMBUTTONDBLCLK,       "WM_NCMBUTTONDBLCLK"      },  // 0x00A9
  102.     { WM_KEYDOWN,               "WM_KEYDOWN"              },  // 0x0100
  103.     { WM_KEYUP,                 "WM_KEYUP"                },  // 0x0101
  104.     { WM_CHAR,                  "WM_CHAR"                 },  // 0x0102
  105.     { WM_SYSKEYDOWN,            "WM_SYSKEYDOWN"           },  // 0x0104
  106.     { WM_SYSKEYUP,              "WM_SYSKEYUP"             },  // 0x0105
  107.     { WM_SYSCHAR,               "WM_SYSCHAR"              },  // 0x0106
  108.     { WM_SYSDEADCHAR,           "WM_SYSDEADCHAR"          },  // 0x0107
  109.     { WM_INITDIALOG,            "WM_INITDIALOG"           },  // 0x0110
  110.     { WM_COMMAND,               "WM_COMMAND"              },  // 0x0111
  111.     { WM_SYSCOMMAND,            "WM_SYSCOMMAND"           },  // 0x0112
  112.     { WM_TIMER,                 "WM_TIMER"                },  // 0x0113
  113.     { WM_HSCROLL,               "WM_HSCROLL"              },  // 0x0114
  114.     { WM_VSCROLL,               "WM_VSCROLL"              },  // 0x0115
  115.     { WM_INITMENU,              "WM_INITMENU"             },  // 0x0116
  116.     { WM_INITMENUPOPUP,         "WM_INITMENUPOPUP"        },  // 0x0117
  117.     { 0x0118,                   "wm_systimer"             },  // 0x0118
  118.     { WM_MENUSELECT,            "WM_MENUSELECT"           },  // 0x011F
  119.     { WM_MENUCHAR,              "WM_MENUCHAR"             },  // 0x0120
  120.     { WM_ENTERIDLE,             "WM_ENTERIDLE"            },  // 0x0121
  121.     { 0x0131,                   "wm_lbtrackpoint"         },  // 0x0131
  122.     { WM_MOUSEMOVE,             "WM_MOUSEMOVE"            },  // 0x0200
  123.     { WM_LBUTTONDOWN,           "WM_LBUTTONDOWN"          },  // 0x0201
  124.     { WM_LBUTTONUP,             "WM_LBUTTONUP"            },  // 0x0202
  125.     { WM_LBUTTONDBLCLK,         "WM_LBUTTONDBLCLK"        },  // 0x0203
  126.     { WM_RBUTTONDOWN,           "WM_RBUTTONDOWN"          },  // 0x0204
  127.     { WM_RBUTTONUP,             "WM_RBUTTONUP"            },  // 0x0205
  128.     { WM_RBUTTONDBLCLK,         "WM_RBUTTONDBLCLK"        },  // 0x0206
  129.     { WM_MBUTTONDOWN,           "WM_MBUTTONDOWN"          },  // 0x0207
  130.     { WM_MBUTTONUP,             "WM_MBUTTONUP"            },  // 0x0208
  131.     { WM_MBUTTONDBLCLK,         "WM_MBUTTONDBLCLK"        },  // 0x0209
  132.     { WM_PARENTNOTIFY,          "WM_PARENTNOTIFY"         },  // 0x0210
  133.     { 0x0211,                   "wm_entermenuloop"        },  // 0x0211
  134.     { 0x0212,                   "wm_exitmenuloop"         },  // 0x0212
  135.     { WM_MDICREATE,             "WM_MDICREATE"            },  // 0x0220
  136.     { WM_MDIDESTROY,            "WM_MDIDESTROY"           },  // 0x0221
  137.     { WM_MDIACTIVATE,           "WM_MDIACTIVATE"          },  // 0x0222
  138.     { WM_MDIRESTORE,            "WM_MDIRESTORE"           },  // 0x0223
  139.     { WM_MDINEXT,               "WM_MDINEXT"              },  // 0x0224
  140.     { WM_MDIMAXIMIZE,           "WM_MDIMAXIMIZE"          },  // 0x0225
  141.     { WM_MDITILE,               "WM_MDITILE"              },  // 0x0226
  142.     { WM_MDICASCADE,            "WM_MDICASCADE"           },  // 0x0227
  143.     { WM_MDIICONARRANGE,        "WM_MDIICONARRANGE"       },  // 0x0228
  144.     { WM_MDIGETACTIVE,          "WM_MDIGETACTIVE"         },  // 0x0229
  145.     { 0x022A,                   "wm_dropobject"           },  // 0x022A
  146.     { 0x022B,                   "wm_querydropobject"      },  // 0x022B
  147.     { 0x022C,                   "wm_begindrag"            },  // 0x022C
  148.     { 0x022D,                   "wm_dragloop"             },  // 0x022D
  149.     { 0x022E,                   "wm_dragselect"           },  // 0x022E
  150.     { 0x022F,                   "wm_dragmove"             },  // 0x022F
  151.     { WM_MDISETMENU,            "WM_MDISETMENU"           },  // 0x0230
  152.     { 0x0231,                   "wm_entersizemove"        },  // 0x0231
  153.     { 0x0232,                   "wm_exitsizemove"         },  // 0x0232
  154.     { WM_DROPFILES,             "WM_DROPFILES"            },  // 0x0233
  155.     { WM_CUT,                   "WM_CUT"                  },  // 0x0300
  156.     { WM_COPY,                  "WM_COPY"                 },  // 0x0301
  157.     { WM_PASTE,                 "WM_PASTE"                },  // 0x0302
  158.     { WM_CLEAR,                 "WM_CLEAR"                },  // 0x0303
  159.     { WM_UNDO,                  "WM_UNDO"                 },  // 0x0304
  160.     { WM_RENDERFORMAT,          "WM_RENDERFORMAT"         },  // 0x0305
  161.     { WM_RENDERALLFORMATS,      "WM_RENDERALLFORMATS"     },  // 0x0306
  162.     { WM_DESTROYCLIPBOARD,      "WM_DESTROYCLIPBOARD"     },  // 0x0307
  163.     { WM_DRAWCLIPBOARD,         "WM_DRAWCLIPBOARD"        },  // 0x0308
  164.     { WM_PAINTCLIPBOARD,        "WM_PAINTCLIPBOARD"       },  // 0x0309
  165.     { WM_VSCROLLCLIPBOARD,      "WM_VSCROLLCLIPBOARD"     },  // 0x030A
  166.     { WM_SIZECLIPBOARD,         "WM_SIZECLIPBOARD"        },  // 0x030B
  167.     { WM_ASKCBFORMATNAME,       "WM_ASKCBFORMATNAME"      },  // 0x030C
  168.     { WM_CHANGECBCHAIN,         "WM_CHANGECBCHAIN"        },  // 0x030D
  169.     { WM_HSCROLLCLIPBOARD,      "WM_HSCROLLCLIPBOARD"     },  // 0x030E
  170.     { WM_QUERYNEWPALETTE,       "WM_QUERYNEWPALETTE"      },  // 0x030F
  171.     { WM_PALETTEISCHANGING,     "WM_PALETTEISCHANGING"    },  // 0x0310
  172.     { WM_PALETTECHANGED,        "WM_PALETTECHANGED"       },  // 0x0311
  173.   };
  174.  
  175.   //
  176.   // MsgCompare: this internal function is used by the qsort() and
  177.   // bsearch() functions to compare two StrTab elements.
  178.   //
  179.   static int
  180.   MsgCompare(const void* e1, const void* e2)
  181.   {
  182.     return ((WMSTR*)e1)->msg - ((WMSTR*)e2)->msg;
  183.   }
  184.  
  185.   ostream& operator <<(ostream& os, const MsgName& msg)
  186.   {
  187.     WMSTR  key;
  188.     WMSTR* item;
  189.  
  190.     // if it's a user message, then just show the offset value
  191.     if (msg.Message >= WM_USER)
  192.       return os << "WM_USER+" << hex << (msg.Message - WM_USER);
  193.  
  194.     // otherwise, search for it in the table
  195.     else {
  196.       // initialize the search key
  197.       key.msg = msg.Message;
  198.  
  199.       // let bsearch() do the work
  200.       item = (WMSTR*)bsearch(&key, StrTab, COUNTOF(StrTab), sizeof(WMSTR), MsgCompare);
  201.  
  202.       // if message found, then insert the name
  203.       if (item)
  204.         return os << item->str;
  205.  
  206.       // otherwise, just insert the message number
  207.       else
  208.         return os << "Message " << hex << msg.Message;
  209.     }
  210.   }
  211. #endif
  212.  
  213.  
  214. bool
  215. TEventHandler::Find(TEventInfo&, TEqualOperator)
  216. {
  217.   return false;
  218. }
  219.  
  220. LRESULT
  221. TEventHandler::Dispatch(TEventInfo& eventInfo, WPARAM wParam, LPARAM lParam)
  222. {
  223.   PRECONDITION(eventInfo.Entry);
  224.   return (*eventInfo.Entry->Dispatcher)(
  225.            *eventInfo.Object,
  226.            (TAnyPMF __RTFAR&)eventInfo.Entry->Pmf,
  227.            wParam, lParam
  228.          );
  229. }
  230.  
  231. bool
  232. TEventHandler::SearchEntries(TGenericTableEntry __RTFAR* entries,
  233.                              TEventInfo&         eventInfo,
  234.                              TEqualOperator      equal)
  235. {
  236.   if (equal) {
  237.     while (entries->Dispatcher != 0) {
  238.       if (equal(*entries, eventInfo)) {
  239.         eventInfo.Entry = entries;
  240.         return true;
  241.       }
  242.       entries++;
  243.     }
  244.   }
  245.   else {
  246.     while (entries->Dispatcher != 0) {
  247.       if (entries->Msg == eventInfo.Msg && entries->Id == eventInfo.Id) {
  248.         eventInfo.Entry = entries;
  249.         return true;
  250.       }
  251.       entries++;
  252.     }
  253.   }
  254.  
  255.   return false;
  256. }
  257.