--- /dev/null
+diff --git a/win/C#/Controls/Subtitles.cs b/win/C#/Controls/Subtitles.cs
+index 8c4b219..29c1272 100644
+--- a/win/C#/Controls/Subtitles.cs
++++ b/win/C#/Controls/Subtitles.cs
+@@ -1,94 +1,284 @@
+-\r
+-/*\r
+- * This file come from HandBrake source code by http://handbrake.fr/ , \r
+- * and modified by hylom <hylomm@gmail.com> for HandBrake Japanese version.\r
+- * It may be used under the terms of the GNU General Public License.\r
+- * last modified date: $Format:%cd$\r
+- */\r
+-\r
+-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, "MP4形式の場合、字幕トラックは1つのみ使用できます。1つ目の字幕トラックのみが利用されます。",\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
+@@ -97,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
+@@ -132,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
+- SubGroupBox.Text = "選択中のトラック: " + track.Track;\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
+@@ -143,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 = "選択中のトラック: " + 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 = "選択中のトラック: なし";\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
+@@ -178,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
+@@ -234,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
+@@ -273,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
+@@ -290,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
+@@ -337,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
+@@ -352,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
+@@ -366,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