
//[2012.06.16.토][대폭수정!!!]{**************
//[맷돌C] 용으로 <editor_edit_Form> 을 변경.
//}******************************************


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

#include  <ExtCtrls.hpp>

#include  "font.h"

#include  "GCaret.h"

//[2010.02.07.일][추가!!!]
//공용 [알림창] 을 사용하기 위한 것이다.
#include  "GMsgBox.h"

#include  "GFindDialog.h"


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


//[2018.02.23.금][추가!!!]{---
//[환경변수] 참조를 위한것.
#include  "ide_main.h"
//}---------------------------


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

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

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

};

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

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

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

};

//[정지점]
//{
    //[2007.04.12.목][추가!!!]{----------------------------------
    //기본적으로 문서당 20 개까지 설정할수 있게 만든다.
    //[2009.04.24.금][수정!!!]-----------------------------------
    //실제 [VMOS] 는 내부적으로 12 개 의 [정지점] 을 관리 하므로
    //최대 12 개 이상을 관리할 필요는 없다.
    //최대 한개 문서에서 12 개를 선언하게 되므로.
    //}----------------------------------------------------------

    #define  d_breakpoint_max   12

    struct GBREAKPOINT
    {
      //지정된 행번호(BASE: 0) 을 가진다.
      int  line[d_breakpoint_max];

      //설정된 총 수를 갖는다.
      int  count; //(BASE: 0)

    };

//}

struct GTEXTINFO
{
  //[2007.01.01.월][생성!!!]{-------------
  //문서마다 다른 변수들을 관리한다.
  //문서 전환시 자동으로 저장되어야 한다.
  //
  //[2012.06.09.토][수정!!!]--------------
  //}-------------------------------------

  //이 관리 정보 대상이 되는 [문서] 이름.
  AnsiString         filename;

  //현재 문서의 byte 단위 크기를 기록한다.
  int                filesize;

  int                font_margin_size;

  int                text_org_x;
  int                text_org_y;

  int                linecount;

  int                linestartindex;
  int                lineendindex;

  int                linetop_startindex;
  int                linetop_linenumber;

  int                caretindex;
  int                caretindexwidth;

  //[단어 범위 정보]
  //{
      //[2012.05.24.목][추가!!!]{-------------------------------------------
      //실시간으로 [입력지정자] 가 위치한 [단어] 의 [시작/끝:위치] 를 관리.
      //}-------------------------------------------------------------------

      int  wordStartIndex;
      int  wordEndIndex;

  //}

  //[수직줄 정보]
  //{
      //[2012.06.09.토][추가!!]{----------------------------------
      //문자열 [수직정렬] 을 위한 [수직줄] 도 개별 문서별로 적용.
      //}---------------------------------------------------------
      
      bool  vLineEn;
      int   vLineX;

  //}

  int                row;
  int                col;

  int                caret_x;
  int                caret_y;

  //[2007.04.05.목][추가!!!]
  bool               changed;

  //[2007.04.12.목][추가!!!]
  //각각 문서의 [정지점] 을 관리한다.
  struct GBREAKPOINT  breakpoint;

  //[선택영역정보][2007.02.14.수][수정!!!]
  //{
      struct GEditorEdit_CARETINFO select_start;
      struct GEditorEdit_CARETINFO select_end;

  //}

  //[스크롤 정보]
  //{
      //[문서] 의 [스크롤] 정보를 관리한다.
      int  scroll_V_min;
      int  scroll_V_max;
      int  scroll_V_position;
      int  scroll_V_design_size;

      int  scroll_H_min;
      int  scroll_H_max;
      int  scroll_H_position;
      int  scroll_H_design_size;
  //}

  //[2009.03.31.화][추가!!!]
  //[읽기전용] 속성을 가진다(BASE : false).
  bool  readOnly;

  //문서 종류를 구분한다.
  int   fileKind;

  //[검증식 보기판 관련]
  //{
      //[2011.06.26.일][추가!!!]{-------------------------------------------------
      //[검증식 보기판] 은 각 <*.c> 마다 설정이 다를수 있으므로 각 <*.c> 문서마다
      //개별적으로 가지고 있어야 한다.
      //}-------------------------------------------------------------------------

      bool  dbgView_Visible;
      char  dbgView_State;

      //[2011.07.01.금][추가!!!]{----------------------
      //[2/10/16 진수] 중 어떤 형식으로 보여줄 것인가?
      //직접 <2/10/16> 의 정수로 설정한다.
      int   dbgView_ViewKind; //(기본값 : 16)
      //}----------------------------------------------

  //}

};

struct GHISTORY
{
  //[2009.05.01.금][생성!!!]{------------------------------------
  //[되돌리기/되살리기] 기능을 위한 관리 구조체.
  //실제는 항목별 관리가 아니라 [되돌림묶음] 의 나열로 관리한다.
  //즉, 일종의 [통신저장소] 처럼 관리 하는 것이다.
  //memmove() 함수로 고속 처리가 가능하므로 관리가 더 간단하다.
  //}------------------------------------------------------------

  //********************
  //[<되돌림묶음> 구조]
  //********************


  //[일반 편집용]{*********************************************************************
  //
  //      4Byte          1Byte        1Byte        XByte         4Byte
  //{ <편집기index> + <'+'/'-'\'> + <'c'/'s'> +<문자열 + '\0'> + <크기> }
  //  |<-------------------<크기>---------------------------->|
  //
  //
  //<크기> 는 처음부터 문자열 끝까지의 Byte 수를 가진다.
  //
  //이는 [되돌림묶음 저장소] 는 일종의 <STACK> 형식으로 사용되므로 거꾸로 뒤부터
  //접근해야하는데, 이 경우 문자열등과 섞여 있으므로 원하는 정보를 찾기 힘들다.
  //따라서, 바로 [되돌림묶음] 의 시작위치를 알기 위하여 <크기> 정보가 반드시 필요하다.
  //
  //일단, [되돌림묶음] 시작 위치만 알면 문자열을 제외하고는 크기가 정해져 있으므로
  //간단하게 정보를 추출하여 사용가능하다.
  //
  //[2009.05.06.수][수정!!!]-----------------------------------------------------------
  //<'c'/'s'> 정보를 추가한다.
  //'c' : 문자(한글, 영문, 기호, CRLF) 인 경우.
  //'s' : 문자열인경우(선택영역이었던 경우나 붙여넣기 잘라내기등으로 수집된 경우).
  //
  //}**********************************************************************************

  
  //[수평이동용][2012.02.03.금][추가!!!]{*******************************************************
  //
  //[2012.02.06.월][중요주의!!!]{-------------------------------------------
  //이 [수평이동] 정보는 이 구조체와는 무관하다.
  //단지 개념적으로 같은 [수정이력] 에 속하기 때문에 이곳에 정리해 주는 것.
  //}-----------------------------------------------------------------------
  //
  //[수평이동] 의 경우는 완전히 다른 구조를 갖는다.
  //[두번째정보] 로 [일반/수평이동] 을 쉽게 구분할수 있다.
  //
  //      4Byte          1Byte          4Byte                  4Byte                    4Byte               4Byte       4Byte
  //{ <편집기index> + <'>'/'<'> + <시작행:시작위치> + <수정전:끝행:시작위치> + <수정후:끝행:시작위치> + <이동공백수> + <크기> }
  //
  //  |<---------------------------------------------<고정크기:21Byte>-------------------------------------------->|     21
  //
  //모든 항목이 고정크기이므로 전체도 역시 [고정크기] 가 된다.
  //
  //[분류정보]
  //(>) : [수평이동:오른쪽] 인 경우.
  //(<) : [수평이동:왼쪽] 인 경우.
  //
  //이 기능은 [Ctrl]+[=>] 나 [Ctrl]+[<=] 를 사용하거나 전용 대화상자를 이용 [선택영역] 을
  //[수평이동] 하는 경우의 [수정이력] 을 위한것.
  //
  //[C언어] 문서 작성시 [들여쓰기] 를 해야 하는 경우 일일히 행단위로 직접 처리하는 경우
  //시간이 많이 걸리므로 이를 위한 새로운 기능에 사용하려는것.
  //이 경우 [수정이력] 에 [우측이동:(>)], [왼측이동:(<)] 의 형식으로 등록되고
  //수 많은 행을 행단위로 [되돌리기/되살리기] 하는 경우는 역시 시간이 많이 걸리므로
  //수정된 행등을 한번에 [되돌리기/되살리기] 하기 위하여 사용된다.
  //
  //이 기능을 위한 별도의 함수가 존재한다.
  //
  //[2012.02.06.월][중요수정!!!]****************************************************************
  //<끝행:시작위치> 를 <수정전:끝행:시작위치> 와 <수정후:끝행:시작위치> 로 두개 정보로 구분.
  //이는 [되돌리기/되살리기] 시에 각각의 정보가 모두 필요하기 때문.
  //
  //<시작행:시작위치> 는 변화가 없으므로 한개 정보만 관리한다.
  //}*******************************************************************************************


