OSDN Git Service

CLI: update the built in presets
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmQueue.cs
index 51dafd0..2684772 100644 (file)
@@ -1,8 +1,7 @@
 /*  frmQueue.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
@@ -10,19 +9,46 @@ namespace Handbrake
     using System.Collections.Generic;\r
     using System.Collections.ObjectModel;\r
     using System.ComponentModel;\r
+    using System.IO;\r
     using System.Windows.Forms;\r
     using Functions;\r
+\r
+    using HandBrake.ApplicationServices.Model;\r
+    using HandBrake.ApplicationServices.Services;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
     using Model;\r
-    using Services;\r
 \r
+    /// <summary>\r
+    /// The Queue Window\r
+    /// </summary>\r
     public partial class frmQueue : Form\r
     {\r
+        /// <summary>\r
+        /// Update Handler Delegate\r
+        /// </summary>\r
         private delegate void UpdateHandler();\r
 \r
-        private Queue queue;\r
-        private frmMain mainWindow;\r
+        /// <summary>\r
+        /// An instance of the Queue service\r
+        /// </summary>\r
+        private readonly IQueue queue;\r
 \r
-        public frmQueue(Queue q, frmMain mw)\r
+        /// <summary>\r
+        /// A reference to the main application window\r
+        /// </summary>\r
+        private readonly frmMain mainWindow;\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="frmQueue"/> class.\r
+        /// </summary>\r
+        /// <param name="q">\r
+        /// An instance of the queue service.\r
+        /// </param>\r
+        /// <param name="mw">\r
+        /// The main window.\r
+        /// </param>\r
+        public frmQueue(IQueue q, frmMain mw)\r
         {\r
             InitializeComponent();\r
 \r
@@ -32,25 +58,127 @@ namespace Handbrake
             queue.EncodeStarted += new EventHandler(QueueOnEncodeStart);\r
             queue.QueueCompleted += new EventHandler(QueueOnQueueFinished);\r
             queue.QueuePauseRequested += new EventHandler(QueueOnPaused);\r
+            queue.QueueListChanged += new EventHandler(queue_QueueListChanged);\r
+\r
+            queue.EncodeStarted += new EventHandler(queue_EncodeStarted);\r
+            queue.EncodeEnded += new EventHandler(queue_EncodeEnded);\r
+\r
+            drp_completeOption.Text = Properties.Settings.Default.CompletionOption;\r
         }\r
 \r
+        /// <summary>\r
+        /// Queue Changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void queue_QueueListChanged(object sender, EventArgs e)\r
+        {\r
+            UpdateUiElementsOnQueueChange();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Encode Ended\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void queue_EncodeEnded(object sender, EventArgs e)\r
+        {\r
+            queue.EncodeStatusChanged -= EncodeQueue_EncodeStatusChanged;\r
+            ResetEncodeText();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Queue Started\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void queue_EncodeStarted(object sender, EventArgs e)\r
+        {\r
+            this.SetCurrentEncodeInformation();\r
+            queue.EncodeStatusChanged += EncodeQueue_EncodeStatusChanged;        \r
+        }\r
+\r
+        /// <summary>\r
+        /// Display the Encode Status\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void EncodeQueue_EncodeStatusChanged(object sender, HandBrake.ApplicationServices.EncodeProgressEventArgs e)\r
+        {\r
+            if (this.InvokeRequired)\r
+            {\r
+                this.BeginInvoke(new Encode.EncodeProgessStatus(EncodeQueue_EncodeStatusChanged), new[] { sender, e });\r
+                return;\r
+            }\r
+\r
+            lbl_encodeStatus.Text =\r
+                string.Format(\r
+                "Encoding: Pass {0} of {1}, {2:00.00}% Time Remaining: {3}",\r
+                e.Task,\r
+                e.TaskCount,\r
+                e.PercentComplete,\r
+                e.EstimatedTimeLeft);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Handle the Queue Paused event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
         private void QueueOnPaused(object sender, EventArgs e)\r
         {\r
-            SetUIEncodeFinished();\r
-            UpdateUIElements();\r
+            SetUiEncodeFinished();\r
+            UpdateUiElementsOnQueueChange();\r
         }\r
 \r
+        /// <summary>\r
+        /// Handle the Queue Finished event.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
         private void QueueOnQueueFinished(object sender, EventArgs e)\r
         {\r
-            SetUIEncodeFinished();\r
+            SetUiEncodeFinished();\r
             ResetQueue(); // Reset the Queue Window\r
         }\r
 \r
+        /// <summary>\r
+        /// Handle the Encode Started event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void QueueOnEncodeStart(object sender, EventArgs e)\r
         {\r
-            SetUIEncodeStarted(); // make sure the UI is set correctly\r
-            SetCurrentEncodeInformation();\r
-            UpdateUIElements(); // Redraw the Queue, a new encode has started.\r
+            SetUiEncodeStarted(); // make sure the UI is set correctly\r
+            UpdateUiElementsOnQueueChange(); // Redraw the Queue, a new encode has started.\r
         }\r
 \r
         /// <summary>\r
@@ -58,7 +186,7 @@ namespace Handbrake
         /// </summary>\r
         public void SetQueue()\r
         {\r
-            UpdateUIElements();\r
+            UpdateUiElementsOnQueueChange();\r
         }\r
 \r
         /// <summary>\r
@@ -77,57 +205,74 @@ namespace Handbrake
         {\r
             if (doSetQueue) SetQueue();\r
             base.Show();\r
-\r
-            // Activate();\r
         }\r
 \r
-        // Start and Stop Controls\r
-        private void btn_encode_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the Encode button Click event\r
+        /// </summary>\r
+        /// <param name="sender">The sender</param>\r
+        /// <param name="e">the EventArgs</param>\r
+        private void BtnEncodeClick(object sender, EventArgs e)\r
         {\r
-            if (queue.PauseRequested)\r
+            if (queue.Paused)\r
             {\r
-                SetUIEncodeStarted();\r
-                MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
+                SetUiEncodeStarted();\r
             }\r
 \r
-            if (!queue.IsEncoding)\r
-                queue.Start();\r
+            lbl_encodeStatus.Text = "Encoding ...";\r
+            queue.Start();\r
         }\r
 \r
-        private void btn_pause_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the Pause button click event.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void BtnPauseClick(object sender, EventArgs e)\r
         {\r
             queue.Pause();\r
-            SetUIEncodeFinished();\r
-            ResetQueue();\r
             MessageBox.Show(\r
-                "No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode' when you wish to continue encoding the queue.", \r
+                "No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode' when you wish to continue encoding the queue.",\r
                 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
         }\r
 \r
+        // UI Work\r
 \r
-        // Window Display Management\r
-        private void SetUIEncodeStarted()\r
+        /// <summary>\r
+        /// Setup the UI to show that an encode has started\r
+        /// </summary>\r
+        private void SetUiEncodeStarted()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(SetUIEncodeStarted));\r
+                BeginInvoke(new UpdateHandler(SetUiEncodeStarted));\r
                 return;\r
             }\r
             btn_encode.Enabled = false;\r
             btn_pause.Visible = true;\r
         }\r
 \r
-        private void SetUIEncodeFinished()\r
+        /// <summary>\r
+        /// Setup the UI to indicate that an encode has finished.\r
+        /// </summary>\r
+        private void SetUiEncodeFinished()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(SetUIEncodeFinished));\r
+                BeginInvoke(new UpdateHandler(SetUiEncodeFinished));\r
                 return;\r
             }\r
             btn_pause.Visible = false;\r
             btn_encode.Enabled = true;\r
         }\r
 \r
+        /// <summary>\r
+        /// Reset the Queue Window display\r
+        /// </summary>\r
         private void ResetQueue()\r
         {\r
             if (InvokeRequired)\r
@@ -138,16 +283,31 @@ namespace Handbrake
             btn_pause.Visible = false;\r
             btn_encode.Enabled = true;\r
 \r
+            ResetEncodeText();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Reset the current job text\r
+        /// </summary>\r
+        private void ResetEncodeText()\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateHandler(ResetEncodeText));\r
+                return;\r
+            }\r
+            lbl_encodeStatus.Text = "Ready";\r
+\r
             lbl_source.Text = "-";\r
             lbl_dest.Text = "-";\r
-            lbl_vEnc.Text = "-";\r
-            lbl_aEnc.Text = "-";\r
-            lbl_title.Text = "-";\r
-            lbl_chapt.Text = "-";\r
+            lbl_encodeOptions.Text = "-";\r
 \r
             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
         }\r
 \r
+        /// <summary>\r
+        /// Redraw the Queue window with the latest information about HandBrakes status\r
+        /// </summary>\r
         private void RedrawQueue()\r
         {\r
             if (InvokeRequired)\r
@@ -158,30 +318,30 @@ namespace Handbrake
 \r
             list_queue.Items.Clear();\r
             ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
-            foreach (Job queue_item in theQueue)\r
+            foreach (Job queueItem in theQueue)\r
             {\r
-                string q_item = queue_item.Query;\r
-                QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
+                string qItem = queueItem.Query;\r
+                QueryParser parsed = Functions.QueryParser.Parse(qItem);\r
 \r
                 // Get the DVD Title\r
-                string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
+                string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString();\r
 \r
                 // Get the DVD Chapters\r
                 string chapters;\r
-                if (parsed.DVDChapterStart == 0)\r
+                if (parsed.ChapterStart == 0)\r
                     chapters = "Auto";\r
                 else\r
                 {\r
-                    chapters = parsed.DVDChapterStart.ToString();\r
-                    if (parsed.DVDChapterFinish != 0)\r
-                        chapters = chapters + " - " + parsed.DVDChapterFinish;\r
+                    chapters = parsed.ChapterStart.ToString();\r
+                    if (parsed.ChapterFinish != 0)\r
+                        chapters = chapters + " - " + parsed.ChapterFinish;\r
                 }\r
 \r
                 ListViewItem item = new ListViewItem();\r
                 item.Text = title; // Title\r
                 item.SubItems.Add(chapters); // Chapters\r
-                item.SubItems.Add(queue_item.Source); // Source\r
-                item.SubItems.Add(queue_item.Destination); // Destination\r
+                item.SubItems.Add(queueItem.Source); // Source\r
+                item.SubItems.Add(queueItem.Destination); // Destination\r
                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
 \r
                 // Display The Audio Track Information\r
@@ -199,11 +359,14 @@ namespace Handbrake
             }\r
         }\r
 \r
-        private void UpdateUIElements()\r
+        /// <summary>\r
+        /// Update the UI elements\r
+        /// </summary>\r
+        private void UpdateUiElementsOnQueueChange()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(UpdateUIElements));\r
+                BeginInvoke(new UpdateHandler(UpdateUiElementsOnQueueChange));\r
                 return;\r
             }\r
 \r
@@ -211,6 +374,9 @@ namespace Handbrake
             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
         }\r
 \r
+        /// <summary>\r
+        /// Set the window up with the current encode information\r
+        /// </summary>\r
         private void SetCurrentEncodeInformation()\r
         {\r
             try\r
@@ -220,108 +386,136 @@ namespace Handbrake
                     BeginInvoke(new UpdateHandler(SetCurrentEncodeInformation));\r
                 }\r
 \r
-                // found query is a global varible\r
-                QueryParser parsed = Functions.QueryParser.Parse(queue.LastEncode.Query);\r
-                lbl_source.Text = queue.LastEncode.Source;\r
-                lbl_dest.Text = queue.LastEncode.Destination;\r
+                QueryParser parsed = QueryParser.Parse(queue.LastEncode.Query);\r
 \r
-                lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
-\r
-                if (Equals(parsed.DVDChapterStart, 0))\r
-                    lbl_chapt.Text = "Auto";\r
+                // Get title and chapters\r
+                string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString();\r
+                string chapterlbl;\r
+                if (Equals(parsed.ChapterStart, 0))\r
+                    chapterlbl = "Auto";\r
                 else\r
                 {\r
-                    string chapters = parsed.DVDChapterStart.ToString();\r
-                    if (parsed.DVDChapterFinish != 0)\r
-                        chapters = chapters + " - " + parsed.DVDChapterFinish;\r
-                    lbl_chapt.Text = chapters;\r
+                    string chapters = parsed.ChapterStart.ToString();\r
+                    if (parsed.ChapterFinish != 0)\r
+                        chapters = chapters + " - " + parsed.ChapterFinish;\r
+                    chapterlbl = chapters;\r
                 }\r
 \r
-                lbl_vEnc.Text = parsed.VideoEncoder;\r
-\r
-                // Display The Audio Track Information\r
+                // Get audio information\r
                 string audio = string.Empty;\r
                 foreach (AudioTrack track in parsed.AudioInformation)\r
                 {\r
-                    if (audio != string.Empty)\r
+                    if (audio != string.Empty) \r
                         audio += ", " + track.Encoder;\r
                     else\r
                         audio = track.Encoder;\r
                 }\r
-                lbl_aEnc.Text = audio;\r
-            }\r
+\r
+                // found query is a global varible        \r
+                lbl_encodeStatus.Text = "Encoding ...";\r
+                lbl_source.Text = queue.LastEncode.Source + "(Title: " + title + " Chapters: " + chapterlbl + ")";\r
+                lbl_dest.Text = queue.LastEncode.Destination;\r
+                lbl_encodeOptions.Text = "Video: " + parsed.VideoEncoder + " Audio: " + audio + Environment.NewLine +\r
+                                    "x264 Options: " + parsed.H264Query;\r
+               }\r
             catch (Exception)\r
             {\r
                 // Do Nothing\r
             }\r
         }\r
 \r
-        private void DeleteSelectedItems()\r
-        {\r
-            // If there are selected items\r
-            if (list_queue.SelectedIndices.Count > 0)\r
-            {\r
-                // Save the selected indices to select them after the move\r
-                List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
-                foreach (int selectedIndex in list_queue.SelectedIndices)\r
-                    selectedIndices.Add(selectedIndex);\r
-\r
-                int firstSelectedIndex = selectedIndices[0];\r
-\r
-                // Reverse the list to delete the items from last to first (preserves indices)\r
-                selectedIndices.Reverse();\r
-\r
-                // Remove each selected item\r
-                foreach (int selectedIndex in selectedIndices)\r
-                    queue.Remove(selectedIndex);\r
-\r
-                UpdateUIElements();\r
-\r
-                // Select the item where the first deleted item was previously\r
-                if (firstSelectedIndex < list_queue.Items.Count)\r
-                    list_queue.Items[firstSelectedIndex].Selected = true;\r
-            }\r
-\r
-            list_queue.Select(); // Activate the control to show the selected items\r
-        }\r
+        /* Right Click Menu */\r
 \r
