tabstrip.cs

来自「Fireball.CodeEditor is an source code ed」· CS 代码 · 共 559 行 · 第 1/2 页

CS
559
字号


                _VisibleCount = i;

                if (right > _StripButtonRect.Width)
                    break;
            }

            if (_SelectedItem != null)
            {
                if (this.Controls.GetChildIndex(_SelectedItem) != 0)
                {
                    e.Graphics.DrawLine(SystemPens.ControlDark, 0, _SelectedItem.StripRect.Bottom - 1,
                        _SelectedItem.StripRect.Left - 10, _SelectedItem.StripRect.Bottom - 1);
                }

                e.Graphics.DrawLine(SystemPens.ControlDark, _SelectedItem.StripRect.Right, _SelectedItem.StripRect.Bottom - 1,
                    this.ClientSize.Width, _SelectedItem.StripRect.Bottom - 1);

                e.Graphics.DrawLine(Pens.White, _SelectedItem.StripRect.Left - 9,
                    _SelectedItem.StripRect.Bottom - 1, _SelectedItem.StripRect.Right,
                    _SelectedItem.StripRect.Bottom - 1);
            }

            if (_SelectedItem == null) return;

            _CloseButton.Activated = _SelectedItem.CanClose;

            _MenuGlyph.DrawGlyph(e.Graphics);

            if (_SelectedItem.CanClose)
                _CloseButton.DrawCross(e.Graphics);
        }


        public void AddTab(TabStripItem tabItem)
        {
            this.Controls.Add(tabItem);
        }

        public void RemoveTab(TabStripItem tabItem)
        {
            this.Controls.Remove(tabItem);
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            if (e.Button != MouseButtons.Left)
                return;



            if (_MenuGlyph.GlyphRect.Contains(e.Location))
            {
                loadMenuItems();
                if (_ContextDocsList.Visible == false)
                    _ContextDocsList.Show(this, new Point(e.X, _MenuGlyph.GlyphRect.Bottom));
            }

            if (_CloseButton.CrossRect.Contains(e.Location) && this.SelectedItem.CanClose )
            {
                TabStripItemClosingEventArgs evt = new TabStripItemClosingEventArgs(_SelectedItem);

                OnTabStripItemClosing(evt);

                if (!evt.Cancel)
                {
                    this.Controls.Remove(_SelectedItem);

                    this.OnTabStripItemClosing(EventArgs.Empty);
                }
            }

            this.Invalidate();

            TabStripItem selected = null;

            for (int i = 0; i < this.Controls.Count; i++)
            {
                TabStripItem current = (TabStripItem)this.Controls[i];

                if (current.StripRect.Contains(e.Location))
                {
                    current.DrawState |= DrawItemState.Selected;

                    if (current.StripRect.Right > _StripButtonRect.Right)
                    {
                        break;
                    }
                    else
                    {
                        selected = current;
                        break;
                    }
                }
            }

            if (selected == null)
                return;

            this.SelectedItem = selected;

            this.Invalidate();
        }

        protected override void OnControlRemoved(ControlEventArgs e)
        {
            base.OnControlRemoved(e);
            if (this.Controls.Count > 0)
                this.SelectedItem = (TabStripItem)this.Controls[this.Controls.Count - 1];
            else
                this.SelectedItem = null;
        }

        public virtual void OnTabStripItemClosing(TabStripItemClosingEventArgs e)
        {
            if (TabStripItemClosing != null)
            {
                TabStripItemClosing(e);
            }
        }

        public virtual void OnTabStripItemClosing(EventArgs e)
        {
            if (TabStripItemClosed != null)
            {
                TabStripItemClosed(this,e);
            }
        }

        void SelectItem(TabStripItem tabItem)
        {
            tabItem.Visible = true;
            tabItem.DrawState |= DrawItemState.Selected;
        }

        void UnSelectItem(TabStripItem tabItem)
        {
            tabItem.Visible = false;
            tabItem.DrawState = DrawItemState.None;
        }

        void loadMenuItems()
        {
            _ContextDocsList.Items.Clear();


            for (int i = 0; i < this.Controls.Count; i++)
            {
                TabStripItem item = (TabStripItem)this.Controls[i];

                ToolStripMenuItem tItem = new ToolStripMenuItem(item.Text);

                tItem.Tag = item;

                _ContextDocsList.Items.Add(tItem);
            }
        }

        void _ContextDocsList_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            this.SelectedItem = (TabStripItem)e.ClickedItem.Tag;
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            if (_MenuGlyph.GlyphRect.Contains(e.Location))
            {
                _MenuGlyph.IsMouseOver = true;
                this.Invalidate(_MenuGlyph.GlyphRect);
            }
            else
            {
                if (_MenuGlyph.IsMouseOver != false)
                {
                    _MenuGlyph.IsMouseOver = false;
                    this.Invalidate(_MenuGlyph.GlyphRect);
                }
            }

            if (_CloseButton.CrossRect.Contains(e.Location))
            {
                _CloseButton.IsMouseOver = true;
                this.Invalidate(_CloseButton.CrossRect);
            }
            else
            {
                if (_CloseButton.IsMouseOver != false)
                {
                    _CloseButton.IsMouseOver = false;
                    this.Invalidate(_CloseButton.CrossRect);
                }
            }
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            _MenuGlyph.IsMouseOver = false;
            this.Invalidate(_MenuGlyph.GlyphRect);

            _CloseButton.IsMouseOver = false;
            this.Invalidate(_CloseButton.CrossRect);
        }

        void DrawButton(Graphics gfx, RectangleF buttonRect, DrawItemState state, int buttonIndex)
        {
            GraphicsPath _Path = new GraphicsPath();

            int mtop = 3;

            if ((state &= DrawItemState.Selected) == DrawItemState.Selected || buttonIndex == 0)
                _Path.AddLine(buttonRect.Left - 10, buttonRect.Bottom - 1, buttonRect.Left + (buttonRect.Height / 2) - 4, mtop + 4);
            else
            {
                _Path.AddLine(buttonRect.Left, buttonRect.Bottom - 1, buttonRect.Left,
                    buttonRect.Bottom - (buttonRect.Height / 2) - 2);

                _Path.AddLine(buttonRect.Left, buttonRect.Bottom - (buttonRect.Height / 2) - 3,
                    buttonRect.Left + (buttonRect.Height / 2) - 4, mtop + 3);
            }

            _Path.AddLine(buttonRect.Left + (buttonRect.Height / 2) + 2,
                mtop, buttonRect.Right - 3, mtop);

            _Path.AddLine(buttonRect.Right, mtop + 2, buttonRect.Right,
                buttonRect.Bottom - 1);

            _Path.AddLine(buttonRect.Right - 4, buttonRect.Bottom - 1, buttonRect.Left,
                buttonRect.Bottom - 1);

            _Path.CloseFigure();

            LinearGradientBrush _brush = null;

            if ((state &= DrawItemState.Selected) == DrawItemState.Selected)
            {
                
                _brush = new LinearGradientBrush(buttonRect,
                SystemColors.ControlLightLight, SystemColors.Window,
                LinearGradientMode.Vertical);
            }
            else
            {
                _brush = new LinearGradientBrush(buttonRect,
                    SystemColors.ControlLightLight, SystemColors.Control,
                    LinearGradientMode.Vertical);
            }

            gfx.FillPath(_brush, _Path);

            gfx.DrawPath(SystemPens.ControlDark, _Path);
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);

            _StripButtonRect = new Rectangle(0, 0, this.ClientSize.Width - 40, 10);

            _MenuGlyph.GlyphRect = new Rectangle(this.ClientSize.Width - 39, 2, 16, 16);

            _CloseButton.CrossRect = new Rectangle(this.ClientSize.Width - 20,2, 16, 16);

            if (_SelectedItem != null)
            {
                if (_SelectedItem.StripRect.Right > _StripButtonRect.Right)
                {
                    this.Controls.SetChildIndex(_SelectedItem, 0);
                }
            }
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?