  //넉넉하게 4M Byte 정도로 설정한다.
  //순서대로 [되돌림묶음] 을 저장한다.
  #define  d_History_Max   1024*4000
  char   buf[d_History_Max];

  //저장된 총 크기(끝 위치)를 갖는다.
  int    bufCount;

  //[명령묶음] 위치를 갖는다.
  int    packetPtr;


  //[문자열]{-----------------------
  //[편집기] 상의 문자열 시작 위치.
  int    strStartIndex;
  //[편집기] 상의 문자열 끝 위치.
  int    strEndIndex;
  //}-------------------------------

  //[수평이동 관련]
  //{
      //[2012.02.06.월][추가!!!]{-------------------------------------
      //[수평이동] 관련 [수정이력] 정보 수집시 사용.
      //모든 항목이 다 사용되는 것이 아니라 필요에 따라 임시 저장소로
      //선택적으로 사용된다.
      //}-------------------------------------------------------------

      //입력지정자 배치 위치(복구시 사용할 위치).
      //실제는 [시작행:시작위치] 와 같은 값으로 설정.
      //복구시에는 전용 함수를 사용하기 위하여 [편의상] 입력지정자 위치를
      //[시작행:시작위치] 로 설정하는 것.
      int   mCaretIndex;

      //<시작행:시작위치>.
      //이 위치는 수정 전/후 항상 같은 값으로 변하지 않는다.
      int   mStartLineStartIndex;

      //수정전 <끝행:시작위치>.
      int   mEndLineStartIndex;

      //수정후 <끝행:시작위치>.
      int   mEndLineStartIndex_moved;

      //이동할 간격.
      int   mMoveCount;

  //}

};

struct GCOMMENTBLOCK_INFO_ITEM
{
  //[2009.06.02.화][생성!!!]{-------------------
  //1 개의 {/* ... */} 영역 정보를 관리한다.
  //
  //startIndex : "/*" 시작 위치('/' 문자 위치).
  //endIndex   : "*/" 끝위치('/' 문자 위치).
  //}-------------------------------------------

  int  startIndex;
  int  endIndex;

  //[2012.06.09.토][추가!!!]
  //각 행정보를 기록.
  int  startLine;
  int  endLine;

};

struct GCOMMENTBLOCK_INFO
{
  //[2009.06.02.화][생성!!!]{---------------------------------
  //편집기 상의 문서의 {/* ... */} 영역 정보를 모두 관리한다.
  //}---------------------------------------------------------

  //[2012.06.09.토][참고!!!]
  //<1024*100> 개 정도도 충분하나 기존 그대로 둔다.
  #define  d_COMMENTBLOCK_INFO_ITEM_Max  1024*100

  struct GCOMMENTBLOCK_INFO_ITEM   items[d_COMMENTBLOCK_INFO_ITEM_Max];

  //저장된 개수를 관리한다.
  //[2012.06.09.토][중요!!!]{---------------------------------------------------------
  //문서를 처음 열때 <_ROOT_TEXTINFO_Init()> 에서 반드시 <-1> 로 초기화.
  //이는 한번도 사용하지 않았다는 의미.
  //처음 문서를 열때 기존 문서의 [비교정보] 가 없기 때문에 이를 구별하기 위하여 필요.
  //문서 전환시에는 기존 문서 정보와 비교할수 있기 때문에 무관.
  int    itemCount; //(초기값:-1)
  //}---------------------------------------------------------------------------------

};

class TGEditorEdit_Form : public TForm
{
__published:	// IDE-managed Components
        void __fastcall FormMouseWheel(TObject *Sender, TShiftState Shift,
          int WheelDelta, TPoint &MousePos, bool &Handled);
        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);
