public UTinyCodePanel(IRegistry registry, UTinyModule.Reference mainModule, State state)
        {
            m_Registry   = registry;
            m_MainModule = mainModule;

            // Init tree
            if (null == state.TreeState)
            {
                state.TreeState = new UTinyCodeTreeState();
            }

            state.TreeState.Init(UTinyCodeTreeView.CreateMultiColumnHeaderState());
            m_TreeView = new UTinyCodeTreeView(state.TreeState, new UTinyCodeTreeModel(registry, mainModule))
            {
                HasContextMenu = true,
            };

            // Init code editors
            m_SystemEditorControl = new UTinySystemEditorControl(registry, mainModule);
            m_ScriptEditorControl = new UTinyScriptEditorControl(registry);

            // Register events
            m_TreeView.OnContextMenuEvent       += HandleContextMenuEvent;
            m_TreeView.OnRenameEnded            += HandleRenameEnded;
            m_SystemEditorControl.OnRenameEnded += HandleRenameEnded;
            m_ScriptEditorControl.OnRenameEnded += HandleRenameEnded;

            var leftPanel = new UTinyPanel();

            leftPanel.AddElement(CreateLeftToolbar());
            leftPanel.AddElement(m_TreeView);

            m_RightPanel = new UTinyPanel();
            m_RightPanel.AddElement(CreateRightToolbar());
            m_RightPanel.AddElement(m_SystemEditorControl);

            if (null == state.SeparatorState)
            {
                state.SeparatorState = new Separator.State();
            }

            var separator = new Separator(leftPanel, m_RightPanel, state.SeparatorState)
            {
                MinLeft  = 350,
                MinRight = 300
            };

            AddElement(separator);

            if (null != UTinySystemExecutionGraphWindow.Instance)
            {
                UTinySystemExecutionGraphWindow.Instance.Registry = m_Registry;
                UTinySystemExecutionGraphWindow.Instance.Module   = m_MainModule;
            }
        }