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
8 using System.Collections;
\r
9 using System.Collections.Generic;
\r
10 using System.Drawing;
\r
11 using System.Windows.Forms;
\r
13 using System.Diagnostics;
\r
14 using System.Threading;
\r
15 using Handbrake.Functions;
\r
19 public partial class frmMain : Form
\r
21 // Objects which may be used by one or more other objects
\r
22 private delegate void UpdateWindowHandler();
\r
23 Functions.Main hb_common_func = new Functions.Main();
\r
24 Functions.Encode encodeHandler = new Functions.Encode();
\r
25 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
26 Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();
\r
27 Parsing.Title selectedTitle;
\r
28 Parsing.DVD thisDVD;
\r
30 // Objects belonging to this window only
\r
31 PresetLoader presetLoader = new PresetLoader();
\r
32 x264Panel x264PanelFunctions = new x264Panel();
\r
33 QueryGenerator queryGen = new QueryGenerator();
\r
35 // Globals: Mainly used for tracking.
\r
36 private frmQueue queueWindow;
\r
37 private frmGenPreview vlcpreview;
\r
38 private frmPreview qtpreview;
\r
39 private string lastAction;
\r
40 public int maxWidth;
\r
41 public int maxHeight;
\r
46 // Applicaiton Startup ************************************************
\r
48 #region Application Startup
\r
52 // Load the splash screen in this thread
\r
53 Form splash = new frmSplashScreen();
\r
56 //Create a label that can be updated from the parent thread.
\r
57 Label lblStatus = new Label();
\r
58 lblStatus.Size = new Size(250, 20);
\r
59 lblStatus.Location = new Point(10, 280);
\r
60 splash.Controls.Add(lblStatus);
\r
61 InitializeComponent();
\r
63 // Update the users config file with the CLI version data.
\r
64 lblStatus.Text = "Setting Version Data ...";
\r
65 Application.DoEvents();
\r
66 ArrayList x = hb_common_func.getCliVersionData();
\r
67 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
68 Properties.Settings.Default.hb_version = x[0].ToString();
\r
70 // show the form, but leave disabled until preloading is complete then show the main form
\r
71 this.Enabled = false;
\r
73 Application.DoEvents(); // Forces frmMain to draw
\r
75 // update the status
\r
76 if (Properties.Settings.Default.updateStatus == "Checked")
\r
78 lblStatus.Text = "Checking for updates ...";
\r
79 Application.DoEvents();
\r
80 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
81 updateCheckThread.Start();
\r
84 // Setup the GUI components
\r
85 lblStatus.Text = "Setting up the GUI ...";
\r
86 Application.DoEvents();
\r
87 x264PanelFunctions.reset2Defaults(this); // Initialize all the x264 widgets to their default values
\r
88 loadPresetPanel(); // Load the Preset Panel
\r
89 treeView_presets.ExpandAll();
\r
90 lbl_encode.Text = "";
\r
91 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
92 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
93 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
95 // Load the user's default settings or Normal Preset
\r
96 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
98 // Ok, so, we've selected a preset. Now we want to load it.
\r
99 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
101 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
102 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
106 //Ok, Reset all the H264 widgets before changing the preset
\r
107 x264PanelFunctions.reset2Defaults(this);
\r
109 // Send the query from the file to the Query Parser class, then load the preset
\r
110 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
111 presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
113 // The x264 widgets will need updated, so do this now:
\r
114 x264PanelFunctions.X264_StandardizeOptString(this);
\r
115 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
119 loadNormalPreset();
\r
122 loadNormalPreset();
\r
124 // Enabled GUI tooltip's if Required
\r
125 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
126 ToolTip.Active = true;
\r
129 lblStatus.Text = "Loading Complete!";
\r
130 Application.DoEvents();
\r
133 this.Enabled = true;
\r
142 // Startup Functions
\r
143 private delegate void updateStatusChanger();
\r
144 private void startupUpdateCheck()
\r
148 if (InvokeRequired)
\r
150 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
154 Boolean update = hb_common_func.updateCheck(false);
\r
157 frmUpdater updateWindow = new frmUpdater();
\r
158 updateWindow.Show();
\r
161 catch (Exception) { /* Do Nothing*/ }
\r
163 private void queueRecovery()
\r
165 if (hb_common_func.check_queue_recovery())
\r
167 DialogResult result = MessageBox.Show("HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
169 if (result == DialogResult.Yes)
\r
170 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
173 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
174 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
175 if (File.Exists(queuePath))
\r
176 File.Delete(queuePath);
\r
183 // Encoding Events for setting up the GUI
\r
184 private void events()
\r
186 // Handle Window Resize
\r
187 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
188 this.Resize += new EventHandler(frmMain_Resize);
\r
190 // Handle Encode Start
\r
191 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
192 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
193 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
195 private void encodeStarted(object sender, EventArgs e)
\r
197 setLastAction("encode");
\r
198 setEncodeStarted();
\r
200 private void encodeEnded(object sender, EventArgs e)
\r
202 setEncodeFinished();
\r
204 private void encodePaused(object sender, EventArgs e)
\r
206 setEncodeFinished();
\r
210 // User Interface Menus / Tool Strips *********************************
\r
213 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
217 private void mnu_exit_Click(object sender, EventArgs e)
\r
219 Application.Exit();
\r
224 private void mnu_encode_Click(object sender, EventArgs e)
\r
226 queueWindow.setQueue();
\r
227 queueWindow.Show();
\r
229 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
232 if (lastAction == "scan")
\r
233 file = "dvdinfo.dat";
\r
235 file = "hb_encode_log.dat";
\r
237 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
238 dvdInfoWindow.Show();
\r
240 private void mnu_options_Click(object sender, EventArgs e)
\r
242 Form Options = new frmOptions();
\r
243 Options.ShowDialog();
\r
247 #region Presets Menu
\r
248 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
250 presetHandler.updateBuiltInPresets();
\r
252 if (treeView_presets.Nodes.Count == 0)
\r
253 MessageBox.Show("Unable to load the presets.xml file. Please select \"Update Built-in Presets\" from the Presets Menu \nMake sure you are running the program in Admin mode if running on Vista. See Windows FAQ for details!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
255 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
257 treeView_presets.ExpandAll();
\r
259 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
261 // Empty the preset file
\r
262 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
263 if (File.Exists(presetsFile))
\r
264 File.Delete(presetsFile);
\r
268 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
272 catch (Exception exc)
\r
274 MessageBox.Show("An error has occured during the preset removal process.\n If you are using Windows Vista, you may need to run under Administrator Mode to complete this task. \n" + exc);
\r
277 // Reload the preset panel
\r
280 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
282 loadNormalPreset();
\r
284 private void btn_new_preset_Click(object sender, EventArgs e)
\r
286 // Remember each nodes expanded status so we can reload it
\r
287 List<Boolean> nodeStatus = saveTreeViewState();
\r
288 nodeStatus.Add(true);
\r
290 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
291 preset.ShowDialog();
\r
293 // Now reload the TreeView states
\r
294 loadTreeViewStates(nodeStatus);
\r
299 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
301 Process.Start("http://forum.handbrake.fr/");
\r
303 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
305 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
307 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
309 Process.Start("http://handbrake.fr");
\r
311 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
313 Boolean update = hb_common_func.updateCheck(true);
\r
314 if (update == true)
\r
316 frmUpdater updateWindow = new frmUpdater();
\r
317 updateWindow.Show();
\r
320 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
322 private void mnu_about_Click(object sender, EventArgs e)
\r
324 Form About = new frmAbout();
\r
325 About.ShowDialog();
\r
330 // Right Click Menu Code
\r
331 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
333 treeView_presets.ExpandAll();
\r
335 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
337 treeView_presets.CollapseAll();
\r
339 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
341 DialogResult result = MessageBox.Show("Do you wish to include picture settings when updating the preset: " + treeView_presets.SelectedNode.Text, "Update Preset", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
\r
342 if (result == DialogResult.Yes)
\r
343 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
344 else if (result == DialogResult.No)
\r
345 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
347 private void pmnu_delete_click(object sender, EventArgs e)
\r
349 if (treeView_presets.SelectedNode != null)
\r
351 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
353 // Remember each nodes expanded status so we can reload it
\r
354 List<Boolean> nodeStatus = saveTreeViewState();
\r
356 // Now reload the preset panel
\r
359 // Now reload the TreeView states
\r
360 loadTreeViewStates(nodeStatus);
\r
362 treeView_presets.Select();
\r
364 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
366 // Make sure that the save menu is always disabled by default
\r
367 pmnu_saveChanges.Enabled = false;
\r
369 // Now enable the save menu if the selected preset is a user preset
\r
370 if (treeView_presets.SelectedNode != null)
\r
372 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
374 pmnu_saveChanges.Enabled = true;
\r
377 treeView_presets.Select();
\r
380 // Presets Management
\r
381 private void btn_addPreset_Click(object sender, EventArgs e)
\r
383 // Remember each nodes expanded status so we can reload it
\r
384 List<Boolean> nodeStatus = saveTreeViewState();
\r
385 nodeStatus.Add(true);
\r
387 // Now add the new preset
\r
388 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
389 preset.ShowDialog();
\r
391 // Now reload the TreeView states
\r
392 loadTreeViewStates(nodeStatus);
\r
394 private void btn_removePreset_Click(object sender, EventArgs e)
\r
396 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
397 if (result == DialogResult.Yes)
\r
399 if (treeView_presets.SelectedNode != null)
\r
400 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
402 // Remember each nodes expanded status so we can reload it
\r
403 List<Boolean> nodeStatus = saveTreeViewState();
\r
405 // Now reload the preset panel
\r
408 // Now reload the TreeView states
\r
409 loadTreeViewStates(nodeStatus);
\r
411 treeView_presets.Select();
\r
413 private void btn_setDefault_Click(object sender, EventArgs e)
\r
415 if (treeView_presets.SelectedNode != null)
\r
417 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
418 Properties.Settings.Default.Save();
\r
419 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
422 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
424 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
426 if (e.Button == MouseButtons.Right)
\r
427 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
428 else if (e.Button == MouseButtons.Left)
\r
430 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
432 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
437 treeView_presets.Select();
\r
439 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
443 private void selectPreset()
\r
445 if (treeView_presets.SelectedNode != null)
\r
447 // Ok, so, we've selected a preset. Now we want to load it.
\r
448 string presetName = treeView_presets.SelectedNode.Text;
\r
449 if (presetHandler.getPreset(presetName) != null)
\r
451 string query = presetHandler.getPreset(presetName).Query;
\r
452 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
456 //Ok, Reset all the H264 widgets before changing the preset
\r
457 x264PanelFunctions.reset2Defaults(this);
\r
459 // Send the query from the file to the Query Parser class
\r
460 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
462 // Now load the preset
\r
463 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
465 // The x264 widgets will need updated, so do this now:
\r
466 x264PanelFunctions.X264_StandardizeOptString(this);
\r
467 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
472 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
474 if (e.KeyCode == Keys.Delete)
\r
476 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
477 if (result == DialogResult.Yes)
\r
479 if (treeView_presets.SelectedNode != null)
\r
480 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
482 // Remember each nodes expanded status so we can reload it
\r
483 List<Boolean> nodeStatus = new List<Boolean>();
\r
484 foreach (TreeNode node in treeView_presets.Nodes)
\r
485 nodeStatus.Add(node.IsExpanded);
\r
487 // Now reload the preset panel
\r
490 // And finally, re-expand any of the nodes if required
\r
492 foreach (TreeNode node in treeView_presets.Nodes)
\r
502 private List<Boolean> saveTreeViewState()
\r
504 // Remember each nodes expanded status so we can reload it
\r
505 List<Boolean> nodeStatus = new List<Boolean>();
\r
506 foreach (TreeNode node in treeView_presets.Nodes)
\r
508 nodeStatus.Add(node.IsExpanded);
\r
509 foreach (TreeNode subNode in node.Nodes)
\r
510 nodeStatus.Add(node.IsExpanded);
\r
514 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
516 // And finally, re-expand any of the nodes if required
\r
518 foreach (TreeNode node in treeView_presets.Nodes)
\r
523 foreach (TreeNode subNode in node.Nodes)
\r
532 private void loadNormalPreset()
\r
534 treeView_presets.Nodes.Find("Normal", true);
\r
536 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
538 foreach (TreeNode node in treenode.Nodes)
\r
540 if (node.Text.Equals("Normal"))
\r
541 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
548 private void btn_source_Click(object sender, EventArgs e)
\r
550 if (Properties.Settings.Default.drive_detection == "Checked")
\r
552 mnu_dvd_drive.Visible = true;
\r
553 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
554 driveInfoThread.Start();
\r
557 mnu_dvd_drive.Visible = false;
\r
559 private void btn_start_Click(object sender, EventArgs e)
\r
561 if (btn_start.Text == "Stop")
\r
563 DialogResult result = MessageBox.Show("Are you sure you wish to cancel the encode? Please note that this may break the encoded file. \nTo safely cancel your encode, press ctrl-c on your keyboard in the CLI window. This *may* allow you to preview your encoded content.", "Cancel Encode?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
565 if (result == DialogResult.Yes)
\r
568 encodeQueue.pauseEncode();
\r
570 // Kill the current process.
\r
571 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
572 Process HandBrakeCLI;
\r
573 if (aProc.Length > 0)
\r
575 HandBrakeCLI = aProc[0];
\r
576 HandBrakeCLI.Kill();
\r
580 setEncodeFinished();
\r
585 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
587 // Set the last action to encode.
\r
588 // This is used for tracking which file to load in the activity window
\r
589 lastAction = "encode";
\r
591 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
593 if (encodeQueue.count() == 0)
\r
595 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
596 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
598 queueWindow.setQueue();
\r
599 if (encodeQueue.count() > 1)
\r
600 queueWindow.Show();
\r
602 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
603 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
606 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
607 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
611 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
613 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
614 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
617 String query = queryGen.GenerateTheQuery(this);
\r
618 if (rtf_query.Text != "")
\r
619 query = rtf_query.Text;
\r
621 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
622 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
624 queueWindow.setQueue();
\r
625 queueWindow.Show();
\r
628 private void btn_showQueue_Click(object sender, EventArgs e)
\r
630 queueWindow.setQueue();
\r
631 queueWindow.Show();
\r
633 private void mnu_vlcpreview_Click(object sender, EventArgs e)
\r
635 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
636 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
639 if (vlcpreview == null)
\r
641 vlcpreview = new frmGenPreview(this);
\r
644 else if (vlcpreview.IsDisposed)
\r
646 vlcpreview = new frmGenPreview(this);
\r
650 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
653 private void mnu_qtpreview_Click(object sender, EventArgs e)
\r
655 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
656 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
659 if (qtpreview == null)
\r
661 qtpreview = new frmPreview(this);
\r
664 else if (qtpreview.IsDisposed)
\r
666 qtpreview = new frmPreview(this);
\r
670 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
673 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
675 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
677 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
678 ActivityWindow.Show();
\r
682 #region System Tray Icon
\r
683 private void frmMain_Resize(object sender, EventArgs e)
\r
685 if (FormWindowState.Minimized == this.WindowState)
\r
687 notifyIcon.Visible = true;
\r
688 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
689 notifyIcon.ShowBalloonTip(500);
\r
692 else if (FormWindowState.Normal == this.WindowState)
\r
693 notifyIcon.Visible = false;
\r
695 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
697 this.Visible = true;
\r
699 this.WindowState = FormWindowState.Normal;
\r
700 notifyIcon.Visible = false;
\r
702 private void btn_restore_Click(object sender, EventArgs e)
\r
704 this.Visible = true;
\r
706 this.WindowState = FormWindowState.Normal;
\r
707 notifyIcon.Visible = false;
\r
711 #region Tab Control
\r
714 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
716 // Enable the creation of chapter markers.
\r
717 Check_ChapterMarkers.Enabled = true;
\r
719 // Set the last action to scan.
\r
720 // This is used for tracking which file to load in the activity window
\r
721 lastAction = "scan";
\r
724 text_source.Text = "";
\r
726 DVD_Open.ShowDialog();
\r
727 filename = DVD_Open.SelectedPath;
\r
729 if (filename.StartsWith("\\"))
\r
730 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
733 if (filename != "")
\r
735 setupGUIforScan(filename);
\r
736 startScan(filename);
\r
739 text_source.Text = "Click 'Source' to continue";
\r
742 private void btn_file_source_Click(object sender, EventArgs e)
\r
744 // Set the last action to scan.
\r
745 // This is used for tracking which file to load in the activity window
\r
746 lastAction = "scan";
\r
749 text_source.Text = "";
\r
751 ISO_Open.ShowDialog();
\r
752 filename = ISO_Open.FileName;
\r
754 if (filename.StartsWith("\\"))
\r
755 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
758 if (filename != "")
\r
760 setupGUIforScan(filename);
\r
761 startScan(filename);
\r
764 text_source.Text = "Click 'Source' to continue";
\r
767 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
769 // Enable the creation of chapter markers.
\r
770 Check_ChapterMarkers.Enabled = true;
\r
772 // Set the last action to scan.
\r
773 // This is used for tracking which file to load in the activity window
\r
774 lastAction = "scan";
\r
776 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
778 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
779 String filename = path[0];
\r
780 setupGUIforScan(filename);
\r
781 startScan(filename);
\r
784 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
785 if (drp_dvdtitle.Items.Count == 0)
\r
786 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source.\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
788 lbl_encode.Text = "";
\r
790 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
792 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
793 MessageBox.Show("There are no titles to select. Please load a source file by clicking the 'Source' button above before trying to select a title.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
\r
795 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
797 // Reset some values on the form
\r
798 lbl_Aspect.Text = "Select a Title";
\r
799 //lbl_RecomendedCrop.Text = "Select a Title";
\r
800 drop_chapterStart.Items.Clear();
\r
801 drop_chapterFinish.Items.Clear();
\r
803 // If the dropdown is set to automatic nothing else needs to be done.
\r
804 // Otheriwse if its not, title data has to be loased from parsing.
\r
805 if (drp_dvdtitle.Text != "Automatic")
\r
807 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
809 // Set the Aspect Ratio
\r
810 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
811 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
812 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
814 // Set the Recommended Cropping values
\r
815 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
816 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
817 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
818 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
820 // Populate the Start chapter Dropdown
\r
821 drop_chapterStart.Items.Clear();
\r
822 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
823 if (drop_chapterStart.Items.Count > 0)
\r
824 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
826 // Populate the Final Chapter Dropdown
\r
827 drop_chapterFinish.Items.Clear();
\r
828 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
829 if (drop_chapterFinish.Items.Count > 0)
\r
830 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
832 // Populate the Audio Channels Dropdown
\r
833 drp_track1Audio.Items.Clear();
\r
834 drp_track1Audio.Items.Add("Automatic");
\r
835 drp_track1Audio.Items.Add("None");
\r
836 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
837 drp_track1Audio.SelectedIndex = 0;
\r
839 // Populate the Subtitles dropdown
\r
840 drp_subtitle.Items.Clear();
\r
841 drp_subtitle.Items.Add("None");
\r
842 drp_subtitle.Items.Add("Autoselect");
\r
843 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
844 if (drp_subtitle.Items.Count > 0)
\r
845 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
849 // Run the autoName & chapterNaming functions
\r
850 if (Properties.Settings.Default.autoNaming == "Checked")
\r
851 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
853 data_chpt.Rows.Clear();
\r
854 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
855 if (chapterGridView != null)
\r
856 data_chpt = chapterGridView;
\r
858 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
859 data_chpt.Columns[0].Width = 166;
\r
860 data_chpt.Columns[0].Width = 165;
\r
862 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
864 int c_start, c_end;
\r
866 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
867 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
869 int.TryParse(drop_chapterStart.Text, out c_start);
\r
870 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
874 if (c_start > c_end)
\r
875 drop_chapterFinish.Text = c_start.ToString();
\r
878 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
880 // Run the Autonaming function
\r
881 if (Properties.Settings.Default.autoNaming == "Checked")
\r
882 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
885 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
887 int c_start, c_end;
\r
889 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
890 drop_chapterStart.SelectedIndex = 1;
\r
892 int.TryParse(drop_chapterStart.Text, out c_start);
\r
893 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
897 if (c_end < c_start)
\r
898 drop_chapterFinish.Text = c_start.ToString();
\r
901 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\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
907 // Add more rows to the Chapter menu if needed.
\r
908 if (Check_ChapterMarkers.Checked)
\r
910 int i = data_chpt.Rows.Count, finish = 0;
\r
912 if (drop_chapterFinish.Text != "Auto")
\r
913 int.TryParse(drop_chapterFinish.Text, out finish);
\r
917 int n = data_chpt.Rows.Add();
\r
918 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
919 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
920 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
921 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
928 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
930 // This removes the file extension from the filename box on the save file dialog.
\r
931 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
932 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");
\r
934 // Show the dialog and set the main form file path
\r
935 if (drop_format.SelectedIndex.Equals(0))
\r
936 DVD_Save.FilterIndex = 1;
\r
937 else if (drop_format.SelectedIndex.Equals(1))
\r
938 DVD_Save.FilterIndex = 2;
\r
939 else if (drop_format.SelectedIndex.Equals(2))
\r
940 DVD_Save.FilterIndex = 3;
\r
941 else if (drop_format.SelectedIndex.Equals(3))
\r
942 DVD_Save.FilterIndex = 4;
\r
943 else if (drop_format.SelectedIndex.Equals(4))
\r
944 DVD_Save.FilterIndex = 5;
\r
946 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
948 if (DVD_Save.FileName.StartsWith("\\"))
\r
949 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
952 setAudioByContainer(DVD_Save.FileName);
\r
953 text_destination.Text = DVD_Save.FileName;
\r
955 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
956 if (Check_ChapterMarkers.Checked)
\r
957 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
961 private void text_destination_TextChanged(object sender, EventArgs e)
\r
963 setAudioByContainer(text_destination.Text);
\r
964 setVideoByContainer(text_destination.Text);
\r
965 string path = text_destination.Text;
\r
966 if (path.EndsWith(".mp4"))
\r
967 drop_format.SelectedIndex = 0;
\r
968 else if (path.EndsWith(".m4v"))
\r
969 drop_format.SelectedIndex = 1;
\r
970 else if (path.EndsWith(".mkv"))
\r
971 drop_format.SelectedIndex = 2;
\r
972 else if (path.EndsWith(".avi"))
\r
973 drop_format.SelectedIndex = 3;
\r
974 else if (path.EndsWith(".ogm"))
\r
975 drop_format.SelectedIndex = 4;
\r
980 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
982 if (drop_format.SelectedIndex == 0)
\r
983 setExtension(".mp4");
\r
984 else if (drop_format.SelectedIndex == 1)
\r
985 setExtension(".m4v");
\r
986 else if (drop_format.SelectedIndex == 2)
\r
987 setExtension(".mkv");
\r
988 else if (drop_format.SelectedIndex == 3)
\r
989 setExtension(".avi");
\r
990 else if (drop_format.SelectedIndex == 4)
\r
991 setExtension(".ogm");
\r
993 private void setExtension(string newExtension)
\r
995 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
996 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
997 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
998 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
999 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
1003 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1005 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1007 check_largeFile.Enabled = true;
\r
1008 check_optimiseMP4.Enabled = true;
\r
1009 check_iPodAtom.Enabled = true;
\r
1013 check_largeFile.Enabled = false;
\r
1014 check_optimiseMP4.Enabled = false;
\r
1015 check_iPodAtom.Enabled = false;
\r
1016 check_largeFile.Checked = false;
\r
1017 check_optimiseMP4.Checked = false;
\r
1018 check_iPodAtom.Checked = false;
\r
1021 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1022 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1024 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1025 check_turbo.Enabled = true;
\r
1027 h264Tab.Enabled = true;
\r
1028 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1029 check_iPodAtom.Enabled = true;
\r
1031 check_iPodAtom.Enabled = false;
\r
1035 check_turbo.CheckState = CheckState.Unchecked;
\r
1036 check_turbo.Enabled = false;
\r
1037 h264Tab.Enabled = false;
\r
1038 rtf_x264Query.Text = "";
\r
1039 check_iPodAtom.Enabled = false;
\r
1040 check_iPodAtom.Checked = false;
\r
1044 private void text_bitrate_TextChanged(object sender, EventArgs e)
\r
1046 text_filesize.Text = "";
\r
1047 slider_videoQuality.Value = 0;
\r
1048 SliderValue.Text = "0%";
\r
1049 check_2PassEncode.Enabled = true;
\r
1051 private void text_filesize_TextChanged(object sender, EventArgs e)
\r
1053 text_bitrate.Text = "";
\r
1054 slider_videoQuality.Value = 0;
\r
1055 SliderValue.Text = "0%";
\r
1056 check_2PassEncode.Enabled = true;
\r
1058 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1060 SliderValue.Text = slider_videoQuality.Value + "%";
\r
1061 text_bitrate.Text = "";
\r
1062 text_filesize.Text = "";
\r
1063 check_2PassEncode.Enabled = false;
\r
1064 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1066 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1068 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1070 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1071 check_turbo.Enabled = true;
\r
1075 check_turbo.Enabled = false;
\r
1076 check_turbo.CheckState = CheckState.Unchecked;
\r
1081 private void text_width_TextChanged(object sender, EventArgs e)
\r
1083 if (text_width.Text == "")
\r
1084 text_width.BackColor = Color.White;
\r
1086 maxWidth = 0; maxHeight = 0; // Reset max width so that it's not using the MaxWidth -X. Quick hack to allow -X for preset usage.
\r
1089 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1092 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1094 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1096 if (drp_anamorphic.Text == "None")
\r
1098 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1100 text_height.Text = height.ToString();
\r
1105 private void text_height_TextChanged(object sender, EventArgs e)
\r
1107 if (text_height.Text == "")
\r
1108 text_height.BackColor = Color.White;
\r
1110 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1113 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1115 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1117 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1119 text_left.Enabled = true;
\r
1120 text_right.Enabled = true;
\r
1121 text_top.Enabled = true;
\r
1122 text_bottom.Enabled = true;
\r
1123 if (selectedTitle != null)
\r
1125 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1126 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1127 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1128 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1132 text_left.Text = "0";
\r
1133 text_right.Text = "0";
\r
1134 text_top.Text = "0";
\r
1135 text_bottom.Text = "0";
\r
1138 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1140 text_left.Enabled = false;
\r
1141 text_right.Enabled = false;
\r
1142 text_top.Enabled = false;
\r
1143 text_bottom.Enabled = false;
\r
1145 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1147 if (drp_anamorphic.SelectedIndex == 1)
\r
1149 text_height.BackColor = Color.LightGray;
\r
1150 text_width.BackColor = Color.LightGray;
\r
1151 text_height.Text = "";
\r
1152 text_width.Text = "";
\r
1153 text_height.Enabled = false;
\r
1154 text_width.Enabled = false;
\r
1157 if (drp_anamorphic.SelectedIndex == 2)
\r
1159 text_height.Text = "";
\r
1160 text_height.Enabled = false;
\r
1161 text_height.BackColor = Color.LightGray;
\r
1163 text_width.Enabled = true;
\r
1164 text_width.BackColor = Color.White;
\r
1167 if (drp_anamorphic.SelectedIndex == 0)
\r
1169 text_height.BackColor = Color.White;
\r
1170 text_width.BackColor = Color.White;
\r
1171 text_height.Enabled = true;
\r
1172 text_width.Enabled = true;
\r
1175 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1177 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1181 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1183 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1185 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1186 lv_audioList.Select();
\r
1189 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1191 if (drp_audenc_1.Text == "AC3")
\r
1193 drp_audmix_1.Enabled = false;
\r
1194 drp_audbit_1.Enabled = false;
\r
1195 drp_audsr_1.Enabled = false;
\r
1197 drp_audmix_1.SelectedIndex = 0;
\r
1198 drp_audbit_1.SelectedIndex = 0;
\r
1199 drp_audsr_1.SelectedIndex = 0;
\r
1203 drp_audmix_1.Enabled = true;
\r
1204 drp_audbit_1.Enabled = true;
\r
1205 drp_audsr_1.Enabled = true;
\r
1207 drp_audmix_1.Text = "Automatic";
\r
1208 drp_audbit_1.Text = "160";
\r
1209 drp_audsr_1.Text = "Auto";
\r
1212 if (drp_audenc_1.Text == "AAC")
\r
1214 setMixDownAllOptions(drp_audmix_1);
\r
1215 setBitrateSelections160(drp_audbit_1);
\r
1219 setMixDownNotAAC(drp_audmix_1);
\r
1220 setBitrateSelections320(drp_audbit_1);
\r
1223 // Update an item in the Audio list if required.
\r
1224 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1226 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1227 lv_audioList.Select();
\r
1230 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1232 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1233 setBitrateSelections384(drp_audbit_1);
\r
1234 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1235 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1237 // Update an item in the Audio list if required.
\r
1238 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1240 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1241 lv_audioList.Select();
\r
1244 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1246 // Update an item in the Audio list if required.
\r
1247 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1249 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1250 lv_audioList.Select();
\r
1253 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1255 // Update an item in the Audio list if required.
\r
1256 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1258 if (drp_audenc_1.Text == "AC3")
\r
1259 drp_audbit_1.Text = "Auto";
\r
1260 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1261 lv_audioList.Select();
\r
1264 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1266 double value = (tb_drc.Value / 10.0) + 1;
\r
1267 lbl_drc.Text = value.ToString();
\r
1269 // Update an item in the Audio list if required.
\r
1270 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1272 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1273 lv_audioList.Select();
\r
1277 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1279 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1280 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1281 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1282 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1283 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1284 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1285 newTrack.SubItems.Add(lbl_drc.Text);
\r
1287 // Select the newly added track and select the control
\r
1288 lv_audioList.Items.Add(newTrack);
\r
1289 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1290 lv_audioList.Select();
\r
1292 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1294 removeAudioTrack();
\r
1296 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1298 if (lv_audioList.SelectedIndices.Count != 0)
\r
1300 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1301 int index = item.Index;
\r
1304 if (lv_audioList.Items.Count > index && index >= 0)
\r
1306 lv_audioList.Items.Remove(item);
\r
1307 lv_audioList.Items.Insert(index, item);
\r
1308 item.Selected = true;
\r
1309 lv_audioList.Focus();
\r
1313 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1315 if (lv_audioList.SelectedIndices.Count != 0)
\r
1317 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1318 int index = item.Index;
\r
1321 if (index < lv_audioList.Items.Count)
\r
1323 lv_audioList.Items.Remove(item);
\r
1324 lv_audioList.Items.Insert(index, item);
\r
1325 item.Selected = true;
\r
1326 lv_audioList.Focus();
\r
1332 private void audioList_remove_Click(object sender, EventArgs e)
\r
1334 removeAudioTrack();
\r
1336 private void removeAudioTrack()
\r
1338 // Remove the Item and reselect the control if the following conditions are met.
\r
1339 if (lv_audioList.SelectedItems.Count != 0)
\r
1341 // Record the current selected index.
\r
1342 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1344 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1346 // Now reslect the correct item and give focus to the audio list.
\r
1347 if (lv_audioList.Items.Count != 0)
\r
1349 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1350 lv_audioList.Items[currentPosition].Selected = true;
\r
1351 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1352 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1354 lv_audioList.Select();
\r
1359 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1361 // Set the dropdown controls based on the selected item in the Audio List.
\r
1362 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1364 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1365 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1366 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1367 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1368 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1369 double drcValue; int drcCalculated;
\r
1370 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1371 drcValue = (drcValue * 10) - 10;
\r
1372 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1373 tb_drc.Value = drcCalculated;
\r
1377 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1379 if (drp_subtitle.Text.Contains("None"))
\r
1381 check_forced.Enabled = false;
\r
1382 check_forced.Checked = false;
\r
1385 check_forced.Enabled = true;
\r
1388 // Chapter Marker Tab
\r
1389 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1391 if (Check_ChapterMarkers.Checked)
\r
1393 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1394 data_chpt.Rows.Clear();
\r
1395 data_chpt.Enabled = true;
\r
1396 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1397 if (chapterGridView != null)
\r
1398 data_chpt = chapterGridView;
\r
1402 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1403 data_chpt.Rows.Clear();
\r
1404 data_chpt.Enabled = false;
\r
1409 private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1411 x264PanelFunctions.on_x264_WidgetChange("ref", this);
\r
1413 private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)
\r
1415 x264PanelFunctions.on_x264_WidgetChange("mixed-refs", this);
\r
1417 private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1419 x264PanelFunctions.on_x264_WidgetChange("bframes", this);
\r
1421 private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)
\r
1423 x264PanelFunctions.on_x264_WidgetChange("direct", this);
\r
1425 private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)
\r
1427 x264PanelFunctions.on_x264_WidgetChange("weightb", this);
\r
1429 private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)
\r
1431 x264PanelFunctions.on_x264_WidgetChange("b-pyramid", this);
\r
1433 private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)
\r
1435 x264PanelFunctions.on_x264_WidgetChange("me", this);
\r
1437 private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)
\r
1439 x264PanelFunctions.on_x264_WidgetChange("merange", this);
\r
1441 private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)
\r
1443 x264PanelFunctions.on_x264_WidgetChange("subq", this);
\r
1445 private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)
\r
1447 x264PanelFunctions.on_x264_WidgetChange("analyse", this);
\r
1449 private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)
\r
1451 x264PanelFunctions.on_x264_WidgetChange("8x8dct", this);
\r
1453 private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)
\r
1455 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1458 private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)
\r
1460 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1463 private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)
\r
1465 x264PanelFunctions.on_x264_WidgetChange("trellis", this);
\r
1467 private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)
\r
1469 x264PanelFunctions.on_x264_WidgetChange("no-fast-pskip", this);
\r
1471 private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)
\r
1473 x264PanelFunctions.on_x264_WidgetChange("no-dct-decimate", this);
\r
1476 private void check_Cabac_CheckedChanged(object sender, EventArgs e)
\r
1479 x264PanelFunctions.on_x264_WidgetChange("cabac", this);
\r
1482 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1484 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1486 rtf_x264Query.Text = rtf_x264Query.Text.Replace("\n", "");
\r
1487 x264PanelFunctions.X264_StandardizeOptString(this);
\r
1488 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
1490 if (rtf_x264Query.Text == string.Empty)
\r
1491 x264PanelFunctions.reset2Defaults(this);
\r
1494 private void btn_reset_Click(object sender, EventArgs e)
\r
1496 rtf_x264Query.Text = "";
\r
1497 x264PanelFunctions.reset2Defaults(this);
\r
1500 // Query Editor Tab
\r
1501 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1503 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1505 private void btn_clear_Click(object sender, EventArgs e)
\r
1507 rtf_query.Clear();
\r
1511 // MainWindow Components, Actions and Functions ***********************
\r
1513 #region Source Scan
\r
1514 private void setupGUIforScan(String filename)
\r
1516 text_source.Text = filename;
\r
1518 foreach (Control ctrl in Controls)
\r
1520 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1521 ctrl.Enabled = false;
\r
1523 lbl_encode.Visible = true;
\r
1524 lbl_encode.Text = "Scanning ...";
\r
1525 gb_source.Text = "Source: Scanning ...";
\r
1526 btn_source.Enabled = false;
\r
1527 btn_start.Enabled = false;
\r
1528 btn_showQueue.Enabled = false;
\r
1529 btn_add2Queue.Enabled = false;
\r
1530 tb_preview.Enabled = false;
\r
1531 mnu_killCLI.Visible = true;
\r
1533 private void startScan(String filename)
\r
1537 lbl_encode.Visible = true;
\r
1538 lbl_encode.Text = "Scanning...";
\r
1539 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1541 catch (Exception exc)
\r
1543 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1546 private void scanProcess(object state)
\r
1550 string inputFile = (string)state;
\r
1551 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1552 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1554 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1555 if (File.Exists(dvdInfoPath))
\r
1556 File.Delete(dvdInfoPath);
\r
1558 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1560 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);
\r
1561 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;
\r
1563 using (hbproc = Process.Start(hbParseDvd))
\r
1565 hbproc.WaitForExit();
\r
1568 if (!File.Exists(dvdInfoPath))
\r
1570 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1573 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1575 thisDVD = Parsing.DVD.Parse(sr);
\r
1580 updateUIafterScan();
\r
1582 catch (Exception exc)
\r
1584 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1588 private void updateUIafterScan()
\r
1592 if (InvokeRequired)
\r
1594 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1598 // Setup some GUI components
\r
1599 drp_dvdtitle.Items.Clear();
\r
1600 if (thisDVD.Titles.Count != 0)
\r
1601 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1602 drp_dvdtitle.Text = "Automatic";
\r
1603 drop_chapterFinish.Text = "Auto";
\r
1604 drop_chapterStart.Text = "Auto";
\r
1606 // Now select the longest title
\r
1607 if (thisDVD.Titles.Count != 0)
\r
1608 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1610 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1611 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1612 Check_ChapterMarkers.Enabled = true;
\r
1615 Check_ChapterMarkers.Enabled = false;
\r
1616 Check_ChapterMarkers.Checked = false;
\r
1617 data_chpt.Rows.Clear();
\r
1620 // If no titles were found, Display an error message
\r
1621 if (drp_dvdtitle.Items.Count == 0)
\r
1622 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source.\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
1624 // Enable the GUI components and enable any disabled components
\r
1627 catch (Exception exc)
\r
1629 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1634 private void enableGUI()
\r
1638 if (InvokeRequired)
\r
1640 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1642 lbl_encode.Text = "Scan Completed";
\r
1643 gb_source.Text = "Source";
\r
1644 foreach (Control ctrl in Controls)
\r
1645 ctrl.Enabled = true;
\r
1646 btn_start.Enabled = true;
\r
1647 btn_showQueue.Enabled = true;
\r
1648 btn_add2Queue.Enabled = true;
\r
1649 tb_preview.Enabled = true;
\r
1650 btn_source.Enabled = true;
\r
1651 mnu_killCLI.Visible = false;
\r
1653 catch (Exception exc)
\r
1655 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1658 private static void killCLI()
\r
1660 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1661 // hbproc.kill/close just won't do the trick.
\r
1664 string AppName = "HandBrakeCLI";
\r
1666 AppName = AppName.ToUpper();
\r
1668 System.Diagnostics.Process[] prs = Process.GetProcesses();
\r
1669 foreach (System.Diagnostics.Process proces in prs)
\r
1671 if (proces.ProcessName.ToUpper() == AppName)
\r
1674 if (!proces.HasExited)
\r
1679 catch (Exception ex)
\r
1681 MessageBox.Show("Unable to kill HandBrakeCLI.exe \nYou may need to manually kill HandBrakeCLI.exe using the Windows Task Manager if it does not close automatically within the next few minutes. \n\nError Information: \n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1686 #region DVD Drive Detection
\r
1687 // Source Button Drive Detection
\r
1688 private delegate void ProgressUpdateHandler();
\r
1689 private void getDriveInfoThread()
\r
1693 if (InvokeRequired)
\r
1695 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1699 Boolean foundDrive = false;
\r
1700 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1701 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1703 if (curDrive.DriveType == DriveType.CDRom)
\r
1705 if (curDrive.IsReady)
\r
1707 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1708 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1710 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1712 foundDrive = true;
\r
1718 if (foundDrive == false)
\r
1719 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1723 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1728 #region Audio Panel Code Helpers
\r
1729 private void setAudioByContainer(String path)
\r
1733 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1735 oldval = drp_audenc_1.Text;
\r
1736 drp_audenc_1.Items.Clear();
\r
1737 drp_audenc_1.Items.Add("AAC");
\r
1738 drp_audenc_1.Items.Add("AC3");
\r
1739 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1740 drp_audenc_1.SelectedIndex = 0;
\r
1743 else if (path.EndsWith(".avi"))
\r
1745 oldval = drp_audenc_1.Text;
\r
1746 drp_audenc_1.Items.Clear();
\r
1747 drp_audenc_1.Items.Add("MP3");
\r
1748 drp_audenc_1.Items.Add("AC3");
\r
1749 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1750 drp_audenc_1.SelectedIndex = 0;
\r
1753 else if (path.EndsWith(".ogm"))
\r
1755 drp_audenc_1.Items.Clear();
\r
1756 drp_audenc_1.Items.Add("Vorbis");
\r
1757 drp_audenc_1.SelectedIndex = 0;
\r
1760 else if (path.EndsWith(".mkv"))
\r
1762 drp_audenc_1.Items.Clear();
\r
1763 drp_audenc_1.Items.Add("AAC");
\r
1764 drp_audenc_1.Items.Add("MP3");
\r
1765 drp_audenc_1.Items.Add("AC3");
\r
1766 drp_audenc_1.Items.Add("Vorbis");
\r
1767 if (drp_audenc_1.Text == string.Empty)
\r
1768 drp_audenc_1.SelectedIndex = 0;
\r
1771 // Make sure the table is updated with new audio codecs
\r
1772 foreach (ListViewItem row in lv_audioList.Items)
\r
1774 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1775 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1778 private void setVideoByContainer(String path)
\r
1782 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1784 oldval = drp_videoEncoder.Text;
\r
1785 drp_videoEncoder.Items.Clear();
\r
1786 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1787 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1788 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1789 if (oldval == "VP3 (Theora)")
\r
1790 drp_videoEncoder.SelectedIndex = 2;
\r
1792 drp_videoEncoder.Text = oldval;
\r
1795 else if (path.EndsWith(".avi"))
\r
1797 oldval = drp_videoEncoder.Text;
\r
1798 drp_videoEncoder.Items.Clear();
\r
1799 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1800 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1801 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1802 if (oldval == "VP3 (Theora)")
\r
1803 drp_videoEncoder.SelectedIndex = 2;
\r
1805 drp_videoEncoder.Text = oldval;
\r
1807 else if (path.EndsWith(".ogm"))
\r
1809 oldval = drp_videoEncoder.Text;
\r
1810 drp_videoEncoder.Items.Clear();
\r
1811 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1812 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1813 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1814 if (oldval == "H.264 (x264)")
\r
1815 drp_videoEncoder.SelectedIndex = 2;
\r
1817 drp_videoEncoder.Text = oldval;
\r
1819 else if (path.EndsWith(".mkv"))
\r
1821 oldval = drp_videoEncoder.Text;
\r
1822 drp_videoEncoder.Items.Clear();
\r
1823 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1824 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1825 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1826 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1827 drp_videoEncoder.Text = oldval;
\r
1830 private void setBitrateSelections384(ComboBox dropDown)
\r
1832 dropDown.Items.Clear();
\r
1833 dropDown.Items.Add("32");
\r
1834 dropDown.Items.Add("40");
\r
1835 dropDown.Items.Add("48");
\r
1836 dropDown.Items.Add("56");
\r
1837 dropDown.Items.Add("64");
\r
1838 dropDown.Items.Add("80");
\r
1839 dropDown.Items.Add("86");
\r
1840 dropDown.Items.Add("112");
\r
1841 dropDown.Items.Add("128");
\r
1842 dropDown.Items.Add("160");
\r
1843 dropDown.Items.Add("192");
\r
1844 dropDown.Items.Add("224");
\r
1845 dropDown.Items.Add("256");
\r
1846 dropDown.Items.Add("320");
\r
1847 dropDown.Items.Add("384");
\r
1849 private void setBitrateSelections320(ComboBox dropDown)
\r
1851 dropDown.Items.Clear();
\r
1852 dropDown.Items.Add("32");
\r
1853 dropDown.Items.Add("40");
\r
1854 dropDown.Items.Add("48");
\r
1855 dropDown.Items.Add("56");
\r
1856 dropDown.Items.Add("64");
\r
1857 dropDown.Items.Add("80");
\r
1858 dropDown.Items.Add("86");
\r
1859 dropDown.Items.Add("112");
\r
1860 dropDown.Items.Add("128");
\r
1861 dropDown.Items.Add("160");
\r
1862 dropDown.Items.Add("192");
\r
1863 dropDown.Items.Add("224");
\r
1864 dropDown.Items.Add("256");
\r
1865 dropDown.Items.Add("320");
\r
1867 private void setBitrateSelections160(ComboBox dropDown)
\r
1869 dropDown.Items.Clear();
\r
1870 dropDown.Items.Add("32");
\r
1871 dropDown.Items.Add("40");
\r
1872 dropDown.Items.Add("48");
\r
1873 dropDown.Items.Add("56");
\r
1874 dropDown.Items.Add("64");
\r
1875 dropDown.Items.Add("80");
\r
1876 dropDown.Items.Add("86");
\r
1877 dropDown.Items.Add("112");
\r
1878 dropDown.Items.Add("128");
\r
1879 dropDown.Items.Add("160");
\r
1881 private void setMixDownAllOptions(ComboBox dropdown)
\r
1883 dropdown.Items.Clear();
\r
1884 dropdown.Items.Add("Automatic");
\r
1885 dropdown.Items.Add("Mono");
\r
1886 dropdown.Items.Add("Stereo");
\r
1887 dropdown.Items.Add("Dolby Surround");
\r
1888 dropdown.Items.Add("Dolby Pro Logic II");
\r
1889 dropdown.Items.Add("6 Channel Discrete");
\r
1891 private void setMixDownNotAAC(ComboBox dropdown)
\r
1893 dropdown.Items.Clear();
\r
1894 dropdown.Items.Add("Automatic");
\r
1895 dropdown.Items.Add("Stereo");
\r
1896 dropdown.Items.Add("Dolby Surround");
\r
1897 dropdown.Items.Add("Dolby Pro Logic II");
\r
1901 #region Public Methods
\r
1904 /// Setup the GUI for Encoding or finished Encoding.
\r
1905 /// 1 = Encode Running
\r
1906 /// 0 = Encode Finished.
\r
1908 public void setEncodeFinished()
\r
1912 if (InvokeRequired)
\r
1914 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1918 lbl_encode.Text = "Encoding Finished";
\r
1919 btn_start.Text = "Start";
\r
1920 btn_start.ToolTipText = "Start the encoding process";
\r
1921 btn_start.Image = Properties.Resources.Play;
\r
1923 // If the window is minimized, display the notification in a popup.
\r
1924 if (FormWindowState.Minimized == this.WindowState)
\r
1926 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1927 notifyIcon.ShowBalloonTip(500);
\r
1930 catch (Exception exc)
\r
1932 MessageBox.Show(exc.ToString());
\r
1935 public void setEncodeStarted()
\r
1939 if (InvokeRequired)
\r
1941 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1945 lbl_encode.Visible = true;
\r
1946 lbl_encode.Text = "Encoding in Progress";
\r
1947 btn_start.Text = "Stop";
\r
1948 btn_start.ToolTipText = "Stop the encoding process. \nWarning: This may break your file. Press ctrl-c in the CLI window if you wish it to exit cleanly.";
\r
1949 btn_start.Image = Properties.Resources.stop;
\r
1951 catch (Exception exc)
\r
1953 MessageBox.Show(exc.ToString());
\r
1958 /// Action can be "encode" or "scan"
\r
1959 /// Set the last action varible in the main window.
\r
1960 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
1962 /// <param name="last">String</param>
\r
1963 public void setLastAction(string last)
\r
1965 this.lastAction = last;
\r
1969 /// DVD parseing. Pass in a parsed DVD.
\r
1971 /// <param name="dvd"></param>
\r
1972 public void setStreamReader(Parsing.DVD dvd)
\r
1974 this.thisDVD = dvd;
\r
1978 /// Reload the preset panel display
\r
1980 public void loadPresetPanel()
\r
1982 presetHandler.loadPresetData();
\r
1984 treeView_presets.Nodes.Clear();
\r
1986 List<Presets.Preset> presetNameList;
\r
1987 List<string> presetNames;
\r
1988 TreeNode preset_treeview;
\r
1990 TreeNode rootNode = new TreeNode();
\r
1991 TreeNode rootNodeTwo = new TreeNode();
\r
1992 TreeNode childNode;
\r
1993 int workingLevel = 0;
\r
1994 string previousCategory = String.Empty;
\r
1995 string currentCategory = String.Empty;
\r
1997 presetNameList = presetHandler.getBuildInPresets();
\r
1998 if (presetNameList.Count != 0)
\r
2000 foreach (Presets.Preset preset in presetNameList)
\r
2002 // Handle Root Nodes
\r
2004 // First Case - No presets have been read yet so setup the root category
\r
2005 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2007 rootNode = new TreeNode(preset.Category);
\r
2008 workingLevel = preset.Level;
\r
2009 currentCategory = preset.Category;
\r
2010 previousCategory = preset.Category;
\r
2013 // Second Case - This is the first sub child node.
\r
2014 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2016 rootNodeTwo = new TreeNode(preset.Category);
\r
2017 workingLevel = preset.Level;
\r
2018 currentCategory = preset.Category;
\r
2019 rootNode.Nodes.Add(rootNodeTwo);
\r
2022 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2023 if (preset.Level == 1 && workingLevel == 2)
\r
2025 workingLevel = preset.Level;
\r
2026 currentCategory = preset.Category;
\r
2029 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2030 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2032 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2034 rootNode = new TreeNode(preset.Category);
\r
2035 workingLevel = preset.Level;
\r
2036 currentCategory = preset.Category;
\r
2037 previousCategory = preset.Category;
\r
2040 // Handle Child Nodes
\r
2041 // Add First level child nodes to the current root node
\r
2042 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2044 childNode = new TreeNode(preset.Name);
\r
2045 rootNode.Nodes.Add(childNode);
\r
2048 // Add Second level child nodes to the current sub root node
\r
2049 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2051 childNode = new TreeNode(preset.Name);
\r
2052 rootNodeTwo.Nodes.Add(childNode);
\r
2056 // Add the final root node which does not get added above.
\r
2057 treeView_presets.Nodes.Add(rootNode);
\r
2061 presetNames = presetHandler.getUserPresetNames();
\r
2062 foreach (string preset in presetNames)
\r
2064 preset_treeview = new TreeNode(preset);
\r
2065 preset_treeview.ForeColor = Color.Black;
\r
2067 // Now Fill Out List View with Items
\r
2068 treeView_presets.Nodes.Add(preset_treeview);
\r
2074 private void mnu_qptest_Click(object sender, EventArgs e)
\r
2076 QueryParserTester qptest = new QueryParserTester();
\r
2081 // This is the END of the road ------------------------------------------------------------------------------
\r