OSDN Git Service

e7345b539d6455f494a5c1ede35d5fb5f456f4fe
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmMain.cs
1 /*  frmMain.cs $\r
2         \r
3            This file is part of the HandBrake source code.\r
4            Homepage: <http://handbrake.fr/>.\r
5            It may be used under the terms of the GNU General Public License. */\r
6 \r
7 using System;\r
8 using System.Collections;\r
9 using System.Collections.Generic;\r
10 using System.Drawing;\r
11 using System.Text;\r
12 using System.Windows.Forms;\r
13 using System.IO;\r
14 using System.Diagnostics;\r
15 using System.Threading;\r
16 using System.Runtime.InteropServices;\r
17 using System.Globalization;\r
18 using System.Text.RegularExpressions;\r
19 \r
20 namespace Handbrake\r
21 {\r
22     public partial class frmMain : Form\r
23     {\r
24         // Declarations *******************************************************\r
25         // Objects which may be used by one or more other objects\r
26         Functions.Main hb_common_func = new Functions.Main();\r
27         Functions.Encode cliObj = new Functions.Encode();\r
28         Functions.Queue encodeQueue = new Functions.Queue();\r
29         Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();\r
30         Parsing.Title selectedTitle;\r
31 \r
32         // Objects belonging to this window only\r
33         PresetLoader presetLoader = new PresetLoader();\r
34         x264Panel x264PanelFunctions = new x264Panel();\r
35         QueryGenerator queryGen = new QueryGenerator();\r
36 \r
37         internal Process hbProc;\r
38         private Parsing.DVD thisDVD;\r
39         private frmQueue queueWindow;\r
40         private delegate void updateStatusChanger();\r
41         private string lastAction = null;\r
42         public int maxWidth = 0;\r
43         public int maxHeight = 0;\r
44 \r
45         // Applicaiton Startup ************************************************\r
46 \r
47         #region Application Startup\r
48 \r
49         public frmMain()\r
50         {\r
51             // Load the splash screen in this thread\r
52             Form splash = new frmSplashScreen();\r
53             splash.Show();\r
54 \r
55             // Initialize the queue window.\r
56             queueWindow = new frmQueue(this);\r
57             //Create a label that can be updated from the parent thread.\r
58             Label lblStatus = new Label();\r
59             lblStatus.Size = new Size(250, 20);\r
60             lblStatus.Location = new Point(10, 280);\r
61             splash.Controls.Add(lblStatus);\r
62 \r
63             InitializeComponent();\r
64 \r
65             // Update the users config file with the CLI version data.\r
66             lblStatus.Text = "Setting Version Data ...";\r
67             Application.DoEvents();\r
68             ArrayList x = hb_common_func.getCliVersionData();\r
69             if (x != null)\r
70             {\r
71                 try\r
72                 {\r
73                     Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());\r
74                     Properties.Settings.Default.hb_version = x[0].ToString();\r
75                 }\r
76                 catch (Exception)\r
77                 {\r
78                     Properties.Settings.Default.hb_build = 0;\r
79                     Properties.Settings.Default.hb_version = "0";\r
80                 }\r
81             }\r
82 \r
83             // show the form, but leave disabled until preloading is complete then show the main form\r
84             this.Enabled = false;\r
85             this.Show();\r
86             Application.DoEvents(); // Forces frmMain to draw\r
87 \r
88             // update the status\r
89             if (Properties.Settings.Default.updateStatus == "Checked")\r
90             {\r
91                 lblStatus.Text = "Checking for updates ...";\r
92                 Application.DoEvents();\r
93                 Thread updateCheckThread = new Thread(startupUpdateCheck);\r
94                 updateCheckThread.Start();\r
95             }\r
96 \r
97             // Setup the GUI components\r
98             lblStatus.Text = "Setting up the GUI ...";\r
99             Application.DoEvents();\r
100             setupH264Panel();               // Initalize the H.264 Panel\r
101             loadPresetPanel();              // Load the Preset Panel\r
102             // Load the user's default settings or Normal Preset\r
103             if (Properties.Settings.Default.defaultSettings == "Checked")\r
104                 loadUserDefaults();\r
105             else\r
106                 loadNormalPreset();\r
107             // Expand the preset Nodes\r
108             treeView_presets.ExpandAll();\r
109             // Enabled GUI tooltip's if Required\r
110             if (Properties.Settings.Default.tooltipEnable == "Checked")\r
111                 ToolTip.Active = true;\r
112             lbl_encode.Text = "";\r
113 \r
114             //Finished Loading\r
115             lblStatus.Text = "Loading Complete!";\r
116             Application.DoEvents();\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             // Some event Handlers. Used for minimize to taskbar\r
126             this.Resize += new EventHandler(frmMain_Resize);\r
127 \r
128             // Queue Recovery\r
129             queueRecovery();\r
130         }\r
131 \r
132         // Startup Functions\r
133         private void startupUpdateCheck()\r
134         {\r
135             try\r
136             {\r
137                 if (this.InvokeRequired)\r
138                 {\r
139                     this.BeginInvoke(new updateStatusChanger(startupUpdateCheck));\r
140                     return;\r
141                 }\r
142 \r
143                 Boolean update = hb_common_func.updateCheck(false);\r
144                 if (update == true)\r
145                 {\r
146                     frmUpdater updateWindow = new frmUpdater();\r
147                     updateWindow.Show();\r
148                 }\r
149             }\r
150             catch (Exception) { /* Do Nothing*/ }\r
151         }\r
152         private void setupH264Panel()\r
153         {\r
154             // Set the default settings of the x264 panel\r
155             drop_bFrames.Text = "Default (0)";\r
156             drop_refFrames.Text = "Default (1)";\r
157             drop_subpixelMotionEstimation.Text = "Default (4)";\r
158             drop_trellis.Text = "Default (0)";\r
159             drop_MotionEstimationMethod.Text = "Default (Hexagon)";\r
160             drop_MotionEstimationRange.Text = "Default (16)";\r
161             drop_directPrediction.Text = "Default (Spatial)";\r
162             drop_deblockAlpha.Text = "Default (0)";\r
163             drop_deblockBeta.Text = "Default (0)";\r
164             drop_analysis.Text = "Default (some)";\r
165             rtf_x264Query.Text = "";\r
166         }\r
167         private void loadUserDefaults()\r
168         {\r
169             // Try to load the users default settings.\r
170             string userDefaults = Properties.Settings.Default.defaultUserSettings;\r
171 \r
172             if (userDefaults == "")\r
173                 loadNormalPreset();\r
174             else\r
175             {\r
176                 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(userDefaults);\r
177                 presetLoader.presetLoader(this, presetQuery, "User Defaults ");\r
178             }\r
179         }\r
180         private void queueRecovery()\r
181         {\r
182             if (hb_common_func.check_queue_recovery() == true)\r
183             {\r
184                 DialogResult result = MessageBox.Show("HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
185 \r
186                 if (result == DialogResult.Yes)\r
187                     encodeQueue.recoverQueue("hb_queue_recovery.dat"); // Start Recovery\r
188                 else\r
189                 {\r
190                     // Remove the Queue recovery file if the user doesn't want to recovery the last queue.\r
191                     string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.dat");\r
192                     if (File.Exists(queuePath))\r
193                         File.Delete(queuePath);\r
194                 }\r
195             }\r
196         }\r
197 \r
198         #endregion\r
199 \r
200         // The Applications Main Menu and Menus *******************************\r
201 \r
202         #region File Menu\r
203         private void mnu_exit_Click(object sender, EventArgs e)\r
204         {\r
205             Application.Exit();\r
206         }\r
207         #endregion\r
208 \r
209         #region Tools Menu\r
210         private void mnu_encode_Click(object sender, EventArgs e)\r
211         {\r
212             queueWindow.setQueue(encodeQueue);\r
213             queueWindow.Show();\r
214         }\r
215         private void mnu_encodeLog_Click(object sender, EventArgs e)\r
216         {\r
217             String file = String.Empty;\r
218             if (lastAction == "scan")\r
219                 file = "dvdinfo.dat";\r
220             else\r
221                 file = "hb_encode_log.dat";\r
222 \r
223             frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, this, queueWindow);\r
224             dvdInfoWindow.Show();\r
225         }\r
226         private void mnu_options_Click(object sender, EventArgs e)\r
227         {\r
228             Form Options = new frmOptions(this);\r
229             Options.ShowDialog();\r
230         }\r
231         #endregion\r
232 \r
233         #region Presets Menu\r
234         private void mnu_presetReset_Click(object sender, EventArgs e)\r
235         {\r
236             presetHandler.updateBuiltInPresets();\r
237             loadPresetPanel();\r
238             if (treeView_presets.Nodes.Count == 0)\r
239                 MessageBox.Show("Unable to load the presets.dat file. Please select \"Update Built-in Presets\" from the Presets Menu \nMake sure you are running the program in Admin mode if running on Vista. See Windows FAQ for details!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
240             else\r
241                 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
242 \r
243             treeView_presets.ExpandAll();\r
244         }\r
245         private void mnu_delete_preset_Click(object sender, EventArgs e)\r
246         {\r
247             // Empty the preset file\r
248             string presetsFile = Application.StartupPath.ToString() + "\\presets.dat";\r
249             if (File.Exists(presetsFile))\r
250                 File.Delete(presetsFile);\r
251 \r
252             try\r
253             {\r
254                 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);\r
255                 strm.Close();\r
256                 strm.Dispose();\r
257             }\r
258             catch (Exception exc)\r
259             {\r
260                 MessageBox.Show("An error has occured during the preset removal process.\n If you are using Windows Vista, you may need to run under Administrator Mode to complete this task. \n" + exc.ToString());\r
261             }\r
262 \r
263             // Reload the preset panel\r
264             loadPresetPanel();\r
265         }\r
266         private void mnu_SelectDefault_Click(object sender, EventArgs e)\r
267         {\r
268             loadNormalPreset();\r
269         }\r
270         private void btn_new_preset_Click(object sender, EventArgs e)\r
271         {\r
272             // Remember each nodes expanded status so we can reload it\r
273             List<Boolean> nodeStatus = saveTreeViewState();\r
274             nodeStatus.Add(true);\r
275 \r
276             Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);\r
277             preset.ShowDialog();\r
278 \r
279             // Now reload the TreeView states\r
280             loadTreeViewStates(nodeStatus);\r
281         }\r
282         #endregion\r
283 \r
284         #region Help Menu\r
285         private void mnu_handbrake_forums_Click(object sender, EventArgs e)\r
286         {\r
287             Process.Start("http://forum.handbrake.fr/");\r
288         }\r
289         private void mnu_user_guide_Click(object sender, EventArgs e)\r
290         {\r
291             Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");\r
292         }\r
293         private void mnu_handbrake_home_Click(object sender, EventArgs e)\r
294         {\r
295             Process.Start("http://handbrake.fr");\r
296         }\r
297         private void mnu_UpdateCheck_Click(object sender, EventArgs e)\r
298         {\r
299             Boolean update = hb_common_func.updateCheck(true);\r
300             if (update == true)\r
301             {\r
302                 frmUpdater updateWindow = new frmUpdater();\r
303                 updateWindow.Show();\r
304             }\r
305             else\r
306                 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
307         }\r
308         private void mnu_about_Click(object sender, EventArgs e)\r
309         {\r
310             Form About = new frmAbout();\r
311             About.ShowDialog();\r
312         }\r
313         #endregion\r
314 \r
315         #region Preset Menu\r
316         private void pmnu_expandAll_Click(object sender, EventArgs e)\r
317         {\r
318             treeView_presets.ExpandAll();\r
319         }\r
320         private void pmnu_collapse_Click(object sender, EventArgs e)\r
321         {\r
322             treeView_presets.CollapseAll();\r
323         }\r
324         private void treeview_presets_mouseUp(object sender, MouseEventArgs e)\r
325         {\r
326             if (e.Button == MouseButtons.Right)\r
327                 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);\r
328             treeView_presets.Select();\r
329         }\r
330         private void pmnu_delete_click(object sender, EventArgs e)\r
331         {\r
332             if (treeView_presets.SelectedNode != null)\r
333             {\r
334                 presetHandler.remove(treeView_presets.SelectedNode.Text);\r
335 \r
336                 // Remember each nodes expanded status so we can reload it\r
337                 List<Boolean> nodeStatus = saveTreeViewState();\r
338 \r
339                 // Now reload the preset panel\r
340                 loadPresetPanel();\r
341 \r
342                 // Now reload the TreeView states\r
343                 loadTreeViewStates(nodeStatus);\r
344             }\r
345             treeView_presets.Select();\r
346         }\r
347         #endregion\r
348 \r
349         // MainWindow Components, Actions and Functions ***********************\r
350         #region Actions\r
351 \r
352         // ToolBar\r
353         private void btn_source_Click(object sender, EventArgs e)\r
354         {\r
355             if (Properties.Settings.Default.drive_detection == "Checked")\r
356             {\r
357                 mnu_dvd_drive.Visible = true;\r
358                 Thread driveInfoThread = new Thread(getDriveInfoThread);\r
359                 driveInfoThread.Start();\r
360             }\r
361             else\r
362                 mnu_dvd_drive.Visible = false;\r
363         }\r
364         private void btn_start_Click(object sender, EventArgs e)\r
365         {\r
366             if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)\r
367                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
368             else\r
369             {\r
370                 // Set the last action to encode. \r
371                 // This is used for tracking which file to load in the activity window\r
372                 lastAction = "encode";\r
373 \r
374                 String query;\r
375                 if (rtf_query.Text != "")\r
376                     query = rtf_query.Text;\r
377                 else\r
378                     query = queryGen.GenerateTheQuery(this);\r
379 \r
380                 ThreadPool.QueueUserWorkItem(procMonitor, query);\r
381                 lbl_encode.Visible = true;\r
382                 lbl_encode.Text = "Encoding in Progress";\r
383 \r
384                 btn_start.Text = "Stop";\r
385                 btn_start.ToolTipText = "Stop the encoding process. \nWarning: This may break your file. Press ctrl-c in the CLI window if you wish it to exit cleanly.";\r
386                 btn_start.Image = Properties.Resources.stop;\r
387             }\r
388         }\r
389         private void btn_add2Queue_Click(object sender, EventArgs e)\r
390         {\r
391             if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)\r
392                 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
393             else\r
394             {\r
395 \r
396                 String query = queryGen.GenerateTheQuery(this);\r
397                 if (rtf_query.Text != "")\r
398                     query = rtf_query.Text;\r
399 \r
400                 encodeQueue.add(query);\r
401                 encodeQueue.write2disk("hb_queue_recovery.dat"); // Writes the queue to the recovery file, just incase the GUI crashes.\r
402 \r
403                 queueWindow.setQueue(encodeQueue);\r
404                 queueWindow.Show();\r
405             }\r
406         }\r
407         private void btn_showQueue_Click(object sender, EventArgs e)\r
408         {\r
409             queueWindow.setQueue(encodeQueue);\r
410             queueWindow.Show();\r
411         }\r
412         private void btn_ActivityWindow_Click(object sender, EventArgs e)\r
413         {\r
414             String file = String.Empty;\r
415             if (lastAction == "scan")\r
416                 file = "dvdinfo.dat";\r
417             else\r
418                 file = "hb_encode_log.dat";\r
419 \r
420             frmActivityWindow ActivityWindow = new frmActivityWindow(file, this, queueWindow);\r
421             ActivityWindow.Show();\r
422         }\r
423 \r
424         //Source\r
425         private void btn_dvd_source_Click(object sender, EventArgs e)\r
426         {\r
427             // Enable the creation of chapter markers.\r
428             Check_ChapterMarkers.Enabled = true;\r
429 \r
430             // Set the last action to scan. \r
431             // This is used for tracking which file to load in the activity window\r
432             lastAction = "scan";\r
433 \r
434             String filename = "";\r
435             text_source.Text = "";\r
436 \r
437             DVD_Open.ShowDialog();\r
438             filename = DVD_Open.SelectedPath;\r
439 \r
440             if (filename.StartsWith("\\"))\r
441                 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
442             else\r
443             {\r
444                 if (filename != "")\r
445                 {\r
446                     Form frmRD = new frmReadDVD(filename, this);\r
447                     text_source.Text = filename;\r
448                     lbl_encode.Text = "Scanning ...";\r
449                     frmRD.ShowDialog();\r
450                 }\r
451                 else\r
452                     text_source.Text = "Click 'Source' to continue";\r
453 \r
454                 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.\r
455                 if (drp_dvdtitle.Items.Count == 0)\r
456                     MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source.\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
457 \r
458                 lbl_encode.Text = "";\r
459             }\r
460         }\r
461         private void btn_file_source_Click(object sender, EventArgs e)\r
462         {\r
463             // Set the last action to scan. \r
464             // This is used for tracking which file to load in the activity window\r
465             lastAction = "scan";\r
466 \r
467             String filename = "";\r
468             text_source.Text = "";\r
469 \r
470             ISO_Open.ShowDialog();\r
471             filename = ISO_Open.FileName;\r
472 \r
473             if (filename.StartsWith("\\"))\r
474                 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
475             else\r
476             {\r
477                 if (filename != "")\r
478                 {\r
479                     Form frmRD = new frmReadDVD(filename, this);\r
480                     text_source.Text = filename;\r
481                     lbl_encode.Text = "Scanning ...";\r
482                     frmRD.ShowDialog();\r
483                 }\r
484                 else\r
485                     text_source.Text = "Click 'Source' to continue";\r
486 \r
487                 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.\r
488                 if (drp_dvdtitle.Items.Count == 0)\r
489                     MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source.\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
490 \r
491                 lbl_encode.Text = "";\r
492 \r
493                 // Enable the creation of chapter markers if the file is an image of a dvd.\r
494                 if (filename.ToLower().Contains(".iso"))\r
495                     Check_ChapterMarkers.Enabled = true;\r
496                 else\r
497                 {\r
498                     Check_ChapterMarkers.Enabled = false;\r
499                     Check_ChapterMarkers.Checked = false;\r
500                     data_chpt.Rows.Clear();\r
501                 }\r
502             }\r
503         }\r
504         private void mnu_dvd_drive_Click(object sender, EventArgs e)\r
505         {\r
506             // Enable the creation of chapter markers.\r
507             Check_ChapterMarkers.Enabled = true;\r
508 \r
509             // Set the last action to scan. \r
510             // This is used for tracking which file to load in the activity window\r
511             lastAction = "scan";\r
512 \r
513             String filename = "";\r
514             if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))\r
515             {\r
516                 string[] path = mnu_dvd_drive.Text.Split(' ');\r
517                 filename = path[0];\r
518                 lbl_encode.Text = "Scanning ...";\r
519                 Form frmRD = new frmReadDVD(filename, this);\r
520                 text_source.Text = filename;\r
521                 frmRD.ShowDialog();\r
522             }\r
523 \r
524             // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.\r
525             if (drp_dvdtitle.Items.Count == 0)\r
526                 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source.\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
527 \r
528             lbl_encode.Text = "";\r
529         }\r
530 \r
531         private void drp_dvdtitle_Click(object sender, EventArgs e)\r
532         {\r
533             if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))\r
534                 MessageBox.Show("There are no titles to select. Please load a source file by clicking the 'Source' button above before trying to select a title.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
535         }\r
536         private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)\r
537         {\r
538             // Reset some values on the form\r
539             lbl_Aspect.Text = "Select a Title";\r
540             //lbl_RecomendedCrop.Text = "Select a Title";\r
541             drop_chapterStart.Items.Clear();\r
542             drop_chapterFinish.Items.Clear();\r
543 \r
544             // If the dropdown is set to automatic nothing else needs to be done.\r
545             // Otheriwse if its not, title data has to be loased from parsing.\r
546             if (drp_dvdtitle.Text != "Automatic")\r
547             {\r
548                 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;\r
549 \r
550                 // Set the Aspect Ratio\r
551                 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();\r
552                 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;\r
553                 lbl_duration.Text = selectedTitle.Duration.ToString();\r
554 \r
555                 // Set the Recommended Cropping values\r
556                 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();\r
557                 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();\r
558                 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();\r
559                 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();\r
560 \r
561                 // Populate the Start chapter Dropdown\r
562                 drop_chapterStart.Items.Clear();\r
563                 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());\r
564                 if (drop_chapterStart.Items.Count > 0)\r
565                     drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();\r
566 \r
567                 // Populate the Final Chapter Dropdown\r
568                 drop_chapterFinish.Items.Clear();\r
569                 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());\r
570                 if (drop_chapterFinish.Items.Count > 0)\r
571                     drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();\r
572 \r
573                 // Populate the Audio Channels Dropdown\r
574                 drp_track1Audio.Items.Clear();\r
575                 drp_track1Audio.Items.Add("Automatic");\r
576                 drp_track1Audio.Items.Add("None");\r
577                 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
578                 drp_track1Audio.SelectedIndex = 0;\r
579 \r
580                 drp_track2Audio.Items.Clear();\r
581                 drp_track2Audio.Items.Add("None");\r
582                 drp_track2Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
583                 drp_track2Audio.SelectedIndex = 0;\r
584 \r
585                 drp_track3Audio.Items.Clear();\r
586                 drp_track3Audio.Items.Add("None");\r
587                 drp_track3Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
588                 drp_track3Audio.SelectedIndex = 0;\r
589 \r
590                 drp_track4Audio.Items.Clear();\r
591                 drp_track4Audio.Items.Add("None");\r
592                 drp_track4Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
593                 drp_track4Audio.SelectedIndex = 0;\r
594 \r
595                 // Populate the Subtitles dropdown\r
596                 drp_subtitle.Items.Clear();\r
597                 drp_subtitle.Items.Add("None");\r
598                 drp_subtitle.Items.Add("Autoselect");\r
599                 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());\r
600                 if (drp_subtitle.Items.Count > 0)\r
601                     drp_subtitle.Text = drp_subtitle.Items[0].ToString();\r
602 \r
603             }\r
604 \r
605             // Run the autoName & chapterNaming functions\r
606             if (Properties.Settings.Default.autoNaming == "Checked")\r
607                 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);\r
608 \r
609             data_chpt.Rows.Clear();\r
610             DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterStart.Text, drop_chapterFinish.Text);\r
611             if (chapterGridView != null)\r
612                 data_chpt = chapterGridView;\r
613         }\r
614         private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)\r
615         {\r
616             int c_start, c_end = 1;\r
617 \r
618             if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)\r
619                 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;\r
620 \r
621             int.TryParse(drop_chapterStart.Text, out c_start);\r
622             int.TryParse(drop_chapterFinish.Text, out c_end);\r
623 \r
624             if (c_end != 0)\r
625             {\r
626                 if (c_start > c_end)\r
627                     drop_chapterFinish.Text = c_start.ToString();\r
628             }\r
629 \r
630             lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();\r
631 \r
632             // Run the Autonaming function\r
633             if (Properties.Settings.Default.autoNaming == "Checked")\r
634                 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);\r
635         }\r
636         private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)\r
637         {\r
638             int c_start, c_end = 1;\r
639 \r
640             if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)\r
641                 drop_chapterStart.SelectedIndex = 1;\r
642 \r
643             int.TryParse(drop_chapterStart.Text, out c_start);\r
644             int.TryParse(drop_chapterFinish.Text, out c_end);\r
645 \r
646             if (c_start != 0)\r
647             {\r
648                 if (c_end < c_start)\r
649                     drop_chapterFinish.Text = c_start.ToString();\r
650             }\r
651 \r
652             lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();\r
653 \r
654             // Run the Autonaming function\r
655             if (Properties.Settings.Default.autoNaming == "Checked")\r
656                 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);\r
657         }\r
658 \r
659         //Destination\r
660         private void btn_destBrowse_Click(object sender, EventArgs e)\r
661         {\r
662             // This removes the file extension from the filename box on the save file dialog.\r
663             // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.\r
664             DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");\r
665 \r
666             // Show the dialog and set the main form file path\r
667 \r
668             if (text_destination.Text.EndsWith(".mp4"))\r
669                 DVD_Save.FilterIndex = 1;\r
670             else if (text_destination.Text.EndsWith(".m4v"))\r
671                 DVD_Save.FilterIndex = 2;\r
672             else if (text_destination.Text.EndsWith(".avi"))\r
673                 DVD_Save.FilterIndex = 3;\r
674             else if (text_destination.Text.EndsWith(".ogm"))\r
675                 DVD_Save.FilterIndex = 4;\r
676             else if (text_destination.Text.EndsWith(".mkv"))\r
677                 DVD_Save.FilterIndex = 5;\r
678 \r
679             if (DVD_Save.ShowDialog() == DialogResult.OK)\r
680             {\r
681                 if (DVD_Save.FileName.StartsWith("\\"))\r
682                     MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
683                 else\r
684                 {\r
685                     setAudioByContainer(DVD_Save.FileName);\r
686                     text_destination.Text = DVD_Save.FileName;\r
687 \r
688                     // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)\r
689                     if (Check_ChapterMarkers.Checked)\r
690                         text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");\r
691                 }\r
692             }\r
693         }\r
694         private void text_destination_TextChanged(object sender, EventArgs e)\r
695         {\r
696             setAudioByContainer(text_destination.Text);\r
697             setVideoByContainer(text_destination.Text);\r
698             string path = text_destination.Text;\r
699             if (path.EndsWith(".mp4"))\r
700                 drop_format.SelectedIndex = 0;\r
701             else if (path.EndsWith(".m4v"))\r
702                 drop_format.SelectedIndex = 1;\r
703             else if (path.EndsWith(".mkv"))\r
704                 drop_format.SelectedIndex = 2;\r
705             else if (path.EndsWith(".avi"))\r
706                 drop_format.SelectedIndex = 3;\r
707             else if (path.EndsWith(".ogm"))\r
708                 drop_format.SelectedIndex = 4;\r
709 \r
710         }\r
711 \r
712         // Output Settings\r
713         private void drop_format_SelectedIndexChanged(object sender, EventArgs e)\r
714         {\r
715             if (drop_format.SelectedIndex == 0)\r
716                 text_destination.Text = hb_common_func.setExtension(text_destination.Text, ".mp4");\r
717             else if (drop_format.SelectedIndex == 1)\r
718                 text_destination.Text = hb_common_func.setExtension(text_destination.Text, ".m4v");\r
719             else if (drop_format.SelectedIndex == 2)\r
720                 text_destination.Text = hb_common_func.setExtension(text_destination.Text, ".mkv");\r
721             else if (drop_format.SelectedIndex == 3)\r
722                 text_destination.Text = hb_common_func.setExtension(text_destination.Text, ".avi");\r
723             else if (drop_format.SelectedIndex == 4)\r
724                 text_destination.Text = hb_common_func.setExtension(text_destination.Text, ".ogm");\r
725         }\r
726 \r
727         //Video Tab\r
728         private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)\r
729         {\r
730             if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))\r
731             {\r
732                 check_largeFile.Enabled = true;\r
733                 check_optimiseMP4.Enabled = true;\r
734                 check_iPodAtom.Enabled = true;\r
735             }\r
736             else\r
737             {\r
738                 check_largeFile.Enabled = false;\r
739                 check_optimiseMP4.Enabled = false;\r
740                 check_iPodAtom.Enabled = false;\r
741                 check_largeFile.Checked = false;\r
742                 check_optimiseMP4.Checked = false;\r
743                 check_iPodAtom.Checked = false;\r
744             }\r
745 \r
746 \r
747             //Turn off some options which are H.264 only when the user selects a non h.264 encoder\r
748             if (drp_videoEncoder.Text.Contains("H.264"))\r
749             {\r
750                 if (check_2PassEncode.CheckState == CheckState.Checked)\r
751                     check_turbo.Enabled = true;\r
752 \r
753                 h264Tab.Enabled = true;\r
754                 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))\r
755                     check_iPodAtom.Enabled = true;\r
756                 else\r
757                     check_iPodAtom.Enabled = false;\r
758                 if (!drp_anamorphic.Items.Contains("Loose"))\r
759                     drp_anamorphic.Items.Add("Loose");\r
760             }\r
761             else\r
762             {\r
763                 check_turbo.CheckState = CheckState.Unchecked;\r
764                 check_turbo.Enabled = false;\r
765                 h264Tab.Enabled = false;\r
766                 rtf_x264Query.Text = "";\r
767                 check_iPodAtom.Enabled = false;\r
768                 check_iPodAtom.Checked = false;\r
769                 if (drp_anamorphic.Items.Count == 3)\r
770                     drp_anamorphic.Items.RemoveAt(2);\r
771             }\r
772 \r
773         }\r
774         private void text_bitrate_TextChanged(object sender, EventArgs e)\r
775         {\r
776             text_filesize.Text = "";\r
777             slider_videoQuality.Value = 0;\r
778             SliderValue.Text = "0%";\r
779             check_2PassEncode.Enabled = true;\r
780         }\r
781         private void text_filesize_TextChanged(object sender, EventArgs e)\r
782         {\r
783             text_bitrate.Text = "";\r
784             slider_videoQuality.Value = 0;\r
785             SliderValue.Text = "0%";\r
786             check_2PassEncode.Enabled = true;\r
787         }\r
788         private void slider_videoQuality_Scroll(object sender, EventArgs e)\r
789         {\r
790             SliderValue.Text = slider_videoQuality.Value.ToString() + "%";\r
791             text_bitrate.Text = "";\r
792             text_filesize.Text = "";\r
793             check_2PassEncode.Enabled = false;\r
794             check_2PassEncode.CheckState = CheckState.Unchecked;\r
795         }\r
796         private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)\r
797         {\r
798             if (check_2PassEncode.CheckState.ToString() == "Checked")\r
799             {\r
800                 if (drp_videoEncoder.Text.Contains("H.264"))\r
801                     check_turbo.Enabled = true;\r
802             }\r
803             else\r
804             {\r
805                 check_turbo.Enabled = false;\r
806                 check_turbo.CheckState = CheckState.Unchecked;\r
807             }\r
808         }\r
809 \r
810         //Picture Tab\r
811         private void text_width_TextChanged(object sender, EventArgs e)\r
812         {\r
813             maxWidth = 0;  // Reset max width so that it's not using the MaxWidth -X. Quick hack to allow -X for preset usage.\r
814 \r
815             int width;\r
816             Boolean parsed = int.TryParse(text_width.Text, out width);\r
817             if (parsed != false)\r
818             {\r
819                 if ((width % 16) != 0)\r
820                     text_width.BackColor = Color.LightCoral;\r
821                 else\r
822                     text_width.BackColor = Color.LightGreen;\r
823 \r
824 \r
825                 if (lbl_Aspect.Text != "Select a Title" && maxWidth != 0 && maxHeight != 0)\r
826                 {\r
827                     if (drp_anamorphic.Text == "None")\r
828                     {\r
829                         int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);\r
830                         text_height.Text = height.ToString();\r
831                     }\r
832                 }\r
833             }\r
834         }\r
835         private void text_height_TextChanged(object sender, EventArgs e)\r
836         {\r
837             maxHeight = 0;  // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.\r
838 \r
839             int height;\r
840             Boolean parsed = int.TryParse(text_height.Text, out height);\r
841             if (parsed != false)\r
842             {\r
843                 if ((height % 16) != 0)\r
844                     text_height.BackColor = Color.LightCoral;\r
845                 else\r
846                     text_height.BackColor = Color.LightGreen;\r
847             }\r
848         }\r
849         private void check_customCrop_CheckedChanged(object sender, EventArgs e)\r
850         {\r
851             text_left.Enabled = true;\r
852             text_right.Enabled = true;\r
853             text_top.Enabled = true;\r
854             text_bottom.Enabled = true;\r
855             if (selectedTitle != null)\r
856             {\r
857                 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();\r
858                 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();\r
859                 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();\r
860                 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();\r
861             }\r
862             else\r
863             {\r
864                 text_left.Text = "0";\r
865                 text_right.Text = "0";\r
866                 text_top.Text = "0";\r
867                 text_bottom.Text = "0";\r
868             }\r
869         }\r
870         private void check_autoCrop_CheckedChanged(object sender, EventArgs e)\r
871         {\r
872             text_left.Enabled = false;\r
873             text_right.Enabled = false;\r
874             text_top.Enabled = false;\r
875             text_bottom.Enabled = false;\r
876         }\r
877         private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)\r
878         {\r
879             if (drp_anamorphic.SelectedIndex == 1)\r
880             {\r
881                 text_height.BackColor = Color.LightGray;\r
882                 text_width.BackColor = Color.LightGray;\r
883                 text_height.Text = "";\r
884                 text_width.Text = "";\r
885                 text_height.Enabled = false;\r
886                 text_width.Enabled = false;\r
887             }\r
888 \r
889             if (drp_anamorphic.SelectedIndex == 2)\r
890             {\r
891                 text_height.Text = "";\r
892                 text_height.Enabled = false;\r
893                 text_height.BackColor = Color.LightGray;\r
894 \r
895                 text_width.Enabled = true;\r
896                 text_width.BackColor = Color.White;\r
897             }\r
898 \r
899             if (drp_anamorphic.SelectedIndex == 0)\r
900             {\r
901                 text_height.BackColor = Color.White;\r
902                 text_width.BackColor = Color.White;\r
903                 text_height.Enabled = true;\r
904                 text_width.Enabled = true;\r
905             }\r
906         }\r
907         private void slider_deblock_Scroll(object sender, EventArgs e)\r
908         {\r
909             if (slider_deblock.Value == 4)\r
910                 lbl_deblockVal.Text = "Off";\r
911             else\r
912                 lbl_deblockVal.Text = slider_deblock.Value.ToString();\r
913         }\r
914 \r
915         // Audio Tab\r
916         private void drp_track2Audio_SelectedIndexChanged(object sender, EventArgs e)\r
917         {\r
918             if (drp_track2Audio.SelectedItem.Equals("None"))\r
919             {\r
920                 drp_audbit_2.Enabled = false;\r
921                 drp_audenc_2.Enabled = false;\r
922                 drp_audsr_2.Enabled = false;\r
923                 drp_audmix_2.Enabled = false;\r
924                 trackBar2.Enabled = false;\r
925                 drp_audbit_2.Text = "";\r
926                 drp_audenc_2.Text = "";\r
927                 drp_audsr_2.Text = "";\r
928                 drp_audmix_2.Text = "Automatic";\r
929                 trackBar2.Value = 0;\r
930 \r
931                 // Disable the 3rd Track.\r
932                 drp_track3Audio.Enabled = false;\r
933                 drp_track3Audio.Text = "None";\r
934                 drp_audbit_3.Text = "";\r
935                 drp_audenc_3.Text = "";\r
936                 drp_audsr_3.Text = "";\r
937                 drp_audmix_3.Text = "Automatic";\r
938                 trackBar3.Value = 0;\r
939             }\r
940             else\r
941             {\r
942                 drp_audbit_2.Enabled = true;\r
943                 drp_audenc_2.Enabled = true;\r
944                 drp_audsr_2.Enabled = true;\r
945                 drp_audmix_2.Enabled = true;\r
946                 trackBar2.Enabled = true;\r
947                 drp_audbit_2.Text = "160";\r
948                 drp_audenc_2.Text = "AAC";\r
949                 drp_audsr_2.Text = "Auto";\r
950                 drp_audmix_2.Text = "Automatic";\r
951 \r
952                 // Enable the 3rd Track.\r
953                 drp_track3Audio.Enabled = true;\r
954                 drp_audbit_3.Text = "";\r
955                 drp_audenc_3.Text = "";\r
956                 drp_audsr_3.Text = "";\r
957                 drp_audmix_3.Text = "Automatic";\r
958             }\r
959         }\r
960         private void drp_track3Audio_SelectedIndexChanged(object sender, EventArgs e)\r
961         {\r
962             if (drp_track3Audio.SelectedItem.Equals("None"))\r
963             {\r
964                 drp_audbit_3.Enabled = false;\r
965                 drp_audenc_3.Enabled = false;\r
966                 drp_audsr_3.Enabled = false;\r
967                 drp_audmix_3.Enabled = false;\r
968                 trackBar3.Enabled = false;\r
969                 drp_audbit_3.Text = "";\r
970                 drp_audenc_3.Text = "";\r
971                 drp_audsr_3.Text = "";\r
972                 drp_audmix_3.Text = "Automatic";\r
973                 trackBar3.Value = 0;\r
974 \r
975                 // Disable the 4th Track.\r
976                 drp_track4Audio.Enabled = false;\r
977                 drp_track4Audio.Text = "None";\r
978                 drp_audbit_4.Text = "";\r
979                 drp_audenc_4.Text = "";\r
980                 drp_audsr_4.Text = "";\r
981                 drp_audmix_4.Text = "Automatic";\r
982 \r
983             }\r
984             else\r
985             {\r
986                 drp_audbit_3.Enabled = true;\r
987                 drp_audenc_3.Enabled = true;\r
988                 drp_audsr_3.Enabled = true;\r
989                 drp_audmix_3.Enabled = true;\r
990                 trackBar3.Enabled = true;\r
991                 drp_audbit_3.Text = "160";\r
992                 drp_audenc_3.Text = "AAC";\r
993                 drp_audsr_3.Text = "Auto";\r
994                 drp_audmix_3.Text = "Automatic";\r
995 \r
996                 // Enable the 4th Track.\r
997                 drp_track4Audio.Enabled = true;\r
998                 drp_audbit_4.Text = "";\r
999                 drp_audenc_4.Text = "";\r
1000                 drp_audsr_4.Text = "";\r
1001                 drp_audmix_4.Text = "Automatic";\r
1002             }\r
1003 \r
1004         }\r
1005         private void drp_track4Audio_SelectedIndexChanged(object sender, EventArgs e)\r
1006         {\r
1007             if (drp_track4Audio.SelectedItem.Equals("None"))\r
1008             {\r
1009                 drp_audbit_4.Enabled = false;\r
1010                 drp_audenc_4.Enabled = false;\r
1011                 drp_audsr_4.Enabled = false;\r
1012                 drp_audmix_4.Enabled = false;\r
1013                 trackBar4.Enabled = false;\r
1014                 drp_audbit_4.Text = "";\r
1015                 drp_audenc_4.Text = "";\r
1016                 drp_audsr_4.Text = "";\r
1017                 drp_audmix_4.Text = "Automatic";\r
1018                 trackBar4.Value = 0;\r
1019             }\r
1020             else\r
1021             {\r
1022                 drp_audbit_4.Enabled = true;\r
1023                 drp_audenc_4.Enabled = true;\r
1024                 drp_audsr_4.Enabled = true;\r
1025                 drp_audmix_4.Enabled = true;\r
1026                 trackBar4.Enabled = true;\r
1027                 drp_audbit_4.Text = "160";\r
1028                 drp_audenc_4.Text = "AAC";\r
1029                 drp_audsr_4.Text = "Auto";\r
1030                 drp_audmix_4.Text = "Automatic";\r
1031             }\r
1032         }\r
1033 \r
1034         private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)\r
1035         {\r
1036             if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))\r
1037                 setBitrateSelections384(drp_audbit_1);\r
1038             else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))\r
1039             {\r
1040                 setBitrateSelections160(drp_audbit_1);\r
1041                 drp_audbit_1.Text = "160";\r
1042             }\r
1043         }\r
1044         private void drp_audmix_2_SelectedIndexChanged(object sender, EventArgs e)\r
1045         {\r
1046             if ((drp_audenc_2.Text == "AAC") && (drp_audmix_2.Text == "6 Channel Discrete"))\r
1047                 setBitrateSelections384(drp_audbit_2);\r
1048             else if ((drp_audenc_2.Text == "AAC") && (drp_audmix_2.Text != "6 Channel Discrete"))\r
1049             {\r
1050                 setBitrateSelections160(drp_audbit_2);\r
1051                 drp_audbit_2.Text = "160";\r
1052             }\r
1053         }\r
1054         private void drp_audmix_3_SelectedIndexChanged(object sender, EventArgs e)\r
1055         {\r
1056             if ((drp_audenc_3.Text == "AAC") && (drp_audmix_3.Text == "6 Channel Discrete"))\r
1057                 setBitrateSelections384(drp_audbit_3);\r
1058             else if ((drp_audenc_3.Text == "AAC") && (drp_audmix_3.Text != "6 Channel Discrete"))\r
1059             {\r
1060                 setBitrateSelections160(drp_audbit_3);\r
1061                 drp_audbit_3.Text = "160";\r
1062             }\r
1063         }\r
1064         private void drp_audmix_4_SelectedIndexChanged(object sender, EventArgs e)\r
1065         {\r
1066             if ((drp_audenc_4.Text == "AAC") && (drp_audmix_4.Text == "6 Channel Discrete"))\r
1067                 setBitrateSelections384(drp_audbit_4);\r
1068             else if ((drp_audenc_4.Text == "AAC") && (drp_audmix_4.Text != "6 Channel Discrete"))\r
1069             {\r
1070                 setBitrateSelections160(drp_audbit_4);\r
1071                 drp_audbit_4.Text = "160";\r
1072             }\r
1073         }\r
1074 \r
1075         private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)\r
1076         {\r
1077             if (drp_audenc_1.Text == "AC3")\r
1078             {\r
1079                 drp_audmix_1.Enabled = false;\r
1080                 drp_audbit_1.Enabled = false;\r
1081                 drp_audsr_1.Enabled = false;\r
1082             }\r
1083             else\r
1084             {\r
1085                 drp_audmix_1.Enabled = true;\r
1086                 drp_audbit_1.Enabled = true;\r
1087                 drp_audsr_1.Enabled = true;\r
1088 \r
1089                 drp_audmix_1.Text = "Automatic";\r
1090                 drp_audbit_1.Text = "160";\r
1091                 drp_audsr_1.Text = "Auto";\r
1092             }\r
1093 \r
1094 \r
1095             if (drp_audenc_1.Text == "AAC")\r
1096             {\r
1097                 drp_audmix_1.Items.Clear();\r
1098                 drp_audmix_1.Items.Add("Mono");\r
1099                 drp_audmix_1.Items.Add("Stereo");\r
1100                 drp_audmix_1.Items.Add("Dolby Surround");\r
1101                 drp_audmix_1.Items.Add("Dolby Pro Logic II");\r
1102                 drp_audmix_1.Items.Add("6 Channel Discrete");\r
1103 \r
1104                 setBitrateSelections160(drp_audbit_1);\r
1105             }\r
1106             else\r
1107             {\r
1108                 drp_audmix_1.Items.Clear();\r
1109                 drp_audmix_1.Items.Add("Stereo");\r
1110                 drp_audmix_1.Items.Add("Dolby Surround");\r
1111                 drp_audmix_1.Items.Add("Dolby Pro Logic II");\r
1112 \r
1113                 setBitrateSelections320(drp_audbit_1);\r
1114             }\r
1115         }\r
1116         private void drp_audenc_2_SelectedIndexChanged(object sender, EventArgs e)\r
1117         {\r
1118             if (drp_audenc_2.Text == "AC3")\r
1119             {\r
1120                 drp_audmix_2.Enabled = false;\r
1121                 drp_audbit_2.Enabled = false;\r
1122                 drp_audsr_2.Enabled = false;\r
1123 \r
1124                 drp_audmix_2.Text = "Automatic";\r
1125                 drp_audbit_2.Text = "160";\r
1126                 drp_audsr_2.Text = "Auto";\r
1127             }\r
1128             else\r
1129             {\r
1130                 // Just make sure not to re-enable the following boxes if the track2 is none\r
1131                 if (drp_track2Audio.Text != "None")\r
1132                 {\r
1133                     drp_audmix_2.Enabled = true;\r
1134                     drp_audbit_2.Enabled = true;\r
1135                     drp_audsr_2.Enabled = true;\r
1136 \r
1137                     drp_audmix_2.Text = "Automatic";\r
1138                     drp_audbit_2.Text = "160";\r
1139                     drp_audsr_2.Text = "Auto";\r
1140                 }\r
1141             }\r
1142 \r
1143             if (drp_audenc_2.Text == "AAC")\r
1144             {\r
1145                 drp_audmix_2.Items.Clear();\r
1146                 drp_audmix_2.Items.Add("Mono");\r
1147                 drp_audmix_2.Items.Add("Stereo");\r
1148                 drp_audmix_2.Items.Add("Dolby Surround");\r
1149                 drp_audmix_2.Items.Add("Dolby Pro Logic II");\r
1150                 drp_audmix_2.Items.Add("6 Channel Discrete");\r
1151 \r
1152                 setBitrateSelections160(drp_audbit_2);\r
1153             }\r
1154             else\r
1155             {\r
1156                 drp_audmix_2.Items.Clear();\r
1157                 drp_audmix_2.Items.Add("Stereo");\r
1158                 drp_audmix_2.Items.Add("Dolby Surround");\r
1159                 drp_audmix_2.Items.Add("Dolby Pro Logic II");\r
1160 \r
1161                 setBitrateSelections320(drp_audbit_2);\r
1162             }\r
1163         }\r
1164         private void drp_audenc_3_SelectedIndexChanged(object sender, EventArgs e)\r
1165         {\r
1166             if (drp_audenc_3.Text == "AC3")\r
1167             {\r
1168                 drp_audmix_3.Enabled = false;\r
1169                 drp_audbit_3.Enabled = false;\r
1170                 drp_audsr_3.Enabled = false;\r
1171 \r
1172                 drp_audmix_3.Text = "Automatic";\r
1173                 drp_audbit_3.Text = "160";\r
1174                 drp_audsr_3.Text = "Auto";\r
1175             }\r
1176             else\r
1177             {\r
1178                 // Just make sure not to re-enable the following boxes if the track above is none\r
1179                 if (drp_track2Audio.Text != "None")\r
1180                 {\r
1181                     drp_audmix_3.Enabled = true;\r
1182                     drp_audbit_3.Enabled = true;\r
1183                     drp_audsr_3.Enabled = true;\r
1184 \r
1185                     drp_audmix_3.Text = "Automatic";\r
1186                     drp_audbit_3.Text = "160";\r
1187                     drp_audsr_3.Text = "Auto";\r
1188                 }\r
1189             }\r
1190 \r
1191 \r
1192             if (drp_audenc_3.Text == "AAC")\r
1193             {\r
1194                 drp_audmix_3.Items.Clear();\r
1195                 drp_audmix_3.Items.Add("Mono");\r
1196                 drp_audmix_3.Items.Add("Stereo");\r
1197                 drp_audmix_3.Items.Add("Dolby Surround");\r
1198                 drp_audmix_3.Items.Add("Dolby Pro Logic II");\r
1199                 drp_audmix_3.Items.Add("6 Channel Discrete");\r
1200 \r
1201                 setBitrateSelections160(drp_audbit_3);\r
1202             }\r
1203             else\r
1204             {\r
1205                 drp_audmix_3.Items.Clear();\r
1206                 drp_audmix_3.Items.Add("Stereo");\r
1207                 drp_audmix_3.Items.Add("Dolby Surround");\r
1208                 drp_audmix_3.Items.Add("Dolby Pro Logic II");\r
1209 \r
1210                 setBitrateSelections320(drp_audbit_3);\r
1211             }\r
1212         }\r
1213         private void drp_audenc_4_SelectedIndexChanged(object sender, EventArgs e)\r
1214         {\r
1215             if (drp_audenc_4.Text == "AC3")\r
1216             {\r
1217                 drp_audmix_4.Enabled = false;\r
1218                 drp_audbit_4.Enabled = false;\r
1219                 drp_audsr_4.Enabled = false;\r
1220 \r
1221                 drp_audmix_4.Text = "Automatic";\r
1222                 drp_audbit_4.Text = "160";\r
1223                 drp_audsr_4.Text = "Auto";\r
1224             }\r
1225             else\r
1226             {\r
1227                 // Just make sure not to re-enable the following boxes if the track above is none\r
1228                 if (drp_track2Audio.Text != "None")\r
1229                 {\r
1230                     drp_audmix_4.Enabled = true;\r
1231                     drp_audbit_4.Enabled = true;\r
1232                     drp_audsr_4.Enabled = true;\r
1233 \r
1234                     drp_audmix_4.Text = "Automatic";\r
1235                     drp_audbit_4.Text = "160";\r
1236                     drp_audsr_4.Text = "Auto";\r
1237                 }\r
1238             }\r
1239 \r
1240 \r
1241             if (drp_audenc_4.Text == "AAC")\r
1242             {\r
1243                 drp_audmix_4.Items.Clear();\r
1244                 drp_audmix_4.Items.Add("Mono");\r
1245                 drp_audmix_4.Items.Add("Stereo");\r
1246                 drp_audmix_4.Items.Add("Dolby Surround");\r
1247                 drp_audmix_4.Items.Add("Dolby Pro Logic II");\r
1248                 drp_audmix_4.Items.Add("6 Channel Discrete");\r
1249 \r
1250                 setBitrateSelections160(drp_audbit_4);\r
1251             }\r
1252             else\r
1253             {\r
1254                 drp_audmix_4.Items.Clear();\r
1255                 drp_audmix_4.Items.Add("Stereo");\r
1256                 drp_audmix_4.Items.Add("Dolby Surround");\r
1257                 drp_audmix_4.Items.Add("Dolby Pro Logic II");\r
1258 \r
1259                 setBitrateSelections320(drp_audbit_4);\r
1260             }\r
1261         }\r
1262 \r
1263         private void trackBar1_Scroll(object sender, EventArgs e)\r
1264         {\r
1265             double value = trackBar1.Value / 10.0;\r
1266             value++;\r
1267 \r
1268             lbl_drc1.Text = value.ToString();\r
1269         }\r
1270         private void trackBar2_Scroll(object sender, EventArgs e)\r
1271         {\r
1272             double value = trackBar2.Value / 10.0;\r
1273             value++;\r
1274 \r
1275             lbl_drc2.Text = value.ToString();\r
1276         }\r
1277         private void trackBar3_Scroll(object sender, EventArgs e)\r
1278         {\r
1279             double value = trackBar3.Value / 10.0;\r
1280             value++;\r
1281 \r
1282             lbl_drc3.Text = value.ToString();\r
1283         }\r
1284         private void trackBar4_Scroll(object sender, EventArgs e)\r
1285         {\r
1286             double value = trackBar4.Value / 10.0;\r
1287             value++;\r
1288 \r
1289             lbl_drc4.Text = value.ToString();\r
1290         }\r
1291 \r
1292         private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)\r
1293         {\r
1294             if (drp_subtitle.Text.Contains("None"))\r
1295             {\r
1296                 check_forced.Enabled = false;\r
1297                 check_forced.Checked = false;\r
1298             }\r
1299             else\r
1300                 check_forced.Enabled = true;\r
1301         }\r
1302 \r
1303         // Chapter Marker Tab\r
1304         private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)\r
1305         {\r
1306             if (Check_ChapterMarkers.Checked)\r
1307             {\r
1308                 string destination = text_destination.Text;\r
1309                 destination = destination.Replace(".mp4", ".m4v");\r
1310                 text_destination.Text = destination;\r
1311                 data_chpt.Rows.Clear();\r
1312                 data_chpt.Enabled = true;\r
1313                 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterStart.Text, drop_chapterFinish.Text);\r
1314                 if (chapterGridView != null)\r
1315                     data_chpt = chapterGridView;\r
1316             }\r
1317             else\r
1318             {\r
1319                 string destination = text_destination.Text;\r
1320                 destination = destination.Replace(".m4v", ".mp4");\r
1321                 text_destination.Text = destination;\r
1322                 data_chpt.Rows.Clear();\r
1323                 data_chpt.Enabled = false;\r
1324             }\r
1325         }\r
1326 \r
1327         // Advanced Tab\r
1328         private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)\r
1329         {\r
1330             x264PanelFunctions.on_x264_WidgetChange("ref", this);\r
1331         }\r
1332         private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)\r
1333         {\r
1334             x264PanelFunctions.on_x264_WidgetChange("mixed-refs", this);\r
1335         }\r
1336         private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)\r
1337         {\r
1338             x264PanelFunctions.on_x264_WidgetChange("bframes", this);\r
1339         }\r
1340         private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)\r
1341         {\r
1342             x264PanelFunctions.on_x264_WidgetChange("direct", this);\r
1343         }\r
1344         private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)\r
1345         {\r
1346             x264PanelFunctions.on_x264_WidgetChange("weightb", this);\r
1347         }\r
1348         private void check_bFrameDistortion_CheckedChanged(object sender, EventArgs e)\r
1349         {\r
1350             x264PanelFunctions.on_x264_WidgetChange("brdo", this);\r
1351         }\r
1352         private void check_BidirectionalRefinement_CheckedChanged(object sender, EventArgs e)\r
1353         {\r
1354             x264PanelFunctions.on_x264_WidgetChange("bime", this);\r
1355         }\r
1356         private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)\r
1357         {\r
1358             x264PanelFunctions.on_x264_WidgetChange("b-pyramid", this);\r
1359         }\r
1360         private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)\r
1361         {\r
1362             x264PanelFunctions.on_x264_WidgetChange("me", this);\r
1363         }\r
1364         private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)\r
1365         {\r
1366             x264PanelFunctions.on_x264_WidgetChange("merange", this);\r
1367         }\r
1368         private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)\r
1369         {\r
1370             x264PanelFunctions.on_x264_WidgetChange("subq", this);\r
1371         }\r
1372         private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)\r
1373         {\r
1374             x264PanelFunctions.on_x264_WidgetChange("analyse", this);\r
1375         }\r
1376         private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)\r
1377         {\r
1378             x264PanelFunctions.on_x264_WidgetChange("8x8dct", this);\r
1379         }\r
1380         private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)\r
1381         {\r
1382             x264PanelFunctions.on_x264_WidgetChange("deblock", this);\r
1383 \r
1384         }\r
1385         private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)\r
1386         {\r
1387             x264PanelFunctions.on_x264_WidgetChange("deblock", this);\r
1388 \r
1389         }\r
1390         private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)\r
1391         {\r
1392             x264PanelFunctions.on_x264_WidgetChange("trellis", this);\r
1393         }\r
1394         private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)\r
1395         {\r
1396             x264PanelFunctions.on_x264_WidgetChange("no-fast-pskip", this);\r
1397         }\r
1398         private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)\r
1399         {\r
1400             x264PanelFunctions.on_x264_WidgetChange("no-dct-decimate", this);\r
1401 \r
1402         }\r
1403         private void check_Cabac_CheckedChanged(object sender, EventArgs e)\r
1404         {\r
1405 \r
1406             x264PanelFunctions.on_x264_WidgetChange("cabac", this);\r
1407         }\r
1408 \r
1409         private void rtf_x264Query_TextChanged(object sender, EventArgs e)\r
1410         {\r
1411             if (rtf_x264Query.Text.EndsWith("\n"))\r
1412             {\r
1413                 rtf_x264Query.Text = rtf_x264Query.Text.Replace("\n", "");\r
1414                 x264PanelFunctions.X264_StandardizeOptString(this);\r
1415                 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);\r
1416 \r
1417                 if (rtf_x264Query.Text == string.Empty)\r
1418                     x264PanelFunctions.reset2Defaults(this);\r
1419             }\r
1420         }\r
1421         private void btn_reset_Click(object sender, EventArgs e)\r
1422         {\r
1423             rtf_x264Query.Text = "";\r
1424             x264PanelFunctions.reset2Defaults(this);\r
1425         }\r
1426 \r
1427         // Query Editor Tab\r
1428         private void btn_generate_Query_Click(object sender, EventArgs e)\r
1429         {\r
1430             rtf_query.Text = queryGen.GenerateTheQuery(this);\r
1431         }\r
1432         private void btn_clear_Click(object sender, EventArgs e)\r
1433         {\r
1434             rtf_query.Clear();\r
1435         }\r
1436 \r
1437         // Presets\r
1438         private void btn_addPreset_Click(object sender, EventArgs e)\r
1439         {\r
1440             // Remember each nodes expanded status so we can reload it\r
1441             List<Boolean> nodeStatus = saveTreeViewState();\r
1442             nodeStatus.Add(true);\r
1443 \r
1444             // Now add the new preset\r
1445             Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);\r
1446             preset.ShowDialog();\r
1447 \r
1448             // Now reload the TreeView states\r
1449             loadTreeViewStates(nodeStatus);\r
1450         }\r
1451         private void btn_removePreset_Click(object sender, EventArgs e)\r
1452         {\r
1453             DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
1454             if (result == DialogResult.Yes)\r
1455             {\r
1456                 if (treeView_presets.SelectedNode != null)\r
1457                     presetHandler.remove(treeView_presets.SelectedNode.Text);\r
1458 \r
1459                 // Remember each nodes expanded status so we can reload it\r
1460                 List<Boolean> nodeStatus = saveTreeViewState();\r
1461 \r
1462                 // Now reload the preset panel\r
1463                 loadPresetPanel();\r
1464 \r
1465                 // Now reload the TreeView states\r
1466                 loadTreeViewStates(nodeStatus);\r
1467             }\r
1468             treeView_presets.Select();\r
1469         }\r
1470         private void btn_setDefault_Click(object sender, EventArgs e)\r
1471         {\r
1472             String query = queryGen.GenerateTheQuery(this);\r
1473             Properties.Settings.Default.defaultUserSettings = query;\r
1474             // Save the new default Settings\r
1475             Properties.Settings.Default.Save();\r
1476             MessageBox.Show("New default settings saved.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
1477         }\r
1478         private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)\r
1479         {\r
1480             // Ok, so, we've selected a preset. Now we want to load it.\r
1481             string presetName = treeView_presets.SelectedNode.Text;\r
1482             string query = presetHandler.getCliForPreset(presetName);\r
1483 \r
1484             if (query != null)\r
1485             {\r
1486                 //Ok, Reset all the H264 widgets before changing the preset\r
1487                 x264PanelFunctions.reset2Defaults(this);\r
1488 \r
1489                 // Send the query from the file to the Query Parser class\r
1490                 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);\r
1491 \r
1492                 // Now load the preset\r
1493                 presetLoader.presetLoader(this, presetQuery, presetName);\r
1494 \r
1495                 // The x264 widgets will need updated, so do this now:\r
1496                 x264PanelFunctions.X264_StandardizeOptString(this);\r
1497                 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);\r
1498             }\r
1499         }\r
1500         private void treeView_presets_deleteKey(object sender, KeyEventArgs e)\r
1501         {\r
1502             if (e.KeyCode == Keys.Delete)\r
1503             {\r
1504                 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
1505                 if (result == DialogResult.Yes)\r
1506                 {\r
1507                     if (treeView_presets.SelectedNode != null)\r
1508                         presetHandler.remove(treeView_presets.SelectedNode.Text);\r
1509 \r
1510                     // Remember each nodes expanded status so we can reload it\r
1511                     List<Boolean> nodeStatus = new List<Boolean>();\r
1512                     foreach (TreeNode node in treeView_presets.Nodes)\r
1513                         nodeStatus.Add(node.IsExpanded);\r
1514 \r
1515                     // Now reload the preset panel\r
1516                     loadPresetPanel();\r
1517 \r
1518                     // And finally, re-expand any of the nodes if required\r
1519                     int i = 0;\r
1520                     foreach (TreeNode node in treeView_presets.Nodes)\r
1521                     {\r
1522                         if (nodeStatus[i] == true)\r
1523                             node.Expand();\r
1524 \r
1525                         i++;\r
1526                     }\r
1527                 }\r
1528             }\r
1529         }\r
1530 \r
1531         #endregion\r
1532 \r
1533         #region Preset Expand / Collaspe\r
1534         private List<Boolean> saveTreeViewState()\r
1535         {\r
1536             // Remember each nodes expanded status so we can reload it\r
1537             List<Boolean> nodeStatus = new List<Boolean>();\r
1538             foreach (TreeNode node in treeView_presets.Nodes)\r
1539             {\r
1540                 nodeStatus.Add(node.IsExpanded);\r
1541                 foreach (TreeNode subNode in node.Nodes)\r
1542                     nodeStatus.Add(node.IsExpanded);\r
1543             }\r
1544             return nodeStatus;\r
1545         }\r
1546 \r
1547         private void loadTreeViewStates(List<Boolean> nodeStatus)\r
1548         {\r
1549             // And finally, re-expand any of the nodes if required\r
1550             int i = 0;\r
1551             foreach (TreeNode node in treeView_presets.Nodes)\r
1552             {\r
1553                 if (nodeStatus[i] == true)\r
1554                     node.Expand();\r
1555 \r
1556                 foreach (TreeNode subNode in node.Nodes)\r
1557                 {\r
1558                     if (nodeStatus[i] == true)\r
1559                         subNode.Expand();\r
1560                 }\r
1561 \r
1562                 i++;\r
1563             }\r
1564         }\r
1565         #endregion\r
1566 \r
1567         #region Functions\r
1568         private void loadNormalPreset()\r
1569         {\r
1570             treeView_presets.Nodes.Find("Normal", true);\r
1571 \r
1572             foreach (TreeNode treenode in treeView_presets.Nodes)\r
1573             {\r
1574                 foreach (TreeNode node in treenode.Nodes)\r
1575                 {\r
1576                     if (node.Text.ToString().Equals("Normal"))\r
1577                         treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];\r
1578                 }\r
1579             }\r
1580         }\r
1581         #endregion\r
1582 \r
1583         #region Drive Detection\r
1584         // Source Button Drive Detection\r
1585         private delegate void ProgressUpdateHandler();\r
1586         private void getDriveInfoThread()\r
1587         {\r
1588             try\r
1589             {\r
1590                 if (this.InvokeRequired)\r
1591                 {\r
1592                     this.BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));\r
1593                     return;\r
1594                 }\r
1595 \r
1596                 Boolean foundDrive = false;\r
1597                 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();\r
1598                 foreach (DriveInfo curDrive in theCollectionOfDrives)\r
1599                 {\r
1600                     if (curDrive.DriveType == DriveType.CDRom)\r
1601                     {\r
1602                         if (curDrive.IsReady)\r
1603                         {\r
1604                             if (File.Exists(curDrive.RootDirectory.ToString() + "VIDEO_TS\\VIDEO_TS.IFO"))\r
1605                                 mnu_dvd_drive.Text = curDrive.RootDirectory.ToString() + "VIDEO_TS (" + curDrive.VolumeLabel + ")";\r
1606                             else\r
1607                                 mnu_dvd_drive.Text = "[No DVD Drive Ready]";\r
1608 \r
1609                             foundDrive = true;\r
1610 \r
1611                         }\r
1612                     }\r
1613                 }\r
1614 \r
1615                 if (foundDrive == false)\r
1616                     mnu_dvd_drive.Text = "[No DVD Drive Ready]";\r
1617             }\r
1618             catch (Exception)\r
1619             {\r
1620                 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";\r
1621             }\r
1622         }\r
1623         #endregion\r
1624 \r
1625         #region Audio Panel Stuff\r
1626         public void setAudioByContainer(String path)\r
1627         {\r
1628             string oldval = "";\r
1629 \r
1630             if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))\r
1631             {\r
1632                 oldval = drp_audenc_1.Text;\r
1633                 drp_audenc_1.Items.Clear();\r
1634                 drp_audenc_1.Items.Add("AAC");\r
1635                 drp_audenc_1.Items.Add("AC3");\r
1636                 if ((oldval != "AAC") && (oldval != "AC3"))\r
1637                     drp_audenc_1.SelectedIndex = 0;\r
1638 \r
1639                 oldval = drp_audenc_2.Text;\r
1640                 drp_audenc_2.Items.Clear();\r
1641                 drp_audenc_2.Items.Add("AAC");\r
1642                 drp_audenc_2.Items.Add("AC3");\r
1643                 if (drp_audenc_2.Enabled)\r
1644                 {\r
1645                     if ((oldval != "AAC") && (oldval != "AC3"))\r
1646                         drp_audenc_2.SelectedIndex = 0;\r
1647                 }\r
1648 \r
1649                 oldval = drp_audenc_3.Text;\r
1650                 drp_audenc_3.Items.Clear();\r
1651                 drp_audenc_3.Items.Add("AAC");\r
1652                 drp_audenc_3.Items.Add("AC3");\r
1653                 if (drp_audenc_3.Enabled)\r
1654                 {\r
1655                     if ((oldval != "AAC") && (oldval != "AC3"))\r
1656                         drp_audenc_3.SelectedIndex = 0;\r
1657                 }\r
1658 \r
1659                 oldval = drp_audenc_4.Text;\r
1660                 drp_audenc_4.Items.Clear();\r
1661                 drp_audenc_4.Items.Add("AAC");\r
1662                 drp_audenc_4.Items.Add("AC3");\r
1663                 if (drp_audenc_4.Enabled)\r
1664                 {\r
1665                     if ((oldval != "AAC") && (oldval != "AC3"))\r
1666                         drp_audenc_4.SelectedIndex = 0;\r
1667                 }\r
1668             }\r
1669             else if (path.EndsWith(".avi"))\r
1670             {\r
1671                 oldval = drp_audenc_1.Text;\r
1672                 drp_audenc_1.Items.Clear();\r
1673                 drp_audenc_1.Items.Add("MP3");\r
1674                 drp_audenc_1.Items.Add("AC3");\r
1675                 if ((oldval != "MP3") && (oldval != "AC3"))\r
1676                     drp_audenc_1.SelectedIndex = 0;\r
1677 \r
1678                 oldval = drp_audenc_2.Text;\r
1679                 drp_audenc_2.Items.Clear();\r
1680                 drp_audenc_2.Items.Add("MP3");\r
1681                 drp_audenc_2.Items.Add("AC3");\r
1682                 if (drp_audenc_2.Enabled)\r
1683                 {\r
1684                     if ((oldval != "MP3") && (oldval != "AC3"))\r
1685                         drp_audenc_2.SelectedIndex = 0;\r
1686                 }\r
1687 \r
1688 \r
1689                 oldval = drp_audenc_3.Text;\r
1690                 drp_audenc_3.Items.Clear();\r
1691                 drp_audenc_3.Items.Add("MP3");\r
1692                 drp_audenc_3.Items.Add("AC3");\r
1693                 if (drp_audenc_3.Enabled)\r
1694                 {\r
1695                     if ((oldval != "MP3") && (oldval != "AC3"))\r
1696                         drp_audenc_3.SelectedIndex = 0;\r
1697                 }\r
1698 \r
1699                 oldval = drp_audenc_4.Text;\r
1700                 drp_audenc_4.Items.Clear();\r
1701                 drp_audenc_4.Items.Add("MP3");\r
1702                 drp_audenc_4.Items.Add("AC3");\r
1703                 if (drp_audenc_4.Enabled)\r
1704                 {\r
1705                     if ((oldval != "MP3") && (oldval != "AC3"))\r
1706                         drp_audenc_4.SelectedIndex = 0;\r
1707                 }\r
1708             }\r
1709             else if (path.EndsWith(".ogm"))\r
1710             {\r
1711                 drp_audenc_1.Items.Clear();\r
1712                 drp_audenc_1.Items.Add("Vorbis");\r
1713                 drp_audenc_1.SelectedIndex = 0;\r
1714 \r
1715                 drp_audenc_2.Items.Clear();\r
1716                 drp_audenc_2.Items.Add("Vorbis");\r
1717                 if (drp_audenc_2.Enabled)\r
1718                     drp_audenc_2.SelectedIndex = 0;\r
1719 \r
1720                 drp_audenc_3.Items.Clear();\r
1721                 drp_audenc_3.Items.Add("Vorbis");\r
1722                 if (drp_audenc_3.Enabled)\r
1723                     drp_audenc_3.SelectedIndex = 0;\r
1724 \r
1725                 drp_audenc_4.Items.Clear();\r
1726                 drp_audenc_4.Items.Add("Vorbis");\r
1727                 if (drp_audenc_4.Enabled)\r
1728                     drp_audenc_4.SelectedIndex = 0;\r
1729             }\r
1730             else if (path.EndsWith(".mkv"))\r
1731             {\r
1732                 drp_audenc_1.Items.Clear();\r
1733                 drp_audenc_1.Items.Add("AAC");\r
1734                 drp_audenc_1.Items.Add("MP3");\r
1735                 drp_audenc_1.Items.Add("AC3");\r
1736                 drp_audenc_1.Items.Add("Vorbis");\r
1737                 if (drp_audenc_1.Text == string.Empty)\r
1738                     drp_audenc_1.SelectedIndex = 0;\r
1739 \r
1740 \r
1741                 drp_audenc_2.Items.Clear();\r
1742                 drp_audenc_2.Items.Add("AAC");\r
1743                 drp_audenc_2.Items.Add("MP3");\r
1744                 drp_audenc_2.Items.Add("AC3");\r
1745                 drp_audenc_2.Items.Add("Vorbis");\r
1746                 if (drp_audenc_2.Enabled)\r
1747                 {\r
1748                     if (drp_audenc_2.Text == string.Empty)\r
1749                         drp_audenc_2.SelectedIndex = 0;\r
1750                 }\r
1751 \r
1752                 drp_audenc_3.Items.Clear();\r
1753                 drp_audenc_3.Items.Add("AAC");\r
1754                 drp_audenc_3.Items.Add("MP3");\r
1755                 drp_audenc_3.Items.Add("AC3");\r
1756                 drp_audenc_3.Items.Add("Vorbis");\r
1757                 if (drp_audenc_3.Enabled)\r
1758                 {\r
1759                     if (drp_audenc_3.Text == string.Empty)\r
1760                         drp_audenc_3.SelectedIndex = 0;\r
1761                 }\r
1762 \r
1763                 drp_audenc_4.Items.Clear();\r
1764                 drp_audenc_4.Items.Add("AAC");\r
1765                 drp_audenc_4.Items.Add("MP3");\r
1766                 drp_audenc_4.Items.Add("AC3");\r
1767                 drp_audenc_4.Items.Add("Vorbis");\r
1768                 if (drp_audenc_4.Enabled)\r
1769                 {\r
1770                     if (drp_audenc_4.Text == string.Empty)\r
1771                         drp_audenc_4.SelectedIndex = 0;\r
1772                 }\r
1773             }\r
1774         }\r
1775         public void setVideoByContainer(String path)\r
1776         {\r
1777             string oldval = "";\r
1778 \r
1779             if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))\r
1780             {\r
1781                 oldval = drp_videoEncoder.Text;\r
1782                 drp_videoEncoder.Items.Clear();\r
1783                 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");\r
1784                 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");\r
1785                 drp_videoEncoder.Items.Add("H.264 (x264)");\r
1786                 if (oldval == "VP3 (Theora)")\r
1787                     drp_videoEncoder.SelectedIndex = 2;\r
1788                 else\r
1789                     drp_videoEncoder.Text = oldval;\r
1790 \r
1791             }\r
1792             else if (path.EndsWith(".avi"))\r
1793             {\r
1794                 oldval = drp_videoEncoder.Text;\r
1795                 drp_videoEncoder.Items.Clear();\r
1796                 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");\r
1797                 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");\r
1798                 drp_videoEncoder.Items.Add("H.264 (x264)");\r
1799                 if (oldval == "VP3 (Theora)")\r
1800                     drp_videoEncoder.SelectedIndex = 2;\r
1801                 else\r
1802                     drp_videoEncoder.Text = oldval;\r
1803             }\r
1804             else if (path.EndsWith(".ogm"))\r
1805             {\r
1806                 oldval = drp_videoEncoder.Text;\r
1807                 drp_videoEncoder.Items.Clear();\r
1808                 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");\r
1809                 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");\r
1810                 drp_videoEncoder.Items.Add("VP3 (Theora)");\r
1811                 if (oldval == "H.264 (x264)")\r
1812                     drp_videoEncoder.SelectedIndex = 2;\r
1813                 else\r
1814                     drp_videoEncoder.Text = oldval;\r
1815             }\r
1816             else if (path.EndsWith(".mkv"))\r
1817             {\r
1818                 oldval = drp_videoEncoder.Text;\r
1819                 drp_videoEncoder.Items.Clear();\r
1820                 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");\r
1821                 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");\r
1822                 drp_videoEncoder.Items.Add("H.264 (x264)");\r
1823                 drp_videoEncoder.Items.Add("VP3 (Theora)");\r
1824                 drp_videoEncoder.Text = oldval;\r
1825             }\r
1826         }\r
1827         public void setBitrateSelections384(ComboBox dropDown)\r
1828         {\r
1829             dropDown.Items.Clear();\r
1830             dropDown.Items.Add("32");\r
1831             dropDown.Items.Add("40");\r
1832             dropDown.Items.Add("48");\r
1833             dropDown.Items.Add("56");\r
1834             dropDown.Items.Add("64");\r
1835             dropDown.Items.Add("80");\r
1836             dropDown.Items.Add("86");\r
1837             dropDown.Items.Add("112");\r
1838             dropDown.Items.Add("128");\r
1839             dropDown.Items.Add("160");\r
1840             dropDown.Items.Add("192");\r
1841             dropDown.Items.Add("224");\r
1842             dropDown.Items.Add("256");\r
1843             dropDown.Items.Add("320");\r
1844             dropDown.Items.Add("384");\r
1845         }\r
1846         public void setBitrateSelections320(ComboBox dropDown)\r
1847         {\r
1848             dropDown.Items.Clear();\r
1849             dropDown.Items.Add("32");\r
1850             dropDown.Items.Add("40");\r
1851             dropDown.Items.Add("48");\r
1852             dropDown.Items.Add("56");\r
1853             dropDown.Items.Add("64");\r
1854             dropDown.Items.Add("80");\r
1855             dropDown.Items.Add("86");\r
1856             dropDown.Items.Add("112");\r
1857             dropDown.Items.Add("128");\r
1858             dropDown.Items.Add("160");\r
1859             dropDown.Items.Add("192");\r
1860             dropDown.Items.Add("224");\r
1861             dropDown.Items.Add("256");\r
1862             dropDown.Items.Add("320");\r
1863         }\r
1864         public void setBitrateSelections160(ComboBox dropDown)\r
1865         {\r
1866             dropDown.Items.Clear();\r
1867             dropDown.Items.Add("32");\r
1868             dropDown.Items.Add("40");\r
1869             dropDown.Items.Add("48");\r
1870             dropDown.Items.Add("56");\r
1871             dropDown.Items.Add("64");\r
1872             dropDown.Items.Add("80");\r
1873             dropDown.Items.Add("86");\r
1874             dropDown.Items.Add("112");\r
1875             dropDown.Items.Add("128");\r
1876             dropDown.Items.Add("160");\r
1877         }\r
1878         #endregion\r
1879 \r
1880         #region Encoding\r
1881 \r
1882         // Declarations\r
1883         private delegate void UpdateUIHandler();\r
1884 \r
1885         // Encoding Functions\r
1886         private void procMonitor(object state)\r
1887         {\r
1888             // Make sure we are not already encoding and if we are then display an error.\r
1889             if (hbProc != null)\r
1890                 hbProc.CloseMainWindow();\r
1891             else\r
1892             {\r
1893                 hbProc = cliObj.runCli(this, (string)state);\r
1894                 hbProc.WaitForExit();\r
1895                 setEncodeLabelFinished();\r
1896                 hbProc = null;\r
1897 \r
1898                 // If the window is minimized, display the notification in a popup.\r
1899                 if (FormWindowState.Minimized == this.WindowState)\r
1900                 {\r
1901                     notifyIcon.BalloonTipText = lbl_encode.Text;\r
1902                     notifyIcon.ShowBalloonTip(500);\r
1903                 }\r
1904 \r
1905                 // After the encode is done, we may want to shutdown, suspend etc.\r
1906                 cliObj.addCLIQueryToLog((string)state);\r
1907                 cliObj.copyLog((string)state); // Make a copy of the log in the users desired location if necessary\r
1908                 cliObj.afterEncodeAction();\r
1909             }\r
1910         }\r
1911         private void setEncodeLabelFinished()\r
1912         {\r
1913             if (this.InvokeRequired)\r
1914             {\r
1915                 this.BeginInvoke(new UpdateUIHandler(setEncodeLabelFinished));\r
1916                 return;\r
1917             }\r
1918             lbl_encode.Text = "Encoding Finished";\r
1919             btn_start.Text = "Start";\r
1920             btn_start.ToolTipText = "Start the encoding process";\r
1921             btn_start.Image = Properties.Resources.Play;\r
1922         }\r
1923 \r
1924         #endregion\r
1925 \r
1926         #region Public Methods\r
1927 \r
1928         /// <summary>\r
1929         /// Is the mainWindow currently monitoring an encoding session\r
1930         /// </summary>\r
1931         /// <returns>boolean</returns>\r
1932         public Boolean isEncoding()\r
1933         {\r
1934             if (hbProc == null)\r
1935                 return false;\r
1936             else\r
1937                 return true;\r
1938         }\r
1939 \r
1940         /// <summary>\r
1941         /// Action can be "encode" or "scan"\r
1942         /// Set the last action varible in the main window.\r
1943         /// This is used to control which log file is displayed when the Activity window is displayed.\r
1944         /// </summary>\r
1945         /// <param name="last">String</param>\r
1946         public void setLastAction(string last)\r
1947         {\r
1948             this.lastAction = last;\r
1949         }\r
1950 \r
1951         /// <summary>\r
1952         /// DVD parseing. Pass in a parsed DVD.\r
1953         /// </summary>\r
1954         /// <param name="dvd"></param>\r
1955         public void setStreamReader(Parsing.DVD dvd)\r
1956         {\r
1957             this.thisDVD = dvd;\r
1958         }\r
1959 \r
1960         /// <summary>\r
1961         /// Reload the preset panel display\r
1962         /// </summary>\r
1963         public void loadPresetPanel()\r
1964         {\r
1965             presetHandler.loadPresetData();\r
1966 \r
1967             treeView_presets.Nodes.Clear();\r
1968 \r
1969             List<Presets.Preset> presetNameList = new List<Presets.Preset>();\r
1970             List<string> presetNames = new List<string>();\r
1971             TreeNode preset_treeview = new TreeNode();\r
1972 \r
1973             TreeNode rootNode = new TreeNode();\r
1974             TreeNode rootNodeTwo = new TreeNode();\r
1975             TreeNode childNode = new TreeNode();\r
1976             int workingLevel = 0;\r
1977             string previousCategory = String.Empty;\r
1978             string currentCategory = String.Empty;\r
1979 \r
1980             presetNameList = presetHandler.getBuildInPresets();\r
1981             if (presetNameList.Count != 0)\r
1982             {\r
1983                 foreach (Presets.Preset preset in presetNameList)\r
1984                 {\r
1985                     // Handle Root Nodes\r
1986 \r
1987                     // First Case - No presets have been read yet so setup the root category\r
1988                     if (preset.Level == 1 && currentCategory == String.Empty)\r
1989                     {\r
1990                         rootNode = new TreeNode(preset.Category);\r
1991                         workingLevel = preset.Level;\r
1992                         currentCategory = preset.Category;\r
1993                         previousCategory = preset.Category;\r
1994                     }\r
1995 \r
1996                     // Second Case - This is the first sub child node.\r
1997                     if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)\r
1998                     {\r
1999                         rootNodeTwo = new TreeNode(preset.Category);\r
2000                         workingLevel = preset.Level;\r
2001                         currentCategory = preset.Category;\r
2002                         rootNode.Nodes.Add(rootNodeTwo);\r
2003                     }\r
2004 \r
2005                     // Third Case - Any presets the sub presets detected in the above if statment.\r
2006                     if (preset.Level == 1 && workingLevel == 2 && previousCategory == preset.Category)\r
2007                     {\r
2008                         workingLevel = preset.Level;\r
2009                         currentCategory = preset.Category;\r
2010                     }\r
2011 \r
2012                     // Fourth Case - We've finished this root node and are onto the next root node.\r
2013                     if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)\r
2014                     {\r
2015                         treeView_presets.Nodes.Add(rootNode); // Add the finished node\r
2016 \r
2017                         rootNode = new TreeNode(preset.Category);\r
2018                         workingLevel = preset.Level;\r
2019                         currentCategory = preset.Category;\r
2020                         previousCategory = preset.Category;\r
2021                     }\r
2022 \r
2023                     // Handle Child Nodes\r
2024                     // Add First level child nodes to the current root node\r
2025                     if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)\r
2026                     {\r
2027                         childNode = new TreeNode(preset.Name);\r
2028                         rootNode.Nodes.Add(childNode);\r
2029                     }\r
2030 \r
2031                     // Add Second level child nodes to the current sub root node\r
2032                     if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)\r
2033                     {\r
2034                         childNode = new TreeNode(preset.Name);\r
2035                         rootNodeTwo.Nodes.Add(childNode);\r
2036                     }\r
2037                 }\r
2038 \r
2039                 // Add the final root node which does not get added above.\r
2040                 treeView_presets.Nodes.Add(rootNode);\r
2041             }\r
2042 \r
2043 \r
2044             // User Presets\r
2045             presetNames = presetHandler.getUserPresetNames();\r
2046             foreach (string preset in presetNames)\r
2047             {\r
2048                 preset_treeview = new TreeNode(preset);\r
2049                 preset_treeview.ForeColor = Color.Black;\r
2050 \r
2051                 // Now Fill Out List View with Items\r
2052                 treeView_presets.Nodes.Add(preset_treeview);\r
2053             }\r
2054         }\r
2055 \r
2056         #endregion\r
2057 \r
2058         #region Taskbar Tray Icon\r
2059         private void frmMain_Resize(object sender, EventArgs e)\r
2060         {\r
2061             if (FormWindowState.Minimized == this.WindowState)\r
2062             {\r
2063                 notifyIcon.Visible = true;\r
2064                 if (lbl_encode.Text != "")\r
2065                     notifyIcon.BalloonTipText = lbl_encode.Text;\r
2066                 else\r
2067                     notifyIcon.BalloonTipText = "Not Encoding";\r
2068                 notifyIcon.ShowBalloonTip(500);\r
2069                 this.Hide();\r
2070             }\r
2071             else if (FormWindowState.Normal == this.WindowState)\r
2072                 notifyIcon.Visible = false;\r
2073         }\r
2074         private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)\r
2075         {\r
2076             this.Visible = true;\r
2077             this.Activate();\r
2078             this.WindowState = FormWindowState.Normal;\r
2079             notifyIcon.Visible = false;\r
2080         }\r
2081         private void btn_minimize_Click(object sender, EventArgs e)\r
2082         {\r
2083             this.WindowState = FormWindowState.Minimized;\r
2084         }\r
2085         private void btn_restore_Click(object sender, EventArgs e)\r
2086         {\r
2087             this.Visible = true;\r
2088             this.Activate();\r
2089             this.WindowState = FormWindowState.Normal;\r
2090             notifyIcon.Visible = false;\r
2091         }\r
2092         #endregion\r
2093 \r
2094         // This is the END of the road ------------------------------------------------------------------------------\r
2095     }\r
2096 }