OSDN Git Service

merge 0.9.4 to jp
[handbrake-jp/handbrake-jp.git] / win / C# / frmQueue.cs
index a45693b..a7bc0fb 100644 (file)
@@ -6,61 +6,72 @@
 \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
+using Handbrake.EncodeQueue;\r
+using System.Collections.ObjectModel;\r
 \r
 namespace Handbrake\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
-        Functions.Queue queue;\r
-        frmMain mainWindow = null;\r
+        private delegate void UpdateHandler();\r
+        private EncodeAndQueueHandler queue;\r
 \r
-        public frmQueue(frmMain main)\r
+        public frmQueue(EncodeAndQueueHandler q)\r
         {\r
             InitializeComponent();\r
-            mainWindow = main;\r
+\r
+            this.queue = q;\r
+            queue.NewJobStarted += new EventHandler(queueOnEncodeStart);\r
+            queue.QueueCompleted += new EventHandler(queueOnQueueFinished);\r
+            queue.QueuePauseRequested += new EventHandler(queueOnPaused);\r
+        }\r
+        void queueOnPaused(object sender, EventArgs e)\r
+        {\r
+            setUIEncodeFinished();\r
+            updateUIElements();\r
+        }\r
+        void queueOnQueueFinished(object sender, EventArgs e)\r
+        {\r
+            setUIEncodeFinished();\r
+            resetQueue(); // Reset the Queue Window\r
+        }\r
+        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(Functions.Queue qw)\r
+        public void setQueue()\r
         {\r
+/* HEAD:\r
             queue = qw;\r
             redrawQueue();\r
             lbl_encodesPending.Text = list_queue.Items.Count + "\8cÂ\82Ì\83W\83\87\83u\82ª\91Ò\8b@\92\86";\r
+*/\r
+            updateUIElements();\r
         }\r
 \r
         /// <summary>\r
-        /// Returns if there is currently an item being encoded by the queue\r
+        /// Initializes the Queue list, then shows and activates the window\r
         /// </summary>\r
-        /// <returns>Boolean true if encoding</returns>\r
-        public Boolean isEncoding()\r
+        public new void Show()\r
         {\r
-            if (hbProc == null)\r
-                return false;\r
-            else\r
-                return true;\r
+           Show(true);\r
         }\r
 \r
-        // Redraw's the queue with the latest data from the Queue class\r
-        private void redrawQueue()\r
+        /// <summary>\r
+        /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window\r
+        /// </summary>\r
+        /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>\r
+        public void Show(bool doSetQueue)\r
         {\r
+/* HEAD:\r
             list_queue.Items.Clear();\r
             ArrayList theQueue = queue.getQueue();\r
             foreach (ArrayList queue_item in theQueue)\r
@@ -93,99 +104,93 @@ namespace Handbrake
                 item.SubItems.Add(parsed.Destination); // Destination\r
                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
                 item.SubItems.Add(parsed.AudioEncoder1); // Audio\r
+*/\r
+            if (doSetQueue) setQueue();\r
+            base.Show();\r
 \r
-                list_queue.Items.Add(item);\r
-            }\r
+            //Activate();\r
         }\r
 \r
-        // Initializes the encode process\r
+        // Start and Stop Controls\r
         private void btn_encode_Click(object sender, EventArgs e)\r
         {\r
-            mainWindow.setLastAction("encode");\r
-            \r
-            if (queue.count() != 0)\r
+            if (queue.PauseRequested)\r
             {\r
-                btn_encode.Enabled = false;\r
+                setUIEncodeStarted();\r
+                MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
             }\r
-            cancel = false;\r
 \r
-            // Start the encode\r
-            try\r
+            if (!queue.isEncoding)\r
+                queue.StartEncodeQueue();\r
+\r
+        }\r
+        private void btn_pause_Click(object sender, EventArgs e)\r
+        {\r
+            queue.RequestPause();\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
+        }\r
+\r
+        // Window Display Management\r
+        private void setUIEncodeStarted()\r
+        {\r
+            if (InvokeRequired)\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
+                BeginInvoke(new UpdateHandler(setUIEncodeStarted));\r
+                return;\r
             }\r
-            catch (Exception exc)\r
+            btn_encode.Enabled = false;\r
+            btn_pause.Visible = true;\r
+        }\r
+        private void setUIEncodeFinished()\r
+        {\r
+            if (InvokeRequired)\r
             {\r
-                MessageBox.Show(exc.ToString());\r
+                BeginInvoke(new UpdateHandler(setUIEncodeFinished));\r
+                return;\r
             }\r
+            btn_pause.Visible = false;\r
+            btn_encode.Enabled = true;\r
         }\r
