OSDN Git Service

LinGui: enable libdvdnav by default
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmMain.cs
index 07828e8..a377aca 100644 (file)
@@ -5,97 +5,98 @@
           It may be used under the terms of the GNU General Public License. */\r
 \r
 using System;\r
-using System.Collections;\r
 using System.Collections.Generic;\r
 using System.Drawing;\r
+using System.Globalization;\r
 using System.Windows.Forms;\r
 using System.IO;\r
 using System.Diagnostics;\r
 using System.Threading;\r
+using Handbrake.EncodeQueue;\r
 using Handbrake.Functions;\r
+using Handbrake.Presets;\r
+using Handbrake.Parsing;\r
 \r
 namespace Handbrake\r
 {\r
     public partial class frmMain : Form\r
     {\r
-        // Objects which may be used by one or more other objects\r
-        private delegate void UpdateWindowHandler();\r
-        Main hb_common_func = new Main();\r
-        Encode encodeHandler = new Encode();\r
-        Queue.QueueHandler encodeQueue = new Queue.QueueHandler();\r
-        Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();\r
-        Parsing.Title selectedTitle;\r
-        Parsing.DVD thisDVD;\r
-\r
-        // Objects belonging to this window only\r
-        PresetLoader presetLoader = new PresetLoader();\r
+        // Objects which may be used by one or more other objects *************\r
+        EncodeAndQueueHandler encodeQueue = new EncodeAndQueueHandler();\r
+        PresetsHandler presetHandler = new PresetsHandler();\r
         QueryGenerator queryGen = new QueryGenerator();\r
 \r
-        // Globals: Mainly used for tracking.\r
+        // Globals: Mainly used for tracking. *********************************\r
+        public Title selectedTitle;\r
+        private DVD thisDVD;\r
         private frmQueue queueWindow;\r
         private frmPreview qtpreview;\r
+        private frmActivityWindow ActivityWindow;\r
+        private Form splash;\r
+        public string sourcePath;\r
         private string lastAction;\r
-        public int maxWidth;\r
-        public int maxHeight;\r
-        Process hbproc;\r
+        private SourceType selectedSourceType;\r
+        private string dvdDrivePath;\r
+        private string dvdDriveLabel;\r
+\r
+        // Delegates **********************************************************\r
+        private delegate void UpdateWindowHandler();\r
 \r
         // Applicaiton Startup ************************************************\r
 \r
         #region Application Startup\r
-\r
         public frmMain()\r
         {\r
-            // Load the splash screen in this thread\r
-            Form splash = new frmSplashScreen();\r
-            splash.Show();\r
-\r
-            //Create a label that can be updated from the parent thread.\r
-            Label lblStatus = new Label();\r
-            lblStatus.Size = new Size(250, 20);\r
-            lblStatus.Location = new Point(10, 280);\r
+            // Load and setup the splash screen in this thread\r
+            splash = new frmSplashScreen();\r
+            splash.Show(this);\r
+            Label lblStatus = new Label { Size = new Size(150, 20), Location = new Point(182, 102) };\r
             splash.Controls.Add(lblStatus);\r
+\r
             InitializeComponent();\r
 \r
             // Update the users config file with the CLI version data.\r
             lblStatus.Text = "Setting Version Data ...";\r
             Application.DoEvents();\r
-            ArrayList x = hb_common_func.getCliVersionData();\r
-            Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());\r
-            Properties.Settings.Default.hb_version = x[0].ToString();\r
+            Main.setCliVersionData();\r
 \r
-            // show the form, but leave disabled until preloading is complete then show the main form\r
+            // Show the form, but leave disabled until preloading is complete then show the main form\r
             this.Enabled = false;\r
             this.Show();\r
             Application.DoEvents(); // Forces frmMain to draw\r
 \r
-            // update the status\r
-            if (Properties.Settings.Default.updateStatus == "Checked")\r
+            // Check for new versions, if update checking is enabled\r
+            if (Properties.Settings.Default.updateStatus)\r
             {\r
-                lblStatus.Text = "Checking for updates ...";\r
-                Application.DoEvents();\r
-                Thread updateCheckThread = new Thread(startupUpdateCheck);\r
-                updateCheckThread.Start();\r
+                DateTime now = DateTime.Now;\r
+                DateTime lastCheck = Properties.Settings.Default.lastUpdateCheckDate;\r
+                TimeSpan elapsed = now.Subtract(lastCheck);\r
+                if (elapsed.TotalDays > Properties.Settings.Default.daysBetweenUpdateCheck)\r
+                {\r
+                    lblStatus.Text = "Checking for updates ...";\r
+                    Application.DoEvents();\r
+\r
+                    Main.BeginCheckForUpdates(new AsyncCallback(UpdateCheckDone), false);\r
+                }\r
             }\r
 \r
             // Setup the GUI components\r
             lblStatus.Text = "Setting up the GUI ...";\r
             Application.DoEvents();\r
-            x264Panel.reset2Defaults(); // Initialize all the x264 widgets to their default values\r
             loadPresetPanel();                       // Load the Preset Panel\r
             treeView_presets.ExpandAll();\r
             lbl_encode.Text = "";\r
             queueWindow = new frmQueue(encodeQueue);        // Prepare the Queue\r
-            if (Properties.Settings.Default.QueryEditorTab != "Checked")\r
-                tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.\r
+            if (!Properties.Settings.Default.QueryEditorTab)\r
+                tabs_panel.TabPages.RemoveAt(7); // Remove the query editor tab if the user does not want it enabled.\r
 \r
             // Load the user's default settings or Normal Preset\r
-            if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")\r
+            if (Properties.Settings.Default.defaultPreset != "")\r
             {\r
-                // Ok, so, we've selected a preset. Now we want to load it.\r
-                if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)\r
+                if (presetHandler.GetPreset(Properties.Settings.Default.defaultPreset) != null)\r
                 {\r
-                    string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;\r
-                    Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;\r
+                    string query = presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).Query;\r
+                    Boolean loadPictureSettings = presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).PictureSettings;\r
 \r
                     if (query != null)\r
                     {\r
@@ -103,8 +104,8 @@ namespace Handbrake
                         x264Panel.reset2Defaults();\r
 \r
                         // Send the query from the file to the Query Parser class, then load the preset\r
-                        Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);\r
-                        presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);\r
+                        QueryParser presetQuery = QueryParser.Parse(query);\r
+                        PresetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);\r
 \r
                         // The x264 widgets will need updated, so do this now:\r
                         x264Panel.X264_StandardizeOptString();\r
@@ -118,11 +119,11 @@ namespace Handbrake
                 loadNormalPreset();\r
 \r
             // Enabled GUI tooltip's if Required\r
-            if (Properties.Settings.Default.tooltipEnable == "Checked")\r
-            {\r
-                x264Panel.setToolTipActive(true);\r
+            if (Properties.Settings.Default.tooltipEnable)\r
                 ToolTip.Active = true;\r
-            }\r
+\r
+            // Register with Growl (if not using Growl for the encoding completion action, this wont hurt anything)\r
+            GrowlCommunicator.Register();\r
 \r
             //Finished Loading\r
             lblStatus.Text = "Loading Complete!";\r
@@ -131,42 +132,47 @@ namespace Handbrake
             splash.Dispose();\r
             this.Enabled = true;\r
 \r
-            // Event Handlers\r
+            // Event Handlers and Queue Recovery\r
             events();\r
-\r
-            // Queue Recovery\r
             queueRecovery();\r
         }\r
 \r
-        // Startup Functions\r
-        private delegate void updateStatusChanger();\r
-        private void startupUpdateCheck()\r
+        private void UpdateCheckDone(IAsyncResult result)\r
         {\r
+            if (InvokeRequired)\r
+            {\r
+                Invoke(new MethodInvoker(() => UpdateCheckDone(result)));\r
+                return;\r
+            }\r
+\r
+            UpdateCheckInformation info;\r
+\r
             try\r
             {\r
-                if (InvokeRequired)\r
-                {\r
-                    BeginInvoke(new updateStatusChanger(startupUpdateCheck));\r
-                    return;\r
-                }\r
+                info = Main.EndCheckForUpdates(result);\r
 \r
-                Boolean update = hb_common_func.updateCheck(false);\r
-                if (update)\r
+                if (info.NewVersionAvailable)\r
                 {\r
-                    frmUpdater updateWindow = new frmUpdater();\r
-                    updateWindow.Show();\r
+                    frmUpdater updateWindow = new frmUpdater(info.BuildInformation);\r
+                    updateWindow.ShowDialog();\r
                 }\r
             }\r
-            catch (Exception) { /* Do Nothing*/ }\r
+            catch (Exception ex)\r
+            {\r
+                if ((bool)result.AsyncState)\r
+                    MessageBox.Show("Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+            }\r
         }\r
+\r
+        // Startup Functions   \r
         private void queueRecovery()\r
         {\r
-            if (hb_common_func.check_queue_recovery())\r
+            if (Main.checkQueueRecovery())\r
             {\r
                 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
 \r
                 if (result == DialogResult.Yes)\r
-                    encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery\r
+                    encodeQueue.LoadQueueFromFile("hb_queue_recovery.xml"); // Start Recovery\r
                 else\r
                 {\r
                     // Remove the Queue recovery file if the user doesn't want to recovery the last queue.\r
@@ -178,23 +184,145 @@ namespace Handbrake
         }\r
         #endregion\r
 \r
+        #region Properties\r
+        public string SourceName\r
+        {\r
+            get\r
+            {\r
+                if (this.selectedSourceType == SourceType.DvdDrive)\r
+                {\r
+                    return this.dvdDriveLabel;\r
+                }\r
+\r
+                return Path.GetFileNameWithoutExtension(this.sourcePath);\r
+            }\r
+        }\r
+        #endregion\r
+\r
         #region Events\r
         // Encoding Events for setting up the GUI\r
         private void events()\r
         {\r
+            // Handle Widget changes when preset is selected.\r
+            RegisterPresetEventHandler();\r
+\r
             // Handle Window Resize\r
-            if (Properties.Settings.Default.MainWindowMinimize == "Checked")\r
+            if (Properties.Settings.Default.MainWindowMinimize)\r
                 this.Resize += new EventHandler(frmMain_Resize);\r
 \r
-            // Handle Encode Start\r
-            encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);\r
-            encodeQueue.OnPaused += new EventHandler(encodePaused);\r
-            encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);\r
+            // Handle Encode Start / Finish / Pause\r
+            encodeQueue.CurrentJobCompleted += new EventHandler(encodeEnded);\r
+            encodeQueue.QueuePauseRequested += new EventHandler(encodePaused);\r
+            encodeQueue.NewJobStarted += new EventHandler(encodeStarted);\r
+\r
+            // Handle a file being draged onto the GUI.\r
+            this.DragEnter += new DragEventHandler(frmMain_DragEnter);\r
+            this.DragDrop += new DragEventHandler(frmMain_DragDrop);\r
+        }\r
+\r
+        // Change the preset label to custom when a user changes a setting. Don't want to give the impression that users can change settings and still be using a preset\r
+        private void RegisterPresetEventHandler()\r
+        {\r
+            // Output Settings\r
+            drop_format.SelectedIndexChanged += new EventHandler(changePresetLabel);\r
+            check_largeFile.CheckedChanged += new EventHandler(changePresetLabel);\r
+            check_iPodAtom.CheckedChanged += new EventHandler(changePresetLabel);\r
+            check_optimiseMP4.CheckedChanged += new EventHandler(changePresetLabel);\r
+\r
+            // Picture Settings\r
+            //PictureSettings.PictureSettingsChanged += new EventHandler(changePresetLabel);\r
+\r
+            // Filter Settings\r
+            Filters.FilterSettingsChanged += new EventHandler(changePresetLabel);\r
+\r
+            // Video Tab\r
+            drp_videoEncoder.SelectedIndexChanged += new EventHandler(changePresetLabel);\r
+            check_2PassEncode.CheckedChanged += new EventHandler(changePresetLabel);\r
+            check_turbo.CheckedChanged += new EventHandler(changePresetLabel);\r
+            text_filesize.TextChanged += new EventHandler(changePresetLabel);\r
+            text_bitrate.TextChanged += new EventHandler(changePresetLabel);\r
+            slider_videoQuality.ValueChanged += new EventHandler(changePresetLabel);\r
+\r
+            // Audio Panel\r
+            AudioSettings.AudioListChanged += new EventHandler(changePresetLabel);\r
+\r
+            // Advanced Tab\r
+            x264Panel.rtf_x264Query.TextChanged += new EventHandler(changePresetLabel);\r
+        }\r
+        private void UnRegisterPresetEventHandler()\r
+        {\r
+            // Output Settings \r
+            drop_format.SelectedIndexChanged -= new EventHandler(changePresetLabel);\r
+            check_largeFile.CheckedChanged -= new EventHandler(changePresetLabel);\r
+            check_iPodAtom.CheckedChanged -= new EventHandler(changePresetLabel);\r
+            check_optimiseMP4.CheckedChanged -= new EventHandler(changePresetLabel);\r
+\r
+            // Picture Settings\r
+            //PictureSettings.PictureSettingsChanged -= new EventHandler(changePresetLabel);\r
+\r
+            // Filter Settings\r
+            Filters.FilterSettingsChanged -= new EventHandler(changePresetLabel);\r
+\r
+            // Video Tab\r
+            drp_videoEncoder.SelectedIndexChanged -= new EventHandler(changePresetLabel);\r
+            check_2PassEncode.CheckedChanged -= new EventHandler(changePresetLabel);\r
+            check_turbo.CheckedChanged -= new EventHandler(changePresetLabel);\r
+            text_filesize.TextChanged -= new EventHandler(changePresetLabel);\r
+            text_bitrate.TextChanged -= new EventHandler(changePresetLabel);\r
+            slider_videoQuality.ValueChanged -= new EventHandler(changePresetLabel);\r
+\r
+            // Audio Panel\r
+            AudioSettings.AudioListChanged -= new EventHandler(changePresetLabel);\r
+\r
+            // Advanced Tab\r
+            x264Panel.rtf_x264Query.TextChanged -= new EventHandler(changePresetLabel);\r
+        }\r
+        private void changePresetLabel(object sender, EventArgs e)\r
+        {\r
+            labelPreset.Text = "Output Settings (Preset: Custom)";\r
+        }\r
+\r
+        private static void frmMain_DragEnter(object sender, DragEventArgs e)\r
+        {\r
+            if (e.Data.GetDataPresent(DataFormats.FileDrop, false))\r
+                e.Effect = DragDropEffects.All;\r
+        }\r
+        private void frmMain_DragDrop(object sender, DragEventArgs e)\r
+        {\r
+            string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];\r
+            sourcePath = string.Empty;\r
+\r
+            if (fileList != null)\r
+            {\r
+                if (fileList[0].StartsWith("\\"))\r
+                {\r
+                    MessageBox.Show(\r
+                        "Sorry, HandBrake does not support UNC file paths. \nTry mounting the network share as a network drive in My Computer",\r
+                        "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                    UpdateSourceLabel();\r
+                }\r
+                else\r
+                {\r
+                    if (fileList[0] != "")\r
+                        startScan(fileList[0]);\r
+                    else\r
+                        UpdateSourceLabel();\r
+                }\r
+            }\r
+            else\r
+                UpdateSourceLabel();\r
         }\r
         private void encodeStarted(object sender, EventArgs e)\r
         {\r
-            setLastAction("encode");\r
+            lastAction = "encode";\r
             setEncodeStarted();\r
+\r
+            // Experimental HBProc Process Monitoring.\r
+            if (Properties.Settings.Default.enocdeStatusInGui)\r
+            {\r
+                Thread encodeMon = new Thread(encodeMonitorThread);\r
+                encodeMon.Start();\r
+            }\r
         }\r
         private void encodeEnded(object sender, EventArgs e)\r
         {\r
@@ -211,7 +339,7 @@ namespace Handbrake
         #region File Menu\r
         private void mnu_killCLI_Click(object sender, EventArgs e)\r
         {\r
-            killCLI();\r
+            killScan();\r
         }\r
         private void mnu_exit_Click(object sender, EventArgs e)\r
         {\r
@@ -222,34 +350,29 @@ namespace Handbrake
         #region Tools Menu\r
         private void mnu_encode_Click(object sender, EventArgs e)\r
         {\r
-            queueWindow.setQueue();\r
             queueWindow.Show();\r
         }\r
         private void mnu_encodeLog_Click(object sender, EventArgs e)\r
         {\r
-            String file;\r
-            if (lastAction == "scan")\r
-                file = "dvdinfo.dat";\r
-            else\r
-                file = "hb_encode_log.dat";\r
+            String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";\r
 \r
-            frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);\r
+            frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeQueue, this);\r
             dvdInfoWindow.Show();\r
         }\r
         private void mnu_options_Click(object sender, EventArgs e)\r
         {\r
-            Form Options = new frmOptions();\r
-            Options.ShowDialog();\r
+            Form options = new frmOptions(this);\r
+            options.ShowDialog();\r
         }\r
         #endregion\r
 \r
         #region Presets Menu\r
         private void mnu_presetReset_Click(object sender, EventArgs e)\r
         {\r
-            presetHandler.updateBuiltInPresets();\r
+            presetHandler.UpdateBuiltInPresets();\r
             loadPresetPanel();\r
             if (treeView_presets.Nodes.Count == 0)\r
-                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
+                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
             else\r
                 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
 \r
@@ -257,40 +380,21 @@ namespace Handbrake
         }\r
         private void mnu_delete_preset_Click(object sender, EventArgs e)\r
         {\r
-            // Empty the preset file\r
-            string presetsFile = Application.StartupPath + "\\presets.xml";\r
-            if (File.Exists(presetsFile))\r
-                File.Delete(presetsFile);\r
-\r
-            try\r
-            {\r
-                FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);\r
-                strm.Close();\r
-                strm.Dispose();\r
-            }\r
-            catch (Exception exc)\r
-            {\r
-                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
-            }\r
-\r
-            // Reload the preset panel\r
-            loadPresetPanel();\r
+            presetHandler.RemoveBuiltInPresets();\r
+            loadPresetPanel(); // Reload the preset panel\r
         }\r
         private void mnu_SelectDefault_Click(object sender, EventArgs e)\r
         {\r
             loadNormalPreset();\r
         }\r
+        private void mnu_importMacPreset_Click(object sender, EventArgs e)\r
+        {\r
+            importPreset();\r
+        }\r
         private void btn_new_preset_Click(object sender, EventArgs e)\r
         {\r
-            // Remember each nodes expanded status so we can reload it\r
-            List<Boolean> nodeStatus = saveTreeViewState();\r
-            nodeStatus.Add(true);\r
-\r
-            Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);\r
+            Form preset = new frmAddPreset(this, queryGen.GenerateCLIQuery(this, 0, null), presetHandler);\r
             preset.ShowDialog();\r
-\r
-            // Now reload the TreeView states\r
-            loadTreeViewStates(nodeStatus);\r
         }\r
         #endregion\r
 \r
