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