private void MainTabControl_KeyDown(object sender, KeyEventArgs e)
        {
            bool isF6 = e.KeyCode == Keys.F6 &&
                        e.Alt == false &&
                        e.Control == false &&
                        e.Shift == false;
            bool isShiftF6 = e.KeyCode == Keys.F6 &&
                             e.Alt == false &&
                             e.Control == false &&
                             e.Shift == true;
            bool isF8 = e.KeyCode == Keys.F8 &&
                        e.Alt == false &&
                        e.Control == false &&
                        e.Shift == false;
            bool isShiftF8 = e.KeyCode == Keys.F8 &&
                             e.Alt == false &&
                             e.Control == false &&
                             e.Shift == true;

            if (isF6)
            {
                int currentTabIndex = mainTabControl.SelectedIndex;
                int nextTabIndex    = currentTabIndex + 1 >= mainTabControl.TabCount ? 0 : currentTabIndex + 1;
                mainTabControl.SelectedIndex = nextTabIndex;
                e.Handled = true;
            }
            else if (isShiftF6)
            {
                int currentTabIndex  = mainTabControl.SelectedIndex;
                int previousTabIndex = currentTabIndex - 1 < 0 ? mainTabControl.TabCount - 1 : currentTabIndex - 1;
                mainTabControl.SelectedIndex = previousTabIndex;
                e.Handled = true;
            }
            else if (isF8)
            {
                TabPage      currentTab = mainTabControl.SelectedTab;
                ParseTreeTab treeTab    = FindFirstControlOfType <ParseTreeTab>(currentTab.Controls);
                if (treeTab != null)
                {
                    int currentTabIndex = treeTab.TreeTabControl.SelectedIndex;
                    int nextTabIndex    = currentTabIndex + 1 >= treeTab.TreeTabControl.TabCount ? 0 : currentTabIndex + 1;
                    treeTab.TreeTabControl.SelectedIndex = nextTabIndex;
                    e.Handled = true;
                }
            }
            else if (isShiftF8)
            {
                TabPage      currentTab = mainTabControl.SelectedTab;
                ParseTreeTab treeTab    = FindFirstControlOfType <ParseTreeTab>(currentTab.Controls);
                if (treeTab != null)
                {
                    int currentTabIndex  = treeTab.TreeTabControl.SelectedIndex;
                    int previousTabIndex = currentTabIndex - 1 < 0 ? treeTab.TreeTabControl.TabCount - 1 : currentTabIndex - 1;
                    treeTab.TreeTabControl.SelectedIndex = previousTabIndex;
                    e.Handled = true;
                }
            }
        }
        private void CopyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TabPage currentTab = mainTabControl.SelectedTab;

            if (currentTab.Text == _tabTitleScript)
            {
                Clipboard.SetText(queryRichTextBox.Text);
            }
            else if (currentTab.Text == _tabTitleMessages)
            {
                RichTextBox messagesTextBox = FindFirstControlOfType <RichTextBox>(currentTab.Controls);
                if (messagesTextBox != null)
                {
                    Clipboard.SetText(messagesTextBox.Text);
                }
            }
            else if (currentTab.Text == _tabTitleResults ||
                     FindFirstControlOfType <DataGridView>(currentTab.Controls) != null)
            {
                List <DataGridView> grids = FindControlsOfType <DataGridView>(currentTab.Controls);
                if (grids != null)
                {
                    StringBuilder sb           = new StringBuilder();
                    string        delimiter    = "\t";
                    string        qualifier    = "\"";
                    string        rowSeparator = Environment.NewLine;

                    foreach (DataGridView grid in grids)
                    {
                        if (grid.DataSource is DataTable)
                        {
                            sb.Append(TableToDelimitedString(grid.DataSource as DataTable, delimiter, qualifier, rowSeparator));
                        }
                        else if (grid.DataSource is DataSet)
                        {
                            foreach (DataTable table in (grid.DataSource as DataSet).Tables)
                            {
                                sb.Append(TableToDelimitedString(table, delimiter, qualifier, rowSeparator));
                            }
                        }
                    }

                    Clipboard.SetText(sb.ToString());
                }
            }
            else
            {
                ParseTreeTab treeTab = FindFirstControlOfType <ParseTreeTab>(currentTab.Controls);
                if (treeTab != null)
                {
                    Clipboard.SetImage(treeTab.DrawingSurface.Image);
                }
            }
        }
        private void ShowThumbnailToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TabPage      currentTab = mainTabControl.SelectedTab;
            ParseTreeTab treeTab    = FindFirstControlOfType <ParseTreeTab>(currentTab.Controls);

            if (treeTab != null)
            {
                Image             image         = treeTab.DrawingSurface.Image;
                ShowThumbnailForm thumbnailForm = new ShowThumbnailForm(image);
                thumbnailForm.ShowDialog();
            }
        }
        public TabPage DrawMemo(SqlMemo memo)
        {
            TabPage tab = new TabPage(memo.Description);

            ParseTreeTab subTab = new ParseTreeTab();

            subTab.Left   = 0;
            subTab.Top    = 0;
            subTab.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;
            subTab.IsMemo = true;

            tab.Controls.Add(subTab);
            tab.Size    = mainTabControl.Size;
            subTab.Size = tab.Size;

            List <MemoNodeIcon> memoNodeIcons;
            Bitmap bitmap = MemoVisualizer.Render(memo, out memoNodeIcons);

            subTab.DrawingSurface.Image = bitmap;
            subTab.TreeText             = memo.InnerText;
            subTab.SetIcons(memoNodeIcons.ConvertAll(i => i as NodeIcon));

            return(tab);
        }
        public TabPage DrawTree(SqlParseTree tree)
        {
            TabPage tab = new TabPage(tree.TreeDescription);

            ParseTreeTab subTab = new ParseTreeTab();

            subTab.Left   = 0;
            subTab.Top    = 0;
            subTab.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;

            tab.Controls.Add(subTab);
            tab.Size    = mainTabControl.Size;
            subTab.Size = tab.Size;

            List <TreeNodeIcon> treeNodeIcons;
            TreeVisualizer      treeVisualizer = TreeVisualizer.Create();
            Bitmap bitmap = treeVisualizer.Render(tree, out treeNodeIcons);

            subTab.DrawingSurface.Image = bitmap;
            subTab.TreeText             = tree.InnerTreeText;
            subTab.SetIcons(treeNodeIcons.ConvertAll(i => i as NodeIcon));

            return(tab);
        }