#ifndef __ACCESSIBLE_H #define __ACCESSIBLE_H #include // Message sent to the OS window in order to retrieve an accessibility interface #define WM_GETOBJECT 0x003D // undef some stuff we're gonna #define ourselves #ifdef OBJID_WINDOW #undef OBJID_WINDOW #endif #ifdef OBJID_SYSMENU #undef OBJID_SYSMENU #endif #ifdef OBJID_TITLEBAR #undef OBJID_TITLEBAR #endif #ifdef OBJID_MENU #undef OBJID_MENU #endif #ifdef OBJID_CLIENT #undef OBJID_CLIENT #endif #ifdef OBJID_VSCROLL #undef OBJID_VSCROLL #endif #ifdef OBJID_HSCROLL #undef OBJID_HSCROLL #endif #ifdef OBJID_SIZEGRIP #undef OBJID_SIZEGRIP #endif #ifdef OBJID_CARET #undef OBJID_CARET #endif #ifdef OBJID_CURSOR #undef OBJID_CURSOR #endif #ifdef OBJID_ALERT #undef OBJID_ALERT #endif #ifdef OBJID_SOUND #undef OBJID_SOUND #endif #ifdef STATE_SYSTEM_VALID #undef STATE_SYSTEM_VALID #endif // STATE_SYSTEM_VALID // Accessibility system object IDs #define OBJID_WINDOW 0x00000000 #define OBJID_SYSMENU 0xFFFFFFFF #define OBJID_TITLEBAR 0xFFFFFFFE #define OBJID_MENU 0xFFFFFFFD #define OBJID_CLIENT 0xFFFFFFFC #define OBJID_VSCROLL 0xFFFFFFFB #define OBJID_HSCROLL 0xFFFFFFFA #define OBJID_SIZEGRIP 0xFFFFFFF9 #define OBJID_CARET 0xFFFFFFF8 #define OBJID_CURSOR 0xFFFFFFF7 #define OBJID_ALERT 0xFFFFFFF6 #define OBJID_SOUND 0xFFFFFFF5 #if 0 #define ROLE_SYSTEM_TITLEBAR 0x00000001 #define ROLE_SYSTEM_MENUBAR 0x00000002 #define ROLE_SYSTEM_SCROLLBAR 0x00000003 #define ROLE_SYSTEM_GRIP 0x00000004 #define ROLE_SYSTEM_SOUND 0x00000005 #define ROLE_SYSTEM_CURSOR 0x00000006 #define ROLE_SYSTEM_CARET 0x00000007 #define ROLE_SYSTEM_ALERT 0x00000008 #define ROLE_SYSTEM_WINDOW 0x00000009 #define ROLE_SYSTEM_CLIENT 0x0000000A #define ROLE_SYSTEM_MENUPOPUP 0x0000000B #define ROLE_SYSTEM_MENUITEM 0x0000000C #define ROLE_SYSTEM_TOOLTIP 0x0000000D #define ROLE_SYSTEM_APPLICATION 0x0000000E #define ROLE_SYSTEM_DOCUMENT 0x0000000F #define ROLE_SYSTEM_PANE 0x00000010 #define ROLE_SYSTEM_CHART 0x00000011 #define ROLE_SYSTEM_DIALOG 0x00000012 #define ROLE_SYSTEM_BORDER 0x00000013 #define ROLE_SYSTEM_GROUPING 0x00000014 #define ROLE_SYSTEM_SEPARATOR 0x00000015 #define ROLE_SYSTEM_TOOLBAR 0x00000016 #define ROLE_SYSTEM_STATUSBAR 0x00000017 #define ROLE_SYSTEM_TABLE 0x00000018 #define ROLE_SYSTEM_COLUMNHEADER 0x00000019 #define ROLE_SYSTEM_ROWHEADER 0x0000001A #define ROLE_SYSTEM_COLUMN 0x0000001B #define ROLE_SYSTEM_ROW 0x0000001C #define ROLE_SYSTEM_CELL 0x0000001D #define ROLE_SYSTEM_LINK 0x0000001E #define ROLE_SYSTEM_HELPBALLOON 0x0000001F #define ROLE_SYSTEM_CHARACTER 0x00000020 #define ROLE_SYSTEM_LIST 0x00000021 #define ROLE_SYSTEM_LISTITEM 0x00000022 #define ROLE_SYSTEM_OUTLINE 0x00000023 #define ROLE_SYSTEM_OUTLINEITEM 0x00000024 #define ROLE_SYSTEM_PAGETAB 0x00000025 #define ROLE_SYSTEM_PROPERTYPAGE 0x00000026 #define ROLE_SYSTEM_INDICATOR 0x00000027 #define ROLE_SYSTEM_GRAPHIC 0x00000028 #define ROLE_SYSTEM_STATICTEXT 0x00000029 #define ROLE_SYSTEM_TEXT 0x0000002A // Editable, selectable, etc. #define ROLE_SYSTEM_PUSHBUTTON 0x0000002B #define ROLE_SYSTEM_CHECKBUTTON 0x0000002C #define ROLE_SYSTEM_RADIOBUTTON 0x0000002D #define ROLE_SYSTEM_COMBOBOX 0x0000002E #define ROLE_SYSTEM_DROPLIST 0x0000002F #define ROLE_SYSTEM_PROGRESSBAR 0x00000030 #define ROLE_SYSTEM_DIAL 0x00000031 #define ROLE_SYSTEM_HOTKEYFIELD 0x00000032 #define ROLE_SYSTEM_SLIDER 0x00000033 #define ROLE_SYSTEM_SPINBUTTON 0x00000034 #define ROLE_SYSTEM_DIAGRAM 0x00000035 #define ROLE_SYSTEM_ANIMATION 0x00000036 #define ROLE_SYSTEM_EQUATION 0x00000037 #define ROLE_SYSTEM_BUTTONDROPDOWN 0x00000038 #define ROLE_SYSTEM_BUTTONMENU 0x00000039 #define ROLE_SYSTEM_BUTTONDROPDOWNGRID 0x0000003A #define ROLE_SYSTEM_WHITESPACE 0x0000003B #define ROLE_SYSTEM_PAGETABLIST 0x0000003C #define ROLE_SYSTEM_CLOCK 0x0000003D #endif #define STATE_SYSTEM_UNAVAILABLE 0x00000001 // Disabled #define STATE_SYSTEM_SELECTED 0x00000002 #define STATE_SYSTEM_FOCUSED 0x00000004 #define STATE_SYSTEM_PRESSED 0x00000008 #define STATE_SYSTEM_CHECKED 0x00000010 #define STATE_SYSTEM_MIXED 0x00000020 // 3-state checkbox or toolbar button #define STATE_SYSTEM_READONLY 0x00000040 #define STATE_SYSTEM_HOTTRACKED 0x00000080 #define STATE_SYSTEM_DEFAULT 0x00000100 #define STATE_SYSTEM_EXPANDED 0x00000200 #define STATE_SYSTEM_COLLAPSED 0x00000400 #define STATE_SYSTEM_BUSY 0x00000800 #define STATE_SYSTEM_FLOATING 0x00001000 // Children "owned" not "contained" by parent #define STATE_SYSTEM_MARQUEED 0x00002000 #define STATE_SYSTEM_ANIMATED 0x00004000 #define STATE_SYSTEM_INVISIBLE 0x00008000 #define STATE_SYSTEM_OFFSCREEN 0x00010000 #define STATE_SYSTEM_SIZEABLE 0x00020000 #define STATE_SYSTEM_MOVEABLE 0x00040000 #define STATE_SYSTEM_SELFVOICING 0x00080000 #define STATE_SYSTEM_FOCUSABLE 0x00100000 #define STATE_SYSTEM_SELECTABLE 0x00200000 #define STATE_SYSTEM_LINKED 0x00400000 #define STATE_SYSTEM_TRAVERSED 0x00800000 #define STATE_SYSTEM_MULTISELECTABLE 0x01000000 // Supports multiple selection #define STATE_SYSTEM_EXTSELECTABLE 0x02000000 // Supports extended selection #define STATE_SYSTEM_ALERT_LOW 0x04000000 // This information is of low priority #define STATE_SYSTEM_ALERT_MEDIUM 0x08000000 // This information is of medium priority #define STATE_SYSTEM_ALERT_HIGH 0x10000000 // This information is of high priority #define STATE_SYSTEM_VALID 0x1FFFFFFF /* * Reserved IDs for system objects */ #define OBJID_WINDOW 0x00000000 #define OBJID_SYSMENU 0xFFFFFFFF #define OBJID_TITLEBAR 0xFFFFFFFE #define OBJID_MENU 0xFFFFFFFD #define OBJID_CLIENT 0xFFFFFFFC #define OBJID_VSCROLL 0xFFFFFFFB #define OBJID_HSCROLL 0xFFFFFFFA #define OBJID_SIZEGRIP 0xFFFFFFF9 #define OBJID_CARET 0xFFFFFFF8 #define OBJID_CURSOR 0xFFFFFFF7 #define OBJID_ALERT 0xFFFFFFF6 #define OBJID_SOUND 0xFFFFFFF5 /* * EVENT DEFINITION */ #define EVENT_MIN 0x00000001 #define EVENT_MAX 0x7FFFFFFF /* * EVENT_SYSTEM_SOUND * Sent when a sound is played. Currently nothing is generating this, we * this event when a system sound (for menus, etc) is played. Apps * generate this, if accessible, when a private sound is played. For * example, if Mail plays a "New Mail" sound. * * System Sounds: * (Generated by PlaySoundEvent in USER itself) * hwnd is NULL * idObject is OBJID_SOUND * idChild is sound child ID if one * App Sounds: * (PlaySoundEvent won't generate notification; up to app) * hwnd + idObject gets interface pointer to Sound object * idChild identifies the sound in question * are going to be cleaning up the SOUNDSENTRY feature in the control panel * and will use this at that time. Applications implementing WinEvents * are perfectly welcome to use it. Clients of IAccessible* will simply * turn around and get back a non-visual object that describes the sound. */ #define EVENT_SYSTEM_SOUND 0x0001 /* * EVENT_SYSTEM_ALERT * System Alerts: * (Generated by MessageBox() calls for example) * hwnd is hwndMessageBox * idObject is OBJID_ALERT * App Alerts: * (Generated whenever) * hwnd+idObject gets interface pointer to Alert */ #define EVENT_SYSTEM_ALERT 0x0002 /* * EVENT_SYSTEM_FOREGROUND * Sent when the foreground (active) window changes, even if it is changing * to another window in the same thread as the previous one. * hwnd is hwndNewForeground * idObject is OBJID_WINDOW * idChild is INDEXID_OBJECT */ #define EVENT_SYSTEM_FOREGROUND 0x0003 /* * Menu * hwnd is window (top level window or popup menu window) * idObject is ID of control (OBJID_MENU, OBJID_SYSMENU, OBJID_SELF for popup) * idChild is CHILDID_SELF * * EVENT_SYSTEM_MENUSTART * EVENT_SYSTEM_MENUEND * For MENUSTART, hwnd+idObject+idChild refers to the control with the menu bar, * or the control bringing up the context menu. * * Sent when entering into and leaving from menu mode (system, app bar, and * track popups). */ #define EVENT_SYSTEM_MENUSTART 0x0004 #define EVENT_SYSTEM_MENUEND 0x0005 /* * EVENT_SYSTEM_MENUPOPUPSTART * EVENT_SYSTEM_MENUPOPUPEND * Sent when a menu popup comes up and just before it is taken down. Note * that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART * followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup * being shown. * * For MENUPOPUP, hwnd+idObject+idChild refers to the NEW popup coming up, not the * parent item which is hierarchical. You can get the parent menu/popup by * asking for the accParent object. */ #define EVENT_SYSTEM_MENUPOPUPSTART 0x0006 #define EVENT_SYSTEM_MENUPOPUPEND 0x0007 /* * EVENT_SYSTEM_CAPTURESTART * EVENT_SYSTEM_CAPTUREEND * Sent when a window takes the capture and releases the capture. */ #define EVENT_SYSTEM_CAPTURESTART 0x0008 #define EVENT_SYSTEM_CAPTUREEND 0x0009 /* * Move Size * EVENT_SYSTEM_MOVESIZESTART * EVENT_SYSTEM_MOVESIZEEND * Sent when a window enters and leaves move-size dragging mode. */ #define EVENT_SYSTEM_MOVESIZESTART 0x000A #define EVENT_SYSTEM_MOVESIZEEND 0x000B /* * Context Help * EVENT_SYSTEM_CONTEXTHELPSTART * EVENT_SYSTEM_CONTEXTHELPEND * Sent when a window enters and leaves context sensitive help mode. */ #define EVENT_SYSTEM_CONTEXTHELPSTART 0x000C #define EVENT_SYSTEM_CONTEXTHELPEND 0x000D /* * Drag & Drop * EVENT_SYSTEM_DRAGDROPSTART * EVENT_SYSTEM_DRAGDROPEND * Send the START notification just before going into drag&drop loop. Send * the END notification just after canceling out. * Note that it is up to apps and OLE to generate this, since the system * doesn't know. Like EVENT_SYSTEM_SOUND, it will be a while before this * is prevalent. */ #define EVENT_SYSTEM_DRAGDROPSTART 0x000E #define EVENT_SYSTEM_DRAGDROPEND 0x000F /* * Dialog * Send the START notification right after the dialog is completely * initialized and visible. Send the END right before the dialog * is hidden and goes away. * EVENT_SYSTEM_DIALOGSTART * EVENT_SYSTEM_DIALOGEND */ #define EVENT_SYSTEM_DIALOGSTART 0x0010 #define EVENT_SYSTEM_DIALOGEND 0x0011 /* * EVENT_SYSTEM_SCROLLING * EVENT_SYSTEM_SCROLLINGSTART * EVENT_SYSTEM_SCROLLINGEND * Sent when beginning and ending the tracking of a scrollbar in a window, * and also for scrollbar controls. */ #define EVENT_SYSTEM_SCROLLINGSTART 0x0012 #define EVENT_SYSTEM_SCROLLINGEND 0x0013 /* * Alt-Tab Window * Send the START notification right after the switch window is initialized * and visible. Send the END right before it is hidden and goes away. * EVENT_SYSTEM_SWITCHSTART * EVENT_SYSTEM_SWITCHEND */ #define EVENT_SYSTEM_SWITCHSTART 0x0014 #define EVENT_SYSTEM_SWITCHEND 0x0015 /* * EVENT_SYSTEM_MINIMIZESTART * EVENT_SYSTEM_MINIMIZEEND * Sent when a window minimizes and just before it restores. */ #define EVENT_SYSTEM_MINIMIZESTART 0x0016 #define EVENT_SYSTEM_MINIMIZEEND 0x0017 /* * Object events * * The system AND apps generate these. The system generates these for * real windows. Apps generate these for objects within their window which * act like a separate control, e.g. an item in a list view. * * When the system generate them, dwParam2 is always WMOBJID_SELF. When * apps generate them, apps put the has-meaning-to-the-app-only ID value * in dwParam2. * For all events, if you want detailed accessibility information, callers * should * * Call AccessibleObjectFromWindow() with the hwnd, idObject parameters * of the event, and IID_IAccessible as the REFIID, to get back an * IAccessible* to talk to * * Initialize and fill in a VARIANT as VT_I4 with lVal the idChild * parameter of the event. * * If idChild isn't zero, call get_accChild() in the container to see * if the child is an object in its own right. If so, you will get * back an IDispatch* object for the child. You should release the * parent, and call QueryInterface() on the child object to get its * IAccessible*. Then you talk directly to the child. Otherwise, * if get_accChild() returns you nothing, you should continue to * use the child VARIANT. You will ask the container for the properties * of the child identified by the VARIANT. In other words, the * child in this case is accessible but not a full-blown object. * Like a button on a titlebar which is 'small' and has no children. */ /* * For all EVENT_OBJECT events, * hwnd is the dude to Send the WM_GETOBJECT message to (unless NULL, * see above for system things) * idObject is the ID of the object that can resolve any queries a * client might have. It's a way to deal with windowless controls, * controls that are just drawn on the screen in some larger parent * window (like SDM), or standard frame elements of a window. * idChild is the piece inside of the object that is affected. This * allows clients to access things that are too small to have full * blown objects in their own right. Like the thumb of a scrollbar. * The hwnd/idObject pair gets you to the container, the dude you * probably want to talk to most of the time anyway. The idChild * can then be passed into the acc properties to get the name/value * of it as needed. * * Example #1: * System propagating a listbox selection change * EVENT_OBJECT_SELECTION * hwnd == listbox hwnd * idObject == OBJID_WINDOW * idChild == new selected item, or CHILDID_SELF if * nothing now selected within container. * Word '97 propagating a listbox selection change * hwnd == SDM window * idObject == SDM ID to get at listbox 'control' * idChild == new selected item, or CHILDID_SELF if * nothing * * Example #2: * System propagating a menu item selection on the menu bar * EVENT_OBJECT_SELECTION * hwnd == top level window * idObject == OBJID_MENU * idChild == ID of child menu bar item selected * * Example #3: * System propagating a dropdown coming off of said menu bar item * EVENT_OBJECT_CREATE * hwnd == popup item * idObject == OBJID_WINDOW * idChild == CHILDID_SELF * * Example #4: * * For EVENT_OBJECT_REORDER, the object referred to by hwnd/idObject is the * PARENT container in which the zorder is occurring. This is because if * one child is zordering, all of them are changing their relative zorder. */ #define EVENT_OBJECT_CREATE 0x8000 // hwnd + ID + idChild is created item #define EVENT_OBJECT_DESTROY 0x8001 // hwnd + ID + idChild is destroyed item #define EVENT_OBJECT_SHOW 0x8002 // hwnd + ID + idChild is shown item #define EVENT_OBJECT_HIDE 0x8003 // hwnd + ID + idChild is hidden item #define EVENT_OBJECT_REORDER 0x8004 // hwnd + ID + idChild is parent of zordering children /* * NOTE: * Minimize the number of notifications! * * When you are hiding a parent object, obviously all child objects are no * longer visible on screen. They still have the same "visible" status, * but are not truly visible. Hence do not send HIDE notifications for the * children also. One implies all. The same goes for SHOW. */ #define EVENT_OBJECT_FOCUS 0x8005 // hwnd + ID + idChild is focused item #define EVENT_OBJECT_SELECTION 0x8006 // hwnd + ID + idChild is selected item (if only one), or idChild is OBJID_WINDOW if complex #define EVENT_OBJECT_SELECTIONADD 0x8007 // hwnd + ID + idChild is item added #define EVENT_OBJECT_SELECTIONREMOVE 0x8008 // hwnd + ID + idChild is item removed #define EVENT_OBJECT_SELECTIONWITHIN 0x8009 // hwnd + ID + idChild is parent of changed selected items /* * NOTES: * There is only one "focused" child item in a parent. This is the place * keystrokes are going at a given moment. Hence only send a notification * about where the NEW focus is going. A NEW item getting the focus already * implies that the OLD item is losing it. * * SELECTION however can be multiple. Hence the different SELECTION * notifications. Here's when to use each: * * (1) Send a SELECTION notification in the simple single selection * case (like the focus) when the item with the selection is * merely moving to a different item within a container. hwnd + ID * is the container control, idChildItem is the new child with the * selection. * * (2) Send a SELECTIONADD notification when a new item has simply been added * to the selection within a container. This is appropriate when the * number of newly selected items is very small. hwnd + ID is the * container control, idChildItem is the new child added to the selection. * * (3) Send a SELECTIONREMOVE notification when a new item has simply been * removed from the selection within a container. This is appropriate * when the number of newly selected items is very small, just like * SELECTIONADD. hwnd + ID is the container control, idChildItem is the * new child removed from the selection. * * (4) Send a SELECTIONWITHIN notification when the selected items within a * control have changed substantially. Rather than propagate a large * number of changes to reflect removal for some items, addition of * others, just tell somebody who cares that a lot happened. It will * be faster an easier for somebody watching to just turn around and * query the container control what the new bunch of selected items * are. */ #define EVENT_OBJECT_STATECHANGE 0x800A // hwnd + ID + idChild is item w/ state change /* * Examples of when to send an EVENT_OBJECT_STATECHANGE include * * It is being enabled/disabled (USER does for windows) * * It is being pressed/released (USER does for buttons) * * It is being checked/unchecked (USER does for radio/check buttons) */ #define EVENT_OBJECT_LOCATIONCHANGE 0x800B // hwnd + ID + idChild is moved/sized item /* * Note: * A LOCATIONCHANGE is not sent for every child object when the parent * changes shape/moves. Send one notification for the topmost object * that is changing. For example, if the user resizes a top level window, * USER will generate a LOCATIONCHANGE for it, but not for the menu bar, * title bar, scrollbars, etc. that are also changing shape/moving. * * In other words, it only generates LOCATIONCHANGE notifications for * real windows that are moving/sizing. It will not generate a LOCATIONCHANGE * for every non-floating child window when the parent moves (the children are * logically moving also on screen, but not relative to the parent). * * Now, if the app itself resizes child windows as a result of being * sized, USER will generate LOCATIONCHANGEs for those dudes also because * it doesn't know better. * * Note also that USER will generate LOCATIONCHANGE notifications for two * non-window sys objects: * (1) System caret * (2) Cursor */ #define EVENT_OBJECT_NAMECHANGE 0x800C // hwnd + ID + idChild is item w/ name change #define EVENT_OBJECT_DESCRIPTIONCHANGE 0x800D // hwnd + ID + idChild is item w/ desc change #define EVENT_OBJECT_VALUECHANGE 0x800E // hwnd + ID + idChild is item w/ value change #define EVENT_OBJECT_PARENTCHANGE 0x800F // hwnd + ID + idChild is item w/ new parent #define EVENT_OBJECT_HELPCHANGE 0x8010 // hwnd + ID + idChild is item w/ help change #define EVENT_OBJECT_DEFACTIONCHANGE 0x8011 // hwnd + ID + idChild is item w/ def action change #define EVENT_OBJECT_ACCELERATORCHANGE 0x8012 // hwnd + ID + idChild is item w/ keybd accel change #ifdef WIN32 WINUSERAPI VOID WINAPI NotifyWinEvent( DWORD event, HWND hwnd, LONG idObject, LONG idChild); #endif #include struct IAccessible; class Accessible : public Dispatchable { public: IAccessible *getIAccessible(); #ifdef _WIN32 HRESULT getOSHandle(int p); #endif void release(); void addRef(); int getNumRefs(); void onGetFocus(int idx=-1); void onStateChange(int idx=-1); void onSetName(const wchar_t *newname, int idx=-1); OSWINDOWHANDLE getOSWnd(); int flattenContent(OSWINDOWHANDLE *w); enum { ACCESSIBLE_GETIACCESSIBLE=10, ACCESSIBLE_GETOSHANDLE=20, ACCESSIBLE_ADDREF=30, ACCESSIBLE_RELEASE=40, ACCESSIBLE_GETNUMREFS=50, ACCESSIBLE_ONGETFOCUS=60, ACCESSIBLE_ONSETNAME=70, ACCESSIBLE_GETOSWND=80, ACCESSIBLE_ONSTATECHANGE=90, ACCESSIBLE_FLATTENCONTENT=100, }; }; inline IAccessible *Accessible::getIAccessible() { return _call(ACCESSIBLE_GETIACCESSIBLE, (IAccessible *)NULL); } #ifdef _WIN32 inline HRESULT Accessible::getOSHandle(int p) { return _call(ACCESSIBLE_GETOSHANDLE, (HRESULT)NULL, p); } #endif inline void Accessible::addRef() { _voidcall(ACCESSIBLE_ADDREF); } inline void Accessible::release() { _voidcall(ACCESSIBLE_RELEASE); } inline int Accessible::getNumRefs() { return _call(ACCESSIBLE_GETNUMREFS, 0); } inline void Accessible::onGetFocus(int idx/* =-1 */) { _voidcall(ACCESSIBLE_ONGETFOCUS, idx); } inline void Accessible::onSetName(const wchar_t *name, int idx) { _voidcall(ACCESSIBLE_ONSETNAME, name, idx); } inline OSWINDOWHANDLE Accessible::getOSWnd() { return _call(ACCESSIBLE_GETOSWND, (OSWINDOWHANDLE)NULL); } inline void Accessible::onStateChange(int idx/* =-1 */) { _voidcall(ACCESSIBLE_ONSTATECHANGE, idx); } inline int Accessible::flattenContent(OSWINDOWHANDLE *w) { return _call(ACCESSIBLE_FLATTENCONTENT, 0, w); } class AccessibleI : public Accessible { public: AccessibleI() {} virtual ~AccessibleI() {} virtual IAccessible *getIAccessible()=0; #ifdef _WIN32 virtual HRESULT getOSHandle(int p)=0; #endif virtual void release()=0; virtual void addRef()=0; virtual int getNumRefs()=0; virtual void onGetFocus(int idx=-1)=0; virtual void onSetName(const wchar_t *name, int idx)=0; virtual OSWINDOWHANDLE getOSWnd()=0; virtual void onStateChange(int idx=-1)=0; virtual int flattenContent(OSWINDOWHANDLE *w)=0; protected: RECVS_DISPATCH; }; #endif