public BonsaiInput()
        {
            // Clicks are one-shot events.
            clickTimer.AutoReset = false;

            // Setup Node Selection menu.
            foreach (var kvp in BonsaiEditor.Behaviours)
            {
                Type nodeType = kvp.Key;
                BonsaiEditor.NodeTypeProperties prop = kvp.Value;
                nodeTypeSelectionMenu.AddItem(new GUIContent(prop.path), false, OnCreateNodeRequest, nodeType);
            }

            // Setup node context menu.
        }
        public BonsaiInputHandler(BonsaiWindow w)
        {
            _window = w;
            _nodeTypeSelectionMenu = new GenericMenu();
            _nodeContextMenu       = new GenericMenu();
            _multiNodeContextMenu  = new GenericMenu();

            // Setup Node Selection menu.
            foreach (var kvp in BonsaiEditor.Behaviours)
            {
                Type nodeType = kvp.Key;
                BonsaiEditor.NodeTypeProperties prop = kvp.Value;

                _nodeTypeSelectionMenu.AddItem(new GUIContent(prop.path), false, onNodeCreateCallback, nodeType);
            }

            // Setup node context menu.
            _nodeContextMenu.AddItem(new GUIContent("Set As Root"), false, onNodeContextCallback, NodeContext.SetAsRoot);
            _nodeContextMenu.AddItem(new GUIContent("Duplicate"), false, onNodeContextCallback, NodeContext.Duplicate);
            _nodeContextMenu.AddItem(new GUIContent("Change Type"), false, onNodeContextCallback, NodeContext.ChangeType);
            _nodeContextMenu.AddItem(new GUIContent("Delete"), false, onNodeContextCallback, NodeContext.Delete);

            // Setup area selection context menu.
            _multiNodeContextMenu.AddItem(new GUIContent("Duplicate"), false, onMultiNodeCallback, NodeContext.DuplicateSelection);
            _multiNodeContextMenu.AddItem(new GUIContent("Delete"), false, onMultiNodeCallback, NodeContext.DeleteSelection);

            // Define the actions to take when a single node is selected.
            onSingleSelected = (node) =>
            {
                // Only apply single node selection on a node that is
                // not currently under area selection.
                if (!node.bAreaSelectionFlag)
                {
                    _window.editor.ClearReferencedNodes();
                    clearAreaSelection();

                    _selectedNode = node;
                    _window.editor.canvas.PushToEnd(_selectedNode);
                    Selection.activeObject = node.behaviour;

                    handleOnAborterSelected(node);
                    handleOnReferenceContainerSelected(node);
                }
            };
        }