// Static Create method called by the event tracker system // WinEvents are one throwns because items exist. so it makes sense to create the item and // check for details afterward. internal static void RaiseEvents (IntPtr hwnd, int eventId, object idProp, int idObject, int idChild) { ProxySimple el = null; switch (idObject) { case NativeMethods.OBJID_CLIENT : { WindowsTreeView wtv = new WindowsTreeView (hwnd, null, -1); // Selection or Expand/Collapse if (idChild != 0 && (eventId == NativeMethods.EventObjectSelection || eventId == NativeMethods.EventObjectSelectionRemove || eventId == NativeMethods.EventObjectSelectionAdd || eventId == NativeMethods.EventObjectStateChange || eventId == NativeMethods.EventObjectDestroy || eventId == NativeMethods.EventObjectCreate || eventId == NativeMethods.EventObjectNameChange)) { el = wtv.CreateParents(hwnd, TreeItemFromChildID(hwnd, idChild)); } else { el = wtv; } break; } case NativeMethods.OBJID_VSCROLL : case NativeMethods.OBJID_HSCROLL : break; default : el = new WindowsTreeView (hwnd, null, -1); break; } // Expand/Collapse is too peculiar per control to be processed in the dispatch code if (idProp == ExpandCollapsePattern.ExpandCollapseStateProperty && el is TreeViewItem && eventId == NativeMethods.EventObjectStateChange) { ((TreeViewItem) el).RaiseExpandCollapsedStateChangedEvent (); return; } // Special case for logical element change for a tree view item on Expand/Collapse if (((idProp as AutomationEvent) == AutomationElement.StructureChangedEvent && el is TreeViewItem) && !(eventId == NativeMethods.EventObjectDestroy || eventId == NativeMethods.EventObjectCreate)) { ((TreeViewItem) el).RaiseStructureChangedEvent (); return; } if (el != null) { el.DispatchEvents (eventId, idProp, idObject, idChild); } }
private static IRawElementProviderSimple Create(IntPtr hwnd, int idChild) { WindowsTreeView wtv = new WindowsTreeView(hwnd, null, 0); return idChild == 0 ? wtv : wtv.CreateParents(hwnd, TreeItemFromChildID(hwnd, idChild)); }