OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmMain.cs
1 /*  frmMain.cs $\r
2         \r
3            This file is part of the HandBrake source code.\r
4            Homepage: <http://handbrake.m0k.org/>.\r
5            It may be used under the terms of the GNU General Public License. */\r
6 \r
7 using System;\r
8 using System.Collections.Generic;\r
9 using System.Collections.Specialized;\r
10 using System.ComponentModel;\r
11 using System.Data;\r
12 using System.Drawing;\r
13 using System.Text;\r
14 using System.Windows.Forms;\r
15 using System.Net;\r
16 using System.IO;\r
17 using System.Diagnostics;\r
18 using System.Threading;\r
19 using System.Runtime.InteropServices;\r
20 using System.Globalization;\r
21 using System.Text.RegularExpressions;\r
22 \r
23 namespace Handbrake\r
24 {\r
25     public partial class frmMain : Form\r
26     {\r
27         // -------------------------------------------------------------- \r
28         // Applicaiton Startup Stuff\r
29         // --------------------------------------------------------------\r
30 \r
31         #region Application Startup\r
32 \r
33         // Some stuff that needs to be Initialized. \r
34         private Process hbProc;\r
35         private Parsing.DVD thisDVD;\r
36         private frmQueue queueWindow = new frmQueue();\r
37         private delegate void updateStatusChanger();\r
38         Functions.Common hb_common_func = new Functions.Common();\r
39 \r
40         public frmMain()\r
41         {\r
42             // Load the splash screen in this thread\r
43             Form splash = new frmSplashScreen();\r
44             splash.Show();\r
45 \r
46             //Create a label that can be updated from the parent thread.\r
47             Label lblStatus = new Label();\r
48             lblStatus.Size = new Size(250, 20);\r
49             lblStatus.Location = new Point(10, 280);\r
50             splash.Controls.Add(lblStatus);\r
51 \r
52             //Fire a thread to wait for 2 seconds.  The splash screen will exit when the time expires\r
53             Thread timer = new Thread(splashTimer);\r
54             timer.Start();\r
55 \r
56             InitializeComponent();\r
57 \r
58             // show the form, but leave disabled until preloading is complete then show the main form\r
59             this.Enabled = false;\r
60 \r
61             this.Show();\r
62 \r
63             // Forces frmMain to draw\r
64             Application.DoEvents();\r
65 \r
66             // update the status\r
67             if (Properties.Settings.Default.updateStatus == "Checked")\r
68             {\r
69                 lblStatus.Text = "Checking for updates ...";\r
70                 Application.DoEvents();\r
71                 Thread updateCheckThread = new Thread(startupUpdateCheck);\r
72                 updateCheckThread.Start();\r
73                 Thread.Sleep(100);\r
74             }\r
75 \r
76             // Update the presets\r
77             if (Properties.Settings.Default.updatePresets == "Checked")\r
78             {\r
79                 lblStatus.Text = "Updaing Presets ...";\r
80                 Application.DoEvents();\r
81                 grabCLIPresets();\r
82                 Thread.Sleep(200);\r
83             }\r
84 \r
85             // Load the presets for the preset box\r
86             updatePresets();\r
87 \r
88             // Now load the users default if required. (Will overide the above setting)\r
89             if (Properties.Settings.Default.defaultSettings == "Checked")\r
90             {\r
91                 lblStatus.Text = "Loading User Default Settings...";\r
92                 Application.DoEvents();\r
93                 loadUserDefaults();\r
94                 Thread.Sleep(100);\r
95             }\r
96             else\r
97                 loadNormalPreset();\r
98 \r
99             // Enable or disable tooltips\r
100             if (Properties.Settings.Default.tooltipEnable == "Checked")\r
101             {\r
102                 lblStatus.Text = "Loading Tooltips ...";\r
103                 Application.DoEvents();\r
104                 ToolTip.Active = true;\r
105                 Thread.Sleep(100);\r
106             }\r
107 \r
108             // Make sure a default cropping option is selected. Not sure why this is not defaulting like the other checkdowns,\r
109             // Can fix it later.\r
110             drp_crop.SelectedItem = "Automatic";\r
111 \r
112             //Finished Loading\r
113             lblStatus.Text = "Loading Complete!";\r
114             Application.DoEvents();\r
115             Thread.Sleep(200);\r
116 \r
117             // Wait until splash screen is done\r
118             while (timer.IsAlive)\r
119             { Thread.Sleep(100); }\r
120 \r
121             //Close the splash screen\r
122             splash.Close();\r
123             splash.Dispose();\r
124 \r
125             // Turn the interface back to the user\r
126             this.Enabled = true;\r
127         }\r
128     \r
129         private void startupUpdateCheck()\r
130         {\r
131             try\r
132             {\r
133                 if (this.InvokeRequired)\r
134                 {\r
135                     this.BeginInvoke(new updateStatusChanger(startupUpdateCheck));\r
136                     return;\r
137                 }\r
138                 \r
139                 Boolean update = hb_common_func.updateCheck();\r
140                 if (update == true)\r
141                 {\r
142                     frmUpdater updateWindow = new frmUpdater();\r
143                     updateWindow.Show();\r
144                 }\r
145             }\r
146             catch (Exception exc)\r
147             {\r
148                 MessageBox.Show(exc.ToString());\r
149             }\r
150         }\r
151 \r
152         private void splashTimer(object sender)\r
153         {\r
154             Thread.Sleep(1000);  //sit for 1 seconds then exit\r
155         }\r
156 \r
157         private void showSplash(object sender)\r
158         {\r
159             Form splash = new frmSplashScreen();\r
160             splash.Show();\r
161         }\r
162 \r
163         private void loadUserDefaults()\r
164         {\r
165             string userDefaults = Properties.Settings.Default.defaultUserSettings;\r
166             try\r
167             {\r
168                 // Some things that need to be done to reset some gui components:\r
169                 CheckPixelRatio.CheckState = CheckState.Unchecked;\r
170 \r
171                 // Send the query from the file to the Query Parser class Then load the preset\r
172                 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(userDefaults);\r
173                 hb_common_func.presetLoader(this, presetQuery, "User Defaults ");\r
174             }\r
175             catch (Exception exc)\r
176             {\r
177                 MessageBox.Show("Unable to load user Default Settings. \n\n" + exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
178             }\r
179         }\r
180 \r
181         #endregion\r
182 \r
183         #region Set Varible Function\r
184         public void setStreamReader(Parsing.DVD dvd)\r
185         {\r
186             this.thisDVD = dvd;\r
187         }\r
188         #endregion\r
189 \r
190         // -------------------------------------------------------------- \r
191         // The main Menu bar.\r
192         // -------------------------------------------------------------- \r
193 \r
194         #region File Menu\r
195         private void mnu_open_Click(object sender, EventArgs e)\r
196         {\r
197             string filename;\r
198             File_Open.ShowDialog();\r
199             filename = File_Open.FileName;\r
200 \r
201             if (filename != "")\r
202             {\r
203                 try\r
204                 {\r
205                     // Create StreamReader & open file\r
206                     StreamReader line = new StreamReader(filename);\r
207 \r
208                     // Send the query from the file to the Query Parser class then load the preset\r
209                     Functions.QueryParser presetQuery = Functions.QueryParser.Parse(line.ReadLine());\r
210                     hb_common_func.presetLoader(this, presetQuery, filename);\r
211 \r
212                     // Close the stream\r
213                     line.Close();\r
214                 }\r
215                 catch (Exception exc)\r
216                 {\r
217                     MessageBox.Show("Unable to load profile. \n\n" + exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
218                 }\r
219             }\r
220         }\r
221 \r
222         private void mnu_save_Click(object sender, EventArgs e)\r
223         {\r
224             string filename;\r
225             File_Save.ShowDialog();\r
226             filename = File_Save.FileName;\r
227             if (filename != "")\r
228             {\r
229                 try\r
230                 {\r
231                     // Create a StreamWriter and open the file\r
232                     StreamWriter line = new StreamWriter(filename);\r
233 \r
234                     // Generate and write the query string to the file\r
235                     String query = hb_common_func.GenerateTheQuery(this);\r
236                     line.WriteLine(query);\r
237 \r
238                     // close the stream\r
239                     line.Close();\r
240                     MessageBox.Show("Your profile has been sucessfully saved.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
241                 }\r
242                 catch (Exception)\r
243                 {\r
244                     MessageBox.Show("Unable to write to the file. Please make sure the location has the correct permissions for file writing.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
245                 }\r
246 \r
247             }\r
248         }\r
249 \r
250         private void mnu_exit_Click(object sender, EventArgs e)\r
251         {\r
252             Application.Exit();\r
253         }\r
254 \r
255         #endregion\r
256 \r
257         #region Tools Menu\r
258 \r
259         private void mnu_encode_Click(object sender, EventArgs e)\r
260         {\r
261             showQueue();\r
262         }\r
263 \r
264         private void mnu_viewDVDdata_Click(object sender, EventArgs e)\r
265         {\r
266             frmDvdInfo dvdInfoWindow = new frmDvdInfo();\r
267             dvdInfoWindow.Show();\r
268         }\r
269 \r
270         private void mnu_options_Click(object sender, EventArgs e)\r
271         {\r
272             Form Options = new frmOptions();\r
273             Options.ShowDialog();\r
274         }\r
275 \r
276 \r
277         #endregion\r
278 \r
279         #region Presets Menu\r
280 \r
281         private void mnu_presetReset_Click(object sender, EventArgs e)\r
282         {\r
283             treeView_presets.Nodes.Clear();\r
284             grabCLIPresets();\r
285             updatePresets();\r
286             MessageBox.Show("Presets have been updated", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
287         }\r
288 \r
289         private void mnu_SelectDefault_Click(object sender, EventArgs e)\r
290         {\r
291             loadNormalPreset();\r
292         }\r
293 \r
294         #endregion\r
295 \r
296         #region Help Menu\r
297 \r
298         private void mnu_wiki_Click(object sender, EventArgs e)\r
299         {\r
300             Process.Start("http://handbrake.m0k.org/trac");\r
301         }\r
302 \r
303         private void mnu_faq_Click(object sender, EventArgs e)\r
304         {\r
305             Process.Start("http://handbrake.m0k.org/trac/wiki/WindowsGuiFaq");\r
306         }\r
307 \r
308         private void mnu_onlineDocs_Click(object sender, EventArgs e)\r
309         {\r
310             Process.Start("http://handbrake.m0k.org/?page_id=11");\r
311         }\r
312 \r
313         private void mnu_homepage_Click(object sender, EventArgs e)\r
314         {\r
315             Process.Start("http://handbrake.m0k.org");\r
316         }\r
317 \r
318         private void mnu_forum_Click(object sender, EventArgs e)\r
319         {\r
320             Process.Start("http://handbrake.m0k.org/forum");\r
321         }\r
322 \r
323         private void mnu_UpdateCheck_Click(object sender, EventArgs e)\r
324         {\r
325             Boolean update = hb_common_func.updateCheck();\r
326             if (update == true)\r
327             {\r
328                 frmUpdater updateWindow = new frmUpdater();\r
329                 updateWindow.Show();\r
330             }\r
331             else\r
332                 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
333         }\r
334 \r
335         private void mnu_about_Click(object sender, EventArgs e)\r
336         {\r
337             Form About = new frmAbout();\r
338             About.ShowDialog();\r
339         }\r
340 \r
341         #endregion\r
342 \r
343         // -------------------------------------------------------------- \r
344         // Buttons on the main Window and items that require actions\r
345         // --------------------------------------------------------------\r
346 \r
347         #region Buttons\r
348 \r
349         private void btn_Browse_Click(object sender, EventArgs e)\r
350         {\r
351             String filename = "";\r
352             text_source.Text = "";\r
353             frmDvdInfo dvdInfoWindow = new frmDvdInfo();\r
354 \r
355             if (RadioDVD.Checked)\r
356             {\r
357                 DVD_Open.ShowDialog();\r
358                 filename = DVD_Open.SelectedPath;\r
359             }\r
360             else\r
361             {\r
362                 ISO_Open.ShowDialog();\r
363                 filename = ISO_Open.FileName;\r
364             }\r
365 \r
366             if (filename != "")\r
367             {\r
368                 Form frmRD = new frmReadDVD(filename, this, dvdInfoWindow);\r
369                 text_source.Text = filename;\r
370                 frmRD.ShowDialog();\r
371             }\r
372             else\r
373                 text_source.Text = "Click 'Browse' to continue";\r
374 \r
375             // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.\r
376             if (drp_dvdtitle.Items.Count == 0)\r
377                 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source. Please refer to the FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
378         }\r
379 \r
380         private void btn_destBrowse_Click(object sender, EventArgs e)\r
381         {\r
382             // This removes the file extension from the filename box on the save file dialog.\r
383             // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.\r
384             DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");\r
385 \r
386             // Show the dialog and set the main form file path\r
387             DVD_Save.ShowDialog();\r
388             text_destination.Text = DVD_Save.FileName;\r
389 \r
390             // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)\r
391             if (Check_ChapterMarkers.Checked)\r
392                 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");\r
393         }\r
394 \r
395         private void btn_h264Clear_Click(object sender, EventArgs e)\r
396         {\r
397             rtf_h264advanced.Text = "";\r
398         }\r
399 \r
400         #endregion\r
401 \r
402         #region frmMain Actions\r
403 \r
404         private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)\r
405         {\r
406             // Reset some values on the form\r
407             lbl_Aspect.Text = "Select a Title";\r
408             lbl_RecomendedCrop.Text = "Select a Title";\r
409             drop_chapterStart.Items.Clear();\r
410             drop_chapterFinish.Items.Clear();\r
411 \r
412             // If the dropdown is set to automatic nothing else needs to be done.\r
413             // Otheriwse if its not, title data has to be loased from parsing.\r
414             if (drp_dvdtitle.Text != "Automatic")\r
415             {\r
416                 Parsing.Title selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;\r
417 \r
418                 // Set the Aspect Ratio\r
419                 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();\r
420 \r
421                 // Set the Recommended Cropping values\r
422                 lbl_RecomendedCrop.Text = string.Format("{0}/{1}/{2}/{3}", selectedTitle.AutoCropDimensions[0], selectedTitle.AutoCropDimensions[1], selectedTitle.AutoCropDimensions[2], selectedTitle.AutoCropDimensions[3]);\r
423 \r
424                 // Populate the Start chapter Dropdown\r
425                 drop_chapterStart.Items.Clear();\r
426                 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());\r
427                 if (drop_chapterStart.Items.Count > 0)\r
428                     drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();\r
429 \r
430                 // Populate the Final Chapter Dropdown\r
431                 drop_chapterFinish.Items.Clear();\r
432                 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());\r
433                 if (drop_chapterFinish.Items.Count > 0)\r
434                     drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();\r
435 \r
436                 // Populate the Audio Channels Dropdown\r
437                 drp_track1Audio.Items.Clear();\r
438                 drp_track1Audio.Items.Add("Automatic");\r
439                 drp_track1Audio.Items.Add("None");\r
440                 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
441                 if (drp_track1Audio.Items.Count > 0)\r
442                     drp_track1Audio.Text = drp_track1Audio.Items[0].ToString();\r
443 \r
444                 drp_track2Audio.Items.Clear();\r
445                 drp_track2Audio.Items.Add("None");\r
446                 drp_track2Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
447                 if (drp_track2Audio.Items.Count > 0)\r
448                     drp_track2Audio.Text = drp_track2Audio.Items[0].ToString();\r
449 \r
450                 // Populate the Subtitles dropdown\r
451                 drp_subtitle.Items.Clear();\r
452                 drp_subtitle.Items.Add("None");\r
453                 drp_subtitle.Items.Add("Autoselect");\r
454                 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());\r
455                 if (drp_subtitle.Items.Count > 0)\r
456                     drp_subtitle.Text = drp_subtitle.Items[0].ToString();\r
457 \r
458             }\r
459 \r
460             // Run the autoName & chapterNaming functions\r
461             hb_common_func.autoName(this);\r
462             hb_common_func.chapterNaming(this);\r
463         }\r
464 \r
465         private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)\r
466         {\r
467             drop_chapterStart.BackColor = Color.White;\r
468             if ((drop_chapterFinish.Text != "Auto") && (drop_chapterStart.Text != "Auto"))\r
469             {\r
470                 try\r
471                 {\r
472                     int chapterFinish = int.Parse(drop_chapterFinish.Text);\r
473                     int chapterStart = int.Parse(drop_chapterStart.Text);\r
474 \r
475                     if (chapterFinish < chapterStart)\r
476                         drop_chapterStart.BackColor = Color.LightCoral;\r
477                 }\r
478                 catch (Exception)\r
479                 {\r
480                     drop_chapterStart.BackColor = Color.LightCoral;\r
481                 }\r
482             }\r
483             // Run the Autonaming function\r
484             hb_common_func.autoName(this);\r
485         }\r
486 \r
487         private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)\r
488         {\r
489             drop_chapterFinish.BackColor = Color.White;\r
490             if ((drop_chapterFinish.Text != "Auto") && (drop_chapterStart.Text != "Auto"))\r
491             {\r
492                 try\r
493                 {\r
494                     int chapterFinish = int.Parse(drop_chapterFinish.Text);\r
495                     int chapterStart = int.Parse(drop_chapterStart.Text);\r
496 \r
497                     if (chapterFinish < chapterStart)\r
498                         drop_chapterFinish.BackColor = Color.LightCoral;\r
499                 }\r
500                 catch (Exception)\r
501                 {\r
502                     drop_chapterFinish.BackColor = Color.LightCoral;\r
503                 }\r
504             }\r
505 \r
506             // Run the Autonaming function\r
507             hb_common_func.autoName(this);\r
508         }\r
509 \r
510         private void text_bitrate_TextChanged(object sender, EventArgs e)\r
511         {\r
512             text_filesize.Text = "";\r
513             slider_videoQuality.Value = 0;\r
514             SliderValue.Text = "0%";\r
515         }\r
516 \r
517         private void text_filesize_TextChanged(object sender, EventArgs e)\r
518         {\r
519             text_bitrate.Text = "";\r
520             slider_videoQuality.Value = 0;\r
521             SliderValue.Text = "0%";\r
522         }\r
523 \r
524         private void slider_videoQuality_Scroll(object sender, EventArgs e)\r
525         {\r
526             SliderValue.Text = slider_videoQuality.Value.ToString() + "%";\r
527             text_bitrate.Text = "";\r
528             text_filesize.Text = "";\r
529         }\r
530 \r
531         private void label_h264_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\r
532         {\r
533             Process.Start("http://handbrake.m0k.org/trac/wiki/x264Options");\r
534         }\r
535 \r
536         private void text_width_TextChanged(object sender, EventArgs e)\r
537         {\r
538             try\r
539             {\r
540                 if (CheckPixelRatio.Checked)\r
541                 {\r
542                     text_width.Text = "";\r
543                     text_width.BackColor = Color.LightCoral;\r
544                     CheckPixelRatio.BackColor = Color.LightCoral;\r
545                 }\r
546                 else\r
547                 {\r
548                     if ((int.Parse(text_width.Text) % 16) != 0)\r
549                         text_width.BackColor = Color.LightCoral;\r
550                     else\r
551                         text_width.BackColor = Color.LightGreen;\r
552                 }\r
553 \r
554                 if ((lbl_Aspect.Text != "Select a Title") && (drp_crop.SelectedIndex == 2))\r
555                 {\r
556                     double height = int.Parse(text_width.Text) / double.Parse(lbl_Aspect.Text);\r
557                     double mod16 = height % 16;\r
558                     height = height - mod16;\r
559 \r
560                     if (text_width.Text == "")\r
561                     {\r
562                         text_height.Text = "";\r
563                         text_width.BackColor = Color.White;\r
564                     }\r
565                     else\r
566                         text_height.Text = height.ToString();\r
567                 }\r
568             }\r
569             catch (Exception)\r
570             {\r
571                 // No need to throw an error here.\r
572             }\r
573         }\r
574 \r
575         private void text_height_TextChanged(object sender, EventArgs e)\r
576         {\r
577             try\r
578             {\r
579                 if (CheckPixelRatio.Checked)\r
580                 {\r
581                     text_height.Text = "";\r
582                     text_height.BackColor = Color.LightCoral;\r
583                     CheckPixelRatio.BackColor = Color.LightCoral;\r
584                 }\r
585                 else\r
586                 {\r
587                     if ((int.Parse(text_height.Text) % 16) != 0)\r
588                         text_height.BackColor = Color.LightCoral;\r
589                     else\r
590                         text_height.BackColor = Color.LightGreen;\r
591                 }\r
592 \r
593             }\r
594             catch (Exception)\r
595             {\r
596                 // No need to alert the user.\r
597             }\r
598         }\r
599 \r
600         private void drp_crop_SelectedIndexChanged(object sender, EventArgs e)\r
601         {\r
602             if ((string)drp_crop.SelectedItem == "Custom")\r
603             {\r
604                 text_left.Enabled = true;\r
605                 text_right.Enabled = true;\r
606                 text_top.Enabled = true;\r
607                 text_bottom.Enabled = true;\r
608                 text_left.Text = "0";\r
609                 text_right.Text = "0";\r
610                 text_top.Text = "0";\r
611                 text_bottom.Text = "0";\r
612             }\r
613 \r
614             if ((string)drp_crop.SelectedItem == "Automatic")\r
615             {\r
616                 text_left.Enabled = false;\r
617                 text_right.Enabled = false;\r
618                 text_top.Enabled = false;\r
619                 text_bottom.Enabled = false;\r
620 \r
621                 if (lbl_RecomendedCrop.Text != "Select a Title")\r
622                 {\r
623                     string[] temp = new string[4];\r
624                     temp = lbl_RecomendedCrop.Text.Split('/');\r
625                     text_left.Text = temp[2];\r
626                     text_right.Text = temp[3];\r
627                     text_top.Text = temp[0];\r
628                     text_bottom.Text = temp[1];\r
629                 }\r
630                 else\r
631                 {\r
632                     text_left.Text = "";\r
633                     text_right.Text = "";\r
634                     text_top.Text = "";\r
635                     text_bottom.Text = "";\r
636                 }\r
637             }\r
638 \r
639             if ((string)drp_crop.SelectedItem == "No Crop")\r
640             {\r
641                 text_left.Enabled = false;\r
642                 text_right.Enabled = false;\r
643                 text_top.Enabled = false;\r
644                 text_bottom.Enabled = false;\r
645                 text_left.Text = "0";\r
646                 text_right.Text = "0";\r
647                 text_top.Text = "0";\r
648                 text_bottom.Text = "0";\r
649 \r
650             }\r
651         }\r
652 \r
653         private void check_vfr_CheckedChanged(object sender, EventArgs e)\r
654         {\r
655             if (check_vfr.CheckState == CheckState.Checked)\r
656             {\r
657                 check_detelecine.Enabled = false;\r
658                 check_detelecine.CheckState = CheckState.Checked;\r
659                 drp_videoFramerate.Enabled = false;\r
660                 drp_videoFramerate.SelectedItem = "29.97";\r
661                 lbl_vfr.Visible = true;\r
662             }\r
663             else\r
664             {\r
665                 check_detelecine.Enabled = true;\r
666                 drp_videoFramerate.Enabled = true;\r
667                 drp_videoFramerate.SelectedItem = "Automatic";\r
668                 lbl_vfr.Visible = false;\r
669             }\r
670         }\r
671 \r
672         private void CheckPixelRatio_CheckedChanged(object sender, EventArgs e)\r
673         {\r
674             text_width.Text = "";\r
675             text_height.Text = "";\r
676             text_width.BackColor = Color.White;\r
677             text_height.BackColor = Color.White;\r
678             CheckPixelRatio.BackColor = TabPage1.BackColor;\r
679 \r
680             if (CheckPixelRatio.Checked)\r
681             {\r
682                 check_lAnamorphic.Enabled = false;\r
683                 check_lAnamorphic.Checked = false;\r
684             }\r
685             else\r
686                 check_lAnamorphic.Enabled = true;\r
687         }\r
688 \r
689         private void check_lAnamorphic_CheckedChanged(object sender, EventArgs e)\r
690         {\r
691             if (check_lAnamorphic.Checked)\r
692             {\r
693                 CheckPixelRatio.Enabled = false;\r
694                 CheckPixelRatio.Checked = false;\r
695             }\r
696             else\r
697                 CheckPixelRatio.Enabled = true;\r
698         }\r
699 \r
700         private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)\r
701         {\r
702             if (check_2PassEncode.CheckState.ToString() == "Checked")\r
703             {\r
704                 if (drp_videoEncoder.Text.Contains("H.264"))\r
705                     check_turbo.Enabled = true;\r
706             }\r
707             else\r
708             {\r
709                 check_turbo.Enabled = false;\r
710                 check_turbo.CheckState = CheckState.Unchecked;\r
711             }\r
712         }\r
713 \r
714         private void check_largeFile_CheckedChanged(object sender, EventArgs e)\r
715         {\r
716             if (!text_destination.Text.Contains(".mp4"))\r
717             {\r
718                 lbl_largeMp4Warning.Text = "Warning: Only mp4 files are supported";\r
719                 lbl_largeMp4Warning.ForeColor = Color.Red;\r
720                 check_largeFile.CheckState = CheckState.Unchecked;\r
721             }\r
722             else\r
723             {\r
724                 lbl_largeMp4Warning.Text = "Warning: Breaks iPod, @TV, PS3 compatibility.";\r
725                 lbl_largeMp4Warning.ForeColor = Color.Black;\r
726             }\r
727         }\r
728 \r
729         private void check_iPodAtom_CheckedChanged(object sender, EventArgs e)\r
730         {\r
731             if (!text_destination.Text.Contains(".mp4"))\r
732             {\r
733                 lbl_ipodAtom.Visible = true;\r
734                 check_iPodAtom.CheckState = CheckState.Unchecked;\r
735             }\r
736             else\r
737                 lbl_ipodAtom.Visible = false;\r
738         }\r
739 \r
740         private void check_optimiseMP4_CheckedChanged(object sender, EventArgs e)\r
741         {\r
742             if (!text_destination.Text.Contains(".mp4"))\r
743             {\r
744                 check_optimiseMP4.BackColor = Color.LightCoral;\r
745                 check_optimiseMP4.CheckState = CheckState.Unchecked;\r
746             }\r
747             else\r
748                 check_optimiseMP4.BackColor = Color.Transparent;\r
749         }\r
750 \r
751         private void drp_dvdtitle_Click(object sender, EventArgs e)\r
752         {\r
753             if (drp_dvdtitle.Items.Count == 0)\r
754                 MessageBox.Show("There are no titles to select. Please scan the DVD by clicking the 'browse' button above before trying to select a title.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
755         }\r
756 \r
757         private void drp_audioCodec_SelectedIndexChanged(object sender, EventArgs e)\r
758         {\r
759             if (drp_audioCodec.Text == "AAC")\r
760             {\r
761                 drp_audioMixDown.Items.Clear();\r
762                 drp_audioMixDown.Items.Add("Mono");\r
763                 drp_audioMixDown.Items.Add("Stereo");\r
764                 drp_audioMixDown.Items.Add("Dolby Surround");\r
765                 drp_audioMixDown.Items.Add("Dolby Pro Logic II");\r
766                 drp_audioMixDown.Items.Add("6 Channel Discrete");\r
767 \r
768                 drp_audioBitrate.Items.Clear();\r
769                 drp_audioBitrate.Items.Add("32");\r
770                 drp_audioBitrate.Items.Add("40");\r
771                 drp_audioBitrate.Items.Add("48");\r
772                 drp_audioBitrate.Items.Add("56");\r
773                 drp_audioBitrate.Items.Add("64");\r
774                 drp_audioBitrate.Items.Add("80");\r
775                 drp_audioBitrate.Items.Add("86");\r
776                 drp_audioBitrate.Items.Add("112");\r
777                 drp_audioBitrate.Items.Add("128");\r
778                 drp_audioBitrate.Items.Add("160");\r
779 \r
780             }\r
781             else\r
782             {\r
783                 drp_audioMixDown.Items.Clear();\r
784                 drp_audioMixDown.Items.Add("Stereo");\r
785                 drp_audioMixDown.Items.Add("Dolby Surround");\r
786                 drp_audioMixDown.Items.Add("Dolby Pro Logic II");\r
787 \r
788                 drp_audioBitrate.Items.Clear();\r
789                 drp_audioBitrate.Items.Add("32");\r
790                 drp_audioBitrate.Items.Add("40");\r
791                 drp_audioBitrate.Items.Add("48");\r
792                 drp_audioBitrate.Items.Add("56");\r
793                 drp_audioBitrate.Items.Add("64");\r
794                 drp_audioBitrate.Items.Add("80");\r
795                 drp_audioBitrate.Items.Add("86");\r
796                 drp_audioBitrate.Items.Add("112");\r
797                 drp_audioBitrate.Items.Add("128");\r
798                 drp_audioBitrate.Items.Add("160");\r
799                 drp_audioBitrate.Items.Add("192");\r
800                 drp_audioBitrate.Items.Add("224");\r
801                 drp_audioBitrate.Items.Add("256");\r
802                 drp_audioBitrate.Items.Add("320");\r
803             }\r
804         }\r
805 \r
806         private void drp_audioMixDown_SelectedIndexChanged(object sender, EventArgs e)\r
807         {\r
808             if ((drp_audioCodec.Text == "AAC") && (drp_audioMixDown.Text == "6 Channel Discrete"))\r
809             {\r
810                 drp_audioBitrate.Items.Clear();\r
811                 drp_audioBitrate.Items.Add("32");\r
812                 drp_audioBitrate.Items.Add("40");\r
813                 drp_audioBitrate.Items.Add("48");\r
814                 drp_audioBitrate.Items.Add("56");\r
815                 drp_audioBitrate.Items.Add("64");\r
816                 drp_audioBitrate.Items.Add("80");\r
817                 drp_audioBitrate.Items.Add("86");\r
818                 drp_audioBitrate.Items.Add("112");\r
819                 drp_audioBitrate.Items.Add("128");\r
820                 drp_audioBitrate.Items.Add("160");\r
821                 drp_audioBitrate.Items.Add("192");\r
822                 drp_audioBitrate.Items.Add("224");\r
823                 drp_audioBitrate.Items.Add("256");\r
824                 drp_audioBitrate.Items.Add("320");\r
825                 drp_audioBitrate.Items.Add("384");\r
826             }\r
827         }\r
828 \r
829         private void slider_drc_Scroll(object sender, EventArgs e)\r
830         {\r
831             double value = slider_drc.Value / 10.0;\r
832             value++;\r
833 \r
834             lbl_drc.Text = value.ToString();\r
835         }\r
836 \r
837         private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)\r
838         {\r
839             if (drp_subtitle.Text.Contains("None"))\r
840             {\r
841                 check_forced.Enabled = false;\r
842                 check_forced.Checked = false;\r
843             }\r
844             else\r
845                 check_forced.Enabled = true;\r
846         }\r
847 \r
848         private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)\r
849         {\r
850             if (Check_ChapterMarkers.Checked)\r
851             {\r
852                 string destination = text_destination.Text;\r
853                 destination = destination.Replace(".mp4", ".m4v");\r
854                 text_destination.Text = destination;\r
855                 data_chpt.Rows.Clear();\r
856                 data_chpt.Enabled = true;\r
857                 hb_common_func.chapterNaming(this);\r
858             }\r
859             else\r
860             {\r
861                 string destination = text_destination.Text;\r
862                 destination = destination.Replace(".m4v", ".mp4");\r
863                 text_destination.Text = destination;\r
864                 data_chpt.Rows.Clear();\r
865                 data_chpt.Enabled = false;\r
866             }\r
867         }\r
868 \r
869         private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)\r
870         {\r
871             //Turn off some options which are H.264 only when the user selects a non h.264 encoder\r
872             if (!drp_videoEncoder.Text.Contains("H.264"))\r
873             {\r
874                 check_turbo.CheckState = CheckState.Unchecked;\r
875                 check_turbo.Enabled = false;\r
876                 h264Tab.Enabled = false;\r
877                 rtf_h264advanced.Text = "";\r
878                 check_iPodAtom.Enabled = false;\r
879                 check_iPodAtom.Checked = false;\r
880                 lbl_ipodAtom.Visible = false;\r
881                 check_optimiseMP4.Enabled = false;\r
882             }\r
883             else\r
884             {\r
885                 if (check_2PassEncode.CheckState == CheckState.Checked)\r
886                     check_turbo.Enabled = true;\r
887 \r
888                 h264Tab.Enabled = true;\r
889                 check_iPodAtom.Enabled = true;\r
890                 lbl_ipodAtom.Visible = false;\r
891                 check_optimiseMP4.Enabled = true;\r
892             }\r
893 \r
894         }\r
895 \r
896         #endregion\r
897 \r
898         #region Query Editor Tab\r
899 \r
900         private void btn_clear_Click(object sender, EventArgs e)\r
901         {\r
902             rtf_query.Clear();\r
903         }\r
904 \r
905         private void btn_generate_Query_Click(object sender, EventArgs e)\r
906         {\r
907             rtf_query.Text = hb_common_func.GenerateTheQuery(this);\r
908         }\r
909 \r
910         private void btn_copy2C_Click(object sender, EventArgs e)\r
911         {\r
912             if (rtf_query.Text != "")\r
913                 Clipboard.SetText(rtf_query.Text, TextDataFormat.Text);\r
914         }\r
915 \r
916         #endregion\r
917 \r
918         // -------------------------------------------------------------- \r
919         // Main Window Preset System\r
920         // --------------------------------------------------------------\r
921 \r
922         #region Preset System\r
923 \r
924         // Import Current Presets\r
925         private void updatePresets()\r
926         {\r
927             string[] presets = new string[17];\r
928             presets[0] = "Animation";\r
929             presets[1] = "AppleTV";\r
930             presets[2] = "Bedlam";\r
931             presets[3] = "Blind";\r
932             presets[4] = "Broke";\r
933             presets[5] = "Classic";\r
934             presets[6] = "Constant Quality Rate";\r
935             presets[7] = "Deux Six Quatre";\r
936             presets[8] = "Film";\r
937             presets[9] = "iPhone / iPod Touch";\r
938             presets[10] = "iPod High-Rez";\r
939             presets[11] = "iPod Low-Rez";\r
940             presets[12] = "Normal";\r
941             presets[13] = "PS3";\r
942             presets[14] = "PSP";\r
943             presets[15] = "QuickTime";\r
944             presets[16] = "Television";\r
945 \r
946             TreeNode preset_treeview = new TreeNode();\r
947 \r
948             foreach (string preset in presets)\r
949             {\r
950                 preset_treeview = new TreeNode(preset);\r
951 \r
952                 // Now Fill Out List View with Items\r
953                 treeView_presets.Nodes.Add(preset_treeview);\r
954             }\r
955         }\r
956 \r
957         private void grabCLIPresets()\r
958         {\r
959             string appPath = Application.StartupPath.ToString() + "\\";\r
960             string strCmdLine = "cmd /c " + '"' + '"' + appPath + "HandBrakeCLI.exe" + '"' + " --preset-list >" + '"' + appPath + "presets.dat" + '"' + " 2>&1" + '"';\r
961             Process hbproc = Process.Start("CMD.exe", strCmdLine);\r
962             hbproc.WaitForExit();\r
963             hbproc.Dispose();\r
964             hbproc.Close();\r
965         }\r
966 \r
967         // Function to select the default preset.\r
968         private void loadNormalPreset()\r
969         {\r
970             int normal = 0;\r
971             foreach (TreeNode treenode in treeView_presets.Nodes)\r
972             {\r
973                 if (treenode.ToString().Equals("TreeNode: Normal"))\r
974                     normal = treenode.Index;\r
975             }\r
976 \r
977             TreeNode np = treeView_presets.Nodes[normal];\r
978 \r
979             treeView_presets.SelectedNode = np;\r
980         }\r
981 \r
982         // Buttons\r
983         private void btn_setDefault_Click(object sender, EventArgs e)\r
984         {\r
985             String query = hb_common_func.GenerateTheQuery(this);\r
986             Properties.Settings.Default.defaultUserSettings = query;\r
987             // Save the new default Settings\r
988             Properties.Settings.Default.Save();\r
989             MessageBox.Show("New default settings saved.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
990         }\r
991 \r
992         // Preset Selection\r
993         private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)\r
994         {\r
995             string selectedPreset = null;\r
996             selectedPreset = treeView_presets.SelectedNode.Text;\r
997 \r
998             try\r
999             {\r
1000                 string appPath = Application.StartupPath.ToString() + "\\";\r
1001                 StreamReader presetInput = new StreamReader(appPath + "presets.dat");\r
1002 \r
1003                 while (!presetInput.EndOfStream)\r
1004                 {\r
1005                     if ((char)presetInput.Peek() == '+')\r
1006                     {\r
1007                         string preset = presetInput.ReadLine().Replace("+ ", "");\r
1008                         Regex r = new Regex("(:  )"); // Split on hyphens. \r
1009                         string[] presetName = r.Split(preset);\r
1010 \r
1011 \r
1012                         if (selectedPreset == presetName[0])\r
1013                         {\r
1014                             // Need to disable anamorphic now, otherwise it may overide the width / height values later.\r
1015                             CheckPixelRatio.CheckState = CheckState.Unchecked;\r
1016 \r
1017                             // Send the query from the file to the Query Parser class\r
1018                             Functions.QueryParser presetQuery = Functions.QueryParser.Parse(preset);\r
1019 \r
1020                             // Now load the preset\r
1021                             hb_common_func.presetLoader(this, presetQuery, selectedPreset);\r
1022                         }\r
1023 \r
1024                     }\r
1025                     else\r
1026                         presetInput.ReadLine();\r
1027                 }\r
1028             }\r
1029             catch (Exception exc)\r
1030             {\r
1031                 MessageBox.Show(exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
1032             }\r
1033         }\r
1034 \r
1035         #endregion\r
1036 \r
1037         //---------------------------------------------------\r
1038         // Encode / Cancel Buttons\r
1039         // Encode Progress Text Handler\r
1040         //---------------------------------------------------\r
1041 \r
1042         #region Encodeing and Queue\r
1043 \r
1044         Functions.CLI process = new Functions.CLI();\r
1045         private delegate void UpdateUIHandler();\r
1046 \r
1047         [DllImport("user32.dll")]\r
1048         public static extern void LockWorkStation();\r
1049         [DllImport("user32.dll")]\r
1050         public static extern int ExitWindowsEx(int uFlags, int dwReason);\r
1051 \r
1052         private void btn_queue_Click(object sender, EventArgs e)\r
1053         {\r
1054 \r
1055             if (text_source.Text == "" || text_source.Text == "Click 'Browse' to continue" || text_destination.Text == "")\r
1056                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1057             else\r
1058             {\r
1059                 String query;\r
1060                 if (rtf_query.Text != "")\r
1061                     query = rtf_query.Text;\r
1062                 else\r
1063                     query = hb_common_func.GenerateTheQuery(this);\r
1064 \r
1065                 queueWindow.list_queue.Items.Add(query);\r
1066                 queueWindow.Show();\r
1067             }\r
1068         }\r
1069 \r
1070         private void showQueue()\r
1071         {\r
1072             queueWindow.Show();\r
1073         }\r
1074 \r
1075         private void btn_encode_Click(object sender, EventArgs e)\r
1076         {\r
1077             if (text_source.Text == "" || text_source.Text == "Click 'Browse' to continue" || text_destination.Text == "")\r
1078                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1079             else\r
1080             {\r
1081                 String query;\r
1082                 if (rtf_query.Text != "")\r
1083                     query = rtf_query.Text;\r
1084                 else\r
1085                     query = hb_common_func.GenerateTheQuery(this);\r
1086 \r
1087                 ThreadPool.QueueUserWorkItem(procMonitor, query);\r
1088                 lbl_encode.Visible = true;\r
1089                 lbl_encode.Text = "Encoding in Progress";\r
1090             }\r
1091         }\r
1092 \r
1093         private void procMonitor(object state)\r
1094         {\r
1095             // Make sure we are not already encoding and if we are then display an error.\r
1096             if (hbProc != null)\r
1097                 MessageBox.Show("Handbrake is already encoding a video!", "Status", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1098             else\r
1099             {\r
1100                 hbProc = process.runCli(this, (string)state, false, false, false, false);\r
1101                 hbProc.WaitForExit();\r
1102 \r
1103                 setEncodeLabel();\r
1104                 hbProc = null;\r
1105 \r
1106                 // Do something whent he encode ends.\r
1107                 switch (Properties.Settings.Default.CompletionOption)\r
1108                 {\r
1109                     case "Shutdown":\r
1110                         System.Diagnostics.Process.Start("Shutdown", "-s -t 60");\r
1111                         break;\r
1112                     case "Log Off":\r
1113                         ExitWindowsEx(0, 0);\r
1114                         break;\r
1115                     case "Suspend":\r
1116                         Application.SetSuspendState(PowerState.Suspend, true, true);\r
1117                         break;\r
1118                     case "Hibernate":\r
1119                         Application.SetSuspendState(PowerState.Hibernate, true, true);\r
1120                         break;\r
1121                     case "Lock System":\r
1122                         LockWorkStation();\r
1123                         break;\r
1124                     case "Quit HandBrake":\r
1125                         Application.Exit();\r
1126                         break;\r
1127                     default:\r
1128                         break;\r
1129                 }\r
1130             }\r
1131         }\r
1132 \r
1133         private void setEncodeLabel()\r
1134         {\r
1135             if (this.InvokeRequired)\r
1136             {\r
1137                 this.BeginInvoke(new UpdateUIHandler(setEncodeLabel));\r
1138                 return;\r
1139             }\r
1140             lbl_encode.Text = "Encoding Finished";\r
1141         }\r
1142 \r
1143         #endregion\r
1144 \r
1145 \r
1146 \r
1147         // This is the END of the road ------------------------------------------------------------------------------\r
1148     }\r
1149 }