@@ -309,27 +413,45 @@ namespace Handbrake
         }\r
         private void mnu_UpdateCheck_Click(object sender, EventArgs e)\r
         {\r
-            Boolean update = hb_common_func.updateCheck(true);\r
-            if (update == true)\r
+            lbl_updateCheck.Visible = true;\r
+            Main.BeginCheckForUpdates(new AsyncCallback(updateCheckDoneMenu), false);\r
+        }\r
+        private void updateCheckDoneMenu(IAsyncResult result)\r
+        {\r
+            // Make sure it's running on the calling thread\r
+            if (InvokeRequired)\r
             {\r
-                frmUpdater updateWindow = new frmUpdater();\r
-                updateWindow.Show();\r
+                Invoke(new MethodInvoker(() => updateCheckDoneMenu(result)));\r
+                return;\r
+            }\r
+            UpdateCheckInformation info;\r
+            try\r
+            {\r
+                // Get the information about the new build, if any, and close the window\r
+                info = Main.EndCheckForUpdates(result);\r
+\r
+                if (info.NewVersionAvailable && info.BuildInformation != null)\r
+                {\r
+                    frmUpdater updateWindow = new frmUpdater(info.BuildInformation);\r
+                    updateWindow.ShowDialog();\r
+                }\r
+                else\r
+                    MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
+                lbl_updateCheck.Visible = false;\r
+                return;\r
+            }\r
+            catch (Exception ex)\r
+            {\r
+                if ((bool)result.AsyncState)\r
+                    MessageBox.Show("Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
             }\r
-            else\r
-                MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
         }\r
         private void mnu_about_Click(object sender, EventArgs e)\r
         {\r
-            Form About = new frmAbout();\r
-            About.ShowDialog();\r
-        }\r
-        #endregion\r
-\r
-        #region Debug Menu\r
-        private void mnu_qptest_Click(object sender, EventArgs e)\r
-        {\r
-            QueryParserTester qptest = new QueryParserTester();\r
-            qptest.Show();\r
+            using (frmAbout About = new frmAbout())\r
+            {\r
+                About.ShowDialog();\r
+            }\r
         }\r
         #endregion\r
 \r
@@ -343,28 +465,24 @@ namespace Handbrake
         {\r
             treeView_presets.CollapseAll();\r
         }\r
+        private void pmnu_import_Click(object sender, EventArgs e)\r
+        {\r
+            importPreset();\r
+        }\r
         private void pmnu_saveChanges_Click(object sender, EventArgs e)\r
         {\r
             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
             if (result == DialogResult.Yes)\r
-                presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);\r
+                presetHandler.Update(treeView_presets.SelectedNode.Text, QueryGenerator.GenerateTabbedComponentsQuery(this), true);\r
             else if (result == DialogResult.No)\r
-                presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);\r
+                presetHandler.Update(treeView_presets.SelectedNode.Text, QueryGenerator.GenerateTabbedComponentsQuery(this), false);\r
         }\r
         private void pmnu_delete_click(object sender, EventArgs e)\r
         {\r
             if (treeView_presets.SelectedNode != null)\r
             {\r
-                presetHandler.remove(treeView_presets.SelectedNode.Text);\r
-\r
-                // Remember each nodes expanded status so we can reload it\r
-                List<Boolean> nodeStatus = saveTreeViewState();\r
-\r
-                // Now reload the preset panel\r
-                loadPresetPanel();\r
-\r
-                // Now reload the TreeView states\r
-                loadTreeViewStates(nodeStatus);\r
+                presetHandler.Remove(treeView_presets.SelectedNode.Text);\r
+                treeView_presets.Nodes.Remove(treeView_presets.SelectedNode);\r
             }\r
             treeView_presets.Select();\r
         }\r
@@ -375,28 +493,17 @@ namespace Handbrake
 \r
             // Now enable the save menu if the selected preset is a user preset\r
             if (treeView_presets.SelectedNode != null)\r
-            {\r
-                if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))\r
-                {\r
+                if (presetHandler.CheckIfUserPresetExists(treeView_presets.SelectedNode.Text))\r
                     pmnu_saveChanges.Enabled = true;\r
-                }\r
-            }\r
+\r
             treeView_presets.Select();\r
         }\r
 \r
         // Presets Management\r
         private void btn_addPreset_Click(object sender, EventArgs e)\r
         {\r
-            // Remember each nodes expanded status so we can reload it\r
-            List<Boolean> nodeStatus = saveTreeViewState();\r
-            nodeStatus.Add(true);\r
-\r
-            // Now add the new preset\r
-            Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);\r
+            Form preset = new frmAddPreset(this, QueryGenerator.GenerateTabbedComponentsQuery(this), presetHandler);\r
             preset.ShowDialog();\r
-\r
-            // Now reload the TreeView states\r
-            loadTreeViewStates(nodeStatus);\r
         }\r
         private void btn_removePreset_Click(object sender, EventArgs e)\r
         {\r
@@ -404,16 +511,10 @@ namespace Handbrake
             if (result == DialogResult.Yes)\r
             {\r
                 if (treeView_presets.SelectedNode != null)\r
-                    presetHandler.remove(treeView_presets.SelectedNode.Text);\r
-\r
-                // Remember each nodes expanded status so we can reload it\r
-                List<Boolean> nodeStatus = saveTreeViewState();\r
-\r
-                // Now reload the preset panel\r
-                loadPresetPanel();\r
-\r
-                // Now reload the TreeView states\r
-                loadTreeViewStates(nodeStatus);\r
+                {\r
+                    presetHandler.Remove(treeView_presets.SelectedNode.Text);\r
+                    treeView_presets.Nodes.Remove(treeView_presets.SelectedNode);\r
+                }\r
             }\r
             treeView_presets.Select();\r
         }\r
@@ -440,7 +541,7 @@ namespace Handbrake
             {\r
                 if (treeView_presets.GetNodeAt(e.Location) != null)\r
                 {\r
-                    if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))\r
+                    if (labelPreset.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))\r
                         selectPreset();\r
                 }\r
             }\r
@@ -451,42 +552,6 @@ namespace Handbrake
         {\r
             selectPreset();\r
         }\r
-        private void selectPreset()\r
-        {\r
-            if (treeView_presets.SelectedNode != null)\r
-            {\r
-                // Ok, so, we've selected a preset. Now we want to load it.\r
-                string presetName = treeView_presets.SelectedNode.Text;\r
-                if (presetHandler.getPreset(presetName) != null)\r
-                {\r
-                    string query = presetHandler.getPreset(presetName).Query;\r
-                    Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;\r
-\r
-                    if (query != null)\r
-                    {\r
-                        //Ok, Reset all the H264 widgets before changing the preset\r
-                        x264Panel.reset2Defaults();\r
-\r
-                        // Send the query from the file to the Query Parser class\r
-                        Functions.QueryParser presetQuery = QueryParser.Parse(query);\r
-\r
-                        // Now load the preset\r
-                        presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);\r
-\r
-                        // The x264 widgets will need updated, so do this now:\r
-                        x264Panel.X264_StandardizeOptString();\r
-                        x264Panel.X264_SetCurrentSettingsInPanel();\r
-\r
-                        if (maxWidth != 0 && maxHeight != 0)\r
-                            lbl_max.Text = "Max Width / Height";\r
-                        else if (maxWidth != 0)\r
-                            lbl_max.Text = "Max Width";\r
-                        else\r
-                            lbl_max.Text = "";\r
-                    }\r
-                }\r
-            }\r
-        }\r
         private void treeView_presets_deleteKey(object sender, KeyEventArgs e)\r
         {\r
             if (e.KeyCode == Keys.Delete)\r
@@ -495,7 +560,7 @@ namespace Handbrake
                 if (result == DialogResult.Yes)\r
                 {\r
                     if (treeView_presets.SelectedNode != null)\r
-                        presetHandler.remove(treeView_presets.SelectedNode.Text);\r
+                        presetHandler.Remove(treeView_presets.SelectedNode.Text);\r
 \r
                     // Remember each nodes expanded status so we can reload it\r
                     List<Boolean> nodeStatus = new List<Boolean>();\r
@@ -517,40 +582,37 @@ namespace Handbrake
                 }\r
             }\r
         }\r
