void OnHierarchyChange()
        {
            ReferenceExplorerData.RestoreAllData();
            UpdateReferenceInfomation();

            Repaint();
        }
    public static void DisappearObjects()
    {
        ReferenceExplorerData.RestoreAllData();
        ReferenceExplorerData.RestoreComponentReferenceData();

        var objects = ReferenceExplorerData.allObjects;

        foreach (var obj in objects)
        {
            obj.hideFlags = HideFlags.HideInHierarchy;
        }

        foreach (var component in ReferenceExplorerData.allReferenceInfo)
        {
            var fromObject      = ReferenceExplorerUtility.GetGameObject(component.fromObject);
            var referencetarget = ReferenceExplorerUtility.GetGameObject(component.referenceTarget);

            if (fromObject != null)
            {
                Appear(fromObject.transform);
            }

            if (referencetarget != null)
            {
                Appear(referencetarget.transform);
            }
        }
    }
 void OnSelectionChange()
 {
     ReferenceExplorerData.RestoreComponentReferenceData();
     UpdateReferenceInfomation();
     SceneView.RepaintAll();
     Repaint();
 }
    void OnHierarchyChange()
    {
        ReferenceExplorerData.RestoreAllData();

        CallbackData.UpdateSenderRecieverlist();
        CallbackData.UpdateCallbacklist(isSelectedObject, searchText);
    }
    void OnEnable()
    {
        codeSearch = new CodeSearch();

        ReferenceExplorerData.RestoreAllData();

        CallbackData.UpdateSenderRecieverlist();
        CallbackData.UpdateCallbacklist(isSelectedObject, searchText);
    }
    public static void AppearObjects()
    {
        ReferenceExplorerData.RestoreAllData();

        var objects = ReferenceExplorerData.allObjects;

        foreach (var obj in objects)
        {
            obj.hideFlags = HideFlags.None;
        }
    }
        void UpdateReferenceInfomation()
        {
            if (!isLocked)
            {
                var currentObject = Selection.gameObjects;
                selectedObjects = currentObject;
            }

            if (selectedObjects == null)
            {
                return;
            }

            referenceList    = ReferenceExplorerData.AllReferenceComponent(selectedObjects, ignoreReferenceType, search);
            referencedByList = ReferenceExplorerData.AllReferencedByComponent(selectedObjects, ignoreReferenceType, search);
        }
    public static void DisappearObjectsWithFamillyReference()
    {
        ReferenceExplorerData.RestoreAllData();
        ReferenceExplorerData.RestoreComponentReferenceData();

        var objects = ReferenceExplorerData.allObjects;

        foreach (var obj in objects)
        {
            obj.hideFlags = HideFlags.HideInHierarchy;
        }

        foreach (var component in ReferenceExplorerData.allReferenceInfo)
        {
            var fromObject      = ReferenceExplorerUtility.GetGameObject(component.fromObject);
            var referencetarget = ReferenceExplorerUtility.GetGameObject(component.referenceTarget);

            if (fromObject != null)
            {
                if (fromObject.transform.GetComponentsInChildren <Component> ().Any(item => item.gameObject == referencetarget) == false &&
                    fromObject.transform.GetComponentsInParent <Component> ().Any(item => item.gameObject == referencetarget) == false)
                {
                    Appear(fromObject.transform);
                }
            }

            if (referencetarget != null)
            {
                if (referencetarget.transform.GetComponentsInChildren <Component> ().Any(item => item.gameObject == fromObject) == false &&
                    referencetarget.transform.GetComponentsInParent <Component> ().Any(item => item.gameObject == fromObject) == false)
                {
                    Appear(referencetarget.transform);
                }
            }
        }
    }
 void OnEnable()
 {
     SceneView.onSceneGUIDelegate += OnSceneGUI;
     ReferenceExplorerData.RestoreAllData();
     UpdateReferenceInfomation();
 }
 void OnSelectionChange()
 {
     ReferenceExplorerData.RestoreComponentReferenceData();
     ReferenceExplorerData.UpdateSelectedComponentList();
     Repaint();
 }
    public static void Export(bool isContainReferences, bool isContainCallbacks, bool isOnlyComponent)
    {
        try{
            EditorUtility.DisplayProgressBar("Export Comonent Graph", "Collection All Types", 0);

            ReferenceExplorerData.RestoreAllData();

            List <ReferenceInfomation> refList = new List <ReferenceInfomation>();
            List <Type> refTypes = new List <Type>();

            if (isContainReferences)
            {
                Collection(refList, refTypes, isOnlyComponent);
            }

            if (isContainCallbacks)
            {
                foreach (var callback in CallbackData.callbackList)
                {
                    var result = CallbackData.buidinCallback.Where(item => item.callbacks.Contains(callback.callback));
                    if (result.Count() == 0)
                    {
                        continue;
                    }
                    var buldinCallback = result.First();

                    if (buldinCallback != null)
                    {
                        refTypes.Add(buldinCallback.senderComponent);
                    }
                    else
                    {
                        refTypes.AddRange(callback.senderTypeList);
                        refTypes.AddRange(callback.recieverTypeList);
                    }
                }
            }

            var uniqueTypes = refTypes.Where(item => item != null).Distinct();


            var uniqueRefList = refList.Where(item => item != null).Distinct();

            EditorUtility.DisplayProgressBar("Export Comonent Graph", "writing", 1);

            StringBuilder exportBuilder = new StringBuilder();
            exportBuilder.AppendLine("graph");
            exportBuilder.AppendLine("[");


            foreach (var type in uniqueTypes)
            {
                exportBuilder.AppendLine("	node");
                exportBuilder.AppendLine("	[");
                exportBuilder.AppendLine("			id	"+ type.GetHashCode());
                exportBuilder.AppendLine("			label	\""+ type.Name + "\"");
                exportBuilder.AppendLine("		graphics");
                exportBuilder.AppendLine("		[");
                exportBuilder.AppendLine("			w	"+ type.Name.Length * 10);
                if (type.IsSubclassOf(typeof(MonoBehaviour)))
                {
                    exportBuilder.AppendLine("			fill	\"#FFFF99\"");
                }
                else if (type.IsSubclassOf(typeof(Component)))
                {
                    exportBuilder.AppendLine("			fill	\"#ccccff\"");
                }
                else
                {
                    exportBuilder.AppendLine("			fill	\"#ff99cc\"");
                }

                exportBuilder.AppendLine("		]");
                exportBuilder.AppendLine("	]");
            }

            foreach (var refType in uniqueRefList)
            {
                exportBuilder.AppendLine("	edge");
                exportBuilder.AppendLine("	[");
                exportBuilder.AppendLine("			source	"+ refType.from.GetHashCode());
                exportBuilder.AppendLine("			target	"+ refType.to.GetHashCode());
                exportBuilder.AppendLine("	]");
            }

            foreach (var callback in CallbackData.callbackList)
            {
                foreach (var sender in callback.senderTypeList)
                {
                    foreach (var reciever in callback.recieverTypeList)
                    {
                        exportBuilder.AppendLine("	edge");
                        exportBuilder.AppendLine("	[");
                        exportBuilder.AppendLine("			source	"+ reciever.GetHashCode());
                        exportBuilder.AppendLine("			target	"+ sender.GetHashCode());
                        exportBuilder.AppendLine("			graphics");
                        exportBuilder.AppendLine("			[");
                        exportBuilder.AppendLine("					sourceArrow	\"white_delta\"");
                        exportBuilder.AppendLine("					style	\"dashed\"");
                        exportBuilder.AppendLine("			]");
                        exportBuilder.AppendLine("	]");
                    }
                }

                var buidinSender = System.Array.Find <UnityengineCallback>(CallbackData.buidinCallback, item => item.callbacks.Contains(callback.callback));
                if (buidinSender != null && buidinSender.senderComponent != null)
                {
                    foreach (var reciever in callback.recieverTypeList)
                    {
                        exportBuilder.AppendLine("	edge");
                        exportBuilder.AppendLine("	[");
                        exportBuilder.AppendLine("			source	"+ reciever.GetHashCode());
                        exportBuilder.AppendLine("			target	"+ buidinSender.senderComponent.GetHashCode());
                        exportBuilder.AppendLine("			graphics");
                        exportBuilder.AppendLine("			[");
                        exportBuilder.AppendLine("					sourceArrow	\"white_delta\"");
                        exportBuilder.AppendLine("					style	\"dashed\"");
                        exportBuilder.AppendLine("			]");
                        exportBuilder.AppendLine("	]");
                    }
                }
            }

            exportBuilder.AppendLine("]");

            EditorUtility.DisplayProgressBar("Export Comonent Graph", "exporting", 1);
            System.IO.File.WriteAllText(System.DateTime.Now.ToFileTime() + ".gml", exportBuilder.ToString());
        }catch (Exception c) {
            Debug.LogError(c.Message);
        }finally{
            EditorUtility.ClearProgressBar();
        }
    }
    public static void ExportObjectReference(bool isContainFamilly, bool isContainCallbacks)
    {
        try{
            ReferenceExplorerData.RestoreAllData();

            EditorUtility.DisplayProgressBar("Export GameObject Graph", "get all objects", 0);



            var objectNames = ReferenceExplorerData.allReferenceInfo
                              .Where(item =>
                                     ReferenceExplorerUtility.GetGameObject(item.referenceTarget) != null &&
                                     ReferenceExplorerUtility.GetGameObject(item.referenceTarget) != null)
                              .SelectMany(item => new GameObject[] {
                ReferenceExplorerUtility.GetGameObject(item.referenceTarget),
                ReferenceExplorerUtility.GetGameObject(item.fromObject)
            }).Distinct();

            EditorUtility.DisplayProgressBar("Export GameObject Graph", "check reference", 0.2f);


            List <ReferenceInfoObject> referenceInfoList = new List <ReferenceInfoObject>();
            foreach (var referenceInfo in ReferenceExplorerData.allReferenceInfo)
            {
                var fromObject   = ReferenceExplorerUtility.GetGameObject(referenceInfo.fromObject);
                var targetObject = ReferenceExplorerUtility.GetGameObject(referenceInfo.referenceTarget);

                if (targetObject == null || fromObject == null)
                {
                    continue;
                }

                if (isContainFamilly == false && ReferenceExplorerUtility.IsFamilly(fromObject, targetObject))
                {
                    continue;
                }

                if (referenceInfoList.Any(item => ReferenceExplorerUtility.GetGameObject(item.fromObject) == fromObject ||
                                          ReferenceExplorerUtility.GetGameObject(item.targetObject) == targetObject) == true ||
                    fromObject == targetObject)
                {
                    continue;
                }
                referenceInfoList.Add(new ReferenceInfoObject()
                {
                    targetObject = fromObject,
                    fromObject   = targetObject,
                });
            }

            EditorUtility.DisplayProgressBar("Export GameObject Graph", "exporting", 0.7f);

            StringBuilder exportBuilder = new StringBuilder();
            exportBuilder.AppendLine("graph");
            exportBuilder.AppendLine("[");
            foreach (var objName in objectNames)
            {
                if (referenceInfoList.Any(item => item.fromObject == objName || item.targetObject == objName) == false)
                {
                    continue;
                }

                var isPrefab = PrefabUtility.GetPrefabObject(objName) == null;

                exportBuilder.AppendLine("	node");
                exportBuilder.AppendLine("	[");
                exportBuilder.AppendLine("			id	"+ objName.GetHashCode());
                exportBuilder.AppendLine("			label	\""+ objName.name + "\"");
                exportBuilder.AppendLine("		graphics");
                exportBuilder.AppendLine("		[");
                if (isPrefab)
                {
                    exportBuilder.AppendLine("			fill	\"#FFFF99\"");
                }
                exportBuilder.AppendLine("			w	"+ objName.name.Length * 10);
                exportBuilder.AppendLine("		]");
                exportBuilder.AppendLine("	]");
            }

            foreach (var referenceInfo in referenceInfoList)
            {
                exportBuilder.AppendLine("	edge");
                exportBuilder.AppendLine("	[");
                exportBuilder.AppendLine("			target	"+ referenceInfo.fromObject.GetHashCode());
                exportBuilder.AppendLine("			source	"+ referenceInfo.targetObject.GetHashCode());
                exportBuilder.AppendLine("	]");
            }

            exportBuilder.AppendLine("]");


            EditorUtility.DisplayProgressBar("Export GameObject Graph", "done", 0.7f);

            System.IO.File.WriteAllText(System.DateTime.Now.ToFileTime() + ".gml", exportBuilder.ToString());
        }finally{
            EditorUtility.ClearProgressBar();
        }
    }