namespace DelftTools.Shell.Core.Workflow { public class FileImportActivity : Activity { public event OnImportFinishedEventHandler OnImportFinished; public delegate void OnImportFinishedEventHandler(FileImportActivity fileImportActivity, object importedObject, IFileImporter importer); private readonly object target; private readonly IFileImporter importer; private bool shouldCancel; private string progressText; /// /// One Activity (thread) for a serial file import. /// public FileImportActivity(IFileImporter importer, object target = null) { this.importer = importer; this.target = target; } public string[] Files { get; set; } public IFileImporter FileImporter { get { return importer; } } /// /// The target object that is currently imported on. /// public object Target { get { return target; } } public object ImportedItemOwner { get; set; } protected override void OnInitialize() { if (importer.ShouldCancel) { importer.ShouldCancel = false; } } protected override void OnExecute() { shouldCancel = false; if (Files == null) { ImportFromFile(null); Name = importer.Name; // changed during progress } else { foreach (var fileName in Files) { ImportFromFile(fileName); if (shouldCancel) { break; } } } Status = ActivityStatus.Done; } protected override void OnCancel() { //todo update in the current thread by using a delegate. shouldCancel = true; importer.ShouldCancel = true; } protected override void OnCleanUp() {} protected override void OnFinish() {} private void ImportFromFile(string fileName) { if (shouldCancel) { return; } Name = importer.Name; importer.ProgressChanged = (currentStepName, currentStep, totalSteps) => { Name = importer.Name + " - " + currentStepName; progressText = string.Format("{0} of {1}", currentStep, totalSteps); SetProgressText(progressText); }; var item = importer.ImportItem(fileName, target); //item might be null (for example when importing a wrong version of project) if (OnImportFinished != null && item != null) { OnImportFinished(this, item, importer); } } } }