OSDN Git Service

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