//---------------------------------------------------------------------------

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


#include  "font.h"
#include  "c_define.h"
#include  "ide_popup.h"

//[2012.04.10.화][추가!!!]
#include  "GScrollV.h"

//[2012.05.06.일][추가!!!]
#include "str_heap.h"

//[2012.05.20.일][추가!!!]
#include "str_conf.h"
#include <ExtCtrls.hpp>

//[2012.05.25.금][추가!!!]
#include "ide_hint.h"


struct  INFOTREE_ITEM
{
  //[2006.11.16.목][생성!!!]{------------
  //tree 에서 항목 하나의 정보를 갖는다.
  //}------------------------------------

  //종류를 구분한다. (BASE : '.')
  char   kind;
  //{
      //'+' : 펼칠수 있는 옹이.
      //'-' : 이미 펼쳐진 옹이.
      //'.' : 단순 개별 항목.
      //반드시 이 3개중 하나를 갖는다.
  //}

  //[줄기] 의 단계를 가진다.(BASE : 0)
  //0 은 [뿌리] 가 되며, 값이 클수록 level 이 낮은 것이다.
  int    level;

  //[항목] 을 내부적으로 구분하는 이름.(중복될수 없다.)
  char   name[OPT_name_length];

  //[!]{------------------------------------------------------------------------------
  //[항목] 을 표시하는 문자열.(중복될수 있다.)
  //
  //[2012.05.06.일][중요수정!!!]------------------------------------------------------
  //<STRHEAP> 상의 위치 <index> 값으로 수정.
  //계속 동적 [생성/삭제] 를 반복하지 않고 [문자열 저장소] 를 별도로 관리하기 위한것.
  //<item> 자체가 [동적 생성] 개체이고 이 안의 <txt> 도 [동적 생성] 개체인 경우
  //<item> 을 [삭제] 시 <txt> 도 같이 삭제되거나 불확정되는 문제가 발생.
  //아예 별도 관리하는 것으로 한다.
  //
  //[STRHEAP] 상에서 문자열을 관리하는 [목록 번호(index)] 가 된다.
  //반드시 초기값은 <-1> 로 [목록없음] 으로 초기화.
  int  txt; //(기본값 : -1)
  //}---------------------------------------------------------------------------------

  //[항목-엄지그림] 의 순번을 저장한다.
  int    bmpindex;

  //[추가정보]
  //{
      //[중요!!!]//[2009.01.25.일][추가!!!]{----------------------------------------------------
      //{DATABASE} 상의 record-index 를 관리한다.
      //이는 [항목] 을 선택한 경우 해당 정보가 있는 문서를 열고 정보를 지정해 주기 위한 것이다.
      //다양한 정보를 보여 주어야 하므로 바로 찾을수 있도록 {DATABASE} 와 연동하기 위한 것이다.
      //(BASE : -1)
      //}---------------------------------------------------------------------------------------

      //[2011.07.10.일][수정!!!]
      //<dbRecIndex> 에서 일반적인 [부가정보] 로 번호를 매겨 관리하는 것으로 수정한다.
      //이는 [검증식 보기] 기능이 추가되므로 이를 위한 부가정보를 [공용] 으로 사용하기 위한 것이다.
      int  info1; //(기본값 : -1)
      //{
          //[Tree:설계정보]    : 해당 항목의 {DATABASE} 상의 <recindex>.
          //[Tree:검증식 보기] : 추가된 [검증식] 이 존재하는 함수영역정보({DATABASE} 상의 <funcrecindex>).
          //                     실제 [검증식 계산] 에서는 사용되지 않는다.
          //                     사실상 불필요한 정보다.
          //                     실제 [검증식 계산] 에는 [현재 검증중인 함수위치] 가 사용된다.
          //                      <debug.cpp:_debug_FuncRecIndex> 변수 정보를 사용한다.

      //}

      //[2011.07.10.일][추가!!!]
      //[Tree:검증식 보기] 항목의 추가 정보를 위한것.
      int  info2; //(기본값 : -1)
      //{
          //[Tree:검증식 보기] : 추가된 [검증식] 이 존재하는 문서번호({DATABASE} 상의 <filelistindex>).

          //[참고!!!]{-----------------------------------------------------------------------------
          //[검증식] 에서 [문서번호] 는 반드시 필요한데, [검증식] 에 사용된 <#define 정의 이름> 을
          //처리하기 위하여 반드시 필요하다.
          //}--------------------------------------------------------------------------------------

      //}

      //[2011.07.11.월][추가!!!]
      int  info3; //(기본값 : -1)
      //{
          //[Tree:검증식 보기] : [검증식] 의 해당 문서상 [시작 위치].

      //}

      //[2011.07.11.월][추가!!!]
      int  info4; //(기본값 : -1)
      //{
          //[Tree:검증식 보기] : [검증식] 의 해당 문서상 [끝 위치].

      //}

      //[2011.07.18.월][추가!!!]
      char info5; //(기본값 : 16)
      //{
          //[Tree:검증식 보기:검증식값 항목] : [10/16/2 진수] 표기 방식.
          //                  짓접 숫자로 10, 16, 2 값을 사용한다.

      //}

  //}

};

struct  INFOTREE_ITEMXY
{
  //[2006.11.20.월][생성!!!]{----------------------------------------------
  //tree 의 item 하나를 그려주는데 필요한 각각의 중요 좌표정보를 관리한다.
  //}----------------------------------------------------------------------