-        // Queue Management\r
-        private void mnu_up_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the Move Up Menu Item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuUpClick(object sender, EventArgs e)\r
         {\r
             MoveUp();\r
         }\r
 \r
-        private void mnu_Down_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the Move down Menu Item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuDownClick(object sender, EventArgs e)\r
         {\r
             MoveDown();\r
         }\r
 \r
-        private void mnu_delete_Click(object sender, EventArgs e)\r
-        {\r
-            DeleteSelectedItems();\r
-        }\r
-\r
-        private void btn_up_Click(object sender, EventArgs e)\r
-        {\r
-            MoveUp();\r
-        }\r
-\r
-        private void btn_down_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Edit a job\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuEditClick(object sender, EventArgs e)\r
         {\r
-            MoveDown();\r
+            if (list_queue.SelectedIndices != null && list_queue.SelectedIndices.Count != 0)\r
+            {\r
+                lock (queue)\r
+                {\r
+                    lock (list_queue)\r
+                    {\r
+                        int index = list_queue.SelectedIndices[0];\r
+                        mainWindow.RecievingJob(queue.GetJob(index));\r
+                        queue.Remove(index);\r
+                        RedrawQueue();\r
+                    }\r
+                }\r
+            }\r
         }\r
 \r
-        private void btn_delete_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the delete Menu Item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuDeleteClick(object sender, EventArgs e)\r
         {\r
             DeleteSelectedItems();\r
         }\r
 \r
