public static FieldStatusIndicator GetFieldStatusIndicator(this VisualElement field)
        {
            FieldStatusIndicator statusIndicator = null;

            if (field.HasProperty(FieldStatusIndicator.s_FieldStatusIndicatorVEPropertyName))
            {
                statusIndicator = field.GetProperty(FieldStatusIndicator.s_FieldStatusIndicatorVEPropertyName) as FieldStatusIndicator;
            }

            if (statusIndicator == null)
            {
                var row = field.GetProperty(BuilderConstants.InspectorLinkedStyleRowVEPropertyName) as BuilderStyleRow;

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

                // If the field has a name then look for a FieldStatusIndicator in the same containing row that has
                // targetFieldName matching the field's name.
                if (!string.IsNullOrEmpty(field.name))
                {
                    statusIndicator = row.Query <FieldStatusIndicator>().Where((b) => b.targetFieldName == field.name);
                }

                // If a status indicator matching the field's name could not be found then pick the first FieldMenuButton in the row.
                if (statusIndicator == null)
                {
                    statusIndicator = row.Q <FieldStatusIndicator>();
                }

                // If no status indicator could not be found in the row then create a new one and insert it to
                // the row right after the Override indicators container.
                if (statusIndicator == null)
                {
                    statusIndicator = new FieldStatusIndicator();

                    row.hierarchy.Insert(1, statusIndicator);
                }

                statusIndicator.targetField = field;
            }

            return(statusIndicator);
        }
        public BuilderInspectorHeader(BuilderInspector inspector)
        {
            m_Inspector       = inspector;
            m_Selection       = inspector.selection;
            m_Header          = m_Inspector.Q <VisualElement>("header-container");
            m_StatusIndicator = m_Header.Q <FieldStatusIndicator>("header-field-status-indicator");
            m_StatusIndicator.populateMenuItems = (menu) =>
            {
                BuildNameFieldContextualMenu(menu, m_TextField);
            };

            m_InnerHeader = m_Inspector.Q <VisualElement>("header-container-minor");
            m_Icon        = m_Inspector.Q <VisualElement>("header-icon");

            m_Pill = m_Inspector.Q <Label>("header-selected-pill");
            m_Pill.AddToClassList("unity-builder-tag-pill");

            m_TextField             = m_Inspector.Q <TextField>("header-selected-text-field");
            m_TextField.isDelayed   = true;
            m_TextField.tooltip     = "name";
            m_TextField.bindingPath = "name";

            m_EditorWarningHelpBox      = m_Inspector.Q <UnityEngine.UIElements.HelpBox>("header-editor-warning-help-box");
            m_EditorWarningHelpBox.text = BuilderConstants.HeaderSectionHelpBoxMessage;
            m_ErrorIcon = m_Inspector.Q <VisualElement>("header-error-icon");

            // Warning must be hidden at first
            m_ErrorIcon.style.backgroundImage = EditorGUIUtility.LoadIcon("console.erroricon");
            AdjustBottomPadding(false);

            // Store callbacks to reduce delegate allocations
            m_ElementNameChangeCallback    = new EventCallback <ChangeEvent <string> >(OnNameAttributeChange);
            m_SelectorNameChangeCallback   = new EventCallback <ChangeEvent <string> >(OnStyleSelectorNameChange);
            m_SelectorEnterKeyDownCallback = new EventCallback <KeyDownEvent>(OnEnterStyleSelectorNameChange);

            m_TextField.RegisterValueChangedCallback(m_ElementNameChangeCallback);
            m_RightClickManipulator = new ContextualMenuManipulator(BuildNameFieldContextualMenu);
        }