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