OSDN Git Service

WinGui: Fix subtitle forced for foreign scan. Set it to "scan" instead of "Forced"
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmQueue.cs
index 5d2b7ba..3529789 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.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 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 UpdateHandler();\r
+        private EncodeAndQueueHandler queue;\r
 \r
-        public frmQueue()\r
+        public frmQueue(EncodeAndQueueHandler q)\r
         {\r
             InitializeComponent();\r
-        }\r
 \r
-        int initialListCount = 0;\r
-        bool started = false;\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
-      \r
-        private void btn_q_encoder_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Initializes the Queue list with the Arraylist from the Queue class\r
+        /// </summary>\r
+        public void setQueue()\r
         {\r
-            progressBar.Value = 0;\r
-            lbl_progressValue.Text = "0 %";\r
-            progressBar.Step = 100 / list_queue.Items.Count;\r
-            progressBar.Update();\r
-            ThreadPool.QueueUserWorkItem(startProc);\r
+            updateUIElements();\r
         }\r
 \r
-        /*\r
-         * \r
-         * Code to Handle the CLI and updating of the UI as each process is completed.\r
-         * \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
-        [DllImport("user32.dll")]\r
-        public static extern void LockWorkStation();\r
-        [DllImport("user32.dll")]\r
-        public static extern int ExitWindowsEx(int uFlags, int dwReason); \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
+            if (doSetQueue) setQueue();\r
+            base.Show();\r
 \r
+            //Activate();\r
+        }\r
 \r
-        private void startProc(object state)\r
+        // Start and Stop Controls\r
+        private void btn_encode_Click(object sender, EventArgs e)\r
         {\r
-            started = true;\r
-            initialListCount = list_queue.Items.Count;\r
-            for (int i = 0; i < initialListCount; i++)\r
+            if (queue.PauseRequested)\r
             {\r
-                string query = list_queue.Items[0].ToString();\r
-\r
-                Functions.CLI process = new Functions.CLI();\r
-                Process hbProc = process.runCli(this, query, false, false, false, false);\r
-                \r
-                hbProc.WaitForExit();\r
-                hbProc.Close();\r
-                hbProc.Dispose();\r
-                updateUIElements();\r
-\r
-                if ((initialListCount - i) != (list_queue.Items.Count))\r
-                {\r
-                    initialListCount++;\r
-                }\r
+                setUIEncodeStarted();\r
+                MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
             }\r
-            started = false;\r
+\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
-            // Do something whent he encode ends.\r
-            switch (Properties.Settings.Default.CompletionOption)\r
+        // Window Display Management\r
+        private void setUIEncodeStarted()\r
+        {\r
+            if (InvokeRequired)\r
             {\r
-                case "Shutdown":\r
-                    System.Diagnostics.Process.Start("Shutdown", "-s -t 60");\r
-                    break;\r
-                case "Log Off":\r
-                    ExitWindowsEx(0, 0);\r
-                    break;\r
-                case "Suspend":\r
-                    Application.SetSuspendState(PowerState.Suspend, true, true);\r
-                    break;\r
-                case "Hibernate":\r
-                    Application.SetSuspendState(PowerState.Hibernate, true, true);\r
-                    break;\r
-                case "Lock System":\r
-                    LockWorkStation();\r
-                    break;\r
-                case "Quit HandBrake":\r
-                    Application.Exit();\r
-                    break;\r
-                default:\r
-                    break;\r
+                BeginInvoke(new UpdateHandler(setUIEncodeStarted));\r
+                return;\r
             }\r
-\r
-            MessageBox.Show("Encode Queue Completed!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
+            btn_encode.Enabled = false;\r
+            btn_pause.Visible = true;\r
         }\r
-\r
-        private void updateUIElements()\r
+        private void setUIEncodeFinished()\r
         {\r
-            if (this.InvokeRequired)\r
+            if (InvokeRequired)\r
             {\r
-                this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));\r
+                BeginInvoke(new UpdateHandler(setUIEncodeFinished));\r
                 return;\r
             }\r
-            this.list_queue.Items.RemoveAt(0);\r
-\r
-            progressBar.PerformStep();\r
-            lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);\r
-            progressBar.Update();\r
+            btn_pause.Visible = false;\r
+            btn_encode.Enabled = true;\r
         }\r
-\r
         private void resetQueue()\r
         {\r
-            if (this.InvokeRequired)\r
+            if (InvokeRequired)\r
             {\r
-                this.BeginInvoke(new ProgressUpdateHandler(resetQueue));\r
+                BeginInvoke(new UpdateHandler(resetQueue));\r
                 return;\r
             }\r
-            lbl_progressValue.Text = "0 %";\r
-            progressBar.Value = 0;\r
-            progressBar.Update();\r
-        }\r
+            btn_pause.Visible = false;\r
+            btn_encode.Enabled = true;\r
 \r
-        /*\r
-         * \r
-         * Code to Re-arrange / Delete items from the Queue\r
-         * \r
-         */\r
-        #region Queue Management\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
-        private void btn_up_Click(object sender, EventArgs e)\r
+            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+        }\r
+        private void redrawQueue()\r
         {\r
-            int count = list_queue.Items.Count;\r
-            int itemToMove = list_queue.SelectedIndex;\r
-            int previousItemint = 0;\r
-            String previousItem = "";\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateHandler(redrawQueue));\r
+                return;\r
+            }\r
 \r
