OSDN Git Service

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