OSDN Git Service

import original 0.9.5 release
[handbrake-jp/handbrake-jp.git] / win / C# / Controls / Subtitles.cs
index 80c7edb..29c1272 100644 (file)
-using System;\r
-using System.Collections.Generic;\r
-using System.IO;\r
-using System.Windows.Forms;\r
-using Handbrake.Functions;\r
+/*  Subtitles.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Controls\r
 {\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.IO;\r
+    using System.Linq;\r
+    using System.Windows.Forms;\r
+    using Functions;\r
+\r
+    using HandBrake.ApplicationServices.Model;\r
+\r
+    using Model;\r
+\r
+    /// <summary>\r
+    /// The Subtitles Tab\r
+    /// </summary>\r
     public partial class Subtitles : UserControl\r
     {\r
-        readonly IDictionary<string, string> LangMap = new Dictionary<string, string>();\r
-        List<SubtitleInfo> SubList = new List<SubtitleInfo>();\r
-        private int _fileContainer;\r
+        #region Priavate Variables and Collections\r
+\r
+        /// <summary>\r
+        /// Map of languages to language codes\r
+        /// </summary>\r
+        private readonly IDictionary<string, string> langMap = new Dictionary<string, string>();\r
+\r
+        /// <summary>\r
+        /// A List of SRT Files\r
+        /// </summary>\r
+        private readonly IDictionary<string, string> srtFiles = new Dictionary<string, string>();\r
 \r
+        /// <summary>\r
+        /// The Subtitle List\r
+        /// </summary>\r
+        private readonly List<SubtitleInfo> subList = new List<SubtitleInfo>();\r
+\r
+        #endregion\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="Subtitles"/> class.\r
+        /// </summary>\r
         public Subtitles()\r
         {\r
             InitializeComponent();\r
 \r
-            LangMap = Main.mapLanguages();\r
-            foreach (string key in LangMap.Keys)\r
+            langMap = Main.MapLanguages();\r
+            foreach (string key in langMap.Keys)\r
                 srt_lang.Items.Add(key);\r
 \r
             srt_charcode.SelectedIndex = 28;\r
             srt_lang.SelectedIndex = 40;\r
         }\r
 \r
-        // Primary Controls\r
-        private void btn_addSubTrack_Click(object sender, EventArgs e)\r
+        #region Public Methods\r
+        /// <summary>\r
+        /// Gets the CLI Query for this panel\r
+        /// </summary>\r
+        /// <returns>A CliQuery string</returns>\r
+        public string GetCliQuery\r
+        {\r
+            get\r
+            {\r
+                string query = string.Empty;\r
+                if (lv_subList.Items.Count != 0) // If we have subtitle tracks\r
+                {\r
+                    // BitMap and CC's\r
+                    string subtitleTracks = String.Empty;\r
+                    string subtitleForced = String.Empty;\r
+                    string subtitleBurn = String.Empty;\r
+                    string subtitleDefault = String.Empty;\r
+\r
+                    // SRT\r
+                    string srtFile = String.Empty;\r
+                    string srtCodeset = String.Empty;\r
+                    string srtOffset = String.Empty;\r
+                    string srtLang = String.Empty;\r
+                    string srtDefault = String.Empty;\r
+                    int srtCount = 0;\r
+                    int subCount = 0;\r
+\r
+                    foreach (SubtitleInfo item in subList)\r
+                    {\r
+                        string itemToAdd;\r
+\r
+                        if (item.IsSrtSubtitle) // We have an SRT file\r
+                        {\r
+                            srtCount++; // SRT track id.\r
+\r
+                            srtLang += srtLang == string.Empty ? langMap[item.SrtLang] : "," + langMap[item.SrtLang];\r
+                            srtCodeset += srtCodeset == string.Empty ? item.SrtCharCode : "," + item.SrtCharCode;\r
+\r
+                            if (item.Default)\r
+                                srtDefault = srtCount.ToString();\r
+\r
+                            itemToAdd = item.SrtPath;\r
+                            srtFile += srtFile == string.Empty ? itemToAdd : "," + itemToAdd;\r
+\r
+                            itemToAdd = item.SrtOffset.ToString();\r
+                            srtOffset += srtOffset == string.Empty ? itemToAdd : "," + itemToAdd;\r
+                        }\r
+                        else // We have Bitmap or CC\r
+                        {\r
+                            subCount++;\r
+\r
+                            // Find --subtitle <string>\r
+                            if (item.Track.Contains("Foreign Audio Search"))\r
+                                itemToAdd = "scan";\r
+                            else\r
+                            {\r
+                                string[] tempSub = item.Track.Split(' ');\r
+                                itemToAdd = tempSub[0];\r
+                            }\r
+\r
+                            subtitleTracks += subtitleTracks == string.Empty ? itemToAdd : "," + itemToAdd;\r
+\r
+                            // Find --subtitle-forced\r
+                            if (item.Forced)\r
+                                subtitleForced += subtitleForced == string.Empty ? subCount.ToString() : "," + subCount;\r
+\r
+                            // Find --subtitle-burn\r
+                            if (item.Burned)\r
+                                subtitleBurn = subCount.ToString();\r
+\r
+                            // Find --subtitle-default\r
+                            if (item.Default)\r
+                                subtitleDefault = subCount.ToString();\r
+                        }\r
+                    }\r
+\r
+                    // Build The CLI Subtitles Query\r
+                    if (subtitleTracks != string.Empty)\r
+                    {\r
+                        query += " --subtitle " + subtitleTracks;\r
+\r
+                        if (subtitleForced != string.Empty)\r
+                            query += " --subtitle-forced=" + subtitleForced;\r
+                        if (subtitleBurn != string.Empty)\r
+                            query += " --subtitle-burn=" + subtitleBurn;\r
+                        if (subtitleDefault != string.Empty)\r
+                            query += " --subtitle-default=" + subtitleDefault;\r
+                    }\r
+\r
+                    if (srtFile != string.Empty) // SRTs\r
+                    {\r
+                        query += " --srt-file " + "\"" + srtFile + "\"";\r
+\r
+                        if (srtCodeset != string.Empty)\r
+                            query += " --srt-codeset " + srtCodeset;\r
+                        if (srtOffset != string.Empty)\r
+                            query += " --srt-offset " + srtOffset;\r
+                        if (srtLang != string.Empty)\r
+                            query += " --srt-lang " + srtLang;\r
+                        if (srtDefault != string.Empty)\r
+                            query += " --srt-default=" + srtDefault;\r
+                    }\r
+                }\r
+                return query;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Checks of the current settings will require the m4v file extension\r
+        /// </summary>\r
+        /// <returns>True if Yes</returns>\r
+        public bool RequiresM4V()\r
+        {\r
+            return this.subList.Any(track => track.SubtitleType != SubtitleType.VobSub);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Automatically setup the subtitle tracks.\r
+        /// This handles the automatic setup of subitles which the user can control from the program options\r
+        /// </summary>\r
+        /// <param name="subs">List of Subtitles</param>\r
+        public void SetSubtitleTrackAuto(object[] subs)\r
+        {\r
+            drp_subtitleTracks.Items.Clear();\r
+            drp_subtitleTracks.Items.Add("Foreign Audio Search (Bitmap)");\r
+            drp_subtitleTracks.Items.AddRange(subs);\r
+            drp_subtitleTracks.SelectedIndex = 0;\r
+            Clear();\r
+\r
+            this.AutomaticSubtitleSelection();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Automatic Subtitle Selection based on user preferences.\r
+        /// </summary>\r
+        public void AutomaticSubtitleSelection()\r
+        {\r
+            // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
+            if (Properties.Settings.Default.NativeLanguage != "Any")\r
+            {\r
+                if (Properties.Settings.Default.DubMode != 1) // We need to add a subtitle track if this is false.\r
+                {\r
+                    foreach (object item in drp_subtitleTracks.Items)\r
+                    {\r
+                        if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
+                        {\r
+                            drp_subtitleTracks.SelectedItem = item;\r
+                            BtnAddSubTrackClick(this, new EventArgs());\r
+                        }\r
+                    }\r
+\r
+                    if (drp_subtitleTracks.SelectedIndex == 0 && Properties.Settings.Default.useClosedCaption)\r
+                    {\r
+                        foreach (object item in drp_subtitleTracks.Items)\r
+                        {\r
+                            if (item.ToString().Contains("Closed"))\r
+                            {\r
+                                drp_subtitleTracks.SelectedItem = item;\r
+                                BtnAddSubTrackClick(this, new EventArgs());\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Clear the Subtitle List\r
+        /// </summary>\r
+        public void Clear()\r
+        {\r
+            lv_subList.Items.Clear();\r
+            subList.Clear();\r
+        }\r
+        #endregion\r
+\r
+        #region Primary Controls\r
+\r
+        /// <summary>\r
+        /// Add a Subtitle track.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnAddSubTrackClick(object sender, EventArgs e)\r
         {\r
             // Logic\r
             string forcedVal = check_forced.CheckState == CheckState.Checked ? "Yes" : "No";\r
             string defaultSub = check_default.CheckState == CheckState.Checked ? "Yes" : "No";\r
-            string burnedVal = check_burned.CheckState == CheckState.Checked && (!drp_subtitleTracks.Text.Contains("Text")) ? "Yes" : "No";\r
+            string burnedVal = check_burned.CheckState == CheckState.Checked &&\r
+                               (drp_subtitleTracks.Text.Contains("(VOBSUB)") || drp_subtitleTracks.Text.Contains("(SSA)"))\r
+                                   ? "Yes"\r
+                                   : "No";\r
             string srtCode = "-", srtLangVal = "-", srtPath = "-", srtFile = "-";\r
             int srtOffsetMs = 0;\r
 \r
             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
             {\r
-                burnedVal = "No";\r
-                forcedVal = "No";\r
-                srtPath = openFileDialog.FileName;\r
-                srtFile = Path.GetFileName(openFileDialog.FileName);\r
+                srtFiles.TryGetValue(drp_subtitleTracks.SelectedItem.ToString(), out srtPath);\r
+                srtFile = drp_subtitleTracks.SelectedItem.ToString();\r
                 srtLangVal = srt_lang.SelectedItem.ToString();\r
                 srtCode = srt_charcode.SelectedItem.ToString();\r
                 srtOffsetMs = (int)srt_offset.Value;\r
-                if (defaultSub == "Yes") setNoSrtDefault();\r
-            } else\r
-            {\r
-                if (defaultSub == "Yes") SetNoDefault();\r
-                if (burnedVal == "Yes") SetNoBurned();\r
-\r
-                if (_fileContainer == 0)\r
-                    burnedVal = "Yes";  // MP4 must have bitmap subs burned in.\r
+                if (defaultSub == "Yes") this.SetDefaultToOffForAllSRTTracks();\r
             }\r
-\r
-            if (_fileContainer == 0) // MP4 and M4V file extension\r
+            else\r
             {\r
-                // Make sure we only have 1 bitmap track.\r
-                if (drp_subtitleTracks.SelectedItem != null && drp_subtitleTracks.SelectedItem.ToString().Contains("Bitmap"))\r
-                {\r
-                    foreach (ListViewItem item in lv_subList.Items)\r
-                    {\r
-                        if (item.SubItems[0].Text.Contains("Bitmap"))\r
-                        {\r
-                            MessageBox.Show(this, "More than one vobsub is not supported in mp4... Your first vobsub track will now be used.",\r
-                                            "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
-                            return;\r
-                        }\r
-                    }\r
-                }\r
+                if (defaultSub == "Yes") this.SetDefaultToOffForAllTracks();\r
+                if (burnedVal == "Yes") this.SetBurnedToOffForAllTracks();\r
             }\r
 \r
             string trackName = (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
-                               ? srtLangVal + " (" + srtFile + ")"\r
-                               : drp_subtitleTracks.SelectedItem.ToString();\r
-\r
+                                   ? srtLangVal + " (" + srtFile + ")"\r
+                                   : drp_subtitleTracks.SelectedItem.ToString();\r
 \r
             SubtitleInfo track = new SubtitleInfo\r
                                      {\r
                                          Track = trackName,\r
-                                         Forced = forcedVal,\r
-                                         Burned = burnedVal,\r
-                                         Default = defaultSub,\r
+                                         Forced = check_forced.Checked,\r
+                                         Burned = check_burned.Checked,\r
+                                         Default = check_default.Checked,\r
                                          SrtLang = srtLangVal,\r
                                          SrtCharCode = srtCode,\r
                                          SrtOffset = srtOffsetMs,\r
@@ -89,31 +287,71 @@ namespace Handbrake.Controls
                                      };\r
 \r
             lv_subList.Items.Add(track.ListView);\r
-            SubList.Add(track);\r
-\r
+            subList.Add(track);\r
         }\r
-        private void btn_srtAdd_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Import an SRT Subtitle Track\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnSrtAddClick(object sender, EventArgs e)\r
         {\r
             if (openFileDialog.ShowDialog() != DialogResult.OK)\r
                 return;\r
+\r
+            if (srtFiles.ContainsKey(Path.GetFileName(openFileDialog.FileName)))\r
+            {\r
+                MessageBox.Show(\r
+                    "A Subtitle track with the same name has already been imported.",\r
+                    "Warning",\r
+                    MessageBoxButtons.OK,\r
+                    MessageBoxIcon.Warning);\r
+                return;\r
+            }\r
+\r
             drp_subtitleTracks.Items.Add(Path.GetFileName(openFileDialog.FileName));\r
             drp_subtitleTracks.SelectedItem = Path.GetFileName(openFileDialog.FileName);\r
+            srtFiles.Add(Path.GetFileName(openFileDialog.FileName), openFileDialog.FileName);\r
         }\r
-        private void btn_RemoveSubTrack_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Remove a subtitle track\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnRemoveSubTrackClick(object sender, EventArgs e)\r
         {\r
-            RemoveTrack();\r
+            this.RemoveSelectedTrack();\r
         }\r
 \r
-        // Secondary Controls\r
-        private void lb_subList_SelectedIndexChanged(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// The Subtitle List selected index has changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void LbSubListSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             // Set the dropdown controls based on the selected item in the List.\r
             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
             {\r
-                SubtitleInfo track = SubList[lv_subList.SelectedIndices[0]];\r
+                SubtitleInfo track = subList[lv_subList.SelectedIndices[0]];\r
 \r
                 int c = 0;\r
-                if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt"))  // We have an SRT\r
+                if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt"))\r
+                // We have an SRT\r
                 {\r
                     foreach (var item in drp_subtitleTracks.Items)\r
                     {\r
@@ -124,10 +362,10 @@ namespace Handbrake.Controls
                     srt_lang.SelectedItem = track.SrtLang;\r
                     srt_offset.Value = track.SrtOffset;\r
                     srt_charcode.SelectedItem = track.SrtCharCode;\r
-                    check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
+                    check_default.CheckState = track.Default ? CheckState.Checked : CheckState.Unchecked;\r
                     SubGroupBox.Text = "Selected Track: " + track.Track;\r
                 }\r
-                else  // We have Bitmap/CC\r
+                else // We have Bitmap/CC\r
                 {\r
                     foreach (var item in drp_subtitleTracks.Items)\r
                     {\r
@@ -135,18 +373,31 @@ namespace Handbrake.Controls
                             drp_subtitleTracks.SelectedIndex = c;\r
                         c++;\r
                     }\r
-                    check_forced.CheckState = track.Forced == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
-                    check_burned.CheckState = track.Burned == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
-                    check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
-                    SubGroupBox.Text = "Selected Track: " + lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
+                    check_forced.CheckState = track.Forced ? CheckState.Checked : CheckState.Unchecked;\r
+                    check_burned.CheckState = track.Burned ? CheckState.Checked : CheckState.Unchecked;\r
+                    check_default.CheckState = track.Default ? CheckState.Checked : CheckState.Unchecked;\r
+                    SubGroupBox.Text = "Selected Track: " +\r
+                                       lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
                 }\r
             }\r
             else\r
                 SubGroupBox.Text = "Selected Track: None (Click \"Add\" to add another track to the list)";\r
         }\r
 \r
-        // Bitmap / CC / SRT Controls\r
-        private void drp_subtitleTracks_SelectedIndexChanged(object sender, EventArgs e)\r
+        #endregion\r
+\r
+        #region Subtitle Controls\r
+\r
+        /// <summary>\r
+        /// Handle the Subtitle track dropdown changed event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void DrpSubtitleTracksSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
             {\r
@@ -170,54 +421,102 @@ namespace Handbrake.Controls
             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
             {\r
                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text = srt_lang.SelectedItem + "(" +\r
-                    drp_subtitleTracks.SelectedItem + ")";\r
+                                                                                   drp_subtitleTracks.SelectedItem + ")";\r
                 lv_subList.Select();\r
-            } else\r
+\r
+                string srtPath;\r
+                srtFiles.TryGetValue(drp_subtitleTracks.SelectedItem.ToString(), out srtPath);\r
+                subList[lv_subList.SelectedIndices[0]].SrtPath = srtPath;\r
+            }\r
+            else\r
             {\r
                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text =\r
                     drp_subtitleTracks.SelectedItem.ToString();\r
                 lv_subList.Select();\r
             }\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString();\r
         }\r
-        private void check_forced_CheckedChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Foreced Subtitles checkbox changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void CheckForcedCheckedChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = check_forced.Checked ? "Yes" : "No";\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
+            subList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked;\r
+            // Update SubList List<SubtitleInfo> \r
         }\r
-        private void check_burned_CheckedChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Burned in subtitles checkbox changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void CheckBurnedCheckedChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             if (check_burned.Checked) // Make sure we only have 1 burned track\r
-                SetNoBurned();\r
+                this.SetBurnedToOffForAllTracks();\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_burned.Checked ? "Yes" : "No";\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
+            subList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked;\r
+            // Update SubList List<SubtitleInfo> \r
         }\r
-        private void check_default_CheckedChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Default Subitle track check changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void CheckDefaultCheckedChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             if (check_default.Checked) // Make sure we only have 1 default track\r
                 if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.Contains(".srt"))\r
-                    setNoSrtDefault();\r
+                    this.SetDefaultToOffForAllSRTTracks();\r
                 else\r
-                    SetNoDefault();\r
+                    this.SetDefaultToOffForAllTracks();\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_default.Checked ? "Yes" : "No";\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].Default = check_default.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].Default = check_default.Checked;\r
+            // Update SubList List<SubtitleInfo>\r
         }\r
-        private void srt_offset_ValueChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Srt Offset Numeric Control Changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void SrtOffsetValueChanged(object sender, EventArgs e)\r
         {\r
             // Update an item in the  list if required.\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0)\r
@@ -226,29 +525,64 @@ namespace Handbrake.Controls
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text = srt_offset.Value.ToString();\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value; // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value;\r
+            // Update SubList List<SubtitleInfo>\r
         }\r
-        private void srt_charcode_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// The SRT Charcode changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void SrtCharcodeSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[5].Text = srt_charcode.SelectedItem.ToString();\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString();\r
+            // Update SubList List<SubtitleInfo>\r
         }\r
-        private void srt_lang_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// The Srt Language code changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void SrtLangSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = srt_lang.SelectedItem.ToString();\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString();\r
+            // Update SubList List<SubtitleInfo>\r
         }\r
 \r
-        // Right Click Menu\r
-        private void mnu_moveup_Click(object sender, EventArgs e)\r
+        #endregion\r
+\r
+        #region Right Click Menu\r
+\r
+        /// <summary>\r
+        /// Move an item in the subtitle list up\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuMoveupClick(object sender, EventArgs e)\r
         {\r
             if (lv_subList.SelectedIndices.Count != 0)\r
             {\r
@@ -265,7 +599,17 @@ namespace Handbrake.Controls
                 }\r
             }\r
         }\r
-        private void mnu_movedown_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Move an item in the subtitle list down\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuMovedownClick(object sender, EventArgs e)\r
         {\r
             if (lv_subList.SelectedIndices.Count != 0)\r
             {\r
@@ -282,46 +626,68 @@ namespace Handbrake.Controls
                 }\r
             }\r
         }\r
-        private void mnu_remove_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Remove a selected subtitle track.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuRemoveClick(object sender, EventArgs e)\r
         {\r
-            RemoveTrack();\r
+            this.RemoveSelectedTrack();\r
         }\r
 \r
-        // Functions\r
-        private void SetNoDefault()\r
+        #endregion\r
+\r
+        #region Helpers\r
+        /// <summary>\r
+        /// Set all Non SRT tracks to Default = NO\r
+        /// </summary>\r
+        private void SetDefaultToOffForAllTracks()\r
         {\r
             int c = 0;\r
             foreach (ListViewItem item in lv_subList.Items)\r
             {\r
-                if (SubList[c].SrtPath == "-")\r
+                if (subList[c].SrtPath == "-")\r
                 {\r
                     if (item.SubItems[3].Text == "Yes")\r
                     {\r
                         item.SubItems[3].Text = "No";\r
-                        SubList[c].Default = "No";\r
-                    }     \r
+                        subList[c].Default = false;\r
+                    }\r
                 }\r
                 c++;\r
             }\r
         }\r
 \r
-        private void setNoSrtDefault()\r
+        /// <summary>\r
+        /// Set all subtitle tracks so that they have no default.\r
+        /// </summary>\r
+        private void SetDefaultToOffForAllSRTTracks()\r
         {\r
             int c = 0;\r
             foreach (ListViewItem item in lv_subList.Items)\r
             {\r
-                if (SubList[c].SrtPath != "-")\r
+                if (!subList[c].IsSrtSubtitle)\r
                 {\r
                     if (item.SubItems[3].Text == "Yes")\r
                     {\r
                         item.SubItems[3].Text = "No";\r
-                        SubList[c].Default = "No";\r
+                        subList[c].Default = false;\r
                     }\r
                 }\r
                 c++;\r
             }\r
         }\r
-        private void SetNoBurned()\r
+\r
+        /// <summary>\r
+        /// Set all tracks to Burned = No\r
+        /// </summary>\r
+        private void SetBurnedToOffForAllTracks()\r
         {\r
             int c = 0;\r
             foreach (ListViewItem item in lv_subList.Items)\r
@@ -329,12 +695,16 @@ namespace Handbrake.Controls
                 if (item.SubItems[2].Text == "Yes")\r
                 {\r
                     item.SubItems[2].Text = "No";\r
-                    SubList[c].Burned = "No";\r
+                    subList[c].Burned = false;\r
                 }\r
                 c++;\r
             }\r
         }\r
-        private void RemoveTrack()\r
+\r
+        /// <summary>\r
+        /// Remove a selected track\r
+        /// </summary>\r
+        private void RemoveSelectedTrack()\r
         {\r
             // Remove the Item and reselect the control if the following conditions are met.\r
             if (lv_subList.SelectedItems.Count != 0)\r
@@ -344,7 +714,7 @@ namespace Handbrake.Controls
                 int selectedInd = lv_subList.SelectedIndices[0];\r
 \r
                 lv_subList.Items.RemoveAt(selectedInd);\r
-                SubList.RemoveAt(selectedInd);\r
+                subList.RemoveAt(selectedInd);\r
 \r
                 // Now reslect the correct item and give focus to the list.\r
                 if (lv_subList.Items.Count != 0)\r
@@ -358,97 +728,6 @@ namespace Handbrake.Controls
                 }\r
             }\r
         }\r
-\r
-        // Public Functions\r
-        public void Clear()\r
-        {\r
-            lv_subList.Items.Clear();\r
-            SubList.Clear();\r
-        }\r
-        public void SmartClear()\r
-        {\r
-            /* Smart clear will only remove subtitle tracks that do not have an equivlent \r
-              for the new source / title which the user has selected. */\r
-            throw new NotImplementedException();\r
-        }\r
-        public Boolean RequiresM4V()\r
-        {\r
-            foreach (ListViewItem item in lv_subList.Items)\r
-            {\r
-                if (item.SubItems.Count != 5)\r
-                    return true;\r
-\r
-                if (item.SubItems[1].Text.Contains("(Text)"))\r
-                    return true;\r
-            }\r
-            return false;\r
-        }\r
-        public void SetSubtitleTrackAuto()\r
-        {\r
-            // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
-            if (Properties.Settings.Default.NativeLanguage != "Any")\r
-            {\r
-                if (!Properties.Settings.Default.DubAudio) // We need to add a subtitle track if this is false.\r
-                {\r
-                    int i = 0;\r
-                    foreach (object item in drp_subtitleTracks.Items)\r
-                    {\r
-                        if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
-                            drp_subtitleTracks.SelectedIndex = i;\r
-\r
-                        i++;\r
-                    }\r
-\r
-                    btn_addSubTrack_Click(this, new EventArgs());\r
-                }\r
-            }\r
-        }\r
-        public void SetContainer(int value)\r
-        {\r
-            _fileContainer = value;\r
-            Boolean trigger = false;\r
-            if (_fileContainer != 1)\r
-                foreach (ListViewItem item in lv_subList.Items)\r
-                {\r
-                    if (item.SubItems[1].Text.Contains("Bitmap"))\r
-                    {\r
-                        if (trigger)\r
-                            lv_subList.Items.Remove(item);\r
-                        trigger = true;\r
-                    }\r
-                }\r
-        }\r
-        public List<SubtitleInfo> GetSubtitleInfoList()\r
-        {\r
-            return SubList;\r
-        }\r
-    }\r
-\r
-    public class SubtitleInfo\r
-    {\r
-        public string Track { get; set; }\r
-        public string Forced { get; set; }\r
-        public string Burned { get; set; }\r
-        public string Default { get; set; }\r
-        public string SrtLang { get; set; }\r
-        public string SrtCharCode { get; set; }\r
-        public int SrtOffset { get; set; }\r
-        public string SrtPath { get; set; }\r
-        public string SrtFileName { get; set; }\r
-\r
-        public ListViewItem ListView\r
-        {\r
-            get\r
-            {\r
-                ListViewItem listTrack = new ListViewItem(Track);\r
-                listTrack.SubItems.Add(Forced);\r
-                listTrack.SubItems.Add(Burned);\r
-                listTrack.SubItems.Add(Default);\r
-                listTrack.SubItems.Add(SrtLang);\r
-                listTrack.SubItems.Add(SrtCharCode);\r
-                listTrack.SubItems.Add(SrtOffset.ToString());\r
-                return listTrack;\r
-            }\r
-        }\r
+        #endregion\r
     }\r
 }
\ No newline at end of file