OSDN Git Service

CLI: update the built in presets
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmQueue.cs
index c7b280e..2684772 100644 (file)
 /*  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
-\r
-using System;\r
-using System.Collections.Generic;\r
-using System.ComponentModel;\r
-using System.Windows.Forms;\r
-using Handbrake.EncodeQueue;\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
+    using System;\r
+    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
+\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
-        QueueHandler queue;\r
 \r
-        public frmQueue(QueueHandler q)\r
+        /// <summary>\r
+        /// An instance of the Queue service\r
+        /// </summary>\r
+        private readonly IQueue queue;\r
+\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
+            this.mainWindow = mw;\r
+\r
             this.queue = q;\r
-            queue.OnEncodeStart += new EventHandler(queueOnEncodeStart);\r
-            queue.OnQueueFinished += new EventHandler(queueOnQueueFinished);\r
-            queue.OnPaused += new EventHandler(queueOnPaused);\r
+            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
-        void queueOnPaused(object sender, EventArgs e)\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
-        void queueOnQueueFinished(object sender, EventArgs e)\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
-            resetQueue(); // Reset the Queue Window\r
+            SetUiEncodeFinished();\r
+            ResetQueue(); // Reset the Queue Window\r
         }\r
-        void queueOnEncodeStart(object sender, EventArgs e)\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
         /// Initializes the Queue list with the Arraylist from the Queue class\r
         /// </summary>\r
-        public void setQueue()\r
+        public void SetQueue()\r
         {\r
-            updateUIElements();\r
+            UpdateUiElementsOnQueueChange();\r
         }\r
 \r
         /// <summary>\r
@@ -56,7 +194,7 @@ namespace Handbrake
         /// </summary>\r
         public new void Show()\r
         {\r
-           Show(true);\r
+            Show(true);\r
         }\r
 \r
         /// <summary>\r
@@ -65,114 +203,152 @@ namespace Handbrake
         /// <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
+            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.isPaused)\r
+            if (queue.Paused)\r
             {\r
-                setUIEncodeStarted();\r
-                MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
+                SetUiEncodeStarted();\r
             }\r
 \r
-            if (!queue.isEncodeStarted)\r
-                queue.startEncode();\r
-\r
+            lbl_encodeStatus.Text = "Encoding ...";\r
+            queue.Start();\r
         }\r
-        private void btn_pause_Click(object sender, EventArgs e)\r
+\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.pauseEncodeQueue();\r
-            setUIEncodeFinished();\r
-            resetQueue();\r
-            MessageBox.Show("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.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+            queue.Pause();\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
-        // Window Display Management\r
-        private void setUIEncodeStarted()\r
+        // UI Work\r
+\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
-        private void setUIEncodeFinished()\r
+\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
-        private void resetQueue()\r
+\r
+        /// <summary>\r
+        /// Reset the Queue Window display\r
+        /// </summary>\r
+        private void ResetQueue()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(resetQueue));\r
+                BeginInvoke(new UpdateHandler(ResetQueue));\r
                 return;\r
             }\r
             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
-        private void redrawQueue()\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
             {\r
-                BeginInvoke(new UpdateHandler(redrawQueue));\r
+                BeginInvoke(new UpdateHandler(RedrawQueue));\r
                 return;\r
             }\r
 \r
             list_queue.Items.Clear();\r
-            List<Job> theQueue = queue.getQueue();\r
-            foreach (Job queue_item in theQueue)\r
+            ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
+            foreach (Job queueItem in theQueue)\r
             {\r
-                string q_item = queue_item.Query;\r
-                Functions.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
                 string audio = string.Empty;\r
-                foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
+                foreach (AudioTrack track in parsed.AudioInformation)\r
                 {\r
-                    if (audio != "")\r
+                    if (audio != string.Empty)\r
                         audio += ", " + track.Encoder;\r
                     else\r
                         audio = track.Encoder;\r
@@ -182,121 +358,165 @@ namespace Handbrake
                 list_queue.Items.Add(item);\r
             }\r
         }\r
-        private void updateUIElements()\r
+\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
-            redrawQueue();\r
+            RedrawQueue();\r
             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
         }\r
-        private void setCurrentEncodeInformation()\r
+\r
+        /// <summary>\r
+        /// Set the window up with the current encode information\r
+        /// </summary>\r
+        private void SetCurrentEncodeInformation()\r
         {\r
             try\r
             {\r
                 if (InvokeRequired)\r
                 {\r
-                    BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));\r
+                    BeginInvoke(new UpdateHandler(SetCurrentEncodeInformation));\r
                 }\r
 \r
-                // found query is a global varible\r
-                Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.lastQueueItem.Query);\r
-                lbl_source.Text = queue.lastQueueItem.Source;\r
-                lbl_dest.Text = queue.lastQueueItem.Destination;\r
-\r
-                lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
+                QueryParser parsed = QueryParser.Parse(queue.LastEncode.Query);\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 (Functions.AudioTrack track in parsed.AudioInformation)\r
+                foreach (AudioTrack track in parsed.AudioInformation)\r
                 {\r
-                    if (audio != "")\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
-        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
-        {\r
-            moveUp();\r
-        }\r
-        private void mnu_Down_Click(object sender, EventArgs e)\r
-        {\r
-            moveDown();\r
-        }\r
-        private void mnu_delete_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
-            deleteSelectedItems();\r
+            MoveUp();\r
         }\r
-        private void btn_up_Click(object sender, EventArgs e)\r
+\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
-            moveUp();\r
+            MoveDown();\r
         }\r
-        private void btn_down_Click(object sender, EventArgs e)\r
+\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
-        private void btn_delete_Click(object sender, EventArgs e)\r
+\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
+            DeleteSelectedItems();\r
         }\r
-        private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
+\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
-                deleteSelectedItems();\r
+            if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.None)\r
+                DeleteSelectedItems();\r
         }\r
-        private void moveUp()\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
             if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))\r
@@ -308,9 +528,7 @@ namespace Handbrake
 \r
                 // Move up each selected item\r
                 foreach (int selectedIndex in selectedIndices)\r
-                    queue.moveUp(selectedIndex);\r
-\r
-                updateUIElements();\r
+                    queue.MoveUp(selectedIndex);\r
 \r
                 // Keep the selected item(s) selected, now moved up one index\r
                 foreach (int selectedIndex in selectedIndices)\r
@@ -320,7 +538,11 @@ namespace Handbrake
 \r
             list_queue.Select(); // Activate the control to show the selected items\r
         }\r
-        private void moveDown()\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
             if (list_queue.SelectedIndices.Count > 0 &&\r
@@ -336,9 +558,7 @@ namespace Handbrake
 \r
                 // Move down each selected item\r
                 foreach (int selectedIndex in selectedIndices)\r
-                    queue.moveDown(selectedIndex);\r
-\r
-                updateUIElements();\r
+                    queue.MoveDown(selectedIndex);\r
 \r
                 // Keep the selected item(s) selected, now moved down one index\r
                 foreach (int selectedIndex in selectedIndices)\r
@@ -349,41 +569,121 @@ 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
-            SaveFile.FileName = "";\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
             SaveFile.ShowDialog();\r
             if (SaveFile.FileName != String.Empty)\r
-                queue.writeBatchScript(SaveFile.FileName);\r
+                queue.WriteBatchScriptToFile(SaveFile.FileName);\r
         }\r
-        private void mnu_export_Click(object sender, EventArgs e)\r
+\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 = "";\r
+            SaveFile.FileName = string.Empty;\r
             SaveFile.Filter = "HandBrake Queue|*.queue";\r
             SaveFile.ShowDialog();\r
             if (SaveFile.FileName != String.Empty)\r
-                queue.updateQueueRecoveryFile(SaveFile.FileName);\r
+                queue.WriteQueueStateToFile(SaveFile.FileName);\r
         }\r
-        private void mnu_import_Click(object sender, EventArgs e)\r
+\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 = "";\r
+            OpenFile.FileName = string.Empty;\r
             OpenFile.ShowDialog();\r
             if (OpenFile.FileName != String.Empty)\r
-                queue.recoverQueue(OpenFile.FileName);\r
-            updateUIElements();\r
+                queue.LoadQueueFromFile(OpenFile.FileName);\r
         }\r
-        private void mnu_readd_Click(object sender, EventArgs e)\r
+\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.lastQueueItem != null)\r
+            if (queue.LastEncode != null && !queue.LastEncode.IsEmpty)\r
             {\r
-                queue.add(queue.lastQueueItem.Query, queue.lastQueueItem.Source, queue.lastQueueItem.Destination);\r
-                updateUIElements();\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
-        // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
+        /* Overrides */\r
+\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
@@ -391,5 +691,20 @@ namespace Handbrake
             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
-}\r
+}
\ No newline at end of file