
#include  "font.h"

#include  "GBalloonBox.h"
#include  "GCaret.h"

//[2010.02.13.토][추가!!!]
//[빠른목록] 을 <GList> 를 사용하여 구현한다.
#include  "GList.h"

//[폼디자인:모드]
//[2018.06.24.일][추가!!!]
#include "GVmos.h"
#include "GCover.h"


#ifndef GEditH
#define GEditH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------


struct GEdit_CARETINFO
{
  //[2007.02.14.수][생성!!!]{------------------------------------------
  //[입력지정자] 관련 정보를 가진다.
  //[선택영역] 처리시 [입력지정자] 의 정보를 관리하기 위하여 사용한다.

  //필요한 경우 계속 정보를 추가할수 있다.
  //}------------------------------------------------------------------

  int  caret_index;  //_caretindex 값 저장.
  int  caret_x;      //_caret_x    값 저장.
  int  caret_y;      //_caret_y    값 저장.

};

struct GEdit_WORDCONFIG
{
  //[2007.01.23.화][생성!!!]{-------------------
  //출력시 문자한개에 적용되는 값들을 관리한다.
  //}-------------------------------------------

  int   index;
  int   length;
  int   front_color;
  int   back_color;
  bool  transparent;

  //[2007.02.05.월][추가!!!]
  int   style;

};


class TGEdit_Form : public TForm
{
__published:	// IDE-managed Components
        void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
        void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y);
        void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
    void __fastcall FormResize(TObject *Sender);
          
