OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / Subtitles.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Windows.Forms;\r
4 using Handbrake.Functions;\r
5 \r
6 namespace Handbrake.Controls\r
7 {\r
8     public partial class Subtitles : UserControl\r
9     {\r
10         readonly IDictionary<string, string> LangMap = new Dictionary<string, string>();\r
11 \r
12         public Subtitles()\r
13         {\r
14             InitializeComponent();\r
15 \r
16             LangMap = Main.mapLanguages();\r
17             foreach (string key in LangMap.Keys)\r
18                 srt_lang.Items.Add(key);\r
19 \r
20             srt_charcode.SelectedIndex = 28;\r
21             srt_lang.SelectedIndex = 40;\r
22         }\r
23 \r
24         private int FileContainer;\r
25 \r
26         // Public Functions\r
27         public void Clear()\r
28         {\r
29             lv_subList.Items.Clear();\r
30         }\r
31         public void setSubtitleTrackAuto()\r
32         {\r
33             // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
34             if (Properties.Settings.Default.NativeLanguage != "Any")\r
35             {\r
36                 if (!Properties.Settings.Default.DubAudio) // We need to add a subtitle track if this is false.\r
37                 {\r
38                     int i = 0;\r
39                     foreach (object item in drp_subtitleTracks.Items)\r
40                     {\r
41                         if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
42                             drp_subtitleTracks.SelectedIndex = i;\r
43 \r
44                         i++;\r
45                     }\r
46 \r
47                     btn_addSubTrack_Click(this, new EventArgs());\r
48                 }\r
49             }\r
50         }\r
51         public void setContainer(int value)\r
52         {\r
53             FileContainer = value;\r
54             Boolean trigger = false;\r
55             if (FileContainer != 1)\r
56                 foreach (ListViewItem item in lv_subList.Items)\r
57                 {\r
58                     if (item.SubItems[1].Text.Contains("Bitmap"))\r
59                     {\r
60                         if (trigger)\r
61                             lv_subList.Items.Remove(item);\r
62                         trigger = true;\r
63                     }\r
64                 }\r
65         }\r
66         public Boolean RequiresM4V()\r
67         {\r
68             foreach (ListViewItem item in lv_subList.Items)\r
69             {\r
70                 if (item.SubItems.Count != 5)\r
71                     return true;\r
72 \r
73                 if (item.SubItems[1].Text.Contains("(Text)"))\r
74                     return true;\r
75             }\r
76             return false;\r
77         }\r
78 \r
79         // Controls\r
80         private void btn_addSubTrack_Click(object sender, EventArgs e)\r
81         {\r
82             string forcedVal = "No";\r
83             string burnedVal = "No";\r
84             string defaultSub = "No";\r
85 \r
86             if (check_forced.Checked)\r
87                 forcedVal = "Yes";\r
88 \r
89             if (check_burned.Checked)\r
90             {\r
91                 if (!drp_subtitleTracks.Text.Contains("Text"))\r
92                 {\r
93                     burnedVal = "Yes";\r
94                     setNoBurned();\r
95                 }\r
96             }\r
97 \r
98             if (check_default.Checked)\r
99             {\r
100                 defaultSub = "Yes";\r
101                 setNoDefault();\r
102             }\r
103 \r
104             Boolean addTrack = true;\r
105             if (FileContainer == 0)\r
106             {\r
107                 burnedVal = "Yes";  // MP4 must have bitmap subs burned in.\r
108 \r
109                 // Make sure we only have 1 bitmap track.\r
110                 if (drp_subtitleTracks.SelectedItem != null)\r
111                 {\r
112                     if (drp_subtitleTracks.SelectedItem.ToString().Contains("Bitmap"))\r
113                         foreach (ListViewItem item in lv_subList.Items)\r
114                         {\r
115                             if (item.SubItems[1].Text.Contains("Bitmap"))\r
116                             {\r
117                                 MessageBox.Show(this,\r
118                                                 "More than one vobsub is not supported in mp4... Your first vobsub track will now be used.",\r
119                                                 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
120                                 addTrack = false;\r
121                             }\r
122                         }\r
123                 }\r
124                 else\r
125                     addTrack = false;\r
126 \r
127             }\r
128 \r
129             // Add the track if allowed.\r
130             if (addTrack)\r
131             {\r
132                 ListViewItem newTrack = new ListViewItem(getNewID().ToString());\r
133 \r
134                 newTrack.SubItems.Add(drp_subtitleTracks.SelectedItem.ToString());\r
135                 newTrack.SubItems.Add(forcedVal);\r
136                 newTrack.SubItems.Add(burnedVal);\r
137                 newTrack.SubItems.Add(defaultSub);\r
138 \r
139                 lv_subList.Items.Add(newTrack);\r
140             }\r
141         }\r
142         private void btn_srtAdd_Click(object sender, EventArgs e)\r
143         {\r
144             string defaultSub = "No";\r
145             if (check_default_srt.Checked)\r
146             {\r
147                 defaultSub = "Yes";\r
148                 setNoDefault();\r
149             }\r
150 \r
151             ListViewItem newTrack = new ListViewItem(getNewID().ToString());\r
152 \r
153             newTrack.SubItems.Add(srt_lang.SelectedItem + ", (" + srt_charcode.SelectedItem + ")");\r
154             newTrack.SubItems.Add("No");\r
155             newTrack.SubItems.Add("No");\r
156             newTrack.SubItems.Add(defaultSub);\r
157             if (openFileDialog.FileName != null)\r
158                 newTrack.SubItems.Add(openFileDialog.FileName);\r
159             else\r
160                 newTrack.SubItems.Add("None");\r
161 \r
162             newTrack.SubItems.Add(srt_offset.Value.ToString());\r
163 \r
164             lv_subList.Items.Add(newTrack);\r
165         }\r
166         private void btn_RemoveSubTrack_Click(object sender, EventArgs e)\r
167         {\r
168             removeTrack();\r
169         }\r
170         private void lb_subList_SelectedIndexChanged(object sender, EventArgs e)\r
171         {\r
172             // Set the dropdown controls based on the selected item in the List.\r
173             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
174             {\r
175                 if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems.Count != 5)  // We have an SRT\r
176                 {\r
177                     string[] trackData = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text.Split(',');\r
178                     string charCode = trackData[1].Replace("(", "").Replace(")", "");\r
179                     srt_lang.SelectedItem = trackData[0];\r
180                     srt_charcode.SelectedItem = charCode.Trim();\r
181 \r
182                     int offsetVal;\r
183                     int.TryParse(lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text, out offsetVal);\r
184                     srt_offset.Value = offsetVal;\r
185 \r
186                     check_default_srt.CheckState = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
187 \r
188                     SRTGroup.Text = "Selected Track: " + lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
189                     SubTitlesGroup.Text = "Selected Track: None";\r
190                 }\r
191                 else  // We have Bitmap/CC\r
192                 {\r
193                     // Setup the controls\r
194                     int c = 0;\r
195                     foreach (var item in drp_subtitleTracks.Items)\r
196                     {\r
197                         if (item.ToString() == lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text)\r
198                             drp_subtitleTracks.SelectedIndex = c;\r
199                         c++;\r
200                     }\r
201                     drp_subtitleTracks.SelectedItem = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1];\r
202 \r
203                     check_forced.CheckState = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
204                     check_burned.CheckState = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
205                     check_default.CheckState = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
206 \r
207                     SubTitlesGroup.Text = "Selected Track: " + lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
208                     SRTGroup.Text = "Selected Track: None";\r
209                 }\r
210             }\r
211             else\r
212             {\r
213                 SubTitlesGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
214                 SRTGroup.Text = "Selected Track: None (Click \"Add External SRT\" to add) ";\r
215             }\r
216         }\r
217 \r
218         // Bitmap / CC Controls\r
219         private void drp_subtitleTracks_SelectedIndexChanged(object sender, EventArgs e)\r
220         {\r
221             // Update an item in the  list if required.\r
222             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
223             {\r
224                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = drp_subtitleTracks.SelectedItem.ToString();\r
225                 lv_subList.Select();\r
226             }\r
227         }\r
228         private void check_forced_CheckedChanged(object sender, EventArgs e)\r
229         {\r
230             // Update an item in the  list if required.\r
231             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
232             {\r
233                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_forced.Checked ? "Yes" : "No";\r
234                 lv_subList.Select();\r
235             }\r
236         }\r
237         private void check_burned_CheckedChanged(object sender, EventArgs e)\r
238         {\r
239             // Update an item in the  list if required.\r
240             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
241             {\r
242                 if (check_burned.Checked) // Make sure we only have 1 burned track\r
243                     setNoBurned();\r
244 \r
245                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_burned.Checked ? "Yes" : "No";\r
246                 lv_subList.Select();\r
247             }\r
248         }\r
249         private void check_default_CheckedChanged(object sender, EventArgs e)\r
250         {\r
251             // Update an item in the  list if required.\r
252             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
253             {\r
254                 if (check_default.Checked) // Make sure we only have 1 default track\r
255                     setNoDefault();\r
256 \r
257                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = check_default.Checked ? "Yes" : "No";\r
258                 lv_subList.Select();\r
259             }\r
260         }\r
261         private void check_default_srt_CheckedChanged(object sender, EventArgs e)\r
262         {\r
263             // Update an item in the  list if required.\r
264             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
265             {\r
266                 if (check_default_srt.Checked) // Make sure we only have 1 default track\r
267                     setNoDefault();\r
268 \r
269                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = check_default_srt.Checked ? "Yes" : "No";\r
270                 lv_subList.Select();\r
271             }\r
272         }\r
273 \r
274         // SRT Controls\r
275         private void srt_offset_ValueChanged(object sender, EventArgs e)\r
276         {\r
277             // Update an item in the  list if required.\r
278             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
279             {\r
280                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text = srt_offset.Value.ToString();\r
281                 lv_subList.Select();\r
282             }\r
283         }\r
284         private void srt_charcode_SelectedIndexChanged(object sender, EventArgs e)\r
285         {\r
286             // Update an item in the  list if required.\r
287             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
288             {\r
289                 string[] trackData = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text.Split(',');\r
290 \r
291                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = trackData[0].Trim() + ", (" + srt_charcode.SelectedItem + ")";\r
292                 lv_subList.Select();\r
293             }\r
294         }\r
295         private void srt_lang_SelectedIndexChanged(object sender, EventArgs e)\r
296         {\r
297             // Update an item in the  list if required.\r
298             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
299             {\r
300                 string[] trackData = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text.Split(',');\r
301                 string charCode = trackData[1].Replace("(", "").Replace(")", "").Trim();\r
302 \r
303                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = srt_lang.SelectedItem + ", (" + charCode + ")";\r
304                 lv_subList.Select();\r
305             }\r
306         }\r
307         private void srt_browse_Click(object sender, EventArgs e)\r
308         {\r
309             openFileDialog.ShowDialog();\r
310 \r
311             // Update an item in the  list if required.\r
312             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
313             {\r
314                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[5].Text = openFileDialog.FileName;\r
315                 lv_subList.Select();\r
316             }\r
317         }\r
318 \r
319         // Right Click Menu\r
320         private void mnu_moveup_Click(object sender, EventArgs e)\r
321         {\r
322             if (lv_subList.SelectedIndices.Count != 0)\r
323             {\r
324                 ListViewItem item = lv_subList.SelectedItems[0];\r
325                 int index = item.Index;\r
326                 index--;\r
327 \r
328                 if (lv_subList.Items.Count > index && index >= 0)\r
329                 {\r
330                     lv_subList.Items.Remove(item);\r
331                     lv_subList.Items.Insert(index, item);\r
332                     item.Selected = true;\r
333                     lv_subList.Focus();\r
334                 }\r
335             }\r
336         }\r
337         private void mnu_movedown_Click(object sender, EventArgs e)\r
338         {\r
339             if (lv_subList.SelectedIndices.Count != 0)\r
340             {\r
341                 ListViewItem item = lv_subList.SelectedItems[0];\r
342                 int index = item.Index;\r
343                 index++;\r
344 \r
345                 if (index < lv_subList.Items.Count)\r
346                 {\r
347                     lv_subList.Items.Remove(item);\r
348                     lv_subList.Items.Insert(index, item);\r
349                     item.Selected = true;\r
350                     lv_subList.Focus();\r
351                 }\r
352             }\r
353         }\r
354         private void mnu_remove_Click(object sender, EventArgs e)\r
355         {\r
356             removeTrack();\r
357         }\r
358 \r
359         // Functions\r
360         private void setNoDefault()\r
361         {\r
362             foreach (ListViewItem item in lv_subList.Items)\r
363             {\r
364                 if (item.SubItems[4].Text == "Yes")\r
365                     item.SubItems[4].Text = "No";\r
366             }\r
367         }\r
368         private void setNoBurned()\r
369         {\r
370             foreach (ListViewItem item in lv_subList.Items)\r
371             {\r
372                 if (item.SubItems[3].Text == "Yes")\r
373                     item.SubItems[3].Text = "No";\r
374             }\r
375         }\r
376         private void removeTrack()\r
377         {\r
378             // Remove the Item and reselect the control if the following conditions are met.\r
379             if (lv_subList.SelectedItems.Count != 0)\r
380             {\r
381                 // Record the current selected index.\r
382                 int currentPosition = lv_subList.SelectedIndices[0];\r
383 \r
384                 lv_subList.Items.RemoveAt(lv_subList.SelectedIndices[0]);\r
385 \r
386                 // Now reslect the correct item and give focus to the list.\r
387                 if (lv_subList.Items.Count != 0)\r
388                 {\r
389                     if (currentPosition <= (lv_subList.Items.Count - 1))\r
390                         lv_subList.Items[currentPosition].Selected = true;\r
391                     else if (currentPosition > (lv_subList.Items.Count - 1))\r
392                         lv_subList.Items[lv_subList.Items.Count - 1].Selected = true;\r
393 \r
394                     lv_subList.Select();\r
395                 }\r
396 \r
397                 // Regenerate the ID numers\r
398                 reGenerateListIDs();\r
399             }\r
400         }\r
401 \r
402         // Helper Functions\r
403         private int getNewID()\r
404         {\r
405             return lv_subList.Items.Count + 1;\r
406         }\r
407         private void reGenerateListIDs()\r
408         {\r
409             int i = 1;\r
410             foreach (ListViewItem item in lv_subList.Items)\r
411             {\r
412                 item.SubItems[0].Text = i.ToString();\r
413                 i++;\r
414             }\r
415         }\r
416 \r
417     }\r
418 }\r