private void CloneFromSaveEchoes_Click(object sender, EventArgs e)
        {
            int index = GetSelectedEchoList();

            if (index == -1)
            {
                MessageBox.Show("Select a single echo list to import to first.");
                return;
            }

            Util.WTOpenFileDialog tempOpen = new Util.WTOpenFileDialog("sav", "");

            if (tempOpen.ShowDialog() == DialogResult.OK)
            {
                WillowSaveGame OtherSave = new WillowSaveGame();

                try
                {
                    OtherSave.LoadWsg(tempOpen.FileName());
                }
                catch { MessageBox.Show("Couldn't open the other save file."); return; }

                if (OtherSave.NumberOfEchoLists - 1 < index)
                {
                    MessageBox.Show("The echo list does not exist in the other savegame file.");
                    return;
                }

                // Replace the old entries in the echo table with the new ones
                CurrentWSG.EchoLists[index] = OtherSave.EchoLists[index];

                WillowSaveGame.EchoTable et = CurrentWSG.EchoLists[index];

                EchoTree.BeginUpdate();
                TreeNodeAdv parent = EchoTree.Root.Children[index];

                // Remove the old entries from the tree view
                TreeNodeAdv[] children = parent.Children.ToArray();
                foreach (TreeNodeAdv child in children)
                {
                    child.Remove();
                }

                // Add the new entries to the tree view
                foreach (WillowSaveGame.EchoEntry ee in et.Echoes)
                {
                    string name = ee.Name;

                    ColoredTextNode node = new ColoredTextNode();
                    node.Tag  = name;
                    node.Text = EchoesXml.XmlReadValue(name, "Subject");
                    if (node.Text == "")
                    {
                        node.Text = "(" + name + ")";
                    }
                    parent.AddNode(node);
                }
                EchoTree.EndUpdate();
            }
        }
        private void RemoveListEchoes_Click(object sender, EventArgs e)
        {
            TreeNodeAdv[] selection = EchoTree.SelectedNodes.ToArray();

            foreach (TreeNodeAdv nodeAdv in selection)
            {
                if (nodeAdv.Parent == EchoTree.Root)
                {
                    CurrentWSG.NumberOfEchoLists--;
                    CurrentWSG.EchoLists.RemoveAt(nodeAdv.Index);
                    EchoTree.Root.Children[nodeAdv.Index].Remove();
                }
            }

            // The indexes will be messed up if a list that is not the last one is
            // removed, so update the tree text, tree indexes, and echo list indices
            int count = CurrentWSG.NumberOfEchoLists;

            for (int index = 0; index < count; index++)
            {
                TreeNodeAdv nodeAdv = EchoTree.Root.Children[index];

                // Adjust the category node's text and tag to reflect its new position
                ColoredTextNode parent = nodeAdv.Data();
                parent.Text = "Playthrough " + (index + 1) + " Echo Logs";
                parent.Tag  = index.ToString();

                // Adjust the echo list index to reflect its new position
                CurrentWSG.EchoLists[index].Index = index;
            }
            EchoTree.EndUpdate();
        }
        private void AddListEchoes_Click(object sender, EventArgs e)
        {
            int index = CurrentWSG.NumberOfEchoLists;

            // Create an empty echo table
            WillowSaveGame.EchoTable et = new WillowSaveGame.EchoTable();
            et.Index       = CurrentWSG.NumberOfEchoLists;
            et.Echoes      = new List <WillowSaveGame.EchoEntry>();
            et.TotalEchoes = 0;

            // Add the new table to the list
            CurrentWSG.EchoLists.Add(et);
            CurrentWSG.NumberOfEchoLists++;

            EchoTree.BeginUpdate();

            //Add the new table to the tree view
            ColoredTextNode categoryNode = new ColoredTextNode();

            categoryNode.Tag  = index.ToString();
            categoryNode.Text = "Playthrough " + (CurrentWSG.EchoLists[index].Index + 1) + " Echo Logs";
            (EchoTree.Model as TreeModel).Nodes.Add(categoryNode);

            EchoTree.EndUpdate();
        }
        public void MergeAllFromXmlEchoes(string filename, int index)
        {
            XmlDocument doc = new XmlDocument();

            doc.Load(filename);

            if (doc.SelectSingleNode("WT/Echoes") == null)
            {
                throw new ApplicationException("NoEchoes");
            }

            XmlNodeList echonodes = doc.SelectNodes("WT/Echoes/Echo");

            if (echonodes == null)
            {
                return;
            }

            WillowSaveGame.EchoTable et = CurrentWSG.EchoLists[index];

            EchoTree.BeginUpdate();

            // Copy only the echos that are not duplicates from the XML file
            foreach (XmlNode node in echonodes)
            {
                string name = node.GetElement("Name", "");

                // Make sure the echo is not already in the list
                EchoSearchKey = name;
                if (et.Echoes.FindIndex(EchoSearchByName) != -1)
                {
                    continue;
                }

                // Create a new echo entry an populate it from the node
                WillowSaveGame.EchoEntry ee = new WillowSaveGame.EchoEntry();
                ee.Name      = name;
                ee.DlcValue1 = node.GetElementAsInt("DLCValue1", 0);
                ee.DlcValue2 = node.GetElementAsInt("DLCValue2", 0);

                // Add the echo entry to the echo list
                et.Echoes.Add(ee);
                et.TotalEchoes++;

                // Add the echo to the tree view
                ColoredTextNode treeNode = new ColoredTextNode();
                treeNode.Tag  = name;
                treeNode.Text = EchoesXml.XmlReadValue(name, "Subject");
                if (treeNode.Text == "")
                {
                    treeNode.Text = "(" + name + ")";
                }
                EchoTree.Root.Children[index].AddNode(treeNode);
            }
            EchoTree.EndUpdate();
        }
        private void EchoList_Click(object sender, EventArgs e)
        {
            newToolStripMenuItem1.HideDropDown();

            if (EchoList.SelectedIndex == -1)
            {
                return;
            }

            int index = GetSelectedEchoList();

            if (index == -1)
            {
                MessageBox.Show("Select an echo list first.");
                return;
            }

            string name = EchoesXml.stListSectionNames()[EchoList.SelectedIndex];

            // Create a new echo entry and populate it
            WillowSaveGame.EchoEntry ee = new WillowSaveGame.EchoEntry();
            ee.Name = name;
            // TODO: These values shouldn't always be zero, but the data doesn't
            // exist in the data files yet.  When the proper data is in the data
            // file then it needs to be looked up here.
            ee.DlcValue1 = 0;
            ee.DlcValue2 = 0;

            // Add the new echo to the echo list
            WillowSaveGame.EchoTable et = CurrentWSG.EchoLists[index];
            et.Echoes.Add(ee);
            et.TotalEchoes++;

            // Add the new echo to the echo tree view
            ColoredTextNode treeNode = new ColoredTextNode();

            treeNode.Tag  = name;
            treeNode.Text = EchoesXml.XmlReadValue(name, "Subject");
            if (treeNode.Text == "")
            {
                treeNode.Text = "(" + treeNode.Tag as string + ")";
            }
            TreeNodeAdv parent = EchoTree.Root.Children[index];

            parent.AddNode(treeNode);

            // Select the newly added node so the user will know it was added
            EchoTree.SelectedNode = parent.Children[parent.Children.Count - 1];
            EchoTree.EnsureVisible(EchoTree.SelectedNode);
        }
        public void LoadEchoes(string filename, int index)
        {
            XmlDocument doc = new XmlDocument();

            doc.Load(filename);

            if (doc.SelectSingleNode("WT/Echoes") == null)
            {
                throw new ApplicationException("NoEchoes");
            }

            XmlNodeList echonodes = doc.SelectNodes("WT/Echoes/Echo");

            int count = echonodes.Count;

            WillowSaveGame.EchoTable et = CurrentWSG.EchoLists[index];
            et.Echoes.Clear();
            et.TotalEchoes = 0;

            EchoTree.BeginUpdate();

            for (int i = 0; i < count; i++)
            {
                // Create a new echo entry and populate it from the xml node
                WillowSaveGame.EchoEntry ee = new WillowSaveGame.EchoEntry();
                XmlNode node = echonodes[i];
                string  name = node.GetElement("Name", "");
                ee.Name      = name;
                ee.DlcValue1 = node.GetElementAsInt("DLCValue1", 0);
                ee.DlcValue2 = node.GetElementAsInt("DLCValue2", 0);

                // Add the echo to the list
                et.Echoes.Add(ee);
                et.TotalEchoes++;

                // Add the echo to the tree view
                ColoredTextNode treeNode = new ColoredTextNode();
                treeNode.Tag  = name;
                treeNode.Text = EchoesXml.XmlReadValue(name, "Subject");
                if (treeNode.Text == "")
                {
                    treeNode.Text = "(" + name + ")";
                }
                EchoTree.Root.Children[index].AddNode(treeNode);
            }

            EchoTree.EndUpdate();
        }
        public void MergeFromSaveEchoes(string filename, int index)
        {
            WillowSaveGame OtherSave = new WillowSaveGame();

            OtherSave.LoadWsg(filename);

            if (OtherSave.NumberOfEchoLists - 1 < index)
            {
                return;
            }

            WillowSaveGame.EchoTable etOther = OtherSave.EchoLists[index];
            WillowSaveGame.EchoTable et      = CurrentWSG.EchoLists[index];

            EchoTree.BeginUpdate();

            // Copy only the locations that are not duplicates from the other save
            foreach (WillowSaveGame.EchoEntry ee in CurrentWSG.EchoLists[index].Echoes)
            {
                string name = ee.Name;

                // Make sure the echo is not already in the list
                EchoSearchKey = name;
                if (et.Echoes.FindIndex(EchoSearchByName) != -1)
                {
                    continue;
                }

                // Add the echo entry to the echo list
                et.Echoes.Add(ee);
                et.TotalEchoes++;

                // Add the echo to the tree view
                ColoredTextNode treeNode = new ColoredTextNode();
                treeNode.Tag  = name;
                treeNode.Text = EchoesXml.XmlReadValue(name, "Subject");
                if (treeNode.Text == "")
                {
                    treeNode.Text = "(" + name + ")";
                }
                EchoTree.Root.Children[index].AddNode(treeNode);
            }
            EchoTree.EndUpdate();
        }
        public void DoEchoTree()
        {
            EchoTree.BeginUpdate();
            TreeModel model = new TreeModel();

            EchoTree.Model = model;

            for (int i = 0; i < CurrentWSG.NumberOfEchoLists; i++)
            {
                // Category nodes
                //      Text = human readable category heading
                //      Tag = echo list index stored as a string (0 based)
                ColoredTextNode parent = new ColoredTextNode();
                parent.Tag  = i.ToString();
                parent.Text = "Playthrough " + (CurrentWSG.EchoLists[i].Index + 1) + " Echo Logs";
                model.Nodes.Add(parent);

                for (int build = 0; build < CurrentWSG.EchoLists[i].TotalEchoes; build++)
                {
                    string name = CurrentWSG.EchoLists[i].Echoes[build].Name;

                    // Echo nodes
                    //      Text = human readable echo name
                    //      Tag = internal echo name
                    ColoredTextNode node = new ColoredTextNode();
                    node.Tag  = name;
                    node.Text = EchoesXml.XmlReadValue(name, "Subject");
                    if (node.Text == "")
                    {
                        node.Text = "(" + name + ")";
                    }
                    parent.Nodes.Add(node);
                }
            }
            EchoTree.EndUpdate();
        }