X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=win%2FC%23%2FfrmQueue.cs;h=2684772bbd8cfedbadf1b3a2d5ede9526ee010c6;hb=4560ade3c833f282f02d15a9473e233488617df9;hp=7c52305a86a25d568a818081e5638a87ee2f529e;hpb=2bb9a2aab40a8d031eab3c5a5b1ec2c559a83b6f;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/win/C#/frmQueue.cs b/win/C#/frmQueue.cs index 7c52305a..2684772b 100644 --- a/win/C#/frmQueue.cs +++ b/win/C#/frmQueue.cs @@ -1,361 +1,689 @@ /* frmQueue.cs $ - - This file is part of the HandBrake source code. - Homepage: . - It may be used under the terms of the GNU General Public License. */ - -using System; -using System.Collections.Generic; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Threading; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.IO; + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ namespace Handbrake { + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.ComponentModel; + using System.IO; + using System.Windows.Forms; + using Functions; + + using HandBrake.ApplicationServices.Model; + using HandBrake.ApplicationServices.Services; + using HandBrake.ApplicationServices.Services.Interfaces; + + using Model; + + /// + /// The Queue Window + /// public partial class frmQueue : Form { - private delegate void ProgressUpdateHandler(); - private delegate void setEncoding(); - Functions.Encode cliObj = new Functions.Encode(); - Boolean cancel = false; - Process hbProc = null; - Functions.Queue queue; + /// + /// Update Handler Delegate + /// + private delegate void UpdateHandler(); + + /// + /// An instance of the Queue service + /// + private readonly IQueue queue; + + /// + /// A reference to the main application window + /// + private readonly frmMain mainWindow; - public frmQueue() + /// + /// Initializes a new instance of the class. + /// + /// + /// An instance of the queue service. + /// + /// + /// The main window. + /// + public frmQueue(IQueue q, frmMain mw) { InitializeComponent(); + + this.mainWindow = mw; + + this.queue = q; + queue.EncodeStarted += new EventHandler(QueueOnEncodeStart); + queue.QueueCompleted += new EventHandler(QueueOnQueueFinished); + queue.QueuePauseRequested += new EventHandler(QueueOnPaused); + queue.QueueListChanged += new EventHandler(queue_QueueListChanged); + + queue.EncodeStarted += new EventHandler(queue_EncodeStarted); + queue.EncodeEnded += new EventHandler(queue_EncodeEnded); + + drp_completeOption.Text = Properties.Settings.Default.CompletionOption; } /// - /// Initializes the Queue list with the Arraylist from the Queue class + /// Queue Changed /// - /// - public void setQueue(Functions.Queue qw) + /// + /// The sender. + /// + /// + /// The e. + /// + private void queue_QueueListChanged(object sender, EventArgs e) { - queue = qw; - redrawQueue(); + UpdateUiElementsOnQueueChange(); } /// - /// Returns if there is currently an item being encoded by the queue + /// Encode Ended /// - /// Boolean true if encoding - public Boolean isEncoding() + /// + /// The sender. + /// + /// + /// The e. + /// + private void queue_EncodeEnded(object sender, EventArgs e) { - if (hbProc == null) - return false; - else - return true; + queue.EncodeStatusChanged -= EncodeQueue_EncodeStatusChanged; + ResetEncodeText(); } - // Redraw's the queue with the latest data from the Queue class - private void redrawQueue() + /// + /// Queue Started + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void queue_EncodeStarted(object sender, EventArgs e) { - list_queue.Items.Clear(); - foreach (ArrayList queue_item in queue.getQueue()) + this.SetCurrentEncodeInformation(); + queue.EncodeStatusChanged += EncodeQueue_EncodeStatusChanged; + } + + /// + /// Display the Encode Status + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void EncodeQueue_EncodeStatusChanged(object sender, HandBrake.ApplicationServices.EncodeProgressEventArgs e) + { + if (this.InvokeRequired) { - string q_item = queue_item[1].ToString(); - Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item); + this.BeginInvoke(new Encode.EncodeProgessStatus(EncodeQueue_EncodeStatusChanged), new[] { sender, e }); + return; + } - // Get the DVD Title - string title = ""; - if (parsed.DVDTitle == 0) - title = "Auto"; - else - title = parsed.DVDTitle.ToString(); + lbl_encodeStatus.Text = + string.Format( + "Encoding: Pass {0} of {1}, {2:00.00}% Time Remaining: {3}", + e.Task, + e.TaskCount, + e.PercentComplete, + e.EstimatedTimeLeft); + } - // Get the DVD Chapters - string chapters = ""; - if (parsed.DVDChapterStart == 0) - chapters = "Auto"; - else - { - chapters = parsed.DVDChapterStart.ToString(); - if (parsed.DVDChapterFinish != 0) - chapters = chapters + " - " + parsed.DVDChapterFinish; - } + /// + /// Handle the Queue Paused event + /// + /// + /// The sender. + /// + /// + /// The EventArgs. + /// + private void QueueOnPaused(object sender, EventArgs e) + { + SetUiEncodeFinished(); + UpdateUiElementsOnQueueChange(); + } - ListViewItem item = new ListViewItem(); - item.Text = title; // Title - item.SubItems.Add(chapters); // Chapters - item.SubItems.Add(parsed.Source); // Source - item.SubItems.Add(parsed.Destination); // Destination - item.SubItems.Add(parsed.VideoEncoder); // Video - item.SubItems.Add(parsed.AudioEncoder1); // Audio + /// + /// Handle the Queue Finished event. + /// + /// + /// The sender. + /// + /// + /// The EventArgs. + /// + private void QueueOnQueueFinished(object sender, EventArgs e) + { + SetUiEncodeFinished(); + ResetQueue(); // Reset the Queue Window + } - list_queue.Items.Add(item); + /// + /// Handle the Encode Started event + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void QueueOnEncodeStart(object sender, EventArgs e) + { + SetUiEncodeStarted(); // make sure the UI is set correctly + UpdateUiElementsOnQueueChange(); // Redraw the Queue, a new encode has started. + } + + /// + /// Initializes the Queue list with the Arraylist from the Queue class + /// + public void SetQueue() + { + UpdateUiElementsOnQueueChange(); + } + + /// + /// Initializes the Queue list, then shows and activates the window + /// + public new void Show() + { + Show(true); + } + + /// + /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window + /// + /// Indicates whether to call setQueue() before showing the window + public void Show(bool doSetQueue) + { + if (doSetQueue) SetQueue(); + base.Show(); + } + + /// + /// Handle the Encode button Click event + /// + /// The sender + /// the EventArgs + private void BtnEncodeClick(object sender, EventArgs e) + { + if (queue.Paused) + { + SetUiEncodeStarted(); } + + lbl_encodeStatus.Text = "Encoding ..."; + queue.Start(); } - // Initializes the encode process - private void btn_encode_Click(object sender, EventArgs e) + /// + /// Handle the Pause button click event. + /// + /// + /// The sender. + /// + /// + /// The EventArgs. + /// + private void BtnPauseClick(object sender, EventArgs e) { - if (queue.count() != 0) + queue.Pause(); + 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); + } + + // UI Work + + /// + /// Setup the UI to show that an encode has started + /// + private void SetUiEncodeStarted() + { + if (InvokeRequired) { - btn_encode.Enabled = false; + BeginInvoke(new UpdateHandler(SetUiEncodeStarted)); + return; } - cancel = false; + btn_encode.Enabled = false; + btn_pause.Visible = true; + } - // Start the encode - try + /// + /// Setup the UI to indicate that an encode has finished. + /// + private void SetUiEncodeFinished() + { + if (InvokeRequired) { - if (queue.count() != 0) - { - // Setup or reset some values - btn_stop.Visible = true; - progressBar.Value = 0; - lbl_progressValue.Text = "0 %"; - progressBar.Step = 100 / queue.count(); - Thread theQ = new Thread(startProc); - theQ.IsBackground = true; - theQ.Start(); - } + BeginInvoke(new UpdateHandler(SetUiEncodeFinished)); + return; } - catch (Exception exc) + btn_pause.Visible = false; + btn_encode.Enabled = true; + } + + /// + /// Reset the Queue Window display + /// + private void ResetQueue() + { + if (InvokeRequired) { - MessageBox.Show(exc.ToString()); + BeginInvoke(new UpdateHandler(ResetQueue)); + return; } + btn_pause.Visible = false; + btn_encode.Enabled = true; + + ResetEncodeText(); } - // Starts the encoding process - private void startProc(object state) + /// + /// Reset the current job text + /// + private void ResetEncodeText() { - try + if (InvokeRequired) { - // Run through each item on the queue - while (queue.count() != 0) - { - string query = queue.getNextItemForEncoding(); + BeginInvoke(new UpdateHandler(ResetEncodeText)); + return; + } + lbl_encodeStatus.Text = "Ready"; - setEncValue(); - updateUIElements(); + lbl_source.Text = "-"; + lbl_dest.Text = "-"; + lbl_encodeOptions.Text = "-"; - hbProc = cliObj.runCli(this, query); + lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending"; + } - hbProc.WaitForExit(); - hbProc.Close(); - hbProc.Dispose(); - hbProc = null; + /// + /// Redraw the Queue window with the latest information about HandBrakes status + /// + private void RedrawQueue() + { + if (InvokeRequired) + { + BeginInvoke(new UpdateHandler(RedrawQueue)); + return; + } - query = ""; + list_queue.Items.Clear(); + ReadOnlyCollection theQueue = queue.CurrentQueue; + foreach (Job queueItem in theQueue) + { + string qItem = queueItem.Query; + QueryParser parsed = Functions.QueryParser.Parse(qItem); - if (cancel == true) - { - break; - } + // Get the DVD Title + string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString(); + + // Get the DVD Chapters + string chapters; + if (parsed.ChapterStart == 0) + chapters = "Auto"; + else + { + chapters = parsed.ChapterStart.ToString(); + if (parsed.ChapterFinish != 0) + chapters = chapters + " - " + parsed.ChapterFinish; } - resetQueue(); + ListViewItem item = new ListViewItem(); + item.Text = title; // Title + item.SubItems.Add(chapters); // Chapters + item.SubItems.Add(queueItem.Source); // Source + item.SubItems.Add(queueItem.Destination); // Destination + item.SubItems.Add(parsed.VideoEncoder); // Video + + // Display The Audio Track Information + string audio = string.Empty; + foreach (AudioTrack track in parsed.AudioInformation) + { + if (audio != string.Empty) + audio += ", " + track.Encoder; + else + audio = track.Encoder; + } + item.SubItems.Add(audio); // Audio - // After the encode is done, we may want to shutdown, suspend etc. - cliObj.afterEncodeAction(); + list_queue.Items.Add(item); } - catch (Exception exc) + } + + /// + /// Update the UI elements + /// + private void UpdateUiElementsOnQueueChange() + { + if (InvokeRequired) { - MessageBox.Show(exc.ToString()); + BeginInvoke(new UpdateHandler(UpdateUiElementsOnQueueChange)); + return; } + + RedrawQueue(); + lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending"; } - // Reset's the window to the default state. - private void resetQueue() + /// + /// Set the window up with the current encode information + /// + private void SetCurrentEncodeInformation() { try { - if (this.InvokeRequired) + if (InvokeRequired) { - this.BeginInvoke(new ProgressUpdateHandler(resetQueue)); - return; - + BeginInvoke(new UpdateHandler(SetCurrentEncodeInformation)); } - btn_stop.Visible = false; - btn_encode.Enabled = true; - if (cancel == true) - { - lbl_progressValue.Text = "Encode Queue Cancelled!"; - } + QueryParser parsed = QueryParser.Parse(queue.LastEncode.Query); + + // Get title and chapters + string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString(); + string chapterlbl; + if (Equals(parsed.ChapterStart, 0)) + chapterlbl = "Auto"; else { - lbl_progressValue.Text = "Encode Queue Completed!"; + string chapters = parsed.ChapterStart.ToString(); + if (parsed.ChapterFinish != 0) + chapters = chapters + " - " + parsed.ChapterFinish; + chapterlbl = chapters; } - progressBar.Value = 0; + // Get audio information + string audio = string.Empty; + foreach (AudioTrack track in parsed.AudioInformation) + { + if (audio != string.Empty) + audio += ", " + track.Encoder; + else + audio = track.Encoder; + } - lbl_source.Text = "-"; - lbl_dest.Text = "-"; - lbl_vEnc.Text = "-"; - lbl_aEnc.Text = "-"; - lbl_title.Text = "-"; - lbl_chapt.Text = "-"; - } - catch (Exception exc) + // found query is a global varible + lbl_encodeStatus.Text = "Encoding ..."; + lbl_source.Text = queue.LastEncode.Source + "(Title: " + title + " Chapters: " + chapterlbl + ")"; + lbl_dest.Text = queue.LastEncode.Destination; + lbl_encodeOptions.Text = "Video: " + parsed.VideoEncoder + " Audio: " + audio + Environment.NewLine + + "x264 Options: " + parsed.H264Query; + } + catch (Exception) { - MessageBox.Show(exc.ToString()); + // Do Nothing } } - // Stop's the queue from continuing. - private void btn_stop_Click(object sender, EventArgs e) + /* Right Click Menu */ + + /// + /// Handle the Move Up Menu Item + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void MnuUpClick(object sender, EventArgs e) { - cancel = true; - btn_stop.Visible = false; - btn_encode.Enabled = true; - MessageBox.Show("No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode Video' when you wish to continue encoding the queue.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + MoveUp(); } - // Updates the progress bar and progress label for a new status. - private void updateUIElements() + /// + /// Handle the Move down Menu Item + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void MnuDownClick(object sender, EventArgs e) { - try - { - if (this.InvokeRequired) - { - this.BeginInvoke(new ProgressUpdateHandler(updateUIElements)); - return; - } - - redrawQueue(); - - progressBar.PerformStep(); - lbl_progressValue.Text = string.Format("{0} %", progressBar.Value); - } - catch (Exception exc) - { - MessageBox.Show(exc.ToString()); - } + MoveDown(); } - // Set's the information lables about the current encode. - private void setEncValue() + /// + /// Edit a job + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void MnuEditClick(object sender, EventArgs e) { - try + if (list_queue.SelectedIndices != null && list_queue.SelectedIndices.Count != 0) { - if (this.InvokeRequired) + lock (queue) { - this.BeginInvoke(new setEncoding(setEncValue)); + lock (list_queue) + { + int index = list_queue.SelectedIndices[0]; + mainWindow.RecievingJob(queue.GetJob(index)); + queue.Remove(index); + RedrawQueue(); + } } + } + } - // found query is a global varible - Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQuery()); - lbl_source.Text = parsed.Source; - lbl_dest.Text = parsed.Destination; - - - if (parsed.DVDTitle == 0) - lbl_title.Text = "Auto"; - else - lbl_title.Text = parsed.DVDTitle.ToString(); + /// + /// Handle the delete Menu Item + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void MnuDeleteClick(object sender, EventArgs e) + { + DeleteSelectedItems(); + } - string chapters = ""; - if (parsed.DVDChapterStart == 0) - { - lbl_chapt.Text = "Auto"; - } - else - { - chapters = parsed.DVDChapterStart.ToString(); - if (parsed.DVDChapterFinish != 0) - chapters = chapters + " - " + parsed.DVDChapterFinish; - lbl_chapt.Text = chapters; - } + /* Keyboard Shortcuts */ - lbl_vEnc.Text = parsed.VideoEncoder; - lbl_aEnc.Text = parsed.AudioEncoder1; - } - catch (Exception) - { - // Do Nothing - } + /// + /// Handle the delete keyboard press + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void ListQueueDeleteKey(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.None) + DeleteSelectedItems(); } - // Move an item up the Queue - private void btn_up_Click(object sender, EventArgs e) + /* Queue Management */ + + /// + /// Move items up in the queue + /// + private void MoveUp() { - if (list_queue.SelectedIndices.Count != 0) + // If there are selected items and the first item is not selected + if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0)) { - queue.moveUp(list_queue.SelectedIndices[0]); - queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file - redrawQueue(); + // Copy the selected indices to preserve them during the movement + List selectedIndices = new List(list_queue.SelectedIndices.Count); + foreach (int selectedIndex in list_queue.SelectedIndices) + selectedIndices.Add(selectedIndex); + + // Move up each selected item + foreach (int selectedIndex in selectedIndices) + queue.MoveUp(selectedIndex); + + // Keep the selected item(s) selected, now moved up one index + foreach (int selectedIndex in selectedIndices) + if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good + list_queue.Items[selectedIndex - 1].Selected = true; } + + list_queue.Select(); // Activate the control to show the selected items } - // Move an item down the Queue - private void btn_down_Click(object sender, EventArgs e) + /// + /// Move items down in the queue + /// + private void MoveDown() { - if (list_queue.SelectedIndices.Count != 0) + // If there are selected items and the last item is not selected + if (list_queue.SelectedIndices.Count > 0 && + !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index)) { - queue.moveDown(list_queue.SelectedIndices[0]); - queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file - redrawQueue(); + // Copy the selected indices to preserve them during the movement + List selectedIndices = new List(list_queue.SelectedIndices.Count); + foreach (int selectedIndex in list_queue.SelectedIndices) + selectedIndices.Add(selectedIndex); + + // Reverse the indices to move the items down from last to first (preserves indices) + selectedIndices.Reverse(); + + // Move down each selected item + foreach (int selectedIndex in selectedIndices) + queue.MoveDown(selectedIndex); + + // Keep the selected item(s) selected, now moved down one index + foreach (int selectedIndex in selectedIndices) + if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good + list_queue.Items[selectedIndex + 1].Selected = true; } + + list_queue.Select(); // Activate the control to show the selected items } - // Remove an item from the queue - private void btn_delete_Click(object sender, EventArgs e) + /// + /// Delete the currently selected items on the queue + /// + private void DeleteSelectedItems() { - if (list_queue.SelectedIndices.Count != 0) + // If there are selected items + if (list_queue.SelectedIndices.Count > 0) { - queue.remove(list_queue.SelectedIndices[0]); - queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file - redrawQueue(); + // Save the selected indices to select them after the move + List selectedIndices = new List(list_queue.SelectedIndices.Count); + foreach (int selectedIndex in list_queue.SelectedIndices) + selectedIndices.Add(selectedIndex); + + int firstSelectedIndex = selectedIndices[0]; + + // Reverse the list to delete the items from last to first (preserves indices) + selectedIndices.Reverse(); + + // Remove each selected item + foreach (int selectedIndex in selectedIndices) + queue.Remove(selectedIndex); + + // Select the item where the first deleted item was previously + if (firstSelectedIndex < list_queue.Items.Count) + list_queue.Items[firstSelectedIndex].Selected = true; } + + list_queue.Select(); // Activate the control to show the selected items } - // Generate a Saveable batch script on the users request - private void mnu_batch_Click(object sender, EventArgs e) + /* Queue Import / Export features */ + + /// + /// Create a batch script + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void MnuBatchClick(object sender, EventArgs e) { + SaveFile.FileName = string.Empty; SaveFile.Filter = "Batch|.bat"; SaveFile.ShowDialog(); if (SaveFile.FileName != String.Empty) - queue.writeBatchScript(SaveFile.FileName); + queue.WriteBatchScriptToFile(SaveFile.FileName); } - // Export the HandBrake Queue to a file. - private void mnu_export_Click(object sender, EventArgs e) + /// + /// Export Queue + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void MnuExportClick(object sender, EventArgs e) { + SaveFile.FileName = string.Empty; SaveFile.Filter = "HandBrake Queue|*.queue"; SaveFile.ShowDialog(); if (SaveFile.FileName != String.Empty) - queue.write2disk(SaveFile.FileName); + queue.WriteQueueStateToFile(SaveFile.FileName); } - // Import an exported queue - private void mnu_import_Click(object sender, EventArgs e) + /// + /// Import Queue + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void MnuImportClick(object sender, EventArgs e) { + OpenFile.FileName = string.Empty; OpenFile.ShowDialog(); if (OpenFile.FileName != String.Empty) - queue.recoverQueue(OpenFile.FileName); - redrawQueue(); + queue.LoadQueueFromFile(OpenFile.FileName); } - // Delete a selected item on the queue, if the delete key is pressed. - private void list_queue_deleteKey(object sender, KeyEventArgs e) + /// + /// Readd current job to queue + /// + /// + /// The sender. + /// + /// + /// The e. + /// + private void MnuReaddClick(object sender, EventArgs e) { - if (e.KeyCode == Keys.Delete) + if (queue.LastEncode != null && !queue.LastEncode.IsEmpty) { - if (list_queue.SelectedIndices.Count != 0) - { - queue.remove(list_queue.SelectedIndices[0]); - queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file - redrawQueue(); - } + queue.Add( + queue.LastEncode.Query, + queue.LastEncode.Title, + queue.LastEncode.Source, + queue.LastEncode.Destination, + queue.LastEncode.CustomQuery); } } - // Hide's the window from the users view. - private void btn_Close_Click(object sender, EventArgs e) - { - this.Hide(); - } + /* Overrides */ - // Hide's the window when the user tries to "x" out of the window instead of closing it. + /// + /// Hide's the window when the user tries to "x" out of the window instead of closing it. + /// + /// + /// The e. + /// protected override void OnClosing(CancelEventArgs e) { e.Cancel = true; @@ -363,6 +691,20 @@ namespace Handbrake base.OnClosing(e); } - + /// + /// Change the OnComplete option setting. + /// + /// + /// The sender. + /// + /// + /// The EventArgs. + /// + private void CompleteOptionChanged(object sender, EventArgs e) + { + Properties.Settings.Default.CompletionOption = drp_completeOption.Text; + HandBrake.ApplicationServices.Init.CompletionOption = drp_completeOption.Text; + Properties.Settings.Default.Save(); + } } } \ No newline at end of file