  //[계산에 필요한 기본정보]
  //{
      //절대 정보로 한번만 설정하면 된다.

      //tree 자체의 기준 원점. (BASE : 0)
      int  tree_x;
      int  tree_y;

      //행의 높이(문자 높이와 같다.)
      int  line_height;
  //}

  //[지정 기본 정보]
  //{
      //그려줄 item 의 정보에 따라 수정된다.

      //그려줄 지정 행.(BASE : 0)
      int  line_number;

      //item 의 줄기 단계.(BASE : 0)
      int  item_level;
  //}

  //[계산 결과 좌표]
  //{
      //item 을 그릴 영역 전체의 기준 원점.
      int  org_x;
      int  org_y;

      //[엄지그림] 의 출력 좌표.
      int  icon_x;
      int  icon_y;

      //[엄지그림] 의 내부 중심점.
      int  icon_middle_x;
      int  icon_middle_y;

      //[엄지그림] 위 점 좌표.
      int  icon_top_x;
      int  icon_top_y;

      //[엄지그림] 오른 점 좌표.
      int  icon_right_x;
      int  icon_right_y;

      //[엄지그림] 아래 점 좌표.
      int  icon_bottom_x;
      int  icon_bottom_y;

      //[그림영역] 세로선 윗점 좌표.
      int  vline_top_x;
      int  vline_top_y;

      //[그림영역] 세로선 아래점 좌표.
      int  vline_bottom_x;
      int  vline_bottom_y;

      //[그림영역] 가로선 오른점 좌표.
      int  hline_right_x;
      int  hline_right_y;

      //문자열 출력 위치 좌표.([항목-엄지그림] 이 없는 경우)
      int  text_x;
      int  text_y;

      //문자열 출력 위치 좌표.([항목-엄지그림] 이 있는 경우)
      int  text2_x;
      int  text2_y;

      //[항목-엄지그림] 의 표시 좌표.
      int  item_icon_x;
      int  item_icon_y;

      //행의 중심 위 높이.
      int  mh;
      //행의 중심 아래 높이.
      int  ml;
  //}

};

struct  INFOTREE
{
  //[2006.11.16.목][생성!!!]{--------------------------------------------------------------
  //tree 한개를 그려줄 정보를 갖는다.
  //이 구조체 정보를 사용하여 한개의 tree 를 완성할수 있다.
  //
  //[2009.09.13.일][중요수정!!!]-----------------------------------------------------------
  //<items> 를 고정배열로 하지 않고 동적생성할수 있도록 수정한다.
  //이는 메모리를 낭비하지 않고, 사용자의 소스에 다라 정보량이 많을수 있으므로
  //이 정보에 따라 재생성하기 위한 것이다.
  //기본 1000 개로 설정하돼 크기를 넘는 경우는 다시 더 큰 크기로 동적 생성할수 있도록한다.
  //}--------------------------------------------------------------------------------------

  //[2009.09.13.일][중요수정!!!]{------------
  //동적 생성을 위한 것으로 포인터로 바꾼다.
  struct INFOTREE_ITEM  *items;
  //}----------------------------------------

  //[Tree 크기]
  //{
      //[2009.09.13.일][추가!!!]{----------------------------------------------------
      //현재 tree 의 관리할수 있는 <item> 의 최대수를 가진다(실제적인 tree 의 크기).
      //동적 생성되므로 해당 크기정보를 계속 여기에 기록하여 관리해야 한다.
      //}----------------------------------------------------------------------------

      int  size;

  //}

  //현재 등록돼 있는 [항목] 수.
  int               items_count;

  //[level open/close]
  //{
      //------------------------------------------------------------------------
      //각각의 level 의 open/close 를 갖는다.
      //각각의 bit 는 각각의 level 에 대응하므로 총 32 개 줄기를 판별할수 있다.
      //1 : open.
      //0 : close.
      unsigned int     level_open_close_bit;
      //이 정보는 tree 를 그릴때 줄기를 그려주기 위하여 필요하다.
      //즉, 그려줄때만 일시적으로 필요하다.
      //
      //[2012.06.03.일][주의!!!]------------------------------------------------
      //이 각 비트는 각 항목의 [+/-] 상태를 말하는 것이 아니라 [세로줄기] 가
      //[계속 되는가/끊어졌는가] 를 구분하기 위한 것이다.
      //즉, [세로줄기] 를 그리는데 필요한 정보로 각 항목의 [+/-] 와는 무관.
      //------------------------------------------------------------------------
  //}

  //[선택관련]
  //{
      //--------------------------------------------------------------------------------------------
      //이 tree 에서 선택된 행.(실제적인 원인이 된다.)
      //(BASE : -1)
      int  select_line;

      //select_line 의 결과로 _TreeView() 함수로 그리면서 얻어지는 실제 선택된 [항목] 의 itemindex.
      //이는 결과적인 값이 된다.
      //(BASE : -1)
      int  select_itemindex;
      //--------------------------------------------------------------------------------------------
  //}

  //그린후 마지막 행을 기록한다.
  //이는 아래의 무효 영역을 선택한 경우 선택을 해제하기 위하여 사용된다.
  int  last_line;

  //[2009.02.01.일]
  //{
      //[힝목] 을 [삭제] 하는 경우 아래의 정보를 수정해 주어야 한다.
      //
      //items_count      : [삭제] 된 수 만큼 수정해 주어야 한다.
      //select_line      : 무조건 -1 로 초기화.
      //select_itemindex : 무조건 -1 로 초기화.
      //
      //[선택] 과 관련된 정보는 관리를 하느니 아예 -1 로 초기화 해버리는 것이 좋다.

