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"))\r
737             {\r
738                 lbl_largeMp4Warning.Text = "Warning: Only mp4 files are supported";\r
739                 lbl_largeMp4Warning.ForeColor = Color.Red;\r
740                 check_largeFile.CheckState = CheckState.Unchecked;\r
741             }\r
742             else\r
743             {\r
744                 lbl_largeMp4Warning.Text = "Warning: Breaks iPod, @TV, PS3 compatibility.";\r
745                 lbl_largeMp4Warning.ForeColor = Color.Black;\r
746             }\r
747         }\r
748 \r
749         private void check_iPodAtom_CheckedChanged(object sender, EventArgs e)\r
750         {\r
751             if ((!text_destination.Text.Contains(".mp4")) && (!text_destination.Text.Contains(".m4v")))\r
752             {\r
753                 text_destination.BackColor = Color.LightCoral;\r
754                 check_iPodAtom.BackColor = Color.LightCoral;\r
755                 check_iPodAtom.CheckState = CheckState.Unchecked;\r
756             }\r
757             else\r
758             {\r
759                 check_iPodAtom.BackColor = Color.Transparent;\r
760                 text_destination.BackColor = Color.White;\r
761             }\r
762         }\r
763 \r
764         private void check_optimiseMP4_CheckedChanged(object sender, EventArgs e)\r
765         {\r
766             if ((!text_destination.Text.Contains(".mp4")) && (!text_destination.Text.Contains(".m4v")))\r
767             {\r
768                 check_optimiseMP4.BackColor = Color.LightCoral;\r
769                 text_destination.BackColor = Color.LightCoral;\r
770                 check_optimiseMP4.CheckState = CheckState.Unchecked;\r
771             }\r
772             else\r
773             {\r
774                 check_optimiseMP4.BackColor = Color.Transparent;\r
775                 text_destination.BackColor = Color.White;\r
776             }\r
777         }\r
778 \r
779         private void drp_dvdtitle_Click(object sender, EventArgs e)\r
780         {\r
781             if (drp_dvdtitle.Items.Count == 0)\r
782                 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
783         }\r
784 \r
785         private void drp_audioCodec_SelectedIndexChanged(object sender, EventArgs e)\r
786         {\r
787             if (drp_audioCodec.Text == "AAC")\r
788             {\r
789                 drp_audioMixDown.Items.Clear();\r
790                 drp_audioMixDown.Items.Add("Mono");\r
791                 drp_audioMixDown.Items.Add("Stereo");\r
792                 drp_audioMixDown.Items.Add("Dolby Surround");\r
793                 drp_audioMixDown.Items.Add("Dolby Pro Logic II");\r
794                 drp_audioMixDown.Items.Add("6 Channel Discrete");\r
795 \r
796                 drp_audioBitrate.Items.Clear();\r
797                 drp_audioBitrate.Items.Add("32");\r
798                 drp_audioBitrate.Items.Add("40");\r
799                 drp_audioBitrate.Items.Add("48");\r
800                 drp_audioBitrate.Items.Add("56");\r
801                 drp_audioBitrate.Items.Add("64");\r
802                 drp_audioBitrate.Items.Add("80");\r
803                 drp_audioBitrate.Items.Add("86");\r
804                 drp_audioBitrate.Items.Add("112");\r
805                 drp_audioBitrate.Items.Add("128");\r
806                 drp_audioBitrate.Items.Add("160");\r
807 \r
808             }\r
809             else\r
810             {\r
811                 drp_audioMixDown.Items.Clear();\r
812                 drp_audioMixDown.Items.Add("Stereo");\r
813                 drp_audioMixDown.Items.Add("Dolby Surround");\r
814                 drp_audioMixDown.Items.Add("Dolby Pro Logic II");\r
815 \r
816                 drp_audioBitrate.Items.Clear();\r
817                 drp_audioBitrate.Items.Add("32");\r
818                 drp_audioBitrate.Items.Add("40");\r
819                 drp_audioBitrate.Items.Add("48");\r
820                 drp_audioBitrate.Items.Add("56");\r
821                 drp_audioBitrate.Items.Add("64");\r
822                 drp_audioBitrate.Items.Add("80");\r
823                 drp_audioBitrate.Items.Add("86");\r
824                 drp_audioBitrate.Items.Add("112");\r
825                 drp_audioBitrate.Items.Add("128");\r
826                 drp_audioBitrate.Items.Add("160");\r
827                 drp_audioBitrate.Items.Add("192");\r
828                 drp_audioBitrate.Items.Add("224");\r
829                 drp_audioBitrate.Items.Add("256");\r
830                 drp_audioBitrate.Items.Add("320");\r
831             }\r
832         }\r
833 \r
834         private void drp_audioMixDown_SelectedIndexChanged(object sender, EventArgs e)\r
835         {\r
836             if ((drp_audioCodec.Text == "AAC") && (drp_audioMixDown.Text == "6 Channel Discrete"))\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                 drp_audioBitrate.Items.Add("384");\r
854             }\r
855         }\r
856 \r
857         private void slider_drc_Scroll(object sender, EventArgs e)\r
858         {\r
859             double value = slider_drc.Value / 10.0;\r
860             value++;\r
861 \r
862             lbl_drc.Text = value.ToString();\r
863         }\r
864 \r
865         private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)\r
866         {\r
867             if (drp_subtitle.Text.Contains("None"))\r
868             {\r
869                 check_forced.Enabled = false;\r
870                 check_forced.Checked = false;\r
871             }\r
872             else\r
873                 check_forced.Enabled = true;\r
874         }\r
875 \r
876         private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)\r
877         {\r
878             if (Check_ChapterMarkers.Checked)\r
879             {\r
880                 string destination = text_destination.Text;\r
881                 destination = destination.Replace(".mp4", ".m4v");\r
882                 text_destination.Text = destination;\r
883                 data_chpt.Rows.Clear();\r
884                 data_chpt.Enabled = true;\r
885                 hb_common_func.chapterNaming(this);\r
886             }\r
887             else\r
888             {\r
889                 string destination = text_destination.Text;\r
890                 destination = destination.Replace(".m4v", ".mp4");\r
891                 text_destination.Text = destination;\r
892                 data_chpt.Rows.Clear();\r
893                 data_chpt.Enabled = false;\r
894             }\r
895         }\r
896 \r
897         private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)\r
898         {\r
899             //Turn off some options which are H.264 only when the user selects a non h.264 encoder\r
900             if (!drp_videoEncoder.Text.Contains("H.264"))\r
901             {\r
902                 check_turbo.CheckState = CheckState.Unchecked;\r
903                 check_turbo.Enabled = false;\r
904                 h264Tab.Enabled = false;\r
905                 rtf_h264advanced.Text = "";\r
906                 check_iPodAtom.Enabled = false;\r
907                 check_iPodAtom.Checked = false;\r
908                 check_optimiseMP4.Enabled = false;\r
909                 check_lAnamorphic.Enabled = false;\r
910                 check_lAnamorphic.Checked = false;\r
911             }\r
912             else\r
913             {\r
914                 if (check_2PassEncode.CheckState == CheckState.Checked)\r
915                     check_turbo.Enabled = true;\r
916 \r
917                 h264Tab.Enabled = true;\r
918                 check_iPodAtom.Enabled = true;\r
919                 check_optimiseMP4.Enabled = true;\r
920                 check_lAnamorphic.Enabled = true;\r
921             }\r
922 \r
923         }\r
924 \r
925         #endregion\r
926 \r
927         #region Query Editor Tab\r
928 \r
929         private void btn_clear_Click(object sender, EventArgs e)\r
930         {\r
931             rtf_query.Clear();\r
932         }\r
933 \r
934         private void btn_generate_Query_Click(object sender, EventArgs e)\r
935         {\r
936             rtf_query.Text = hb_common_func.GenerateTheQuery(this);\r
937         }\r
938 \r
939         private void btn_copy2C_Click(object sender, EventArgs e)\r
940         {\r
941             if (rtf_query.Text != "")\r
942                 Clipboard.SetText(rtf_query.Text, TextDataFormat.Text);\r
943         }\r
944 \r
945         #endregion\r
946 \r
947         // -------------------------------------------------------------- \r
948         // Main Window Preset System\r
949         // --------------------------------------------------------------\r
950 \r
951         #region Preset System\r
952 \r
953         // Import Current Presets\r
954         private void loadPresetPanel()\r
955         {\r
956             ArrayList presetNameList = new ArrayList();\r
957        \r
958                 string appPath = Application.StartupPath.ToString() + "\\presets.dat";\r
959                 if (File.Exists(appPath))\r
960                 {\r
961                     StreamReader presetInput = new StreamReader(appPath);\r
962                     while (!presetInput.EndOfStream)\r
963                     {\r
964                         if ((char)presetInput.Peek() == '+')\r
965                         {\r
966                             string preset = presetInput.ReadLine().Replace("+ ", "");\r
967                             Regex r = new Regex("(:  )"); // Split on hyphens. \r
968                             presetNameList.Add(r.Split(preset));\r
969                         }\r
970                         else\r
971                             presetInput.ReadLine();\r
972                     }\r
973                 }\r
974          \r
975             TreeNode preset_treeview = new TreeNode();\r
976             foreach (string[] preset in presetNameList)\r
977             {\r
978                 preset_treeview = new TreeNode(preset[0]);\r
979 \r
980                 // Now Fill Out List View with Items\r
981                 treeView_presets.Nodes.Add(preset_treeview);\r
982             }\r
983         }\r
984 \r
985         // Generate a new presets.dat file from the CLI\r
986         private void grabCLIPresets()\r
987         {\r
988             string appPath = Application.StartupPath.ToString() + "\\";\r
989             string strCmdLine = "cmd /c " + '"' + '"' + appPath + "HandBrakeCLI.exe" + '"' + " --preset-list >" + '"' + appPath + "presets.dat" + '"' + " 2>&1" + '"';\r
990             Process hbproc = Process.Start("CMD.exe", strCmdLine);\r
991             hbproc.WaitForExit();\r
992             hbproc.Dispose();\r
993             hbproc.Close();\r
994         }\r
995 \r
996         // Selects the preset called "normal". This is HandBrakes default settings\r
997         private void loadNormalPreset()\r
998         {\r
999             try\r
1000             {\r
1001                 string appPath = Application.StartupPath.ToString() + "\\presets.dat";\r
1002                 if (File.Exists(appPath))\r
1003                 {\r
1004 \r
1005                     int normal = 0;\r
1006                     foreach (TreeNode treenode in treeView_presets.Nodes)\r
1007                     {\r
1008                         if (treenode.ToString().Equals("TreeNode: Normal"))\r
1009                             normal = treenode.Index;\r
1010                     }\r
1011 \r
1012                     TreeNode np = treeView_presets.Nodes[normal];\r
1013 \r
1014                     treeView_presets.SelectedNode = np;\r
1015                 }\r
1016             }\r
1017             catch (Exception)\r
1018             {\r
1019                 // Do nothing\r
1020             }\r
1021         }\r
1022 \r
1023         // Set's the current options set in the program as the new defaults for the program.\r
1024         private void btn_setDefault_Click(object sender, EventArgs e)\r
1025         {\r
1026             String query = hb_common_func.GenerateTheQuery(this);\r
1027             Properties.Settings.Default.defaultUserSettings = query;\r
1028             // Save the new default Settings\r
1029             Properties.Settings.Default.Save();\r
1030             MessageBox.Show("New default settings saved.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
1031         }\r
1032 \r
1033         // When the user select a preset from the treeview, load it\r
1034         private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)\r
1035         {\r
1036             string selectedPreset = null;\r
1037             selectedPreset = treeView_presets.SelectedNode.Text;\r
1038 \r
1039             try\r
1040             {\r
1041                 string appPath = Application.StartupPath.ToString() + "\\presets.dat";\r
1042                 if (File.Exists(appPath))\r
1043                 {\r
1044                     StreamReader presetInput = new StreamReader(appPath);\r
1045                     while (!presetInput.EndOfStream)\r
1046                     {\r
1047                         if ((char)presetInput.Peek() == '+')\r
1048                         {\r
1049                             string preset = presetInput.ReadLine().Replace("+ ", "");\r
1050                             Regex r = new Regex("(:  )"); // Split on hyphens. \r
1051                             string[] presetName = r.Split(preset);\r
1052 \r
1053                             if (selectedPreset == presetName[0])\r
1054                             {\r
1055                                 // Need to disable anamorphic now, otherwise it may overide the width / height values later.\r
1056                                 CheckPixelRatio.CheckState = CheckState.Unchecked;\r
1057 \r
1058                                 // Send the query from the file to the Query Parser class\r
1059                                 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(preset);\r
1060 \r
1061                                 // Now load the preset\r
1062                                 hb_common_func.presetLoader(this, presetQuery, selectedPreset);\r
1063                             }\r
1064                         }\r
1065                         else\r
1066                             presetInput.ReadLine();\r
1067                     }\r
1068                 }\r
1069             }\r
1070             catch (Exception exc)\r
1071             {\r
1072                 MessageBox.Show(exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
1073             }\r
1074         }\r
1075 \r
1076         #endregion\r
1077 \r
1078         //---------------------------------------------------\r
1079         // Encode / Cancel Buttons\r
1080         // Encode Progress Text Handler\r
1081         //---------------------------------------------------\r
1082 \r
1083         #region Encodeing and Queue\r
1084 \r
1085         Functions.CLI process = new Functions.CLI();\r
1086         private delegate void UpdateUIHandler();\r
1087 \r
1088         [DllImport("user32.dll")]\r
1089         public static extern void LockWorkStation();\r
1090         [DllImport("user32.dll")]\r
1091         public static extern int ExitWindowsEx(int uFlags, int dwReason);\r
1092 \r
1093         private void btn_start_Click(object sender, EventArgs e)\r
1094         {\r
1095             if (text_source.Text == "" || text_source.Text == "Click 'Browse' to continue" || text_destination.Text == "")\r
1096                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1097             else\r
1098             {\r
1099                 String query;\r
1100                 if (rtf_query.Text != "")\r
1101                     query = rtf_query.Text;\r
1102                 else\r
1103                     query = hb_common_func.GenerateTheQuery(this);\r
1104 \r
1105                 ThreadPool.QueueUserWorkItem(procMonitor, query);\r
1106                 lbl_encode.Visible = true;\r
1107                 lbl_encode.Text = "Encoding in Progress";\r
1108             }\r
1109         }\r
1110 \r
1111         private void btn_add2Queue_Click(object sender, EventArgs e)\r
1112         {\r
1113             if (text_source.Text == "" || text_source.Text == "Click 'Browse' to continue" || text_destination.Text == "")\r
1114                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1115             else\r
1116             {\r
1117                 String query;\r
1118                 if (rtf_query.Text != "")\r
1119                     query = rtf_query.Text;\r
1120                 else\r
1121                     query = hb_common_func.GenerateTheQuery(this);\r
1122 \r
1123                 queueWindow.list_queue.Items.Add(query);\r
1124                 queueWindow.Show();\r
1125             }\r
1126         }\r
1127 \r
1128         private void btn_showQueue_Click(object sender, EventArgs e)\r
1129         {\r
1130             showQueue();\r
1131         }\r
1132 \r
1133         private void showQueue()\r
1134         {\r
1135             queueWindow.Show();\r
1136         }\r
1137 \r
1138         private void procMonitor(object state)\r
1139         {\r
1140             // Make sure we are not already encoding and if we are then display an error.\r
1141             if (hbProc != null)\r
1142                 MessageBox.Show("Handbrake is already encoding a video!", "Status", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
1143             else\r
1144             {\r
1145                 hbProc = process.runCli(this, (string)state, false, false, false, false);\r
1146                 hbProc.WaitForExit();\r
1147 \r
1148                 setEncodeLabel();\r
1149                 hbProc = null;\r
1150 \r
1151                 // Do something whent he encode ends.\r
1152                 switch (Properties.Settings.Default.CompletionOption)\r
1153                 {\r
1154                     case "Shutdown":\r
1155                         System.Diagnostics.Process.Start("Shutdown", "-s -t 60");\r
1156                         break;\r
1157                     case "Log Off":\r
1158                         ExitWindowsEx(0, 0);\r
1159                         break;\r
1160                     case "Suspend":\r
1161                         Application.SetSuspendState(PowerState.Suspend, true, true);\r
1162                         break;\r
1163                     case "Hibernate":\r
1164                         Application.SetSuspendState(PowerState.Hibernate, true, true);\r
1165                         break;\r
1166                     case "Lock System":\r
1167                         LockWorkStation();\r
1168                         break;\r
1169                     case "Quit HandBrake":\r
1170                         Application.Exit();\r
1171                         break;\r
1172                     default:\r
1173                         break;\r
1174                 }\r
1175             }\r
1176         }\r
1177 \r
1178         private void setEncodeLabel()\r
1179         {\r
1180             if (this.InvokeRequired)\r
1181             {\r
1182                 this.BeginInvoke(new UpdateUIHandler(setEncodeLabel));\r
1183                 return;\r
1184             }\r
1185             lbl_encode.Text = "Encoding Finished";\r
1186         }\r
1187 \r
1188         #endregion\r
1189 \r
1190 \r
1191 \r
1192         // This is the END of the road ------------------------------------------------------------------------------\r
1193     }\r
1194 }