/// <summary>
        /// Hàm load file
        /// </summary>
        /// <param name="name">Đường dẫn tới file</param>
        public void LoadProject(string name)
        {
            XmlSerializer ser = new XmlSerializer(typeof(List<PaintState>));
            FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);
            List<PaintState> temp = new List<PaintState>();

            temp = (List<PaintState>)ser.Deserialize(fs);
            fs.Close();

            foreach (var item in temp)
            {
                item.CurrentColor = Color.FromArgb(item.R1, item.G1, item.B1);
                item.BrushColor = Color.FromArgb(item.RB1, item.GB1, item.BB1);
                MyShape a;
                switch (item.ShapeType1)
                {
                    case ShapeType.MyLine:
                        a = new MyLine(item);
                        break;
                    case ShapeType.MyRectangle:
                        a = new MyRectangle(item);
                        break;
                    case ShapeType.MyEllipse:
                        a = new MyEllipse(item);
                        break;
                    case ShapeType.MyTriangle:
                        a = new MyTriangle(item);
                        break;
                    case ShapeType.MyText:
                        a = new MyText(item);
                        break;
                    case ShapeType.MyFill:
                        {
                            a = new MyFill(item);
                            a.State.ColorFill = Color.FromArgb(a.State.RF1, a.State.GF1, a.State.BF1);
                            PnlPaint.floodFill(a.State.PointFill, a.State.ColorFill);
                            break;
                        }
                    case ShapeType.MyEraser:
                        {
                            a = new MyEraser(item);
                            break;
                        }
                    default:
                        a = new MyLine(item);
                        break;
                }

                byte[] buf = item.ToByteArray();
                for (int i = 0; i < PnlPaint._clientSocket.Count; i++)
                {
                    PnlPaint._clientSocket[i].Send(buf);
                }
                //Gởi nhanh quá người nhận không kịp
                Thread.Sleep(100);

                PnlPaint.MyData.Add(a);
                PnlPaint._isRemoveBorder = true;
                PnlPaint._isStillCanMove = PnlPaint._isStillCanReSize = false;
                PnlPaint.Invalidate();
            }
        }
        /// <summary>
        /// Hàm nhận hình từ Server gởi đến 
        /// </summary>
        /// <param name="person"></param>
        private void AddListShape(PaintState person)
        {
            if (person.FirstPoint.X > 0 && person.FirstPoint.Y > 0)
            {
                person.CurrentColor = Color.FromArgb(person.R1, person.G1, person.B1);
                MyShape a;
                switch (person.ShapeType1)
                {
                    case ShapeType.MyLine:
                        a = new MyLine(person);
                        break;
                    case ShapeType.MyRectangle:
                        a = new MyRectangle(person);
                        break;
                    case ShapeType.MyEllipse:
                        a = new MyEllipse(person);
                        break;
                    case ShapeType.MyTriangle:
                        a = new MyTriangle(person);
                        break;
                    case ShapeType.MyText:
                        a = new MyText(person);
                        break;
                    case ShapeType.MyEraser:
                        a = new MyEraser(person);
                        break;
                    case ShapeType.MyFill:
                        {

                            if (_myData.Count() > 0 && !_isRemoveBorder)
                            {
                                _myData.RemoveAt(_myData.Count() - 1);
                            }
                            if (_myData.Count() > 0 && _isStillCanMove && _isStillCanReSize)
                            {
                                _myData.RemoveAt(_myData.Count() - 1);
                                _isStillCanReSize = _isStillCanMove = false;
                            }

                            a = new MyFill(person);
                            floodFill(a.State.PointFill, a.State.ColorFill);

                            break;
                        }
                    default:
                        a = new MyLine(person);
                        break;
                }
                if (person.ShapeType1 == ShapeType.MyFill)
                {
                    _myData.Add(a);
                    _isRemoveBorder = true;
                    _isStillCanMove = _isStillCanReSize = false;
                    
                }
                else
                {
                    if (_myData.Count() > 1 && _isStillCanMove == true && _isStillCanReSize == true)
                    {
                        _myData.Insert(_myData.Count() - 2, a);
                    }
                    else
                    {
                        _myData.Add(a);
                        _isRemoveBorder = true;
                        _isStillCanMove = _isStillCanReSize = false;
                     }
                }
                this.Invalidate();
            }

        }
        private void PaintPanel_MouseDown(object sender, MouseEventArgs e)
        {
            if (_myData.Count() == 0)
            {
                undo.Clear();
            }
  
            if (!_isFill)
            {
                f = new Point();
                myPaint.FirstPoint = myPaint.SecondPoint = e.Location;
                
                /////

                //
                if (myPaint.ShapeType1 != ShapeType.MyEraser)
                {
                    myPaint.TextLocation = e.Location;
                    //Xác định bao khung để xem thử có đang ở chế độ Resize không

                    Point Start = new Point();
                    Point End = new Point();
                    if (_myData.Count() > 0)
                    {
                        MyShape temp = _myData[_myData.Count() - 1];
                        temp.findBourder(ref Start, ref End);
                    }

                    // Bỏ hình viền bao quanh hình vừa mới vẽ
                    int n = _myData.Count();
                    if (n > 0 && _myData[n - 1].State.ShapeType1 != ShapeType.MyText && !_isRemoveBorder)
                    {
                        _myData.RemoveAt(n - 1);
                        n--;
                        _isRemoveBorder = true;
                      
                    }

                    //Giữ lại điểm đầu của hình cho chức năng resize đường thẳng
                    if (n > 0)
                    {
                        f = new Point(_myData[n - 1].State.SecondPoint.X, _myData[n - 1].State.SecondPoint.Y);
                    }


                    bool flag = false;
                    if (n > 0 && _myData[_myData.Count() - 1].State.ShapeType1 != ShapeType.MyEraser && _isStillCanReSize)
                    {
                        flag = findReSizePoint(e.Location, Start, End, _myData[_myData.Count() - 1].State.FirstPoint, _myData[_myData.Count() - 1].State.SecondPoint);
                    }
                    // Nếu không ở chế độ resize
                    if (!flag)
                    {

                        _isReSizePoint = new bool[8] { false, false, false, false, false, false, false, false };
                        _isReSize = false;

                        if (n > 0 && _myData[_myData.Count() - 1].State.ShapeType1 == ShapeType.MyText
                            && textBox.Text != "")
                        {
                            _myData[_myData.Count() - 1].State.Text = textBox.Text;
                            _myData[_myData.Count() - 1].State.TextLocation = textBox.Location;
                            _myData[_myData.Count() - 1].State.TextSize = (int) textBox.Font.Size;
                            _myData[_myData.Count() - 1].State.TextFont = textBox.Font.Name.ToString();
                            _myData[_myData.Count() - 1].State.CurrentColor = textBox.ForeColor;
                            this.Invalidate();
                        }

                        // Xóa đi các textbox
                        this.Controls.Clear();
                        textBox = new TextBox();

                        if (_isStillCanMove)
                        {
                            //Nếu không phải là đường thẳng thì xét điểm click nằm trong bao khung
                            if (n > 0 && _myData[n - 1].State.ShapeType1 == ShapeType.MyLine)
                            {
                                if (_myData[n - 1].calcDistanceLine(e.Location) < 5)
                                {
                                    _isCanMove = true;
                                    
                                }
                                else
                                {
                                    _isCanMove = false;
                                }

                            }
                            //Nếu là đường thẳng thì xét khoảng cách từ điểm click đến đường thẳng đó nhỏ hơn < Epxelon ( 5 )
                            else
                            {
                                if (n > 0 && _myData[n - 1].State.ShapeType1 != ShapeType.MyEraser && _myData[n - 1].checkPointInside(e.Location))// Nếu đang nằm trong vùng của hình mới vẽ thì kích hoạt trạng thái di chuyển
                                {
                                    _isCanMove = true;
                                }
                            }

                            if (_isCanMove)
                            {
                                int dentaX = myPaint.SecondPoint.X - myPaint.FirstPoint.X;
                                int dentaY = myPaint.SecondPoint.Y - myPaint.FirstPoint.Y;

                                PaintState temp1 = new PaintState(myPaint);
                                MyShape a;
                                switch (myPaint.ShapeType1)
                                {
                                    case ShapeType.MyLine:
                                        a = new MyLine(temp1);
                                        break;
                                    case ShapeType.MyRectangle:
                                        a = new MyRectangle(temp1);
                                        break;
                                    case ShapeType.MyEllipse:
                                        a = new MyEllipse(temp1);
                                        break;
                                    case ShapeType.MyTriangle:
                                        a = new MyTriangle(temp1);
                                        break;
                                    default:
                                        a = new MyLine(temp1);
                                        break;
                                }

                                a.State.FirstPoint = new Point(_myData[n - 1].State.FirstPoint.X + dentaX, _myData[n - 1].State.FirstPoint.Y + dentaY);
                                a.State.SecondPoint = new Point(_myData[n - 1].State.SecondPoint.X + dentaX, _myData[n - 1].State.SecondPoint.Y + dentaY);
                                a.State.Shift1 = _myData[n - 1].State.Shift1;
                                _shapeCurrent = _myData[n - 1];
                                _myData[n - 1] = a;

                                this.Invalidate();
                            }


                           
                        }
                        // Nếu chưa có hình nào hoặc nằm ngoài hình vừa mới vẽ hoặc trạng thái có thể di chuyển bị tắt hoặc (hình trước đó là đường thẳng và không được bật trạng thái di chuyển ) thì tắt trạng thái di chuyển và bắt đầu thêm hình mới vào danh sách các hình
                        if (n == 0 || (n > 0 && !_myData[n - 1].checkPointInside(e.Location)) || (n > 0 && _myData[n - 1].checkPointInside(e.Location) && _myData[n - 1].State.ShapeType1 == ShapeType.MyLine && !_isCanMove) || !_isStillCanMove)
                        {
                            _isCanMove = false;

                            if (n > 0)
                            {
                                MyShape temp2 = _myData[_myData.Count() - 1];
                                byte[] buffer = temp2.State.ToByteArray();
                                if (_isClient && client != null && client.Connected)
                                {
                                    try
                                    {

                                        client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    }
                                }

                                if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                                {

                                    foreach (var item in _clientSocket)
                                    {
                                        item.Send(buffer);
                                    }

                                }
                            }
                            //Hình đầu tiên của các client trước ( n - 1 ) bị gới lên server bị mất nên phải gởi lại hình đầu tiên
                            if (n == 1)
                            {
                                MyShape temp3 = _myData[_myData.Count() - 1];
                                byte[] buffer = temp3.State.ToByteArray();
                                if (_isClient && client != null && client.Connected)
                                {
                                    try
                                    {

                                        client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    }
                                }

                                if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                                {

                                    foreach (var item in _clientSocket)
                                    {
                                        item.Send(buffer);
                                    }

                                }
                            }
                            PaintState t = new PaintState(myPaint);

                            MyShape a;
                            switch (myPaint.ShapeType1)
                            {
                                case ShapeType.MyLine:
                                    a = new MyLine(t);
                                    break;
                                case ShapeType.MyRectangle:
                                    a = new MyRectangle(t);
                                    break;
                                case ShapeType.MyEllipse:
                                    a = new MyEllipse(t);
                                    break;
                                case ShapeType.MyTriangle:
                                    a = new MyTriangle(t);
                                    break;
                                case ShapeType.MyText:                        
                                    a = new MyText(t);
                                    break;                                
                                default:
                                    a = new MyLine(t);
                                    break;
                            }

                            _myData.Add(a);

                            // Nếu đang ở trạng thái text thì thêm 1 khung hình 
                            if (myPaint.ShapeType1 == ShapeType.MyText)
                            {
                                MyRectangle x = new MyRectangle (myPaint);
                                x.State.CurrentColor = myPaint.CurrentColor;
                                x.State.LineWidth = 1;
                                x.State.NameBrush = "NoFill";
                                x.State.IsBrushFill = false;
                                _myData.Add(x);
                            }

                        }
                    }
                }
                else// Đang ở trạng thái xóa
                {
                    // Nếu trước đó đang ở trạng thái text thì lấy nội dung của text và xóa textbox đi
                    if (_myData.Count() > 0 && _myData[_myData.Count() - 1].State.ShapeType1 == ShapeType.MyText)
                    {
                        _myData[_myData.Count() - 1].State.Text = textBox.Text;
                        this.Invalidate();
                    }
                    // Xóa đi các textbox
                    this.Controls.Clear();
                    textBox = new TextBox();
                    //
                    // Nếu trước đó là một hình nào đó mà không phải là text hay border thì chắc chắn có bao khung --> xóa bao khung đi
                    if (_myData.Count() > 0 && _myData[_myData.Count() - 1].State.ShapeType1 != ShapeType.MyText && _myData[_myData.Count() - 1].State.ShapeType1 != ShapeType.MyEraser)
                    {
                        _myData.RemoveAt(_myData.Count() - 1);
                    }
                    // Gởi hình vừa vẽ trước đó
                    if (_myData.Count() > 0)
                    {
                        MyShape temp = _myData[_myData.Count() - 1];
                        byte[] buffer = temp.State.ToByteArray();
                        if (_isClient && client != null && client.Connected)
                        {
                            try
                            {

                                client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }

                        if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                        {

                            foreach (var item in _clientSocket)
                            {
                                item.Send(buffer);
                            }

                        }
                    }
                    PaintState statetemp = new PaintState(myPaint);
                    MyShape a = new MyEraser(statetemp);
                    a.State.EraserPoint.Add(myPaint.FirstPoint);
                    _myData.Add(a);
                    this.Invalidate();
                }
              //
            }
            else //Trang thai tô
            {
                myPaint.FirstPoint = myPaint.SecondPoint = e.Location;

                // Nếu như đang network thì gởi hình vẽ trước đó đi
                if (_myData.Count() > 0)
                {
                    MyShape shapetemp = _myData[_myData.Count() - 1];
                    byte[] buffertemp = shapetemp.State.ToByteArray();
                    if (_isClient && client != null && client.Connected)
                    {
                        try
                        {
                            client.BeginSend(buffertemp, 0, buffertemp.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }

                    if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                    {

                        foreach (var item in _clientSocket)
                        {
                            item.Send(buffertemp);
                        }

                    }

                }           

                floodFill(e.Location,_fillColor);

                //Lưu dưới dạng đối tượng
                myPaint.PointFill = e.Location;
                myPaint.RF1 = _fillColor.R;
                myPaint.GF1 = _fillColor.G;
                myPaint.BF1 = _fillColor.B;
                PaintState t3 = new PaintState(myPaint);
                MyShape t1 = new MyFill(t3);
            
                _myData.Add(t1);
                ///

                //Gởi trạng thái tô

                byte[] buffer1 = t3.ToByteArray();
                if (_isClient && client != null && client.Connected)
                {
                    try
                    {
                        client.BeginSend(buffer1, 0, buffer1.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                {

                    foreach (var item in _clientSocket)
                    {
                        item.Send(buffer1);
                    }

                }

            }

        }
        /// <summary>
        /// Hàm thêm hình của thành viên vào danh sách các hình của Server
        /// </summary>
        /// <param name="person"></param>
        /// <param name="index"></param>
        private void AddListShape(PaintState person, int index)
        {
            if (person.FirstPoint.X > 0 && person.FirstPoint.Y > 0)
            {
                person.CurrentColor = Color.FromArgb(person.R1, person.G1, person.B1);
                MyShape a;
                switch (person.ShapeType1)
                {
                    case ShapeType.MyLine:
                        a = new MyLine(person);
                        break;
                    case ShapeType.MyRectangle:
                        a = new MyRectangle(person);
                        break;
                    case ShapeType.MyEllipse:
                        a = new MyEllipse(person);
                        break;
                    case ShapeType.MyTriangle:
                        a = new MyTriangle(person);
                        break;
                    case ShapeType.MyText:
                        a = new MyText(person);
                        break;
                    case ShapeType.MyEraser:
                        a = new MyEraser(person);
                        break;
                    case ShapeType.MyFill:
                        {

                            if (_myData.Count() > 0 && !_isRemoveBorder)
                            {
                                _myData.RemoveAt(_myData.Count() - 1);
                            }
                            if (_myData.Count() > 0 && _isStillCanMove && _isStillCanReSize)
                            {
                                _myData.RemoveAt(_myData.Count() - 1);
                                _isStillCanReSize = _isStillCanMove = false;
                            }

                            a = new MyFill(person);
                            floodFill(a.State.PointFill, a.State.ColorFill);

                            break;
                        }
                    default:
                        a = new MyLine(person);
                        break;
                }
                if (person.ShapeType1 == ShapeType.MyFill)
                {
                    _myData.Add(a);
                    _isRemoveBorder = true;
                    _isStillCanMove = _isStillCanReSize = false;

                }
                else
                {
                    if (_myData.Count() > 1 && _isStillCanMove == true && _isStillCanReSize == true)
                    {
                        _myData.Insert(_myData.Count() - 2, a);
                    }
                    else
                    {
                        _myData.Add(a);
                        _isRemoveBorder = true;
                        _isStillCanMove = _isStillCanReSize = false;
                    }
                }

                for (int i = 0; i < _clientSocket.Count; i++)
                {
                    if (i == index)
                    {
                        continue;
                    }
                    _clientSocket[i].Send(_buffer);
                }
                
                //Gởi hình nhận đến tất cả mọi người.
                this.Invalidate();
            }
           
        }