-        private List<Boolean> saveTreeViewState()\r
-        {\r
-            // Remember each nodes expanded status so we can reload it\r
-            List<Boolean> nodeStatus = new List<Boolean>();\r
-            foreach (TreeNode node in treeView_presets.Nodes)\r
-            {\r
-                nodeStatus.Add(node.IsExpanded);\r
-                foreach (TreeNode subNode in node.Nodes)\r
-                    nodeStatus.Add(node.IsExpanded);\r
-            }\r
-            return nodeStatus;\r
-        }\r
-        private void loadTreeViewStates(List<Boolean> nodeStatus)\r
+        private void selectPreset()\r
         {\r
-            // And finally, re-expand any of the nodes if required\r
-            int i = 0;\r
-            foreach (TreeNode node in treeView_presets.Nodes)\r
+            if (treeView_presets.SelectedNode != null)\r
             {\r
-                if (nodeStatus[i])\r
-                    node.Expand();\r
-\r
-                foreach (TreeNode subNode in node.Nodes)\r
+                // Ok, so, we've selected a preset. Now we want to load it.\r
+                string presetName = treeView_presets.SelectedNode.Text;\r
+                if (presetHandler.GetPreset(presetName) != null)\r
                 {\r
-                    if (nodeStatus[i])\r
-                        subNode.Expand();\r
-                }\r
+                    string query = presetHandler.GetPreset(presetName).Query;\r
+                    Boolean loadPictureSettings = presetHandler.GetPreset(presetName).PictureSettings;\r
+\r
+                    if (query != null)\r
+                    {\r
+                        //Ok, Reset all the H264 widgets before changing the preset\r
+                        x264Panel.reset2Defaults();\r
+\r
+                        // Send the query from the file to the Query Parser class\r
+                        QueryParser presetQuery = QueryParser.Parse(query);\r
+\r
+                        // Now load the preset\r
+                        PresetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);\r
 \r
-                i++;\r
+                        // The x264 widgets will need updated, so do this now:\r
+                        x264Panel.X264_StandardizeOptString();\r
+                        x264Panel.X264_SetCurrentSettingsInPanel();\r
+                    }\r
+                }\r
             }\r
         }\r
         private void loadNormalPreset()\r
         {\r
-            treeView_presets.Nodes.Find("Normal", true);\r
-\r
             foreach (TreeNode treenode in treeView_presets.Nodes)\r
             {\r
                 foreach (TreeNode node in treenode.Nodes)\r
@@ -560,39 +622,59 @@ namespace Handbrake
                 }\r
             }\r
         }\r
+        private void importPreset()\r
+        {\r
+            Import imp = new Import();\r
+            if (openPreset.ShowDialog() == DialogResult.OK)\r
+            {\r
+                QueryParser parsed = imp.importMacPreset(openPreset.FileName);\r
+                if (presetHandler.CheckIfUserPresetExists(parsed.PresetName + " (Imported)"))\r
+                {\r
+                    DialogResult result = MessageBox.Show("This preset appears to already exist. Would you like to overwrite it?", "Overwrite preset?",\r
+                                                           MessageBoxButtons.YesNo, MessageBoxIcon.Warning);\r
+                    if (result == DialogResult.Yes)\r
+                    {\r
+                        PresetLoader.presetLoader(this, parsed, parsed.PresetName, parsed.UsesPictureSettings);\r
+                        presetHandler.Update(parsed.PresetName + " (Imported)", queryGen.GenerateCLIQuery(this, 0, null),\r
+                                                   parsed.UsesPictureSettings);\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    PresetLoader.presetLoader(this, parsed, parsed.PresetName, parsed.UsesPictureSettings);\r
+                    presetHandler.Add(parsed.PresetName, queryGen.GenerateCLIQuery(this, 0, null), parsed.UsesPictureSettings);\r
+\r
+                    if (presetHandler.Add(parsed.PresetName + " (Imported)", queryGen.GenerateCLIQuery(this, 0, null), parsed.UsesPictureSettings))\r
+                    {\r
+                        TreeNode preset_treeview = new TreeNode(parsed.PresetName + " (Imported)") { ForeColor = Color.Black };\r
+                        treeView_presets.Nodes.Add(preset_treeview);\r
+                    }\r
+                }\r
+            }\r
+        }\r
         #endregion\r
 \r
         #region ToolStrip\r
         private void btn_source_Click(object sender, EventArgs e)\r
         {\r
-            if (Properties.Settings.Default.drive_detection == "Checked")\r
-            {\r
-                mnu_dvd_drive.Visible = true;\r
-                Thread driveInfoThread = new Thread(getDriveInfoThread);\r
-                driveInfoThread.Start();\r
-            }\r
-            else\r
-                mnu_dvd_drive.Visible = false;\r
+            mnu_dvd_drive.Visible = true;\r
+            Thread driveInfoThread = new Thread(getDriveInfoThread);\r
+            driveInfoThread.Start();\r
         }\r
         private void btn_start_Click(object sender, EventArgs e)\r
         {\r
             if (btn_start.Text == "Stop")\r
             {\r
-                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
+                DialogResult result = MessageBox.Show("Are you sure you wish to cancel the encode?", "Cancel Encode?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
 \r
                 if (result == DialogResult.Yes)\r
                 {\r
                     // Pause The Queue\r
-                    encodeQueue.pauseEncode();\r
+                    encodeQueue.RequestPause();\r
 \r
-                    // Kill the current process.\r
-                    Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");\r
-                    Process HandBrakeCLI;\r
-                    if (aProc.Length > 0)\r
-                    {\r
-                        HandBrakeCLI = aProc[0];\r
-                        HandBrakeCLI.Kill();\r
-                    }\r
+                    // Allow the CLI to exit cleanly\r
+                    Win32.SetForegroundWindow((int)encodeQueue.processHandle);\r
+                    SendKeys.Send("^C");\r
 \r
                     // Update the GUI\r
                     setEncodeFinished();\r
@@ -600,44 +682,95 @@ namespace Handbrake
             }\r
             else\r
             {\r
-                if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))\r
+                if (encodeQueue.Count != 0 || (!string.IsNullOrEmpty(sourcePath) && !string.IsNullOrEmpty(text_destination.Text)))\r
                 {\r
-                    // Set the last action to encode. \r
-                    // This is used for tracking which file to load in the activity window\r
-                    lastAction = "encode";\r
-\r
-                    String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);\r
+                    string generatedQuery = queryGen.GenerateCLIQuery(this, 0, null);\r
+                    string specifiedQuery = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateCLIQuery(this, 0, null);\r
+                    string query = string.Empty;\r
 \r
-                    if (encodeQueue.count() == 0)\r
+                    // Check to make sure the generated query matches the GUI settings\r
+                    if (Properties.Settings.Default.PromptOnUnmatchingQueries && !string.IsNullOrEmpty(specifiedQuery) && generatedQuery != specifiedQuery)\r
+                    {\r
+                        DialogResult result = MessageBox.Show("The query under the \"Query Editor\" tab " +\r
+                            "does not match the current GUI settings. Because the manual query takes " +\r
+                            "priority over the GUI, your recently updated settings will not be taken " +\r
+                            "into account when encoding this job." + Environment.NewLine + Environment.NewLine +\r
+                            "Do you want to replace the manual query with the GUI-generated query?",\r
+                            "Manual Query does not Match GUI",\r
+                            MessageBoxButtons.YesNoCancel, MessageBoxIcon.Asterisk,\r
+                            MessageBoxDefaultButton.Button3);\r
+\r
+                        switch (result)\r
+                        {\r
+                            case DialogResult.Yes:\r
+                                // Replace the manual query with the generated one\r
+                                query = generatedQuery;\r
+                                rtf_query.Text = generatedQuery;\r
+                                break;\r
+                            case DialogResult.No:\r
+                                // Use the manual query\r
+                                query = specifiedQuery;\r
+                                break;\r
+                            case DialogResult.Cancel:\r
+                                // Don't start the encode\r
+                                return;\r
+                        }\r
+                    }\r
+                    else\r
                     {\r
-                        encodeQueue.add(query, text_source.Text, text_destination.Text);\r
-                        encodeQueue.write2disk("hb_queue_recovery.xml");\r
+                        query = generatedQuery;\r
                     }\r
-                    queueWindow.setQueue();\r
-                    if (encodeQueue.count() > 1)\r
-                        queueWindow.Show(false);\r
 \r
-                    setEncodeStarted(); // Encode is running, so setup the GUI appropriately\r
-                    encodeQueue.startEncode(); // Start The Queue Encoding Process\r
+                    DialogResult overwrite = DialogResult.Yes;\r
+                    if (text_destination.Text != "")\r
+                        if (File.Exists(text_destination.Text))\r
+                            overwrite = MessageBox.Show("The destination file already exists. Are you sure you want to overwrite it?", "Overwrite File?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
 \r
-                }\r
-                else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)\r
-                    MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                    if (overwrite == DialogResult.Yes)\r
+                    {\r
+                        if (encodeQueue.Count == 0)\r
+                            encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));\r
+\r
+                        queueWindow.setQueue();\r
+                        if (encodeQueue.Count > 1)\r
+                            queueWindow.Show(false);\r
 \r
+                        setEncodeStarted(); // Encode is running, so setup the GUI appropriately\r
+                        encodeQueue.StartEncodeQueue(); // Start The Queue Encoding Process\r
+                        lastAction = "encode";   // Set the last action to encode - Used for activity window.\r
+\r
+                        if (ActivityWindow != null)\r
+                            ActivityWindow.SetLogView(false);\r
+\r
+                    }\r
+                    this.Focus();\r
+                }\r
+                else if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))\r
+                    MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
             }\r
         }\r
         private void btn_add2Queue_Click(object sender, EventArgs e)\r
         {\r
-            if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)\r
-                MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+            if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))\r
+                MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
             else\r
             {\r
-                String query = queryGen.GenerateTheQuery(this);\r
+                String query = queryGen.GenerateCLIQuery(this, 0, null);\r
                 if (rtf_query.Text != "")\r
                     query = rtf_query.Text;\r
 \r
-                encodeQueue.add(query, text_source.Text, text_destination.Text);\r
-                encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.\r
+                if (encodeQueue.CheckForDestinationDuplicate(text_destination.Text))\r
+                {\r
+                    DialogResult result = MessageBox.Show("There is already a queue item for this destination path. \n\n If you continue, the encode will be overwritten. Do you wish to continue?",\r
+                  "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);\r
+                    if (result == DialogResult.Yes)\r
+                        encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));\r
+\r
+                }\r
+                else\r
+                    encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));\r
+\r
+                lbl_encode.Text = encodeQueue.Count + " encode(s) pending in the queue";\r
 \r
                 queueWindow.Show();\r
             }\r
@@ -649,8 +782,8 @@ namespace Handbrake
         }\r
         private void tb_preview_Click(object sender, EventArgs e)\r
         {\r
-            if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")\r
-                MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+            if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))\r
+                MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
             else\r
             {\r
                 if (qtpreview == null)\r
@@ -669,9 +802,12 @@ namespace Handbrake
         }\r
         private void btn_ActivityWindow_Click(object sender, EventArgs e)\r
         {\r
-            String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";\r
+            String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";\r
+            if (ActivityWindow == null)\r
+                ActivityWindow = new frmActivityWindow(file, encodeQueue, this);\r
+\r
+            ActivityWindow.SetLogView(!encodeQueue.isEncoding);\r
 \r
-            frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);\r
             ActivityWindow.Show();\r
         }\r
         #endregion\r
@@ -682,8 +818,6 @@ namespace Handbrake
             if (FormWindowState.Minimized == this.WindowState)\r
             {\r
                 notifyIcon.Visible = true;\r
-                notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";\r
-                notifyIcon.ShowBalloonTip(500);\r
                 this.Hide();\r
             }\r
             else if (FormWindowState.Normal == this.WindowState)\r
