/// <summary>
 /// Connect last if/else branch shape with invisibe shape (connect both branches in one place)
 /// </summary>
 /// <param name="invisibleBlock">invisible block shape wrapper</param>
 /// <param name="lastBranchShape">last branch shape wrapper</param>
 public void connectLastShapeToInvisibleBlock(ShapeWrapper invisibleBlock, ShapeWrapper lastBranchShape, double x = 4.25, double y = 10)
 {
     if (lastBranchShape.isCommonShape())
     {
         connectShapes(invisibleBlock.shape, lastBranchShape.shape, ShapeForm.LINE, ShapeConnectionType.FROM_BOT_TO_CENTER, x, y);
     }
     else
     {
         connectShapes(invisibleBlock.shape, lastBranchShape.shape, ShapeForm.LINE, ShapeConnectionType.FROM_RIGHT_TO_CENTER, x, y);
     }
 }
        /// <summary>
        /// Define connection type between two shapes (none of the shapes is parent shape)
        /// </summary>
        /// <param name="firstShape">up shape</param>
        /// <param name="secShape">down shape</param>
        /// <returns>connection type</returns>
        public static ShapeConnectionType defineConnectionType(ShapeWrapper firstShape, ShapeWrapper secShape, bool isSameBranch)
        {
            bool firstShapeIsCommon = firstShape.isCommonShape();
            bool secShapeIsCommon   = secShape.isCommonShape();
            ShapeConnectionType shapeConnectionType = ShapeConnectionType.FROM_TOP_TO_RIGHT;

            if (!firstShapeIsCommon && secShapeIsCommon)
            {
                if (isSameBranch)
                {
                    shapeConnectionType = ShapeConnectionType.FROM_TOP_TO_BOT;
                }
                else
                {
                    shapeConnectionType = ShapeConnectionType.FROM_TOP_TO_RIGHT;
                }
            }
            else if (firstShapeIsCommon && !secShapeIsCommon)
            {
                shapeConnectionType = ShapeConnectionType.FROM_TOP_TO_BOT;
            }
            else if (!firstShapeIsCommon && !secShapeIsCommon)
            {
                if (isSameBranch)
                {
                    shapeConnectionType = ShapeConnectionType.FROM_TOP_TO_BOT;
                }
                else
                {
                    shapeConnectionType = ShapeConnectionType.FROM_TOP_TO_RIGHT;
                }
            }
            else if (firstShapeIsCommon && secShapeIsCommon)
            {
                shapeConnectionType = ShapeConnectionType.FROM_TOP_TO_BOT;
            }
            return(shapeConnectionType);
        }
        /// <summary>
        /// Define connection type between two shapes (first shape is parent shape)
        /// </summary>
        /// <param name="chainParentShape">parent shape</param>
        /// <param name="lastBranchShape">child shape</param>
        /// <returns>connection type</returns>
        public static ShapeConnectionType defineConnectionTypeWithBranchParent(ShapeWrapper chainParentShape, ShapeWrapper lastBranchShape)
        {
            bool lastBranchShapeIsCommon            = lastBranchShape.isCommonShape();
            ShapeConnectionType shapeConnectionType = ShapeConnectionType.FROM_TOP_TO_RIGHT;

            if (chainParentShape.shapeType == ShapeForm.FOR && lastBranchShapeIsCommon)
            {
                shapeConnectionType = ShapeConnectionType.FROM_BOT_TO_LEFT;
            }
            else if (chainParentShape.shapeType == ShapeForm.FOR && !lastBranchShapeIsCommon)
            {
                shapeConnectionType = ShapeConnectionType.FROM_RIGHT_TO_LEFT;
            }
            else if (chainParentShape.shapeType == ShapeForm.WHILE && lastBranchShapeIsCommon)
            {
                shapeConnectionType = ShapeConnectionType.FROM_BOT_TO_CENTER;
            }
            else if (chainParentShape.shapeType == ShapeForm.WHILE && !lastBranchShapeIsCommon)
            {
                shapeConnectionType = ShapeConnectionType.FROM_LEFT_TO_CENTER;
            }
            return(shapeConnectionType);
        }