OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmQueue.cs
index 765c940..51dafd0 100644 (file)
           Homepage: <http://handbrake.fr>.\r
           It may be used under the terms of the GNU General Public License. */\r
 \r
-using System;\r
-using System.Collections.Generic;\r
-using System.Collections;\r
-using System.ComponentModel;\r
-using System.Data;\r
-using System.Drawing;\r
-using System.Text;\r
-using System.Windows.Forms;\r
-using System.Threading;\r
-using System.Diagnostics;\r
-using System.Runtime.InteropServices;\r
-using System.IO;\r
-\r
 namespace Handbrake\r
 {\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Collections.ObjectModel;\r
+    using System.ComponentModel;\r
+    using System.Windows.Forms;\r
+    using Functions;\r
+    using Model;\r
+    using Services;\r
+\r
     public partial class frmQueue : Form\r
     {\r
-        private delegate void ProgressUpdateHandler();\r
-        private delegate void setEncoding();\r
-        Functions.Encode cliObj = new Functions.Encode();\r
-        Boolean cancel = false;\r
-        Process hbProc = null;\r
-        Queue.Queue queue;\r
-        frmMain mainWindow = null;\r
-\r
-        public frmQueue(frmMain main)\r
+        private delegate void UpdateHandler();\r
+\r
+        private Queue queue;\r
+        private frmMain mainWindow;\r
+\r
+        public frmQueue(Queue q, frmMain mw)\r
         {\r
             InitializeComponent();\r
-            mainWindow = main;\r
+\r
+            this.mainWindow = mw;\r
+\r
+            this.queue = q;\r
+            queue.EncodeStarted += new EventHandler(QueueOnEncodeStart);\r
+            queue.QueueCompleted += new EventHandler(QueueOnQueueFinished);\r
+            queue.QueuePauseRequested += new EventHandler(QueueOnPaused);\r
+        }\r
+\r
+        private void QueueOnPaused(object sender, EventArgs e)\r
+        {\r
+            SetUIEncodeFinished();\r
+            UpdateUIElements();\r
+        }\r
+\r
+        private void QueueOnQueueFinished(object sender, EventArgs e)\r
+        {\r
+            SetUIEncodeFinished();\r
+            ResetQueue(); // Reset the Queue Window\r
+        }\r
+\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
         }\r
 \r
         /// <summary>\r
         /// Initializes the Queue list with the Arraylist from the Queue class\r
         /// </summary>\r
-        /// <param name="qw"></param>\r
-        public void setQueue(Queue.Queue qw)\r
+        public void SetQueue()\r
         {\r
-            queue = qw;\r
-            redrawQueue();\r
-            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+            UpdateUIElements();\r
+        }\r
 \r
-            // Recalculate the progress bar, but only if the queue has already started.       \r
-            if (progressBar.Value != 0)\r
-            {\r
-                progressBar.Value = 0;\r
-                progressBar.Step = 100 / queue.count();\r
-                progressBar.PerformStep();\r
-                lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
-            }\r
+        /// <summary>\r
+        /// Initializes the Queue list, then shows and activates the window\r
+        /// </summary>\r
+        public new void Show()\r
+        {\r
+            Show(true);\r
         }\r
 \r
         /// <summary>\r
-        /// Returns if there is currently an item being encoded by the queue\r
+        /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window\r
         /// </summary>\r
-        /// <returns>Boolean true if encoding</returns>\r
-        public Boolean isEncoding()\r
+        /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>\r
+        public void Show(bool doSetQueue)\r
+        {\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
+        {\r
+            if (queue.PauseRequested)\r
+            {\r
+                SetUIEncodeStarted();\r
+                MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
+            }\r
+\r
+            if (!queue.IsEncoding)\r
+                queue.Start();\r
+        }\r
+\r
+        private void btn_pause_Click(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
+                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+        }\r
+\r
+\r
+        // Window Display Management\r
+        private void SetUIEncodeStarted()\r
+        {\r
+            if (InvokeRequired)\r
+            {\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
         {\r
-            if (hbProc == null)\r
-                return false;\r
-            else\r
-                return true;\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateHandler(SetUIEncodeFinished));\r
+                return;\r
+            }\r
+            btn_pause.Visible = false;\r
+            btn_encode.Enabled = true;\r
         }\r
 \r
-        // Redraw's the queue with the latest data from the Queue class\r
-        private void redrawQueue()\r
+        private void ResetQueue()\r
         {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateHandler(ResetQueue));\r
+                return;\r
+            }\r
+            btn_pause.Visible = false;\r
+            btn_encode.Enabled = true;\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
+\r
+            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+        }\r
+\r
+        private void RedrawQueue()\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateHandler(RedrawQueue));\r
+                return;\r
+            }\r
+\r
             list_queue.Items.Clear();\r