@@ -710,85 +844,53 @@ namespace Handbrake
         //Source\r
         private void btn_dvd_source_Click(object sender, EventArgs e)\r
         {\r
-            // Enable the creation of chapter markers.\r
-            Check_ChapterMarkers.Enabled = true;\r
-\r
-            // Set the last action to scan. \r
-            // This is used for tracking which file to load in the activity window\r
-            lastAction = "scan";\r
-            text_source.Text = "";\r
-\r
             if (DVD_Open.ShowDialog() == DialogResult.OK)\r
             {\r
-                String filename = DVD_Open.SelectedPath;\r
-\r
-                if (filename.StartsWith("\\"))\r
-                    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
-                else\r
-                {\r
-\r
-                    if (filename != "")\r
-                    {\r
-                        setupGUIforScan(filename);\r
-                        startScan(filename);\r
-                    }\r
-                    else\r
-                        text_source.Text = "Click 'Source' to continue";\r
-                }\r
+                this.selectedSourceType = SourceType.Folder;\r
+                selectSource(DVD_Open.SelectedPath);\r
             }\r
             else\r
-                text_source.Text = "Click 'Source' to continue";\r
+                UpdateSourceLabel();\r
         }\r
         private void btn_file_source_Click(object sender, EventArgs e)\r
         {\r
-            // Set the last action to scan. \r
-            // This is used for tracking which file to load in the activity window\r
-            lastAction = "scan";\r
-            text_source.Text = "";\r
-\r
             if (ISO_Open.ShowDialog() == DialogResult.OK)\r
             {\r
-                String filename = ISO_Open.FileName;\r
-                if (filename.StartsWith("\\"))\r
-                    MessageBox.Show(\r
-                        "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",\r
-                        "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
-                else\r
-                {\r
-                    if (filename != "")\r
-                    {\r
-                        setupGUIforScan(filename);\r
-                        startScan(filename);\r
-                    }\r
-                    else\r
-                        text_source.Text = "Click 'Source' to continue";\r
-                }\r
+                this.selectedSourceType = SourceType.VideoFile;\r
+                selectSource(ISO_Open.FileName);\r
             }\r
             else\r
-                text_source.Text = "Click 'Source' to continue";\r
+                UpdateSourceLabel();\r
         }\r
         private void mnu_dvd_drive_Click(object sender, EventArgs e)\r
         {\r
-            // Enable the creation of chapter markers.\r
+            if (this.dvdDrivePath == null) return;\r
+            this.selectedSourceType = SourceType.DvdDrive;\r
+            selectSource(this.dvdDrivePath);\r
+        }\r
+        private void selectSource(string file)\r
+        {\r
             Check_ChapterMarkers.Enabled = true;\r
-\r
-            // Set the last action to scan. \r
-            // This is used for tracking which file to load in the activity window\r
             lastAction = "scan";\r
+            sourcePath = string.Empty;\r
 \r
-            if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))\r
+            if (file == string.Empty) // Must have a file or path\r
             {\r
-                string[] path = mnu_dvd_drive.Text.Split(' ');\r
-                String filename = path[0];\r
-                setupGUIforScan(filename);\r
-                startScan(filename);\r
+                UpdateSourceLabel();\r
+                return;\r
             }\r
 \r
-            // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.\r
-            if (drp_dvdtitle.Items.Count == 0)\r
-                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
+            if (file.StartsWith("\\")) // NO UNC Paths\r
+            {\r
+                MessageBox.Show(\r
+                    "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",\r
+                    "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                UpdateSourceLabel();\r
+                return;\r
+            }\r
 \r
-            lbl_encode.Text = "";\r
+            sourcePath = Path.GetFileName(file);\r
+            startScan(file);\r
         }\r
         private void drp_dvdtitle_Click(object sender, EventArgs e)\r
         {\r
@@ -797,9 +899,9 @@ namespace Handbrake
         }\r
         private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
-            // Reset some values on the form\r
-            lbl_Aspect.Text = "Select a Title";\r
-            //lbl_RecomendedCrop.Text = "Select a Title";\r
+            UnRegisterPresetEventHandler();\r
+\r
+            PictureSettings.lbl_Aspect.Text = "Select a Title"; // Reset some values on the form\r
             drop_chapterStart.Items.Clear();\r
             drop_chapterFinish.Items.Clear();\r
 \r
@@ -807,18 +909,25 @@ namespace Handbrake
             // Otheriwse if its not, title data has to be loased from parsing.\r
             if (drp_dvdtitle.Text != "Automatic")\r
             {\r
-                selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;\r
-\r
-                // Set the Aspect Ratio\r
-                lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();\r
-                lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;\r
+                selectedTitle = drp_dvdtitle.SelectedItem as Title;\r
                 lbl_duration.Text = selectedTitle.Duration.ToString();\r
+                PictureSettings.Source = selectedTitle;  // Setup Picture Settings Tab Control\r
 \r
-                // Set the Recommended Cropping values\r
-                text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();\r
-                text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();\r
-                text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();\r
-                text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();\r
+                // Populate the Angles dropdown\r
+                drop_angle.Items.Clear();\r
+                if (Properties.Settings.Default.dvdnav)\r
+                {\r
+                    drop_angle.Visible = true;\r
+                    lbl_angle.Visible = true;\r
+                    drop_angle.Items.AddRange(selectedTitle.Angles.ToArray());\r
+                    if (drop_angle.Items.Count != 0)\r
+                        drop_angle.SelectedIndex = 0;\r
+                }\r
+                else\r
+                {\r
+                    drop_angle.Visible = false;\r
+                    lbl_angle.Visible = false;\r
+                }\r
 \r
                 // Populate the Start chapter Dropdown\r
                 drop_chapterStart.Items.Clear();\r
@@ -833,102 +942,111 @@ namespace Handbrake
                     drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();\r
 \r
                 // Populate the Audio Channels Dropdown\r
-                drp_track1Audio.Items.Clear();\r
-                drp_track1Audio.Items.Add("Automatic");\r
-                drp_track1Audio.Items.Add("None");\r
-                drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
-                drp_track1Audio.SelectedIndex = 0;\r
+                AudioSettings.SetTrackList(selectedTitle);\r
 \r
                 // Populate the Subtitles dropdown\r
-                drp_subtitle.Items.Clear();\r
-                drp_subtitle.Items.Add("None");\r
-                drp_subtitle.Items.Add("Autoselect");\r
-                drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());\r
-                if (drp_subtitle.Items.Count > 0)\r
-                    drp_subtitle.Text = drp_subtitle.Items[0].ToString();\r
-\r
+                Subtitles.drp_subtitleTracks.Items.Clear();\r
+                Subtitles.drp_subtitleTracks.Items.Add("Foreign Audio Search (Bitmap)");\r
+                Subtitles.drp_subtitleTracks.Items.AddRange(selectedTitle.Subtitles.ToArray());\r
+                Subtitles.drp_subtitleTracks.SelectedIndex = 0;\r
+                Subtitles.Clear();\r
+                Subtitles.setSubtitleTrackAuto();\r
             }\r
 \r
             // Run the autoName & chapterNaming functions\r
-            if (Properties.Settings.Default.autoNaming == "Checked")\r
+            if (Properties.Settings.Default.autoNaming)\r
             {\r
-                string autoPath = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);\r
+                string autoPath = Main.autoName(this);\r
                 if (autoPath != null)\r
                     text_destination.Text = autoPath;\r
                 else\r
-                    MessageBox.Show("You currently have automatic file naming enabled for the destination box, but you do not have a default direcotry set. You should set this in the program options (see Tools Menu)","Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                    MessageBox.Show("You currently have \"Automatically name output files\" enabled for the destination file box, but you do not have a default directory set.\n\nYou should set a \"Default Path\" in HandBrakes preferences. (See 'Tools' menu -> 'Options' -> 'General' Tab -> 'Default Path')", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
             }\r
 \r
             data_chpt.Rows.Clear();\r
-            DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);\r
-            if (chapterGridView != null)\r
-                data_chpt = chapterGridView;\r
-\r
-            // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.\r
-            data_chpt.Columns[0].Width = 166;\r
-            data_chpt.Columns[0].Width = 165;\r
-        }\r
-        private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            int c_start, c_end;\r
-\r
-            if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)\r
-                drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;\r
-\r
-            int.TryParse(drop_chapterStart.Text, out c_start);\r
-            int.TryParse(drop_chapterFinish.Text, out c_end);\r
-\r
-            if (c_end != 0)\r
+            if (selectedTitle.Chapters.Count != 1)\r
+            {\r
+                DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);\r
+                if (chapterGridView != null)\r
+                    data_chpt = chapterGridView;\r
+            }\r
+            else\r
             {\r
-                if (c_start > c_end)\r
-                    drop_chapterFinish.Text = c_start.ToString();\r
+                Check_ChapterMarkers.Checked = false;\r
+                Check_ChapterMarkers.Enabled = false;\r
             }\r
 \r
-            lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();\r
-\r
-            // Run the Autonaming function\r
-            if (Properties.Settings.Default.autoNaming == "Checked")\r
-                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
+            // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.\r
+            data_chpt.Columns[0].Width = 166;\r
+            data_chpt.Columns[0].Width = 165;\r
 \r
+            RegisterPresetEventHandler();\r
         }\r
-        private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)\r
+        private void chapersChanged(object sender, EventArgs e)\r
         {\r
-            int c_start, c_end;\r
+            Control ctl = (Control)sender;\r
+            int chapterStart, chapterEnd;\r
+            int.TryParse(drop_chapterStart.Text, out chapterStart);\r
+            int.TryParse(drop_chapterFinish.Text, out chapterEnd);\r
 \r
-            if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)\r
-                drop_chapterStart.SelectedIndex = 1;\r
+            switch (ctl.Name)\r
+            {\r
+                case "drop_chapterStart":\r
+                    if (drop_chapterFinish.SelectedIndex == -1 && drop_chapterFinish.Items.Count != 0)\r
+                        drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;\r
 \r
-            int.TryParse(drop_chapterStart.Text, out c_start);\r
-            int.TryParse(drop_chapterFinish.Text, out c_end);\r
+                    if (chapterEnd != 0)\r
+                        if (chapterStart > chapterEnd)\r
+                            drop_chapterFinish.Text = chapterStart.ToString();\r
+                    break;\r
+                case "drop_chapterFinish":\r
+                    if (drop_chapterStart.Items.Count >= 1 && drop_chapterStart.SelectedIndex == -1)\r
+                        drop_chapterStart.SelectedIndex = 0;\r
 \r
-            if (c_start != 0)\r
-            {\r
-                if (c_end < c_start)\r
-                    drop_chapterFinish.Text = c_start.ToString();\r
+                    if (chapterStart != 0)\r
+                        if (chapterEnd < chapterStart)\r
+                            drop_chapterFinish.Text = chapterStart.ToString();\r
+\r
+                    // Add more rows to the Chapter menu if needed.\r
+                    if (Check_ChapterMarkers.Checked)\r
+                    {\r
+                        int i = data_chpt.Rows.Count, finish = 0;\r
+                        int.TryParse(drop_chapterFinish.Text, out finish);\r
+\r
+                        while (i < finish)\r
+                        {\r
+                            int n = data_chpt.Rows.Add();\r
+                            data_chpt.Rows[n].Cells[0].Value = (i + 1);\r
+                            data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);\r
+                            data_chpt.Rows[n].Cells[0].ValueType = typeof(int);\r
+                            data_chpt.Rows[n].Cells[1].ValueType = typeof(string);\r
+                            i++;\r
+                        }\r
+                    }\r
+                    break;\r
             }\r
 \r
-            lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();\r
+            // Update the Duration\r
+            lbl_duration.Text = Main.calculateDuration(drop_chapterStart.SelectedIndex, drop_chapterFinish.SelectedIndex, selectedTitle).ToString();\r
 \r
             // Run the Autonaming function\r
-            if (Properties.Settings.Default.autoNaming == "Checked")\r
-                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
+            if (Properties.Settings.Default.autoNaming)\r
+                text_destination.Text = Main.autoName(this);\r
 \r
-            // Add more rows to the Chapter menu if needed.\r
-            if (Check_ChapterMarkers.Checked)\r
+            // Disable chapter markers if only 1 chapter is selected.\r
+            if (chapterStart == chapterEnd)\r
             {\r
-                int i = data_chpt.Rows.Count, finish = 0;\r
-\r
-                if (drop_chapterFinish.Text != "Auto")\r
-                    int.TryParse(drop_chapterFinish.Text, out finish);\r
-\r
-                while (i < finish)\r
+                Check_ChapterMarkers.Enabled = false;\r
+                btn_importChapters.Enabled = false;\r
+                data_chpt.Enabled = false;\r
+            }\r
+            else\r
+            {\r
+                Check_ChapterMarkers.Enabled = true;\r
+                if (Check_ChapterMarkers.Checked)\r
                 {\r
-                    int n = data_chpt.Rows.Add();\r
-                    data_chpt.Rows[n].Cells[0].Value = (i + 1);\r
-                    data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);\r
-                    data_chpt.Rows[n].Cells[0].ValueType = typeof(int);\r
-                    data_chpt.Rows[n].Cells[1].ValueType = typeof(string);\r
-                    i++;\r
+                    btn_importChapters.Enabled = true;\r
+                    data_chpt.Enabled = true;\r
                 }\r
             }\r
         }\r
