Exemplo n.º 1
0
            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();
                }
            }
Exemplo n.º 2
0
 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);
 }