OSDN Git Service

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