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
1032 if (!drp_anamorphic.Items.Contains("Loose"))
\r
1033 drp_anamorphic.Items.Add("Loose");
\r
1037 check_turbo.CheckState = CheckState.Unchecked;
\r
1038 check_turbo.Enabled = false;
\r
1039 h264Tab.Enabled = false;
\r
1040 rtf_x264Query.Text = "";
\r
1041 check_iPodAtom.Enabled = false;
\r
1042 check_iPodAtom.Checked = false;
\r
1043 if (drp_anamorphic.Items.Count == 3)
\r
1044 drp_anamorphic.Items.RemoveAt(2);
\r
1048 private void text_bitrate_TextChanged(object sender, EventArgs e)
\r
1050 text_filesize.Text = "";
\r
1051 slider_videoQuality.Value = 0;
\r
1052 SliderValue.Text = "0%";
\r
1053 check_2PassEncode.Enabled = true;
\r
1055 private void text_filesize_TextChanged(object sender, EventArgs e)
\r
1057 text_bitrate.Text = "";
\r
1058 slider_videoQuality.Value = 0;
\r
1059 SliderValue.Text = "0%";
\r
1060 check_2PassEncode.Enabled = true;
\r
1062 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1064 SliderValue.Text = slider_videoQuality.Value + "%";
\r
1065 text_bitrate.Text = "";
\r
1066 text_filesize.Text = "";
\r
1067 check_2PassEncode.Enabled = false;
\r
1068 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1070 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1072 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1074 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1075 check_turbo.Enabled = true;
\r
1079 check_turbo.Enabled = false;
\r
1080 check_turbo.CheckState = CheckState.Unchecked;
\r
1085 private void text_width_TextChanged(object sender, EventArgs e)
\r
1087 if (text_width.Text == "")
\r
1088 text_width.BackColor = Color.White;
\r
1090 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
1093 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1096 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1098 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1100 if (drp_anamorphic.Text == "None")
\r
1102 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1104 text_height.Text = height.ToString();
\r
1109 private void text_height_TextChanged(object sender, EventArgs e)
\r
1111 if (text_height.Text == "")
\r
1112 text_height.BackColor = Color.White;
\r
1114 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1117 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1119 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1121 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1123 text_left.Enabled = true;
\r
1124 text_right.Enabled = true;
\r
1125 text_top.Enabled = true;
\r
1126 text_bottom.Enabled = true;
\r
1127 if (selectedTitle != null)
\r
1129 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1130 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1131 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1132 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1136 text_left.Text = "0";
\r
1137 text_right.Text = "0";
\r
1138 text_top.Text = "0";
\r
1139 text_bottom.Text = "0";
\r
1142 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1144 text_left.Enabled = false;
\r
1145 text_right.Enabled = false;
\r
1146 text_top.Enabled = false;
\r
1147 text_bottom.Enabled = false;
\r
1149 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1151 if (drp_anamorphic.SelectedIndex == 1)
\r
1153 text_height.BackColor = Color.LightGray;
\r
1154 text_width.BackColor = Color.LightGray;
\r
1155 text_height.Text = "";
\r
1156 text_width.Text = "";
\r
1157 text_height.Enabled = false;
\r
1158 text_width.Enabled = false;
\r
1161 if (drp_anamorphic.SelectedIndex == 2)
\r
1163 text_height.Text = "";
\r
1164 text_height.Enabled = false;
\r
1165 text_height.BackColor = Color.LightGray;
\r
1167 text_width.Enabled = true;
\r
1168 text_width.BackColor = Color.White;
\r
1171 if (drp_anamorphic.SelectedIndex == 0)
\r
1173 text_height.BackColor = Color.White;
\r
1174 text_width.BackColor = Color.White;
\r
1175 text_height.Enabled = true;
\r
1176 text_width.Enabled = true;
\r
1179 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1181 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1185 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1187 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1189 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1190 lv_audioList.Select();
\r
1193 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1195 if (drp_audenc_1.Text == "AC3")
\r
1197 drp_audmix_1.Enabled = false;
\r
1198 drp_audbit_1.Enabled = false;
\r
1199 drp_audsr_1.Enabled = false;
\r
1201 drp_audmix_1.SelectedIndex = 0;
\r
1202 drp_audbit_1.SelectedIndex = 0;
\r
1203 drp_audsr_1.SelectedIndex = 0;
\r
1207 drp_audmix_1.Enabled = true;
\r
1208 drp_audbit_1.Enabled = true;
\r
1209 drp_audsr_1.Enabled = true;
\r
1211 drp_audmix_1.Text = "Automatic";
\r
1212 drp_audbit_1.Text = "160";
\r
1213 drp_audsr_1.Text = "Auto";
\r
1216 if (drp_audenc_1.Text == "AAC")
\r
1218 setMixDownAllOptions(drp_audmix_1);
\r
1219 setBitrateSelections160(drp_audbit_1);
\r
1223 setMixDownNotAAC(drp_audmix_1);
\r
1224 setBitrateSelections320(drp_audbit_1);
\r
1227 // Update an item in the Audio list if required.
\r
1228 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1230 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1231 lv_audioList.Select();
\r
1234 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1236 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1237 setBitrateSelections384(drp_audbit_1);
\r
1238 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1239 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1241 // Update an item in the Audio list if required.
\r
1242 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1244 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1245 lv_audioList.Select();
\r
1248 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1250 // Update an item in the Audio list if required.
\r
1251 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1253 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1254 lv_audioList.Select();
\r
1257 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1259 // Update an item in the Audio list if required.
\r
1260 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1262 if (drp_audenc_1.Text == "AC3")
\r
1263 drp_audbit_1.Text = "Auto";
\r
1264 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1265 lv_audioList.Select();
\r
1268 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1270 double value = (tb_drc.Value / 10.0) + 1;
\r
1271 lbl_drc.Text = value.ToString();
\r
1273 // Update an item in the Audio list if required.
\r
1274 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1276 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1277 lv_audioList.Select();
\r
1281 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1283 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1284 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1285 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1286 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1287 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1288 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1289 newTrack.SubItems.Add(lbl_drc.Text);
\r
1291 // Select the newly added track and select the control
\r
1292 lv_audioList.Items.Add(newTrack);
\r
1293 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1294 lv_audioList.Select();
\r
1296 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1298 removeAudioTrack();
\r
1300 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1302 if (lv_audioList.SelectedIndices.Count != 0)
\r
1304 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1305 int index = item.Index;
\r
1308 if (lv_audioList.Items.Count > index && index >= 0)
\r
1310 lv_audioList.Items.Remove(item);
\r
1311 lv_audioList.Items.Insert(index, item);
\r
1312 item.Selected = true;
\r
1313 lv_audioList.Focus();
\r
1317 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1319 if (lv_audioList.SelectedIndices.Count != 0)
\r
1321 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1322 int index = item.Index;
\r
1325 if (index < lv_audioList.Items.Count)
\r
1327 lv_audioList.Items.Remove(item);
\r
1328 lv_audioList.Items.Insert(index, item);
\r
1329 item.Selected = true;
\r
1330 lv_audioList.Focus();
\r
1336 private void audioList_remove_Click(object sender, EventArgs e)
\r
1338 removeAudioTrack();
\r
1340 private void removeAudioTrack()
\r
1342 // Remove the Item and reselect the control if the following conditions are met.
\r
1343 if (lv_audioList.SelectedItems.Count != 0)
\r
1345 // Record the current selected index.
\r
1346 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1348 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1350 // Now reslect the correct item and give focus to the audio list.
\r
1351 if (lv_audioList.Items.Count != 0)
\r
1353 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1354 lv_audioList.Items[currentPosition].Selected = true;
\r
1355 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1356 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1358 lv_audioList.Select();
\r
1363 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1365 // Set the dropdown controls based on the selected item in the Audio List.
\r
1366 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1368 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1369 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1370 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1371 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1372 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1373 double drcValue; int drcCalculated;
\r
1374 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1375 drcValue = (drcValue * 10) - 10;
\r
1376 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1377 tb_drc.Value = drcCalculated;
\r
1381 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1383 if (drp_subtitle.Text.Contains("None"))
\r
1385 check_forced.Enabled = false;
\r
1386 check_forced.Checked = false;
\r
1389 check_forced.Enabled = true;
\r
1392 // Chapter Marker Tab
\r
1393 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1395 if (Check_ChapterMarkers.Checked)
\r
1397 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1398 data_chpt.Rows.Clear();
\r
1399 data_chpt.Enabled = true;
\r
1400 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1401 if (chapterGridView != null)
\r
1402 data_chpt = chapterGridView;
\r
1406 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1407 data_chpt.Rows.Clear();
\r
1408 data_chpt.Enabled = false;
\r
1413 private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1415 x264PanelFunctions.on_x264_WidgetChange("ref", this);
\r
1417 private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)
\r
1419 x264PanelFunctions.on_x264_WidgetChange("mixed-refs", this);
\r
1421 private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1423 x264PanelFunctions.on_x264_WidgetChange("bframes", this);
\r
1425 private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)
\r
1427 x264PanelFunctions.on_x264_WidgetChange("direct", this);
\r
1429 private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)
\r
1431 x264PanelFunctions.on_x264_WidgetChange("weightb", this);
\r
1433 private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)
\r
1435 x264PanelFunctions.on_x264_WidgetChange("b-pyramid", this);
\r
1437 private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)
\r
1439 x264PanelFunctions.on_x264_WidgetChange("me", this);
\r
1441 private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)
\r
1443 x264PanelFunctions.on_x264_WidgetChange("merange", this);
\r
1445 private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)
\r
1447 x264PanelFunctions.on_x264_WidgetChange("subq", this);
\r
1449 private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)
\r
1451 x264PanelFunctions.on_x264_WidgetChange("analyse", this);
\r
1453 private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)
\r
1455 x264PanelFunctions.on_x264_WidgetChange("8x8dct", this);
\r
1457 private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)
\r
1459 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1462 private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)
\r
1464 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1467 private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)
\r
1469 x264PanelFunctions.on_x264_WidgetChange("trellis", this);
\r
1471 private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)
\r
1473 x264PanelFunctions.on_x264_WidgetChange("no-fast-pskip", this);
\r
1475 private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)
\r
1477 x264PanelFunctions.on_x264_WidgetChange("no-dct-decimate", this);
\r
1480 private void check_Cabac_CheckedChanged(object sender, EventArgs e)
\r
1483 x264PanelFunctions.on_x264_WidgetChange("cabac", this);
\r
1486 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1488 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1490 rtf_x264Query.Text = rtf_x264Query.Text.Replace("\n", "");
\r
1491 x264PanelFunctions.X264_StandardizeOptString(this);
\r
1492 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
1494 if (rtf_x264Query.Text == string.Empty)
\r
1495 x264PanelFunctions.reset2Defaults(this);
\r
1498 private void btn_reset_Click(object sender, EventArgs e)
\r
1500 rtf_x264Query.Text = "";
\r
1501 x264PanelFunctions.reset2Defaults(this);
\r
1504 // Query Editor Tab
\r
1505 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1507 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1509 private void btn_clear_Click(object sender, EventArgs e)
\r
1511 rtf_query.Clear();
\r
1515 // MainWindow Components, Actions and Functions ***********************
\r
1517 #region Source Scan
\r
1518 private void setupGUIforScan(String filename)
\r
1520 text_source.Text = filename;
\r
1522 foreach (Control ctrl in Controls)
\r
1524 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1525 ctrl.Enabled = false;
\r
1527 lbl_encode.Visible = true;
\r
1528 lbl_encode.Text = "Scanning ...";
\r
1529 gb_source.Text = "Source: Scanning ...";
\r
1530 btn_source.Enabled = false;
\r
1531 btn_start.Enabled = false;
\r
1532 btn_showQueue.Enabled = false;
\r
1533 btn_add2Queue.Enabled = false;
\r
1534 tb_preview.Enabled = false;
\r
1535 mnu_killCLI.Visible = true;
\r
1537 private void startScan(String filename)
\r
1541 lbl_encode.Visible = true;
\r
1542 lbl_encode.Text = "Scanning...";
\r
1543 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1545 catch (Exception exc)
\r
1547 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1550 private void scanProcess(object state)
\r
1554 string inputFile = (string)state;
\r
1555 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1556 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1558 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1559 if (File.Exists(dvdInfoPath))
\r
1560 File.Delete(dvdInfoPath);
\r
1562 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1564 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);
\r
1565 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;
\r
1567 using (hbproc = Process.Start(hbParseDvd))
\r
1569 hbproc.WaitForExit();
\r
1572 if (!File.Exists(dvdInfoPath))
\r
1574 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1577 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1579 thisDVD = Parsing.DVD.Parse(sr);
\r
1584 updateUIafterScan();
\r
1586 catch (Exception exc)
\r
1588 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1592 private void updateUIafterScan()
\r
1596 if (InvokeRequired)
\r
1598 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1602 // Setup some GUI components
\r
1603 drp_dvdtitle.Items.Clear();
\r
1604 if (thisDVD.Titles.Count != 0)
\r
1605 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1606 drp_dvdtitle.Text = "Automatic";
\r
1607 drop_chapterFinish.Text = "Auto";
\r
1608 drop_chapterStart.Text = "Auto";
\r
1610 // Now select the longest title
\r
1611 if (thisDVD.Titles.Count != 0)
\r
1612 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1614 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1615 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1616 Check_ChapterMarkers.Enabled = true;
\r
1619 Check_ChapterMarkers.Enabled = false;
\r
1620 Check_ChapterMarkers.Checked = false;
\r
1621 data_chpt.Rows.Clear();
\r
1624 // If no titles were found, Display an error message
\r
1625 if (drp_dvdtitle.Items.Count == 0)
\r
1626 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
1628 // Enable the GUI components and enable any disabled components
\r
1631 catch (Exception exc)
\r
1633 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1638 private void enableGUI()
\r
1642 if (InvokeRequired)
\r
1644 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1646 lbl_encode.Text = "Scan Completed";
\r
1647 gb_source.Text = "Source";
\r
1648 foreach (Control ctrl in Controls)
\r
1649 ctrl.Enabled = true;
\r
1650 btn_start.Enabled = true;
\r
1651 btn_showQueue.Enabled = true;
\r
1652 btn_add2Queue.Enabled = true;
\r
1653 tb_preview.Enabled = true;
\r
1654 btn_source.Enabled = true;
\r
1655 mnu_killCLI.Visible = false;
\r
1657 catch (Exception exc)
\r
1659 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1662 private static void killCLI()
\r
1664 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1665 // hbproc.kill/close just won't do the trick.
\r
1668 string AppName = "HandBrakeCLI";
\r
1670 AppName = AppName.ToUpper();
\r
1672 System.Diagnostics.Process[] prs = Process.GetProcesses();
\r
1673 foreach (System.Diagnostics.Process proces in prs)
\r
1675 if (proces.ProcessName.ToUpper() == AppName)
\r
1678 if (!proces.HasExited)
\r
1683 catch (Exception ex)
\r
1685 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
1690 #region DVD Drive Detection
\r
1691 // Source Button Drive Detection
\r
1692 private delegate void ProgressUpdateHandler();
\r
1693 private void getDriveInfoThread()
\r
1697 if (InvokeRequired)
\r
1699 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1703 Boolean foundDrive = false;
\r
1704 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1705 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1707 if (curDrive.DriveType == DriveType.CDRom)
\r
1709 if (curDrive.IsReady)
\r
1711 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1712 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1714 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1716 foundDrive = true;
\r
1722 if (foundDrive == false)
\r
1723 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1727 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1732 #region Audio Panel Code Helpers
\r
1733 private void setAudioByContainer(String path)
\r
1737 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1739 oldval = drp_audenc_1.Text;
\r
1740 drp_audenc_1.Items.Clear();
\r
1741 drp_audenc_1.Items.Add("AAC");
\r
1742 drp_audenc_1.Items.Add("AC3");
\r
1743 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1744 drp_audenc_1.SelectedIndex = 0;
\r
1747 else if (path.EndsWith(".avi"))
\r
1749 oldval = drp_audenc_1.Text;
\r
1750 drp_audenc_1.Items.Clear();
\r
1751 drp_audenc_1.Items.Add("MP3");
\r
1752 drp_audenc_1.Items.Add("AC3");
\r
1753 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1754 drp_audenc_1.SelectedIndex = 0;
\r
1757 else if (path.EndsWith(".ogm"))
\r
1759 drp_audenc_1.Items.Clear();
\r
1760 drp_audenc_1.Items.Add("Vorbis");
\r
1761 drp_audenc_1.SelectedIndex = 0;
\r
1764 else if (path.EndsWith(".mkv"))
\r
1766 drp_audenc_1.Items.Clear();
\r
1767 drp_audenc_1.Items.Add("AAC");
\r
1768 drp_audenc_1.Items.Add("MP3");
\r
1769 drp_audenc_1.Items.Add("AC3");
\r
1770 drp_audenc_1.Items.Add("Vorbis");
\r
1771 if (drp_audenc_1.Text == string.Empty)
\r
1772 drp_audenc_1.SelectedIndex = 0;
\r
1775 private void setVideoByContainer(String path)
\r
1779 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1781 oldval = drp_videoEncoder.Text;
\r
1782 drp_videoEncoder.Items.Clear();
\r
1783 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1784 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1785 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1786 if (oldval == "VP3 (Theora)")
\r
1787 drp_videoEncoder.SelectedIndex = 2;
\r
1789 drp_videoEncoder.Text = oldval;
\r
1792 else if (path.EndsWith(".avi"))
\r
1794 oldval = drp_videoEncoder.Text;
\r
1795 drp_videoEncoder.Items.Clear();
\r
1796 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1797 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1798 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1799 if (oldval == "VP3 (Theora)")
\r
1800 drp_videoEncoder.SelectedIndex = 2;
\r
1802 drp_videoEncoder.Text = oldval;
\r
1804 else if (path.EndsWith(".ogm"))
\r
1806 oldval = drp_videoEncoder.Text;
\r
1807 drp_videoEncoder.Items.Clear();
\r
1808 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1809 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1810 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1811 if (oldval == "H.264 (x264)")
\r
1812 drp_videoEncoder.SelectedIndex = 2;
\r
1814 drp_videoEncoder.Text = oldval;
\r
1816 else if (path.EndsWith(".mkv"))
\r
1818 oldval = drp_videoEncoder.Text;
\r
1819 drp_videoEncoder.Items.Clear();
\r
1820 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1821 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1822 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1823 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1824 drp_videoEncoder.Text = oldval;
\r
1827 private void setBitrateSelections384(ComboBox dropDown)
\r
1829 dropDown.Items.Clear();
\r
1830 dropDown.Items.Add("32");
\r
1831 dropDown.Items.Add("40");
\r
1832 dropDown.Items.Add("48");
\r
1833 dropDown.Items.Add("56");
\r
1834 dropDown.Items.Add("64");
\r
1835 dropDown.Items.Add("80");
\r
1836 dropDown.Items.Add("86");
\r
1837 dropDown.Items.Add("112");
\r
1838 dropDown.Items.Add("128");
\r
1839 dropDown.Items.Add("160");
\r
1840 dropDown.Items.Add("192");
\r
1841 dropDown.Items.Add("224");
\r
1842 dropDown.Items.Add("256");
\r
1843 dropDown.Items.Add("320");
\r
1844 dropDown.Items.Add("384");
\r
1846 private void setBitrateSelections320(ComboBox dropDown)
\r
1848 dropDown.Items.Clear();
\r
1849 dropDown.Items.Add("32");
\r
1850 dropDown.Items.Add("40");
\r
1851 dropDown.Items.Add("48");
\r
1852 dropDown.Items.Add("56");
\r
1853 dropDown.Items.Add("64");
\r
1854 dropDown.Items.Add("80");
\r
1855 dropDown.Items.Add("86");
\r
1856 dropDown.Items.Add("112");
\r
1857 dropDown.Items.Add("128");
\r
1858 dropDown.Items.Add("160");
\r
1859 dropDown.Items.Add("192");
\r
1860 dropDown.Items.Add("224");
\r
1861 dropDown.Items.Add("256");
\r
1862 dropDown.Items.Add("320");
\r
1864 private void setBitrateSelections160(ComboBox dropDown)
\r
1866 dropDown.Items.Clear();
\r
1867 dropDown.Items.Add("32");
\r
1868 dropDown.Items.Add("40");
\r
1869 dropDown.Items.Add("48");
\r
1870 dropDown.Items.Add("56");
\r
1871 dropDown.Items.Add("64");
\r
1872 dropDown.Items.Add("80");
\r
1873 dropDown.Items.Add("86");
\r
1874 dropDown.Items.Add("112");
\r
1875 dropDown.Items.Add("128");
\r
1876 dropDown.Items.Add("160");
\r
1878 private void setMixDownAllOptions(ComboBox dropdown)
\r
1880 dropdown.Items.Clear();
\r
1881 dropdown.Items.Add("Automatic");
\r
1882 dropdown.Items.Add("Mono");
\r
1883 dropdown.Items.Add("Stereo");
\r
1884 dropdown.Items.Add("Dolby Surround");
\r
1885 dropdown.Items.Add("Dolby Pro Logic II");
\r
1886 dropdown.Items.Add("6 Channel Discrete");
\r
1888 private void setMixDownNotAAC(ComboBox dropdown)
\r
1890 dropdown.Items.Clear();
\r
1891 dropdown.Items.Add("Automatic");
\r
1892 dropdown.Items.Add("Stereo");
\r
1893 dropdown.Items.Add("Dolby Surround");
\r
1894 dropdown.Items.Add("Dolby Pro Logic II");
\r
1898 #region Public Methods
\r
1901 /// Setup the GUI for Encoding or finished Encoding.
\r
1902 /// 1 = Encode Running
\r
1903 /// 0 = Encode Finished.
\r
1905 public void setEncodeFinished()
\r
1909 if (InvokeRequired)
\r
1911 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1915 lbl_encode.Text = "Encoding Finished";
\r
1916 btn_start.Text = "Start";
\r
1917 btn_start.ToolTipText = "Start the encoding process";
\r
1918 btn_start.Image = Properties.Resources.Play;
\r
1920 // If the window is minimized, display the notification in a popup.
\r
1921 if (FormWindowState.Minimized == this.WindowState)
\r
1923 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1924 notifyIcon.ShowBalloonTip(500);
\r
1927 catch (Exception exc)
\r
1929 MessageBox.Show(exc.ToString());
\r
1932 public void setEncodeStarted()
\r
1936 if (InvokeRequired)
\r
1938 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1942 lbl_encode.Visible = true;
\r
1943 lbl_encode.Text = "Encoding in Progress";
\r
1944 btn_start.Text = "Stop";
\r
1945 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
1946 btn_start.Image = Properties.Resources.stop;
\r
1948 catch (Exception exc)
\r
1950 MessageBox.Show(exc.ToString());
\r
1955 /// Action can be "encode" or "scan"
\r
1956 /// Set the last action varible in the main window.
\r
1957 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
1959 /// <param name="last">String</param>
\r
1960 public void setLastAction(string last)
\r
1962 this.lastAction = last;
\r
1966 /// DVD parseing. Pass in a parsed DVD.
\r
1968 /// <param name="dvd"></param>
\r
1969 public void setStreamReader(Parsing.DVD dvd)
\r
1971 this.thisDVD = dvd;
\r
1975 /// Reload the preset panel display
\r
1977 public void loadPresetPanel()
\r
1979 presetHandler.loadPresetData();
\r
1981 treeView_presets.Nodes.Clear();
\r
1983 List<Presets.Preset> presetNameList;
\r
1984 List<string> presetNames;
\r
1985 TreeNode preset_treeview;
\r
1987 TreeNode rootNode = new TreeNode();
\r
1988 TreeNode rootNodeTwo = new TreeNode();
\r
1989 TreeNode childNode;
\r
1990 int workingLevel = 0;
\r
1991 string previousCategory = String.Empty;
\r
1992 string currentCategory = String.Empty;
\r
1994 presetNameList = presetHandler.getBuildInPresets();
\r
1995 if (presetNameList.Count != 0)
\r
1997 foreach (Presets.Preset preset in presetNameList)
\r
1999 // Handle Root Nodes
\r
2001 // First Case - No presets have been read yet so setup the root category
\r
2002 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2004 rootNode = new TreeNode(preset.Category);
\r
2005 workingLevel = preset.Level;
\r
2006 currentCategory = preset.Category;
\r
2007 previousCategory = preset.Category;
\r
2010 // Second Case - This is the first sub child node.
\r
2011 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2013 rootNodeTwo = new TreeNode(preset.Category);
\r
2014 workingLevel = preset.Level;
\r
2015 currentCategory = preset.Category;
\r
2016 rootNode.Nodes.Add(rootNodeTwo);
\r
2019 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2020 if (preset.Level == 1 && workingLevel == 2)
\r
2022 workingLevel = preset.Level;
\r
2023 currentCategory = preset.Category;
\r
2026 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2027 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2029 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2031 rootNode = new TreeNode(preset.Category);
\r
2032 workingLevel = preset.Level;
\r
2033 currentCategory = preset.Category;
\r
2034 previousCategory = preset.Category;
\r
2037 // Handle Child Nodes
\r
2038 // Add First level child nodes to the current root node
\r
2039 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2041 childNode = new TreeNode(preset.Name);
\r
2042 rootNode.Nodes.Add(childNode);
\r
2045 // Add Second level child nodes to the current sub root node
\r
2046 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2048 childNode = new TreeNode(preset.Name);
\r
2049 rootNodeTwo.Nodes.Add(childNode);
\r
2053 // Add the final root node which does not get added above.
\r
2054 treeView_presets.Nodes.Add(rootNode);
\r
2058 presetNames = presetHandler.getUserPresetNames();
\r
2059 foreach (string preset in presetNames)
\r
2061 preset_treeview = new TreeNode(preset);
\r
2062 preset_treeview.ForeColor = Color.Black;
\r
2064 // Now Fill Out List View with Items
\r
2065 treeView_presets.Nodes.Add(preset_treeview);
\r
2071 private void mnu_qptest_Click(object sender, EventArgs e)
\r
2073 QueryParserTester qptest = new QueryParserTester();
\r
2078 // This is the END of the road ------------------------------------------------------------------------------
\r