OSDN Git Service

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