public void CompileCategories()
        {
            Categories.Clear();

            Categories.TrimExcess();


            Categories.Add(RootCategory);

            if (Category.HasParent)
            {
                Categories.AddOrReplace(Category.Parent);
            }

            foreach (ConquestCategory c in
                     Profile.Where(CanDisplay).Select(s => new ConquestCategory(s.Conquest.Category ?? ConquestCategory.Default)))
            {
                Categories.AddOrReplace(c);

                foreach (var p in c.GetParents())
                {
                    Categories.AddOrReplace(p);
                }
            }

            var selectedParents = Category.GetParents().ToArray();

            Categories.RemoveAll(
                c =>
            {
                var parents = c.GetParents().ToArray();

                if (parents.Length > 0)
                {
                    if (parents.Length <= selectedParents.Length && c != Category && !parents.Contains(Category) &&
                        !selectedParents.Any(p => p == c || c.Parent == p))
                    {
                        return(true);
                    }

                    if (parents.Length > selectedParents.Length && c.Parent != Category)
                    {
                        return(true);
                    }
                }

                return(false);
            });

            Categories.Sort((l, r) => Insensitive.Compare(l.FullName, r.FullName));

            CategoryScrollMax = Math.Max(0, Categories.Count - 14);
            CategoryScroll    = Math.Max(0, Math.Min(CategoryScrollMax, CategoryScroll));
        }