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