FigBase.cs 4.59 KB
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace flowchart
{
    // flowchart 도형을 그리는 클래스의 공통(부모 클래스)
    class FigBase
    {
        private Point _location;  // 위치 변수
        private Size _size;       // 크기 변수
        private Point[] _linkPoints = new Point[] { Point.Empty, Point.Empty, Point.Empty, Point.Empty }; // Top, Left, Bottom, Right

        // 텍스트 박스와 관련된 변수
        private TextBox _textBox = null;
        private string _text;              // 텍스트박스 글자
        private Rectangle _textArea;       // 위치계산 용
        private bool _editMode = false;    // 더블클릭여부 판단

        protected FigBase(Point location, Size size)  // 생성자 (위치와 크기를 저장)
        {
            _location = location;
            _size = size;
            CalculateLinkPoint();  // 선을 연결하기 위해 도형 주위의 4개의 위치값을 재계산
            CalculateTextArea();   // 텍스트박스의 위치를 재계산
        }

        // 내부 변수를 외부에서 접근하는 함수
        public Point Location 
        { 
            get => _location; 
            set 
            { 
                _location = value; 
                CalculateLinkPoint(); 
                CalculateTextArea();
            }
        }
        public Size Size 
        { 
            get => _size;
            set
            {
                _size = value;
                CalculateLinkPoint();  
                CalculateTextArea();
            }
        }
        public Point[] LinkPoints { get => _linkPoints; set => _linkPoints = value; }

        // 자식 클래스에 필요한 공통 함수
        public virtual void Draw(Graphics g)
        {
            // 에디트 모드 경우만 글자를 삽입한다.
            if (!_editMode)
            {
                using (Font font = new Font("맑은 고딕", 16, FontStyle.Regular, GraphicsUnit.Pixel))
                {
                    PointF pointF1 = new PointF(_textArea.X, _textArea.Y);
                    g.DrawString(_text, font, Brushes.Black, pointF1);
                }
            }

        }

        // 현재 마우스의 위치가 해당 영역내에 있는지를 판단하는 함수
        public virtual bool PointInRegion(Point mousePoint)
        {
            Rectangle rect = new Rectangle(_location, _size);
            return rect.Contains(mousePoint);
        }

        // 도형의 주위의 4군데 위치를 저장
        private void CalculateLinkPoint()  
        {
            _linkPoints[0] = new Point(_location.X + (int)(((float)_size.Width) / 2), _location.Y);  // Top
            _linkPoints[1] = new Point(_location.X, _location.Y + (int)(((float)_size.Height) / 2)); // Left 
            _linkPoints[2] = new Point(_location.X + (int)(((float)_size.Width) / 2), _location.Y + _size.Height); // Bottom
            _linkPoints[3] = new Point(_location.X + _size.Width, _location.Y + (int)(((float)_size.Height) / 2)); // Right
        }
        // 텍스트 박스의 위치를 계산한다.
        private void CalculateTextArea()
        {
            _textArea = new Rectangle(_location, _size);
            _textArea.Inflate(-20, -20);
        }

        // 도형에서 마우스를 더블클릭하면 호출된다.
        public virtual void EnterEditMode()
        {
            if (!_editMode)
            {
                _editMode = true;
                if (_textBox == null)
                {
                    _textBox = new TextBox();
                    _textBox.Font = new Font("맑은 고딕", 16, FontStyle.Regular, GraphicsUnit.Pixel);
                    _textBox.Parent = CustomPanel._parentControl;  // 판넬을 부모로 지정
                    _textBox.KeyDown += TextBox_KeyDown;   // 키다운 이벤트를 호출한다.

                }
                else
                {
                    _textBox.Show();
                }

                _textBox.Location = _textArea.Location;
                _textBox.Size = _textArea.Size;

            }
        }
        // 에디트 모드를 종료한댜.
        private void TextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                TextBox textBox = (TextBox)sender;
                _text = textBox.Text;
                textBox.Hide();
                textBox.Clear();
                _editMode = false;
            }
        }
    }

}