@@ -938,19 +1056,16 @@ namespace Handbrake
         {\r
             // This removes the file extension from the filename box on the save file dialog.\r
             // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.\r
-            DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");\r
+            DVD_Save.FileName = Path.GetFileNameWithoutExtension(text_destination.Text);\r
+\r
+            if (Path.IsPathRooted(text_destination.Text))\r
+                DVD_Save.InitialDirectory = Path.GetDirectoryName(text_destination.Text);\r
 \r
             // Show the dialog and set the main form file path\r
             if (drop_format.SelectedIndex.Equals(0))\r
                 DVD_Save.FilterIndex = 1;\r
             else if (drop_format.SelectedIndex.Equals(1))\r
                 DVD_Save.FilterIndex = 2;\r
-            else if (drop_format.SelectedIndex.Equals(2))\r
-                DVD_Save.FilterIndex = 3;\r
-            else if (drop_format.SelectedIndex.Equals(3))\r
-                DVD_Save.FilterIndex = 4;\r
-            else if (drop_format.SelectedIndex.Equals(4))\r
-                DVD_Save.FilterIndex = 5;\r
 \r
             if (DVD_Save.ShowDialog() == DialogResult.OK)\r
             {\r
@@ -958,75 +1073,87 @@ namespace Handbrake
                     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
                 else\r
                 {\r
-                    setAudioByContainer(DVD_Save.FileName);\r
+                    // Add a file extension manually, as FileDialog.AddExtension has issues with dots in filenames\r
+                    switch (DVD_Save.FilterIndex)\r
+                    {\r
+                        case 1:\r
+                            if (!Path.GetExtension(DVD_Save.FileName).Equals(".mp4", StringComparison.InvariantCultureIgnoreCase))\r
+                                if (Properties.Settings.Default.useM4v)\r
+                                    DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".m4v").Replace(".mkv", ".m4v");\r
+                                else\r
+                                    DVD_Save.FileName = DVD_Save.FileName.Replace(".m4v", ".mp4").Replace(".mkv", ".mp4");\r
+                            break;\r
+                        case 2:\r
+                            if (!Path.GetExtension(DVD_Save.FileName).Equals(".mkv", StringComparison.InvariantCultureIgnoreCase))\r
+                                DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".mkv").Replace(".m4v", ".mkv");\r
+                            break;\r
+                        default:\r
+                            //do nothing  \r
+                            break;\r
+                    }\r
                     text_destination.Text = DVD_Save.FileName;\r
 \r
                     // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)\r
-                    if (Check_ChapterMarkers.Checked)\r
-                        text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");\r
+                    if (Check_ChapterMarkers.Checked && DVD_Save.FilterIndex != 2)\r
+                        SetExtension(".m4v");\r
                 }\r
             }\r
         }\r
         private void text_destination_TextChanged(object sender, EventArgs e)\r
         {\r
             string path = text_destination.Text;\r
-            if (path.EndsWith(".mp4"))\r
+            if (path.EndsWith(".mp4") || path.EndsWith(".m4v"))\r
                 drop_format.SelectedIndex = 0;\r
-            else if (path.EndsWith(".m4v"))\r
-                drop_format.SelectedIndex = 1;\r
             else if (path.EndsWith(".mkv"))\r
-                drop_format.SelectedIndex = 2;\r
-            else if (path.EndsWith(".avi"))\r
-                drop_format.SelectedIndex = 3;\r
-            else if (path.EndsWith(".ogm"))\r
-                drop_format.SelectedIndex = 4;\r
-\r
+                drop_format.SelectedIndex = 1;\r
         }\r
 \r
         // Output Settings\r
         private void drop_format_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
-            if (drop_format.SelectedIndex == 0)\r
-                setExtension(".mp4");\r
-            else if (drop_format.SelectedIndex == 1)\r
-                setExtension(".m4v");\r
-            else if (drop_format.SelectedIndex == 2)\r
-                setExtension(".mkv");\r
-            else if (drop_format.SelectedIndex == 3)\r
-                setExtension(".avi");\r
-            else if (drop_format.SelectedIndex == 4)\r
-                setExtension(".ogm");\r
+            switch (drop_format.SelectedIndex)\r
+            {\r
+                case 0:\r
+                    if (Properties.Settings.Default.useM4v || Check_ChapterMarkers.Checked || AudioSettings.RequiresM4V() || Subtitles.RequiresM4V())\r
+                        SetExtension(".m4v");\r
+                    else\r
+                        SetExtension(".mp4");\r
+                    break;\r
+                case 1:\r
+                    SetExtension(".mkv");\r
+                    break;\r
+            }\r
+\r
+            AudioSettings.SetContainer(drop_format.Text);\r
+            Subtitles.setContainer(drop_format.SelectedIndex);\r
 \r
-            setAudioByContainer(drop_format.Text);\r
-            setVideoByContainer(drop_format.Text);\r
+            if (drop_format.Text.Contains("MP4"))\r
+            {\r
+                if (drp_videoEncoder.Items.Contains("VP3 (Theora)"))\r
+                {\r
+                    drp_videoEncoder.Items.Remove("VP3 (Theora)");\r
+                    drp_videoEncoder.SelectedIndex = 1;\r
+                }\r
+            }\r
+            else if (drop_format.Text.Contains("MKV"))\r
+                drp_videoEncoder.Items.Add("VP3 (Theora)");\r
         }\r
-        private void setExtension(string newExtension)\r
+        public void SetExtension(string newExtension)\r
         {\r
-            text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);\r
-            text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);\r
-            text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);\r
-            text_destination.Text = text_destination.Text.Replace(".avi", newExtension);\r
-            text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);\r
+            if (newExtension == ".mp4" || newExtension == ".m4v")\r
+                if (Properties.Settings.Default.useM4v || Check_ChapterMarkers.Checked || AudioSettings.RequiresM4V() || Subtitles.RequiresM4V())\r
+                    newExtension = ".m4v";\r
+                else\r
+                    newExtension = ".mp4";\r
+\r
+            if (Path.HasExtension(newExtension))\r
+                text_destination.Text = Path.ChangeExtension(text_destination.Text, newExtension);\r
         }\r
 \r
         //Video Tab\r
         private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
-            if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))\r
-            {\r
-                check_largeFile.Enabled = true;\r
-                check_optimiseMP4.Enabled = true;\r
-                check_iPodAtom.Enabled = true;\r
-            }\r
-            else\r
-            {\r
-                check_largeFile.Enabled = false;\r
-                check_optimiseMP4.Enabled = false;\r
-                check_iPodAtom.Enabled = false;\r
-                check_largeFile.Checked = false;\r
-                check_optimiseMP4.Checked = false;\r
-                check_iPodAtom.Checked = false;\r
-            }\r
+            setContainerOpts();\r
 \r
             //Turn off some options which are H.264 only when the user selects a non h.264 encoder\r
             if (drp_videoEncoder.Text.Contains("H.264"))\r
@@ -1034,8 +1161,8 @@ namespace Handbrake
                 if (check_2PassEncode.CheckState == CheckState.Checked)\r
                     check_turbo.Enabled = true;\r
 \r
-                h264Tab.Enabled = true;\r
-                if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))\r
+                tab_advanced.Enabled = true;\r
+                if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))\r
                     check_iPodAtom.Enabled = true;\r
                 else\r
                     check_iPodAtom.Enabled = false;\r
@@ -1044,7 +1171,7 @@ namespace Handbrake
             {\r
                 check_turbo.CheckState = CheckState.Unchecked;\r
                 check_turbo.Enabled = false;\r
-                h264Tab.Enabled = false;\r
+                tab_advanced.Enabled = false;\r
                 x264Panel.x264Query = "";\r
                 check_iPodAtom.Enabled = false;\r
                 check_iPodAtom.Checked = false;\r
@@ -1054,55 +1181,119 @@ namespace Handbrake
             switch (drp_videoEncoder.Text)\r
             {\r
                 case "MPEG-4 (FFmpeg)":\r
+                    if (slider_videoQuality.Value > 31)\r
+                        slider_videoQuality.Value = 20;   // Just reset to 70% QP 10 on encode change.\r
                     slider_videoQuality.Minimum = 1;\r
                     slider_videoQuality.Maximum = 31;\r
-                    slider_videoQuality.Value = 1;\r
-                    SliderValue.Text = "0% QP: 31.00";\r
-                    break;\r
-                case "MPEG-4 (XviD)":\r
-                    slider_videoQuality.Minimum = 1;\r
-                    slider_videoQuality.Maximum = 31;\r
-                    slider_videoQuality.Value = 1;\r
-                    SliderValue.Text = "0% QP: 31.00";\r
                     break;\r
                 case "H.264 (x264)":\r
                     slider_videoQuality.Minimum = 0;\r
-                    slider_videoQuality.Value = 0;\r
                     slider_videoQuality.TickFrequency = 1;\r
-                    SliderValue.Text = "0% RF: 51.00";\r
-                    String step = Properties.Settings.Default.x264cqstep;\r
-                    switch (step)\r
+\r
+                    CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");\r
+                    double cqStep = Properties.Settings.Default.x264cqstep;\r
+                    double multiplier = 1.0 / cqStep;\r
+                    double value = slider_videoQuality.Value * multiplier;\r
+\r
+                    switch (Properties.Settings.Default.x264cqstep.ToString(culture))\r
                     {\r
-                        case "0.20":\r
+                        case "0.2":\r
                             slider_videoQuality.Maximum = 255;\r
                             break;\r
                         case "0.25":\r
                             slider_videoQuality.Maximum = 204;\r
                             break;\r
-                        case "0.33":\r
-                            slider_videoQuality.Maximum = 155;\r
-                            break;\r
-                        case "0.50":\r
+                        case "0.5":\r
                             slider_videoQuality.Maximum = 102;\r
                             break;\r
-                        case "1.0":\r
+                        case "1":\r
                             slider_videoQuality.Maximum = 51;\r
                             break;\r
                         default:\r
                             slider_videoQuality.Maximum = 51;\r
                             break;\r
                     }\r
+                    if (value < slider_videoQuality.Maximum)\r
+                        slider_videoQuality.Value = slider_videoQuality.Maximum - (int)value;\r
+\r
                     break;\r
                 case "VP3 (Theora)":\r
+                    if (slider_videoQuality.Value > 63)\r
+                        slider_videoQuality.Value = 45;  // Just reset to 70% QP 45 on encode change.\r
                     slider_videoQuality.Minimum = 0;\r
                     slider_videoQuality.Maximum = 63;\r
-                    slider_videoQuality.Value = 0;\r
-                    SliderValue.Text = "0% QP: 0.00";\r
                     break;\r
             }\r
         }\r
+        /// <summary>\r
+        /// Set the container format options\r
+        /// </summary>\r
+        public void setContainerOpts()\r
+        {\r
+            if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))\r
+            {\r
+                check_largeFile.Enabled = true;\r
+                check_optimiseMP4.Enabled = true;\r
+                check_iPodAtom.Enabled = true;\r
+            }\r
+            else\r
+            {\r
+                check_largeFile.Enabled = false;\r
+                check_optimiseMP4.Enabled = false;\r
+                check_iPodAtom.Enabled = false;\r
+                check_largeFile.Checked = false;\r
+                check_optimiseMP4.Checked = false;\r
+                check_iPodAtom.Checked = false;\r
+            }\r
+        }\r
+        private double _cachedCqStep = Properties.Settings.Default.x264cqstep;\r
+        /// <summary>\r
+        /// Update the CQ slider for x264 for a new CQ step. This is set from option\r
+        /// </summary>\r
+        public void setQualityFromSlider()\r
+        {\r
+            // Work out the current RF value.\r
+            double cqStep = _cachedCqStep;\r
+            double rfValue = 51.0 - slider_videoQuality.Value * cqStep;\r
+\r
+            // Change the maximum value for the slider\r
+            switch (Properties.Settings.Default.x264cqstep.ToString(new CultureInfo("en-US")))\r
+            {\r
+                case "0.2":\r
+                    slider_videoQuality.Maximum = 255;\r
+                    break;\r
+                case "0.25":\r
+                    slider_videoQuality.Maximum = 204;\r
+                    break;\r
+                case "0.5":\r
+                    slider_videoQuality.Maximum = 102;\r
+                    break;\r
+                case "1":\r
+                    slider_videoQuality.Maximum = 51;\r
+                    break;\r
+                default:\r
+                    slider_videoQuality.Maximum = 51;\r
+                    break;\r
+            }\r
+\r
+            // Reset the CQ slider to RF0\r
+            slider_videoQuality.Value = slider_videoQuality.Maximum;\r
+\r
+            // Reset the CQ slider back to the previous value as close as possible\r
+            double cqStepNew = Properties.Settings.Default.x264cqstep;\r
+            double rfValueCurrent = 51.0 - slider_videoQuality.Value * cqStepNew;\r
+            while (rfValueCurrent < rfValue)\r
+            {\r
+                slider_videoQuality.Value--;\r
+                rfValueCurrent = 51.0 - slider_videoQuality.Value * cqStepNew;\r
+            }\r
+\r
+            // Cache the CQ step for the next calculation\r
+            _cachedCqStep = Properties.Settings.Default.x264cqstep;\r
+        }\r
         private void slider_videoQuality_Scroll(object sender, EventArgs e)\r
         {\r
+            double cqStep = Properties.Settings.Default.x264cqstep;\r
             switch (drp_videoEncoder.Text)\r
             {\r
                 case "MPEG-4 (FFmpeg)":\r
@@ -1110,33 +1301,20 @@ namespace Handbrake
                     double max = slider_videoQuality.Maximum;\r
                     double min = slider_videoQuality.Minimum;\r
                     double val = ((max - min) - (rfValue - min)) / (max - min);\r
-                    SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);\r
-                    break;\r
-                case "MPEG-4 (XviD)":\r
-                    rfValue = 31 - (slider_videoQuality.Value - 1);\r
-                    max = slider_videoQuality.Maximum;\r
-                    min = slider_videoQuality.Minimum;\r
-                    val = ((max - min) - (rfValue - min)) / (max - min);\r
-                    SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);\r
+                    SliderValue.Text = Math.Round((val * 100), 2).ToString(new CultureInfo("en-US")) + "% QP:" + (32 - slider_videoQuality.Value);\r
                     break;\r
                 case "H.264 (x264)":\r