-        private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
+        /* Keyboard Shortcuts */\r
+\r
+        /// <summary>\r
+        /// Handle the delete keyboard press\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void ListQueueDeleteKey(object sender, KeyEventArgs e)\r
         {\r
-            if (e.KeyCode == Keys.Delete)\r
+            if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.None)\r
                 DeleteSelectedItems();\r
         }\r
 \r
+        /* Queue Management */\r
+\r
+        /// <summary>\r
+        /// Move items up in the queue\r
+        /// </summary>\r
         private void MoveUp()\r
         {\r
             // If there are selected items and the first item is not selected\r
@@ -336,8 +530,6 @@ namespace Handbrake
                 foreach (int selectedIndex in selectedIndices)\r
                     queue.MoveUp(selectedIndex);\r
 \r
-                UpdateUIElements();\r
-\r
                 // Keep the selected item(s) selected, now moved up one index\r
                 foreach (int selectedIndex in selectedIndices)\r
                     if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good\r
@@ -347,6 +539,9 @@ namespace Handbrake
             list_queue.Select(); // Activate the control to show the selected items\r
         }\r
 \r
+        /// <summary>\r
+        /// Move items down in the queue\r
+        /// </summary>\r
         private void MoveDown()\r
         {\r
             // If there are selected items and the last item is not selected\r
@@ -365,8 +560,6 @@ namespace Handbrake
                 foreach (int selectedIndex in selectedIndices)\r
                     queue.MoveDown(selectedIndex);\r
 \r
-                UpdateUIElements();\r
-\r
                 // Keep the selected item(s) selected, now moved down one index\r
                 foreach (int selectedIndex in selectedIndices)\r
                     if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good\r
@@ -376,8 +569,48 @@ namespace Handbrake
             list_queue.Select(); // Activate the control to show the selected items\r
         }\r
 \r