  //}

  //[STRHEAP 관련]
  //{
      //[2012.05.06.일][추가!!!]{-----------------------------------------
      //[문자열] 은 [STRHEAP] 으로 별도 관리.
      //작은 동적 생성으로 인한 부하를 줄이고 관리를 쉽게 하기위한것.
      //기본 크기는 <d_STRHEAP_Heap_addSize>, <d_STRHEAP_List_addSize> 의
      //[재생성] 시 추가 크기 증가분 정도면 충분하다.
      //
      //반드시 한번만 초기화 해야 한다.
      //}-----------------------------------------------------------------

      struct STRHEAP  _strHeap;

  //}

};


class Tinfo_tree_Form : public TForm
{
__published:	// IDE-managed Components

        void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
        void __fastcall FormMouseWheel(TObject *Sender, TShiftState Shift,
          int WheelDelta, TPoint &MousePos, bool &Handled);
        void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y);
        void __fastcall FormDblClick(TObject *Sender);
        void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
    void __fastcall FormResize(TObject *Sender);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall FormHide(TObject *Sender);

private:	// User declarations
public:		// User declarations

        __fastcall Tinfo_tree_Form(TComponent* Owner);

        //[2012.05.25.금][완료!!!]
        __fastcall ~Tinfo_tree_Form(void);

        //[서브클래싱]
        //{
            //[2012.05.27.일][완료!!!]
            void __fastcall WndProc(Messages::TMessage &Message);

        //}

        //[VAR]
        //{
            //[환경변수]
            //{
                //[2007.10.02.화][추가!!!]
                struct  IDE_OPTION  *_ide_option;

            //}

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

            //}

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

            //}

            //사용 폰트를 적용한 한 행의 높이.
            int  _line_height;

            //[tree]
            //{
                //item 을 그릴때 사용하는 좌표정보.
                //고정 기본값은 초기화 한뒤 사용한다.
                struct  INFOTREE_ITEMXY  _item_xy;

                //[bmp]
                //{
                    //[!]{-------------------------------------------------------------------------------
                    //tree 를 만들기 위한 여러 작은 그림들.
                    //처리 속도를 빠르게 하기 위하여 그리지 않고 바로 복사할수 있도록 그림을 사용한다.
                    //이그림을 copy 할때는 별도의 gui 함수로 clBlack 부분으로 색이 있는 부분만 copy 하여
                    //배경이 비치도록 해야 한다.
                    //}----------------------------------------------------------------------------------

                    Graphics::TBitmap  *_bmp_tree_p,   //'+'
                                       *_bmp_tree_m,   //'-'
                                       *_bmp_tree_i,   //'.'
                                       *_bmp_tree_3,   //3방향 줄기.
                                       *_bmp_tree_end, //줄기 끝.
                                       *_bmp_tree_x;   //[뿌리] 이나 하위항목이 없는 초기상태의 경우.

                //}

                //[항목 bmp]
                //{
                    //각 항목을 대표하는 [엄지그림].
                    #define  d_ITEMBMP_max  18
                    Graphics::TBitmap  *_bmp_item[d_ITEMBMP_max];
                    //{
                        #define  d_ITEMBMP_root        0
                        #define  d_ITEMBMP_define      1
                        #define  d_ITEMBMP_function    2
                        #define  d_ITEMBMP_global      3
                        #define  d_ITEMBMP_struct      4
                        #define  d_ITEMBMP_struct_def  5
                        #define  d_ITEMBMP_union       6
                        #define  d_ITEMBMP_union_def   7
                        #define  d_ITEMBMP_item        8
                        #define  d_ITEMBMP_folder      9
                        #define  d_ITEMBMP_file_c      10
                        #define  d_ITEMBMP_file_h      11
                        #define  d_ITEMBMP_file_x      12
                        #define  d_ITEMBMP_api         13
                        //[검증식 보기창] 을 위한 것.
                        #define  d_ITEMBMP_dbgExp      14 //검증식.
                        #define  d_ITEMBMP_dbgValue    15 //검증식 값.
                        //[가상기계] 항목을 추가.
                        #define  d_ITEMBMP_gvms        16 //GVMS.
                        #define  d_ITEMBMP_gvmx        17 //GVMX.

                    //}

                //}

                //[tree]
                //{
                    //[2012.04.09.월][수정!!!]{------------------------
                    //<tree_tree_Form> 과 달리 일반적인 그림부품이므로
                    //한개만 있으면 된다.
                    //}------------------------------------------------

                    struct INFOTREE  _tree;

                //}

            //}

            //[바탕색]
            //{
                //[2012.04.09.월][추가!!!]
                int  _backColor;

            //}

        //}

        //[내부 사용 개체]
        //{
            //[빠른목록]
            //{
                Tide_popup_Form  *_popupMenu;

                //[함수]
                //{
                    //[2012.05.30.수][완료!!!]
                    void __fastcall _PopupMemu_Set(void);

                    //[2012.06.02.토][완료!!!]
                    void __fastcall _EVENT_PopupMenu(void);

                    //[빠른 항목 처리]
                    //{
                        //[2012.04.14.토][완료!!!]
                        void __fastcall _PopupMenu_Item_AlphaBlendValue(void);

                        //[2012.04.14.토][완료!!!]
                        void __fastcall _PopupMenu_Item_Brightness(void);

                    //}

                //}

            //}

            //[수직 줄이동자]
            //{
                //[2012.04.10.화][추가!!!]
                TGScrollV_Form  *_scrollV;

            //}

            //[크기조정 관련]
            //{
                //[2012.04.13.금][추가!!!]{------------------------
                //이는 [크기조정] 용이므로 항상 위치를 알고 있어야
                //하므로 별도로 관리한다.
                //}------------------------------------------------

                //오른쪽 아래 사각형 영역정보.
                TRect  _rbRect;

                //[화면지정자] 의 [크기조정자] 내부 위치.
                POINT  _mouseDownPoint;

            //}

            //[환경 정의]
            //{
                //왼쪽 아래 모서리 [폭/높이] 지정.
                #define  d_lbEdge    10

            //}

            //[부가정보]
            //{
                //[2012.05.14.월][추가!!!]{------------------------------------
                //[키] 조작으로 사라지는 경우는 <true>.
                //<FormShow()> 이벤트에서 반드시 <false> 로 설정.
                //이는 [편집기] 에서 <infoTree> 의 [선택항목] 을
                //<키:Space> 로 현재 [입력지정자] 위치 단어로 [교체] 하는 경우
                //<WM_CHAR> 부분에서 [공백] 이 뒤에 추가되는 것을 막기 위한것.
                //
                //<WM_CHAR> 부분에서 처리후 다시 <false> 로 초기화 된다.
                //<WM_CHAR> 처리부 설명 참고.
                //
                //[주의!!!]----------------------------------------------------
                //<키:Space> 처리 관련에서만 필요하다.
                //}------------------------------------------------------------
                
                bool  _hideByKey; //(기본값:false)

            //}

            //[귀뜸말]
            //{
                //[2012.05.25.금][추가!!!]{----------------------------------------
                //[Tree] 의 경우는 각각 [귀뜸말] 을 가지는 것이 더 효과적이다.
                //이는 [Tree] 계통인 [실시간 선언 정보판] 과 여러 기능이 혼선이
                //오기 때문에 아예 각각 독립적인 [귀뜸말] 을 사용하는 것으로 한다.
                //}----------------------------------------------------------------

                //[VAR]
                //{
                    Tide_hint_Form  *_hint;

                //}

                //[동작함수]
                //{
                    //[2012.06.29.금][완료!!!]
                    void __fastcall _EVENT_TitleDown_hint(void);

                //}

            //}

            //[화면 지정자 위치]
            //{
                //[2012.05.26.토][추가!!!]{----------------------------------
                //[화면지정자] (x, y) 위치를 관리.
                //[화면지정자] 위치가 변경된 경우만 <MouseMove()> 에서
                //해당 처리를 수행하기 위한것.
                //
                //[키] 로 동작시 나오는 [귀뜸말] 의 중복 출력을 막기 위한것.
                //}----------------------------------------------------------

                int  _mouseX, _mouseY; //(기본값:-1)

            //}

            //[이전 선택 항목]
            //{
                //[2012.06.04.월][추가!!!]{----------------------------------------------
                //<FormMouseMove()> 에서 [항목] 의 귀뜸말 이 [중복] 출력 되지 않도록
                //이전 선택 항목 위치를 기록.
                //<_mouseX/_mouseY> 는 <1pixel> 변화까지 처리되므로 대단히 민감해 진다.
                //따라서 항목단위로 처리 하기 위한변수가 필요.
                //<FormMouseMove()> 의 첫 부분에서 <_Get_ItemIndex_withLINE()> 으로 항상
                //현재 [화면지정자위치] 값이 얻어 지므로 이 값을 사용.
                //}----------------------------------------------------------------------

                int  _bfItemSelIndex; //(기본값 : -1)

            //}

        //}

        //[FUNCTION]
        //{
            void __fastcall _Draw(void);

            //[2012.06.05.화][완료!!!]
            void __fastcall _Width(int   pWidth,
                                   //[2012.06.05.화][추가!!!]
                                   //[다시 그리기] 하는 경우는 <true>.
                                   bool  pRePaint);

            //[2012.06.05.화][완료!!!]
            void __fastcall _Height(int   pHeight,
                                    //[2012.06.05.화][추가!!!]
                                    //[다시 그리기] 하는 경우는 <true>.
                                    bool  pRePaint);

            //[2012.04.12.목][완료!!!]
            void __fastcall _FormCut(void);

            //[INFOTREE 관련]
            //{
                //[2012.04.13.금][완료!!!]
                void __fastcall _TreeView(bool  pCONTROL,
                                          //내부 <_FormCut()> 을 처리할지(true) 말지(false)를 결정.
                                          bool  pFormCut);

                //[2012.06.04.월][완료!!!]
                void __fastcall _Tree(struct INFOTREE  *pTREE,
                                      bool          pCONTROL);

                //[2012.05.06.일][완료!!!]
                void __fastcall _Item_Init(struct INFOTREE_ITEM  *pTREEitem);



                //[2012.05.06.일][완료!!!]
                void __fastcall _Item_Txt(struct INFOTREE_ITEM  *pTreeItem,
                                          char                  *pTxt);

                //[2012.05.06.일][완료!!!]
                char * __fastcall _Item_Txt_StrPtr(//[항목] 번호.
                                                   int  pItemIndex);

                //[2012.05.06.일][완료!!!]
                char * __fastcall _Item_Txt_StrPtr2(//[txt:목록번호].
                                                    int  pTxt);

                //[2012.05.06.일][완료!!!]
                //[STRHEAP] 까지 삭제된다.
                void __fastcall _Tree_Delete(struct INFOTREE  *pTree);

                //[2012.05.06.일][완료!!!]
                //[STRHEAP] 까지 생성된다.
                //내부적으로 기존 생성된 것을 [삭제] 하지 않고 [생성] 만 한다.
                void __fastcall _Tree_Create(struct INFOTREE  *pTree,
                                             //생성할 크기(관리할 항목 총수).
                                             int           pSize);

                //[2012.05.06.일][완료!!!]
                //[STRHEAP] 는 그대로 유지.
                void __fastcall _Tree_ReSize(struct INFOTREE  *pTree);


                //[2012.05.06.일][완료!!!]
                //실제 외부에서 [Tree] 초기화시 이 함수만 사용한다.
                //내부적으로 [삭제]=>[기본크기 생성] 까지 자동 처리.
                void __fastcall _Tree_Init(struct INFOTREE  *pTREE,
                                           //[2009.09.13.일][추가!!!]
                                           //초기화시 저장소 크기를 지정할수 있게 한다.
                                           int               pSize);

                //[2012.05.07.월][완료!!!]
                //<infoTree> 에만 존재.
                //현재 생성된 것을 비우기(초기화)만 한다.
                //내부에 사용된 [STRHEAP] 역시 [재생성] 없이 초기화만 한다.
                void __fastcall _Tree_Clear(struct INFOTREE  *pTree);


                //[2009.09.13.일][완료!!!]
                void __fastcall _Tree_Add_Item(struct INFOTREE      *pTREE,
                                               struct INFOTREE_ITEM  *pITEM);

                //[2011.05.16.월][완료!!!]
                //지정 <name> [옹이] 에 해당 항목을 등록한다.
                bool __fastcall _Tree_Add_NodeItem(struct INFOTREE      *pTREE,
                                                   char             *pNODEname,
                                                   struct INFOTREE_ITEM  *pITEM,
                                                   //[2011.05.07.토][추가!!!]
                                                   //추가한 항목의 [절대위치] 를 반환한다.
                                                   int              *rItemIndex);

                //<name> 에 해당하는 [항목] 의 [절대위치] 를 찾는다.
                void __fastcall _Tree_Get_ItemIndex_withNAME(struct INFOTREE  *pTREE,
                                                             char         *pITEMname,
                                                             int          *rITEMindex);

                //[2012.05.06.일][완료!!!]
                //<text> 에 해당하는 [항목] 의 [절대위치] 를 찾는다.
                void __fastcall _Tree_Get_ItemIndex_withText(struct INFOTREE  *pTree,
                                                             char         *pItemText,
                                                             int          *rItemIndex);

                void __fastcall _Tree_Get_NodeInfo(struct INFOTREE  *pTREE,
                                                   //지정 [옹이] 의 [이름].
                                                   char         *pNODEname,
                                                   //지정 [옹이] 의 tree 상에서의 item-index.
                                                   int          *rNODEindex,
                                                   //지정 [옹이] 의 순수한 직계 [가지] 의 마지막 item-index.
                                                   int          *rNODEendITEMindex,
                                                   //지정 [옹이] 의 가장 마지막 [가지] 의 item-index.
                                                   int          *rNODElastITEMindex);

                void __fastcall _Tree_Make_InsertPosition(struct INFOTREE  *pTREE,
                                                          //끼워넣을 위치.(이 공간을 비워야 한다.)
                                                          int           pINSERTindex);

                void __fastcall _Tree_Get_XY(struct INFOTREE_ITEMXY  *prITEMxy);

                //[2012.06.01.금][완료!!!][중요수정!!!]
                void __fastcall _Tree_Get_Node_LastItemIndex(struct INFOTREE  *pTREE,
                                                             //지정 [옹이] 의 index.
                                                             int           pNODEindex,
                                                             //지정 [옹이] 의 순수한 직계 [가지] 의 마지막 item-index.
                                                             int          *rNODEendITEMindex,
                                                             //지정 [옹이] 의 가장 마지막 가지의 item-index.
                                                             int          *rNODElastITEMindex);

                //[2012.06.01.금][완료!!!][중요수정!!!]
                void __fastcall _Tree_Get_Node_LastItemIndex2(struct INFOTREE  *pTree,
                                                              //지정 [옹이] 의 name.
                                                              char         *pNodeName,
                                                              //이 [옹이] 의 <itemindex> 를 반환한다.
                                                              int          *rNodeItemIndex,
                                                              //지정 [옹이] 의 순수한 [직계 가지] 의 마지막 item-index.
                                                              int          *rNodeJikgyeLastItemIndex,
                                                              //지정 [옹이] 의 가장 마지막 가지의 item-index.
                                                              int          *rNodeLastItemIndex);


                //[2012.05.08.화][완료!!!]
                void __fastcall _Tree_Get_ThisItemNode_LastItemIndex(struct INFOTREE  *pTREE,
                                                                     //지정 itemindex.
                                                                     int           pITEMindex,
                                                                     //[2009.02.02.월][추가!!!]
                                                                     int          *rNodeIndex,
                                                                     //지정 [옹이] 의 순수한 직계 [가지] 의 마지막 item-index.
                                                                     int          *rNODEendITEMindex,
                                                                     //이 itemindex 를 포함하는 [옹이] 의 마지막 itemindex.
                                                                     int          *rNODElastITEMindex);

                void __fastcall _Tree_Bmp_Create_Load(Graphics::TBitmap **pBITMAP,
                                                      AnsiString          pBMPname);

                //[2006.12.08.금][완료!!!]
                void __fastcall _Get_ItemIndex_withLINE(struct INFOTREE    *pTREE,
                                                        int             pLINEnumber,
                                                        int            *rITEMindex,
                                                        int            *rTEXTx,
                                                        int            *rTEXTy);

                //[2012.05.08.화][완료!!!]
                void __fastcall _Get_LineNumber_withItemIndex(struct INFOTREE  *pTree,
                                                              int               pItemIndex,
                                                              int              *rLineNumber);


                //[2006.12.11.월][완료!!!]
                int __fastcall _Get_ViewLineCount(struct INFOTREE  *pTREE);

                //[2009.01.27.화][완료!!!]
                //해당 [옹이] 에 소속된 [직계가지] 의 개수를 반환한다.
                void __fastcall _Tree_Get_Node_ItemCount(struct INFOTREE  *pTree,
                                                         //지정 [옹이] 의 [이름].
                                                         char         *pNodeName,
                                                         //이 [옹이] 의 item-index.
                                                         int          *rNodeItemindex,
                                                         //지정 [옹이] 의 직계 가지 수.
                                                         int          *rItemCount);

                //[2011.05.08.일][완료!!!]
                void __fastcall _Tree_Get_Node_ItemCount2(struct INFOTREE  *pTree,
                                                          //지정 [옹이] 의 [절대위치].
                                                          int           pNodeIndex,
                                                          //지정 [옹이] 의 직계 가지 수.
                                                          int          *rItemCount);

                //[2012.05.06.일][완료!!!]
                //지정 [옹이] 의 [직계 가지] 만을 대상으로, <text> 항목이 일치 하는 항목의 item-index 를 찾아서 반환한다.
                //즉, [가지] 안의 또 다른 하위 [가지] 는 대상으로 하지 않는다.
                void __fastcall _Tree_Get_Node_ItemIndex_withText(struct INFOTREE  *pTree,
                                                                  //지정 [옹이] 의 [이름].
                                                                  char         *pNodeName,
                                                                  //검사할 <text> 항목.
                                                                  char         *pItemText,
                                                                  //[대/소] 문자 구분 여부(true:구분).
                                                                  bool          pCase,
                                                                  //이 [옹이] 의 item-index.
                                                                  int          *rNodeItemindex,
                                                                  //<text> 를 가진 itemindex.
                                                                  int          *rItemindex);

                //[2012.05.06.일][완료!!!]
                //먼저 각 [항목] 을 [비우기] 하고 [삭제] 된다.
                bool __fastcall _Tree_Delete_Item(struct INFOTREE  *pTree,
                                                  //삭제할 itemIndex.
                                                  int           pDeleteItemIndex);

                //[2012.05.06.일][완료!!!]
                bool __fastcall _Tree_Delete_AllSubItem(struct INFOTREE  *pTree,
                                                        //삭제할 하위 항목의 [옹이] itemIndex.
                                                        int    pDeleteNodeIndex);

                //[2009.02.02.월][완료!!!]
                //지정 [항목] 을 포함하고 있는 [직계 옹이] 의 index 를 찾아서 반환한다.
                void __fastcall _Tree_Get_NodeIndex_of_ThisItem(struct INFOTREE  *pTree,
                                                                //지정 itemIndex.
                                                                int           pItemIndex,
                                                                //직계 [옹이] 의 itemIndex.
                                                                int          *rNodeIndex);

                //[2012.06.22.금][완료!!!]
                //현재 항목을 가지는 모든 상위 [옹이] 를 열어준다([+] => [-] 로 상태변경).
                //단, [다시 그리기] 나 [줄이동자 재설정] 등 부가동작은 하지 않는다.
                //[+]->[-] 로 전환된 것이 한개라도 있다면 <true> 를 없다면 <false> 반환.
                bool __fastcall _Tree_AllNodeOpen_IncThisItem(struct INFOTREE  *pTree_,
                                                              int               pItemIndex,
                                                              //[2012.06.22.금][추가!!!]
                                                              //<pItemIndex> 항목이 [옹이] 인 경우 이를 열어준다면 <true>.
                                                              bool              pSelfOpen);

                //[2012.05.08.화][완료!!!]
                void __fastcall _Tree_ExpandAll(//[2011.07.20.수][추가!!!]
                                                //[다시그리기] 를 할지를 결정한다.
                                                //true : 다시 그려 반영한다.
                                                bool  pRePaint);

                //[2012.05.08.화][완료!!!]
                void __fastcall _Tree_CloseAll(void);

                //[2012.05.08.화][완료!!!]
                void __fastcall _Tree_ThisItemExpandAll(int   pItemIndex,
                                                        //[2011.07.20.수][추가!!!]
                                                        //[다시그리기] 를 할지를 결정한다.
                                                        //true : 다시 그려 반영한다.
                                                        bool  pRePaint);

                //[2012.05.08.화][완료!!!]
                void __fastcall _Tree_ThisItemCloseAll(int  pItemIndex);

                //[2012.05.08.화][완료!!!]
                void __fastcall _Tree_ThisLevelExpandAll(int   pLevel,
                                                         //[2011.07.20.수][추가!!!]
                                                         //[다시그리기] 를 할지를 결정한다.
                                                         //true : 다시 그려 반영한다.
                                                         bool  pRePaint);

                //[2012.05.08.화][완료!!!]
                void __fastcall _Tree_ThisLevelCloseAll(int  pLevel);

                //[2012.05.08.화][완료!!!]
                bool __fastcall _Tree_SelItem_ViewPos(//가운데 위치시킨다면 <true>.
                                                      bool  pMiddle,
                                                      //[2012.04.25.수][추가!!!]
                                                      //실제 [줄이동] 하지 않고 가상적으로 확인만한다.
                                                      bool  pSimul);

            //}

            //[특수 함수]
            //{
                //[2011.07.18.월][처리중!!!]
                void __fastcall _EVENT_Item_P(void);

                //[2011.07.20.수][완료!!!]
                void __fastcall _EVENT_Item_M(void);

                //[2011.07.21.목][완료!!!]
                void __fastcall _EVENT_Item_M_Ready(void);

            //}

            //[수직 줄이동자 관련]
            //{
                //[2012.04.13.금][완료!!!]
                void __fastcall _Scroll_Set(void);

                //[2012.05.14.월][완료!!!]
                void __fastcall _EVENT_Scroll_scrollV(void);

                //[2012.04.13.금][완료!!!]
                void __fastcall _EVENT_MouseDown_scrollV(void);

            //}

            //[위치]
            //{
                //[2012.06.02.토][완료!!!]
                void __fastcall _Show(int  pX,
                                      int  pY);

                //[2012.06.02.토][완료!!!]
                void __fastcall _ReShow(void);

            //}

            //[키 제어]
            //{
                //[2012.06.04.월][완료!!!]
                void __fastcall _Key_Up(void);

                //[2012.06.04.월][완료!!!]
                void __fastcall _Key_Down(void);

                //[2012.05.14.월][완료!!!]
                void __fastcall _Key_Enter(void);

                //[2012.05.14.월][완료!!!]
                void __fastcall _Key_Space(void);

                //[2012.06.28.목][완료!!!]
                void __fastcall _Key_Esc(void);





                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Right(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Left(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Right_Shift(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Left_Shift(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Right_Ctrl(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Left_Ctrl(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Right_Shift_Ctrl(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Left_Shift_Ctrl(void);


                //[2012.05.08.화][완료!!!]
                void __fastcall _Key_Up_Ctrl(void);

                //[2012.05.08.화][완료!!!]
                void __fastcall _Key_Down_Ctrl(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_PageUp(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_PageDown(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Home(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_End(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_Home_Ctrl(void);

                //[2012.05.27.일][완료!!!]
                void __fastcall _Key_End_Ctrl(void);

            //}

        //}

        //[형식 적용 문자열]
        //{
            //[2012.05.20.일][추가!!!]{----------------------------------
            //<item.txt> 를 [형식 적용 문자열] 로 출력하기 위한 정보.
            //지정 [단어] 에 따라 개별적인 [속성] 이 적용되어 출력된다.
            //
            //[예약어], [구조체/공용체 형이름], [연산자 '*'] 만 처리.
            //"*" 는 [연산자] 에 들어있지만 [포인터] 차원을 [선언] 에서
            //사용하기 때문에 [형] 으로 보고 같이 처리해야 [선언정보] 가
            //제대로 구별된다.
            //나머지 [연산자/기호] 등은 처리할 필요 없다.
            //}----------------------------------------------------------

            //[VAR]
            //{
                struct STRCONF_STRHEAP_ITEM  _confStr_SetList_Hint[3];
                //[2012.05.21.월][추가!!!]
                //선언한 개수 관리.
                //<_ConfStr_Info_Set()> 함수에서 자동 설정.
                int                          _confStr_SetList_Hint_Count;

                //[2012.05.21.월][추가!!!]{----------------------------------
                //기본 적용 항목.
                struct STRCONF_STRHEAP_ITEM  _confStr_SetList_ItemDft[3];
                int                          _confStr_SetList_ItemDft_Count;
                //선택 항목(반전).
                struct STRCONF_STRHEAP_ITEM  _confStr_SetList_ItemSel[3];
                int                          _confStr_SetList_ItemSel_Count;
                //}----------------------------------------------------------

                //[기본 설정]
                //{
                    struct STRCONFITEM  _confStr_StdConf;

                    //[2012.05.21.월][추가!!!]
                    //[항목 선택] 시는 [반전출력] 하므로 별도의 [기본설정] 을 사용.
                    struct STRCONFITEM  _confStr_StdConf_ItemSel;

                //}

            //}

            //[2012.05.19.토][완료!!!]
            //[2019.02.17.일][완료]
            void __fastcall _ConfStr_Info_Set(void);

        //}

        //[정보 처리 관련]
        //{
            //[2012.06.01.금][완료!!!]
            //내부적으로 [다시 그리기] 된 경우는 <true> 반환.
            bool __fastcall _TitleView_Func_DbRecIndex(//{DB} 상의 <recindex>.
                                                       int  pDbRecIndex);

            //[2012.06.23.토][완료!!!]
            //내부적으로 [다시 그리기] 된 경우는 <true> 반환.
            bool __fastcall _TitleView_Word(//영역 정보.
                                            int    pFuncRecIndex,
                                            //<{DB}.name> 에서 검색할 [단어].
                                            char  *pWord);

            //[2012.06.29.목][완료!!!]
            void __fastcall _HintBottom(//[2012.05.28.월][추가!!!]
                                        //범용으로 사용하기 위하여 [항목번호] 를 전달받는다.
                                        int  pItemIndex);

        //}

        //[자동 감추기 관련]
        //{
            //[2012.05.23.수][추가!!!]{---------------------------
            //[정보판] 을 감출 상황을 감지하여 처리하기위한 정보.
            //}---------------------------------------------------

            //[단어 시작/끝 위치 정보]
            //{
                //[!]{-----------------------------------------------------------
                //이 정보는 <_Show()> 로 이 [정보판] 을 보여주는 [편집기] 쪽에서
                //설정해 주어야 한다.
                //
                //[조건!!!]------------------------------------------------------
                //[입력지정자] 가 이 위치를 벗어 난다면 [감추기] 한다.
                //}--------------------------------------------------------------

                int  _edit_WordIndexS, _edit_WordIndexE; //(기본값 : -1)

            //}

            //[단어 존재 행 정보]
            //{
                //[2012.05.25.금][추가!!!]{------------------------------------------
                //[대상 단어] 가 존재한 [행 번호] 를 관리.
                //이는 [화면지정자] 로 다른 [단어] 를 찍은 경우 이전 [단어지정] 을
                //[해제] 해 줄 필요가 있기 때문.
                //
                //<_Show()> 에서 새로운 [단어지정] 을 하기 전에 이전 [단어지정] 을
                //해제한 뒤 새 [단어] 의 [행정보] 를 다시 보관.
                //
                //실제는 [편집기] 의 관리정보 <_row> 를 전달 받는 것.
                //
                //[주의!!!]----------------------------------------------------------
                //반드시 <_Show()> 가 보여질때 <_Show()> 를 호출하는 쪽에서 [한번만]
                //설정돼야 한다.
                //}------------------------------------------------------------------

                int  _edit_Row; //(기본값 : -1)

            //}

            //[대상단어보관]
            //{
                //[2012.05.31.목][추가!!!]{------------------------------------------------
                //<_AutoHide_WordBound()> 함수가 [편집기] 의
                //<_EDIT_CaretPos()>, <_EDITBUF_MOONJA_Delete()>, <_SELECT_Delete()>,
                //<_EDITBUF_MOONJA_Insert()>, <_EditBuf_LineStr_Insert()>,
                //<_EditBuf_LineStr_Delete()>, <_EDIT_Paste()>, <History_Insert()>
                //함수들에서 호출되는데, [입력지정자] 이동, [문자입력] 등 수정시
                //복수개의 조합으로 여러번 호출되므로 [중복처리] 가 발생하고
                //<_AutoHide_WordBound()> 함수에서 호출하는 <InfoTree_Call()> 함수역시
                //[중복처리] 된다.
                //
                //<InfoTree_Call()> 함수는 [처리시간이 길다] 는 특성이 있으므로 [중복] 시
                //이로 인한 [편집동작 지연] 등이 발생하므로 [중복] 처리되지 않도록
                //[대상단어] 가 [수정] 된 경우만 처리해야 한다.
                //
                //이 경우 가장 시간이 많이 걸리는 <InfoTree_Call()> 함수를 한번만 처리하게
                //되어 [편집기 동작] 에 방해를 주지 않는다.
                //}------------------------------------------------------------------------

                //[주의!!!]----------------------------------------------------------------------------
                //<256> 바이트 정도면 단어를 관리하는데 충분하고, 이 보다 큰 [단어] 인 경우는
                //비교시 자동으로 [새단어] 로 인식되므로 [중복처리] 될수 있으나 [단어] 가
                //<256> 길이를 넘는 경우가 거의 없기 때문에 [중복] 의 의미는 크지 않다.
                //상시 보유 크기이므로 너무 크지 않게 설정.
                //
                //<STR_SubString()> 을 사용전 [단어길이] 를 미리 조사하여 <256> 크기를 넘지 않게 처리.
                //[한글/영문] 을 구분하지 않고 크기로 자른다.
                char  _edit_Word[256];
                //}------------------------------------------------------------------------------------

            //}

            //[2012.06.01.금][추가!!!]{----------------------------------------------------------
            //<Teditor_edit_Form::History_UnDo()>, <Teditor_edit_Form::History_ReDo()> 함수에서
            //내부적으로 처리되는 [실시간 재정리] 관련 함수들의 처리 순서때문에 발생하는 비동기
            //문제를 해결하기 위한것.
            //이는 [실시간 재정리] 의 [시작] 을 처리하는 <_AutoHide_WordBound()> 함수에서는
            //[입력지정자] 가 위치한 [단어] 가 수정되는 경우만 처리하기 때문에 [입력지정자] 위치
            //복원을 먼저 하는 경우는 이때 [재정리] 가 되고 [복원] 된 후에역시 재정리가 되어
            //[깜박임] 이 발생할수 있다.
            //이를 막기 위하여 [가장 마지막에 한번만] 처리해 주기 위한 [함수제어인자] 를 만든다.
            //<true> 인 경우만 관련 처리를 수행.
            bool  _sw_AutoHide_WordBound; //(기본값:true)
            //}----------------------------------------------------------------------------------

            //[2012.07.21.토][완료!!!]
            void __fastcall _AutoHide_WordBound(//[2012.05.24.목][추가!!!]
                                                int  pWordStartIndex,
                                                int  pWordEndIndex);

        //}


};
//---------------------------------------------------------------------------
extern PACKAGE Tinfo_tree_Form *info_tree_Form;
//---------------------------------------------------------------------------


#endif
