private void PainNewItem(FlowChatMessageItemModel messageItem)
        {
            Graphics g = this.CreateGraphics();

            CalculateViewY();

            RenderSingleItem(g, ref messageItem);
        }
        public void RemoveMessageItem(FlowChatMessageItemModel messageItem)
        {
            if (messageItem != null)
            {
                int index = Items.IndexOf(messageItem);

                for (int i = index; i < Items.Count; i++)
                {
                    ClearItemArea(Items[i]);

                    y -= 66;

                    PainNewItem(Items[i]);
                }
            }
        }
        private void RenderSingleItem(Graphics g, ref FlowChatMessageItemModel item)
        {
            Rectangle itemRect = new Rectangle(0, y, Width, 70);
            Color     color    = Color.Black;

            if (item.IsClick)
            {
                color = Color.FromArgb(200, 199, 197);
            }
            else if (item.IsFocus)
            {
                color = Color.FromArgb(215, 216, 218);
            }
            else
            {
                color = Color.FromArgb(233, 232, 230);
            }
            g.FillRectangle(new SolidBrush(color), itemRect);
            Rectangle avatarRect = new Rectangle(15, view_y + 15, 40, 40);

            if (File.Exists(item.ImageUrl))
            {
                g.DrawImage(new Bitmap(item.ImageUrl), avatarRect);
            }
            else
            {
                g.DrawImage(new Bitmap("./Images/avatar-default.png"), avatarRect);
            }

            Rectangle textRect = new Rectangle(66, view_y + 20, 140, 14);

            g.DrawString(item.MessagerName, new Font(FontFamily.GenericMonospace, 10, FontStyle.Regular), Brushes.Black, textRect);

            Rectangle chatTextRect = new Rectangle(66, view_y + 40, 140, 14);

            g.DrawString(item.LastMessageText, new Font(FontFamily.GenericMonospace, 9, FontStyle.Regular), new SolidBrush(Color.FromArgb(177, 178, 180)), chatTextRect);

            Rectangle timeTextRect = new Rectangle(Width - 47 - 15, view_y + 17, 47, 14);

            g.DrawString(item.LastMessageTime, new Font(FontFamily.GenericMonospace, 10, FontStyle.Regular), new SolidBrush(Color.FromArgb(177, 178, 180)), timeTextRect);

            y += 66;

            item.Rect = itemRect;
        }
        protected override void OnMouseClick(MouseEventArgs e)
        {
            for (int i = 0; i < Items.Count; i++)
            {
                if (e.X > Items[i].Rect.X && e.X <Items[i].Rect.X + Items[i].Rect.Width &&
                                                  e.Y> Items[i].Rect.Y && e.Y < Items[i].Rect.Y + Items[i].Rect.Height)
                {
                    if (lastClickItem != null)
                    {
                        lastClickItem.IsClick = false;
                    }
                    Items[i].IsClick = true;
                    lastClickItem    = Items[i];
                    Invalidate();

                    SelectedMessageItemChanged?.Invoke(this, lastMouseMoveItem);

                    break;
                }
            }
        }
 protected override void OnMouseMove(MouseEventArgs e)
 {
     for (int i = 0; i < Items.Count; i++)
     {
         if (e.X > Items[i].Rect.X && e.X <Items[i].Rect.X + Items[i].Rect.Width &&
                                           e.Y> Items[i].Rect.Y && e.Y < Items[i].Rect.Y + Items[i].Rect.Height)
         {
             if (lastMouseMoveItem != null)
             {
                 lastMouseMoveItem.IsFocus = false;
             }
             Items[i].IsFocus  = true;
             lastMouseMoveItem = Items[i];
             Invalidate();
             break;
         }
         else
         {
             Items[i].IsFocus = false;
             Invalidate();
         }
     }
 }
        private void ClearItemArea(FlowChatMessageItemModel messageItem)
        {
            Graphics g = CreateGraphics();

            g.FillRectangle(Brushes.Transparent, messageItem.Rect);
        }
 public void AddMessageItem(FlowChatMessageItemModel messageItem)
 {
     Items.Add(messageItem);
     PainNewItem(messageItem);
 }