private:	// User declarations
public:		// User declarations

        __fastcall TGEdit_Form(TComponent* Owner);

        //[2012.04.30.월][완료!!!]
        __fastcall ~TGEdit_Form(void);

        //[그림부품 독립구동]
        //{
            //[2018.10.13.토][추가!!!]
            void __fastcall CreateParams(TCreateParams &Params);

        //}

        //[서브클래싱]
        //{
            void __fastcall WndProc(Messages::TMessage &Message);

        //}

        //[생성자]
        //{
            //[2012.05.01.화][중요추가!!!]{-------------------------------------------
            //<GVmos> 가 <[]맷돌가상구동> 해제로 즉시 종료되는 경우
            //일부 [그림부품] 이 동작중인 경우 [동적삭제] 된 후에도
            //함수가 실행될수 있다.
            //이를 막기 위하여 이 개체의 [존재 유/무] 를 확인할 변수를 하나 둔다.
            //
            //모든 함수는 반드시 <_this_:true> 인 경우만 처리되어야 한다.
            //
            //[생성자] 에서 반드시 <true> 로 설정하고, [소멸자] 에서 <false> 로 처리.
            //true  : 생성된 상태.
            //false : 삭제된 상태.
            //}-----------------------------------------------------------------------

            bool  _this_;

        //}

        //[사용구분]
        //{
            //[2012.05.05.토][설명!!!]{----------------------------------------------------
            //[편집기] 는 [GVmos] 상의 [공용그림부품] 이 아니므로 <_GUse> 값으로
            //BCB 용으로 사용되는지 [맷돌C:그림부품] 으로 사용되는지 쉽게 구분가능하다.
            //이 구분은 일반 [그림부품] 에는 필요없고, 내부적으로 <MsgBox> 를 사용하는
            //그림부품에서만 필요하다.
            //
            //1) <_GUse==NULL> : BCB 용.
            //
            //2) <_GUse!=NULL> : [맷돌C:그림부품] 용.
            //
            //이 구분은 <MsgBox> 때문인데 [모달/유사모달] 로 처리할지를 결정하기 위한것.
            //
            //1) 의 경우는 [모달] 로 일반 적으로 보여준다.
            //2) 의 경우는 [맷돌C:그림부품] 용으로 [유사모달] 처리된다.
            //   단, 이 경우는 [맷돌C:API] 에서 VMOS 로 구동 처리된다.
            //
            //<API:_GMsgBox_기본_()> 원본 [설계묶음] 안의 설명을 참고한다.
            //
            //[중요!!!]--------------------------------------------------------------------
            //
            //[맷돌C] 용으로 사용하는 경우는 반드시 <GXXX_Create()> 함수를 사용하므로
            //이 함수안에서만 <true> 로 설정되고, 나머지는 <false> 로 설정해야 한다.
            //단, [공용그림부품] 의 경우는 <GXXX_Create()> 를 사용하지 않고 <gui_part.cpp>
            //안에 선언돼 있는 <GPART_GMsgBox_Create()> 등으로 선언되므로 반드시 이 안에서
            //<true> 로 선언해 주어야 한다.
            //}----------------------------------------------------------------------------

            //처음에는 반드시 BCB 용으로 설정.
            bool  _GUse; //(기본값:false)

        //}

        //[VAR]
        //{
            //[실제 그리는 영역]{-----------
            Graphics::TBitmap  *_bmp_;

            //편집기 배경 그림.
            Graphics::TBitmap  *_bmp_back_;
            //}-----------------------------

        //}

        //[글꼴]
        //{
            //[사용글꼴]{--------------
            struct FONTPACK     _font;
            //}------------------------

            //사용 폰트를 적용한 한 행의 높이.
            int                 _line_height;
            //사용 폰트를 적용한 문자 한개의 넓이.
            int                 _word_width;

            //[편집용버퍼]
            //{
                //기본 크기로 10M 용량으로 설정한다.
                //옵션으로 조정 할수 있어야 하므로 동적생성할수 있도록 한다.
                char               *_editbuf;
                //실제 [편집] 을 위한 [저장소] 는 한개만 있으므로 아예 충분한 크기를 갖도록
                //하여 이 안에서 수정시에도 [저장소] 의 크기를 변경할 필요가 없게 만든다.
                //10M 정도면 충분할 것이다.

            //}

            //[내부 임시 처리 저장소]
            //{
                //[2007.04.09.월][추가!!!]
                //_editbuf[] 상에 [문자/문자열] 을 끼워 넣기 위한 [공간만들기] 를 할때
                //for() 문을 사용하는 것은 문서량이 많은 경우는 처리 속도가 느리다.
                //memmove() 함수를 사용할수 있으면 고속 처리가 가능한데, 한개의 저장소로는 불가능하므로
                //_editbuf[] 와 같은 크기의 [저장소] 를 만들어서 memmove() 함수를 사용하여 밀어낼 문자열부분을
                //이곳에 복사하고 -> 문자열을 끼워 넣은후 -> 다시 북사해서 이어주는 방법을 사용한다.
                //전부 memmove() 함수를 사용하게 되므로 고속으로 처리할수 있다.
                char               *_tempbuf;

            //}

            //[2007.09.28.금][추가!!!]
            //{
                //실제 줄이동막대가 없으므로 가상적으로 위치를 지정하여 운영한다.
                int _scroll_h_position;

            //}

        //}

        //----------------------------------------------------------------------
        //[생성자]--------------------------------------------------------------
        //----------------------------------------------------------------------

        //[생성자 정보]
        //{
            //[2010.02.25.목][추가!!!]{-----------------------------------------
            //실제 개체는 VMOS 상에서 <void *> 정보 한개(8 Byte)로 이 개체의
            //PC 상의 물리적 위치만 관리하므로 실제 다른 정보를 개체 자체적으로
            //직접 [속성] 으로 관리한다.
            //즉, VMOS 상에서도 개체는 하나의 포인터로만 관리된다.
            //}-----------------------------------------------------------------

            //[식별자]
            //{
                //[2010.02.25.목][추가!!!]{----------------------------------------------------
                //사용자가 지정한 [식별자] 로 모든 그림 부품은 모두 다른 값이 지정돼야 한다.
                //이 [식별자] 는 [알림문] 안에 들어 있어, 알림문이 어떤 [그림부품] 의 것인지
                //VMOS 쪽에서 이 [식별자] 확인 만으로 간단하게 구분할수 있게 하기 위한 것이다.
                //
                //[2012.07.09.월][중요수정!!!]*************************************************
                //
                //[생성자(12)] = { [절대주소(8)] + [부품고유ID(2)] + [GID(2)] }
                //
                //로 <GID> 가 추가 되었으므로 사용하지 않고 주석처리.
                //이는 [맷돌C:이벤트] 처리시 생성자] 만으로 쉽게 <GID> 를 구분처리하기 위한것.
                //unsigned short  _GID;
                //}----------------------------------------------------------------------------

            //}

            //[생성자]
            //{
                //[2010.03.09.화][추가!!!]{---------------------------------------------------
                //[생성자] 의 실제 물리위치를 관리한다.
                //이는 직접 해당 API 로 삭제되는 경우는 해당 함수에서 자동으로 [생성자가]
                //초기화 되지만, 다른 [그림부품] 에 생성된 경우, 이 [그림부품] 이 삭제될때
                //자동으로 같이 [삭제] 는 되지만, 해당 [생성자] 는 초기화 되지 않기 때문이다.
                //이를 위하여 [생성자] 를 관리하고, [파괴자] 부분에서 직접 해당 초기화 함수를
                //호출하여 반드시 [생성자] 정보를 초기화 해 주어야 한다.
                //}---------------------------------------------------------------------------

                void  *_GPart;

            //}

        //}

        //----------------------------------------------------------------------
        //[속성]----------------------------------------------------------------
        //----------------------------------------------------------------------

        //[유/무효]
        //{
            //[2018.08.25.토][추가!!!]
            void __fastcall _Enable(bool  pEnable);

        //}

        //[글꼴]
        //{
            //[VAR]
            //{
                int  _fontColor;
                int  _fontStyle;

            //}

            //[2018.08.25.토][완료!!!]
            void __fastcall _FontColor(int  pFontColor);

            //[2010.02.06.토][완료!!!]
            void __fastcall _FontStyle(int  pFontStyle);

        //}

        //[테두리색]
        //{
            //[VAR]
            //{
                //[2010.02.03.수][추가!!!]
                int  _borderColor;

            //}

            void __fastcall _BorderColor(int  pBorderColor);

        //}

        //[바탕색]
        //{
            //[VAR]
            //{
                //[2010.02.06.토][추가!!!!]
                int  _backColor;

            //}

            //[2018.08.25.토][완료!!!]
            void __fastcall _BackColor(int  pBackColor);

        //}

        //[풍선도움말]
        //{
            //[VAR]
            //{
                //[2010.02.06.토][추가!!!]{-----------------------------------------
                //[풍선도움말] 에 출력할 문자열을 가진다.
                //단, 메모리 낭비를 막기 위하여 해당 사용이 설정된 경우만 처리한다.
                //}-----------------------------------------------------------------

                bool   _balloonHelpUse; //(기본 : false)

                //동적 생성시 크기를 주어 설정한다.
                char  *_balloonHelpStr;

                //[2010.01.28.목][추가!!!]{------------------------------------------------------
                //[풍선도움말] 사용시 각각의 [그림부품] 에서 [포인터] 로 관리되는 것을 사용한다.
                //[풍선도움말] 은 무조건 1개는 VMOS 차원에서 생성하므로 이것을 받아서 사용한다.
                //즉, [풍선도움말] 은 공유자원으로 분류한다.
                //
                //[2012.05.01.화][생성!!!]{------------------------------------------------------
                //자세한 내용은 <GPART_GFindDialog_GetPtr2()> 함수안 설명 참고.
                //
                //<*> => <**> 로 수정.
                //[개체] 위치가 아니라 이를 관리하는 <전역변수> 의 위치를 관리.
                //[개체] 가 이미 [삭제] 된상태라도 이 [유/무] 를 확인할수 있다
                //
                //[2012.05.05.토][설명!!!]-------------------------------------------------------
                //[BCB용] 으로 사용하는 경우는 이미 등록돼 있는 [공용부품] 을
                //무시하고 별도로 생성한 [그리부품] 을 등록하면 된다.
                TGBalloonBox_Form  **_GBalloonBox;
                //}------------------------------------------------------------------------------

            //}

            //[2008.02.03.일][완료!!!]
            void __fastcall _BalloonHelpUse(bool  pUse);

            //[2008.02.03.일][완료!!!]
            void __fastcall _BalloonHelpStr(char  *pStr);

        //}

        //[참조대상]
        //{
            //[2010.02.13.토][추가!!!]{------------------------------------------
            //<*.h> 중복으로 인한 오류가 아예 발생하지 않도록 <void *) 로 만들고
            //해당 [부품형] 으로 변환 사용하는 방법을 사용한다.
            //}------------------------------------------------------------------

            //포인터 차원과는 무관하며 1차원으로 선언하면 된다.
            void  *_vpGVmos;

        //}

        //[내부 사용 개체]
        //{
            //[간편기능목록]
            //{
                //[2010.02.13.토][추가!!!]
                //[빠른목록] 을 <GList> 를 사용하여 구현한다.
                TGList_Form  *_popupMenu;

                //[동작함수]
                //{
                    //[2010.02.13.토][완료!!!]
                    void __fastcall _EVENT_ItemSelect_popupMenu(void);

                //}

            //}

        //}

        //[크기조정]
        //{
            //[2006.11.06.월][완료!!!]
            void __fastcall _Width(int  pWidth);

            //[2010.02.06.토][완료!!!]
            void __fastcall _Height(int  pHeight);

            //[2010.02.06.토][완료!!!]
            void __fastcall _Left(int  pLeft);

            //[2010.02.06.토][완료!!!]
            void __fastcall _Top(int  pTop);

            //[2018.06.24.일][완료!!!][폼디자인:모드]
            void __fastcall _Width_Height(int  pWidth, int  pHeight);


        //}

        //[Enter 키 동작 함수]
        //{
            //[2009.04.10.금][추가!!!]{----------
            //[Enter Key] 가 눌린 경우 발생한다.
            //}----------------------------------

            void __fastcall (__closure * _EVENT_KeyEnter)(void);

            //[2022.06.13.월][추가]
            //{
                //<키:ESC> 가 눌린 경우 동작.
                void __fastcall (__closure * _EVENT_KeyDown_Esc)(void);

                //[내용] 의 변경이 있는 경우 발생(문자입/삭제/잘라내기/붙이기 등 전부 포함).
                void __fastcall (__closure * _EVENT_Change)(void);

                void __fastcall (__closure * _EVENT_KeyDown_Left)(void);

                void __fastcall (__closure * _EVENT_KeyDown_Right)(void);

                void __fastcall (__closure * _EVENT_KeyDown_Up)(void);

                void __fastcall (__closure * _EVENT_KeyDown_Down)(void);

                void __fastcall (__closure * _EVENT_KeyDown_Home)(void);

                void __fastcall (__closure * _EVENT_KeyDown_End)(void);

            //}

        //}

        //[이벤트 사용 유/무]
        //{
            //[2018.06.23.토][추가!!!]{----------------------
            //[이벤트] 사용설정을 위한 것.
            //기본적으로 모두 사용하지 않는 상태이다.
            //이는 오직 [맷돌-C] 안에서 사용될때만 적용된다.
            //}----------------------------------------------

            bool  _evtKDown;
            bool  _evtKUp;

            //[Enter:Key] Down 시에 발생.
            bool  _evtKEnter;

            //[2018.07.03.화][추가!!!]
            bool  _evtKEsc;

        //}

        //[FUNCTION]
        //{
            //[2018.08.26.일][추가!!!]
            void __fastcall _Shape(void);

            void __fastcall _Draw(void);

            //[2007.03.26.월][완료!!!]
            void __fastcall _EditBuf_Text(void);

            //[2006.12.17.일][완료!!!]
            void __fastcall _EditBuf_Clear(void);

            void __fastcall _EDIT_Get_TextOrigin(void);
            void __fastcall _EDIT_H_Scroll(void);

        //}

        //[편집관련]
        //{
            //[VAR]
            //{
                //[기준값]
                //{
                    //[한글/영문] 의 각각의 대표 문자의 [폭] 값을 가진다.
                    //현재 [편집기] 에는 고정폭 글꼴만 사용되므로 [한글/영문] 각각 한개의
                    //[문자폭] 은 다른 처리를 위하여 가지고 있어야 한다.
                    //이 값은 [글꼴] 을 생성할때 한번만 구해놓으면 된다.
                    int  _font_kor_width;
                    int  _font_eng_width;
                //}

                //[가상원점]
                //{
                    //실제 문서가 출력되는 문서 영역의 원점이 된다.
                    //[입력지정자] 위치, [행/열] 표시 등도 전부 이 원점 좌표를 기준으로 한다.
                    int  _text_org_x;
                    int  _text_org_y;

                    //[추가 보정값]
                    //{
                        //[2022.06.13.월][추가]{-----------------------------------
                        //<_text_org_y> 을 초기화 할때 사용되는 추가 보정값.
                        //BCB 내부적으로만 사용되고 사용자는 사용할수 없다.
                        //[Tree:API] 에 [API 찾기] 기능을 추가하면서 출력 문자열의
                        //출력 높이를 조정할 필요가 있어서 추가한다.
                        //}--------------------------------------------------------
                        
                        int  _text_org_y_ofs; //(기본값:0)

                    //}

                //}

                //[관리]
                //{
                    //[문서] 의 총 행수를 기록한다.
                    //산출하는데 시간이 많이 거리므로 항상 추척 관리 해 놓아야 한다.
                    //행이 바뀌는 [문서수정] 의 경우(Enter/Del/Back 키 와 잘라내기, 붙이기) 는
                    //즉시 행수를 계속 추척하여 정확한 값을 기록해 놓아야 한다.
                    //또한, 문서를 여는 경우는 기본적으로 값을 기록해 놓는다.
                    //단, [행 수] 는 1 부터 의미가 있다. ([행 번호] 는 0 부터 의미가 있으므로 혼동하지 않아야 한다.)
                    //완전 공백이라도 [입력지정자] 가 위치해야 하므로 최소한 한개의 행은 있어야한다.
                    int  _linecount; //(BASE : 1)

                    //현재 행의 _editbuf[] 상의 시작 index(행의 첫 문자 위치) 를 관리한다.
                    //어떤 상황에서도 가장 먼저 수정되 있어야 하고 항상 정확한 값을 가지고 있어야 한다.
                    int  _linestartindex; //(BASE : 0)

                    //_linestartindex 와는 달리 항상 추적할 필요는 없고 필요할때 사용된다.
                    //현재 행의 마지막 문자 위치 + 1 의 위치를 갖는다.
                    //일반적인 경우는 행의 끝의 CRLF 의 CR(0x0d) 의 위치가 되지만 마지막 행이
                    //CRLF 로 끝나지 않은 경우도 있으므로 일반적으로 마지막 문자 위치 + 1 의 위치로
                    //정의 하면 무난하다.
                    int  _lineendindex; //(BASE : 0)

                    //현재 _editbuf[] 에 있는 문서의 byte 단위 크기.(문자열의 경우 '\0' 까지 포함한 크기다.)
                    //FILE_Open_inBUF() 함수로 파일을 여는 경우는 문자열의 경우 '\0' 까지 크기에 포함된다.
                    int  _filesize;

                    //[보이는 가장 윗행]
                    //{
                        //일반적으로 [스크롤] 되는 경우 윗행이 바뀌게 되므로 이때 수정한다.

                        //[편집기] 창에서 보이는 가장 윗행의 [행 번호] 를 관리한다.
                        //[행 번호] 는 0 부터 유효하다.
                        int  _linetop_linenumber; //(BASE : 0)

                        //[편집기] 창에서 보이는 가장 윗행의 시작 index 를 관리한다.
                        int  _linetop_startindex; //(BASE : 0)
                    //}

                    //[중요!!!]
                    //{
                        //------------------------------------------------------------------------
                        //_editbuf[] 상의 현재 [입력지정자] 가 위치한 문자의 index 를 갖는다.
                        //가장 기본이 되는 값이며, 다른 모든 연산의 기준이 되므로 언제나 추적하여
                        //정확한 값을 가지고 있어야 한다.
                        int  _caretindex; //(BASE : 0)

                        //_caretindex 위치의 실제 표시상의 행 처음부터의 [폭] 을 가진다.
                        int  _caretindexwidth; //(BASE : 0)
                        //------------------------------------------------------------------------
                    //}

                    //[행/열]
                    //{
                        //-----------------------------------------------------------------------------
                        //[입력지정자] 의 상/하 이동시에는 이 [열] 정보를 사용해서 위치를 찾아야 한다.
                        //이 정보는 editor_info_Form 의 해당 위치에 즉시 표시 될수 있어야 한다.
                        int  _row;
                        int  _col;
                        //-----------------------------------------------------------------------------
                    //}
                    
                //}

                //[입력지정자]
                //{
                    //-------------------------------------------------------
                    //개체를 갖는다.
                    TGCaret_Form  *_caret;

                    //표시 위치.
                    //(_text_x, _text_y) 위치를 기준으로 한다.
                    //이 값은 offset 좌표 이므로 절대로 "음수" 가 될수 없다.
                    int  _caret_x; //(BASE : 0)
                    int  _caret_y; //(BASE : 0)
                    //-------------------------------------------------------
                //}

                //문자한개를 저장한다.(한글/영문 일수 있으므로 2byte 값을 가지게 한다.)
                short  _moonja;
                bool   _ime_TkorFeng; //(BASE : false)

                //[2008.02.13.수][추가!!!]{-------------------------------------------------------------
                //한글 조함중 영문등이 입력되면 한글 조합이 완성되는데 이때 입력한 기호등도
                //출력해 주어야 하는데 이때 한글 조합을 깬 문자를 가진다.
                //예) 한글 조함중 '2' 를 입력하여 조합이 깨졌다면 '2' 문자가 들어 있어야 한다.
                //이를 위하여 WM_IME_COMPOSITION 처리부에서 ImmGetCompositionString() 함수를
                //사용하여 "한2" 으로 문자열을 읽어서 처리할수 있다.
                //중요힌것은 '2' 문자를 얻는 것이 중요한다. '한' 은 WParam 으로 쉽게 얻을수 있으므로...

                HIMC   _imeHimc;         //IME 핸들.
                char   _imeBuffer[1024]; //ime 버퍼에 저장된 문자열을 읽을때 사용한다.
                int    _imeBufcount;
                //}-------------------------------------------------------------------------------------

                //_EditBuf_Text() 함수내부를 처리할지를 결정한다.
                //이는 [스크롤] 시에 중복되어 깜박이는 것을 방지하기 위한 것이다.
                bool  _editbuf_text_on;  //(BASE : true)
                bool  _edit_caretpos_on; //(BASE : true)
                //[2007.03.08.목][추가!!!]
                bool  _edit_paste_ing;   //(BASE : true)
                //[2007.03.09.금][추가!!!]
                bool  _editbuf_text_no;  //(BASE : false)

                //[블록지정][2007.01.22.월]
                //{
                    //--------------------------------------------------------------------------
                    //[문서] 가 블록으로 지정되는 경우 관련 정보를 저장한다.
                    //이 정보는 [문서] 마다 전부 독립적인 것이므로 [문서] 마다 별도로 관리한다.
                    //각각 -1 로 초기화 하는데 이것은 현재 [선택영역] 이 없다는 것을 말한다.
                    //둘중 하나라도 -1 인 경우는 [선택영역이 없는 것으로 본다.]

                    //[선택영역] 을 시작하는 문자의 시작위치(시작 [입력지정자] 위치).
                    struct GEdit_CARETINFO  _select_start;

                    //[선택영역] 이 끝나는 문자 다음 문자의 위치(끝 [입력지정자] 위치).
                    //끝문자의 시작 위치가 아니다.
                    //이는 [선택영역] 문자열의 길이를 쉽게 계산하기 위한 것이다.
                    //한글의 경우 2 byte 문자이므로 첫 문자인 경우 계산이 복잡해지기 때문이다.
                    //즉, 이 위치의 문자부터는 일반출력을 적용해 주어야  한다.
                    struct GEdit_CARETINFO  _select_end;

                    //[주의!!!][2007.02.14.수][추가!!!]
                    //이 값은 [선택영역] 을 설정해 가는 방향에 따라서 꼭 "start < end" 의
                    //관계가 성립되지는 않으므로 반드시 _SELECT_Get_StartEndIndex() 함수로
                    //크기 순서대로 정리한 값을 사용해야 한다.
                    //--------------------------------------------------------------------------

                    //[부가정보]
                    //{
                        //[선택영역] 을 형성하는 과정에서 사용된다.(만들때는 위의 두개 정보만 있으면 된다.)
                        //[마우스] 로 집어끌기를 하여 [선택영역] 을 형성할때, [shift + 키] 를 사용하여
                        //[선택영역] 을 형성해 갈때 현재 이미 선택영역이 형성상태임을 알려준다.
                        //true  : 현재 [선택영역] 형성이 시작된 상태다.
                        //false : [선택영역] 이 해제된 상태.
                        bool  _select_ing;
                    //}
                //}

                //[2007.02.09.금][추가!!!]
                //[마우스] 가 [눌린상태(true)] 라는 것을 알린다.
                bool  _mouse_down; //(BASE : false)

                //[2007.02.10.토][추가!!!]
                //<shift-key> 가 눌린 상태인 경우는 true.
                bool  _shift_down; //(BASE : false)

                //[2007.02.11.일][추가!!!]
                //현재 [줄이동] 중인 경우는 true.
                bool  _scroll_ing; //(BASE : false)
            //}

            //[함수]
            //{
                //[2007.01.18.목][완료!!!]
                void __fastcall _EDIT_Init(void);


                //[2010.06.29.화][완료!!!]
                void __fastcall _EDIT_TextOut(char  pText[]);



                //[2006.12.19.화][완료!!!]
                bool __fastcall _EDIT_IS_ImeHangul(void);
                void __fastcall _EDIT_Change_ImeMode(void);

                //[2007.04.08.일][완료!!!]
                void __fastcall _EDIT_CaretPos(int  pX,
                                               int  pY);
                //[2006.12.27.수][완료!!!]
                void __fastcall _EDIT_Get_Kor_Eng_Moonja_Width(void);

                //[2018.02.24.토][완료!!!]
                void __fastcall _CARETINDEX_CaretIndexWidth(int   pLINEstartINDEX,
                                                            int   pCARETINDEX,
                                                            int  *rCARETINDEXwidth,
                                                            int  *rMOONJAcount);
                //[2006.12.27.수][완료!!!]
                void __fastcall _CARETINDEXWIDTH_CaretIndex(int   pLINEstartINDEX,
                                                            int   pLINEendINDEX,
                                                            int  *prCARETINDEXwidth,
                                                            int  *rCARETINDEX,
                                                            int  *rMOONJAcount);
                //[2006.12.27.수][완료!!!]
                void __fastcall _CARETINDEX_MoveLeft(int   pLINEstartINDEX,
                                                     int  *prCARETINDEX);
                //[2006.12.27.수][완료!!!]
                void __fastcall _CARETINDEX_MoveRight(int   pLINEendINDEX,
                                                      int  *prCARETINDEX);

                //[2007.03.01.목][완료!!!]
                void __fastcall _MOUSEDOWN_Get_LineStartIndex(int   pLINEnumber,
                                                              int  *pLINEstartindex);

                //[2007.03.19.월][완료!!!]
                bool __fastcall _CARETPOS_MouseDown(int  pMOUSEdownX,
                                                    int  pMOUSEdownY);

                //[2007.03.17.토][완료!!!]
                void __fastcall _ROOT_TEXTINFO_Init(void);

                //[2007.03.14.수][완료!!!]
                void __fastcall _KEY_Left(bool  pETCcontrol);
                //[2007.03.14.수][완료!!!]
                void __fastcall _KEY_Right(bool  pETCcontrol,
                                           bool  pSELECTtrue);

                //[2007.03.14.수][완료!!!]
                void __fastcall _KEY_Home(bool  pETCcontrol);
                //[2007.03.14.수][완료!!!]
                void __fastcall _KEY_End(bool  pETCcontrol);

                //[2007.03.26.월][완료!!!]
                void __fastcall _KEY_Delete(void);
                //[2007.03.13.월][완료!!!]
                void __fastcall _KEY_Backspace(void);

                //[2007.01.18.목][완료!!!]
                bool __fastcall _EDITBUF_MOONJA_Delete(int    pDELETEindex,
                                                       bool  *rIScrlf);
                //[2007.02.14.수][완료!!!]
                bool __fastcall _SELECT_Get_StartEndIndex(struct GEdit_CARETINFO  *rSELECTstart,
                                                          struct GEdit_CARETINFO  *rSELECTend);
                //[2007.02.14.수][완료!!!]
                bool __fastcall _SELECT_Delete(struct GEdit_CARETINFO  *rSELECTstart,
                                               int                     *rCRLFcount);
                //[2007.04.09.월][완료!!!]
                void __fastcall _EDITBUF_MOONJA_Insert(int    pINSERTindex,
                                                       short  pCODE);
                //[2007.03.26.월][완료!!!]
                void __fastcall _CARET_MOONJA_Insert(short  pCODE);

                //[2007.03.19.월][완료!!!]
                void __fastcall _SELECTSCROLL_Left(int  pMOUSEx);
                //[2007.03.19.월][완료!!!]
                void __fastcall _SELECTSCROLL_Right(int  pMOUSEx);

                //[2007.03.07.수][완료!!!]
                void __fastcall _EDIT_SelectDelete(void);
                //[2018.02.24.토][완료!!!]
                void __fastcall _EDIT_Paste(char *pPASTEstr);
                //[2007.03.21.수][완료!!!]
                void __fastcall _EDIT_SelectAll(void);
            //}

            //[문자열처리]
            //{
                //한줄만 관리 하면 되므로 1024 개 문자만 관리하면 충분하다.
                #define  d_WORDCONFIG_max   1024
                struct GEdit_WORDCONFIG _wordconfig[d_WORDCONFIG_max];
                int                     _wordconfig_count;

                //[2007.01.31.수][완료!!!]
                void __fastcall _WORD_LineGet(char  *pSTR,
                                              int    pINDEX,
                                              char   rWORD[],
                                              int   *rWORDindex,
                                              int   *rWORDlength);

                //[2007.02.03.토][완료!!!]
                void __fastcall _MOONJACONFIG_LineGet(int  pLINEstartindex);

                //[2007.04.15.일][완료!!!]
                bool __fastcall _EDITBUF_LINE_Out(int   pX,
                                                  int   pY,
                                                  int   pLINEstartindex,
                                                  int  *rLINEendindex);

                //[2007.02.02.금][완료!!!]
                bool __fastcall _EDITBUF_STRING_Out(int  pX,
                                                    int  pY,
                                                    int  pLINEstartindex);

                //[2007.03.11.일][완료!!!]
                bool __fastcall _CARET_ViewAlways(void);
            //}

            //[클립보드관련]
            //{
                //[2007.03.06.화][완료!!!]
                bool __fastcall _CLIPBOARD_IsText(void);
                //[2012.04.30.월][완료!!!]
                void __fastcall _CLIPBOARD_Copy(void);
                //[2007.03.22.목][완료!!!]
                void __fastcall _CLIPBOARD_Cut(void);
                //[2007.03.07.수][완료!!!]

                void __fastcall _CLIPBOARD_Paste(void);
            //}

        //}

        //[폼디자인:모드]
        //{
            //[2018.06.24.일][추가!!!]

            //[속성]
            //{
                //[그림부품] 을 [폼디자인:모드] 로 사용하는 경우는 true.
                bool  _GFormDesignMode; //(기본값:false)

            //}

            //[부품]
            //{
                //<gui_part.cpp> 에 전역변수로 선언돼 있는 포인터 위치를 참조.
                //유일하게 [한개] 만 존재하므로 초기화 할필요가 없고 관리가 편해진다.
                TGCover_Form  **_GCover;

            //}

            void __fastcall _FormDesignMode(bool  pUse);

            //[이벤트]
            //{
                void __fastcall FormDesignMode_FormMouseDown(TObject *Sender, TMouseButton Button,
                                                             TShiftState Shift, int X, int Y);

            //}

        //}


};

//[API GUI 지원함수]
//{
    //[2012.05.05.토][완료!!!]
    void __fastcall GEdit_Create(//개체 생성자.
                                 void            *pPart,
                                 //모체 생성자.
                                 void            *pMother,
                                 //사용자가 직접 지정한 [식별자].
                                 unsigned short   pID,
                                 int              pLeft,
                                 int              pTop,
                                 int              pWidth,
                                 int              pHeight,
                                 //생성후 보일것인지 아닌지.
                                 bool             pVisible);

    //[2010.03.09.화][완료!!!]
    void __fastcall GEdit_Delete(//개체 생성자.
                                 void  *pPart);

    //[2010.03.09.화][완료!!!]
    void __fastcall GEdit_CreatorInit(//개체 생성자.
                                      void  *pPart);

//}

//---------------------------------------------------------------------------
extern PACKAGE TGEdit_Form *GEdit_Form;
//---------------------------------------------------------------------------

#endif
