OSDN Git Service

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