/// <summary>
        /// Ensures all of the ItemSet categories are valid.
        /// </summary>
        /// <param name="categories">The categories that the ItemSet contains.</param>
        protected void CheckCategories(IItemCategoryIdentifier[] categories)
        {
            var categoryItemSets = m_ItemSetManager.CategoryItemSets;

            if (categoryItemSets == null)
            {
                return;
            }

            for (int i = categoryItemSets.Length - 1; i >= 0; --i)
            {
                var hasCategory = false;
                for (int j = 0; j < categories.Length; ++j)
                {
                    if (categoryItemSets[i].CategoryID == categories[j].ID && IsItemSetCategory(categories[j]))
                    {
                        if (categoryItemSets[i].CategoryName != categories[j].ToString())
                        {
                            categoryItemSets[i].CategoryName = categories[j].ToString();
                            GUI.changed = true;
                        }
                        if (categoryItemSets[i].ItemCategory != categories[j])
                        {
                            categoryItemSets[i].ItemCategory = categories[j];
                            GUI.changed = true;
                        }
                        hasCategory = true;
                        break;
                    }
                }
                if (!hasCategory)
                {
                    var categoryList = new List <CategoryItemSet>(categoryItemSets);
                    categoryList.RemoveAt(i);
                    m_ItemSetManager.CategoryItemSets = categoryItemSets = categoryList.ToArray();
                    m_ItemSetReorderableList          = null;
                    GUI.changed = true;
                }
            }

            var nonItemSetCategoryCount = 0;

            for (int i = 0; i < categories.Length; ++i)
            {
                if (!IsItemSetCategory(categories[i]))
                {
                    nonItemSetCategoryCount++;
                }
            }

            // The number of categories must match.
            var diff = categories.Length - nonItemSetCategoryCount - categoryItemSets.Length;

            if (diff > 0)
            {
                System.Array.Resize(ref categoryItemSets, categoryItemSets.Length + diff);
                for (int i = categoryItemSets.Length - diff; i < categoryItemSets.Length; ++i)
                {
                    // A category has been added. Populate the new category.
                    for (int j = 0; j < categories.Length; ++j)
                    {
                        if (!IsItemSetCategory(categories[j]))
                        {
                            continue;
                        }
                        var hasCategory = false;
                        for (int k = 0; k < categoryItemSets.Length; ++k)
                        {
                            if (categoryItemSets[k] != null && categoryItemSets[k].CategoryID == categories[j].ID)
                            {
                                hasCategory = true;
                                break;
                            }
                        }
                        // Don't add an existing category.
                        if (hasCategory)
                        {
                            continue;
                        }
                        categoryItemSets[i] = new CategoryItemSet(categories[j].ID, categories[j].ToString(), categories[j]);
                        break;
                    }
                }
                m_ItemSetManager.CategoryItemSets = categoryItemSets;
                m_ItemSetReorderableList          = null;
                GUI.changed = true;
            }
            else if (diff < 0)
            {
                var updatedCategoryItemSets = new CategoryItemSet[categoryItemSets.Length + diff];
                var insertCount             = 0;
                // Remove the ItemSet that no longer has a category.
                for (int i = 0; i < categoryItemSets.Length; ++i)
                {
                    var categoryID  = categoryItemSets[i].CategoryID;
                    var hasCategory = false;
                    for (int j = 0; j < categories.Length; ++j)
                    {
                        if (categoryID == categories[j].ID && IsItemSetCategory(categories[j]))
                        {
                            hasCategory = true;
                            break;
                        }
                    }
                    // Add the CategoryItemSet to the list if it exists. If the category ID no longer exists then don't transfer it to the new array.
                    if (hasCategory)
                    {
                        updatedCategoryItemSets[insertCount] = categoryItemSets[i];
                        insertCount++;
                    }
                }
                m_ItemSetManager.CategoryItemSets = updatedCategoryItemSets;
                m_ItemSetReorderableList          = null;
                GUI.changed = true;
            }
        }
        /// <summary>
        /// Ensures all of the ItemSet categories are valid.
        /// </summary>
        private void CheckCategories()
        {
            var categoryItemSets = m_ItemSetManager.CategoryItemSets;

            for (int i = categoryItemSets.Length - 1; i >= 0; --i)
            {
                var hasCategory = false;
                for (int j = 0; j < m_ItemCollection.Categories.Length; ++j)
                {
                    if (categoryItemSets[i].CategoryID == m_ItemCollection.Categories[j].ID)
                    {
                        hasCategory = true;
                        break;
                    }
                }
                if (!hasCategory)
                {
                    var categoryList = new List <CategoryItemSet>(categoryItemSets);
                    categoryList.RemoveAt(i);
                    m_ItemSetManager.CategoryItemSets = categoryItemSets = categoryList.ToArray();
                    m_ItemSetReorderableList          = null;
                }
            }

            // The number of categories must match.
            var diff = m_ItemCollection.Categories.Length - categoryItemSets.Length;

            if (diff > 0)
            {
                System.Array.Resize(ref categoryItemSets, categoryItemSets.Length + diff);
                for (int i = categoryItemSets.Length - diff; i < categoryItemSets.Length; ++i)
                {
                    categoryItemSets[i]             = new CategoryItemSet();
                    categoryItemSets[i].CategoryID  = m_ItemCollection.Categories[i].ID;
                    categoryItemSets[i].ItemSetList = new List <ItemSet>();
                }
                m_ItemSetManager.CategoryItemSets = categoryItemSets;
                m_ItemSetReorderableList          = null;
            }
            else if (diff < 0)
            {
                var updatedCategoryItemSets = new CategoryItemSet[categoryItemSets.Length + diff];
                var insertCount             = 0;
                // Remove the ItemSet that no longer has a category.
                for (int i = 0; i < categoryItemSets.Length; ++i)
                {
                    var categoryID  = categoryItemSets[i].CategoryID;
                    var hasCategory = false;
                    for (int j = 0; j < m_ItemCollection.Categories.Length; ++j)
                    {
                        if (categoryID == m_ItemCollection.Categories[j].ID)
                        {
                            hasCategory = true;
                            break;
                        }
                    }
                    // Add the CategoryItemSet to the list if it exists. If the category ID no longer exists then don't transfer it to the new array.
                    if (hasCategory)
                    {
                        updatedCategoryItemSets[insertCount] = categoryItemSets[i];
                        insertCount++;
                    }
                }
                m_ItemSetManager.CategoryItemSets = updatedCategoryItemSets;
                m_ItemSetReorderableList          = null;
            }
        }