-                    double divided;\r
-                    System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");\r
-                    double.TryParse(Properties.Settings.Default.x264cqstep,\r
-                                    System.Globalization.NumberStyles.Number,\r
-                                    culture,\r
-                                    out divided);\r
-                    rfValue = 51.0 - slider_videoQuality.Value * divided;\r
-                    max = slider_videoQuality.Maximum * divided;\r
+                    rfValue = 51.0 - slider_videoQuality.Value * cqStep;\r
+                    max = slider_videoQuality.Maximum * cqStep;\r
                     min = slider_videoQuality.Minimum;\r
                     val = ((max - min) - (rfValue - min)) / (max - min);\r
                     rfValue = Math.Round(rfValue, 2);\r
-                    SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;\r
+                    SliderValue.Text = Math.Round((val * 100), 2).ToString(new CultureInfo("en-US")) + "% RF:" + rfValue.ToString(new CultureInfo("en-US"));\r
                     break;\r
                 case "VP3 (Theora)":\r
                     rfValue = slider_videoQuality.Value;\r
                     double value = rfValue / 63;\r
-                    SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;\r
+                    SliderValue.Text = Math.Round((value * 100), 2).ToString(new CultureInfo("en-US")) + "% QP:" + slider_videoQuality.Value;\r
                     break;\r
             }\r
         }\r
@@ -1179,361 +1357,48 @@ namespace Handbrake
             }\r
         }\r
 \r
-        //Picture Tab\r
-        private void text_width_TextChanged(object sender, EventArgs e)\r
-        {\r
-            if (text_width.Text == "")\r
-                text_width.BackColor = Color.White;\r
-\r
-            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
-            lbl_max.Text = "";\r
-\r
-            int width;\r
-            Boolean parsed = int.TryParse(text_width.Text, out width);\r
-            if (parsed)\r
-            {\r
-                text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;\r
-\r
-                if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)\r
-                {\r
-                    if (drp_anamorphic.Text == "None")\r
-                    {\r
-                        int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);\r
-                        if (height != 0)\r
-                            text_height.Text = height.ToString();\r
-                    }\r
-                }\r
-            }\r
-        }\r
-        private void text_height_TextChanged(object sender, EventArgs e)\r
-        {\r
-            if (text_height.Text == "")\r
-                text_height.BackColor = Color.White;\r
-\r
-            maxHeight = 0;  // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.\r
-            if (maxWidth != 0)\r
-                lbl_max.Text = "Max Width";\r
-            else\r
-                lbl_max.Text = "";\r
-\r
-            int height;\r
-            Boolean parsed = int.TryParse(text_height.Text, out height);\r
-            if (parsed)\r
-                text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;\r
-        }\r
-        private void check_customCrop_CheckedChanged(object sender, EventArgs e)\r
-        {\r
-            text_left.Enabled = true;\r
-            text_right.Enabled = true;\r
-            text_top.Enabled = true;\r
-            text_bottom.Enabled = true;\r
-            if (selectedTitle != null)\r
-            {\r
-                text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();\r
-                text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();\r
-                text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();\r
-                text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();\r
-            }\r
-            else\r
-            {\r
-                text_left.Text = "0";\r
-                text_right.Text = "0";\r
-                text_top.Text = "0";\r
-                text_bottom.Text = "0";\r
-            }\r
-        }\r
-        private void check_autoCrop_CheckedChanged(object sender, EventArgs e)\r
-        {\r
-            text_left.Enabled = false;\r
-            text_right.Enabled = false;\r
-            text_top.Enabled = false;\r
-            text_bottom.Enabled = false;\r
-        }\r
-        private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            if (drp_anamorphic.SelectedIndex == 1)\r
-            {\r
-                text_height.BackColor = Color.LightGray;\r
-                text_width.BackColor = Color.LightGray;\r
-                text_height.Text = "";\r
-                text_width.Text = "";\r
-                text_height.Enabled = false;\r
-                text_width.Enabled = false;\r
-            }\r
-\r
-            if (drp_anamorphic.SelectedIndex == 2)\r
-            {\r
-                text_height.Text = "";\r
-                text_height.Enabled = false;\r
-                text_height.BackColor = Color.LightGray;\r
-\r
-                text_width.Enabled = true;\r
-                text_width.BackColor = Color.White;\r
-            }\r
-\r
-            if (drp_anamorphic.SelectedIndex == 0)\r
-            {\r
-                text_height.BackColor = Color.White;\r
-                text_width.BackColor = Color.White;\r
-                text_height.Enabled = true;\r
-                text_width.Enabled = true;\r
-            }\r
-        }\r
-\r
-        // Filter Tab\r
-        private void ctl_decomb_changed(object sender, EventArgs e)\r
-        {\r
-            if (ctl_decomb.getDropValue != "Off")\r
-                if (ctl_deinterlace.getDropValue != "None")\r
-                    ctl_deinterlace.setOption("None");\r
-        }\r
-        private void ctl_deinterlace_changed(object sender, EventArgs e)\r
-        {\r
-            if (ctl_detelecine.getDropValue != "None")\r
-                if (ctl_decomb.getDropValue != "Off")\r
-                    ctl_decomb.setOption("Off");\r
-        }\r
-        private void slider_deblock_Scroll(object sender, EventArgs e)\r
-        {\r
-            lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();\r
-        }\r
-\r
-        //Audio Tab\r
-        private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;\r
-                lv_audioList.Select();\r
-            }\r
-        }\r
-        private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            if (drp_audenc_1.Text == "AC3")\r
-            {\r
-                drp_audmix_1.Enabled = false;\r
-                drp_audbit_1.Enabled = false;\r
-                drp_audsr_1.Enabled = false;\r
-\r
-                drp_audmix_1.SelectedIndex = 0;\r
-                drp_audbit_1.SelectedIndex = 0;\r
-                drp_audsr_1.SelectedIndex = 0;\r
-            }\r
-            else\r
-            {\r
-                drp_audmix_1.Enabled = true;\r
-                drp_audbit_1.Enabled = true;\r
-                drp_audsr_1.Enabled = true;\r
-\r
-                drp_audmix_1.Text = "Automatic";\r
-                drp_audbit_1.Text = "160";\r
-                drp_audsr_1.Text = "Auto";\r
-            }\r
-\r
-            if (drp_audenc_1.Text == "AAC")\r
-            {\r
-                setMixDownAllOptions(drp_audmix_1);\r
-                setBitrateSelections160(drp_audbit_1);\r
-            }\r
-            else\r
-            {\r
-                setMixDownNotAAC(drp_audmix_1);\r
-                setBitrateSelections320(drp_audbit_1);\r
-            }\r
-\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;\r
-                lv_audioList.Select();\r
-            }\r
-        }\r
-        private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))\r
-                setBitrateSelections384(drp_audbit_1);\r
-            else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))\r
-                setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";\r
-\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;\r
-                lv_audioList.Select();\r
-            }\r
-        }\r
-        private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;\r
-                lv_audioList.Select();\r
-            }\r
-        }\r
-        private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)\r
+        // Chapter Marker Tab\r
+        private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)\r
         {\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            if (Check_ChapterMarkers.Checked)\r
             {\r
-                if (drp_audenc_1.Text == "AC3")\r
-                    drp_audbit_1.Text = "Auto";\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;\r
-                lv_audioList.Select();\r
+                if (drop_format.SelectedIndex != 1)\r
+                    SetExtension(".m4v");\r
+                data_chpt.Enabled = true;\r
+                btn_importChapters.Enabled = true;\r
             }\r
-        }\r
-        private void tb_drc_Scroll(object sender, EventArgs e)\r
-        {\r
-            double value;\r
-            if (tb_drc.Value == 0) value = 0;\r
             else\r
-                value = ((tb_drc.Value - 1) / 10.0) + 1;\r
-\r
-            lbl_drc.Text = value.ToString();\r
-\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;\r
-                lv_audioList.Select();\r
-            }\r
-        }\r
-\r
-        private void btn_addAudioTrack_Click(object sender, EventArgs e)\r
-        {\r
-            // Create a new row for the Audio list based on the currently selected items in the dropdown.\r
-            ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);\r
-            newTrack.SubItems.Add(drp_audenc_1.Text);\r
-            newTrack.SubItems.Add(drp_audmix_1.Text);\r
-            newTrack.SubItems.Add(drp_audsr_1.Text);\r
-            newTrack.SubItems.Add(drp_audbit_1.Text);\r
-            newTrack.SubItems.Add(lbl_drc.Text);\r
-\r
-            // Select the newly added track and select the control\r
-            lv_audioList.Items.Add(newTrack);\r
-            lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
-            lv_audioList.Select();\r
-        }\r
-        private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)\r
-        {\r
-            removeAudioTrack();\r
-        }\r
-        private void audioList_moveup_Click(object sender, EventArgs e)\r
-        {\r
-            if (lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                ListViewItem item = lv_audioList.SelectedItems[0];\r
-                int index = item.Index;\r
-                index--;\r
-\r
-                if (lv_audioList.Items.Count > index && index >= 0)\r
-                {\r
-                    lv_audioList.Items.Remove(item);\r
-                    lv_audioList.Items.Insert(index, item);\r
-                    item.Selected = true;\r
-                    lv_audioList.Focus();\r
-                }\r
-            }\r
-        }\r
-        private void audioList_movedown_Click(object sender, EventArgs e)\r
-        {\r
-            if (lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                ListViewItem item = lv_audioList.SelectedItems[0];\r
-                int index = item.Index;\r
-                index++;\r
-\r
-                if (index < lv_audioList.Items.Count)\r
-                {\r
-                    lv_audioList.Items.Remove(item);\r
-                    lv_audioList.Items.Insert(index, item);\r
-                    item.Selected = true;\r
-                    lv_audioList.Focus();\r
-                }\r
-            }\r
-\r
-        }\r
-        private void audioList_remove_Click(object sender, EventArgs e)\r
-        {\r
-            removeAudioTrack();\r
-        }\r
-        private void removeAudioTrack()\r
-        {\r
-            // Remove the Item and reselect the control if the following conditions are met.\r
-            if (lv_audioList.SelectedItems.Count != 0)\r
             {\r
-                // Record the current selected index.\r
-                int currentPosition = lv_audioList.SelectedIndices[0];\r
-\r
-                lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);\r
-\r
-                // Now reslect the correct item and give focus to the audio list.\r
-                if (lv_audioList.Items.Count != 0)\r
-                {\r
-                    if (currentPosition <= (lv_audioList.Items.Count - 1))\r
-                        lv_audioList.Items[currentPosition].Selected = true;\r
-                    else if (currentPosition > (lv_audioList.Items.Count - 1))\r
-                        lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
-\r
-                    lv_audioList.Select();\r
-                }\r
-            }\r
-        }\r
-        private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            // Set the dropdown controls based on the selected item in the Audio List.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;\r
-                drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;\r
-                drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;\r
-                drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;\r
-                drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;\r
-                double drcValue; int drcCalculated;\r
-                double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);\r
-                if (drcValue == 0) drcCalculated = 0;\r
-                else\r
-                    drcValue = ((drcValue * 10) + 1) - 10;\r
-                int.TryParse(drcValue.ToString(), out drcCalculated);\r
-                tb_drc.Value = drcCalculated;\r
+                if (drop_format.SelectedIndex != 1 && !Properties.Settings.Default.useM4v)\r
+                    SetExtension(".mp4");\r
+                data_chpt.Enabled = false;\r
+                btn_importChapters.Enabled = false;\r
             }\r
         }\r
-\r
-        private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)\r
+        private void btn_importChapters_Click(object sender, EventArgs e)\r
         {\r
-            if (drp_subtitle.Text.Contains("None"))\r
+            if (File_ChapterImport.ShowDialog() == DialogResult.OK)\r
             {\r
-                check_forced.Enabled = false;\r
-                check_forced.Checked = false;\r
+                String filename = File_ChapterImport.FileName;\r
+                DataGridView imported = Main.importChapterNames(data_chpt, filename);\r
+                if (imported != null)\r
+                    data_chpt = imported;\r
             }\r
-            else\r
-                check_forced.Enabled = true;\r
         }\r
-\r
-        // Chapter Marker Tab\r
-        private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)\r
+        private void mnu_resetChapters_Click(object sender, EventArgs e)\r
         {\r
-            if (Check_ChapterMarkers.Checked)\r
-            {\r
-                text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");\r
-                data_chpt.Rows.Clear();\r
-                data_chpt.Enabled = true;\r
-                DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);\r
-                if (chapterGridView != null)\r
-                    data_chpt = chapterGridView;\r
-            }\r
-            else\r
+            data_chpt.Rows.Clear();\r
+            DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);\r
+            if (chapterGridView != null)\r
             {\r
-                text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");\r
-                data_chpt.Rows.Clear();\r
-                data_chpt.Enabled = false;\r
+                data_chpt = chapterGridView;\r
             }\r
         }\r
 \r
         // Query Editor Tab\r
         private void btn_generate_Query_Click(object sender, EventArgs e)\r
         {\r
-            rtf_query.Text = queryGen.GenerateTheQuery(this);\r
+            rtf_query.Text = queryGen.GenerateCLIQuery(this, 0, null);\r
         }\r
         private void btn_clear_Click(object sender, EventArgs e)\r
         {\r
@@ -1544,32 +1409,32 @@ namespace Handbrake
         // MainWindow Components, Actions and Functions ***********************\r
 \r
         #region Source Scan\r
-        private void setupGUIforScan(String filename)\r
+        public Boolean isScanning { get; set; }\r
+        private static int scanProcessID { get; set; }\r
+        private void startScan(String filename)\r
         {\r
-            text_source.Text = filename;\r
-\r
+            // Setup the GUI components for the scan.\r
+            sourcePath = filename;\r
             foreach (Control ctrl in Controls)\r
-            {\r
                 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))\r
                     ctrl.Enabled = false;\r
-            }\r
+\r
             lbl_encode.Visible = true;\r
             lbl_encode.Text = "Scanning ...";\r