-            if (itemToMove > 0)\r
+            list_queue.Items.Clear();\r
+            ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
+            foreach (Job queue_item in theQueue)\r
             {\r
-                previousItemint = itemToMove - 1;\r
-                previousItem = list_queue.Items[previousItemint].ToString();\r
-                list_queue.Items[previousItemint] = list_queue.Items[itemToMove];\r
-                list_queue.Items[itemToMove] = previousItem;\r
-                list_queue.SelectedIndex = list_queue.SelectedIndex - 1;\r
+                string q_item = queue_item.Query;\r
+                Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
+\r
+                // Get the DVD Title\r
+                string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\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
+                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
+                // 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
+                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
-        private void btn_down_Click(object sender, EventArgs e)\r
+            redrawQueue();\r
+            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+        }\r
+        private void setCurrentEncodeInformation()\r
         {\r
-            int count = list_queue.Items.Count;\r
-            int itemToMove = list_queue.SelectedIndex;\r
-            int itemAfterInt = 0;\r
-            String itemAfter = "";\r
+            try\r
+            {\r
+                if (InvokeRequired)\r
+                {\r
+                    BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));\r
+                }\r
+\r
+                // found query is a global varible\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
+                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
+                lbl_vEnc.Text = parsed.VideoEncoder;\r
 \r
-            if (itemToMove < (count - 1))\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
-                itemAfterInt = itemToMove + 1;\r
-                itemAfter = list_queue.Items[itemAfterInt].ToString();\r
-                list_queue.Items[itemAfterInt] = list_queue.Items[itemToMove];\r
-                list_queue.Items[itemToMove] = itemAfter;\r
-                list_queue.SelectedIndex = list_queue.SelectedIndex + 1;\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.RemoveJob(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
+\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
+            moveDown();\r
+        }\r
         private void btn_delete_Click(object sender, EventArgs e)\r
         {\r
-            list_queue.Items.Remove(list_queue.SelectedItem);\r
-            if (started == true)\r
-                initialListCount--;\r
+            deleteSelectedItems();\r
         }\r
-        #endregion\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
+                // 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
-        /*\r
-         * Hide the Queue Window\r
-         */\r
-        private void btn_Close_Click(object sender, EventArgs e)\r
+                // Move up each selected item\r
+                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
+                        list_queue.Items[selectedIndex - 1].Selected = true;\r
+            }\r
+\r
+            list_queue.Select(); // Activate the control to show the selected items\r
+        }\r
+        private void moveDown()\r
         {\r
-            this.Hide();\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
+                // 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
-        private void btn_minimise_Click(object sender, EventArgs e)\r
+        // Queue Import/Export Features\r
+        private void mnu_batch_Click(object sender, EventArgs e)\r
         {\r
-            this.WindowState = FormWindowState.Minimized;\r
+            SaveFile.FileName = "";\r
+            SaveFile.Filter = "Batch|.bat";\r
+            SaveFile.ShowDialog();\r
+            if (SaveFile.FileName != String.Empty)\r
+                queue.WriteBatchScriptToFile(SaveFile.FileName);\r
         }\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.WriteQueueStateToFile(SaveFile.FileName);\r
+        }\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.LoadQueueFromFile(OpenFile.FileName);\r
+            updateUIElements();\r
+        }\r
+        private void mnu_readd_Click(object sender, EventArgs e)\r
+        {\r
+            if (!queue.LastEncode.IsEmpty)\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 when the user tries to "x" out of the window instead of closing it.\r
+        protected override void OnClosing(CancelEventArgs e)\r
+        {\r
+            e.Cancel = true;\r
+            this.Hide();\r
+            base.OnClosing(e);\r
+        }\r
+\r
     }\r
-}
\ No newline at end of file
+}\r