internal IEnumUnknown EnumControls(Control ctl, OLECONTF dwOleContF, GC_WCH dwWhich) { GetComponents(); LockComponents(); try { ArrayList l = null; bool selected = (dwWhich & GC_WCH.FSELECTED) != 0; bool reverse = (dwWhich & GC_WCH.FREVERSEDIR) != 0; // Note that visual basic actually ignores the next/prev flags... we will not bool onlyNext = (dwWhich & GC_WCH.FONLYNEXT) != 0; bool onlyPrev = (dwWhich & GC_WCH.FONLYPREV) != 0; dwWhich &= ~(GC_WCH.FSELECTED | GC_WCH.FREVERSEDIR | GC_WCH.FONLYNEXT | GC_WCH.FONLYPREV); if (onlyNext && onlyPrev) { Debug.Fail("onlyNext && onlyPrev are both set!"); throw E_INVALIDARG; } if (dwWhich == GC_WCH.CONTAINER || dwWhich == GC_WCH.CONTAINED) { if (onlyNext || onlyPrev) { Debug.Fail("GC_WCH_FONLYNEXT or FONLYPREV used with CONTANER or CONATINED"); throw E_INVALIDARG; } } int first = 0; int last = -1; // meaning all Control[] ctls = null; switch (dwWhich) { default: Debug.Fail("Bad GC_WCH"); throw E_INVALIDARG; case GC_WCH.CONTAINED: ctls = ctl.GetChildControlsInTabOrder(false); ctl = null; break; case GC_WCH.SIBLING: Control p = ctl.ParentInternal; if (p != null) { ctls = p.GetChildControlsInTabOrder(false); if (onlyPrev) { last = ctl.TabIndex; } else if (onlyNext) { first = ctl.TabIndex + 1; } } else { ctls = Array.Empty <Control>(); } ctl = null; break; case GC_WCH.CONTAINER: l = new ArrayList(); MaybeAdd(l, ctl, selected, dwOleContF, false); while (ctl != null) { AxContainer cont = FindContainerForControl(ctl); if (cont != null) { MaybeAdd(l, cont.parent, selected, dwOleContF, true); ctl = cont.parent; } else { break; } } break; case GC_WCH.ALL: Hashtable htbl = GetComponents(); ctls = new Control[htbl.Keys.Count]; htbl.Keys.CopyTo(ctls, 0); ctl = parent; break; } if (l is null) { l = new ArrayList(); if (last == -1 && ctls != null) { last = ctls.Length; } if (ctl != null) { MaybeAdd(l, ctl, selected, dwOleContF, false); } for (int i = first; i < last; i++) { MaybeAdd(l, ctls[i], selected, dwOleContF, false); } } object[] rval = new object[l.Count]; l.CopyTo(rval, 0); if (reverse) { for (int i = 0, j = rval.Length - 1; i < j; i++, j--) { object temp = rval[i]; rval[i] = rval[j]; rval[j] = temp; } } return(new EnumUnknown(rval)); } finally { UnlockComponents(); } }
unsafe HRESULT IVBGetControl.EnumControls(OLECONTF dwOleContF, GC_WCH dwWhich, out IEnumUnknown ppenum) { Debug.WriteLineIf(AxHTraceSwitch.TraceVerbose, "in EnumControls"); ppenum = host.GetParentContainer().EnumControls(host, dwOleContF, dwWhich); return(HRESULT.S_OK); }