Example #1
0
 private void Replace(ControlReplacementExecutionData sdtElement)
 {
     foreach (var sdtElementControl in sdtElement.Controls.ToList())
     {
         Replace(sdtElementControl, sdtElement.VariableSource);
     }
 }
Example #2
0
 /// <summary>
 /// Call this whenever you enqueue an replacement within another replacement,
 /// if the data is different, e.g. you use an inner dictionary of the original data as a main data source
 /// </summary>
 /// <param name="e"></param>
 protected virtual void OnInnerControlReplacementEnqueued(ControlReplacementExecutionData e)
 {
     InnerControlReplacementEnqueued?.Invoke(this, e);
 }
Example #3
0
 public void Enqueue(ControlReplacementExecutionData controlReplacementExecutionData)
 {
     executionQueue.Enqueue(controlReplacementExecutionData);
 }
Example #4
0
        protected override string ProcessControl(string variableIdentifier, IVariableSource variableSource,
                                                 ContentControl original, List <string> otherParameters)
        {
            try
            {
                GetParameters(otherParameters, out var separator, out var lastSeparator);

                var dataItems = variableSource.GetVariable <IList>(variableIdentifier);

                if (dataItems == null || dataItems.Count == 0)
                {
                    //No items found, remove the content
                    original.Remove();
                    return(null);
                }


                //Copy the content control as many times as we have items
                for (var i = 0; i < dataItems.Count; i++)
                {
                    var dataItem = dataItems[i];
                    var clone    = original.Clone();

                    switch (dataItem)
                    {
                    case string _:
                    case int _:
                    case float _:
                    case double _:
                    case decimal _:
                        SetTextAndRemovePlaceholderFormat(clone.SdtElement, dataItem.ToString());
                        break;

                    case Dictionary <string, object> dictItem:
                    {
                        if (dictItem.ContainsKey("index") == false)
                        {
                            dictItem.Add("index", i + 1);
                        }

                        //Since we are creating new elements, we should add them to the queue with both this and the inner data
                        var innerSource = new VariableSource(dictItem);
                        var exInner     = new ControlReplacementExecutionData(clone.DescendingControls, innerSource);
                        var ex          = new ControlReplacementExecutionData(clone.DescendingControls, variableSource);

                        Enqueue(exInner);
                        OnInnerControlReplacementEnqueued(ex);
                        OnInnerControlReplacementEnqueued(exInner);

                        //Support old styled documents
                        var innerRep1 = new InnerRepeatingVariableControlReplacer();
                        var innerRep2 = new InnerRepeatingConditionalRemoveControlReplacer();
                        innerRep1.ReplaceAll(ex.Controls, ex.VariableSource);
                        innerRep2.ReplaceAll(ex.Controls, ex.VariableSource);

                        break;
                    }
                    }

                    var lasttext = clone.SdtElement.Descendants <Text>().LastOrDefault();

                    if (lasttext != null)
                    {
                        if (i < dataItems.Count - 2)
                        {
                            lasttext.InsertAfterSelf(new Text(separator)
                            {
                                Space = SpaceProcessingModeValues.Preserve
                            });
                        }
                        else if (i < dataItems.Count - 1)
                        {
                            lasttext.InsertAfterSelf(new Text(lastSeparator)
                            {
                                Space = SpaceProcessingModeValues.Preserve
                            });
                        }
                    }
                }

                //Delete the original
                original.Remove();

                return(null);
            }
            catch (VariableNotFoundException)
            {
                return(null);
            }
        }