-            gb_source.Text = "Source: Scanning ...";\r
             btn_source.Enabled = false;\r
             btn_start.Enabled = false;\r
             btn_showQueue.Enabled = false;\r
             btn_add2Queue.Enabled = false;\r
             tb_preview.Enabled = false;\r
             mnu_killCLI.Visible = true;\r
-        }\r
-        private void startScan(String filename)\r
-        {\r
+\r
+            // Start hte Scan Thread\r
             try\r
             {\r
-                lbl_encode.Visible = true;\r
-                lbl_encode.Text = "Scanning...";\r
-                ThreadPool.QueueUserWorkItem(scanProcess, filename);\r
+                if (ActivityWindow != null)\r
+                    ActivityWindow.SetLogView(true);\r
+                isScanning = true;\r
+                ThreadPool.QueueUserWorkItem(scanProcess);\r
             }\r
             catch (Exception exc)\r
             {\r
@@ -1580,37 +1445,46 @@ namespace Handbrake
         {\r
             try\r
             {\r
-                string inputFile = (string)state;\r
                 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");\r
-                string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");\r
+                string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
+                string dvdInfoPath = Path.Combine(logDir, "last_scan_log.txt");\r
 \r
-                // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)\r
+                // Make we don't pick up a stale last_encode_log.txt (and that we have rights to the file)\r
                 if (File.Exists(dvdInfoPath))\r
                     File.Delete(dvdInfoPath);\r
 \r
-                string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);\r
+                String dvdnav = string.Empty;\r
+                if (Properties.Settings.Default.dvdnav)\r
+                    dvdnav = " --dvdnav";\r
+                string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 {2} -v >""{3}"" 2>&1""", handbrakeCLIPath, sourcePath, dvdnav, dvdInfoPath);\r
 \r
-                ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);\r
-                hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;\r
+                ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };\r
 \r
+                Boolean cleanExit = true;\r
                 using (hbproc = Process.Start(hbParseDvd))\r
                 {\r
+                    Process[] before = Process.GetProcesses(); // Get a list of running processes before starting.\r
+                    scanProcessID = Main.getCliProcess(before);\r
                     hbproc.WaitForExit();\r
+                    if (hbproc.ExitCode != 0)\r
+                        cleanExit = false;\r
                 }\r
 \r
-                if (!File.Exists(dvdInfoPath))\r
+                if (cleanExit) // If 0 exit code, CLI exited cleanly.\r
                 {\r
-                    throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);\r
-                }\r
+                    if (!File.Exists(dvdInfoPath))\r
+                        throw new Exception("Unable to retrieve the DVD Info. last_scan_log.txt is missing. \nExpected location of last_scan_log.txt: \n"\r
+                                            + dvdInfoPath);\r
 \r
-                using (StreamReader sr = new StreamReader(dvdInfoPath))\r
-                {\r
-                    thisDVD = Parsing.DVD.Parse(sr);\r
-                    sr.Close();\r
-                    sr.Dispose();\r
-                }\r
+                    using (StreamReader sr = new StreamReader(dvdInfoPath))\r
+                    {\r
+                        thisDVD = DVD.Parse(sr);\r
+                        sr.Close();\r
+                        sr.Dispose();\r
+                    }\r
 \r
-                updateUIafterScan();\r
+                    updateUIafterScan();\r
+                }\r
             }\r
             catch (Exception exc)\r
             {\r
@@ -1632,16 +1506,13 @@ namespace Handbrake
                 drp_dvdtitle.Items.Clear();\r
                 if (thisDVD.Titles.Count != 0)\r
                     drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());\r
-                drp_dvdtitle.Text = "Automatic";\r
-                drop_chapterFinish.Text = "Auto";\r
-                drop_chapterStart.Text = "Auto";\r
 \r
                 // Now select the longest title\r
                 if (thisDVD.Titles.Count != 0)\r
-                    drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);\r
+                    drp_dvdtitle.SelectedItem = Main.selectLongestTitle(thisDVD);\r
 \r
                 // Enable the creation of chapter markers if the file is an image of a dvd.\r
-                if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))\r
+                if (sourcePath.ToLower().Contains(".iso") || sourcePath.Contains("VIDEO_TS"))\r
                     Check_ChapterMarkers.Enabled = true;\r
                 else\r
                 {\r
@@ -1652,7 +1523,13 @@ namespace Handbrake
 \r
                 // If no titles were found, Display an error message\r
                 if (drp_dvdtitle.Items.Count == 0)\r
-                    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
+                {\r
+                    MessageBox.Show(\r
+                        "No Title(s) found. \n\nYour Source may be copy protected, badly mastered or in a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).",\r
+                        "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
+                    sourcePath = string.Empty;\r
+                }\r
+                UpdateSourceLabel();\r
 \r
                 // Enable the GUI components and enable any disabled components\r
                 enableGUI();\r
@@ -1663,17 +1540,13 @@ namespace Handbrake
                 enableGUI();\r
             }\r
         }\r
-\r
         private void enableGUI()\r
         {\r
             try\r
             {\r
                 if (InvokeRequired)\r
-                {\r
-                    BeginInvoke(new UpdateWindowHandler(updateUIafterScan));\r
-                }\r
+                    BeginInvoke(new UpdateWindowHandler(enableGUI));\r
                 lbl_encode.Text = "Scan Completed";\r
-                gb_source.Text = "Source";\r
                 foreach (Control ctrl in Controls)\r
                     ctrl.Enabled = true;\r
                 btn_start.Enabled = true;\r
@@ -1685,27 +1558,24 @@ namespace Handbrake
             }\r
             catch (Exception exc)\r
             {\r
-                MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                MessageBox.Show("frmMain.cs - enableGUI() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
             }\r
         }\r
-        private static void killCLI()\r
+        private void killScan()\r
         {\r
-            // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,\r
-            // hbproc.kill/close just won't do the trick.\r
             try\r
             {\r
-                string AppName = "HandBrakeCLI";\r
-\r
-                AppName = AppName.ToUpper();\r
+                enableGUI();\r
+                resetGUI();\r
 \r
-                System.Diagnostics.Process[] prs = Process.GetProcesses();\r
-                foreach (System.Diagnostics.Process proces in prs)\r
+                Process[] prs = Process.GetProcesses();\r
+                foreach (Process process in prs)\r
                 {\r
-                    if (proces.ProcessName.ToUpper() == AppName)\r
+                    if (process.Id == scanProcessID)\r
                     {\r
-                        proces.Refresh();\r
-                        if (!proces.HasExited)\r
-                            proces.Kill();\r
+                        process.Refresh();\r
+                        if (!process.HasExited)\r
+                            process.Kill();\r
                     }\r
                 }\r
             }\r
@@ -1714,231 +1584,31 @@ namespace Handbrake
                 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
             }\r
         }\r
-        #endregion\r
-\r
-        #region DVD Drive Detection\r
-        // Source Button Drive Detection\r
-        private delegate void ProgressUpdateHandler();\r
-        private void getDriveInfoThread()\r
-        {\r
-            try\r
-            {\r
-                if (InvokeRequired)\r
-                {\r
-                    BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));\r
-                    return;\r
-                }\r
-\r
-                Boolean foundDrive = false;\r
-                DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();\r
-                foreach (DriveInfo curDrive in theCollectionOfDrives)\r
-                {\r
-                    if (curDrive.DriveType == DriveType.CDRom)\r
-                    {\r
-                        if (curDrive.IsReady)\r
-                        {\r
-                            if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))\r
-                            {\r
-                                mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";\r
-                                foundDrive = true;\r
-                                break;\r
-                            }\r
-\r
-                        }\r
-                    }\r
-                }\r
-\r
-                if (foundDrive == false)\r
-                    mnu_dvd_drive.Text = "[No DVD Drive Ready]";\r
-            }\r
-            catch (Exception)\r
-            {\r
-                mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";\r
-            }\r
-        }\r
-        #endregion\r
-\r
-        #region Audio Panel Code Helpers\r
-        private void setAudioByContainer(String path)\r
+        private void resetGUI()\r
         {\r
-            string oldval;\r
-\r
-            if ((path.Contains("MP4")) || (path.Contains("M4V")))\r
-            {\r
-                oldval = drp_audenc_1.Text;\r
-                drp_audenc_1.Items.Clear();\r
-                drp_audenc_1.Items.Add("AAC");\r
-                drp_audenc_1.Items.Add("AC3");\r
-                if ((oldval != "AAC") && (oldval != "AC3"))\r
-                    drp_audenc_1.SelectedIndex = 0;\r
-\r
-            }\r
-            else if (path.Contains("AVI"))\r
-            {\r
-                oldval = drp_audenc_1.Text;\r
-                drp_audenc_1.Items.Clear();\r
-                drp_audenc_1.Items.Add("MP3");\r
-                drp_audenc_1.Items.Add("AC3");\r
-                if ((oldval != "MP3") && (oldval != "AC3"))\r
-                    drp_audenc_1.SelectedIndex = 0;\r
-\r
-            }\r
-            else if (path.Contains("OGM"))\r
-            {\r
-                drp_audenc_1.Items.Clear();\r
-                drp_audenc_1.Items.Add("Vorbis");\r
-                drp_audenc_1.SelectedIndex = 0;\r
-\r
-            }\r
-            else if (path.Contains("MKV"))\r
-            {\r
-                drp_audenc_1.Items.Clear();\r
-                drp_audenc_1.Items.Add("AAC");\r
-                drp_audenc_1.Items.Add("MP3");\r
-                drp_audenc_1.Items.Add("AC3");\r
-                drp_audenc_1.Items.Add("Vorbis");\r
-                if (drp_audenc_1.Text == string.Empty)\r
-                    drp_audenc_1.SelectedIndex = 0;\r
-            }\r
-\r
-            // Make sure the table is updated with new audio codecs\r
-            foreach (ListViewItem row in lv_audioList.Items)\r
-            {\r
-                if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))\r
-                    row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();\r
-            }\r
+            drp_dvdtitle.Items.Clear();\r
+            drop_chapterStart.Items.Clear();\r
+            drop_chapterFinish.Items.Clear();\r
+            lbl_duration.Text = "Select a Title";\r
+            PictureSettings.lbl_src_res.Text = "Select a Title";\r
+            PictureSettings.lbl_Aspect.Text = "Select a Title";\r
+            sourcePath = String.Empty;\r
+            text_destination.Text = String.Empty;\r
+            thisDVD = null;\r
+            selectedTitle = null;\r
+            isScanning = false;\r
         }\r
-        private void setVideoByContainer(String path)\r
+        private void UpdateSourceLabel()\r
         {\r
-            string oldval;\r
-\r
-            if ((path.Contains("MP3")) || (path.Contains("M4V")))\r
-            {\r
-                oldval = drp_videoEncoder.Text;\r
-                drp_videoEncoder.Items.Clear();\r
-                drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");\r
-                drp_videoEncoder.Items.Add("MPEG-4 (XviD)");\r
-                drp_videoEncoder.Items.Add("H.264 (x264)");\r
-                if (oldval == "VP3 (Theora)")\r
-                    drp_videoEncoder.SelectedIndex = 2;\r
-                else\r
-                    drp_videoEncoder.Text = oldval;\r
-\r
-            }\r
-            else if (path.Contains("AVI"))\r
-            {\r
-                oldval = drp_videoEncoder.Text;\r
-                drp_videoEncoder.Items.Clear();\r
-                drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");\r
-                drp_videoEncoder.Items.Add("MPEG-4 (XviD)");\r
-                drp_videoEncoder.Items.Add("H.264 (x264)");\r
-                if (oldval == "VP3 (Theora)")\r
-                    drp_videoEncoder.SelectedIndex = 2;\r
-                else\r
-                    drp_videoEncoder.Text = oldval;\r
-            }\r
-            else if (path.Contains("OGM"))\r
-            {\r
-                oldval = drp_videoEncoder.Text;\r
-                drp_videoEncoder.Items.Clear();\r
-                drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");\r
-                drp_videoEncoder.Items.Add("MPEG-4 (XviD)");\r
-                drp_videoEncoder.Items.Add("VP3 (Theora)");\r
-                if (oldval == "H.264 (x264)")\r
-                    drp_videoEncoder.SelectedIndex = 2;\r
-                else\r
-                    drp_videoEncoder.Text = oldval;\r
-            }\r
-            else if (path.Contains("MKV"))\r
-            {\r
-                oldval = drp_videoEncoder.Text;\r
-                drp_videoEncoder.Items.Clear();\r
-                drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");\r
-                drp_videoEncoder.Items.Add("MPEG-4 (XviD)");\r
-                drp_videoEncoder.Items.Add("H.264 (x264)");\r
-                drp_videoEncoder.Items.Add("VP3 (Theora)");\r
-                drp_videoEncoder.Text = oldval;\r
-            }\r
-        }\r
-        private void setBitrateSelections384(ComboBox dropDown)\r
-        {\r
-            dropDown.Items.Clear();\r
-            dropDown.Items.Add("32");\r
-            dropDown.Items.Add("40");\r
-            dropDown.Items.Add("48");\r
-            dropDown.Items.Add("56");\r
-            dropDown.Items.Add("64");\r
-            dropDown.Items.Add("80");\r
-            dropDown.Items.Add("86");\r
-            dropDown.Items.Add("112");\r
-            dropDown.Items.Add("128");\r
-            dropDown.Items.Add("160");\r
-            dropDown.Items.Add("192");\r
-            dropDown.Items.Add("224");\r
-            dropDown.Items.Add("256");\r
-            dropDown.Items.Add("320");\r
-            dropDown.Items.Add("384");\r
-        }\r
-        private void setBitrateSelections320(ComboBox dropDown)\r
-        {\r
-            dropDown.Items.Clear();\r
-            dropDown.Items.Add("32");\r
-            dropDown.Items.Add("40");\r
-            dropDown.Items.Add("48");\r
-            dropDown.Items.Add("56");\r
-            dropDown.Items.Add("64");\r
-            dropDown.Items.Add("80");\r
-            dropDown.Items.Add("86");\r
-            dropDown.Items.Add("112");\r
-            dropDown.Items.Add("128");\r
-            dropDown.Items.Add("160");\r
-            dropDown.Items.Add("192");\r
-            dropDown.Items.Add("224");\r
-            dropDown.Items.Add("256");\r
-            dropDown.Items.Add("320");\r
-        }\r
-        private void setBitrateSelections160(ComboBox dropDown)\r
-        {\r
-            dropDown.Items.Clear();\r
-            dropDown.Items.Add("32");\r
-            dropDown.Items.Add("40");\r
-            dropDown.Items.Add("48");\r
-            dropDown.Items.Add("56");\r
-            dropDown.Items.Add("64");\r
-            dropDown.Items.Add("80");\r
-            dropDown.Items.Add("86");\r
-            dropDown.Items.Add("112");\r
-            dropDown.Items.Add("128");\r
-            dropDown.Items.Add("160");\r
-        }\r
-        private void setMixDownAllOptions(ComboBox dropdown)\r
-        {\r
-            dropdown.Items.Clear();\r
-            dropdown.Items.Add("Automatic");\r
-            dropdown.Items.Add("Mono");\r
-            dropdown.Items.Add("Stereo");\r
-            dropdown.Items.Add("Dolby Surround");\r
-            dropdown.Items.Add("Dolby Pro Logic II");\r
-            dropdown.Items.Add("6 Channel Discrete");\r
-        }\r
-        private void setMixDownNotAAC(ComboBox dropdown)\r
-        {\r
-            dropdown.Items.Clear();\r
-            dropdown.Items.Add("Automatic");\r
-            dropdown.Items.Add("Stereo");\r
-            dropdown.Items.Add("Dolby Surround");\r
-            dropdown.Items.Add("Dolby Pro Logic II");\r
+            labelSource.Text = string.IsNullOrEmpty(sourcePath) ? "Select \"Source\" to continue." : this.SourceName;\r
         }\r
         #endregion\r
 \r
-        #region Public Methods\r
-\r
+        #region GUI\r
         /// <summary>\r
-        /// Setup the GUI for Encoding or finished Encoding.\r
-        /// 1 = Encode Running\r
-        /// 0 = Encode Finished.\r
+        /// Set the GUI to it's finished encoding state.\r
         /// </summary>\r
-        public void setEncodeFinished()\r
+        private void setEncodeFinished()\r
         {\r
             try\r
             {\r
@@ -1954,18 +1624,23 @@ namespace Handbrake
                 btn_start.Image = Properties.Resources.Play;\r
 \r
                 // If the window is minimized, display the notification in a popup.\r
-                if (FormWindowState.Minimized == this.WindowState)\r
-                {\r
-                    notifyIcon.BalloonTipText = lbl_encode.Text;\r
-                    notifyIcon.ShowBalloonTip(500);\r
-                }\r
+                if (Properties.Settings.Default.trayIconAlerts)\r
+                    if (FormWindowState.Minimized == this.WindowState)\r
+                    {\r
+                        notifyIcon.BalloonTipText = lbl_encode.Text;\r
+                        notifyIcon.ShowBalloonTip(500);\r
+                    }\r
             }\r
             catch (Exception exc)\r
             {\r
                 MessageBox.Show(exc.ToString());\r
             }\r
         }\r
-        public void setEncodeStarted()\r
+\r
+        /// <summary>\r
+        /// Set the GUI to it's started encoding state.\r
+        /// </summary>\r
+        private void setEncodeStarted()\r
         {\r
             try\r
             {\r
@@ -1976,9 +1651,9 @@ namespace Handbrake
                 }\r
 \r
                 lbl_encode.Visible = true;\r
-                lbl_encode.Text = "Encoding in Progress";\r
+                lbl_encode.Text = "Encoding with " + encodeQueue.Count + " encode(s) pending";\r
                 btn_start.Text = "Stop";\r
-                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
+                btn_start.ToolTipText = "Stop the encoding process.";\r
                 btn_start.Image = Properties.Resources.stop;\r
             }\r
             catch (Exception exc)\r
@@ -1986,125 +1661,118 @@ namespace Handbrake
                 MessageBox.Show(exc.ToString());\r
             }\r
         }\r
+        #endregion\r
 \r
-        /// <summary>\r
-        /// Action can be "encode" or "scan"\r
-        /// Set the last action varible in the main window.\r
-        /// This is used to control which log file is displayed when the Activity window is displayed.\r
-        /// </summary>\r
-        /// <param name="last">String</param>\r
-        public void setLastAction(string last)\r
+        #region DVD Drive Detection\r
+        private void getDriveInfoThread()\r
         {\r
-            this.lastAction = last;\r
+            try\r
+            {\r
+                if (InvokeRequired)\r
+                {\r
+                    BeginInvoke(new UpdateWindowHandler(getDriveInfoThread));\r
+                    return;\r
+                }\r
+\r
+                Boolean foundDrive = false;\r
+                DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();\r
+                foreach (DriveInfo curDrive in theCollectionOfDrives)\r
+                {\r
+                    if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)\r
+                    {\r
+                        if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))\r
+                        {\r
+                            this.dvdDrivePath = curDrive.RootDirectory + "VIDEO_TS";\r
+                            this.dvdDriveLabel = curDrive.VolumeLabel;\r
+                            mnu_dvd_drive.Text = this.dvdDrivePath + " (" + this.dvdDriveLabel + ")";\r
+                            foundDrive = true;\r
+                            break;\r
+                        }\r
+                    }\r
+                }\r
+\r
+                if (foundDrive == false)\r
+                    mnu_dvd_drive.Text = "[No DVD Drive Ready]";\r
+            }\r
+            catch (Exception)\r
+            {\r
+                mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";\r
+            }\r
         }\r
+        #endregion\r
 \r
+        #region Public Methods\r
         /// <summary>\r
-        /// DVD parseing. Pass in a parsed DVD.\r
+        /// Access the preset Handler and setup the preset panel.\r
         /// </summary>\r
-        /// <param name="dvd"></param>\r
-        public void setStreamReader(Parsing.DVD dvd)\r
+        public void loadPresetPanel()\r
         {\r
-            this.thisDVD = dvd;\r
+            if (presetHandler.CheckIfPresetsAreOutOfDate())\r
+                if (!Properties.Settings.Default.presetNotification)\r
+                    MessageBox.Show(splash,\r
+                    "HandBrake has determined your built-in presets are out of date... These presets will now be updated.",\r
+                    "Preset Update", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
+\r
+            presetHandler.GetPresetPanel(ref treeView_presets);\r
+            treeView_presets.Update();\r
         }\r
+        #endregion\r
 \r
+        #region Overrides\r
         /// <summary>\r
-        /// Reload the preset panel display\r
+        /// If the queue is being processed, prompt the user to confirm application close.\r
         /// </summary>\r
-        public void loadPresetPanel()\r
+        /// <param name="e"></param>\r
+        protected override void OnFormClosing(FormClosingEventArgs e)\r
         {\r
-            presetHandler.loadPresetData();\r
-\r
-            treeView_presets.Nodes.Clear();\r
-\r
-            List<Presets.Preset> presetNameList;\r
-            List<string> presetNames;\r
-            TreeNode preset_treeview;\r
-\r
-            TreeNode rootNode = new TreeNode();\r
-            TreeNode rootNodeTwo = new TreeNode();\r
-            TreeNode childNode;\r
-            int workingLevel = 0;\r
-            string previousCategory = String.Empty;\r
-            string currentCategory = String.Empty;\r
-\r
-            presetNameList = presetHandler.getBuildInPresets();\r
-            if (presetNameList.Count != 0)\r
+            // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.\r
+            if ((encodeQueue.isEncoding) && (!encodeQueue.PauseRequested) && (encodeQueue.Count > 0))\r
             {\r
-                foreach (Presets.Preset preset in presetNameList)\r
-                {\r
-                    // Handle Root Nodes\r
-\r
-                    // First Case - No presets have been read yet so setup the root category\r
-                    if (preset.Level == 1 && currentCategory == String.Empty)\r
-                    {\r
-                        rootNode = new TreeNode(preset.Category);\r
-                        workingLevel = preset.Level;\r
-                        currentCategory = preset.Category;\r
-                        previousCategory = preset.Category;\r
-                    }\r
-\r
-                    // Second Case - This is the first sub child node.\r
-                    if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)\r
-                    {\r
-                        rootNodeTwo = new TreeNode(preset.Category);\r
-                        workingLevel = preset.Level;\r
-                        currentCategory = preset.Category;\r
-                        rootNode.Nodes.Add(rootNodeTwo);\r
-                    }\r
-\r
-                    // Third Case - Any presets the sub presets detected in the above if statment.\r
-                    if (preset.Level == 1 && workingLevel == 2)\r
-                    {\r
-                        workingLevel = preset.Level;\r
-                        currentCategory = preset.Category;\r
-                    }\r
-\r
-                    // Fourth Case - We've finished this root node and are onto the next root node.\r
-                    if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)\r
-                    {\r
-                        treeView_presets.Nodes.Add(rootNode); // Add the finished node\r
-\r
-                        rootNode = new TreeNode(preset.Category);\r
-                        workingLevel = preset.Level;\r
-                        currentCategory = preset.Category;\r
-                        previousCategory = preset.Category;\r
-                    }\r
-\r
-                    // Handle Child Nodes\r
-                    // Add First level child nodes to the current root node\r
-                    if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)\r
-                    {\r
-                        childNode = new TreeNode(preset.Name);\r
-                        rootNode.Nodes.Add(childNode);\r
-                    }\r
-\r
-                    // Add Second level child nodes to the current sub root node\r
-                    if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)\r
-                    {\r
-                        childNode = new TreeNode(preset.Name);\r
-                        rootNodeTwo.Nodes.Add(childNode);\r
-                    }\r
-                }\r
-\r
-                // Add the final root node which does not get added above.\r
-                treeView_presets.Nodes.Add(rootNode);\r
+                DialogResult result = MessageBox.Show("HandBrake has queue items to process. Closing HandBrake will not stop the current encoding, but will stop processing the queue.\n\nDo you want to close HandBrake?",\r
+                    "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
+                if (result == DialogResult.No)\r
+                    e.Cancel = true;\r
             }\r
+            base.OnFormClosing(e);\r
+        }\r
+        #endregion\r
 \r
-            // User Presets\r
-            presetNames = presetHandler.getUserPresetNames();\r
-            foreach (string preset in presetNames)\r
+        #region In-GUI Encode Status (Experimental)\r
+        private void encodeMonitorThread()\r
+        {\r
+            try\r
             {\r
-                preset_treeview = new TreeNode(preset);\r
-                preset_treeview.ForeColor = Color.Black;\r
-\r
-                // Now Fill Out List View with Items\r
-                treeView_presets.Nodes.Add(preset_treeview);\r
+                Parser encode = new Parser(encodeQueue.hbProcess.StandardOutput.BaseStream);\r
+                encode.OnEncodeProgress += encodeOnEncodeProgress;\r
+                while (!encode.EndOfStream)\r
+                    encode.readEncodeStatus();\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                MessageBox.Show(exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
             }\r
         }\r
-\r
+        private void encodeOnEncodeProgress(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining)\r
+        {\r
+            if (this.InvokeRequired)\r
+            {\r
+                this.BeginInvoke(new EncodeProgressEventHandler(encodeOnEncodeProgress),\r
+                    new object[] { Sender, CurrentTask, TaskCount, PercentComplete, CurrentFps, AverageFps, TimeRemaining });\r
+                return;\r
+            }\r
+            lbl_encode.Text = string.Format("Encode Progress: {0}%,       FPS: {1},       Avg FPS: {2},       Time Remaining: {3} ", PercentComplete, CurrentFps, AverageFps, TimeRemaining);\r
+        }\r
         #endregion\r
 \r
-\r
-        // This is the END of the road ------------------------------------------------------------------------------\r
+        #region enum\r
+        private enum SourceType\r
+        {\r
+            None = 0,\r
+            Folder,\r
+            DvdDrive,\r
+            VideoFile\r
+        }\r
+        #endregion\r
+        // This is the END of the road ****************************************\r
     }\r
-}\r
+}
\ No newline at end of file