private ControlMarkupCount FindControlWithMissingMarkup(IValidTreeControl node)
        {
            ControlMarkupCount missingMarkupControl = null;

            if (node is GeometricShapeWpfControl)
            {
                var geometricShapeControl = node as GeometricShapeWpfControl;

                int numberOfMissingMarkup = NumberOfMissingMarkupRequiredByControl(geometricShapeControl);
                if (numberOfMissingMarkup > 0)
                {
                    return new ControlMarkupCount
                           {
                               GeometricShapeWpfControl = geometricShapeControl,
                               MarkupCount = numberOfMissingMarkup
                           }
                }
                ;
            }
            if (node.ChildControls != null)
            {
                foreach (var child in node.ChildControls)
                {
                    missingMarkupControl = FindControlWithMissingMarkup(child);

                    if (missingMarkupControl != null)
                    {
                        break;
                    }
                }
            }

            return(missingMarkupControl);
        }
        public IValidTreeControl FindInvalidControl()
        {
            IValidTreeControl invalidControl = null;

            foreach (IValidTreeControl node in NodeControls)
            {
                invalidControl = FindInvalidControl(node);
                if (invalidControl != null)
                {
                    break;
                }
            }
            return(invalidControl);
        }
        private void UpdateGeometricShapeControlValidity(IValidTreeControl control)
        {
            if (control is GeometricShapeWpfControl)
            {
                var geometricShapeControl = control as GeometricShapeWpfControl;
                if (NumberOfMissingMarkupRequiredByControl(geometricShapeControl) == 0)
                {
                    geometricShapeControl.Valid = true;
                }
            }

            if (control.ChildControls != null)
            {
                foreach (var child in control.ChildControls)
                {
                    UpdateGeometricShapeControlValidity(child);
                }
            }
        }
        private IValidTreeControl FindInvalidControl(IValidTreeControl node)
        {
            IValidTreeControl invalidControl = null;

            if (node.ChildControls != null)
            {
                foreach (IValidTreeControl child in node.ChildControls)
                {
                    if (!child.Valid)
                    {
                        invalidControl = FindInvalidControl(child);
                        break;
                    }
                }
            }

            if (invalidControl == null && !node.Valid && !(node is GeometricShapeWpfControl))
            {
                invalidControl = node;
            }

            return(invalidControl);
        }