-        // Queue Import/Export Features\r
-        private void mnu_batch_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Delete the currently selected items on the queue\r
+        /// </summary>\r
+        private void DeleteSelectedItems()\r
+        {\r
+            // If there are selected items\r
+            if (list_queue.SelectedIndices.Count > 0)\r
+            {\r
+                // Save the selected indices to select them after the move\r
+                List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
+                foreach (int selectedIndex in list_queue.SelectedIndices)\r
+                    selectedIndices.Add(selectedIndex);\r
+\r
+                int firstSelectedIndex = selectedIndices[0];\r
+\r
+                // Reverse the list to delete the items from last to first (preserves indices)\r
+                selectedIndices.Reverse();\r
+\r
+                // Remove each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.Remove(selectedIndex);\r
+\r
+                // Select the item where the first deleted item was previously\r
+                if (firstSelectedIndex < list_queue.Items.Count)\r
+                    list_queue.Items[firstSelectedIndex].Selected = true;\r
+            }\r
+\r
+            list_queue.Select(); // Activate the control to show the selected items\r
+        }\r
+\r
+        /* Queue Import / Export features */\r
+\r
+        /// <summary>\r
+        /// Create a batch script\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuBatchClick(object sender, EventArgs e)\r
         {\r
             SaveFile.FileName = string.Empty;\r
             SaveFile.Filter = "Batch|.bat";\r
@@ -386,7 +619,16 @@ namespace Handbrake
                 queue.WriteBatchScriptToFile(SaveFile.FileName);\r
         }\r
 \r
