public IFlowUiDefinition GetCurrentUiDefinition(FlowToken flowToken)
        {
            WorkflowFlowToken workflowFlowToken = (WorkflowFlowToken)flowToken;

            if (!WorkflowFacade.WorkflowExists(workflowFlowToken.WorkflowInstanceId))
            {
                Log.LogVerbose(LogTitle, "The workflow with Id = {0} does not exists", workflowFlowToken.WorkflowInstanceId);
                return(null);
            }


            using (GlobalInitializerFacade.CoreNotLockedScope)
            {
                Semaphore semaphore = WorkflowFacade.WaitForIdleStatus(workflowFlowToken.WorkflowInstanceId);
                if (semaphore != null)
                {
                    Log.LogVerbose(LogTitle, "The workflow with Id = {0} is running, waiting until its done.", workflowFlowToken.WorkflowInstanceId);

                    semaphore.WaitOne(TimeSpan.FromSeconds(10), true);

                    Log.LogVerbose(LogTitle, "Done waiting on the workflow with Id = {0}.", workflowFlowToken.WorkflowInstanceId);
                }
            }


            FormData formFunction = WorkflowFacade.GetFormData(workflowFlowToken.WorkflowInstanceId);

            if (formFunction == null)
            {
                return(null);
            }

            FormFlowUiDefinition formFlowUiDefinition;

            if (formFunction.FormDefinition != null)
            {
                formFlowUiDefinition = new FormFlowUiDefinition(
                    ToXmlReader(formFunction.FormDefinition),
                    formFunction.ContainerType,
                    formFunction.ContainerLabel,
                    formFunction.Bindings,
                    formFunction.BindingsValidationRules
                    );
            }
            else if (formFunction.FormMarkupProvider != null)
            {
                formFlowUiDefinition = new FormFlowUiDefinition(
                    formFunction.FormMarkupProvider,
                    formFunction.ContainerType,
                    formFunction.ContainerLabel,
                    formFunction.Bindings,
                    formFunction.BindingsValidationRules
                    );
            }
            else
            {
                throw new NotImplementedException();
            }

            var markup = GetCustomToolbarMarkup(formFunction);

            if (markup != null)
            {
                formFlowUiDefinition.SetCustomToolbarMarkupProvider(markup);
            }

            AddEventHandles(formFlowUiDefinition, workflowFlowToken.WorkflowInstanceId);

            return(formFlowUiDefinition);
        }
        private static void AddEventHandles(FormFlowUiDefinition formFlowUiDefinition, Guid instanceId)
        {
            IEnumerable <string> eventNames = WorkflowFacade.GetCurrentFormEvents(instanceId);

            FormData formData = WorkflowFacade.GetFormData(instanceId);

            foreach (string eventName in eventNames)
            {
                if (formData?.ExcludedEvents != null && formData.ExcludedEvents.Contains(eventName))
                {
                    continue;
                }

                switch (eventName)
                {
                case "Save":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.Save, OnSave);
                    break;

                case "SaveAndPublish":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.SaveAndPublish, OnSaveAndPublish);
                    break;

                case "Next":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.Next, OnNext);
                    break;

                case "Previous":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.Previous, OnPrevious);
                    break;

                case "Finish":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.Finish, OnFinish);
                    break;

                case "Cancel":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.Cancel, OnCancel);
                    break;

                case "Preview":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.Preview, OnPreview);
                    break;

                case "CustomEvent01":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.CustomEvent01, OnCustomEvent01);
                    break;

                case "CustomEvent02":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.CustomEvent02, OnCustomEvent02);
                    break;

                case "CustomEvent03":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.CustomEvent03, OnCustomEvent03);
                    break;

                case "CustomEvent04":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.CustomEvent04, OnCustomEvent04);
                    break;

                case "CustomEvent05":
                    formFlowUiDefinition.EventHandlers.Add(StandardEventIdentifiers.CustomEvent05, OnCustomEvent05);
                    break;
                }
            }

            IEventHandleFilter eventHandlerFilter = WorkflowFacade.GetEventHandleFilter(instanceId);

            eventHandlerFilter?.Filter(formFlowUiDefinition.EventHandlers);
        }