\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
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
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
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
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
base.OnClosing(e);\r
}\r
\r
-\r
}\r
-}
\ No newline at end of file
+}\r