/// <summary>
 /// 将项插入 CharmCatalogueList 的指定索引处
 /// </summary>
 /// <param name="index"></param>
 /// <param name="item"></param>
 public void Insert(int index, CatalogListBoxItem item)
 {
     if (item == null)
     {
         throw new ArgumentNullException("item");
     }
     Owner.OldItems.Insert(index, item);
 }
 /// <summary>
 /// 向 CharmCatalogueList 的项列表添加项
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public int Add(CatalogListBoxItem item)
 {
     if (item == null)
     {
         throw new ArgumentException("item");
     }
     return(Owner.OldItems.Add(item));
 }
        /// <summary>
        /// 引发 MouseMove 事件
        /// </summary>
        /// <param name="e">包含事件数据的 MouseEventArgs</param>
        protected override void OnMouseMove(MouseEventArgs e)
        {
            bool isChange = false;  // 是否改变标识符

            base.OnMouseMove(e);
            for (int i = 0; i < Items.Count; i++)
            {
                Rectangle bounds = GetItemRectangle(i);
                if (bounds.Contains(e.X, e.Y))
                {
                    if (e.X > 445 && e.X < 545 && e.Y > (27 + bounds.Y) && e.Y < (57 + bounds.Y))
                    {
                        if (buttonHighlightIndex != i)
                        {
                            buttonHighlightIndex = i;
                            isChange             = true;
                        }
                    }
                    else if (e.X > 330 && e.X < 410 && e.Y > (45 + bounds.Y) && e.Y < (65 + bounds.Y))
                    {
                        if (Cursor != Cursors.Hand)
                        {
                            Cursor = Cursors.Hand;
                        }
                    }
                    else
                    {
                        if (Cursor != Cursors.Arrow)
                        {
                            Cursor = Cursors.Arrow;
                        }

                        if (buttonHighlightIndex == i)
                        {
                            buttonHighlightIndex = -1;
                            isChange             = true;
                        }
                    }

                    if (Items[i] != mMouseItem)
                    {
                        mMouseItem = Items[i];
                        isChange   = true;
                    }
                }

                if (isChange)
                {
                    break;
                }
            }

            if (isChange)
            {
                Invalidate();
            }
        }
 /// <summary>
 /// 选中项被改变事件
 /// </summary>
 /// <param name="e"></param>
 protected override void OnSelectedIndexChanged(EventArgs e)
 {
     // 判断不为主分类标签才执行事件
     if (!Items[SelectedIndex].IsClass)
     {
         mMouseItem = Items[SelectedIndex];
         mClassName = mMouseItem.Text;
         base.OnSelectedIndexChanged(e);
     }
     else
     {
         // 分类表项被单击
         // 获取分类展开标识、分类ID
         bool isExpand = Items[SelectedIndex].IsExpand;
         int  classID  = Items[SelectedIndex].ClassID;
         // 判断当前展开状态
         if (isExpand)
         {
             // 当前为展开状态,需要闭合
             for (int i = Items.Count - 1; i >= 0; i--)
             {
                 if (Items[i].ClassID == classID && !Items[i].IsClass)
                 {
                     mHideItems.Insert(0, Items[i]);
                     Items.RemoveAt(i);
                 }
             }
             // 设置展开状态为假
             Items[SelectedIndex].IsExpand = false;
         }
         else
         {
             // 当前为闭合状态,需要展开
             for (int i = mHideItems.Count - 1; i >= 0; i--)
             {
                 if ((mHideItems[i]).ClassID == classID)
                 {
                     Items.Insert(SelectedIndex + 1, mHideItems[i]);
                     mHideItems.RemoveAt(i);
                 }
             }
             // 设置展开状态为真
             Items[SelectedIndex].IsExpand = true;
         }
     }
     // 重绘列表
     Invalidate();
 }
 /// <summary>
 /// 选中项被改变事件
 /// </summary>
 /// <param name="e"></param>
 protected override void OnSelectedIndexChanged(EventArgs e)
 {
     // 判断不为主分类标签才执行事件
     if (!Items[SelectedIndex].IsClass)
     {
         mMouseItem = Items[SelectedIndex];
         mClassName = mMouseItem.Text;
         base.OnSelectedIndexChanged(e);
     }
     else
     {
         // 分类表项被单击
         // 获取分类展开标识、分类ID
         bool isExpand = Items[SelectedIndex].IsExpand;
         int classID = Items[SelectedIndex].ClassID;
         // 判断当前展开状态
         if (isExpand)
         {
             // 当前为展开状态,需要闭合
             for (int i = Items.Count - 1; i >= 0; i--)
             {
                 if (Items[i].ClassID == classID && !Items[i].IsClass)
                 {
                     mHideItems.Insert(0, Items[i]);
                     Items.RemoveAt(i);
                 }
             }
             // 设置展开状态为假
             Items[SelectedIndex].IsExpand = false;
         }
         else
         {
             // 当前为闭合状态,需要展开
             for (int i = mHideItems.Count - 1; i >= 0; i--)
             {
                 if ((mHideItems[i]).ClassID == classID)
                 {
                     Items.Insert(SelectedIndex + 1,mHideItems[i]);
                     mHideItems.RemoveAt(i);
                 }
             }
             // 设置展开状态为真
             Items[SelectedIndex].IsExpand = true;
         }
     }
     // 重绘列表
     Invalidate();
 }
        /// <summary>
        /// 引发 MouseMove 事件
        /// </summary>
        /// <param name="e">包含事件数据的 MouseEventArgs</param>
        protected override void OnMouseMove(MouseEventArgs e)
        {
            bool isChange = false;  // 是否改变标识符
            base.OnMouseMove(e);
            for (int i = 0; i < Items.Count; i++)
            {
                Rectangle bounds = GetItemRectangle(i);
                if (bounds.Contains(e.X, e.Y))
                {
                    if (e.X > 445 && e.X < 545 && e.Y > (27 + bounds.Y) && e.Y < (57 + bounds.Y))
                    {
                        if (buttonHighlightIndex != i)
                        {
                            buttonHighlightIndex = i;
                            isChange = true;
                        }
                    }
                    else if (e.X > 330 && e.X < 410 && e.Y > (45 + bounds.Y) && e.Y < (65 + bounds.Y))
                    {
                        if (Cursor != Cursors.Hand)
                            Cursor = Cursors.Hand;
                    }
                    else
                    {
                        if (Cursor != Cursors.Arrow)
                            Cursor = Cursors.Arrow;

                        if (buttonHighlightIndex == i)
                        {
                            buttonHighlightIndex = -1;
                            isChange = true;
                        }
                    }

                    if (Items[i] != mMouseItem)
                    {
                        mMouseItem = Items[i];
                        isChange = true;
                    }
                }

                if (isChange)
                    break;
            }

            if (isChange)
            {
                Invalidate();
            }
        }
 /// <summary>
 /// 从集合中移除指定的对象
 /// </summary>
 /// <param name="item"></param>
 public void Remove(CatalogListBoxItem item)
 {
     Owner.OldItems.Remove(item);
 }
 /// <summary>
 /// 将项插入 CharmCatalogueList 的指定索引处
 /// </summary>
 /// <param name="index"></param>
 /// <param name="item"></param>
 public void Insert(int index, CatalogListBoxItem item)
 {
     if (item == null)
     {
         throw new ArgumentNullException("item");
     }
     Owner.OldItems.Insert(index, item);
 }
 /// <summary>
 /// 返回指定项在集合中的索引
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public int IndexOf(CatalogListBoxItem item)
 {
     return Owner.OldItems.IndexOf(item);
 }
 /// <summary>
 /// 将整个集合复制到现有的数组集合中,从该数组的指定位置开始复制
 /// </summary>
 /// <param name="destination"></param>
 /// <param name="arrayIndex"></param>
 public void CopyTo(CatalogListBoxItem[] destination, int arrayIndex)
 {
     Owner.OldItems.CopyTo(destination, arrayIndex);
 }
 /// <summary>
 /// 确定指定的项是否位于集合内
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public bool Contains(CatalogListBoxItem item)
 {
     return Owner.OldItems.Contains(item);
 }
 /// <summary>
 /// 向 CharmCatalogueList 的项列表添加项
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public int Add(CatalogListBoxItem item)
 {
     if (item == null)
     {
         throw new ArgumentException("item");
     }
     return Owner.OldItems.Add(item);
 }
        /// <summary>
        /// 引发 Paint 事件
        /// </summary>
        /// <param name="e">包含事件数据的 PaintEventArgs</param>
        protected override void OnPaint(PaintEventArgs e)
        {
            // 获取绘制对象
            Graphics g = e.Graphics;

            // 循环绘制每项
            for (int i = 0; i < Items.Count; i++)
            {
                // 获取表项工作区矩形
                Rectangle itemRect = GetItemRectangle(i);
                // 获取当前绘制的表项
                CatalogListBoxItem item = Items[i];
                // 绘制表项分割线
                g.DrawLine(Pens.LightGray, new Point(0, itemRect.Top), new Point(Width, itemRect.Top));
                // 绘制表项背景
                g.DrawImage(Resources.Catalog_normal, new Rectangle(new Point(0, itemRect.Y), new Size(189, 33)));
                // 第1项需要绘制特殊背景
                if (i == 0)
                {
                    g.DrawImage(Resources.Catalog_First, new Rectangle(new Point(0, itemRect.Y), new Size(189, 33)));
                }
                ;

                // 判断该表项是否为分类
                if (item.IsClass)
                {
                    // 绘制展开/收缩图标
                    if (item.IsExpand)
                    {
                        g.DrawImage(Resources.catalog_class_expand, new Rectangle(new Point(itemRect.Left + 8, itemRect.Y + 11), new Size(12, 12)));
                    }
                    else
                    {
                        g.DrawImage(Resources.catalog_class_collapse, new Rectangle(new Point(itemRect.Left + 8, itemRect.Y + 11), new Size(12, 12)));
                    };
                    // 绘制表项标题文本
                    g.DrawString(item.Text, new Font("微软雅黑", 10, FontStyle.Bold), Brushes.DarkBlue, itemRect.Left + 25, itemRect.Top + 7);
                }
                else
                {
                    // 判断是否为选中项
                    if (SelectedIndex == i)
                    {
                        // 绘制现行选中项
                        g.DrawImage(Resources.Catalog_pushed, new Rectangle(new Point(0, itemRect.Y), new Size(189, 33)));
                        if (item.StatusImages[2] != null)
                        {
                            g.DrawImage(item.StatusImages[2], new Rectangle(new Point(25, itemRect.Y + 7), item.StatusImages[0].Size));
                            g.DrawString(item.Text, new Font("微软雅黑", 9, FontStyle.Bold), Brushes.White, itemRect.Left + 55, itemRect.Top + 7);
                        }
                        else
                        {
                            g.DrawString(item.Text, new Font("微软雅黑", 9, FontStyle.Bold), Brushes.White, itemRect.Left + 50, itemRect.Top + 7);
                        }
                    }
                    else
                    {
                        // 非现行选中项
                        // 判断是否为高亮项,是则绘制高亮背景
                        if (mMouseItem == Items[i])
                        {
                            g.DrawImage(Resources.Catalog_hover, new Rectangle(new Point(0, itemRect.Y), new Size(189, 33)));
                            if (item.StatusImages[1] != null)
                            {
                                g.DrawImage(item.StatusImages[1], new Rectangle(new Point(25, itemRect.Y + 7), item.StatusImages[0].Size));
                                g.DrawString(item.Text, new Font("微软雅黑", 9), Brushes.Black, itemRect.Left + 55, itemRect.Top + 7);
                            }
                            else
                            {
                                g.DrawString(item.Text, new Font("微软雅黑", 9), Brushes.Black, itemRect.Left + 50, itemRect.Top + 7);
                            }
                        }
                        else if (item.StatusImages[0] != null)
                        {
                            g.DrawImage(item.StatusImages[0], new Rectangle(new Point(25, itemRect.Y + 7), item.StatusImages[0].Size));
                            g.DrawString(item.Text, new Font("微软雅黑", 9), Brushes.Black, itemRect.Left + 55, itemRect.Top + 7);
                        }
                        else
                        {
                            g.DrawString(item.Text, new Font("微软雅黑", 9), Brushes.Black, itemRect.Left + 50, itemRect.Top + 7);
                        }
                    }
                }
            }
            //base.OnPaint(e);
        }
 /// <summary>
 /// 从集合中移除指定的对象
 /// </summary>
 /// <param name="item"></param>
 public void Remove(CatalogListBoxItem item)
 {
     Owner.OldItems.Remove(item);
 }
 /// <summary>
 /// 返回指定项在集合中的索引
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public int IndexOf(CatalogListBoxItem item)
 {
     return(Owner.OldItems.IndexOf(item));
 }
 /// <summary>
 /// 确定指定的项是否位于集合内
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public bool Contains(CatalogListBoxItem item)
 {
     return(Owner.OldItems.Contains(item));
 }