public GroupingTypesBranch(ElementGrouping grouping)
                    {
                        myContextGrouping = grouping;
                        Store store = grouping.Store;
                        ReadOnlyCollection <DomainClassInfo> groupTypes = store.DomainDataDirectory.GetDomainClass(ElementGroupingType.DomainClassId).AllDescendants;
                        int groupTypeCount = groupTypes.Count;

                        if (groupTypeCount != 0)
                        {
                            int concreteGroupTypeCount = 0;
                            for (int i = 0; i < groupTypeCount; ++i)
                            {
                                if (!groupTypes[i].ImplementationClass.IsAbstract)
                                {
                                    ++concreteGroupTypeCount;
                                }
                            }
                            if (concreteGroupTypeCount != 0)
                            {
                                LinkedElementCollection <ElementGroupingType> currentTypeInstances = grouping.GroupingTypeCollection;
                                int currentTypeInstanceCount = currentTypeInstances.Count;
                                GroupingTypeData[] typeData  = new GroupingTypeData[concreteGroupTypeCount];
                                int nextTypeData             = 0;
                                for (int i = 0; i < groupTypeCount; ++i)
                                {
                                    DomainClassInfo groupType = groupTypes[i];
                                    if (!groupType.ImplementationClass.IsAbstract)
                                    {
                                        ElementGroupingType matchingTypeInstance = null;
                                        for (int j = 0; j < currentTypeInstanceCount; ++j)
                                        {
                                            ElementGroupingType testInstance = currentTypeInstances[j];
                                            if (testInstance.GetDomainClass() == groupType)
                                            {
                                                matchingTypeInstance = testInstance;
                                            }
                                        }
                                        typeData[nextTypeData] = new GroupingTypeData(matchingTypeInstance, groupType);
                                        ++nextTypeData;
                                    }
                                }
                                if (concreteGroupTypeCount > 1)
                                {
                                    Array.Sort <GroupingTypeData>(
                                        typeData,
                                        delegate(GroupingTypeData left, GroupingTypeData right)
                                    {
                                        return(string.Compare(left.DisplayName, right.DisplayName, StringComparison.CurrentCultureIgnoreCase));
                                    });
                                }
                                myGroupTypeData = typeData;
                                myGlyphProvider = SurveyGroupingTypeGlyph.GetStoreInstance(store);
                            }
                        }
                    }
                    VirtualTreeDisplayData IBranch.GetDisplayData(int row, int column, VirtualTreeDisplayDataMasks requiredData)
                    {
                        SurveyGroupingTypeGlyph glyphProvider = myGlyphProvider;
                        GroupingTypeData        typeData      = myGroupTypeData[row];
                        VirtualTreeDisplayData  retVal        = VirtualTreeDisplayData.Empty;

                        if (0 != (typeData.SelectionState & GroupingTypeSelectionState.CurrentlySelected))
                        {
                            retVal.Bold            = true;
                            retVal.StateImageIndex = (short)StandardCheckBoxImage.CheckedFlat;
                        }
                        else
                        {
                            retVal.StateImageIndex = (short)StandardCheckBoxImage.UncheckedFlat;
                        }
                        retVal.ImageList     = glyphProvider.GroupingTypeImages;
                        retVal.SelectedImage = retVal.Image = (short)glyphProvider.GetGroupingTypeIndex(typeData.GroupingTypeClassInfo);
                        return(retVal);
                    }