-\r
-        // Starts the encoding process\r
-        private void startProc(object state)\r
+        private void resetQueue()\r
         {\r
-            try\r
+            if (InvokeRequired)\r
             {\r
-                // Run through each item on the queue\r
-                while (queue.count() != 0)\r
-                {\r
-                    string query = queue.getNextItemForEncoding();\r
-                    queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
-\r
-                    setEncValue();\r
-                    updateUIElements();\r
-\r
-                    hbProc = cliObj.runCli(this, query);\r
-\r
-                    hbProc.WaitForExit();\r
-                    cliObj.addCLIQueryToLog(query);\r
-                    cliObj.copyLog(query);\r
-\r
-                    hbProc.Close();\r
-                    hbProc.Dispose();\r
-                    hbProc = null;\r
-                    query = "";\r
-\r
-                    if (cancel == true)\r
-                    {\r
-                        break;\r
-                    }\r
-                }\r
+                BeginInvoke(new UpdateHandler(resetQueue));\r
+                return;\r
+            }\r
+            btn_pause.Visible = false;\r
+            btn_encode.Enabled = true;\r
 \r
-                resetQueue();\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
-                // After the encode is done, we may want to shutdown, suspend etc.\r
-                cliObj.afterEncodeAction();\r
-            }\r
-            catch (Exception exc)\r
+            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+        }\r
+        private void redrawQueue()\r
+        {\r
+            if (InvokeRequired)\r
             {\r
-                MessageBox.Show(exc.ToString());\r
+                BeginInvoke(new UpdateHandler(redrawQueue));\r
+                return;\r
             }\r
-        }\r
 \r
-        // Reset's the window to the default state.\r
-        private void resetQueue()\r
-        {\r
-            try\r
+            list_queue.Items.Clear();\r
+            ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
+            foreach (Job queue_item in theQueue)\r
             {\r
-                if (this.InvokeRequired)\r
-                {\r
-                    this.BeginInvoke(new ProgressUpdateHandler(resetQueue));\r
-                    return;\r
+                string q_item = queue_item.Query;\r
+                Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
 \r
-                }\r
-                btn_stop.Visible = false;\r
-                btn_encode.Enabled = true;\r
+                // Get the DVD Title\r
+                string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
 \r
+/* HEAD\r
                 if (cancel == true)\r
                 {\r
                     lbl_progressValue.Text = "\83G\83\93\83R\81[\83h\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½";\r
@@ -193,17 +198,37 @@ namespace Handbrake
                 else\r
                 {\r
                     lbl_progressValue.Text = "\83G\83\93\83R\81[\83h\8dì\8bÆ\82ð\8a®\97¹\82µ\82Ü\82µ\82½";\r
+*/\r
+                // Get the DVD Chapters\r
+                string chapters;\r
+                if (parsed.DVDChapterStart == 0)\r
+                    chapters = "Auto";\r
+                else\r
+                {\r
+                    chapters = parsed.DVDChapterStart.ToString();\r
+                    if (parsed.DVDChapterFinish != 0)\r
+                        chapters = chapters + " - " + parsed.DVDChapterFinish;\r
                 }\r
 \r
-                progressBar.Value = 0;\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(parsed.VideoEncoder); // Video\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
+                // Display The Audio Track Information\r
+                string audio = string.Empty;\r
+                foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
+                {\r
+                    if (audio != "")\r
+                        audio += ", " + track.Encoder;\r
+                    else\r
+                        audio = track.Encoder;\r
+                }\r
+                item.SubItems.Add(audio); // Audio\r
 \r
+/* HEAD\r
                 lbl_encodesPending.Text = list_queue.Items.Count + "\8cÂ\82Ì\83W\83\87\83u\82ª\91Ò\8b@\92\86";\r
             }\r
             catch (Exception exc)\r
@@ -239,27 +264,38 @@ namespace Handbrake
                 lbl_encodesPending.Text = list_queue.Items.Count + "\8cÂ\82Ì\83W\83\87\83u\82ª\91Ò\8b@\92\86";\r
             }\r
             catch (Exception exc)\r
-            {\r
-                MessageBox.Show(exc.ToString());\r
+*/\r
+                list_queue.Items.Add(item);\r
             }\r
         }\r
+        private void updateUIElements()\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateHandler(updateUIElements));\r
+                return;\r
+            }\r
 \r
