OSDN Git Service

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