private DestinationFieldList CreateDestinationItem(ProcessInfo process, string uniqueName, string name)
        {
            var destination = new DestinationFieldList { ExpressionName = name, UniqueName = uniqueName };

            AddStateFields(process, destination);
            AddVersionFields(process, destination);
            AddLastModifiedOnField(destination);

            foreach (var field in process.GetAllFields().Where(x => x.SystemName != Constants.IdColumnName && CanBeDestinationField(x)))
            {
                var destinationField = CreateDestinationField(field, process.SystemName, destination);

                destination.Fields.Add(destinationField);
            }

            return destination;
        }
        /// <summary>
        /// Loads the expression items.
        /// </summary>
        /// <param name="process">The process.</param>
        /// <param name="dataSources">The data sources.</param>
        /// <param name="sourceDataProcess">The source data process.</param>
        /// <param name="destinationListField">The destination list field.</param>
        /// <param name="destinationProcess">The destination process.</param>
        /// <param name="fieldMapping">The field mapping.</param>
        private async void LoadExpressionItems(
            IProcessEdit process,
            IEnumerable<DataTriggerMappingDataSourceRetriever> dataSources,
            ProcessInfo sourceDataProcess,
            FieldInfo destinationListField,
            ProcessInfo destinationProcess,
            DataTriggerFieldMappingEdit fieldMapping)
        {
            WindowManager.Value.ShowStatus(new Status { IsBusy = true });

            var expressions = new List<IExpressionObjectBase>();
            var newExpressions = new List<IExpressionObjectBase>();

            var syncContext = new NotifyClientAction(
                () =>
                    {
                        ExpressionDesigner.LoadFromExpressionObjects(expressions);
                        WindowManager.Value.ShowStatus(new Status());
                    });

            syncContext.OperationStarted();

            if (fieldMapping.ModificationType == DataTriggerModificationType.Link || fieldMapping.ModificationType == DataTriggerModificationType.Unlink)
            {
                var objectName = string.Format("sourceData.GetSourceItem(\"{0}\")", DataTriggerFieldMappingExpressionNames.SourceDataProcess);

                newExpressions.Add(CreateSourceItem(sourceDataProcess, DataTriggerFieldMappingExpressionNames.SourceDataProcess, sourceDataProcess.Name, objectName));
            }
            else
            {
                foreach (var dataSource in dataSources)
                {
                    var name = string.Format(CultureInfo.InvariantCulture, "{0} (source)", dataSource.SourceFieldName);
                    var objectName = string.Format("sourceData.GetSourceItem(\"{0}\")", dataSource.SourceName);
                    newExpressions.Add(CreateSourceItem(dataSource.SourceProcess, dataSource.SourceName, name, objectName));
                }

                newExpressions.Add(
                    CreateSourceItem(
                        destinationProcess,
                        DataTriggerFieldMappingExpressionNames.ModifiedItem,
                        string.Format("{0} (old)", destinationListField.Name),
                        ModifiedItemObjectName));
            }

            newExpressions.Add(CreateUserInfoSourceItem(DataTriggerFieldMappingExpressionNames.UserInfo));

            try
            {
                var systemParameters = await CreateSystemParametersItemAsync(DataTriggerFieldMappingExpressionNames.SystemParameters);
                if (systemParameters != null)
                {
                    newExpressions.Add(systemParameters);
                }
            }
            catch (DataPortalException)
            {
            }

            newExpressions.Add(CreateDestinationItem(destinationProcess, DataTriggerFieldMappingExpressionNames.DestinationItem, destinationListField.Name));

            UpdatePositions(newExpressions);

            if (!string.IsNullOrWhiteSpace(fieldMapping.Expression))
            {
                try
                {
                    var expressionsContainer = Serializer.Deserialize(fieldMapping.Expression);
                    expressions.AddRange(expressionsContainer.Expressions);
                }
                catch
                {
                    // Do nothing, new expressions will be used.
                }
            }

            UpdateStateList(process);

            UpdateStoredExpressions(expressions, newExpressions, syncContext);
            syncContext.OperationCompleted();
        }
        private SourceFieldList CreateSourceItem(
            ProcessInfo process,
            string uniqueName,
            string name,
            string objectName)
        {
            var source = new SourceFieldList { ExpressionName = name, UniqueName = uniqueName };

            AddIdFields(process, source, objectName, SourceFieldSetNames.DataTriggerSourceItem);
            AddStateFields(process, source, objectName, SourceFieldSetNames.DataTriggerSourceItem);
            AddVersionFields(process, source, objectName, SourceFieldSetNames.DataTriggerSourceItem);
            AddLastModifiedOnField(source, objectName, SourceFieldSetNames.DataTriggerSourceItem);

            foreach (var field in process.GetAllFields().Where(CanBeSourceField))
            {
                var sourceField = CreateSourceField(field, process.SystemName, source);
                sourceField.ObjectName = objectName;
                source.Fields.Add(sourceField);
            }

            return source;
        }
        /// <summary>
        /// Loads the expression items.
        /// </summary>
        /// <param name="sourceProcess">The source process.</param>
        /// <param name="destinationProcess">The destination process.</param>
        /// <param name="trigger">The trigger.</param>
        private async void LoadExpressionItems(
            IProcessEdit sourceProcess,
            ProcessInfo destinationProcess,
            ProcessDataTriggerEdit trigger)
        {
            WindowManager.Value.ShowStatus(new Status { IsBusy = true });

            var expressions = new List<IExpressionObjectBase>();
            var newExpressions = new List<IExpressionObjectBase>();

            var syncContext = new NotifyClientAction(
                () =>
                    {
                        ExpressionDesigner.LoadFromExpressionObjects(expressions);
                        IsSaveable = IsTestable();
                        WindowManager.Value.ShowStatus(new Status());
                    });

            syncContext.OperationStarted();

            newExpressions.Add(
                CreateSourceItem(
                    sourceProcess,
                    DataTriggerMappingExpressionNames.SourceItem,
                    string.Format("{0} (source)", sourceProcess.Name),
                    SourceItemObjectName));

            if (trigger.ModificationType != DataTriggerModificationType.Self)
                newExpressions.Add(
                    CreateSourceItem(
                        destinationProcess,
                        DataTriggerMappingExpressionNames.SourceToModifyItem,
                        string.Format("{0} (old)", destinationProcess.Name),
                        ModifiedItemObjectName));

            newExpressions.Add(CreateUserInfoSourceItem(DataTriggerMappingExpressionNames.UserInfo));

            try
            {
                var systemParameters = await CreateSystemParametersItemAsync(DataTriggerMappingExpressionNames.SystemParameters);
                if (systemParameters != null)
                {
                    newExpressions.Add(systemParameters);
                }
            }
            catch (DataPortalException)
            {
            }

            newExpressions.Add(CreateDestinationItem(destinationProcess, DataTriggerMappingExpressionNames.DestinationItem, destinationProcess.Name));

            UpdatePositions(newExpressions);

            if (!string.IsNullOrWhiteSpace(trigger.ModificationMapping))
            {
                try
                {
                    var expressionsContainer = Serializer.Deserialize(trigger.ModificationMapping);
                    expressions.AddRange(expressionsContainer.Expressions);
                }
                catch
                {
                    // Do nothing, new expressions will be used.
                }
            }

            UpdateStateList(sourceProcess);

            UpdateStoredExpressions(expressions, newExpressions, syncContext);
            syncContext.OperationCompleted();
        }