home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c083 / 11.ddi / OWLSRC.PAK / EVENTHAN.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-02  |  13.4 KB  |  256 lines

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