-        private void mnu_export_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Export Queue\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuExportClick(object sender, EventArgs e)\r
         {\r
             SaveFile.FileName = string.Empty;\r
             SaveFile.Filter = "HandBrake Queue|*.queue";\r
@@ -395,49 +637,74 @@ namespace Handbrake
                 queue.WriteQueueStateToFile(SaveFile.FileName);\r
         }\r
 \r
-        private void mnu_import_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Import Queue\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuImportClick(object sender, EventArgs e)\r
         {\r
             OpenFile.FileName = string.Empty;\r
             OpenFile.ShowDialog();\r
             if (OpenFile.FileName != String.Empty)\r
                 queue.LoadQueueFromFile(OpenFile.FileName);\r
-            UpdateUIElements();\r
         }\r
 \r
-        private void mnu_readd_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Readd current job to queue\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuReaddClick(object sender, EventArgs e)\r
         {\r
-            if (!queue.LastEncode.IsEmpty)\r
+            if (queue.LastEncode != null && !queue.LastEncode.IsEmpty)\r
             {\r
-                queue.Add(queue.LastEncode.Query, queue.LastEncode.Source, queue.LastEncode.Destination, \r
-                          queue.LastEncode.CustomQuery);\r
-                UpdateUIElements();\r
-            }\r
-        }\r
-\r
-        private void mnu_reconfigureJob_Click(object sender, EventArgs e)\r
-        {\r
-            if (list_queue.SelectedIndices != null)\r
-            {\r
-                lock (queue)\r
-                {\r
-                    lock (list_queue)\r
-                    {\r
-                        int index = list_queue.SelectedIndices[0];\r
-                        mainWindow.RecievingJob(queue.GetJob(index));\r
-                        queue.Remove(index);\r
-                        RedrawQueue();\r
-                    }\r
-                }\r
+                queue.Add(\r
+                    queue.LastEncode.Query, \r
+                    queue.LastEncode.Title, \r
+                    queue.LastEncode.Source,\r
+                    queue.LastEncode.Destination,\r
+                    queue.LastEncode.CustomQuery);\r
             }\r
         }\r
 \r
+        /* Overrides */\r
 \r
-        // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
+        /// <summary>\r
+        /// Hide's the window when the user tries to "x" out of the window instead of closing it.\r
+        /// </summary>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         protected override void OnClosing(CancelEventArgs e)\r
         {\r
             e.Cancel = true;\r
             this.Hide();\r
             base.OnClosing(e);\r
         }\r
+\r
+        /// <summary>\r
+        /// Change the OnComplete option setting.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void CompleteOptionChanged(object sender, EventArgs e)\r
+        {\r
+            Properties.Settings.Default.CompletionOption = drp_completeOption.Text;\r
+            HandBrake.ApplicationServices.Init.CompletionOption = drp_completeOption.Text;\r
+            Properties.Settings.Default.Save();\r
+        }\r
     }\r
 }
\ No newline at end of file