List <CornerInfo> PrepareCornerInfos(string undoLabel)
        {
            List <Transform> objs = selection.GetSelection();

            error = ADError.None;

            // load edge info & store the orginal obj position for undo
            List <CornerInfo> cornerInfos = new List <CornerInfo>();

            foreach (Transform obj in objs)
            {
                // make sure the Canvas is setup correctly
                CanvasRenderer canvasRenderer = obj.GetComponent <CanvasRenderer>();

                if (canvasRenderer != null && state.context.type != ContextType.Canvas)
                {
                    error = ADError.CanvasContext;
                    return(null);
                }

                // make sure NGUI is setup correctly
                R2DC_NGUI.NGUIState nguiState = ngui.ValidateState(obj.gameObject);

                if (nguiState == R2DC_NGUI.NGUIState.InvalidContext)
                {
                    error = ADError.NGUIContext;
                    return(null);
                }
                else if (nguiState == R2DC_NGUI.NGUIState.ReflectionError)
                {
                    error = ADError.NGUIReflection;
                    return(null);
                }

                CornerInfo cornerInfo = new CornerInfo();
                cornerInfo.transform = obj;
                Vector3[] corners = bounds.GetWorldCorners(obj, state.preferColliders);

                if (corners == null)
                {
                    return(null);
                }

                cornerInfo.corners = corners;
                cornerInfos.Add(cornerInfo);

                Undo.RecordObject(obj.transform, undoLabel);
            }

            return(cornerInfos);
        }