public void State_FinishedStream(DriveProxy.API.DriveService.State sender, API.DriveService.Stream stream)
        {
            try
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new DriveProxy.API.DriveService.State.StreamHandler(State_FinishedStream),
                                new object[] { sender, stream });
                    return;
                }

                for (int i = 0; i < panelBody.Controls.Count; i++)
                {
                    var stateControl = panelBody.Controls[i] as StateControl;

                    if (stateControl != null)
                    {
                        if (stateControl.Stream == stream)
                        {
                            if (stream.Failed)
                            {
                                _hasError = true;
                            }
                            break;
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Log.Error(exception, false);
            }
        }
        public StateControl(API.DriveService.Stream stream)
        {
            try
            {
                InitializeComponent();

                Enabled = false;
                Stream  = stream;

                if (stream.IsFolder)
                {
                    pictureBox1.Image = global::DriveProxy.Properties.Resources.smFolder;
                }
                else
                {
                    Icon icon = DriveService.GetFileIcon(stream.FileInfo, 16, 16, true);

                    if (icon == null)
                    {
                        pictureBox1.Image = global::DriveProxy.Properties.Resources.smFile;
                    }
                    else
                    {
                        pictureBox1.Image = icon.ToBitmap();

                        icon.Dispose();
                        icon = null;
                    }
                }

                labelDescription.Text = stream.Title;

                stream.OnProgressChanged += Stream_ProgressChanged;

                labelStatus.Text = "Queued for " + stream.Type;
            }
            catch (Exception exception)
            {
                Log.Error(exception, false);
            }
        }
        public void State_QueuedStream(API.DriveService.State sender, API.DriveService.Stream stream)
        {
            try
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new API.DriveService.State.StreamHandler(State_QueuedStream), new object[] { sender, stream });
                    return;
                }
                stream.OnProgressChanged += Stream_ProgressChanged;

                var control = new StateControl(stream);

                control.OnRemove += StateControl_Remove;

                AddControl(control);
            }
            catch (Exception exception)
            {
                Log.Error(exception, false);
            }
        }
        private void Stream_ProgressChanged(API.DriveService.Stream stream)
        {
            try
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new API.DriveService.Stream.ProgressChanged(Stream_ProgressChanged), new object[] { stream });
                    return;
                }

                _ProgressChangedMutex.Wait();

                try
                {
                    if (stream == null)
                    {
                        return;
                    }

                    StreamType streamType             = stream.Type;
                    bool       streamIsFolder         = stream.IsFolder;
                    bool       streamProcessing       = stream.Processing;
                    bool       streamProcessed        = stream.Processed;
                    bool       streamStarting         = stream.Starting;
                    bool       streamCompleted        = stream.Completed;
                    bool       streamCancelled        = stream.Cancelled;
                    bool       streamFailed           = stream.Failed;
                    string     streamExceptionMessage = stream.ExceptionMessage;
                    int        streamPercentCompleted = stream.PercentCompleted;

                    if (streamType == StreamType.Download)
                    {
                        pictureBoxState.Image = global::DriveProxy.Properties.Resources.download;

                        if (streamProcessing)
                        {
                            labelTitle.Text = "Downloading file... (" + streamPercentCompleted + "%)";
                        }
                        else if (streamCompleted)
                        {
                            labelTitle.Text = "Download file complete";
                        }
                        else if (streamCancelled)
                        {
                            labelTitle.Text = "Download file cancelled";
                        }
                        else if (streamFailed)
                        {
                            labelTitle.Text = "Download file failed";
                        }
                    }
                    else if (streamType == StreamType.Upload)
                    {
                        pictureBoxState.Image = global::DriveProxy.Properties.Resources.upload;

                        if (streamProcessing)
                        {
                            labelTitle.Text = "Uploading file... (" + streamPercentCompleted + "%)";
                        }
                        else if (streamCompleted)
                        {
                            labelTitle.Text = "Upload file complete";
                        }
                        else if (streamCancelled)
                        {
                            labelTitle.Text = "Upload file cancelled";
                        }
                        else if (streamFailed)
                        {
                            labelTitle.Text = "Upload file failed";
                        }
                    }
                    else if (streamType == StreamType.Insert)
                    {
                        pictureBoxState.Image = global::DriveProxy.Properties.Resources.upload;

                        if (streamIsFolder)
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Creating folder... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Create folder completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Create folder cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Create folder failed";
                            }
                        }
                        else
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Creating file... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Create file completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Create file cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Create file failed";
                            }
                        }
                    }
                    else if (streamType == StreamType.Insert)
                    {
                        pictureBoxState.Image = global::DriveProxy.Properties.Resources.upload;

                        if (streamProcessing)
                        {
                            labelTitle.Text = "Uploading... (" + streamPercentCompleted + "%)";
                        }
                        else if (streamCompleted)
                        {
                            labelTitle.Text = "Upload completed";
                        }
                        else if (streamCancelled)
                        {
                            labelTitle.Text = "Upload cancelled";
                        }
                        else if (streamFailed)
                        {
                            labelTitle.Text = "Upload failed";
                        }
                    }
                    else if (streamType == StreamType.Trash)
                    {
                        pictureBoxState.Image = global::DriveProxy.Properties.Resources.upload;

                        if (streamIsFolder)
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Trashing folder... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Trash folder completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Trash folder cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Trash folder failed";
                            }
                        }
                        else
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Trashing file... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Trash file completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Trash file cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Trash file failed";
                            }
                        }
                    }
                    else if (streamType == StreamType.Untrash)
                    {
                        pictureBoxState.Image = global::DriveProxy.Properties.Resources.upload;

                        if (streamIsFolder)
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Restoring folder... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Restore folder completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Restore folder cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Restore folder failed";
                            }
                        }
                        else
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Restoring file... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Restore file completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Restore file cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Restore file failed";
                            }
                        }
                    }
                    else if (streamType == StreamType.Move)
                    {
                        pictureBoxState.Image = global::DriveProxy.Properties.Resources.upload;

                        if (streamIsFolder)
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Moving folder... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Move folder completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Move folder cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Move folder failed";
                            }
                        }
                        else
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Moving file... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Move file completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Move file cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Move file failed";
                            }
                        }
                    }
                    else if (streamType == StreamType.Copy)
                    {
                        pictureBoxState.Image = global::DriveProxy.Properties.Resources.upload;

                        if (streamIsFolder)
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Copying folder... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Copy folder completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Copy folder cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Copy folder failed";
                            }
                        }
                        else
                        {
                            if (streamProcessing)
                            {
                                labelTitle.Text = "Copying file... (" + streamPercentCompleted + "%)";
                            }
                            else if (streamCompleted)
                            {
                                labelTitle.Text = "Copy file completed";
                            }
                            else if (streamCancelled)
                            {
                                labelTitle.Text = "Copy file cancelled";
                            }
                            else if (streamFailed)
                            {
                                labelTitle.Text = "Copy file failed";
                            }
                        }
                    }

                    pictureBoxState.Refresh();
                    labelTitle.Refresh();
                    panelTitleBar.Refresh();
                    panelHeader.Refresh();

                    Application.DoEvents();
                }
                finally
                {
                    _ProgressChangedMutex.Release();
                }
            }
            catch (Exception exception)
            {
                Log.Error(exception, false, false);
            }
        }
        private void Stream_ProgressChanged(API.DriveService.Stream stream)
        {
            try
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new API.DriveService.Stream.ProgressChanged(Stream_ProgressChanged), new object[] { stream });
                    return;
                }

                _ProgressChangedMutex.Wait();

                try
                {
                    if (!Enabled)
                    {
                        return;
                    }

                    var panel = Parent as Panel;

                    if (panel == null || stream == null)
                    {
                        return;
                    }

                    StreamType streamType             = stream.Type;
                    bool       streamIsFolder         = stream.IsFolder;
                    bool       streamProcessing       = stream.Processing;
                    bool       streamProcessed        = stream.Processed;
                    bool       streamStarting         = stream.Starting;
                    bool       streamCompleted        = stream.Completed;
                    bool       streamCancelled        = stream.Cancelled;
                    bool       streamFailed           = stream.Failed;
                    string     streamExceptionMessage = stream.ExceptionMessage;
                    int        streamPercentCompleted = stream.PercentCompleted;

                    if (!_ScrolledIntoView)
                    {
                        _ScrolledIntoView = true;

                        panel.ScrollControlIntoView(this);
                    }

                    if (streamProcessed)
                    {
                        if (progressBar.Value < 100)
                        {
                            labelStatus.Visible = false;
                            progressBar.Visible = true;
                            progressBar.Value   = 100;
                        }
                    }

                    if (streamType == StreamType.Download)
                    {
                        if (streamStarting)
                        {
                            progressBar.Visible = false;
                            labelStatus.Visible = true;
                            labelStatus.Text    = "Downloading File...";
                        }
                        else if (streamCompleted)
                        {
                            progressBar.Visible = false;
                            labelStatus.Visible = true;
                            labelStatus.Text    = "Downloaded File";
                            labelCancel.Visible = false;
                            labelRemove.Visible = true;
                        }
                        else if (streamCancelled)
                        {
                            progressBar.Visible = false;
                            labelStatus.Visible = true;
                            labelStatus.Text    = "Download Cancelled";
                            labelCancel.Visible = false;
                            labelRemove.Visible = true;
                        }
                        else if (streamFailed)
                        {
                            progressBar.Visible = false;
                            labelStatus.Visible = true;
                            labelStatus.Text    = "Download Failed";
                            toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                            toolTip.Active      = true;
                            labelCancel.Visible = false;
                            labelRemove.Visible = true;
                        }
                        else
                        {
                            labelStatus.Visible = false;
                            progressBar.Visible = true;
                            progressBar.Value   = streamPercentCompleted;
                        }
                    }
                    else if (streamType == StreamType.Insert)
                    {
                        if (streamIsFolder)
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Creating Folder...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Created Folder";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Create Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Create Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                        else
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Creating File...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Created File";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Create Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Create Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                    }
                    else if (streamType == StreamType.Upload)
                    {
                        if (streamStarting)
                        {
                            progressBar.Visible = false;
                            labelStatus.Visible = true;
                            labelStatus.Text    = "Uploading File...";
                        }
                        else if (streamCompleted)
                        {
                            progressBar.Visible = false;
                            labelStatus.Visible = true;
                            labelStatus.Text    = "Uploaded File";
                            labelCancel.Visible = false;
                            labelRemove.Visible = true;
                        }
                        else if (streamCancelled)
                        {
                            progressBar.Visible = false;
                            labelStatus.Visible = true;
                            labelStatus.Text    = "Upload Cancelled";
                            labelCancel.Visible = false;
                            labelRemove.Visible = true;
                        }
                        else if (streamFailed)
                        {
                            progressBar.Visible = false;
                            labelStatus.Visible = true;
                            labelStatus.Text    = "Upload Failed";
                            toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                            toolTip.Active      = true;
                            labelCancel.Visible = false;
                            labelRemove.Visible = true;
                        }
                        else
                        {
                            labelStatus.Visible = false;
                            progressBar.Visible = true;
                            progressBar.Value   = streamPercentCompleted;
                        }
                    }
                    else if (streamType == StreamType.Trash)
                    {
                        if (streamIsFolder)
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Trashing Folder...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Trashed Folder";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Trash Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Trash Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                        else
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Trashing File...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Trashed File";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Trash Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Trash Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                    }
                    else if (streamType == StreamType.Untrash)
                    {
                        if (streamIsFolder)
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Restoring Folder...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Restored Folder";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Restore Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Restore Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                        else
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Restoring File...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Restored File";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Restore Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Restore Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                    }
                    else if (streamType == StreamType.Move)
                    {
                        if (streamIsFolder)
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Moving Folder...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Moved Folder";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Move Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Move Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                        else
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Moving File...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Moved File";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Move Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Move Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                    }
                    else if (streamType == StreamType.Copy)
                    {
                        if (streamIsFolder)
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Copying Folder...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Copied Folder";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Copy Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Copy Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                        else
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Copying File...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Copied File";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Copy Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Copy Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                    }
                    else if (streamType == StreamType.Rename)
                    {
                        if (streamIsFolder)
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Renaming Folder...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Renamed Folder";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Rename Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Rename Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                        else
                        {
                            if (streamStarting)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Renaming File...";
                            }
                            else if (streamCompleted)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Renamed File";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamCancelled)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Rename Cancelled";
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else if (streamFailed)
                            {
                                progressBar.Visible = false;
                                labelStatus.Visible = true;
                                labelStatus.Text    = "Rename Failed";
                                toolTip.SetToolTip(labelStatus, streamExceptionMessage);
                                toolTip.Active      = true;
                                labelCancel.Visible = false;
                                labelRemove.Visible = true;
                            }
                            else
                            {
                                labelStatus.Visible = false;
                                progressBar.Visible = true;
                                progressBar.Value   = streamPercentCompleted;
                            }
                        }
                    }

                    labelDescription.Refresh();
                    progressBar.Refresh();
                    labelStatus.Refresh();
                    labelCancel.Refresh();
                    labelRemove.Refresh();
                    panel3.Refresh();

                    Application.DoEvents();
                }
                finally
                {
                    _ProgressChangedMutex.Release();
                }
            }
            catch (Exception exception)
            {
                Log.Error(exception, false, false);
            }
        }