-            List<Queue.QueueItem> theQueue = queue.getQueue();\r
-            foreach (Queue.QueueItem queue_item in theQueue)\r
+            ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
+            foreach (Job queue_item in theQueue)\r
             {\r
                 string q_item = queue_item.Query;\r
-                Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
+                QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
 \r
                 // Get the DVD Title\r
-                string title = "";\r
-                if (parsed.DVDTitle == 0)\r
-                    title = "Auto";\r
-                else\r
-                    title = parsed.DVDTitle.ToString();\r
+                string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
 \r
                 // Get the DVD Chapters\r
-                string chapters = "";\r
+                string chapters;\r
                 if (parsed.DVDChapterStart == 0)\r
                     chapters = "Auto";\r
                 else\r
@@ -101,299 +183,255 @@ namespace Handbrake
                 item.SubItems.Add(queue_item.Source); // Source\r
                 item.SubItems.Add(queue_item.Destination); // Destination\r
                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
-                item.SubItems.Add(parsed.AudioEncoder1); // Audio\r
+\r
+                // Display The Audio Track Information\r
+                string audio = string.Empty;\r
+                foreach (AudioTrack track in parsed.AudioInformation)\r
+                {\r
+                    if (audio != string.Empty)\r
+                        audio += ", " + track.Encoder;\r
+                    else\r
+                        audio = track.Encoder;\r
+                }\r
+                item.SubItems.Add(audio); // Audio\r
 \r
                 list_queue.Items.Add(item);\r
             }\r
         }\r
 \r
-        // Initializes the encode process\r
-        private void btn_encode_Click(object sender, EventArgs e)\r
+        private void UpdateUIElements()\r
         {\r
-            mainWindow.setLastAction("encode");\r
-            \r
-            if (queue.count() != 0)\r
+            if (InvokeRequired)\r
             {\r
-                btn_encode.Enabled = false;\r
+                BeginInvoke(new UpdateHandler(UpdateUIElements));\r
+                return;\r
             }\r
-            cancel = false;\r
 \r
-            // Start the encode\r
-            try\r
-            {\r
-                if (queue.count() != 0)\r
-                {\r
-                    // Setup or reset some values\r
-                    btn_stop.Visible = true;\r
-                    progressBar.Value = 0;\r
-                    lbl_progressValue.Text = "0 %";\r
-                    progressBar.Step = 100 / queue.count();\r
-                    Thread theQ = new Thread(startProc);\r
-                    theQ.IsBackground = true;\r
-                    theQ.Start();\r
-                }\r
-            }\r
-            catch (Exception exc)\r
-            {\r
-                MessageBox.Show(exc.ToString());\r
-            }\r
+            RedrawQueue();\r
+            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
         }\r
 \r
