OSDN Git Service

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