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);
                            }
                        }
                    }
                    StateRefreshChanges IBranch.ToggleState(int row, int column)
                    {
                        GroupingTypeData typeData = myGroupTypeData[row];

                        if (0 != (typeData.SelectionState & GroupingTypeSelectionState.CurrentlySelected))
                        {
                            typeData.SelectionState &= ~GroupingTypeSelectionState.CurrentlySelected;
                        }
                        else
                        {
                            typeData.SelectionState |= GroupingTypeSelectionState.CurrentlySelected;
                        }
                        myGroupTypeData[row] = typeData;
                        return(StateRefreshChanges.Current);
                    }
 /// <summary>
 /// Apply changes based on the selection state
 /// </summary>
 public void ApplyChanges()
 {
     GroupingTypeData[] types = myGroupTypeData;
     if (types != null)
     {
         int  typeCount  = types.Length;
         bool hasChanges = false;
         for (int i = 0; i < typeCount; ++i)
         {
             GroupingTypeSelectionState selectionState = types[i].SelectionState;
             if ((0 == (selectionState & GroupingTypeSelectionState.InitiallySelected)) != (0 == (selectionState & GroupingTypeSelectionState.CurrentlySelected)))
             {
                 hasChanges = true;
                 break;
             }
         }
         if (hasChanges)
         {
             ElementGrouping grouping = myContextGrouping;
             Store           store    = grouping.Store;
             using (Transaction t = store.TransactionManager.BeginTransaction(ResourceStrings.ElementGroupingTypesPropertyDescriptorTransactionName))
             {
                 for (int i = 0; i < typeCount; ++i)
                 {
                     GroupingTypeData           type           = types[i];
                     GroupingTypeSelectionState selectionState = type.SelectionState;
                     bool typeAdded;
                     if ((typeAdded = (0 == (selectionState & GroupingTypeSelectionState.InitiallySelected))) != (0 == (selectionState & GroupingTypeSelectionState.CurrentlySelected)))
                     {
                         if (typeAdded)
                         {
                             ((ElementGroupingType)store.ElementFactory.CreateElement(type.GroupingTypeClassInfo)).Grouping = grouping;
                         }
                         else
                         {
                             type.GroupingTypeInstance.Delete();
                         }
                     }
                 }
                 t.Commit();
             }
         }
     }
 }
                    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);
                    }