-        // Set's the information lables about the current encode.\r
-        private void setEncValue()\r
+            redrawQueue();\r
+            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+        }\r
+        private void setCurrentEncodeInformation()\r
         {\r
             try\r
             {\r
-                if (this.InvokeRequired)\r
+                if (InvokeRequired)\r
                 {\r
-                    this.BeginInvoke(new setEncoding(setEncValue));\r
+                    BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));\r
                 }\r
 \r
                 // found query is a global varible\r
-                Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQuery());\r
-                lbl_source.Text = parsed.Source;\r
-                lbl_dest.Text = parsed.Destination;\r
+                Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.LastEncode.Query);\r
+                lbl_source.Text = queue.LastEncode.Source;\r
+                lbl_dest.Text = queue.LastEncode.Destination;\r
 \r
+                lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
 \r
+/* HEAD\r
                 if (parsed.DVDTitle == 0)\r
                     lbl_title.Text = "Automatic";\r
                 else\r
@@ -268,123 +304,187 @@ namespace Handbrake
                 string chapters = "";\r
                 if (parsed.DVDChapterStart == 0)\r
                 {\r
+*/\r
+                if (Equals(parsed.DVDChapterStart, 0))\r
                     lbl_chapt.Text = "Auto";\r
-                }\r
                 else\r
                 {\r
-                    chapters = parsed.DVDChapterStart.ToString();\r
+                    string chapters = parsed.DVDChapterStart.ToString();\r
                     if (parsed.DVDChapterFinish != 0)\r
                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
                     lbl_chapt.Text = chapters;\r
                 }\r
 \r
                 lbl_vEnc.Text = parsed.VideoEncoder;\r
-                lbl_aEnc.Text = parsed.AudioEncoder1;\r
+\r
+                // Display The Audio Track Information\r
+                string audio = string.Empty;\r
+                foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
+                {\r
+                    if (audio != "")\r
+                        audio += ", " + track.Encoder;\r
+                    else\r
+                        audio = track.Encoder;\r
+                }\r
+                lbl_aEnc.Text = audio;\r
             }\r
             catch (Exception)\r
             {\r
                 // Do Nothing\r
             }\r
         }\r
-\r
-        // Move an item up the Queue\r
-        private void btn_up_Click(object sender, EventArgs e)\r
+        private void deleteSelectedItems()\r
         {\r
-            if (list_queue.SelectedIndices.Count != 0)\r
+            // If there are selected items\r
+            if (list_queue.SelectedIndices.Count > 0)\r
             {\r
-                int selected = list_queue.SelectedIndices[0];\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
-                queue.moveUp(selected);\r
-                queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
-                redrawQueue();\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
-                if (selected - 1 > 0) \r
-                    list_queue.Items[selected -1].Selected = true;\r
+                // Remove each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.RemoveJob(selectedIndex);\r
 \r
-                list_queue.Select();\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
 \r
-        // Move an item down the Queue\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
+        {\r
+            deleteSelectedItems();\r
+        }\r
+        private void btn_up_Click(object sender, EventArgs e)\r
+        {\r
+            moveUp();\r
+        }\r
         private void btn_down_Click(object sender, EventArgs e)\r
         {\r
-            if (list_queue.SelectedIndices.Count != 0)\r
+            moveDown();\r
+        }\r
+        private void btn_delete_Click(object sender, EventArgs e)\r
+        {\r
+            deleteSelectedItems();\r
+        }\r
+        private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
+        {\r
+            if (e.KeyCode == Keys.Delete)\r
+                deleteSelectedItems();\r
+        }\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
             {\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.dat"); // 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 < list_queue.Items.Count) \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
 \r
-        // Remove an item from the queue\r
-        private void btn_delete_Click(object sender, EventArgs e)\r
+            list_queue.Select(); // Activate the control to show the selected items\r
+        }\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
+/* HEAD\r
                 queue.remove(list_queue.SelectedIndices[0]);\r
                 queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file\r
                 redrawQueue();\r
                 lbl_encodesPending.Text = list_queue.Items.Count + "\8cÂ\82Ì\83W\83\87\83u\82ª\91Ò\8b@\92\86";\r
+*/\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
+                // Reverse the indices to move the items down from last to first (preserves indices)\r
+                selectedIndices.Reverse();\r
+\r
+                // Move down each selected item\r
+                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
+                        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.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.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.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.dat"); // Update the queue recovery file\r
-                    redrawQueue();\r
-                }\r
+                queue.AddJob(queue.LastEncode.Query, queue.LastEncode.Source, queue.LastEncode.Destination, 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
-        {\r
-            this.Hide();\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
@@ -393,6 +493,5 @@ namespace Handbrake
             base.OnClosing(e);\r
         }\r
 \r
-\r
     }\r
-}
\ No newline at end of file
+}\r