// 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));
 }