-        // Starts the encoding process\r
-        private void startProc(object state)\r
+        private void SetCurrentEncodeInformation()\r
         {\r
             try\r
             {\r
-                // Run through each item on the queue\r
-                while (queue.count() != 0)\r
+                if (InvokeRequired)\r
                 {\r
-                    string query = queue.getNextItemForEncoding();\r
-                    queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-\r
-                    setEncValue();\r
-                    updateUIElements();\r
-\r
-                    hbProc = cliObj.runCli(this, query);\r
+                    BeginInvoke(new UpdateHandler(SetCurrentEncodeInformation));\r
+                }\r
 \r
-                    hbProc.WaitForExit();\r
-                    cliObj.addCLIQueryToLog(query);\r
-                    cliObj.copyLog(query, queue.getLastQuery().Destination);\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
 \r
-                    hbProc.Close();\r
-                    hbProc.Dispose();\r
-                    hbProc = null;\r
-                    query = "";\r
+                lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
 \r
-                    if (cancel == true)\r
-                    {\r
-                        break;\r
-                    }\r
+                if (Equals(parsed.DVDChapterStart, 0))\r
+                    lbl_chapt.Text = "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
                 }\r
 \r
-                resetQueue();\r
+                lbl_vEnc.Text = parsed.VideoEncoder;\r
 \r
-                // After the encode is done, we may want to shutdown, suspend etc.\r
-                cliObj.afterEncodeAction();\r
+                // Display The Audio Track Information\r
+                string audio = string.Empty;\r
+                foreach (AudioTrack track in parsed.AudioInformation)\r
+                {\r
+                    if (audio != string.Empty)\r
+                        audio += ", " + track.Encoder;\r
+                    else\r
+                        audio = track.Encoder;\r
+                }\r
+                lbl_aEnc.Text = audio;\r
             }\r
-            catch (Exception exc)\r
+            catch (Exception)\r
             {\r
-                MessageBox.Show(exc.ToString());\r
+                // Do Nothing\r
             }\r
         }\r
 \r
