private void PopulateChampionChangeBrowser(TreeNode tn)
        {
            foreach (var diff_elem in diff_calculator.DifferingChampions)
            {
                bool passes_filter = false;

                Pox.Diff.DifferenceLink diff_link = new Pox.Diff.DifferenceLink()
                {
                    ElemType = Pox.DataElement.ElementType.CHAMPION
                };
                if (diff_calculator.PreviousDatabase.Champions.ContainsKey(diff_elem.id))
                {
                    if (ElementPassesFilter(diff_calculator.PreviousDatabase.Champions[diff_elem.id]))
                    {
                        passes_filter = true;
                    }

                    diff_link.PreviousElement = diff_calculator.PreviousDatabase.Champions[diff_elem.id];
                }
                if (diff_calculator.CurrentDatabase_ref.Champions.ContainsKey(diff_elem.id))
                {
                    if ((!passes_filter) && (ElementPassesFilter(diff_calculator.CurrentDatabase_ref.Champions[diff_elem.id])))
                    {
                        passes_filter = true;
                    }

                    diff_link.CurrentElement = diff_calculator.CurrentDatabase_ref.Champions[diff_elem.id];
                }

                if (!passes_filter)
                {
                    continue;
                }

                tn.Nodes.Add(new TreeNode()
                {
                    Text = diff_link.ToString(), Tag = diff_link
                });
            }
            tn.Text = string.Format("Champions ({0} changes)", tn.Nodes.Count);
        }
        private void PopulateFactionChangeBrowser(TreeNode tn)
        {
            // champions
            foreach (var diff_elem in diff_calculator.DifferingChampions)
            {
                bool contains_faction = false;
                bool passes_filter    = false;

                Pox.Diff.DifferenceLink diff_link = new Pox.Diff.DifferenceLink()
                {
                    ElemType = Pox.DataElement.ElementType.CHAMPION
                };

                if (diff_calculator.PreviousDatabase.Champions.ContainsKey(diff_elem.id))
                {
                    if (ElementPassesFilter(diff_calculator.PreviousDatabase.Champions[diff_elem.id]))
                    {
                        passes_filter = true;
                    }

                    if (diff_calculator.PreviousDatabase.Champions[diff_elem.id].Faction.Contains(tn.Name))
                    {
                        diff_link.PreviousElement = diff_calculator.PreviousDatabase.Champions[diff_elem.id];
                        contains_faction          = true;
                    }
                }
                if (diff_calculator.CurrentDatabase_ref.Champions.ContainsKey(diff_elem.id))
                {
                    if ((!passes_filter) && (ElementPassesFilter(diff_calculator.CurrentDatabase_ref.Champions[diff_elem.id])))
                    {
                        passes_filter = true;
                    }

                    if (diff_calculator.CurrentDatabase_ref.Champions[diff_elem.id].Faction.Contains(tn.Name))
                    {
                        diff_link.CurrentElement = diff_calculator.CurrentDatabase_ref.Champions[diff_elem.id];
                        contains_faction         = true;
                    }
                }

                if (!contains_faction)
                {
                    continue;
                }

                if (!passes_filter)
                {
                    continue;
                }

                tn.Nodes.Add(new TreeNode()
                {
                    Text = diff_link.ToString(), Tag = diff_link
                });
            }

            // spells
            foreach (var diff_elem in diff_calculator.DifferingSpells)
            {
                bool contains_faction = false;
                bool passes_filter    = false;

                Pox.Diff.DifferenceLink diff_link = new Pox.Diff.DifferenceLink()
                {
                    ElemType = Pox.DataElement.ElementType.SPELL
                };

                if (diff_calculator.PreviousDatabase.Spells.ContainsKey(diff_elem.id))
                {
                    if (ElementPassesFilter(diff_calculator.PreviousDatabase.Spells[diff_elem.id]))
                    {
                        passes_filter = true;
                    }

                    if (diff_calculator.PreviousDatabase.Spells[diff_elem.id].Faction.Contains(tn.Name))
                    {
                        diff_link.PreviousElement = diff_calculator.PreviousDatabase.Spells[diff_elem.id];
                        contains_faction          = true;
                    }
                }
                if (diff_calculator.CurrentDatabase_ref.Spells.ContainsKey(diff_elem.id))
                {
                    if ((!passes_filter) && (ElementPassesFilter(diff_calculator.CurrentDatabase_ref.Spells[diff_elem.id])))
                    {
                        passes_filter = true;
                    }

                    if (diff_calculator.CurrentDatabase_ref.Spells[diff_elem.id].Faction.Contains(tn.Name))
                    {
                        diff_link.CurrentElement = diff_calculator.CurrentDatabase_ref.Spells[diff_elem.id];
                        contains_faction         = true;
                    }
                }

                if (!contains_faction)
                {
                    continue;
                }

                if (!passes_filter)
                {
                    continue;
                }

                tn.Nodes.Add(new TreeNode()
                {
                    Text = diff_link.ToString(), Tag = diff_link
                });
            }

            // relics
            foreach (var diff_elem in diff_calculator.DifferingRelics)
            {
                bool contains_faction = false;
                bool passes_filter    = false;

                Pox.Diff.DifferenceLink diff_link = new Pox.Diff.DifferenceLink()
                {
                    ElemType = Pox.DataElement.ElementType.RELIC
                };

                if (diff_calculator.PreviousDatabase.Relics.ContainsKey(diff_elem.id))
                {
                    if (ElementPassesFilter(diff_calculator.PreviousDatabase.Relics[diff_elem.id]))
                    {
                        passes_filter = true;
                    }

                    if (diff_calculator.PreviousDatabase.Relics[diff_elem.id].Faction.Contains(tn.Name))
                    {
                        diff_link.PreviousElement = diff_calculator.PreviousDatabase.Relics[diff_elem.id];
                        contains_faction          = true;
                    }
                }
                if (diff_calculator.CurrentDatabase_ref.Relics.ContainsKey(diff_elem.id))
                {
                    if ((!passes_filter) && (ElementPassesFilter(diff_calculator.CurrentDatabase_ref.Relics[diff_elem.id])))
                    {
                        passes_filter = true;
                    }

                    if (diff_calculator.CurrentDatabase_ref.Relics[diff_elem.id].Faction.Contains(tn.Name))
                    {
                        diff_link.CurrentElement = diff_calculator.CurrentDatabase_ref.Relics[diff_elem.id];
                        contains_faction         = true;
                    }
                }

                if (!contains_faction)
                {
                    continue;
                }

                if (!passes_filter)
                {
                    continue;
                }

                tn.Nodes.Add(new TreeNode()
                {
                    Text = diff_link.ToString(), Tag = diff_link
                });
            }

            // equipments
            foreach (var diff_elem in diff_calculator.DifferingEquipments)
            {
                bool contains_faction = false;
                bool passes_filter    = false;

                Pox.Diff.DifferenceLink diff_link = new Pox.Diff.DifferenceLink()
                {
                    ElemType = Pox.DataElement.ElementType.EQUIPMENT
                };

                if (diff_calculator.PreviousDatabase.Equipments.ContainsKey(diff_elem.id))
                {
                    if (ElementPassesFilter(diff_calculator.PreviousDatabase.Equipments[diff_elem.id]))
                    {
                        passes_filter = true;
                    }

                    if (diff_calculator.PreviousDatabase.Equipments[diff_elem.id].Faction.Contains(tn.Name))
                    {
                        diff_link.PreviousElement = diff_calculator.PreviousDatabase.Equipments[diff_elem.id];
                        contains_faction          = true;
                    }
                }
                if (diff_calculator.CurrentDatabase_ref.Equipments.ContainsKey(diff_elem.id))
                {
                    if ((!passes_filter) && (ElementPassesFilter(diff_calculator.CurrentDatabase_ref.Equipments[diff_elem.id])))
                    {
                        passes_filter = true;
                    }

                    if (diff_calculator.CurrentDatabase_ref.Equipments[diff_elem.id].Faction.Contains(tn.Name))
                    {
                        diff_link.CurrentElement = diff_calculator.CurrentDatabase_ref.Equipments[diff_elem.id];
                        contains_faction         = true;
                    }
                }

                if (!contains_faction)
                {
                    continue;
                }

                if (!passes_filter)
                {
                    continue;
                }

                tn.Nodes.Add(new TreeNode()
                {
                    Text = diff_link.ToString(), Tag = diff_link
                });
            }

            tn.Text = string.Format("{0} ({1} changes)", tn.Name, tn.Nodes.Count);
        }