summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
Diffstat (limited to 'win')
-rw-r--r--win/CS/Functions/Main.cs2
-rw-r--r--win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj1
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/QueueItemStatus.cs30
-rw-r--r--win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs17
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/Encode.cs19
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs13
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs60
-rw-r--r--win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs16
-rw-r--r--win/CS/frmQueue.Designer.cs42
-rw-r--r--win/CS/frmQueue.cs66
10 files changed, 243 insertions, 23 deletions
diff --git a/win/CS/Functions/Main.cs b/win/CS/Functions/Main.cs
index 2775b8064..9aa5afdc4 100644
--- a/win/CS/Functions/Main.cs
+++ b/win/CS/Functions/Main.cs
@@ -412,7 +412,7 @@ namespace Handbrake.Functions
return queueFiles;
}
- catch (Exception)
+ catch (Exception exc)
{
return new List<string>(); // Keep quiet about the error.
}
diff --git a/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj b/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj
index 55fa4a380..52906af73 100644
--- a/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj
+++ b/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj
@@ -107,6 +107,7 @@
<Compile Include="Model\General\UpdateCheckResult.cs" />
<Compile Include="Model\ModelBase.cs" />
<Compile Include="Model\Preset.cs" />
+ <Compile Include="Model\QueueItemStatus.cs" />
<Compile Include="Model\QueueTask.cs" />
<Compile Include="Model\Encoding\SubtitleType.cs" />
<Compile Include="Parsing\Audio.cs" />
diff --git a/win/CS/HandBrake.ApplicationServices/Model/QueueItemStatus.cs b/win/CS/HandBrake.ApplicationServices/Model/QueueItemStatus.cs
new file mode 100644
index 000000000..774d0a788
--- /dev/null
+++ b/win/CS/HandBrake.ApplicationServices/Model/QueueItemStatus.cs
@@ -0,0 +1,30 @@
+/* QueueItemStatus.cs $
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr>.
+ It may be used under the terms of the GNU General Public License. */
+
+namespace HandBrake.ApplicationServices.Model
+{
+ using System.ComponentModel;
+
+ using HandBrake.ApplicationServices.Converters;
+
+ /// <summary>
+ /// Queue Item Status
+ /// </summary>
+ [TypeConverter(typeof(EnumToDescConveter))]
+ public enum QueueItemStatus
+ {
+ [Description("Waiting")]
+ Waiting = 0,
+
+ [Description("In Progress")]
+ InProgress,
+
+ [Description("Completed")]
+ Completed,
+
+ [Description("Error")]
+ Error,
+ }
+}
diff --git a/win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs b/win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs
index 83948a1f3..aa71a2819 100644
--- a/win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs
+++ b/win/CS/HandBrake.ApplicationServices/Model/QueueTask.cs
@@ -5,6 +5,8 @@
namespace HandBrake.ApplicationServices.Model
{
+ using System;
+
/// <summary>
/// The QueueTask.
/// </summary>
@@ -65,6 +67,21 @@ namespace HandBrake.ApplicationServices.Model
public bool CustomQuery { get; set; }
/// <summary>
+ /// Gets or sets Status.
+ /// </summary>
+ public QueueItemStatus Status { get; set; }
+
+ /// <summary>
+ /// Gets or sets StartTime.
+ /// </summary>
+ public DateTime StartTime { get; set; }
+
+ /// <summary>
+ /// Gets or sets ElaspedEncodeTime.
+ /// </summary>
+ public TimeSpan ElaspedEncodeTime { get; set; }
+
+ /// <summary>
/// Gets or sets the Encode Task.
/// </summary>
public EncodeTask Task { get; set; }
diff --git a/win/CS/HandBrake.ApplicationServices/Services/Encode.cs b/win/CS/HandBrake.ApplicationServices/Services/Encode.cs
index 26708434f..953831732 100644
--- a/win/CS/HandBrake.ApplicationServices/Services/Encode.cs
+++ b/win/CS/HandBrake.ApplicationServices/Services/Encode.cs
@@ -40,6 +40,11 @@ namespace HandBrake.ApplicationServices.Services
/// </summary>
private DateTime startTime;
+ /// <summary>
+ /// The Current Task
+ /// </summary>
+ private QueueTask currentTask;
+
#endregion
/// <summary>
@@ -75,7 +80,7 @@ namespace HandBrake.ApplicationServices.Services
{
try
{
- QueueTask queueTask = encodeQueueTask;
+ this.currentTask = encodeQueueTask;
if (this.IsEncoding)
{
@@ -88,7 +93,7 @@ namespace HandBrake.ApplicationServices.Services
{
try
{
- this.SetupLogging(queueTask);
+ this.SetupLogging(currentTask);
}
catch (Exception)
{
@@ -103,10 +108,10 @@ namespace HandBrake.ApplicationServices.Services
}
// Make sure the path exists, attempt to create it if it doesn't
- this.VerifyEncodeDestinationPath(queueTask);
+ this.VerifyEncodeDestinationPath(currentTask);
string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
- ProcessStartInfo cliStart = new ProcessStartInfo(handbrakeCLIPath, queueTask.Query)
+ ProcessStartInfo cliStart = new ProcessStartInfo(handbrakeCLIPath, currentTask.Query)
{
RedirectStandardOutput = true,
RedirectStandardError = enableLogging ? true : false,
@@ -164,7 +169,10 @@ namespace HandBrake.ApplicationServices.Services
}
catch (Exception exc)
{
- this.Invoke_encodeCompleted(new EncodeCompletedEventArgs(false, exc, "An Error occured when trying to encode this source. "));
+ TimeSpan time = DateTime.Now.Subtract(this.currentTask.StartTime);
+ this.Invoke_encodeCompleted(
+ new EncodeCompletedEventArgs(
+ false, exc, "An Error occured when trying to encode this source. "));
}
}
@@ -266,6 +274,7 @@ namespace HandBrake.ApplicationServices.Services
// This exception doesn't warrent user interaction, but it should be logged (TODO)
}
+ this.currentTask.Status = QueueItemStatus.Completed;
this.Invoke_encodeCompleted(new EncodeCompletedEventArgs(true, null, string.Empty));
}
diff --git a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs
index 2c9005cfb..be87b3705 100644
--- a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs
+++ b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IQueueManager.cs
@@ -56,6 +56,19 @@ namespace HandBrake.ApplicationServices.Services.Interfaces
void Remove(QueueTask job);
/// <summary>
+ /// Reset a Queued Item from Error or Completed to Waiting
+ /// </summary>
+ /// <param name="job">
+ /// The job.
+ /// </param>
+ void ResetJobStatusToWaiting(QueueTask job);
+
+ /// <summary>
+ /// Clear down the Queue�s completed items
+ /// </summary>
+ void ClearCompleted();
+
+ /// <summary>
/// Get the first job on the queue for processing.
/// This also removes the job from the Queue and sets the LastProcessedJob
/// </summary>
diff --git a/win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs b/win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs
index ad56043ac..d8ebbf31e 100644
--- a/win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs
+++ b/win/CS/HandBrake.ApplicationServices/Services/QueueManager.cs
@@ -13,6 +13,7 @@ namespace HandBrake.ApplicationServices.Services
using System.Windows.Forms;
using System.Xml.Serialization;
+ using HandBrake.ApplicationServices.Exceptions;
using HandBrake.ApplicationServices.Model;
using HandBrake.ApplicationServices.Services.Interfaces;
@@ -114,7 +115,7 @@ namespace HandBrake.ApplicationServices.Services
{
get
{
- return this.queue.Count;
+ return this.queue.Where(item => item.Status == QueueItemStatus.Waiting).Count();
}
}
@@ -168,6 +169,35 @@ namespace HandBrake.ApplicationServices.Services
}
/// <summary>
+ /// Reset a Queued Item from Error or Completed to Waiting
+ /// </summary>
+ /// <param name="job">
+ /// The job.
+ /// </param>
+ public void ResetJobStatusToWaiting(QueueTask job)
+ {
+ if (job.Status != QueueItemStatus.Error && job.Status != QueueItemStatus.Completed)
+ {
+ throw new GeneralApplicationException("Job Error", "Unable to reset job status as it is not in an Error or Completed state", null);
+ }
+
+ job.Status = QueueItemStatus.Waiting;
+ }
+
+ /// <summary>
+ /// Clear down the Queue´s completed items
+ /// </summary>
+ public void ClearCompleted()
+ {
+ List<QueueTask> deleteList = this.queue.Where(task => task.Status == QueueItemStatus.Completed).ToList();
+ foreach (QueueTask item in deleteList)
+ {
+ this.queue.Remove(item);
+ }
+ this.InvokeQueueChanged(EventArgs.Empty);
+ }
+
+ /// <summary>
/// Get the first job on the queue for processing.
/// This also removes the job from the Queue and sets the LastProcessedJob
/// </summary>
@@ -178,9 +208,14 @@ namespace HandBrake.ApplicationServices.Services
{
if (this.queue.Count > 0)
{
- QueueTask job = this.queue[0];
- this.LastProcessedJob = job;
- this.Remove(job); // Remove the item which we are about to pass out.
+ QueueTask job = this.queue.FirstOrDefault(q => q.Status == QueueItemStatus.Waiting);
+ if (job != null)
+ {
+ job.Status = QueueItemStatus.InProgress;
+ job.StartTime = DateTime.Now;
+ this.LastProcessedJob = job;
+ InvokeQueueChanged(EventArgs.Empty);
+ }
return job;
}
@@ -233,10 +268,12 @@ namespace HandBrake.ApplicationServices.Services
string appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");
string tempPath = !string.IsNullOrEmpty(exportPath) ? exportPath : appDataPath + string.Format(this.queueFile, string.Empty);
+
using (FileStream strm = new FileStream(tempPath, FileMode.Create, FileAccess.Write))
{
+ List<QueueTask> tasks = queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
XmlSerializer serializer = new XmlSerializer(typeof(List<QueueTask>));
- serializer.Serialize(strm, queue);
+ serializer.Serialize(strm, tasks);
strm.Close();
strm.Dispose();
}
@@ -265,7 +302,18 @@ namespace HandBrake.ApplicationServices.Services
if (list != null)
foreach (QueueTask item in list)
- this.queue.Add(item);
+ {
+ if (item.Status != QueueItemStatus.Completed)
+ {
+ // Reset InProgress/Error to Waiting so it can be processed
+ if (item.Status == QueueItemStatus.InProgress)
+ {
+ item.Status = QueueItemStatus.Waiting;
+ }
+
+ this.queue.Add(item);
+ }
+ }
this.InvokeQueueChanged(EventArgs.Empty);
}
diff --git a/win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs b/win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs
index fe3eb8549..be9c46359 100644
--- a/win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs
+++ b/win/CS/HandBrake.ApplicationServices/Services/QueueProcessor.cs
@@ -30,6 +30,7 @@ namespace HandBrake.ApplicationServices.Services
/// The encode Service.
/// </param>
/// <exception cref="ArgumentNullException">
+ /// Services are not setup
/// </exception>
public QueueProcessor(IQueueManager queueManager, IEncode encodeService)
{
@@ -177,7 +178,6 @@ namespace HandBrake.ApplicationServices.Services
/// </summary>
public void Pause()
{
- this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted;
this.InvokeQueuePaused(EventArgs.Empty);
this.IsProcessing = false;
}
@@ -193,6 +193,8 @@ namespace HandBrake.ApplicationServices.Services
/// </param>
private void EncodeServiceEncodeCompleted(object sender, EncodeCompletedEventArgs e)
{
+ this.QueueManager.LastProcessedJob.Status = QueueItemStatus.Completed;
+
// Growl
if (Properties.Settings.Default.GrowlEncode)
GrowlCommunicator.Notify("Encode Completed",
@@ -200,6 +202,7 @@ namespace HandBrake.ApplicationServices.Services
if (!e.Successful)
{
+ this.QueueManager.LastProcessedJob.Status = QueueItemStatus.Error;
this.Pause();
throw new GeneralApplicationException(e.ErrorInformation, e.Exception.Message, e.Exception);
}
@@ -214,7 +217,16 @@ namespace HandBrake.ApplicationServices.Services
}
// Move onto the next job.
- this.ProcessNextJob();
+ if (this.IsProcessing)
+ {
+ this.ProcessNextJob();
+ }
+ else
+ {
+ this.EncodeService.EncodeCompleted -= this.EncodeServiceEncodeCompleted;
+ this.InvokeQueueCompleted(EventArgs.Empty);
+ this.QueueManager.BackupQueue(string.Empty);
+ }
}
/// <summary>
diff --git a/win/CS/frmQueue.Designer.cs b/win/CS/frmQueue.Designer.cs
index 5a4924325..9beaf0a5e 100644
--- a/win/CS/frmQueue.Designer.cs
+++ b/win/CS/frmQueue.Designer.cs
@@ -54,6 +54,7 @@ namespace Handbrake
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
this.SaveFile = new System.Windows.Forms.SaveFileDialog();
this.list_queue = new System.Windows.Forms.ListView();
+ this.Status = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.Title = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.Chapters = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.Source = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
@@ -67,6 +68,7 @@ namespace Handbrake
this.mnu_edit = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.mnu_delete = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnuClearCompleted = new System.Windows.Forms.ToolStripMenuItem();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.lbl_encodesPending = new System.Windows.Forms.ToolStripStatusLabel();
this.OpenFile = new System.Windows.Forms.OpenFileDialog();
@@ -76,6 +78,7 @@ namespace Handbrake
this.panel3 = new System.Windows.Forms.Panel();
this.panel2 = new System.Windows.Forms.Panel();
this.panel1 = new System.Windows.Forms.Panel();
+ this.mnu_Retry = new System.Windows.Forms.ToolStripMenuItem();
this.toolStrip1.SuspendLayout();
this.mnu_queue.SuspendLayout();
this.statusStrip1.SuspendLayout();
@@ -257,6 +260,7 @@ namespace Handbrake
// list_queue
//
this.list_queue.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.Status,
this.Title,
this.Chapters,
this.Source,
@@ -277,6 +281,11 @@ namespace Handbrake
this.list_queue.View = System.Windows.Forms.View.Details;
this.list_queue.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ListQueueDeleteKey);
//
+ // Status
+ //
+ this.Status.Text = "Job Status";
+ this.Status.Width = 80;
+ //
// Title
//
this.Title.Text = "Title";
@@ -314,49 +323,58 @@ namespace Handbrake
this.mnu_Down,
this.toolStripSeparator3,
this.mnu_edit,
+ this.mnu_Retry,
this.toolStripSeparator4,
+ this.mnuClearCompleted,
this.mnu_delete});
this.mnu_queue.Name = "mnu_queue";
- this.mnu_queue.Size = new System.Drawing.Size(139, 104);
+ this.mnu_queue.Size = new System.Drawing.Size(164, 148);
//
// mnu_up
//
this.mnu_up.Name = "mnu_up";
- this.mnu_up.Size = new System.Drawing.Size(138, 22);
+ this.mnu_up.Size = new System.Drawing.Size(163, 22);
this.mnu_up.Text = "Move Up";
this.mnu_up.Click += new System.EventHandler(this.MnuUpClick);
//
// mnu_Down
//
this.mnu_Down.Name = "mnu_Down";
- this.mnu_Down.Size = new System.Drawing.Size(138, 22);
+ this.mnu_Down.Size = new System.Drawing.Size(163, 22);
this.mnu_Down.Text = "Move Down";
this.mnu_Down.Click += new System.EventHandler(this.MnuDownClick);
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
- this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6);
+ this.toolStripSeparator3.Size = new System.Drawing.Size(160, 6);
//
// mnu_edit
//
this.mnu_edit.Name = "mnu_edit";
- this.mnu_edit.Size = new System.Drawing.Size(138, 22);
+ this.mnu_edit.Size = new System.Drawing.Size(163, 22);
this.mnu_edit.Text = "Edit";
this.mnu_edit.Click += new System.EventHandler(this.MnuEditClick);
//
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
- this.toolStripSeparator4.Size = new System.Drawing.Size(135, 6);
+ this.toolStripSeparator4.Size = new System.Drawing.Size(160, 6);
//
// mnu_delete
//
this.mnu_delete.Name = "mnu_delete";
- this.mnu_delete.Size = new System.Drawing.Size(138, 22);
+ this.mnu_delete.Size = new System.Drawing.Size(163, 22);
this.mnu_delete.Text = "Delete";
this.mnu_delete.Click += new System.EventHandler(this.MnuDeleteClick);
//
+ // mnuClearCompleted
+ //
+ this.mnuClearCompleted.Name = "mnuClearCompleted";
+ this.mnuClearCompleted.Size = new System.Drawing.Size(163, 22);
+ this.mnuClearCompleted.Text = "Clear Completed";
+ this.mnuClearCompleted.Click += new System.EventHandler(this.mnuClearCompleted_Click);
+ //
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -459,6 +477,13 @@ namespace Handbrake
this.panel1.Size = new System.Drawing.Size(15, 214);
this.panel1.TabIndex = 0;
//
+ // mnu_Retry
+ //
+ this.mnu_Retry.Name = "mnu_Retry";
+ this.mnu_Retry.Size = new System.Drawing.Size(163, 22);
+ this.mnu_Retry.Text = "Retry Encode";
+ this.mnu_Retry.Click += new System.EventHandler(this.mnu_Retry_Click);
+ //
// frmQueue
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -531,5 +556,8 @@ namespace Handbrake
private System.Windows.Forms.ToolStripComboBox drp_completeOption;
private System.Windows.Forms.ToolStripButton toolStripButton1;
private System.Windows.Forms.Panel panel3;
+ private System.Windows.Forms.ColumnHeader Status;
+ private System.Windows.Forms.ToolStripMenuItem mnuClearCompleted;
+ private System.Windows.Forms.ToolStripMenuItem mnu_Retry;
}
}
diff --git a/win/CS/frmQueue.cs b/win/CS/frmQueue.cs
index 6bc7081f5..94c7cebd0 100644
--- a/win/CS/frmQueue.cs
+++ b/win/CS/frmQueue.cs
@@ -47,6 +47,9 @@ namespace Handbrake
/// </summary>
private readonly frmMain mainWindow;
+ /// <summary>
+ /// The User setting service
+ /// </summary>
private readonly IUserSettingService userSettingService = new UserSettingService();
/// <summary>
@@ -137,6 +140,8 @@ namespace Handbrake
return;
}
+ this.queue.QueueManager.LastProcessedJob.ElaspedEncodeTime = e.ElapsedTime;
+
lbl_encodeStatus.Text =
string.Format(
"Encoding: Pass {0} of {1}, {2:00.00}%, FPS: {3:000.0}, Avg FPS: {4:000.0}, Time Remaining: {5}, Elapsed: {6:hh\\:mm\\:ss}",
@@ -299,6 +304,7 @@ namespace Handbrake
btn_pause.Visible = false;
btn_encode.Enabled = true;
+ this.RedrawQueue();
ResetEncodeText();
}
@@ -353,7 +359,9 @@ namespace Handbrake
chapters = chapters + " - " + parsed.EndPoint;
}
- ListViewItem item = new ListViewItem { Tag = queueItem, Text = title };
+ ListViewItem item = new ListViewItem
+ { Tag = queueItem, Text = EnumHelper<QueueItemStatus>.GetDescription(queueItem.Status) };
+ item.SubItems.Add(title);
item.SubItems.Add(chapters); // Chapters
item.SubItems.Add(queueItem.Source); // Source
item.SubItems.Add(queueItem.Destination); // Destination
@@ -389,6 +397,9 @@ namespace Handbrake
UpdateStatusLabel();
}
+ /// <summary>
+ /// Update the Display
+ /// </summary>
private void UpdateStatusLabel()
{
if (InvokeRequired)
@@ -397,7 +408,7 @@ namespace Handbrake
return;
}
- lbl_encodesPending.Text = string.Format("{0} encodes(s) pending", list_queue.Items.Count);
+ lbl_encodesPending.Text = string.Format("{0} encodes(s) pending", this.queue.QueueManager.Count);
}
/// <summary>
@@ -718,5 +729,56 @@ namespace Handbrake
{
userSettingService.SetUserSetting(UserSettingConstants.WhenCompleteAction, drp_completeOption.Text);
}
+
+ /// <summary>
+ /// Clear all completed items
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void mnuClearCompleted_Click(object sender, EventArgs e)
+ {
+ this.queue.QueueManager.ClearCompleted();
+ }
+
+ /// <summary>
+ /// Retry Job Menu Item
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The e.
+ /// </param>
+ private void mnu_Retry_Click(object sender, EventArgs e)
+ {
+ if (list_queue.SelectedIndices.Count != 0)
+ {
+ lock (queue)
+ {
+ lock (list_queue)
+ {
+ QueueTask index = list_queue.SelectedItems[0].Tag as QueueTask;
+
+ try
+ {
+ queue.QueueManager.ResetJobStatusToWaiting(index);
+ }
+ catch (Exception)
+ {
+ MessageBox.Show(
+ "Can only retry a job if it is in an Error or Completed state.",
+ "Notice",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ }
+ RedrawQueue();
+ }
+ }
+ }
+ }
}
} \ No newline at end of file