public override void OnGUI(
            Rect position,
            SerializedProperty property,
            GUIContent label)
        {
            ReorderableListOfValues reorderableList =
                GetReorderableList(
                    this.attribute,
                    this.fieldInfo,
                    property);

            reorderableList.UpdateLabel(label);
            reorderableList.onBackgroundColor = onBackgroundColor;
            reorderableList.onSelectCallback += OnSelectCallback;
            reorderableList.DoGUI(position);
            reorderableList.onSelectCallback -= OnSelectCallback;
            reorderableList.onBackgroundColor = null;
        }
        protected ReorderableListOfValues GetReorderableList(
            ReorderableListAttribute attribute,
            FieldInfo fieldInfo,
            SerializedProperty property)
        {
            string propertyPath = property.propertyPath;

            if (this.m_MostRecentReorderableList != null)
            {
                if (this.m_MostRecentPropertyPath == propertyPath)
                {
                    this.m_MostRecentReorderableList.serializedProperty = property;
                    return(this.m_MostRecentReorderableList);
                }
            }

            this.m_MostRecentReorderableList = this.m_ReorderableListMap
                                               .Find(propertyPath);

            if (this.m_MostRecentReorderableList == null)
            {
                ReorderableListOfValues reorderableList =
                    CreateReorderableList(
                        attribute,
                        fieldInfo,
                        property);

                this.m_ReorderableListMap.Add(propertyPath, reorderableList);

                this.m_MostRecentReorderableList = reorderableList;
            }
            else
            {
                this.m_MostRecentReorderableList.serializedProperty = property;
            }

            this.m_MostRecentPropertyPath = propertyPath;

            return(this.m_MostRecentReorderableList);
        }
        public override float GetPropertyHeight(
            SerializedProperty property,
            GUIContent label)
        {
            ReorderableListOfValues reorderableListOfValues =
                GetReorderableList(
                    this.attribute,
                    this.fieldInfo,
                    property);

            Debug.Assert(
                reorderableListOfValues.serializedProperty.propertyPath ==
                property.propertyPath);

            try {
                return(reorderableListOfValues.GetHeight(label));
            }
            catch (Exception ex) {
                Debug.LogException(ex);
                return(0f);
            }
        }