Пример #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PageDelta"/> class.
 /// </summary>
 /// <param name="original">The original page.</param>
 /// <param name="revision">The revised page.</param>
 public PageDelta(Page original, Page revision)
 {
     this.Original = original;
     this.Revision = revision;
     this.RemovedControls = new List<Control>();
     this.DetermineDelta();
 }
        /// <summary>
        /// Determines the correct position in the control tree of <paramref name="targetPage"/>
        /// and inserts <paramref name="control"/>.
        /// </summary>
        /// <param name="control">The control to add.</param>
        /// <param name="targetPage">The page to add control to.</param>
        /// <param name="targetVariations">The product variations.</param>
        /// <param name="nextId">The next available control id to be used in the case of a clash.</param>
        private void AddControl(Control control, Page targetPage, ProductVariation targetVariations, int nextId)
        {
            if (control.ParentId.HasValue && targetVariations.RemovedControls.Contains(control.ParentId.Value))
            {
                targetVariations.RemovedControls.Add(control.Id);
                return;
            }

            var addedIndex = targetVariations.AddedControls.IndexOf(control.Id);
            if (addedIndex != -1)
            {
                targetPage.Controls.FindRecursive(control.Id).Id = nextId;
                targetVariations.AddedControls[addedIndex] = nextId;
            }

            if (control.Type == ControlType.Group || control.Type == ControlType.Repeater)
            {
                ContainerControl container = control as ContainerControl;
                this.subControls.Add(control.Id, container.Controls);
                container.Controls = new ControlList();
            }

            this.InsertIntoList(control, targetPage, targetVariations.AddedControls);
        }
        /// <summary>
        /// Updates a linked control in <paramref name="targetPage"/> by <paramref name="control"/>.
        /// </summary>
        /// <param name="control">The control to add.</param>
        /// <param name="targetPage">The page to add control to.</param>
        /// <param name="targetVariations">The product variations.</param>
        private void EditControl(Control control, Page targetPage, ProductVariation targetVariations)
        {
            if (!targetVariations.UnlinkedControls.Contains(control.Id))
            {
                Control childControl = targetPage.Controls.FindRecursive(c => c.Id == control.Id);
                ControlList parent = childControl.GetParentControlList(targetPage.Controls);
                int index = parent.IndexOf(childControl);
                control = control.Clone();

                if (control.Type == ControlType.Group || control.Type == ControlType.Repeater)
                {
                    ContainerControl newContainerControl = control as ContainerControl;
                    ContainerControl oldContainerControl = parent[index] as ContainerControl;
                    newContainerControl.Controls = oldContainerControl.Controls;
                }

                if (childControl.ParentId != control.ParentId || childControl.Position != control.Position)
                {
                    if (control.ParentId.HasValue && targetVariations.RemovedControls.Contains(control.ParentId.Value))
                    {
                        targetVariations.EditedControls.Add(childControl.Id);
                        return;
                    }

                    targetPage.Controls.RecursiveRemove(control.Id);
                    childControl.ParentId = control.ParentId;
                    this.InsertIntoList(control, targetPage, targetVariations.AddedControls);
                }
                else
                {
                    parent[index] = control;
                }
            }
        }
        /// <summary>
        /// Determines the correct position in the control tree of <paramref name="targetPage"/>
        /// and inserts <paramref name="control"/>.
        /// </summary>
        /// <param name="control">The control to add.</param>
        /// <param name="targetPage">The page to add control to.</param>
        /// <param name="addedControls">The control ids that have been added to the target.</param>
        private void InsertIntoList(Control control, Page targetPage, List<int> addedControls)
        {
            ControlList sourceList;

            if (control.ParentId != null && this.subControls.ContainsKey(control.ParentId.Value))
            {
                sourceList = this.subControls[control.ParentId.Value];
            }
            else
            {
                sourceList = control.GetParentControlList(this.delta.Revision.FormDefinition.Pages.FindByPageId(targetPage.PageId).Controls);
            }

            ControlList targetList = !control.ParentId.HasValue ? targetPage.Controls : targetPage.Controls.FindRecursive<ContainerControl>(control.ParentId.Value).Controls;
            int index = this.DetermineTargetIndex(sourceList, targetList, control, addedControls);

            if (index >= targetList.Count)
            {
                targetList.Add(control);
            }
            else
            {
                targetList.Insert(index, control);
            }
        }
 /// <summary>
 /// Determines if a page has a summary control.
 /// </summary>
 /// <param name="page">Target page.</param>
 /// <returns><see langword="true"/> if the page has a summary control, otherwise <see langword="false"/>.</returns>
 private static bool PageHasSummaryControl(Page page)
 {
     return page.Controls.Any(c => c.Type == ControlType.Summary);
 }