OSDN Git Service

import 0.9.4
[handbrake-jp/handbrake-jp.git] / win / C# / Controls / Subtitles.cs
diff --git a/win/C#/Controls/Subtitles.cs b/win/C#/Controls/Subtitles.cs
new file mode 100644 (file)
index 0000000..80c7edb
--- /dev/null
@@ -0,0 +1,454 @@
+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