OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / Subtitles.cs
1 /*  Subtitles.cs $\r
2     This file is part of the HandBrake source code.\r
3     Homepage: <http://handbrake.fr>.\r
4     It may be used under the terms of the GNU General Public License. */\r
5 \r
6 namespace Handbrake.Controls\r
7 {\r
8     using System;\r
9     using System.Collections.Generic;\r
10     using System.IO;\r
11     using System.Linq;\r
12     using System.Windows.Forms;\r
13     using Functions;\r
14     using Model;\r
15 \r
16     /// <summary>\r
17     /// The Subtitles Tab\r
18     /// </summary>\r
19     public partial class Subtitles : UserControl\r
20     {\r
21         /// <summary>\r
22         /// Map of languages to language codes\r
23         /// </summary>\r
24         private readonly IDictionary<string, string> langMap = new Dictionary<string, string>();\r
25 \r
26         /// <summary>\r
27         /// A List of SRT Files\r
28         /// </summary>\r
29         private readonly IDictionary<string, string> srtFiles = new Dictionary<string, string>();\r
30 \r
31         /// <summary>\r
32         /// The Subtitle List\r
33         /// </summary>\r
34         private readonly List<SubtitleInfo> subList = new List<SubtitleInfo>();\r
35 \r
36         /// <summary>\r
37         /// Initializes a new instance of the <see cref="Subtitles"/> class.\r
38         /// </summary>\r
39         public Subtitles()\r
40         {\r
41             InitializeComponent();\r
42 \r
43             langMap = Main.MapLanguages();\r
44             foreach (string key in langMap.Keys)\r
45                 srt_lang.Items.Add(key);\r
46 \r
47             srt_charcode.SelectedIndex = 28;\r
48             srt_lang.SelectedIndex = 40;\r
49         }\r
50 \r
51         /// <summary>\r
52         /// Gets the CLI Query for this panel\r
53         /// </summary>\r
54         /// <returns>A CliQuery string</returns>\r
55         public string GetCliQuery\r
56         {\r
57             get\r
58             {\r
59                 string query = string.Empty;\r
60                 if (lv_subList.Items.Count != 0) // If we have subtitle tracks\r
61                 {\r
62                     // BitMap and CC's\r
63                     string subtitleTracks = String.Empty;\r
64                     string subtitleForced = String.Empty;\r
65                     string subtitleBurn = String.Empty;\r
66                     string subtitleDefault = String.Empty;\r
67 \r
68                     // SRT\r
69                     string srtFile = String.Empty;\r
70                     string srtCodeset = String.Empty;\r
71                     string srtOffset = String.Empty;\r
72                     string srtLang = String.Empty;\r
73                     string srtDefault = String.Empty;\r
74                     int srtCount = 0;\r
75 \r
76                     foreach (SubtitleInfo item in subList)\r
77                     {\r
78                         string itemToAdd, trackId;\r
79 \r
80                         if (item.IsSrtSubtitle) // We have an SRT file\r
81                         {\r
82                             srtCount++; // SRT track id.\r
83 \r
84                             srtLang += srtLang == string.Empty ? langMap[item.SrtLang] : "," + langMap[item.SrtLang];\r
85                             srtCodeset += srtCodeset == string.Empty ? item.SrtCharCode : "," + item.SrtCharCode;\r
86 \r
87                             if (item.Default == "Yes")\r
88                                 srtDefault = srtCount.ToString();\r
89 \r
90                             itemToAdd = item.SrtPath;\r
91                             srtFile += srtFile == string.Empty ? itemToAdd : "," + itemToAdd;\r
92 \r
93                             itemToAdd = item.SrtOffset.ToString();\r
94                             srtOffset += srtOffset == string.Empty ? itemToAdd : "," + itemToAdd;\r
95                         }\r
96                         else // We have Bitmap or CC\r
97                         {\r
98                             string[] tempSub;\r
99 \r
100                             // Find --subtitle <string>\r
101                             if (item.Track.Contains("Foreign Audio Search"))\r
102                                 itemToAdd = "scan";\r
103                             else\r
104                             {\r
105                                 tempSub = item.Track.Split(' ');\r
106                                 itemToAdd = tempSub[0];\r
107                             }\r
108 \r
109                             subtitleTracks += subtitleTracks == string.Empty ? itemToAdd : "," + itemToAdd;\r
110 \r
111                             // Find --subtitle-forced\r
112                             itemToAdd = string.Empty;\r
113                             tempSub = item.Track.Split(' ');\r
114                             trackId = tempSub[0];\r
115 \r
116                             if (item.Forced == "Yes")\r
117                                 itemToAdd = "scan";\r
118 \r
119                             if (itemToAdd != string.Empty)\r
120                                 subtitleForced += subtitleForced == string.Empty ? itemToAdd : "," + itemToAdd;\r
121 \r
122                             // Find --subtitle-burn and --subtitle-default\r
123                             trackId = tempSub[0];\r
124 \r
125                             if (trackId.Trim() == "Foreign") // foreign audio search\r
126                                 trackId = "scan";\r
127 \r
128                             if (item.Burned == "Yes") // burn\r
129                                 subtitleBurn = trackId;\r
130 \r
131                             if (item.Default == "Yes") // default\r
132                                 subtitleDefault = trackId;\r
133                         }\r
134                     }\r
135 \r
136                     // Build The CLI Subtitles Query\r
137                     if (subtitleTracks != string.Empty)\r
138                     {\r
139                         query += " --subtitle " + subtitleTracks;\r
140 \r
141                         if (subtitleForced != string.Empty)\r
142                             query += " --subtitle-forced=" + subtitleForced;\r
143                         if (subtitleBurn != string.Empty)\r
144                             query += " --subtitle-burn=" + subtitleBurn;\r
145                         if (subtitleDefault != string.Empty)\r
146                             query += " --subtitle-default=" + subtitleDefault;\r
147                     }\r
148 \r
149                     if (srtFile != string.Empty) // SRTs\r
150                     {\r
151                         query += " --srt-file " + "\"" + srtFile + "\"";\r
152 \r
153                         if (srtCodeset != string.Empty)\r
154                             query += " --srt-codeset " + srtCodeset;\r
155                         if (srtOffset != string.Empty)\r
156                             query += " --srt-offset " + srtOffset;\r
157                         if (srtLang != string.Empty)\r
158                             query += " --srt-lang " + srtLang;\r
159                         if (srtDefault != string.Empty)\r
160                             query += " --srt-default=" + srtDefault;\r
161                     }\r
162                 }\r
163                 return query;\r
164             }\r
165         }\r
166 \r
167         /* Primary Controls */\r
168 \r
169         /// <summary>\r
170         /// Add a Subtitle track.\r
171         /// </summary>\r
172         /// <param name="sender">\r
173         /// The sender.\r
174         /// </param>\r
175         /// <param name="e">\r
176         /// The e.\r
177         /// </param>\r
178         private void BtnAddSubTrackClick(object sender, EventArgs e)\r
179         {\r
180             // Logic\r
181             string forcedVal = check_forced.CheckState == CheckState.Checked ? "Yes" : "No";\r
182             string defaultSub = check_default.CheckState == CheckState.Checked ? "Yes" : "No";\r
183             string burnedVal = check_burned.CheckState == CheckState.Checked &&\r
184                                (!drp_subtitleTracks.Text.Contains("Text"))\r
185                                    ? "Yes"\r
186                                    : "No";\r
187             string srtCode = "-", srtLangVal = "-", srtPath = "-", srtFile = "-";\r
188             int srtOffsetMs = 0;\r
189 \r
190             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
191             {\r
192                 burnedVal = "No";\r
193                 forcedVal = "No";\r
194                 srtFiles.TryGetValue(drp_subtitleTracks.SelectedItem.ToString(), out srtPath);\r
195                 srtFile = drp_subtitleTracks.SelectedItem.ToString();\r
196                 srtLangVal = srt_lang.SelectedItem.ToString();\r
197                 srtCode = srt_charcode.SelectedItem.ToString();\r
198                 srtOffsetMs = (int)srt_offset.Value;\r
199                 if (defaultSub == "Yes") SetNoSrtDefault();\r
200             }\r
201             else\r
202             {\r
203                 if (defaultSub == "Yes") SetNoDefault();\r
204                 if (burnedVal == "Yes") SetNoBurned();\r
205             }\r
206 \r
207             string trackName = (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
208                                    ? srtLangVal + " (" + srtFile + ")"\r
209                                    : drp_subtitleTracks.SelectedItem.ToString();\r
210 \r
211             SubtitleInfo track = new SubtitleInfo\r
212                                      {\r
213                                          Track = trackName,\r
214                                          Forced = forcedVal,\r
215                                          Burned = burnedVal,\r
216                                          Default = defaultSub,\r
217                                          SrtLang = srtLangVal,\r
218                                          SrtCharCode = srtCode,\r
219                                          SrtOffset = srtOffsetMs,\r
220                                          SrtPath = srtPath,\r
221                                          SrtFileName = srtFile\r
222                                      };\r
223 \r
224             lv_subList.Items.Add(track.ListView);\r
225             subList.Add(track);\r
226         }\r
227 \r
228         /// <summary>\r
229         /// Import an SRT Subtitle Track\r
230         /// </summary>\r
231         /// <param name="sender">\r
232         /// The sender.\r
233         /// </param>\r
234         /// <param name="e">\r
235         /// The e.\r
236         /// </param>\r
237         private void BtnSrtAddClick(object sender, EventArgs e)\r
238         {\r
239             if (openFileDialog.ShowDialog() != DialogResult.OK)\r
240                 return;\r
241 \r
242             if (srtFiles.ContainsKey(Path.GetFileName(openFileDialog.FileName)))\r
243             {\r
244                 MessageBox.Show(\r
245                     "A Subtitle track with the same name has already been imported.",\r
246                     "Warning",\r
247                     MessageBoxButtons.OK,\r
248                     MessageBoxIcon.Warning);\r
249                 return;\r
250             }\r
251 \r
252             drp_subtitleTracks.Items.Add(Path.GetFileName(openFileDialog.FileName));\r
253             drp_subtitleTracks.SelectedItem = Path.GetFileName(openFileDialog.FileName);\r
254             srtFiles.Add(Path.GetFileName(openFileDialog.FileName), openFileDialog.FileName);\r
255         }\r
256 \r
257         /// <summary>\r
258         /// Remove a subtitle track\r
259         /// </summary>\r
260         /// <param name="sender">\r
261         /// The sender.\r
262         /// </param>\r
263         /// <param name="e">\r
264         /// The e.\r
265         /// </param>\r
266         private void BtnRemoveSubTrackClick(object sender, EventArgs e)\r
267         {\r
268             RemoveTrack();\r
269         }\r
270 \r
271         /// <summary>\r
272         /// The Subtitle List selected index has changed\r
273         /// </summary>\r
274         /// <param name="sender">\r
275         /// The sender.\r
276         /// </param>\r
277         /// <param name="e">\r
278         /// The e.\r
279         /// </param>\r
280         private void LbSubListSelectedIndexChanged(object sender, EventArgs e)\r
281         {\r
282             // Set the dropdown controls based on the selected item in the List.\r
283             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
284             {\r
285                 SubtitleInfo track = subList[lv_subList.SelectedIndices[0]];\r
286 \r
287                 int c = 0;\r
288                 if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt"))\r
289                 // We have an SRT\r
290                 {\r
291                     foreach (var item in drp_subtitleTracks.Items)\r
292                     {\r
293                         if (item.ToString() == track.SrtFileName)\r
294                             drp_subtitleTracks.SelectedIndex = c;\r
295                         c++;\r
296                     }\r
297                     srt_lang.SelectedItem = track.SrtLang;\r
298                     srt_offset.Value = track.SrtOffset;\r
299                     srt_charcode.SelectedItem = track.SrtCharCode;\r
300                     check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
301                     SubGroupBox.Text = "Selected Track: " + track.Track;\r
302                 }\r
303                 else // We have Bitmap/CC\r
304                 {\r
305                     foreach (var item in drp_subtitleTracks.Items)\r
306                     {\r
307                         if (item.ToString() == track.Track)\r
308                             drp_subtitleTracks.SelectedIndex = c;\r
309                         c++;\r
310                     }\r
311                     check_forced.CheckState = track.Forced == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
312                     check_burned.CheckState = track.Burned == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
313                     check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
314                     SubGroupBox.Text = "Selected Track: " +\r
315                                        lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
316                 }\r
317             }\r
318             else\r
319                 SubGroupBox.Text = "Selected Track: None (Click \"Add\" to add another track to the list)";\r
320         }\r
321 \r
322         /* Bitmap / CC / SRT Controls */\r
323 \r
324         /// <summary>\r
325         /// Handle the Subtitle track dropdown changed event\r
326         /// </summary>\r
327         /// <param name="sender">\r
328         /// The sender.\r
329         /// </param>\r
330         /// <param name="e">\r
331         /// The e.\r
332         /// </param>\r
333         private void DrpSubtitleTracksSelectedIndexChanged(object sender, EventArgs e)\r
334         {\r
335             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
336             {\r
337                 check_forced.Enabled = false;\r
338                 check_burned.Enabled = false;\r
339                 srt_lang.Enabled = true;\r
340                 srt_charcode.Enabled = true;\r
341                 srt_offset.Enabled = true;\r
342             }\r
343             else\r
344             {\r
345                 check_forced.Enabled = true;\r
346                 check_burned.Enabled = true;\r
347                 srt_lang.Enabled = false;\r
348                 srt_charcode.Enabled = false;\r
349                 srt_offset.Enabled = false;\r
350             }\r
351             // Update an item in the  list if required.\r
352             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
353 \r
354             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
355             {\r
356                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text = srt_lang.SelectedItem + "(" +\r
357                                                                                    drp_subtitleTracks.SelectedItem + ")";\r
358                 lv_subList.Select();\r
359 \r
360                 string srtPath;\r
361                 srtFiles.TryGetValue(drp_subtitleTracks.SelectedItem.ToString(), out srtPath);\r
362                 subList[lv_subList.SelectedIndices[0]].SrtPath = srtPath;\r
363             }\r
364             else\r
365             {\r
366                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text =\r
367                     drp_subtitleTracks.SelectedItem.ToString();\r
368                 lv_subList.Select();\r
369             }\r
370 \r
371             subList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString();\r
372         }\r
373 \r
374         /// <summary>\r
375         /// Foreced Subtitles checkbox changed\r
376         /// </summary>\r
377         /// <param name="sender">\r
378         /// The sender.\r
379         /// </param>\r
380         /// <param name="e">\r
381         /// The e.\r
382         /// </param>\r
383         private void CheckForcedCheckedChanged(object sender, EventArgs e)\r
384         {\r
385             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
386 \r
387             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = check_forced.Checked ? "Yes" : "No";\r
388             lv_subList.Select();\r
389 \r
390             subList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked ? "Yes" : "No";\r
391             // Update SubList List<SubtitleInfo> \r
392         }\r
393 \r
394         /// <summary>\r
395         /// Burned in subtitles checkbox changed\r
396         /// </summary>\r
397         /// <param name="sender">\r
398         /// The sender.\r
399         /// </param>\r
400         /// <param name="e">\r
401         /// The e.\r
402         /// </param>\r
403         private void CheckBurnedCheckedChanged(object sender, EventArgs e)\r
404         {\r
405             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
406 \r
407             if (check_burned.Checked) // Make sure we only have 1 burned track\r
408                 SetNoBurned();\r
409 \r
410             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_burned.Checked ? "Yes" : "No";\r
411             lv_subList.Select();\r
412 \r
413             subList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked ? "Yes" : "No";\r
414             // Update SubList List<SubtitleInfo> \r
415         }\r
416 \r
417         /// <summary>\r
418         /// Default Subitle track check changed\r
419         /// </summary>\r
420         /// <param name="sender">\r
421         /// The sender.\r
422         /// </param>\r
423         /// <param name="e">\r
424         /// The e.\r
425         /// </param>\r
426         private void CheckDefaultCheckedChanged(object sender, EventArgs e)\r
427         {\r
428             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
429 \r
430             if (check_default.Checked) // Make sure we only have 1 default track\r
431                 if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.Contains(".srt"))\r
432                     SetNoSrtDefault();\r
433                 else\r
434                     SetNoDefault();\r
435 \r
436             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_default.Checked ? "Yes" : "No";\r
437             lv_subList.Select();\r
438 \r
439             subList[lv_subList.SelectedIndices[0]].Default = check_default.Checked ? "Yes" : "No";\r
440             // Update SubList List<SubtitleInfo>\r
441         }\r
442 \r
443         /// <summary>\r
444         /// Srt Offset Numeric Control Changed\r
445         /// </summary>\r
446         /// <param name="sender">\r
447         /// The sender.\r
448         /// </param>\r
449         /// <param name="e">\r
450         /// The e.\r
451         /// </param>\r
452         private void SrtOffsetValueChanged(object sender, EventArgs e)\r
453         {\r
454             // Update an item in the  list if required.\r
455             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0)\r
456                 return;\r
457 \r
458             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text = srt_offset.Value.ToString();\r
459             lv_subList.Select();\r
460 \r
461             subList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value;\r
462         }\r
463 \r
464         /// <summary>\r
465         /// The SRT Charcode changed\r
466         /// </summary>\r
467         /// <param name="sender">\r
468         /// The sender.\r
469         /// </param>\r
470         /// <param name="e">\r
471         /// The e.\r
472         /// </param>\r
473         private void SrtCharcodeSelectedIndexChanged(object sender, EventArgs e)\r
474         {\r
475             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
476 \r
477             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[5].Text = srt_charcode.SelectedItem.ToString();\r
478             lv_subList.Select();\r
479 \r
480             subList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString();\r
481             // Update SubList List<SubtitleInfo>\r
482         }\r
483 \r
484         /// <summary>\r
485         /// The Srt Language code changed\r
486         /// </summary>\r
487         /// <param name="sender">\r
488         /// The sender.\r
489         /// </param>\r
490         /// <param name="e">\r
491         /// The e.\r
492         /// </param>\r
493         private void SrtLangSelectedIndexChanged(object sender, EventArgs e)\r
494         {\r
495             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
496 \r
497             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = srt_lang.SelectedItem.ToString();\r
498             lv_subList.Select();\r
499 \r
500             subList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString();\r
501             // Update SubList List<SubtitleInfo>\r
502         }\r
503 \r
504         /* Right Click Menu */\r
505 \r
506         /// <summary>\r
507         /// Move an item in the subtitle list up\r
508         /// </summary>\r
509         /// <param name="sender">\r
510         /// The sender.\r
511         /// </param>\r
512         /// <param name="e">\r
513         /// The e.\r
514         /// </param>\r
515         private void MnuMoveupClick(object sender, EventArgs e)\r
516         {\r
517             if (lv_subList.SelectedIndices.Count != 0)\r
518             {\r
519                 ListViewItem item = lv_subList.SelectedItems[0];\r
520                 int index = item.Index;\r
521                 index--;\r
522 \r
523                 if (lv_subList.Items.Count > index && index >= 0)\r
524                 {\r
525                     lv_subList.Items.Remove(item);\r
526                     lv_subList.Items.Insert(index, item);\r
527                     item.Selected = true;\r
528                     lv_subList.Focus();\r
529                 }\r
530             }\r
531         }\r
532 \r
533         /// <summary>\r
534         /// Move an item in the subtitle list down\r
535         /// </summary>\r
536         /// <param name="sender">\r
537         /// The sender.\r
538         /// </param>\r
539         /// <param name="e">\r
540         /// The e.\r
541         /// </param>\r
542         private void MnuMovedownClick(object sender, EventArgs e)\r
543         {\r
544             if (lv_subList.SelectedIndices.Count != 0)\r
545             {\r
546                 ListViewItem item = lv_subList.SelectedItems[0];\r
547                 int index = item.Index;\r
548                 index++;\r
549 \r
550                 if (index < lv_subList.Items.Count)\r
551                 {\r
552                     lv_subList.Items.Remove(item);\r
553                     lv_subList.Items.Insert(index, item);\r
554                     item.Selected = true;\r
555                     lv_subList.Focus();\r
556                 }\r
557             }\r
558         }\r
559 \r
560         /// <summary>\r
561         /// Remove a selected subtitle track.\r
562         /// </summary>\r
563         /// <param name="sender">\r
564         /// The sender.\r
565         /// </param>\r
566         /// <param name="e">\r
567         /// The e.\r
568         /// </param>\r
569         private void MnuRemoveClick(object sender, EventArgs e)\r
570         {\r
571             RemoveTrack();\r
572         }\r
573 \r
574         /* Functions */\r
575 \r
576         /// <summary>\r
577         /// Set all Non SRT tracks to Default = NO\r
578         /// </summary>\r
579         private void SetNoDefault()\r
580         {\r
581             int c = 0;\r
582             foreach (ListViewItem item in lv_subList.Items)\r
583             {\r
584                 if (subList[c].SrtPath == "-")\r
585                 {\r
586                     if (item.SubItems[3].Text == "Yes")\r
587                     {\r
588                         item.SubItems[3].Text = "No";\r
589                         subList[c].Default = "No";\r
590                     }\r
591                 }\r
592                 c++;\r
593             }\r
594         }\r
595 \r
596         /// <summary>\r
597         /// Set all subtitle tracks so that they have no default.\r
598         /// </summary>\r
599         private void SetNoSrtDefault()\r
600         {\r
601             int c = 0;\r
602             foreach (ListViewItem item in lv_subList.Items)\r
603             {\r
604                 if (!subList[c].IsSrtSubtitle)\r
605                 {\r
606                     if (item.SubItems[3].Text == "Yes")\r
607                     {\r
608                         item.SubItems[3].Text = "No";\r
609                         subList[c].Default = "No";\r
610                     }\r
611                 }\r
612                 c++;\r
613             }\r
614         }\r
615 \r
616         /// <summary>\r
617         /// Set all tracks to Burned = No\r
618         /// </summary>\r
619         private void SetNoBurned()\r
620         {\r
621             int c = 0;\r
622             foreach (ListViewItem item in lv_subList.Items)\r
623             {\r
624                 if (item.SubItems[2].Text == "Yes")\r
625                 {\r
626                     item.SubItems[2].Text = "No";\r
627                     subList[c].Burned = "No";\r
628                 }\r
629                 c++;\r
630             }\r
631         }\r
632 \r
633         /// <summary>\r
634         /// Remove a selected track\r
635         /// </summary>\r
636         private void RemoveTrack()\r
637         {\r
638             // Remove the Item and reselect the control if the following conditions are met.\r
639             if (lv_subList.SelectedItems.Count != 0)\r
640             {\r
641                 // Record the current selected index.\r
642                 int currentPosition = lv_subList.SelectedIndices[0];\r
643                 int selectedInd = lv_subList.SelectedIndices[0];\r
644 \r
645                 lv_subList.Items.RemoveAt(selectedInd);\r
646                 subList.RemoveAt(selectedInd);\r
647 \r
648                 // Now reslect the correct item and give focus to the list.\r
649                 if (lv_subList.Items.Count != 0)\r
650                 {\r
651                     if (currentPosition <= (lv_subList.Items.Count - 1))\r
652                         lv_subList.Items[currentPosition].Selected = true;\r
653                     else if (currentPosition > (lv_subList.Items.Count - 1))\r
654                         lv_subList.Items[lv_subList.Items.Count - 1].Selected = true;\r
655 \r
656                     lv_subList.Select();\r
657                 }\r
658             }\r
659         }\r
660 \r
661         /// <summary>\r
662         /// Clear the Subtitle List\r
663         /// </summary>\r
664         public void Clear()\r
665         {\r
666             lv_subList.Items.Clear();\r
667             subList.Clear();\r
668         }\r
669 \r
670         /// <summary>\r
671         /// Checks of the current settings will require the m4v file extension\r
672         /// </summary>\r
673         /// <returns>True if Yes</returns>\r
674         public bool RequiresM4V()\r
675         {\r
676             return this.lv_subList.Items.Cast<ListViewItem>().Any(item => item.SubItems.Count != 5 || item.SubItems[1].Text.Contains("(Text)"));\r
677         }\r
678 \r
679         /// <summary>\r
680         /// Automatically setup the subtitle tracks.\r
681         /// This handles the automatic setup of subitles which the user can control from the program options\r
682         /// </summary>\r
683         /// <param name="subs">List of Subtitles</param>\r
684         public void SetSubtitleTrackAuto(object[] subs)\r
685         {\r
686             drp_subtitleTracks.Items.Clear();\r
687             drp_subtitleTracks.Items.Add("Foreign Audio Search (Bitmap)");\r
688             drp_subtitleTracks.Items.AddRange(subs);\r
689             drp_subtitleTracks.SelectedIndex = 0;\r
690             Clear();\r
691 \r
692             // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
693             if (Properties.Settings.Default.NativeLanguage != "Any")\r
694             {\r
695                 if (!Properties.Settings.Default.DubAudio) // We need to add a subtitle track if this is false.\r
696                 {\r
697                     int i = 0;\r
698                     foreach (object item in drp_subtitleTracks.Items)\r
699                     {\r
700                         if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
701                             drp_subtitleTracks.SelectedIndex = i;\r
702 \r
703                         i++;\r
704                     }\r
705 \r
706                     BtnAddSubTrackClick(this, new EventArgs());\r
707                 }\r
708             }\r
709         }\r
710 \r
711         /// <summary>\r
712         /// Get the list of subtitles.\r
713         /// </summary>\r
714         /// <returns>A List of SubtitleInfo Object</returns>\r
715         public List<SubtitleInfo> GetSubtitleInfoList()\r
716         {\r
717             return subList;\r
718         }\r
719     }\r
720 }