protected override SerializedObjectEditorGUI <Node> CreateObjectEditorGUI(Node node)
                {
                    NodeEditorGUI editorGUI = NodeEditorGUI.CreateInstance <NodeEditorGUI>();

                    editorGUI.Init(this, node);
                    return(editorGUI);
                }
                private NodeEditorGUI CreateNodeView(Node node)
                {
                    NodeEditorGUI edtiorView = NodeEditorGUI.CreateInstance <NodeEditorGUI>();

                    edtiorView.Init(this, node);
                    return(edtiorView);
                }
        /// <summary>
        /// Called only if RequiresLocationGUI is true.
        /// Displays GUI filling in locationArgs with the information necessary to locate the import operation.
        /// Override along with RequiresLocationGUI for custom database access.
        /// Return true or false to perform or cancel the import operation.
        /// </summary>
        public virtual bool?ImportLocationArgsGUI(ref object[] locationArgs)
        {
            GUILayout.Label("Import canvas " + FormatIdentifier);
            GUILayout.BeginHorizontal();
            //GUILayout.Label(RuntimeIOPath, GUILayout.ExpandWidth(true));
            if (GUILayout.Button(string.IsNullOrEmpty(fileSelection)? "Select..." : fileSelection, GUILayout.ExpandWidth(true)))
            {
                // Find save files
                if (RuntimeIOPath == null)
                {
                    return(false);
                }

                Debug.Log(RuntimeIOPath);
                DirectoryInfo dir          = Directory.CreateDirectory(RuntimeIOPath);
                FileInfo[]    taskdata     = dir.GetFiles("*.taskdata");
                FileInfo[]    dialoguedata = dir.GetFiles("*.dialoguedata");
                FileInfo[]    sectordata   = dir.GetFiles("*.sectordata");
                currentMin = 0;
                files      = new List <FileInfo>();
                files.AddRange(taskdata);
                files.AddRange(dialoguedata);
                files.AddRange(sectordata);
                // Fill save file selection menu
                GenericMenu fileSelectionMenu = new GenericMenu(false);
                for (int i = currentMin; i < Mathf.Min(currentMin + limit, files.Count); i++)
                {
                    int x = i;
                    fileSelectionMenu.AddItem(new GUIContent(files[i].Name), false, () =>
                    {
                        if (files[x].Name.Contains("taskdata"))
                        {
                            NodeEditorGUI.state = NodeEditorGUI.NodeEditorState.Mission;
                        }
                        if (files[x].Name.Contains("dialoguedata"))
                        {
                            NodeEditorGUI.state = NodeEditorGUI.NodeEditorState.Dialogue;
                        }
                        if (files[x].Name.Contains("sectordata"))
                        {
                            NodeEditorGUI.state = NodeEditorGUI.NodeEditorState.Sector;
                        }
                        fileSelection = Path.GetFileName(files[x].Name);
                        NodeEditorGUI.Init();
                    });
                }
                fileSelectionMenu.DropDown(fileSelectionMenuRect);
                fileSelectionMenuRect.height = 500;
                width = fileSelectionMenuRect.width;
            }
            if (Event.current.type == EventType.Repaint)
            {
                Rect popupPos = GUILayoutUtility.GetLastRect();
                fileSelectionMenuRect = new Rect(popupPos.x + 2, popupPos.yMax + 2, popupPos.width - 4, 500);
            }
            else if (files != null && Event.current.delta != Vector2.zero && Event.current.isScrollWheel)
            {
                if (Event.current.delta.y > 0)
                {
                    currentMin = Mathf.Min(currentMin + 3, files.Count - (Mathf.Min(files.Count, limit)));
                }
                else
                {
                    currentMin = Mathf.Max(0, currentMin - 3);
                }
                GenericMenu fileSelectionMenu = new GenericMenu(false);
                for (int i = currentMin; i < Mathf.Min(currentMin + limit, files.Count); i++)
                {
                    int x = i;
                    fileSelectionMenu.AddItem(new GUIContent(files[i].Name), false, () =>
                    {
                        if (files[x].Name.Contains("taskdata"))
                        {
                            NodeEditorGUI.state = NodeEditorGUI.NodeEditorState.Mission;
                        }
                        if (files[x].Name.Contains("dialoguedata"))
                        {
                            NodeEditorGUI.state = NodeEditorGUI.NodeEditorState.Dialogue;
                        }
                        if (files[x].Name.Contains("sectordata"))
                        {
                            NodeEditorGUI.state = NodeEditorGUI.NodeEditorState.Sector;
                        }
                        fileSelection = Path.GetFileName(files[x].Name);
                        NodeEditorGUI.Init();
                    });
                }
                fileSelectionMenu.DropDown(fileSelectionMenuRect, width);
                fileSelectionMenuRect.height = 500;
                width = fileSelectionMenuRect.width;
            }

            // Finish operation buttons
            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Cancel"))
            {
                return(false);
            }
            if (GUILayout.Button("Import"))
            {
                if (string.IsNullOrEmpty(fileSelection) || !File.Exists(RuntimeIOPath + "\\" + fileSelection))
                {
                    Debug.Log(RuntimeIOPath + "\\" + fileSelection);
                    return(false);
                }
                fileSelection = Path.GetFileName(fileSelection);
                locationArgs  = new object[] { RuntimeIOPath + "\\" + fileSelection };
                return(true);
            }
            GUILayout.EndHorizontal();

            return(null);
        }
        public void DrawToolbarGUI(Rect rect)
        {
            rect.height = toolbarHeight;
            rect.width  = 280f;
            if (!showModalPanel)
            {
                GUILayout.BeginArea(rect, NodeEditorGUI.toolbar);
                GUILayout.BeginHorizontal();
                //float curToolbarHeight = 0;
                if (GUILayout.Button("New", NodeEditorGUI.toolbarButton, GUILayout.Width(50)))
                {
                    AutoSave();
                    switch (NodeEditorGUI.state)
                    {
                    case NodeEditorGUI.NodeEditorState.Mission:
                        NewNodeCanvas(typeof(QuestCanvas));
                        break;

                    case NodeEditorGUI.NodeEditorState.Dialogue:
                        NewNodeCanvas(typeof(DialogueCanvas));
                        break;

                    case NodeEditorGUI.NodeEditorState.Sector:
                        NewNodeCanvas(typeof(SectorCanvas));
                        break;
                    }
                    IOLocationArgs = null;
                }
                if (GUILayout.Button("Import", NodeEditorGUI.toolbarButton, GUILayout.Width(50)))
                {
                    IOFormat = ImportExportManager.ParseFormat("XML");
                    if (IOFormat.RequiresLocationGUI)
                    {
                        // Try to auto save
                        AutoSave();

                        ImportLocationGUI = IOFormat.ImportLocationArgsGUI;
                        modalPanelContent = ImportCanvasGUI;
                        showModalPanel    = true;
                    }
                    else if (IOFormat.ImportLocationArgsSelection(out IOLocationArgs))
                    {
                        canvasCache.SetCanvas(ImportExportManager.ImportCanvas(IOFormat, IOLocationArgs));
                    }
                }
                if (GUILayout.Button("Export", NodeEditorGUI.toolbarButton, GUILayout.Width(50)))
                {
                    IOFormat = ImportExportManager.ParseFormat("XML");
                    if (IOFormat.RequiresLocationGUI)
                    {
                        ExportLocationGUI = IOFormat.ExportLocationArgsGUI;
                        modalPanelContent = ExportCanvasGUI;
                        showModalPanel    = true;
                    }
                    else if (IOFormat.ExportLocationArgsSelection(canvasCache.nodeCanvas.saveName, out IOLocationArgs))
                    {
                        ImportExportManager.ExportCanvas(canvasCache.nodeCanvas, IOFormat, IOLocationArgs);
                    }
                }
                string buttonText = "Mission";
                switch (NodeEditorGUI.state)
                {
                case NodeEditorGUI.NodeEditorState.Mission:
                    buttonText = "Mission";
                    break;

                case NodeEditorGUI.NodeEditorState.Dialogue:
                    buttonText = "Dialogue";
                    break;

                case NodeEditorGUI.NodeEditorState.Sector:
                    buttonText = "Sector";
                    break;

                default:
                    break;
                }

                if (GUILayout.Button(buttonText, NodeEditorGUI.toolbarButton, GUILayout.Width(50)))
                {
                    NodeEditorGUI.state = (NodeEditorGUI.NodeEditorState)(((int)NodeEditorGUI.state + 1) % 3);

                    switch (NodeEditorGUI.state)
                    {
                    case NodeEditorGUI.NodeEditorState.Mission:
                        NewNodeCanvas(typeof(QuestCanvas));
                        break;

                    case NodeEditorGUI.NodeEditorState.Dialogue:
                        NewNodeCanvas(typeof(DialogueCanvas));
                        break;

                    case NodeEditorGUI.NodeEditorState.Sector:
                        NewNodeCanvas(typeof(SectorCanvas));
                        break;

                    default:
                        break;
                    }
                    NodeEditorGUI.Init();
                }

                bool autoSave = GUILayout.Toggle(autoSaveEnabled, "Auto Save");
                if (autoSave != autoSaveEnabled)
                {
                    autoSaveEnabled = autoSave;
                    PlayerPrefs.SetInt("NEAutoSave", autoSave ? 1 : 0);
                    PlayerPrefs.Save();
                }

                GUI.backgroundColor = Color.white;
                GUILayout.EndHorizontal();
                GUILayout.EndArea();
                if (Event.current.type == EventType.Repaint)
                {
                    toolbarHeight = 20;
                }
            }
        }