private void JobChangeHandler(IJobView jobView, JobChangeEvent changeEvent)
        {
            switch (changeEvent)
            {
            case JobChangeEvent.Enqueued:
                pane.JobsQueued++;
                entriesHolder.Add(new JobEntry(jobView, jobView.GetJobTypeDescription()));
                break;

            case JobChangeEvent.BeforeRun:
            {
                var entry = entriesHolder.Find(e => e.JobId == jobView.Id);
                if (entry == null || entry.Locked)
                {
                    return;
                }

                pane.JobsQueued--;
                pane.JobsInProgress++;
                entry.Status = JobStatus.Running;
            }
            break;

            case JobChangeEvent.AfterCompleted:
            {
                var entry = entriesHolder.Find(e => e.JobId == jobView.Id);
                if (entry == null || entry.Locked)
                {
                    return;
                }

                pane.JobsInProgress--;

                entry.Status = JobStatus.Done;
                entry.Locked = true;
            }
            break;

            case JobChangeEvent.OnProgressChange:
            {
                var entry = entriesHolder.Find(e => e.JobId == jobView.Id);
                if (entry == null)
                {
                    pane.JobsInProgress++;
                    entriesHolder.AddToTop(new JobEntry(jobView, jobView.GetJobTypeDescription()));
                }
                else if (entry.Locked)
                {
                    return;
                }
                else
                {
                    entry.EntryProgress = jobView.Progress;
                }
            }
            break;

            case JobChangeEvent.ExceptionThrown:
            {
                var entry = entriesHolder.Find(e => e.JobId == jobView.Id);
                if (entry == null || entry.Locked)
                {
                    return;
                }

                pane.JobsInProgress--;
                entry.EntryException = jobView.Exception;
                entry.Status         = JobStatus.Error;
                entry.Locked         = true;
            }
            break;

            case JobChangeEvent.Canceled:
            {
                var entry = entriesHolder.Find(e => e.JobId == jobView.Id);
                if (entry == null || entry.Locked)
                {
                    return;
                }

                pane.JobsInProgress--;
                entry.Status = JobStatus.Canceled;
                entry.Locked = true;
            }
            break;

            default:
                throw new ArgumentOutOfRangeException("JobsPanePresenter.JobsChanged: Maybe new type of JobChangeEvent?");
            }

            if (changeEvent == JobChangeEvent.AfterCompleted || changeEvent == JobChangeEvent.ExceptionThrown || changeEvent == JobChangeEvent.Canceled)
            {
                Task.Delay(2000).ContinueWith(
                    _ => { entriesHolder.Remove(e => e.JobId == jobView.Id); }
                    , new CancellationToken()
                    , TaskContinuationOptions.None
                    , TaskScheduler.FromCurrentSynchronizationContext()
                    );
            }
        }