OSDN Git Service

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