/// <summary>
        /// Draw all properties from begin to end, and return the rect taken up.
        /// </summary>
        private Rect DrawPropertyNestedRange(Rect position, int indentOffset, SerializedProperty begin, SerializedProperty end)
        {
            // Track the top so we know how tall the whole drawn area was
            float top = position.yMin;

            SerializedProperty cur = begin.Copy();

            while (!SerializedProperty.EqualContents(cur, end))
            {
                EditorGUI.indentLevel = cur.depth + indentOffset;
                position.y           += PROPERTY_MARGIN;

                StratusSerializedPropertyHandler curHandler = StratusScriptAttributeUtility.GetHandler(cur);
                position.height = curHandler.GetHeight(cur, StratusEditorUtility.TempContent(cur.displayName), cur.isExpanded);

                EditorGUI.BeginChangeCheck();
                curHandler.OnGUI(position, cur, null, true);
                position.y += position.height;

                if (EditorGUI.EndChangeCheck())
                {
                    break;
                }

                cur.NextVisible(false);
            }

            position.yMin = top;
            return(position);
        }
        /// <summary>
        /// Calculate the height taken up by all properties from begin to end.
        /// </summary>
        private float GetHeightNestedRange(SerializedProperty begin, SerializedProperty end)
        {
            float height = 0f;

            SerializedProperty cur = begin.Copy();

            while (!SerializedProperty.EqualContents(cur, end))
            {
                StratusSerializedPropertyHandler curHandler = StratusScriptAttributeUtility.GetHandler(cur);
                float curHeight = curHandler.GetHeight(cur, StratusEditorUtility.TempContent(cur.displayName), cur.isExpanded);
                height += curHeight + PROPERTY_MARGIN;
                cur.NextVisible(false);
            }

            return(height);
        }