OSDN Git Service

translation Controls and EncodeQueue
[handbrake-jp/handbrake-jp.git] / win / C# / Controls / Subtitles.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.IO;\r
4 using System.Windows.Forms;\r
5 using Handbrake.Functions;\r
6 \r
7 namespace Handbrake.Controls\r
8 {\r
9     public partial class Subtitles : UserControl\r
10     {\r
11         readonly IDictionary<string, string> LangMap = new Dictionary<string, string>();\r
12         List<SubtitleInfo> SubList = new List<SubtitleInfo>();\r
13         private int _fileContainer;\r
14 \r
15         public Subtitles()\r
16         {\r
17             InitializeComponent();\r
18 \r
19             LangMap = Main.mapLanguages();\r
20             foreach (string key in LangMap.Keys)\r
21                 srt_lang.Items.Add(key);\r
22 \r
23             srt_charcode.SelectedIndex = 28;\r
24             srt_lang.SelectedIndex = 40;\r
25         }\r
26 \r
27         // Primary Controls\r
28         private void btn_addSubTrack_Click(object sender, EventArgs e)\r
29         {\r
30             // Logic\r
31             string forcedVal = check_forced.CheckState == CheckState.Checked ? "Yes" : "No";\r
32             string defaultSub = check_default.CheckState == CheckState.Checked ? "Yes" : "No";\r
33             string burnedVal = check_burned.CheckState == CheckState.Checked && (!drp_subtitleTracks.Text.Contains("Text")) ? "Yes" : "No";\r
34             string srtCode = "-", srtLangVal = "-", srtPath = "-", srtFile = "-";\r
35             int srtOffsetMs = 0;\r
36 \r
37             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
38             {\r
39                 burnedVal = "No";\r
40                 forcedVal = "No";\r
41                 srtPath = openFileDialog.FileName;\r
42                 srtFile = Path.GetFileName(openFileDialog.FileName);\r
43                 srtLangVal = srt_lang.SelectedItem.ToString();\r
44                 srtCode = srt_charcode.SelectedItem.ToString();\r
45                 srtOffsetMs = (int)srt_offset.Value;\r
46                 if (defaultSub == "Yes") setNoSrtDefault();\r
47             } else\r
48             {\r
49                 if (defaultSub == "Yes") SetNoDefault();\r
50                 if (burnedVal == "Yes") SetNoBurned();\r
51 \r
52                 if (_fileContainer == 0)\r
53                     burnedVal = "Yes";  // MP4 must have bitmap subs burned in.\r
54             }\r
55 \r
56             if (_fileContainer == 0) // MP4 and M4V file extension\r
57             {\r
58                 // Make sure we only have 1 bitmap track.\r
59                 if (drp_subtitleTracks.SelectedItem != null && drp_subtitleTracks.SelectedItem.ToString().Contains("Bitmap"))\r
60                 {\r
61                     foreach (ListViewItem item in lv_subList.Items)\r
62                     {\r
63                         if (item.SubItems[0].Text.Contains("Bitmap"))\r
64                         {\r
65                             MessageBox.Show(this, "MP4形式の場合、字幕トラックは1つのみ使用できます。1つ目の字幕トラックのみが利用されます。",\r
66                                             "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
67                             return;\r
68                         }\r
69                     }\r
70                 }\r
71             }\r
72 \r
73             string trackName = (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
74                                ? srtLangVal + " (" + srtFile + ")"\r
75                                : drp_subtitleTracks.SelectedItem.ToString();\r
76 \r
77 \r
78             SubtitleInfo track = new SubtitleInfo\r
79                                      {\r
80                                          Track = trackName,\r
81                                          Forced = forcedVal,\r
82                                          Burned = burnedVal,\r
83                                          Default = defaultSub,\r
84                                          SrtLang = srtLangVal,\r
85                                          SrtCharCode = srtCode,\r
86                                          SrtOffset = srtOffsetMs,\r
87                                          SrtPath = srtPath,\r
88                                          SrtFileName = srtFile\r
89                                      };\r
90 \r
91             lv_subList.Items.Add(track.ListView);\r
92             SubList.Add(track);\r
93 \r
94         }\r
95         private void btn_srtAdd_Click(object sender, EventArgs e)\r
96         {\r
97             if (openFileDialog.ShowDialog() != DialogResult.OK)\r
98                 return;\r
99             drp_subtitleTracks.Items.Add(Path.GetFileName(openFileDialog.FileName));\r
100             drp_subtitleTracks.SelectedItem = Path.GetFileName(openFileDialog.FileName);\r
101         }\r
102         private void btn_RemoveSubTrack_Click(object sender, EventArgs e)\r
103         {\r
104             RemoveTrack();\r
105         }\r
106 \r
107         // Secondary Controls\r
108         private void lb_subList_SelectedIndexChanged(object sender, EventArgs e)\r
109         {\r
110             // Set the dropdown controls based on the selected item in the List.\r
111             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
112             {\r
113                 SubtitleInfo track = SubList[lv_subList.SelectedIndices[0]];\r
114 \r
115                 int c = 0;\r
116                 if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt"))  // We have an SRT\r
117                 {\r
118                     foreach (var item in drp_subtitleTracks.Items)\r
119                     {\r
120                         if (item.ToString() == track.SrtFileName)\r
121                             drp_subtitleTracks.SelectedIndex = c;\r
122                         c++;\r
123                     }\r
124                     srt_lang.SelectedItem = track.SrtLang;\r
125                     srt_offset.Value = track.SrtOffset;\r
126                     srt_charcode.SelectedItem = track.SrtCharCode;\r
127                     check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
128                     SubGroupBox.Text = "選択中のトラック: " + track.Track;\r
129                 }\r
130                 else  // We have Bitmap/CC\r
131                 {\r
132                     foreach (var item in drp_subtitleTracks.Items)\r
133                     {\r
134                         if (item.ToString() == track.Track)\r
135                             drp_subtitleTracks.SelectedIndex = c;\r
136                         c++;\r
137                     }\r
138                     check_forced.CheckState = track.Forced == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
139                     check_burned.CheckState = track.Burned == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
140                     check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
141                     SubGroupBox.Text = "選択中のトラック: " + lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
142                 }\r
143             }\r
144             else\r
145                 SubGroupBox.Text = "選択中のトラック: なし";\r
146         }\r
147 \r
148         // Bitmap / CC / SRT Controls\r
149         private void drp_subtitleTracks_SelectedIndexChanged(object sender, EventArgs e)\r
150         {\r
151             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
152             {\r
153                 check_forced.Enabled = false;\r
154                 check_burned.Enabled = false;\r
155                 srt_lang.Enabled = true;\r
156                 srt_charcode.Enabled = true;\r
157                 srt_offset.Enabled = true;\r
158             }\r
159             else\r
160             {\r
161                 check_forced.Enabled = true;\r
162                 check_burned.Enabled = true;\r
163                 srt_lang.Enabled = false;\r
164                 srt_charcode.Enabled = false;\r
165                 srt_offset.Enabled = false;\r
166             }\r
167             // Update an item in the  list if required.\r
168             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
169 \r
170             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
171             {\r
172                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text = srt_lang.SelectedItem + "(" +\r
173                     drp_subtitleTracks.SelectedItem + ")";\r
174                 lv_subList.Select();\r
175             } else\r
176             {\r
177                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text =\r
178                     drp_subtitleTracks.SelectedItem.ToString();\r
179                 lv_subList.Select();\r
180             }\r
181 \r
182             SubList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
183         }\r
184         private void check_forced_CheckedChanged(object sender, EventArgs e)\r
185         {\r
186             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
187 \r
188             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = check_forced.Checked ? "Yes" : "No";\r
189             lv_subList.Select();\r
190 \r
191             SubList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
192         }\r
193         private void check_burned_CheckedChanged(object sender, EventArgs e)\r
194         {\r
195             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
196 \r
197             if (check_burned.Checked) // Make sure we only have 1 burned track\r
198                 SetNoBurned();\r
199 \r
200             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_burned.Checked ? "Yes" : "No";\r
201             lv_subList.Select();\r
202 \r
203             SubList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
204         }\r
205         private void check_default_CheckedChanged(object sender, EventArgs e)\r
206         {\r
207             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
208 \r
209             if (check_default.Checked) // Make sure we only have 1 default track\r
210                 if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.Contains(".srt"))\r
211                     setNoSrtDefault();\r
212                 else\r
213                     SetNoDefault();\r
214 \r
215             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_default.Checked ? "Yes" : "No";\r
216             lv_subList.Select();\r
217 \r
218             SubList[lv_subList.SelectedIndices[0]].Default = check_default.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo>\r
219         }\r
220         private void srt_offset_ValueChanged(object sender, EventArgs e)\r
221         {\r
222             // Update an item in the  list if required.\r
223             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0)\r
224                 return;\r
225 \r
226             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text = srt_offset.Value.ToString();\r
227             lv_subList.Select();\r
228 \r
229             SubList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value; // Update SubList List<SubtitleInfo>\r
230         }\r
231         private void srt_charcode_SelectedIndexChanged(object sender, EventArgs e)\r
232         {\r
233             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
234 \r
235             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[5].Text = srt_charcode.SelectedItem.ToString();\r
236             lv_subList.Select();\r
237 \r
238             SubList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
239         }\r
240         private void srt_lang_SelectedIndexChanged(object sender, EventArgs e)\r
241         {\r
242             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
243 \r
244             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = srt_lang.SelectedItem.ToString();\r
245             lv_subList.Select();\r
246 \r
247             SubList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
248         }\r
249 \r
250         // Right Click Menu\r
251         private void mnu_moveup_Click(object sender, EventArgs e)\r
252         {\r
253             if (lv_subList.SelectedIndices.Count != 0)\r
254             {\r
255                 ListViewItem item = lv_subList.SelectedItems[0];\r
256                 int index = item.Index;\r
257                 index--;\r
258 \r
259                 if (lv_subList.Items.Count > index && index >= 0)\r
260                 {\r
261                     lv_subList.Items.Remove(item);\r
262                     lv_subList.Items.Insert(index, item);\r
263                     item.Selected = true;\r
264                     lv_subList.Focus();\r
265                 }\r
266             }\r
267         }\r
268         private void mnu_movedown_Click(object sender, EventArgs e)\r
269         {\r
270             if (lv_subList.SelectedIndices.Count != 0)\r
271             {\r
272                 ListViewItem item = lv_subList.SelectedItems[0];\r
273                 int index = item.Index;\r
274                 index++;\r
275 \r
276                 if (index < lv_subList.Items.Count)\r
277                 {\r
278                     lv_subList.Items.Remove(item);\r
279                     lv_subList.Items.Insert(index, item);\r
280                     item.Selected = true;\r
281                     lv_subList.Focus();\r
282                 }\r
283             }\r
284         }\r
285         private void mnu_remove_Click(object sender, EventArgs e)\r
286         {\r
287             RemoveTrack();\r
288         }\r
289 \r
290         // Functions\r
291         private void SetNoDefault()\r
292         {\r
293             int c = 0;\r
294             foreach (ListViewItem item in lv_subList.Items)\r
295             {\r
296                 if (SubList[c].SrtPath == "-")\r
297                 {\r
298                     if (item.SubItems[3].Text == "Yes")\r
299                     {\r
300                         item.SubItems[3].Text = "No";\r
301                         SubList[c].Default = "No";\r
302                     }     \r
303                 }\r
304                 c++;\r
305             }\r
306         }\r
307 \r
308         private void setNoSrtDefault()\r
309         {\r
310             int c = 0;\r
311             foreach (ListViewItem item in lv_subList.Items)\r
312             {\r
313                 if (SubList[c].SrtPath != "-")\r
314                 {\r
315                     if (item.SubItems[3].Text == "Yes")\r
316                     {\r
317                         item.SubItems[3].Text = "No";\r
318                         SubList[c].Default = "No";\r
319                     }\r
320                 }\r
321                 c++;\r
322             }\r
323         }\r
324         private void SetNoBurned()\r
325         {\r
326             int c = 0;\r
327             foreach (ListViewItem item in lv_subList.Items)\r
328             {\r
329                 if (item.SubItems[2].Text == "Yes")\r
330                 {\r
331                     item.SubItems[2].Text = "No";\r
332                     SubList[c].Burned = "No";\r
333                 }\r
334                 c++;\r
335             }\r
336         }\r
337         private void RemoveTrack()\r
338         {\r
339             // Remove the Item and reselect the control if the following conditions are met.\r
340             if (lv_subList.SelectedItems.Count != 0)\r
341             {\r
342                 // Record the current selected index.\r
343                 int currentPosition = lv_subList.SelectedIndices[0];\r
344                 int selectedInd = lv_subList.SelectedIndices[0];\r
345 \r
346                 lv_subList.Items.RemoveAt(selectedInd);\r
347                 SubList.RemoveAt(selectedInd);\r
348 \r
349                 // Now reslect the correct item and give focus to the list.\r
350                 if (lv_subList.Items.Count != 0)\r
351                 {\r
352                     if (currentPosition <= (lv_subList.Items.Count - 1))\r
353                         lv_subList.Items[currentPosition].Selected = true;\r
354                     else if (currentPosition > (lv_subList.Items.Count - 1))\r
355                         lv_subList.Items[lv_subList.Items.Count - 1].Selected = true;\r
356 \r
357                     lv_subList.Select();\r
358                 }\r
359             }\r
360         }\r
361 \r
362         // Public Functions\r
363         public void Clear()\r
364         {\r
365             lv_subList.Items.Clear();\r
366             SubList.Clear();\r
367         }\r
368         public void SmartClear()\r
369         {\r
370             /* Smart clear will only remove subtitle tracks that do not have an equivlent \r
371               for the new source / title which the user has selected. */\r
372             throw new NotImplementedException();\r
373         }\r
374         public Boolean RequiresM4V()\r
375         {\r
376             foreach (ListViewItem item in lv_subList.Items)\r
377             {\r
378                 if (item.SubItems.Count != 5)\r
379                     return true;\r
380 \r
381                 if (item.SubItems[1].Text.Contains("(Text)"))\r
382                     return true;\r
383             }\r
384             return false;\r
385         }\r
386         public void SetSubtitleTrackAuto()\r
387         {\r
388             // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
389             if (Properties.Settings.Default.NativeLanguage != "Any")\r
390             {\r
391                 if (!Properties.Settings.Default.DubAudio) // We need to add a subtitle track if this is false.\r
392                 {\r
393                     int i = 0;\r
394                     foreach (object item in drp_subtitleTracks.Items)\r
395                     {\r
396                         if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
397                             drp_subtitleTracks.SelectedIndex = i;\r
398 \r
399                         i++;\r
400                     }\r
401 \r
402                     btn_addSubTrack_Click(this, new EventArgs());\r
403                 }\r
404             }\r
405         }\r
406         public void SetContainer(int value)\r
407         {\r
408             _fileContainer = value;\r
409             Boolean trigger = false;\r
410             if (_fileContainer != 1)\r
411                 foreach (ListViewItem item in lv_subList.Items)\r
412                 {\r
413                     if (item.SubItems[1].Text.Contains("Bitmap"))\r
414                     {\r
415                         if (trigger)\r
416                             lv_subList.Items.Remove(item);\r
417                         trigger = true;\r
418                     }\r
419                 }\r
420         }\r
421         public List<SubtitleInfo> GetSubtitleInfoList()\r
422         {\r
423             return SubList;\r
424         }\r
425     }\r
426 \r
427     public class SubtitleInfo\r
428     {\r
429         public string Track { get; set; }\r
430         public string Forced { get; set; }\r
431         public string Burned { get; set; }\r
432         public string Default { get; set; }\r
433         public string SrtLang { get; set; }\r
434         public string SrtCharCode { get; set; }\r
435         public int SrtOffset { get; set; }\r
436         public string SrtPath { get; set; }\r
437         public string SrtFileName { get; set; }\r
438 \r
439         public ListViewItem ListView\r
440         {\r
441             get\r
442             {\r
443                 ListViewItem listTrack = new ListViewItem(Track);\r
444                 listTrack.SubItems.Add(Forced);\r
445                 listTrack.SubItems.Add(Burned);\r
446                 listTrack.SubItems.Add(Default);\r
447                 listTrack.SubItems.Add(SrtLang);\r
448                 listTrack.SubItems.Add(SrtCharCode);\r
449                 listTrack.SubItems.Add(SrtOffset.ToString());\r
450                 return listTrack;\r
451             }\r
452         }\r
453     }\r
454 }