-        // Reset's the window to the default state.\r
-        private void resetQueue()\r
+        private void DeleteSelectedItems()\r
         {\r
-            try\r
+            // If there are selected items\r
+            if (list_queue.SelectedIndices.Count > 0)\r
             {\r
-                if (this.InvokeRequired)\r
-                {\r
-                    this.BeginInvoke(new ProgressUpdateHandler(resetQueue));\r
-                    return;\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
-                }\r
-                btn_stop.Visible = false;\r
-                btn_encode.Enabled = true;\r
+                int firstSelectedIndex = selectedIndices[0];\r
 \r
-                if (cancel == true)\r
-                {\r
-                    lbl_progressValue.Text = "Encode Queue Cancelled!";\r
-                }\r
-                else\r
-                {\r
-                    lbl_progressValue.Text = "Encode Queue Completed!";\r
-                }\r
+                // Reverse the list to delete the items from last to first (preserves indices)\r
+                selectedIndices.Reverse();\r
 \r
-                progressBar.Value = 0;\r
+                // Remove each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.Remove(selectedIndex);\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
+                UpdateUIElements();\r
 \r
-                lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
-            }\r
-            catch (Exception exc)\r
-            {\r
-                MessageBox.Show(exc.ToString());\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
-        // Stop's the queue from continuing. \r
-        private void btn_stop_Click(object sender, EventArgs e)\r
+        // Queue Management\r
+        private void mnu_up_Click(object sender, EventArgs e)\r
         {\r
-            cancel = true;\r
-            btn_stop.Visible = false;\r
-            btn_encode.Enabled = true;\r
-            MessageBox.Show("No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode Video' when you wish to continue encoding the queue.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+            MoveUp();\r
         }\r
 \r
-        // Updates the progress bar and progress label for a new status.\r
-        private void updateUIElements()\r
+        private void mnu_Down_Click(object sender, EventArgs e)\r
         {\r
-            try\r
-            {\r
-                if (this.InvokeRequired)\r
-                {\r
-                    this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));\r
-                    return;\r
-                }\r
-\r
-                redrawQueue();\r
-\r
-                progressBar.PerformStep();\r
-                lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
-                lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
-            }\r
-            catch (Exception exc)\r
-            {\r
-                MessageBox.Show(exc.ToString());\r
-            }\r
+            MoveDown();\r
         }\r
 \r
-        // Set's the information lables about the current encode.\r
-        private void setEncValue()\r
+        private void mnu_delete_Click(object sender, EventArgs e)\r
         {\r
-            try\r
-            {\r
-                if (this.InvokeRequired)\r
-                {\r
-                    this.BeginInvoke(new setEncoding(setEncValue));\r
-                }\r
-\r
-                // found query is a global varible\r
-                Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQuery().Query);\r
-                lbl_source.Text = queue.getLastQuery().Source;\r
-                lbl_dest.Text = queue.getLastQuery().Destination;\r
+            DeleteSelectedItems();\r
+        }\r
 \r
+        private void btn_up_Click(object sender, EventArgs e)\r
+        {\r
+            MoveUp();\r
+        }\r
 \r
-                if (parsed.DVDTitle == 0)\r
-                    lbl_title.Text = "Auto";\r
-                else\r
-                    lbl_title.Text = parsed.DVDTitle.ToString();\r
+        private void btn_down_Click(object sender, EventArgs e)\r
+        {\r
+            MoveDown();\r
+        }\r
 \r
-                string chapters = "";\r
-                if (parsed.DVDChapterStart == 0)\r
-                {\r
-                    lbl_chapt.Text = "Auto";\r
-                }\r
-                else\r
-                {\r
-                    chapters = parsed.DVDChapterStart.ToString();\r
-                    if (parsed.DVDChapterFinish != 0)\r
-                        chapters = chapters + " - " + parsed.DVDChapterFinish;\r
-                    lbl_chapt.Text = chapters;\r
-                }\r
+        private void btn_delete_Click(object sender, EventArgs e)\r
+        {\r
+            DeleteSelectedItems();\r
+        }\r
 \r
-                lbl_vEnc.Text = parsed.VideoEncoder;\r
-                lbl_aEnc.Text = parsed.AudioEncoder1;\r
-            }\r
-            catch (Exception)\r
-            {\r
-                // Do Nothing\r
-            }\r
+        private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
+        {\r
+            if (e.KeyCode == Keys.Delete)\r
+                DeleteSelectedItems();\r
         }\r
 \r
-        // Move an item up the Queue\r
-        private void btn_up_Click(object sender, EventArgs e)\r
+        private void MoveUp()\r
         {\r
-            if (list_queue.SelectedIndices.Count != 0)\r
+            // If there are selected items and the first item is not selected\r
+            if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))\r
             {\r
-                int selected = list_queue.SelectedIndices[0];\r
+                // Copy the selected indices to preserve them during the movement\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
-                queue.moveUp(selected);\r
-                queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-                redrawQueue();\r
+                // Move up each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.MoveUp(selectedIndex);\r
 \r
-                if (selected - 1 > 0) \r
-                    list_queue.Items[selected -1].Selected = true;\r
+                UpdateUIElements();\r
 \r
-                list_queue.Select();\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
+                        list_queue.Items[selectedIndex - 1].Selected = true;\r
             }\r
+\r
+            list_queue.Select(); // Activate the control to show the selected items\r
         }\r
 \r
-        // Move an item down the Queue\r
-        private void btn_down_Click(object sender, EventArgs e)\r
+        private void MoveDown()\r
         {\r
-            if (list_queue.SelectedIndices.Count != 0)\r
+            // If there are selected items and the last item is not selected\r
+            if (list_queue.SelectedIndices.Count > 0 &&\r
+                !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index))\r
             {\r
-                int selected = list_queue.SelectedIndices[0];\r
+                // Copy the selected indices to preserve them during the movement\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
-                queue.moveDown(list_queue.SelectedIndices[0]);\r
-                queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-                redrawQueue();\r
+                // Reverse the indices to move the items down from last to first (preserves indices)\r
+                selectedIndices.Reverse();\r
 \r
-                if (selected +1 < list_queue.Items.Count) \r
-                    list_queue.Items[selected + 1].Selected = true;\r
+                // Move down each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.MoveDown(selectedIndex);\r
 \r
-                list_queue.Select();\r
-            }\r
-        }\r
+                UpdateUIElements();\r
 \r
