OSDN Git Service

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