private void DrawItemBackground(Rect bgRect, VLog log)
        {
#if UNITY_2017_3_OR_NEWER
            if (Event.current.type == EventType.Repaint)
#else
            if (Event.current.type == EventType.repaint)
#endif
            {
                var originalColor = GUI.color;
                GUI.color = AssetValidatorGraphicsUtility.GetVLogHeaderColor(log);
                var rect = bgRect;
                rect.height = 25f;
                AssetValidatorGraphicsUtility.Styles.HeaderBackground.Draw(rect, false, false, false, false);
                GUI.color = originalColor;

                if (log == null)
                {
                    return;
                }

                rect.y     += rect.height;
                rect.height = bgRect.height - rect.height;
                AssetValidatorGraphicsUtility.Styles.BodyBackground.Draw(rect, false, false, false, false);
            }
        }
        private void OnHeaderGUI(Rect headerRect, string label, TreeViewItem treeViewItem)
        {
            var vLogTreeViewItem   = treeViewItem as VLogTreeViewItem;
            var vLogTreeViewHeader = treeViewItem as VLogTreeViewHeader;
            var vLog  = vLogTreeViewItem != null ? vLogTreeViewItem.Log : null;
            var style = AssetValidatorGraphicsUtility.GetVLogHeaderStyle(vLog);

            headerRect.y += 1f;

            // Do toggle
            var toggleRect = headerRect;

            toggleRect.width = 16f;

            var labelRect = new Rect(headerRect);

            labelRect.xMin += toggleRect.width + 2f;

            if (vLogTreeViewHeader != null)
            {
                labelRect.width -= 150f;

                GUI.Label(labelRect, label, style);

                var fieldRect = new Rect(labelRect)
                {
                    xMin  = labelRect.xMin + labelRect.width,
                    width = 50f
                };

                // Now that we have drawn our title, lets draw the aggregate logs if possible
                GUI.Label(fieldRect, new GUIContent(vLogTreeViewHeader.infoCount.ToString(), AssetValidatorGraphicsUtility.InfoIconSmall));       //, EditorStyles.toolbarButton);
                fieldRect.x += 50f;
                GUI.Label(fieldRect, new GUIContent(vLogTreeViewHeader.warningCount.ToString(), AssetValidatorGraphicsUtility.WarningIconSmall)); //, EditorStyles.toolbarButton);
                fieldRect.x += 50f;
                GUI.Label(fieldRect, new GUIContent(vLogTreeViewHeader.errorCount.ToString(), AssetValidatorGraphicsUtility.ErrorIconSmall));     //, EditorStyles.toolbarButton);
            }
            else
            {
                GUI.Label(labelRect, label, style);
            }
        }
        private void OnControlsGUI(Rect controlsRect, VLogTreeViewItem viewItem)
        {
            var rect = controlsRect;

            rect.y     += 3f;
            rect.height = EditorGUIUtility.singleLineHeight;

            var prefixRect = new Rect(rect)
            {
                width = 80f
            };
            var fieldRect = new Rect(rect)
            {
                width = rect.width - prefixRect.width,
                x     = rect.x + prefixRect.width
            };

            EditorGUI.LabelField(prefixRect, "Area:   ", EditorStyles.boldLabel);
            EditorGUI.LabelField(fieldRect, viewItem.Log.GetSourceDescription());

            fieldRect.y      = prefixRect.y += rect.height + EditorGUIUtility.standardVerticalSpacing;
            fieldRect.height = EditorGUIUtility.singleLineHeight;

            EditorGUI.LabelField(prefixRect, "Object:  ", EditorStyles.boldLabel);
            EditorGUI.LabelField(fieldRect, viewItem.Log.objectPath);

            fieldRect.y      = prefixRect.y += rect.height + EditorGUIUtility.standardVerticalSpacing;
            fieldRect.height = (rect.height + EditorGUIUtility.standardVerticalSpacing) * 2f;

            var charactersPerRow = GetCharactersPerRow(fieldRect, viewItem.Log);
            var multiLineMessage = AssetValidatorGraphicsUtility.GetMultilineString(viewItem.Log.message, charactersPerRow);

            fieldRect.height = 2 * (EditorGUIUtility.standardVerticalSpacing + EditorGUIUtility.singleLineHeight);

            EditorGUI.LabelField(prefixRect, "Message: ", EditorStyles.boldLabel);
            EditorGUI.TextArea(fieldRect, multiLineMessage, EditorStyles.label);

            EditorGUI.LabelField(fieldRect, multiLineMessage);

            rect.y = fieldRect.y + fieldRect.height + EditorGUIUtility.standardVerticalSpacing;

            var buttonRect = rect;

            buttonRect.width   = 200f;
            buttonRect.height *= 1.25f;

            if ((viewItem.Log.source == VLogSource.Scene ||
                 viewItem.Log.source == VLogSource.Project) && viewItem.Log.HasObjectPath())
            {
                EditorGUI.BeginDisabledGroup(!viewItem.Log.CanPingObject());
                if (GUI.Button(buttonRect, "Ping Object"))
                {
                    if (OnPingObject != null)
                    {
                        OnPingObject(viewItem.Log);
                    }
                }
                EditorGUI.EndDisabledGroup();
            }

            buttonRect.x += 220f;

            if (viewItem.Log.source == VLogSource.Scene)
            {
                EditorGUI.BeginDisabledGroup(!viewItem.Log.CanLoadScene());
                if (GUI.Button(buttonRect, "Load Scene"))
                {
                    if (OnLoadScene != null)
                    {
                        OnLoadScene(viewItem.Log);
                    }
                }
                EditorGUI.EndDisabledGroup();
            }
        }