-        // Remove an item from the queue\r
-        private void btn_delete_Click(object sender, EventArgs e)\r
-        {\r
-            if (list_queue.SelectedIndices.Count != 0)\r
-            {\r
-                queue.remove(list_queue.SelectedIndices[0]);\r
-                queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-                redrawQueue();\r
-                lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\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
+                        list_queue.Items[selectedIndex + 1].Selected = true;\r
             }\r
+\r
+            list_queue.Select(); // Activate the control to show the selected items\r
         }\r
 \r
-        // Generate a Saveable batch script on the users request\r
+        // Queue Import/Export Features\r
         private void mnu_batch_Click(object sender, EventArgs e)\r
         {\r
-            SaveFile.FileName = "";\r
+            SaveFile.FileName = string.Empty;\r
             SaveFile.Filter = "Batch|.bat";\r
             SaveFile.ShowDialog();\r
             if (SaveFile.FileName != String.Empty)\r
-                queue.writeBatchScript(SaveFile.FileName);\r
+                queue.WriteBatchScriptToFile(SaveFile.FileName);\r
         }\r
 \r
-        // Export the HandBrake Queue to a file.\r
         private void mnu_export_Click(object sender, EventArgs e)\r
         {\r
-            SaveFile.FileName = "";\r
+            SaveFile.FileName = string.Empty;\r
             SaveFile.Filter = "HandBrake Queue|*.queue";\r
             SaveFile.ShowDialog();\r
             if (SaveFile.FileName != String.Empty)\r
-                queue.write2disk(SaveFile.FileName);\r
+                queue.WriteQueueStateToFile(SaveFile.FileName);\r
         }\r
 \r
-        // Import an exported queue\r
         private void mnu_import_Click(object sender, EventArgs e)\r
         {\r
-            OpenFile.FileName = "";\r
+            OpenFile.FileName = string.Empty;\r
             OpenFile.ShowDialog();\r
             if (OpenFile.FileName != String.Empty)\r
-                queue.recoverQueue(OpenFile.FileName);\r
-            redrawQueue();\r
+                queue.LoadQueueFromFile(OpenFile.FileName);\r
+            UpdateUIElements();\r
         }\r
 \r
-        // Delete a selected item on the queue, if the delete key is pressed.\r
-        private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
+        private void mnu_readd_Click(object sender, EventArgs e)\r
         {\r
-            if (e.KeyCode == Keys.Delete)\r
+            if (!queue.LastEncode.IsEmpty)\r
             {\r
-                if (list_queue.SelectedIndices.Count != 0)\r
-                {\r
-                    queue.remove(list_queue.SelectedIndices[0]);\r
-                    queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-                    redrawQueue();\r
-                }\r
+                queue.Add(queue.LastEncode.Query, queue.LastEncode.Source, queue.LastEncode.Destination, \r
+                          queue.LastEncode.CustomQuery);\r
+                UpdateUIElements();\r
             }\r
         }\r
 \r
-        // Hide's the window from the users view.\r
-        private void btn_Close_Click(object sender, EventArgs e)\r
+        private void mnu_reconfigureJob_Click(object sender, EventArgs e)\r
         {\r
-            this.Hide();\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
+            }\r
         }\r
 \r
+\r
         // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
         protected override void OnClosing(CancelEventArgs e)\r
         {\r
@@ -401,6 +439,5 @@ namespace Handbrake
             this.Hide();\r
             base.OnClosing(e);\r
         }\r
-\r
     }\r
 }
\ No newline at end of file