void OnGUI()
        {
            if (!init)
            {
                Init();
            }

            bool  hoverSelected = false;
            Event e             = Event.current;

            EditorPlusHistoryInternal.CheckConsistency();

            widgetHostFavs.Area         = position;
            widgetHostFavs.WidgetsCount = EditorPlusHistoryInternal.favorites.Count + 1;
            widgetHostFavs.Update();

            favsView = new Rect(0, 0, position.width, widgetHostFavs.GetYMax());

            historyView = new Rect(0, widgetHostFavs.GetYMax(), position.width, position.height - favsView.height);

            widgetHostHistory.Area         = position;
            widgetHostHistory.WidgetsCount = EditorPlusHistoryInternal.history.Count;

            widgetHostHistory.Update();

            //drag and drop sorting
            if (favsView.Contains(e.mousePosition) && DragAndDrop.objectReferences.Length > 0 && DragAndDrop.objectReferences[0] == selectedObj && (EditorPlusHistoryInternal.favorites.Contains(selectedObj) || EditorPlusHistoryInternal.history.Contains(selectedObj)))
            {
                DragAndDrop.visualMode = DragAndDropVisualMode.Link;
                if (e.rawType == EventType.DragPerform)
                {
                    int index = widgetHostFavs.FindClosestWidget(e.mousePosition);

                    bool abort = false;

                    if (index - 1 == EditorPlusHistoryInternal.favorites.IndexOf(selectedObj))
                    {
                        DragAndDrop.PrepareStartDrag();
                        abort = true;
                    }
                    else if (index - 1 <= 0)
                    {
                        if (!EditorPlusHistoryInternal.favorites.Contains(selectedObj))
                        {
                            EditorPlusHistoryInternal.AddToFavorites(selectedObj);
                            widgetHostFavs.WidgetsCount = EditorPlusHistoryInternal.favorites.Count + 1;
                            widgetHostFavs.Update();
                        }
                        EditorPlusHistoryInternal.SetFavoritePosition(0, selectedObj);
                        abort = true;
                    }

                    //check if widget + margin.x contains mouse position and insert there
                    if (!abort && e.mousePosition.x > widgetHostFavs.Widgets[index].x && e.mousePosition.x <widgetHostFavs.Widgets[index].x + widgetHostFavs.Widgets[index].width + widgetHostFavs.WidgetMargin.x && e.mousePosition.y> widgetHostFavs.Widgets[index].y && e.mousePosition.y < widgetHostFavs.Widgets[index].y + widgetHostFavs.Widgets[index].height)
                    {
                        //left or right
                        if (e.mousePosition.x < widgetHostFavs.Widgets[index].x + widgetHostFavs.Widgets[index].width / 2)
                        {
                            if (!EditorPlusHistoryInternal.favorites.Contains(selectedObj))
                            {
                                EditorPlusHistoryInternal.AddToFavorites(selectedObj);
                                widgetHostFavs.WidgetsCount = EditorPlusHistoryInternal.favorites.Count + 1;
                                widgetHostFavs.Update();
                            }
                            EditorPlusHistoryInternal.SetFavoritePosition(index - 1, selectedObj);
                        }
                        else
                        {
                            if (!EditorPlusHistoryInternal.favorites.Contains(selectedObj))
                            {
                                EditorPlusHistoryInternal.AddToFavorites(selectedObj);
                                widgetHostFavs.WidgetsCount = EditorPlusHistoryInternal.favorites.Count + 1;
                                widgetHostFavs.Update();
                            }
                            EditorPlusHistoryInternal.SetFavoritePosition(index, selectedObj);
                        }
                    }
                    else if (!abort)
                    {
                        if (!EditorPlusHistoryInternal.favorites.Contains(selectedObj))
                        {
                            EditorPlusHistoryInternal.AddToFavorites(selectedObj);
                            widgetHostFavs.WidgetsCount = EditorPlusHistoryInternal.favorites.Count + 1;
                            widgetHostFavs.Update();
                        }
                        EditorPlusHistoryInternal.SetFavoritePosition(EditorPlusHistoryInternal.favorites.Count, selectedObj);
                    }
                }
            }


            float scrollViewFavsHeight = 0f;

            if (widgetHostFavs.Widgets.Count > 0)
            {
                scrollViewFavsHeight = widgetHostFavs.Widgets[widgetHostFavs.Widgets.Count - 1].yMax;
            }


            float scrollViewHistHeight = 0f;

            if (widgetHostHistory.Widgets.Count > 0)
            {
                scrollViewHistHeight = widgetHostHistory.Widgets[widgetHostHistory.Widgets.Count - 1].yMax;
            }

            if (position.height < scrollViewFavsHeight + scrollViewHistHeight)
            {
                widgetHostFavs.Area = new Rect(0, 0, favsView.width - GUI.skin.verticalScrollbar.normal.background.width, favsView.height);
                widgetHostFavs.Update();

                widgetHostHistory.Area = new Rect(0, historyView.y, historyView.width - GUI.skin.verticalScrollbar.normal.background.width, historyView.height);
                widgetHostHistory.Update();
            }

            GUISkin old = GUI.skin;

            GUI.skin       = EditorPlus.ScrollviewSkin;
            historyViewPos = GUI.BeginScrollView(new Rect(0, 0, position.width, position.height), historyViewPos, new Rect(0, 0, position.width - 30, scrollViewFavsHeight + scrollViewHistHeight));
            GUI.skin       = old;

            if (GUI.skin != IconsSkinFav)
            {
                GUI.skin = IconsSkinFav;
            }

            //Navigation Arrows
            Rect r = widgetHostFavs.Widgets[0];

            if (GUI.Button(new Rect(r.x, r.y, r.width / 2 - ButtonMargin.x - LockClosed.width, r.height), new GUIContent("Prev", Prev)) || (e.isMouse && e.button == 3))
            {
                EditorPlusHistoryInternal.HistoryNavigationBack();
            }

            if (GUI.Button(new Rect(r.x + r.width / 2, r.y, r.width / 2, r.height), new GUIContent("Next", Next)))
            {
                EditorPlusHistoryInternal.HistoryNavigationForward();
            }


            //-----------------------------------------------
            //draw favorites
            for (int i = 0; i < EditorPlusHistoryInternal.favorites.Count; ++i)
            {
                if (GUI.skin != IconsSkinFav)
                {
                    GUI.skin = IconsSkinFav;
                }


                r = widgetHostFavs.Widgets[i + 1];

                if (e.rawType == EventType.MouseDown)
                {
                    if (r.Contains(e.mousePosition))
                    {
                        //Drag object
                        if (e.button == 0)
                        {
                            highlightInFavs = true;
                            if (e.clickCount != 2)
                            {
                                selectedObj = EditorPlusHistoryInternal.favorites[i];

                                DragAndDrop.PrepareStartDrag();
                                if (selectedObj.GetType() != typeof(UnityEngine.GameObject))
                                {
                                    DragAndDrop.paths = new string[] { AssetDatabase.GetAssetPath(selectedObj) }
                                }
                                ;
                                DragAndDrop.objectReferences = new Object[] { selectedObj };

                                DragAndDrop.StartDrag(selectedObj.ToString());
                            }
                            else if (e.clickCount == 2)
                            {
                                Selection.activeObject = EditorPlusHistoryInternal.favorites[i];

                                if (Selection.activeObject.GetType() != typeof(UnityEngine.GameObject))
                                {
                                    if (Selection.activeObject.GetType() == EditorPlus.EPlusDefaultType)
                                    {
                                        string path = AssetDatabase.GetAssetPath(Selection.activeObject);
                                        if (Directory.Exists(path))
                                        {
                                            string[] subFolders = Directory.GetDirectories(path);
                                            if (subFolders.Length != 0)
                                            {
                                                AssetDatabase.OpenAsset(AssetDatabase.LoadMainAssetAtPath(subFolders[0]));
                                                break;
                                            }

                                            string[] content = Directory.GetFiles(path);
                                            if (content.Length == 0)
                                            {
                                                EditorGUIUtility.PingObject(Selection.activeObject);
                                            }
                                            else
                                            {
                                                foreach (string file in content)
                                                {
                                                    Object asset = AssetDatabase.LoadMainAssetAtPath(file);
                                                    if (asset != null)
                                                    {
                                                        EditorGUIUtility.PingObject(asset);
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        EditorGUIUtility.PingObject(Selection.activeObject);
                                    }
                                }
                            }
                        }
                        hoverSelected = true;
                    }
                }
                else if (e.rawType == EventType.MouseUp && r.Contains(e.mousePosition))
                {
                    hoverSelected = true;
                }


                GUIContent cnt = new GUIContent(EditorPlusHistoryInternal.favorites[i].name);

                if (cnt.text == "")
                {
                    cnt.text = "Noname";
                }

                if (showLabels)
                {
                    Texture2D prev = AssetPreview.GetAssetPreview(EditorPlusHistoryInternal.favorites[i]);
                    if (prev == null)
                    {
                        prev = (Texture2D)AssetDatabase.GetCachedIcon(AssetDatabase.GetAssetPath(EditorPlusHistoryInternal.favorites[i]));
                        if (EditorPlusHistoryInternal.favorites[i].GetType() == typeof(UnityEngine.GameObject))
                        {
                            prev = GameObjectLabel;
                        }
                    }
                    GUI.Label(new Rect(r.x, r.y, 32 * widgetHostFavs.WidgetScale, r.height), prev, ((selectedObj == EditorPlusHistoryInternal.favorites[i] && highlightInFavs)) ? new GUIStyle(GUI.skin.box) : new GUIStyle(GUI.skin.button));
                    r.x     += 20 * widgetHostFavs.WidgetScale;
                    r.width -= 20 * widgetHostFavs.WidgetScale;
                }
                GUI.Label(r, cnt, ((selectedObj == EditorPlusHistoryInternal.favorites[i] && highlightInFavs)) ? new GUIStyle(GUI.skin.box) : new GUIStyle(GUI.skin.button));

                Rect lockButton = new Rect(r.x + r.width, r.y + 5, LockClosed.width, LockClosed.height);

                if (GUI.skin != IconsSkinLock)
                {
                    GUI.skin = IconsSkinLock;
                }

                if (GUI.Button(lockButton, LockClosed))
                {
                    EditorPlusHistoryInternal.RemoveFromFavorites(EditorPlusHistoryInternal.favorites[i]);
                    --i;
                    hoverSelected     = true;
                    repaintNextUpdate = true;
                    continue;
                }
            }

            if (GUI.skin != IconsSkin)
            {
                GUI.skin = IconsSkin;
            }


            //historyViewPos = GUI.BeginScrollView(historyView, historyViewPos, new Rect(0, 0, position.width - 30, scrollViewHistHeight));
            historyView.height = scrollViewHistHeight;
            GUI.BeginGroup(historyView);

            //-----------------------------------------------
            //draw history
            for (int i = 0; i < EditorPlusHistoryInternal.history.Count; ++i)
            {
                if (i == historySize)
                {
                    break;
                }

                if (GUI.skin != IconsSkin)
                {
                    GUI.skin = IconsSkin;
                }

                if (EditorPlusHistoryInternal.history[i] == null)
                {
                    EditorPlusHistoryInternal.RemoveFromHistory(EditorPlusHistoryInternal.history[i], true);
                    --i;
                    continue;
                }

                r = widgetHostHistory.Widgets[i];

                if (e.rawType == EventType.MouseDown)
                {
                    if (r.Contains(e.mousePosition))
                    {
                        //Drag object
                        if (e.button == 0)
                        {
                            highlightInFavs = false;
                            if (e.clickCount != 2)
                            {
                                selectedObj = EditorPlusHistoryInternal.history[i];

                                DragAndDrop.PrepareStartDrag();
                                string path = AssetDatabase.GetAssetPath(selectedObj);
                                if (path != "")
                                {
                                    DragAndDrop.paths = new string[] { path }
                                }
                                ;
                                if (selectedObj != null)
                                {
                                    DragAndDrop.objectReferences = new Object[] { selectedObj }
                                }
                                ;

                                DragAndDrop.StartDrag(selectedObj.ToString());
                            }
                            else if (e.clickCount == 2)
                            {
                                Selection.activeObject = EditorPlusHistoryInternal.history[i];

                                if (Selection.activeObject.GetType() != typeof(UnityEngine.GameObject))
                                {
                                    if (Selection.activeObject.GetType() == EditorPlus.EPlusDefaultType)
                                    {
                                        string path = AssetDatabase.GetAssetPath(Selection.activeObject);
                                        if (Directory.Exists(path))
                                        {
                                            string[] subFolders = Directory.GetDirectories(path);
                                            if (subFolders.Length != 0)
                                            {
                                                AssetDatabase.OpenAsset(AssetDatabase.LoadMainAssetAtPath(subFolders[0]));
                                                break;
                                            }

                                            string[] content = Directory.GetFiles(path);
                                            if (content.Length == 0)
                                            {
                                                EditorGUIUtility.PingObject(Selection.activeObject);
                                            }
                                            else
                                            {
                                                foreach (string file in content)
                                                {
                                                    Object asset = AssetDatabase.LoadMainAssetAtPath(file);
                                                    if (asset != null)
                                                    {
                                                        EditorGUIUtility.PingObject(asset);
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        EditorGUIUtility.PingObject(Selection.activeObject);
                                    }
                                }
                            }
                        }
                        hoverSelected = true;
                    }
                }
                else if (e.rawType == EventType.MouseUp && r.Contains(e.mousePosition))
                {
                    hoverSelected = true;
                }


                GUIContent cnt = new GUIContent(EditorPlusHistoryInternal.history[i].name);

                if (cnt.text == "")
                {
                    cnt.text = "Noname";
                }

                //Debug.Log(GUI.skin.box.CalcSize(new GUIContent(cnt.text)).x + " " + GUI.skin.box.padding.left + " " + GUI.skin.box.padding.right);

                if (showLabels)
                {
                    Texture2D prev = AssetPreview.GetAssetPreview(EditorPlusHistoryInternal.history[i]);
                    if (prev == null)
                    {
                        prev = (Texture2D)AssetDatabase.GetCachedIcon(AssetDatabase.GetAssetPath(EditorPlusHistoryInternal.history[i]));
                        if (EditorPlusHistoryInternal.history[i].GetType() == typeof(UnityEngine.GameObject))
                        {
                            prev = GameObjectLabel;
                        }
                    }
                    GUI.Label(new Rect(r.x, r.y, 32 * widgetHostHistory.WidgetScale, r.height), prev, ((selectedObj == EditorPlusHistoryInternal.history[i] && !highlightInFavs)) ? new GUIStyle(GUI.skin.box) : new GUIStyle(GUI.skin.button));
                    r.x     += 20 * widgetHostHistory.WidgetScale;
                    r.width -= 20 * widgetHostHistory.WidgetScale;
                }

                GUI.Label(r, cnt, ((selectedObj == EditorPlusHistoryInternal.history[i] && !highlightInFavs)) ?  new GUIStyle(GUI.skin.box) : new GUIStyle(GUI.skin.button));

                Rect lockButton = new Rect(r.x + r.width, r.y + 5, LockOpen.width, LockOpen.height);

                if (GUI.skin != IconsSkinLock)
                {
                    GUI.skin = IconsSkinLock;
                }

                if (!EditorPlusHistoryInternal.favorites.Contains(EditorPlusHistoryInternal.history[i]) && GUI.Button(lockButton, LockOpen))
                {
                    EditorPlusHistoryInternal.AddToFavorites(EditorPlusHistoryInternal.history[i]);
                    --i;
                    hoverSelected     = true;
                    repaintNextUpdate = true;
                    continue;
                }
            }
            GUI.EndGroup();
            GUI.EndScrollView();



            //Reset Inspector if mouse up inside the window but not on button

            bool inside = false;

            if (e.mousePosition.x > 0f && e.mousePosition.x < window.position.width && e.mousePosition.y > 0f && e.mousePosition.y < window.position.height)
            {
                inside = true;
            }
            if (inside && !hoverSelected && e.rawType == EventType.MouseUp)
            {
                selectedObj            = null;
                Selection.activeObject = null;
            }

            if ((e.rawType == EventType.MouseUp || e.rawType == EventType.dragPerform) && DragAndDrop.objectReferences != null)
            {
                DragAndDrop.PrepareStartDrag();
            }
        }
    }
}