OSDN Git Service

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