/*--------------------------------------------------------------------------------------------*/
        public override void OnInspectorGUI()
        {
            vData = (HoverItemData)target;

            serializedObject.Update();
            DrawItems();
            serializedObject.ApplyModifiedProperties();
        }
        /*--------------------------------------------------------------------------------------------*/
        private void UpdateItem(HoverItemData pItemData, bool pPreventHighlight)
        {
            HoverItemHighlightState highState = pItemData.gameObject
                .GetComponent<HoverItemHighlightState>();

            if ( highState == null ) {
                return;
            }

            UpdateHighState(highState, pPreventHighlight);
        }
        /*--------------------------------------------------------------------------------------------*/
        private void FadeItem(HoverItemData pItemData, float pAlpha)
        {
            HoverAlphaRendererUpdater rendUp =
                pItemData.gameObject.GetComponentInChildren<HoverAlphaRendererUpdater>();

            if ( rendUp == null ) {
                return;
            }

            float currAlpha = (pItemData.IsEnabled ? rendUp.EnabledAlpha : rendUp.DisabledAlpha);

            rendUp.Controllers.Set(HoverAlphaRendererUpdater.MasterAlphaName, this);
            rendUp.MasterAlpha = Mathf.Lerp(0, currAlpha, pAlpha);
        }
        /*--------------------------------------------------------------------------------------------*/
        private void UpdateWithLatestItemTypeIfNeeded()
        {
            if ( _ItemType == vPrevItemType ) {
                return;
            }

            HoverItemData newData = BuildData(_ItemType);
            TransferData(newData);

            DestroyImmediate(_Data);
            _Data = newData;

            if ( OnTypeChanged != null ) {
                OnTypeChanged.Invoke(this);
            }

            vPrevItemType = _ItemType;
        }
        /*--------------------------------------------------------------------------------------------*/
        private HoverItemData TransferData(HoverItemData pDataToFill)
        {
            HoverItemData oldData = _Data;
            HoverItemData newData = pDataToFill;

            if ( oldData == null ) {
                return newData;
            }

            newData.AutoId = oldData.AutoId;
            newData.IsAncestryEnabled = oldData.IsAncestryEnabled;
            newData.IsAncestryVisible = oldData.IsAncestryVisible;
            newData.Id = oldData.Id;
            newData.Label = oldData.Label;
            newData.IsEnabled = oldData.IsEnabled;
            newData.IsVisible = oldData.IsVisible;

            SelectableItem oldSelData = (oldData as SelectableItem);
            SelectableItem newSelData = (newData as SelectableItem);

            if ( oldSelData == null || newSelData == null ) {
                return newData;
            }

            newSelData.OnSelectedEvent = oldSelData.OnSelectedEvent;
            newSelData.OnDeselectedEvent = oldSelData.OnDeselectedEvent;
            //newSelData.OnSelected += oldSelData.OnSelected;
            //newSelData.OnDeselected += oldSelData.OnDeselected;

            SelectableItemBool oldSelBoolData = (oldData as SelectableItemBool);
            SelectableItemBool newSelBoolData = (newData as SelectableItemBool);

            if ( oldSelBoolData != null && newSelBoolData != null ) {
                newSelBoolData.Value = oldSelBoolData.Value;
                newSelBoolData.OnValueChangedEvent = oldSelBoolData.OnValueChangedEvent;
                //newSelBoolData.OnValueChanged += oldSelBoolData.OnValueChanged;
            }

            SelectableItemFloat oldSelFloatData = (oldData as SelectableItemFloat);
            SelectableItemFloat newSelFloatData = (newData as SelectableItemFloat);

            if ( oldSelFloatData != null && newSelFloatData != null ) {
                newSelFloatData.Value = oldSelFloatData.Value;
                newSelFloatData.OnValueChangedEvent = oldSelFloatData.OnValueChangedEvent;
                //newSelFloatData.OnValueChanged += oldSelFloatData.OnValueChanged;
            }

            return newData;
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////
        /*--------------------------------------------------------------------------------------------*/
        private void BuildDataIfNeeded()
        {
            if ( _Data == null ) {
                _Data = gameObject.GetComponent<HoverItemData>();
            }

            if ( _Data == null ) {
                _Data = BuildData(_ItemType);
            }
            else if ( FindDuplicateData() ) {
                _Data = Instantiate(_Data); //handle duplication via Unity editor
            }
        }
        /*--------------------------------------------------------------------------------------------*/
        private void DestroyData(HoverItemData pData, HoverItemData pIgnoreNewData)
        {
            gameObject.GetComponents(vDataComponentBuffer);

            for ( int i = 0 ; i < vDataComponentBuffer.Count ; i++ ) {
                HoverItemData data = vDataComponentBuffer[i];

                if ( data == pIgnoreNewData ) {
                    continue;
                }

                if ( data != pData ) {
                    Debug.LogWarning("Removed unexpected "+typeof(HoverItemData).Name+": "+data, this);
                }

                DestroyImmediate(data, false);
            }
        }