--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.IO;\r
+using System.Windows.Forms;\r
+using Handbrake.Functions;\r
+\r
+namespace Handbrake.Controls\r
+{\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
+\r
+ public Subtitles()\r
+ {\r
+ InitializeComponent();\r
+\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
+ {\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 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
+ 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
+ }\r
+\r
+ if (_fileContainer == 0) // MP4 and M4V file extension\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
+ }\r
+\r
+ string trackName = (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
+ ? srtLangVal + " (" + srtFile + ")"\r
+ : drp_subtitleTracks.SelectedItem.ToString();\r
+\r
+\r
+ SubtitleInfo track = new SubtitleInfo\r
+ {\r
+ Track = trackName,\r
+ Forced = forcedVal,\r
+ Burned = burnedVal,\r
+ Default = defaultSub,\r
+ SrtLang = srtLangVal,\r
+ SrtCharCode = srtCode,\r
+ SrtOffset = srtOffsetMs,\r
+ SrtPath = srtPath,\r
+ SrtFileName = srtFile\r
+ };\r
+\r
+ lv_subList.Items.Add(track.ListView);\r
+ SubList.Add(track);\r
+\r
+ }\r
+ private void btn_srtAdd_Click(object sender, EventArgs e)\r
+ {\r
+ if (openFileDialog.ShowDialog() != DialogResult.OK)\r
+ return;\r
+ drp_subtitleTracks.Items.Add(Path.GetFileName(openFileDialog.FileName));\r
+ drp_subtitleTracks.SelectedItem = Path.GetFileName(openFileDialog.FileName);\r
+ }\r
+ private void btn_RemoveSubTrack_Click(object sender, EventArgs e)\r
+ {\r
+ RemoveTrack();\r
+ }\r
+\r
+ // Secondary Controls\r
+ private void lb_subList_SelectedIndexChanged(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
+\r
+ int c = 0;\r
+ if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt")) // We have an SRT\r
+ {\r
+ foreach (var item in drp_subtitleTracks.Items)\r
+ {\r
+ if (item.ToString() == track.SrtFileName)\r
+ drp_subtitleTracks.SelectedIndex = c;\r
+ c++;\r
+ }\r
+ 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 = "Selected Track: " + track.Track;\r
+ }\r
+ else // We have Bitmap/CC\r
+ {\r
+ foreach (var item in drp_subtitleTracks.Items)\r
+ {\r
+ if (item.ToString() == track.Track)\r
+ 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
+ }\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
+ {\r
+ if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
+ {\r
+ check_forced.Enabled = false;\r
+ check_burned.Enabled = false;\r
+ srt_lang.Enabled = true;\r
+ srt_charcode.Enabled = true;\r
+ srt_offset.Enabled = true;\r
+ }\r
+ else\r
+ {\r
+ check_forced.Enabled = true;\r
+ check_burned.Enabled = true;\r
+ srt_lang.Enabled = false;\r
+ srt_charcode.Enabled = false;\r
+ srt_offset.Enabled = false;\r
+ }\r
+ // Update an item in the list if required.\r
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
+\r
+ 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
+ lv_subList.Select();\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
+ }\r
+ private void check_forced_CheckedChanged(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
+ }\r
+ private void check_burned_CheckedChanged(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
+\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
+ }\r
+ private void check_default_CheckedChanged(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
+ else\r
+ SetNoDefault();\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
+ }\r
+ private void srt_offset_ValueChanged(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
+ return;\r
+\r
+ 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
+ }\r
+ private void srt_charcode_SelectedIndexChanged(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
+ }\r
+ private void srt_lang_SelectedIndexChanged(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
+ }\r
+\r
+ // Right Click Menu\r
+ private void mnu_moveup_Click(object sender, EventArgs e)\r
+ {\r
+ if (lv_subList.SelectedIndices.Count != 0)\r
+ {\r
+ ListViewItem item = lv_subList.SelectedItems[0];\r
+ int index = item.Index;\r
+ index--;\r
+\r
+ if (lv_subList.Items.Count > index && index >= 0)\r
+ {\r
+ lv_subList.Items.Remove(item);\r
+ lv_subList.Items.Insert(index, item);\r
+ item.Selected = true;\r
+ lv_subList.Focus();\r
+ }\r
+ }\r
+ }\r
+ private void mnu_movedown_Click(object sender, EventArgs e)\r
+ {\r
+ if (lv_subList.SelectedIndices.Count != 0)\r
+ {\r
+ ListViewItem item = lv_subList.SelectedItems[0];\r
+ int index = item.Index;\r
+ index++;\r
+\r
+ if (index < lv_subList.Items.Count)\r
+ {\r
+ lv_subList.Items.Remove(item);\r
+ lv_subList.Items.Insert(index, item);\r
+ item.Selected = true;\r
+ lv_subList.Focus();\r
+ }\r
+ }\r
+ }\r
+ private void mnu_remove_Click(object sender, EventArgs e)\r
+ {\r
+ RemoveTrack();\r
+ }\r
+\r
+ // Functions\r
+ private void SetNoDefault()\r
+ {\r
+ int c = 0;\r
+ foreach (ListViewItem item in lv_subList.Items)\r
+ {\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
+ }\r
+ c++;\r
+ }\r
+ }\r
+\r
+ private void setNoSrtDefault()\r
+ {\r
+ int c = 0;\r
+ foreach (ListViewItem item in lv_subList.Items)\r
+ {\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
+ }\r
+ c++;\r
+ }\r
+ }\r
+ private void SetNoBurned()\r
+ {\r
+ int c = 0;\r
+ foreach (ListViewItem item in lv_subList.Items)\r
+ {\r
+ if (item.SubItems[2].Text == "Yes")\r
+ {\r
+ item.SubItems[2].Text = "No";\r
+ SubList[c].Burned = "No";\r
+ }\r
+ c++;\r
+ }\r
+ }\r
+ private void RemoveTrack()\r
+ {\r
+ // Remove the Item and reselect the control if the following conditions are met.\r
+ if (lv_subList.SelectedItems.Count != 0)\r
+ {\r
+ // Record the current selected index.\r
+ int currentPosition = lv_subList.SelectedIndices[0];\r
+ int selectedInd = lv_subList.SelectedIndices[0];\r
+\r
+ lv_subList.Items.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
+ {\r
+ if (currentPosition <= (lv_subList.Items.Count - 1))\r
+ lv_subList.Items[currentPosition].Selected = true;\r
+ else if (currentPosition > (lv_subList.Items.Count - 1))\r
+ lv_subList.Items[lv_subList.Items.Count - 1].Selected = true;\r
+\r
+ lv_subList.Select();\r
+ }\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
+ }\r
+}
\ No newline at end of file