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