private:	// User declarations
public:		// User declarations

        __fastcall TGEditorEdit_Form(TComponent* Owner);

        //[2012.04.29.일][완료!!!]
        __fastcall ~TGEditorEdit_Form(void);

        //[서브클래싱]
        //{
            //[2009.04.03.금][중요수정완료!!!]
            //[2018.02.23.금][완료!!!]
            void __fastcall WndProc(Messages::TMessage &Message);

        //}

        //[환경변수]
        //{
            //[2018.02.23.금][추가!!!]{------------
            //[Linux:wine] 지원을 위한것.
            //<editor_edit> 와 같은 코드를 위한것.
            //}------------------------------------

            struct  IDE_OPTION   *_ide_option;

        //}

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

            bool  _this_;

        //}

        //[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.03.25.일][추가!!!]{------------------------
            //전체 배경그림을 사용하는 경우 이 폼에서 표시할 시작 위치 좌표를 가진다.
            //개별 배경 그림의 경우는 사용되지 않는다.
            int   _bmporg_x, _bmporg_y;
            //}-----------------------------------------------------------------------


            //[2007.03.31.토][추가!!!]{--------------------------------------------------------
            //배경 bmp 경로는 전역 변수로 관리 하는 것이 좋다.(수시로 바뀌는 것이 아니므로...)
            AnsiString  _bmp_path;
            //}--------------------------------------------------------------------------------

        //}

        //[내부 사용 개체]
        //{
            //[빠른목록]
            //{
                //[VAR]
                //{
                    //[2007.03.06.화][추가!!!]
                    TGList_Form  *_popupMenu;

                //}

                //[동작함수]
                //{
                    //[간편기능항목] 에서 항목이 선택된 경우 호출된다.
                    //[2007.03.31.토][완료!!!]
                    void __fastcall _EVENT_ItemSelect_popupMenu(void);

                //}

            //}

        //}

        //[추가속성]
        //{
            //일단 정리해 놓는다.

            //[찾기 대화상자]
            //{
                //[2012.05.01.화][생성!!!]{------------------------------------------------------------
                //<_GPART_GFindDialog> 의 위치를 관리하는 <전역변수:_GPART_GFindDialog> 자체 위치를
                //관리한다.
                //이는 이 <전역변수:_GPART_GFindDialog> 자체는 절대 위치가 변하지 않기 때문이며
                //
                //[GUI] 를 [X] 버튼으로 정상적으로 종료하지 않고
                //<[]맷돌가상구동> 을 해제시켜 바로 종료하는 경우
                //
                //<GVmos> 가 <GPART_GVmos_Delete()> 로 최종 삭제되면서 <_GPART_GFindDialog> 가
                //참조하는 [찾기대화상자] 는 <GVmos> 보다 먼저 삭제되지만,
                //이를 사용하는 <GEditorEdit> 등은 최종적으로 <GVmos> 가 삭제될때 삭제되기 때문이다.
                //즉, [삭제] 순서가 바뀌게 되면서 발생하는 문제인데,
                //결과적으로 <GEditorEdit> 가 [찾기대화상자] 의 위치를 관리하기 때문이며
                //이 위치를 처음 <GEditorEdit> 가 생성될때 한번만 <GPART_GFindDialog_GetPtr()> 함수로
                //얻어 관리하기 때문에 <GPART_GVmos_Delete()> 에서 [찾기대화상자] 가 이미 [삭제]
                //되어 <_GPART_GFindDialog:NULL> 이 들어 있지만, 이전에 얻어 놓은 [찾기대화상자] 의
                //위치로 계속 접근하다가 [오류] 가 발생하고 만다는 것이다.
                //<TGEditorEdit_Form::_EDITBUF_LINE_Out()> 함수 내부에서 [형광문자] 기능을 처리할때
                //이미 존재하지 않는 [찾기대화상자] 를 기존의 관리주소로 접근하며 [오류] 가 난다.
                //
                //따라서, 아예 절대 위치가 변하지 않으며 <GVmos> 가 삭제되어도 계속 [전역변수] 로 남아
                //확실하게 [찾기대화상자:NULL] 상태를 알수 있는 <_GPART_GFindDialog> 자체 주소를 얻어
                //사용하는 것으로 한다.
                //이 경우 언제나 [찾기대화상자] 가 [해제] 되었는지 쉽게 알수 있다.
                //
                //현재 [찾기대화상자] 를 사용하는 부분은 <GEditorEdit> 밖에 없다.
                //
                //<GPART_GFindDialog_GetPtr2()> 안의 함수설명 참고.
                //}------------------------------------------------------------------------------------

                //[2012.05.01.화][수정!!!]{---------------------------------------------------
                //<*_GFindDialog> => <**_GFindDialog> 로 수정.
                //[찾기대화상자] 위치가 아니라 이를 관리하는 <전역변수:_GPART_GFindDialog> 의
                //위치를 관리한다.
                //언제라도 [찾기대화상자] 가 이미 [삭제] 된상태라도 이 유/무를 확인할수 있다.
                //
                //[2012.05.05.토][설명!!!]----------------------------------------------------
                //[BCB용] 으로 사용하는 경우는 이미 등록돼 있는 [공용부품] 을
                //무시하고 별도로 생성한 [그림부품] 을 등록하면 된다.
                TGFindDialog_Form  **_GFindDialog;
                //}---------------------------------------------------------------------------

            //}

            //[배경그림]
            //{
                //[배경그림 이름] 을 관리한다.
                AnsiString  _backBmpPath;

            //}

            //[색동문자]
            //{
                //[!]{--------------------------------------
                //[색동문자] 기능을 위한 색설정을 관리한다.
                //}-----------------------------------------

                //[VAR]
                //{
                    int  _colorKeyword;    //예약어.
                    int  _colorBinWord;    //2진수.
                    int  _colorHexWord;    //16진수.
                    int  _colorDirective;  //지시어.
                    int  _colorString;     //문자열.
                    int  _colorChar;       //문자.
                    int  _colorComment;    //주석문.

                //}

                //[2010.02.17.수][완료!!!]
                void __fastcall _Syntax_ColorKeyword(int  pColor);

                //[2010.02.17.수][완료!!!]
                void __fastcall _Syntax_ColorBinWord(int  pColor);

                //[2010.02.17.수][완료!!!]
                void __fastcall _Syntax_ColorHexWord(int  pColor);

                //[2010.02.17.수][완료!!!]
                void __fastcall _Syntax_ColorDirective(int  pColor);

                //[2010.02.17.수][완료!!!]
                void __fastcall _Syntax_ColorString(int  pColor);

                //[2010.02.17.수][완료!!!]
                void __fastcall _Syntax_ColorChar(int  pColor);

                //[2010.02.17.수][완료!!!]
                void __fastcall _Syntax_ColorComment(int  pColor);

            //}

            //[사용자 정의 색동단어]
            //{
                //[2012.08.03.금][추가!!!]{--------------------------------
                //[사용자 정의 색동단어] 를 관리.
                //<_MoonjaConfig_LineGet_C> 에서 [예약어] 다음에 처리된다.
                //}--------------------------------------------------------

                //[방법!!!]{----------------------------------------------------------------
                //
                //저장소[] = { [단어0'\0'][단어1'\0'][단어2'\0']... } 형식으로 [단어] 관리.
                //이는 [형식적용문자열] 과 유사한 방식.
                //
                //<_syntaxWord_[번호] = 저장소[0] 위치;
                //
                //<_syntaxWord_[번호]> 형식으로 사용.
                //
                //}-------------------------------------------------------------------------

                //[VAR]
                //{
                    //{ [단어0'\0'][단어1'\0'][단어2'\0']... } 형식 문자열 관리.
                    char   *_syntaxWordBuf_;     //(초기화:NULL)
                    int     _syntaxWordBuf_Size; //(기본값:0)

                    //{ [단어0'\0'][단어1'\0'][단어2'\0']... } 에서 각 [단어] 주소 관리.
                    //바로 문자열에 접근할수 있도록 [주소] 로 관리.
                    char  **_syntaxWord_;        //(초기화:NULL)
                    int     _syntaxWord_Count;   //(기본값:0)

                    //[적용형식]
                    //{
                        //[!]{--------------------------------------
                        //각 [형] 은 [맷돌C] API 쪽과 같은 것 사용.
                        //}-----------------------------------------

                        unsigned char  _syntaxWord_Style;
                        unsigned int   _syntaxWord_FontColor;
                        unsigned int   _syntaxWord_BackColor;
                        bool           _syntaxWord_Transparent;

                    //}

                //}

                //[2012.08.03.금][완료!!!]
                void __fastcall _Syntax_Word_Set(//"단어v단어v단어" 로 [공백:한개] 만으로 구분되고
                                                 //끝에는 [공백] 이 없어야 한다.
                                                 char           *pWordList_,
                                                 unsigned char   pStyle,
                                                 unsigned int    pFontColor,
                                                 unsigned int    pBackColor,
                                                 bool            pTransparent);
                //[2012.08.03.금][완료!!!]
                void __fastcall _Syntax_Word_UnSet(void);

                //[2012.08.17.금][완료!!!]
                void __fastcall _Syntax_Word_Color(int  pColor);

            //}

            //[테두리]
            //{
                //[VAR]
                //{
                    int  _borderColor;

                //}

                //[2010.02.10.수][완료!!!]
                void __fastcall _BorderColor(int  pBorderColor);

            //}

            //[편집기 바탕 밝기]
            //{
                //[VAR]
                //{
                    //편집기 화면 밝기(기본값 : 225).
                    int  _editBackBrightness;

                //}

                //[2010.02.10.수][완료!!!]
                void __fastcall _EditBackBrightness(int  pEditBackBrightness);

            //}

            //[검증관련 색]
            //{
                //[VAR]
                //{
                    //[2010.02.14.일][추가!!!]
                    //[특정색] 으로 지정할 행번호.
                    //사용하지 않는 경우는 <-1> 을 할당한다.
                    int  _focusLineNum; //(기본값 : -1)

                    //[2012.08.19.일][추가!!!]{--------------------------------------------------
                    //<true> 인 경우는 [편집기] 가 [촛점] 을 잃어도 [지정행] 을 감추지 않는다.
                    //[맷돌C] 로 [G.M.RC.BASiC-IDE] 를 만드는 도중 필요에 따라 추가.
                    //[지정행:감추기] 를 처리하는 <_DEBUG_Indicator_Hide()> 함수에서만 사용된다.
                    bool _focusLineNoHide; //(기본값:false).
                    //}--------------------------------------------------------------------------

                    //지정행의 [문자색].
                    int  _focusLineFontColor;

                    //지정행의 [배경색].
                    int  _focusLineBackColor;

                    //[2010.03.16.화][추가!!!]
                    //행지정자 색.
                    int  _lineArrowColor;

                    //정지점색.
                    int  _breakPointColor;

                //}

                //[2010.02.14.일][완료!!!]
                void __fastcall _FocusLineNum(int  pLineNum);

                //[2010.02.14.일][완료!!!]
                void __fastcall _FocusLineFontColor(int  pColor);

                //[2010.02.14.일][완료!!!]
                void __fastcall _FocusLineBackColor(int  pColor);

                //[2010.02.14.일][완료!!!]
                void __fastcall _LineArrowColor(int  pColor);

                //[2012.08.18.토][완료!!!]
                void __fastcall _BreakPointColor(int  pColor);

                //[부가함수]
                //{
                    //[2010.02.14.일][완료!!!]
                    void __fastcall _FocusLine_Draw(void);

                //}

            //}

            //[문서관련]
            //{
                //[!]{---------------------------------------------------
                //문서 [수정/읽기전용] 전환이나, [문서종류] 를 관리한다.
                //}------------------------------------------------------

                //[2010.02.17.수][완료!!!]
                void __fastcall _Document_ReadOnly(//읽기전용 설정 : true.
                                                   bool  pReadOnly);

                //[2010.02.17.수][완료!!!]
                //[문서종류] 상수값은 아래에 정의돼 있다.
                void __fastcall _Document_FileKind(//[문서종류] 상수값.
                                                   int  pFileKind);





            //}

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

                void  *_vpGEditor;

                //[2010.02.10.수][추가!!!]
                //포인터 차원과는 무관하며 1차원으로 선언하면 된다.
                void  *_vpGVmos;

            //}

        //}

        //[공용 알림창]
        //{
            //[2010.02.07.일][추가!!!]{---------------------------------------
            //전체적으로 공통사용되는 [알림창] 을 사용하기 위한 것이다.
            //이미 생성돼 있으므로 전용 함수로 받아서 사용하기만 하면 된다.
            //
            //[2012.05.01.화][생성!!!]{---------------------------------------
            //자세한 내용은 <GPART_GFindDialog_GetPtr2()> 함수안 설명 참고.
            //
            //<*> => <**> 로 수정.
            //[개체] 위치가 아니라 이를 관리하는 <전역변수> 의 위치를 관리.
            //[개체] 가 이미 [삭제] 된상태라도 이 [유/무] 를 확인할수 있다.
            //
            //[2012.05.05.토][설명!!!]----------------------------------------
            //[BCB용] 으로 사용하는 경우는 이미 등록돼 있는 [공용부품] 을
            //무시하고 별도로 생성한 [그리부품] 을 등록하면 된다.
            //}---------------------------------------------------------------

            TGMsgBox_Form  **_GMsgBox;

        //}

        //[공용 대화상자]
        //{
            //[2010.03.17.수][추가!!!]{-------------------------------------
            //공용 [열기/저장 대화상자] 를 선언한다.
            //이미 생성돼 있으므로 전용 함수로 받아서 사용한다.
            //
            //[2012.05.01.화][생성!!!]{-------------------------------------
            //자세한 내용은 <GPART_GFindDialog_GetPtr2()> 함수안 설명 참고.
            //
            //<*> => <**> 로 수정.
            //[개체] 위치가 아니라 이를 관리하는 <전역변수> 의 위치를 관리.
            //[개체] 가 이미 [삭제] 된상태라도 이 [유/무] 를 확인할수 있다.
            //
            //[2012.05.05.토][설명!!!]--------------------------------------
            //[BCB용] 으로 사용하는 경우는 이미 등록돼 있는 [공용부품] 을
            //무시하고 별도로 생성한 [그리부품] 을 등록하면 된다.
            //}-------------------------------------------------------------

            TOpenDialog  **_GOpenDialog;

            TSaveDialog  **_GSaveDialog;

        //}

        //[FUNCTION]
        //{
            //[2018.09.04.화][완료!!!]
            void __fastcall _Enable(bool  pEnable);

            //[2018.09.04.화][완료!!!]  
            void __fastcall _Shape(void);

            //[2012.06.13.수][완료!!!]
            void __fastcall _Resize(void);

            void __fastcall _Draw(void);

            //[2018.09.04.화][완료!!!]
            void __fastcall _EditBuf_Text(void);

            //[2011.06.30.목][완료!!!]
            void __fastcall _EditBuf_LineText(int   pLineNumber,
                                              //[지정행] 을 그려줄경우는 true.
                                              bool  pFocusLineEn);

            //[2011.06.29.수][완료!!!]
            void __fastcall _EditBuf_LineTextX(//다시 그릴 시작 행 번호.
                                               int   pStartLineNumber,
                                               //다시 그릴 행 수.
                                               int   pLineCount,
                                               //[2011.06.29.수][추가!!!]
                                               //[검증보기판] 을 보여주는 경우는 <true>.
                                               bool  pDbgViewEn,
                                               //[지정행] 을 그려줄경우는 true.
                                               bool  pFocusLineEn);

            //[2012.03.27.화][완료!!!]
            void __fastcall _Scroll_Set(void);

            //[2006.11.29.수][완료!!!]
            void __fastcall _Scroll_Resize(void);

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

            //[2011.06.06.월][완료!!!]
            bool __fastcall _EditFile_SetKind(char  *pFileName);

            //[2019.03.08.금][완료!!!]
            void __fastcall _EDITFILE_Open(AnsiString  pFILEname);

            //[2012.03.01.목][완료!!!]
            void __fastcall _EDITFILE_ReOpen(AnsiString  pFILEname);

            //[2009.05.05.화][완료!!!]
            void __fastcall _EDITFILE_TempDelete(char  *pFileFullName);

            //[2012.03.01.목][완료!!!]
            void __fastcall _EDITFILE_SaveNowFile_inTEMPfile(void);

            //[BCB/맷돌C 구분]
            //{
                //[2012.05.05.토][수정!!!]{--------------------------
                //[BCB/맷돌C] 용을 구분해서 같은 기능 함수를 나눈다.
                //}--------------------------------------------------

                //[2012.05.03.목][완료!!!]
                //[BCB/맷돌C] 용 구분.
                //함수두개 만든다.
                void __fastcall _EDITFILE_SaveNowEditFile(void);

                //[2012.07.22.일][완료!!!]
                void __fastcall _EDITFILE_SaveNowEditFile2(void);

            //}

            //[BCB/맷돌C 구분]
            //{
                //[2012.05.05.토][수정!!!]{--------------------------
                //[BCB/맷돌C] 용을 구분해서 같은 기능 함수를 나눈다.
                //}--------------------------------------------------

                //[2012.05.03.목][완료!!!]
                //[BCB/맷돌C] 용 구분.
                //함수두개 만든다.
                void __fastcall _EDITFILE_SaveAsNowEditFile(void);

                //[2012.05.05.토][완료!!!]
                void __fastcall _EDITFILE_SaveAsNowEditFile2(void);

            //}

            //[2012.03.01.목][완료!!!]
            void __fastcall _EDITFILE_SaveAllFile(void);

            //[2012.07.22.일][완료!!!]
            void __fastcall _EDITFILE_NewFile(void);

        //}

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

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

                //[관리]
                //{
                    //[문서] 의 총 행수를 기록한다.
                    //산출하는데 시간이 많이 거리므로 항상 추척 관리 해 놓아야 한다.
                    //행이 바뀌는 [문서수정] 의 경우(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)
                        //------------------------------------------------------------------------
                    //}

                    //[단어 구간 정보]
                    //{
                        //[2012.05.24.목][추가!!!]{---------------------------------------------------
                        //[입력지정자] 가 위치한 [단어] 의 [시작/끝:위치] 를 실시간 관리.
                        //[문서] 가 실제적으로 수정되는 부분에서 <_caretindex> 가 확정된후
                        //이 위치의 [단어:시작/끝:위치] 를 구해서 보관.
                        //
                        //단순한 [입력지정자] 의 [위치이동] 시 정보는 <_EDIT_CaretPos()> 함수에서
                        //획득하고, [문서 수정] 등으로 단어가 변경되거나 하는 모든 경우는
                        //<_filesize> 가 변경되는 [함수] 들에서 처리된다.
                        //
                        //이는 [입력지정자] 위치는 고정인데 [Key:Del] 로 삭제되는 경우는
                        //<_caretindex> 가 먼저 확정되고, 나중에 위치한 단어가 수정될수 있으므로
                        //반드시 [수정] 된 후에 정보가 수집되어야 하기 때문이다.
                        //
                        //<_filesize> 가 변경되는 [함수] 들은 현재 아래와 같다.
                        //<_EDITBUF_MOONJA_Delete()>, <_SELECT_Delete()>, <_EDITBUF_MOONJA_Insert()>,
                        //<_EditBuf_LineStr_Insert()>, <_EditBuf_LineStr_Delete()>, <_EDIT_Paste()>,
                        //<History_Insert()>
                        //}---------------------------------------------------------------------------

                        int  _wordStartIndex; //(기본값:0)
                        int  _wordEndIndex;   //(기본값:0)

                    //}

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

                    //[수정구분]
                    //{
                        //[2007.04.05.목][추가!!!]
                        //현재 문서가 수정된 경우는 true 로 설정한다.
                        bool  _changed; //(BASE : false)

                    //}

                    //[읽기전용]
                    //{
                        //[2009.03.31.화][추가!!!]
                        //읽기 전용 속성을 저장한다(BASE : false).
                        bool  _readOnly;

                        //[2009.04.25.토][추가!!!]{---------------------------------------------------
                        //위의 <_readOnly> 와는 관계 없이 이 속성이 true 인 경우는
                        //현재 열려 있는 모든 문서는 [수정불가] 상태가 된다.
                        //이는 [개발검증] 시에만 true 로 설정되며, 일일히 문서의 속성을 관리하지 않고
                        //전환 과정을 단순화 시키기 위한 것이다.
                        bool  _readOnlyAll;
                        //}---------------------------------------------------------------------------

                    //}

                    //[문서종류]
                    //{
                        //[2009.03.31.화][추가!!!]{------------------------------------------------
                        //문서 종류를 구분한다.
                        //이는 문서를 읽어 들이면서 확장자를 검사하는 것만으로 간단하게 알수 있다.
                        //}------------------------------------------------------------------------

                        int   _fileKind;

                        #define   d_Editor_FileKind_c        1  //<*.c   > 문서.
                        #define   d_Editor_FileKind_gasm     2  //<*.gasm> 문서.
                        #define   d_Editor_FileKind_gcsm     3  //<*.gcsm> 문서.

                        //[2009.05.28.목][추가!!!]
                        //<*.c> 와 같은 [색동문자] 를 적용받는다.
                        #define   d_Editor_FileKind_gtxt     4  //<*.gtxt> 문서.

                        //[2011.05.27.금][추가!!!]{-----------------------------------------
                        //<*.gasm> 과 유사하지만, 전용 처리를 한다.
                        #define   d_Editor_FileKind_obj      5   //<*.gobj>, <*.glib> 문서.
                        //}-----------------------------------------------------------------

                        //[2011.06.06.월][추가!!!]{-------------------------------
                        //<*.gtmp> 를 처리한다.
                        #define   d_Editor_FileKind_gtmp     6   //<*.gtmp> 문서.
                        //}-------------------------------------------------------

                        #define   d_Editor_FileKind_default  0  //<*.txt > 등 기본 문서.

                    //}

                //}

                //[입력지정자]
                //{
                    //-------------------------------------------------------
                    //개체를 갖는다.
                    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)

                //[함수 유무효 구분자]
                //{
                    //[2012.03.27.화][추가!!!]--------------------------------
                    //[마법사:대화상자] 의 [미리보기] 기능을 지원하기 위한것.
                    //
                    //[2012.06.16.토][설명!!!]--------------------------------
                    //[맷돌C] 용으로는 불필요.
                    //}-------------------------------------------------------

                    //[2012.03.27.화][추가!!!]
                    bool  _no_Editbuf_Text; //(기본값:false).

                    //[2012.03.27.화][추가!!!]
                    bool  _no_Scroll_Set; //(기본값:false).

                //}

                //[2009.05.07.목][추가!!!]{-------------------------------------------------------------
                //_EDIT_CaretPos() 함수 안에서 [선택영역] 해제시 이 함수를 호출하게 되는데
                //[되돌림/되살림] 처리시나 [교체] 등에서 [선택영역] 을 많이 사용하게 되어
                //중복 처리로 인한 시간 손실이 많다.
                //따라서, 이를 위하여 이런 경우 이 함수를 동작 시키지 않도록 하기 위한 변수를 추가한다.
                bool  _editBuf_Text_No_Select;
                //}-------------------------------------------------------------------------------------

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

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

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

            //}

            //[<Ctrl + Alt> + 마우스 이동으로 탐색]
            //{
                //[2010.08.28.토][추가!!!]{------------------------------------------------------
                //마우스 휠이 없는 경우도 마우스 움직임만을 이용한 탐색이 가능하도록
                //<Ctrl + Alt> 키와 조합된 탐색 기능을 제공한다.
                //[<Ctrl + Alt> + 마우스 상/하]  이동의 경우 처음 <Ctrl> 을 누른 위치보다 위라면
                //위쪽으로 줄이동 되고, <Ctrl> 을 누른 위치보다 아래라면 아래로 줄이동된다.
                //실제 사용해 보니, 대단히 편리했다.
                //가까운 거리를 탐색하는데는 [굴림] 보다 춸씬더 편리했다.
                //}------------------------------------------------------------------------------

                //현재 [편집기] 상의 [화면지정자] Y 위치를 계속 가진다.
                //이는 Ctrl 이 눌렸을때의 위치를 정확하게 알기 위한 것이다.
                int   _mousePosY; //계속 관리된다.

                //<Ctrl> 이 눌린 순간의 [편집기] 상의 Y 위치를 가진다.
                int   _mousePosY_Ctrl;

                //[2011.05.06.금][추가!!!]{---------------------------------------------------------
                //<Ctrl + Alt> 인 경우는 <true> 로 설정하고, 그 밖의 경우는 <false> 로 설정한다.
                //이 변수는 [줄이동 각 영역] 을 구분하는 [점선 을 [편집기] 줄이동시 그려주기 위하여
                //반드시 필요하다.
                //실제 [점선] 은 [편집기] 의 내용이 다시 그려질때 마지막으로 그려지기 때문이다.
                bool  _mouseCtrlAlt;
                //}---------------------------------------------------------------------------------

            //}

            //[기준세로줄]
            //{
                //[2012.06.08.금][추가!!!]{------------------------------------
                //편집시 "{", "}" 위치를 맟추기 위한 세로줄을 보여주기 위한것.
                //일종의 정렬을 위한 [기준선] 을 보여주는 것.
                //
                //[편집기] 문서 좌표와 동기되어 [수평줄이동] 시 동기 이동한다.
                //
                //[중요!!!]----------------------------------------------------
                //[문서] 마다 개별 설정 가능하다.
                //}------------------------------------------------------------

                //[세로줄] 유효/무효.
                bool  _vLineEn; //(기본값:false)

                //[세로줄] 편집기 상 X 좌표.
                //[수평줄이동] 시 같이 이동한다.
                //기본적으로는 <Ctrl+'G'> 누를때 [입력지정자] X 좌표가 된다.

                //실제는 <_Edit_Col()> 에서 항상 정확한 값으로 구해지는
                //<_caretindexwidth> 위치로 설정된다.
                int   _vLineX; //(기본값: -1)

            //}

            //[문서 정보 관리]
            //{
                //-------------------------------------------------------
                //실제 관리하는 문서수 + 1 로 크기를 설정해 주어야 한다.
                #define  d_GEditorEdit_TEXTINFO_max    41
                struct GTEXTINFO  _textinfo[d_GEditorEdit_TEXTINFO_max];

                //현재 관리되는 [문서] 의 총수.
                int              _textinfo_count; //(BASE : 0)

                //현재 표시된 [문서] 의 index;
                int              _textinfo_index; //(BASE : -1)

                //[2007.03.28.수][추가!!!]
                int              _newfile_count;  //(BASE : 0)
                //-------------------------------------------------------

                //[총 관리 문서수 정의]
                //{
                    //[2010.03.21.일][중요추가!!!]{-------------------------------------------
                    //실제 열수 있는 문서 총수를 정의한다.
                    //이 이상의 문서는 열수 없도록 해야 오류가 발생하지 않는다.
                    //다른 곳에서 이 정보에 접근 할수 있도록 변수로 정의해 준다.
                    //실제 <d_TEXTINFO_max> 정의값보다 -1 한 값을 사용해야 한다.
                    //맨 뒤의 1 개의 여분을 두어야 하는 것이다.
                    //이는 <_TEXTINFO_Delete()> 함수안에서 뒤의 것을 앞으로 복사하는 방식으로
                    //빈곳을 매꾸고 있으므로 발생하는 문제로 만드시 맨 뒤에 1 개의 여분을
                    //두어야 한다.
                    //}-----------------------------------------------------------------------

                    int  _textMaxCount;

                //}

            //}

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

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

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

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

                //[2009.06.02.화][완료!!!]
                void __fastcall _EDIT_Changed(bool  pALWAYS,
                                              bool  pCHANGED);

                //[2012.05.05.토][완료!!!]
                //[BCB/맷돌C] 용 구분.
                bool __fastcall _EDIT_SaveCheckChanged_whenCloseThis(int  pLISTindex);

                //[2012.05.05.토][완료!!!]
                //[BCB/맷돌C] 용 구분.
                bool __fastcall _EDIT_SaveCheckChanged_whenCloseAll(void);

                //[2006.12.23.토][완료!!!]
                void __fastcall _EDIT_Get_TextOrigin(void);

                //[2012.06.09.토][완료!!!]
                void __fastcall _EDIT_CaretPos(int  pX,
                                               int  pY);

                //[2009.05.25.월][완료!!!]
                void __fastcall _Edit_Col(int   pCaretindex);

                //[2006.12.27.수][완료!!!]
                void __fastcall _EDIT_Get_Kor_Eng_Moonja_Width(void);

                //[2012.04.15.일][완료!!!]
                void __fastcall _EDIT_V_Scroll(void);

                //[2012.04.15.일][완료!!!]
                void __fastcall _EDIT_H_Scroll(void);

                //[2007.03.15.목][완료!!!]
                void __fastcall _KEY_PageUp(void);

                //[2007.03.15.목][완료!!!]
                void __fastcall _KEY_PageDown(void);

                //[2006.12.27.수][완료!!!]
                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);

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

                //[2012.06.09.토][완료!!!]
                void __fastcall _TEXTINFO_Format(struct GTEXTINFO  *pTEXTINFO);

                //[2007.01.03.수][완료!!!]
                void __fastcall _TEXTINFO_Init(void);

                //[2007.01.01.월][완료!!!]
                void __fastcall _TEXTINFO_Add(struct GTEXTINFO  *pTEXTINFO);

                //[2007.01.01.월][완료!!!]
                void __fastcall _TEXTINFO_Delete(int  pDELETEindex);

                //[2009.05.21.ahr][완료!!!]
                int __fastcall _TEXTINFO_GetIndex_withFILEname(AnsiString  pFILEname);

                //[2012.06.09.토][완료!!!]
                void __fastcall _TEXTINFO_Backup(int  pINDEX);

                //[2012.06.09.토][완료!!!]
                void __fastcall _TEXTINFO_Restore(int  pINDEX);

                //[2007.04.10.화][완료!!!]
                bool __fastcall _TEXTINFO_IsChangedOne(void);

                //[2007.03.13.화][완료!!!]
                void __fastcall _KEY_Up(bool  pETCcontrol);

                //[2007.03.13.화][완료!!!]
                void __fastcall _KEY_Down(bool  pETCcontrol);

                //[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);

                //[2009.05.09.토][완료!!!]
                void __fastcall _KEY_Enter(//[수정이력] 을 적용하는 경우는 true.
                                           bool  pHistoryAdd);

                //[2009.05.06.수][완료!!!]
                void __fastcall _KEY_Delete(//[수정이력] 을 적용하는 경우는 true.
                                            bool  pHistoryAdd);

                //[2009.05.08.금][완료!!!]
                void __fastcall _KEY_Backspace(void);

                //[2012.06.01.금][완료!!!]
                bool __fastcall _EDITBUF_MOONJA_Delete(int    pDELETEindex,
                                                       bool  *rIScrlf);

                //[2009.05.06.수][완료!!!]
                bool __fastcall _SELECT_Get_StartEndIndex(struct GEditorEdit_CARETINFO  *rSELECTstart,
                                                          struct GEditorEdit_CARETINFO  *rSELECTend);

                //[2012.06.01.금][완료!!!]
                bool __fastcall _SELECT_Delete(struct GEditorEdit_CARETINFO  *rSELECTstart,
                                               int               *rCRLFcount);

                //[2011.06.24.금][완료!!!]
                int __fastcall _SELECT_StartLineNum(void);

                //[2012.06.01.금][완료!!!]
                void __fastcall _EDITBUF_MOONJA_Insert(int    pINSERTindex,
                                                       short  pCODE);

                //[2012.06.01.금][완료!!!]
                void __fastcall _EditBuf_LineStr_Insert(int    pInsertIndex,
                                                        char  *pStr);

                //[2012.06.01.금][완료!!!]
                bool __fastcall _EditBuf_LineStr_Delete(//[삭제] 할 위치.
                                                        int  pDelIndex,
                                                        //[삭제] 할 크기.
                                                        int  pDelSize);
                //[2018.02.23.금][완료!!!]
                void __fastcall _CARET_MOONJA_Insert(short  pCODE,
                                                     //[수정이력] 을 적용하는 경우는 true.
                                                     bool   pHistoryAdd);

                //[2007.03.19.월][완료!!!]
                void __fastcall _SELECTSCROLL_Up(int  pMOUSEy);

                //[2007.03.19.월][완료!!!]
                void __fastcall _SELECTSCROLL_Down(int  pMOUSEy);

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

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

                //[2012.06.09.토][완료!!!]
                void __fastcall _EDIT_SelectDelete(void);

                //[2012.06.01.금][완료!!!]
                void __fastcall _EDIT_Paste(char *pPASTEstr,
                                            //[2009.05.07.목][추가!!!]
                                            //다시그리는 경우는 true.
                                            bool   pReDraw);

                //[2007.03.21.수][완료!!!]
                void __fastcall _EDIT_SelectAll(void);

                //[2009.05.08.금][완료!!!]
                void __fastcall _Edit_SelectX(//선택 시작 위치.
                                              int    pSelStartIndex,
                                              //선택 끝 위치.
                                              int    pSelEndIndex,
                                              //true 인경우는 항상 [선택 영역] 을 항상 보이는 위치에 있게 한다.
                                              bool   pSelView,
                                              //[선택영역] 의 [시작행] 을 반환한다.
                                              int   *rStartLineNumber,
                                              //[2009.05.07.목][추가!!!]
                                              //다시그리는 경우는 true.
                                              bool   pReDraw);

                //[2009.05.08.금][완료!!!]
                void __fastcall _Mouse_WordSelect(void);


                //[2011.07.19.화][완료!!!]
                void __fastcall _Select_CaretIndex(//<_select_start/_select_end> 만 사용한다.
                                                   struct GEditorEdit_CARETINFO  *pSelectX_CaretInfo,
                                                   //[입력지정자] 위치.
                                                   int                pCaretIndex);

            //}

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

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

                //[2011.06.06.월][완료!!!]
                void __fastcall _MOONJACONFIG_LineGet(int   pLINEstartindex,
                                                      int  *rLineEndIndex);

                //[2018.09.11.화][완료!!!]
                //사용자 정의 [예약어] 처리 추가중!!!
                void __fastcall _MoonjaConfig_LineGet_C(int   pLineStartIndex,
                                                        int  *rLineEndIndex);

                //[2011.06.06.월][완료!!!]
                void __fastcall _MoonjaConfig_LineGet_Gasm(int   pLineStartIndex,
                                                           int  *rLineEndIndex);

                //[2009.05.09.토][완료!!!]
                void __fastcall _MoonjaConfig_LineGet_Gcsm(int   pLineStartIndex,
                                                           int  *rLineEndIndex);

                //[2011.06.02.목][완료!!!]
                void __fastcall _MoonjaConfig_LineGet_Obj(int   pLineStartIndex,
                                                          int  *rLineEndIndex);

                //[2011.06.06.월][완료!!!]
                void __fastcall _MoonjaConfig_LineGet_Gtmp(int   pLineStartIndex,
                                                           int  *rLineEndIndex);

                //[2009.05.09.토][완료!!!]
                void __fastcall _MoonjaConfig_LineGet_Default(int   pLineStartIndex,
                                                              int  *rLineEndIndex);


                //[/* ... */ 주석문 관련]
                //{
                    //[VAR]
                    //{
                        //[2009.06.02.화][추가!!!]{-----------
                        //{/* ... */} 주석문 정보를 관리한다.
                        //}-----------------------------------

                        struct GCOMMENTBLOCK_INFO  _cmtBlockInfo;

                    //}

                    //[2012.05.09.수][완료!!!][중요수정!!!]
                    //[묶음주석] 이 변경되어 전체를 <_EditBuf_Text()> 로 다시 그릴
                    //필요가 있는 경우는 <true> 를 반환.
                    //[2012.06.14.목][완료!!!]
                    //[행] 정보가 수정된 것이 있다면 전체 다시 그리기.
                    bool __fastcall _CommentBlock_Info(//부분처리인 경우는 <true>.
                                                       bool  pPartInfo);

                    //[2009.06.02.화][완료!!!]
                    bool __fastcall _CommentBlock_Check_Word(int  pWordIndex);

                    //[2009.06.02.화][완료!!!]
                    //bool __fastcall _CommentBlock_SymbolCheck(char  *pStr,
                    //                                          //<pStr: NULL> 인 경우만 유효하다.
                    //                                          //문자열을 사용하는 경우는 그냥 0 을 준다(아무것이나 무관하다).
                    //                                          int    pStartIndex,
                    //                                          int    pEndIndex);

                //}

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

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

                //[2009.05.09.토][완료!!!]
                bool __fastcall _CARET_ViewAlways(//실제 적용하지 않고 확인만 하는 경우는 true.
                                                  bool  pSimulate);

                //[2009.05.08.금][완료!!!]
                bool __fastcall _Caret_ViewAlways_Middle(//항상 위쪽도 중간위 위치.
                                                         bool  pAlwaysTopMiddle,
                                                         //항상 아래쪽도 중간에 위치.
                                                         bool  pAlwaysBottomMiddle);

            //}

            //[클립보드관련]
            //{
                //[2007.03.06.화][완료!!!]
                bool __fastcall _CLIPBOARD_IsText(void);

                //[2007.03.07.수][완료!!!]
                void __fastcall _CLIPBOARD_Copy(void);

                //[2012.06.11.월][완료!!!]
                void __fastcall _CLIPBOARD_Cut(void);

                //[2019.03.08.금][완료!!!]
                void __fastcall _CLIPBOARD_Paste(void);

            //}

        //}

        //[묶음수평이동]
        //{
            //[2012.01.28.토][추가!!!]{-------------------------------------
            //[Ctrl + =>] 또는 [Ctrl + =>] 또는 전용 대화상자로 실행되는
            //선택영역에 포함되는 모든 행의 [수평이동] 에 대한 부분을 기술.
            //}-------------------------------------------------------------

            //[2012.02.07.화][완료!!!]
            bool __fastcall _LineBlock_MoveRL_Right(//추가할 공백수.
                                                    int  pSpaceCount);

            //[2012.03.03.토][완료!!!]
            bool __fastcall _LineBlock_MoveRL_Left(//삭제할 공백수.
                                                   int  pSpaceCount);

            //[수정이력 관련]
            //{
                //[2012.02.04.토][완료!!!]
                void __fastcall History_MoveRL_Right(//설정할 [입력지정자] 위치.
                                                     int  pCaretIndex,
                                                     //처리할 [시작행 시작위치].
                                                     int  pStartLineStartIndex,
                                                     //처리할 [끝행 시작위치].
                                                     int  pEndLineStartIndex,
                                                     //이동할 공백수.
                                                     int  pSpaceCount);

                //[2012.02.05.일][완료!!!]
                void __fastcall History_MoveRL_Left(//설정할 [입력지정자] 위치.
                                                    int  pCaretIndex,
                                                    //처리할 [시작행 시작위치].
                                                    int  pStartLineStartIndex,
                                                    //처리할 [끝행 시작위치].
                                                    int  pEndLineStartIndex,
                                                    //이동할 공백수.
                                                    int  pSpaceCount);

                //[2012.02.06.월][완료!!!]
                void __fastcall History_MoveRL_Add(//수평이동 종류('>', '<').
                                                   char  pKind,
                                                   //입력지정자 배치 위치(복구시 사용할 위치).
                                                   //[수평이동] 에서는 <pStartLineStartIndex> 와 같은값.
                                                   int   pCaretIndex,
                                                   //<시작행:시작위치>.
                                                   //이 위치는 수정 전/후 항상 같은 값으로 변하지 않는다.
                                                   int   pStartLineStartIndex,
                                                   //수정전 <끝행:시작위치>.
                                                   int   pEndLineStartIndex,
                                                   //수정후 <끝행:시작위치>.
                                                   int   pEndLineStartIndex_moved,
                                                   //이동할 간격.
                                                   int   pMoveCount);

            //}

        //}

        //[되돌림묶음 관리]
        //{
            //[!]{-----------------------------------------
            //[되돌림/되살림] 기능을 처리하는 함수를 선언.
            //}--------------------------------------------

            //[VAR]
            //{
                //[2009.05.02.토][추가!!!]
                struct GHISTORY  _history;

            //}

            //[수정이력 기본함수]
            //{
                //[2009.05.02.토][완료!!!]
                void __fastcall History_Init(void);

                //[2009.06.03.수][완료!!!]
                bool __fastcall History_CheckAndMake(void);

                //[2009.06.03.수][완료!!!]
                //[2012.02.05.일][정리!!!]
                //이 함수는 [일반적인 편집] 의 경우만 사용된다.
                //[수평이동] 의 경우는 별도의 함수군을 사용한다.
                void __fastcall History_Add(//추가('+')인지 삭제('-')인지 구분한다.
                                            char  pChangeKind,
                                            //[2009.05.06.수][추가!!!]
                                            //<c:문자>, <s:문자열> 인지 구분한다.
                                            char  pCharString);

                //[2012.06.11.월][완료!!!]
                void __fastcall History_UnDo(void);

                //[2012.06.11.월][완료!!!]
                void __fastcall History_ReDo(void);

                //[2012.06.13.수][완료!!!]
                void __fastcall History_SetCaretPos(//[입력지정자] 위치.
                                                    int    pCaretIndex,
                                                    //[입력지정자] 를 항상 보이는 위치에 두기:true.
                                                    bool   pCaretView);

                //[2009.05.08.금][완료!!!]
                void __fastcall History_SelectX(//선택 시작 위치.
                                                int    pSelStartIndex,
                                                //선택 끝 위치.
                                                int    pSelEndIndex,
                                                //true 인경우는 항상 [선택 영역] 을 항상 보이는 위치에 있게 한다.
                                                bool   pSelView,
                                                //[선택영역] 의 [시작행] 을 반환한다.
                                                int   *rStartLineNumber,
                                                //다시 그려줄지(true)/말지(false)를 결정한다.
                                                bool   pReDraw,
                                                //[2009.05.08.금][추가!!!]
                                                //[입력지정자] 위쪽 보기 설정.
                                                bool   pAlwaysTopMiddle,
                                                //[입력지정자] 아래쪽 보기 설정.
                                                bool   pAlwaysBottomMiddle);

            //}

            //[수정이력 특수 처리 함수]
            //{
                //[2012.02.05.일][정리!!!]{---------------------------------------
                //[수평이동] 관련 [수정이력] 함수를 추가하면서, 기존의 [수정이력]
                //처리관련 특수 함수들을 구분할 필요가 있어 별도로 묶어 놓는다.
                //}---------------------------------------------------------------

                //[2009.05.02.토][완료!!!]
                void __fastcall History_SelectDelete(void);

                //[2012.06.01.금][완료!!!]
                void __fastcall History_Insert(char  *pInsertStr,
                                               //[2009.05.07.목][추가!!!]
                                               //다시그리는 경우는 true.
                                               bool   pReDraw);

                //[2009.05.05.화][완료!!!]
                void __fastcall History_FileSave(char  *pFileFullName);

                //[2009.05.05.화][완료!!!]
                void __fastcall History_FileOpen(char  *pFileFullName);


                //[2009.05.15.금][완료!!!]
                void __fastcall History_EditFileSave(void);

                //[2009.05.05.화][완료!!!]
                void __fastcall History_EditFileOpen(void);


                //[2009.05.05.화][완료!!!]
                void __fastcall History_FileDelete(char  *pFileFullName);

            //}

        //}

        //[검증판]
        //{
            //[2007.04.08.일][추가!!!]{---------------------------------------------
            //[검증판] 은 별도의 bmp 만 가지고 관리되고, 그려진 것을 다시 _bmp_ 에
            //복사하여 전체를 완성하는 방식으로 사용된다.
            //이는 [수직 줄이동] 시에 완벽하게 [편집기] 와 동기화 하기 위한 것이다.
            //}---------------------------------------------------------------------

            //[VAR]
            //{
                //[2012.06.08.금][수정!!!]{------------------------------------------------
                //<_bmp_> 와 같이 수시로 [편집기:높이] 에 따라 크기가 변경된다.
                //크기는 수시로 변경되지 않기 때문에 그리기 속도를 보다 고속화 하기 위하여
                //꼭 필요한 크기로 항상 조정되도록 한다.
                //}------------------------------------------------------------------------
                
                Graphics::TBitmap  *_bmp_debug;

                //[내부 사용 그림]
                //{
                    //복사할때는 투명속성을 지정해 주어야 한다.

                    //[정지점]
                    Graphics::TBitmap  *_bmp_breakpoint_;

                    //[2018.09.11.화][추가!!!]{******************************************
                    //[정지점:행] 의 배경행을 만드는데 사용.
                    //이전에 그냥 행을 칠하는 방식에서 [편집기:배경] 을 [반투명] 하게
                    //보여주는 방식으로 반경해서 필요.
                    //여기에 [줄이동자:막대배경] 과 같이 [교차점] 으로 그린후, 이 그림을
                    //그대로 [정지점] 행에 [투명(투명색:흰색)] 복사 하는 방식을 사용.
                    Graphics::TBitmap  *_bmp_BreakPointLine_;
                    //}******************************************************************

                    //[실행 지정자]
                    Graphics::TBitmap  *_bmp_run_arrow_;

                //}

                //scroll 을 해주기 위하여 사용하는 가상 기준 y.(BASE : 0)
                int                 _scroll_y;

                //[실행지정자] 의 표시 [유/무] 를 결정한다.(BASE : false)
                bool                _run_arrow_visible;

                //[실행지정자] 의 위치 행을 저장한다.(scroll 을 위한 복사 값.)
                int                 _run_arrow_line;
            //}

            //[함수]
            //{
                //[2018.09.11.화][완료!!!]
                void __fastcall _DEBUG_Init(void);

                void __fastcall _DEBUG_Shape(void);
                void __fastcall _DEBUG_BreakPoint(void);

                //[2018.09.04.화][완료!!!]
                void __fastcall _DEBUG_RunArrow(int   pLINEnumber,
                                                bool  pSELFdraw);
                void __fastcall _DEBUG_RunArrow_Show(void);
                void __fastcall _DEBUG_RunArrow_Hide(void);
                void __fastcall _DEBUG_Scroll(int  pPOSITION);
                void __fastcall _DEBUG_Draw(void);

                //[2012.08.19.일][완료!!!]
                void __fastcall _DEBUG_Indicator_Hide(void);

            //}

        //}

        //[정지점]
        //{
            //[정지점] 은 각각의 문서마다 독립적으로 관리된다.

            //[VAR]
            //{
                //[2007.04.12.목][추가!!!]
                //[정지점] 을 관리하기 위한 구조체를 만든다.
                //이는 각각의 문서마다 전부 개별적으로 관리된다.
                struct GBREAKPOINT  _breakpoint;
                int                 _breakline_color;

                //[2018.09.11.화][추가!!!]{***********************************************
                //<_BREAKPOINT_Edit_Draw()> 에서 [정지점:행] 을 <_bmp_BreakPointLine_> 에
                //그리기 전에 현재 <_breakline_color> 를 저장한다.
                //이는  색이 변경되는 경우 이를 비교하고 다시 그려주기 위한 것.
                //다시 그리기에 시간이 걸리므로 변경시 [한번] 만 그리기 위한것.
                int                 _breakline_color_Save; //(기본값: -1)
                //}***********************************************************************

                //[정지점 설정 상태]
                //{
                    //[정지점] 의 [유/무효] 상태에 따라서 적용되는 비트맵을 다르게 하기 위한 것이다.

                    #define  d_Editor_BreakPoint_Enable    1 //[정지점] 유효.
                    #define  d_Editor_BreakPoint_Disable   0 //[정지점] 무효.

                //}

            //}

            //[함수]
            //{
                //[2007.04.12.목][완료!!!]
                void __fastcall _BREAKPOINT_Init(struct GBREAKPOINT  *pBREAKpoint);

                int __fastcall _BREAKPOINT_Search(int  pLINEnumber);

                bool __fastcall _BREAKPOINT_Add(int  pLINEnumber);

                void __fastcall _BREAKPOINT_Delete(int  pLINEnumber);

                void __fastcall _BREAKPOINT_DebugPanel_Draw(bool pERASEback,
                                                            int  pLINEnumber);

                //[2012.08.19.일][완료!!!]
                void __fastcall _BREAKPOINT_Set(//지정 위치.
                                                //[2012.08.19.일][중요수정!!!]{----------------------------------
                                                //이 <pPosX, pPosY> 두개 인수는 [맷돌C] 용 [그림부품] 에서는
                                                //필요가 없다. 단, 원본과의 혼란을 막기 위하여 남겨 놓는다.
                                                //실제 내부적으로는 사용되지 않기 때문에 사용시에는 <0> 을 할당.
                                                int  pPosX,
                                                int  pPosY,
                                                //}--------------------------------------------------------------
                                                int  pLINEnumber);

                //[2018.09.11.화][완료!!!]
                void __fastcall _BREAKPOINT_Edit_Draw(int  pLINEnumber);

                //[2007.04.15.일][완료!!!]
                void __fastcall _BREAKPOINT_Edit_DrawAll(void);

                //[2007.04.16.월][완료!!!]
                void __fastcall _BREAKPOINT_Edit_Verify_Draw(int  pLINEnumber);

                //[2007.04.16.월][완료!!!]
                void __fastcall _BREAKPOINT_Edit_StartLine_Draw(int  pLINEnumber);

                //[2009.04.29.수][완료!!!]
                void __fastcall _BREAKPOINT_Bmp(int  pBmpIndex);

            //}

        //}

        //[편집기 바탕 설정]
        //{
            //[2007.12.04.화][완료!!!]
            void __fastcall _BACKBMP_Brightness(int  pBrightness);

            //[2018.07.31.화][완료!!!]
            void __fastcall _BACKBMP_ChangeJpeg(AnsiString  pJpegFilePath);

        //}

        //[부가함수]
        //{
            //[2007.12.03.월][완료!!!]
            void __fastcall _Debug_BreakPoint_RePaint(void);

            //[2007.12.03.월][완료!!!]
            //void __fastcall _Debug_Arrow_RePaint(void);

            //[2011.05.06.금][완료!!!]
            void __fastcall _CtrlAltMouse_ScrollAreaDotLine(void);

            //[2012.08.14.화][완료!!!]
            void __fastcall _VLine(void);
            //{
                //[2012.06.09.토][추가!!!]
                //<_VLine()> 함수 [유/무효] 선택.
                //<Ctrl+G> 가 눌릴때는 항상 <true> 로 설정.
                bool  _sw_VLine; //(기본값:true);

            //}

        //}

        //[찾기 대화상자 관련]
        //{
            //[2019.01.09.수][완료!!!]
            void __fastcall _FindDialog_Show(void);

        //}

        //[책갈피 대화상자]
        //{
            //[2012.03.01.목][추가!!!]{-------------------------------------------------
            //[2012.03.03.토][주의!!!]--------------------------------------------------
            //<bookMark_DialogBox.cpp> 에 [전역변수] 로 선언된 <_bookMark_DialogBox> 이
            //[편집기] 보다 먼저 [삭제] 된다는 것에 주의!!!
            //}-------------------------------------------------------------------------

            //class BookMark_DialogBox  *_bookMark_DialogBox;

        //}


};

//---------------------------------------------------------------------------
extern PACKAGE TGEditorEdit_Form *GEditorEdit_Form;
//---------------------------------------------------------------------------

#endif
