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

#include <vcl.h>
#pragma hdrstop

#include "ide_tree.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tide_tree_Form *ide_tree_Form;
//---------------------------------------------------------------------------


//[다른 폼]
//{
    #include "main.h"
    #include "ide_menu.h"
    #include "ide_mbutton.h"
    #include "ide_vsplit.h"
    #include "ide_hsplit.h"

    #include "tree_tree.h"

    #include "ide_library.h"

    //[2009.05.31.일][추가!!!]
    #include "ide_main.h"

    //[2011.07.21.목][추가!!!]
    #include "debug_view.h"

    //[2011.07.21.목][추가!!!]
    #include "msg_msg.h"

    //[2022.06.13.월][추가]
    #include "gui.h"

    //[2022.07.03.일][추가]
    #include "ide_editor.h"

    //[2022.07.05.화][추가]
    #include "editor_edit.h"

//}


__fastcall Tide_tree_Form::Tide_tree_Form(TComponent* Owner)
        : TForm(Owner)
{
  //[VAR]
  //{
      //[2022.06.13.월][추가]
      int  color;

  //}

  //[환경변수]
  //{
      //[2022.06.13.월[추가]
      IDE_Get_Option(&_ide_option);

  //}

  //[초기화]
  //{
      this->Left   = ide_menu_Form->Left;
      this->Top    = ide_mbutton_Form->Top + ide_mbutton_Form->Height - 1;
      this->Width  = 200 + 16 + 16 + 26;
      this->Height = ide_hsplit_Form->Top - this->Top + 1;
      this->Color  = clWhite;

  //}

  //[컨트롤 생성]
  //{
      //[캡션바]
      //{
          _captionbar_Form          = new Tgui_captionbar_Form(this);
          _captionbar_Form->Parent  = this;
          _captionbar_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              _captionbar_Form->_Caption("정보창");

          //}

      //}

      //[트리]
      //{
          tree_tree_Form          = new Ttree_tree_Form(this);
          tree_tree_Form->Parent  = this;
          tree_tree_Form->Visible = true;
          tree_tree_Form->SendToBack();

          //[2022.06.13.월][추가]
          tree_tree_Form->_EVENT_KeyDown_Esc = _EVENT_tree_tree_Form_KeyDown_Esc;

      //}

      //[탭]
      //{
          _tabs_Form          = new Tgui_tabs_Form(this);
          _tabs_Form->Parent  = this;
          _tabs_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              //[2019.02.16.토][추가]
              //[찾기] 를 상시 표기 항목으로 추가([전체찾기:결과] 표시를 위한것).
              //-------------------------------------------------------v
              _tabs_Form->_Tabs(" 설계묶음 \r\n 설계정보 \r\n API \r\n 찾기 ");//\r\n 상태정보 \r\n 검증보기 ");

          //}

          //[EVENT 함수]
          //{
              _tabs_Form->_EVENT_TabSelected = _EVENT_TabSelect;

          //}

      //}

      //[페이지]
      //{
          _page_Form          = new Tgui_page_Form(this);
          _page_Form->Parent  = this;
          _page_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              _page_Form->_Top(_captionbar_Form->Top + _captionbar_Form->Height);
              _page_Form->_Left(this->Left + this->Width - _page_Form->Width - 4);

          //}

          //[EVENT 함수]
          //{
              _page_Form->_EVENT_ArrowUp   = _EVENT_PageUp;
              _page_Form->_EVENT_ArrowDown = _EVENT_PageDown;

          //}

      //}

      //[수직스크롤바]
      //{
          _scroll_v_Form          = new Tgui_scroll_v_Form(this);
          _scroll_v_Form->Parent  = this;
          _scroll_v_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              _scroll_v_Form->_Left(this->Left + this->Width - _scroll_v_Form->Width - 4);
              _scroll_v_Form->_Top(_page_Form->Top + _page_Form->Height);
              _scroll_v_Form->_Height(this->Height - _scroll_v_Form->Top - _tabs_Form->Height);

          //}

          //[환경변수설정]
          //{
              //처음에는 아무것도 표시되지 않는 것으로 간주한다.
              _scroll_v_Form->_DesignSize(0);
              _scroll_v_Form->_Max(0);

              tree_tree_Form->_Scroll_Set();

          //}

          //[EVENT 함수]
          //{
              //event 시 호출될 함수를 등록한다.
              _scroll_v_Form->_EVENT_Scroll    = _EVENT_V_Scroll;
              _scroll_v_Form->_EVENT_MouseDown = _EVENT_V_MouseDown;

          //}
          
      //}

      //[주의!!!]{------------------------------------
      //컨트롤 중에서는 가장 위에 위치할수 있게 한다.
      _tabs_Form->BringToFront();
      //}---------------------------------------------

  //}

  //[API 찾기 관련]
  //{
      //[!]{------------------
      //[2022.06.13.월][추가]
      //}---------------------
      
      _findEdit = new TGEdit_Form(this);

      _findEdit->Parent = _captionbar_Form;

      //[출력 위치 Y 보정]
      //{
          _findEdit->_text_org_y_ofs = 1;

          //반영을 위하여 반드시 초기화 필요.
          _findEdit->_EDIT_Init();

      //}

      _findEdit->_Top(0);
      _findEdit->_Left(76);
      _findEdit->_Height(17);
      _findEdit->_Width(_captionbar_Form->Width - 76);

      _findEdit->_FontColor(_ide_option->color_0);

      _findEdit->_BorderColor(_ide_option->color_0);

      BMP_Get_Bright_Color(_ide_option->color_0, Ide_Bright_Edit, &color);
      _findEdit->_BackColor(color);

      //처음에는 보이지 않는다.
      _findEdit->Visible = false;

      _findEdit->_EVENT_KeyDown_Esc = _EVENT_findEdit_KeyDown_Esc;

      //[2022.06.19.일][추가]
      _findEdit->_EVENT_Change = _EVENT_findEdit_Change;

      //[입력지정자 이동 처리 관련]
      //{
          //[2022.06.21.화][추가]{------------------------------------------
          //모두 동일한 처리를 수행하므로 한개의 이벤트 함수를 연결해 준다.
          //}---------------------------------------------------------------

          _findEdit->_EVENT_KeyDown_Left  = _EVENT_findEdit_CaretMove;
          _findEdit->_EVENT_KeyDown_Right = _EVENT_findEdit_CaretMove;
          _findEdit->_EVENT_KeyDown_Home  = _EVENT_findEdit_CaretMove;
          _findEdit->_EVENT_KeyDown_End   = _EVENT_findEdit_CaretMove;

      //}

      //[키 Up/Down 관련]
      //{
          //[2022.06.27.월][추가]{------------------------------------------
          //[키:Up/Down] 인 경우는 해당 <Tree:API 검색> 에서 [항목선택] 및
          //[순간보기] 로 해당 API 의 정보문서<gtxt/h> 를 보여준다. 
          //}---------------------------------------------------------------

          _findEdit->_EVENT_KeyDown_Up   = _EVENT_findEdit_KeyDown_Up;
          _findEdit->_EVENT_KeyDown_Down = _EVENT_findEdit_KeyDown_Down;

      //}

      //[편집기 <Ctrl+P> 관련]
      //{
          //[2022.07.05.화][추가]
          _editor_Ctrl_P = false;

      //}

  //}

  //[tree 초기화]
  //{
      //[2009.05.30.토][수정!!!]{--------------------
      //각각의 비트 조합을 사용하는 것으로 수정한다.
      //기본 항목으로 채워준다.
      //}--------------------------------------------

      _Tree_All_Init(d_Tree_Prj | d_Tree_Info | d_Tree_Api | d_Tree_Sys |
                     //[2011.07.11.월][추가!!!]
                     //[검증식 보기창] 을 추가한다.
                     d_Tree_DbgExp |
                     //[2019.02.16.토][추가]
                     //[전체찾기창] 을 추가.
                     d_Tree_Find |
                     //[2022.06.15.수][추가]
                     d_Tree_ApiSrch,
                     //[2012.06.03.일][추가!!!]
                     //[다시 그리기] 처리 수행.
                     true);
      
  //}

  //[<함수묶음> 초기화]
  //{
      //[2009.05.31.일][추가!!!]
      Ide_Tree_Api();

  //}

  return;

}

__fastcall Tide_tree_Form::~Tide_tree_Form(void)
{
  //[2012.04.29.일][수정!!!]{---------------
  //안전을 위하여 선언한 역순으로 삭제한다.
  //}---------------------------------------

  //[2022.06.13.월][추가]{--------------------------------------
  if(_findEdit != NULL) { delete _findEdit; _findEdit = NULL; }
  //}-----------------------------------------------------------

  if(_scroll_v_Form != NULL) { delete _scroll_v_Form; _scroll_v_Form = NULL; }

  if(_page_Form != NULL) { delete _page_Form; _page_Form = NULL; }

  if(_tabs_Form != NULL) { delete _tabs_Form; _tabs_Form = NULL; }

  if(tree_tree_Form != NULL) { delete tree_tree_Form; tree_tree_Form = NULL; }

  if(_captionbar_Form != NULL) { delete _captionbar_Form; _captionbar_Form = NULL; }

}

//------------------------------------------------------------------------------
//[서브클래싱]------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tide_tree_Form::WndProc(Messages::TMessage  &Message)
{
  //[2012.06.07.목][생성!!!]

  if(Message.Msg == WM_ERASEBKGND)
  {
    //[2012.06.07.목][추가!!!]{------------------------------------
    //<ide_tree_Form> 의 경우는 보이는 부분이 없기 때문에 쓸데없이
    //바탕등이 그려지지 않도록 <WM_ERASEBKGND> 는 걸러낸다.
    //}------------------------------------------------------------

    return;

  }

  //[기본처리]
  //{
      //기본 메세지는 반드시 처리 되어야 한다.
      TForm::WndProc(Message);

  //}

}

void __fastcall Tide_tree_Form::_Resize(void)
{
  //[2006.10.23.월][생성!!!]{--
  //컨트롤 크기를 조정한다.
  //}--------------------------

  //[크기조정]
  //{
      //IDE Form 에 맞게 크기를 조정한다.
      this->Top    = ide_mbutton_Form->Top + ide_mbutton_Form->Height - 1;
      this->Height = ide_hsplit_Form->Top - this->Top + 1;
  //}

  return;

}

void __fastcall Tide_tree_Form::_Split_v(void)
{
  //[2006.10.24.화][생성!!!]{------
  //수직 spliter 동작시 크기 조정.
  //}------------------------------

  //[크기조정]
  //{
      //IDE Form 에 맞게 크기를 조정한다.
      this->Width = ide_vsplit_Form->Left - this->Left + 1;
  //}

  return;

}

void __fastcall Tide_tree_Form::_Split_h(void)
{
  //[2006.10.24.화][생성!!!]{------
  //수평 spliter 동작시 크기 조정.
  //}------------------------------

  //[크기조정]
  //{
      //IDE Form 에 맞게 크기를 조정한다.
      this->Top    = ide_mbutton_Form->Top + ide_mbutton_Form->Height - 1;
      this->Height = ide_hsplit_Form->Top - this->Top + 1;
  //}

  return;

}

void __fastcall Tide_tree_Form::FormResize(TObject *Sender)                                                                       
{
  //[2006.10.26][생성!!!]{---------------------------
  //이 Form 안의 다른 컨트롤의 크기를 새로 조정한다.
  //}------------------------------------------------

  if(_captionbar_Form != NULL)
  {
    _captionbar_Form->_Resize();

    if(_findEdit != NULL)
    {
      //[2022.06.13.월][추가]
      _findEdit->_Width(_captionbar_Form->Width - 76);

    }

  }

  if(tree_tree_Form != NULL)
  {
    tree_tree_Form->_Resize();

  }

  if(_tabs_Form != NULL)
  {
    _tabs_Form->_Resize();

  }

  if(_page_Form != NULL)
  {
    //직접 조정해 준다.
    _page_Form->_Left(this->Left + this->Width - _page_Form->Width - 4);

  }

  if(_scroll_v_Form != NULL)
  {
    _scroll_v_Form->_Left(this->Left + this->Width - _scroll_v_Form->Width - 4);
    _scroll_v_Form->_Top(_page_Form->Top + _page_Form->Height);
    _scroll_v_Form->_Height(this->Height - _scroll_v_Form->Top - _tabs_Form->Height);

    tree_tree_Form->_Scroll_Set();

  }

  return;

}

void __fastcall Tide_tree_Form::_Tree_All_Init(//[2009.05.30.토][수정!!!]
                                               //각각의 비트 조합을 사용하는 것으로 수정한다.
                                               int   pTrees,
                                               //[2012.06.03.일][추가!!!]
                                               bool  pRePaint)
{
  //[2006.11.30.목][생성!!!]{----------------------------------------
  //각 3 개의 <tree> 에 기본 정보를 표시해준다.
  //해당 [엄지그림] 의 배치에 주의한다.
  //
  //[2009.01.26.월][수정!!!]-----------------------------------------
  //일단, 기본 항목만 보이도록 수정한다.
  //
  //[2012.03.14.수][추가!!!]-----------------------------------------
  //[가상기계] 항목 추가.
  //[GVMS/GVMX] 를 등록하여 바로 실행시킬수 있다.
  //[예제] 등 설명시에 필요하여 추가.
  //
  //[2012.04.18.수][참고!!!]-----------------------------------------
  //[Tree] 항목에 <txt> 가 [동적생성] 되는 공간으로 바뀌었으므로
  //[Tree] 자체를 삭제하기 전에 반드시 [동적삭제] 해 주어야 한다.
  //즉, 반드시 먼저 [비우기] 를 한뒤 [삭제/재생성] 처리를 한다.
  //
  //이 [비우기] 처리는 <_Tree_Init()> 함수 내부적으로 자동 처리된다.
  //
  //[2012.06.03.일][수정!!!]-----------------------------------------
  //[다시 그리기] 여부를 설정할수 있도록 수정.
  //[초기화] 후 바로 다시 그리는 경우([실시간 선언 정보판] 과 연동시
  //바로 이어서 내용을채우는 경우 [깜박임] 현상을 방지하기 위한것.
  //즉, 가장 마지막에 한번만 그려주기 위한것.
  //
  //[2019.02.16.토][수정]--------------------------------------------
  //<d_Tree_Find> 처리 추가.
  //}----------------------------------------------------------------

  //[VAR]
  //{
      struct TREEITEM  item;

  //}

  if(pTrees & d_Tree_Prj)
  {
    //[초기화]
    //{
        //[2009.02.01.일][추가!!!]
        tree_tree_Form->_Tree_Init(&(tree_tree_Form->_tree[d_TREE_project]),
                                   //[2009.09.13.일][추가!!!]
                                   //항목수 100 개로 생성한다.
                                   100);

    //}

    //[설계기획]
    //{
        //[root]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            //처음은 아무 것도 없으므로 무조건 하나 root 를 추가한다.
            item.kind = '-';
            item.level = 0;
            STR_Assign(item.name, "root");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_project]),
                                      &item,
                                      "새설계묶음");

            item.bmpindex = d_ITEMBMP_root;
            tree_tree_Form->_Tree_Add_Item(&(tree_tree_Form->_tree[d_TREE_project]), &item);

        //}

        //[item]
        //{
            //[설계문서]
            //{
                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "c");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_project]),
                                          &item,
                                          "설계문서");

                item.bmpindex = d_ITEMBMP_folder;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_project]), "root", &item, NULL);

            //}

            //[함수묶음]
            //{
                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "glib");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_project]),
                                          &item,
                                          "함수묶음");

                item.bmpindex = d_ITEMBMP_folder;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_project]), "root", &item, NULL);

            //}

            //[참고문서]
            //{
                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "etc");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_project]),
                                          &item,
                                          "참고자료");

                item.bmpindex = d_ITEMBMP_folder;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_project]), "root", &item, NULL);

            //}

            //[가상기계]
            //{
                //[2012.03.14.수][추가!!!]{-------------------------------------------
                //[가상기계(GVMS/GVMX)] 를 등록하고 바로 실행시킬수 있는 항목을 추가.
                //}-------------------------------------------------------------------

                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "gvm");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_project]),
                                          &item,
                                          "가상기계");

                item.bmpindex = d_ITEMBMP_folder;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_project]), "root", &item, NULL);

            //}

        //}

    //}

  }

  if(pTrees & d_Tree_Info)
  {
    //[초기화]
    //{
        //[2009.02.01.일][추가!!!]
        tree_tree_Form->_Tree_Init(&(tree_tree_Form->_tree[d_TREE_info]),
                                   //[2009.09.13.일][추가!!!]
                                   //항목수 250 개로 생성한다.
                                   250);

    //}

    //[설계정보]
    //{
        //[root]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            //처음은 아무 것도 없으므로 무조건 하나 root 를 추가한다.
            item.kind = '-';
            item.level = 0;
            STR_Assign(item.name, "root");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_info]),
                                      &item,
                                      "설계정보");

            item.bmpindex = d_ITEMBMP_root;
            tree_tree_Form->_Tree_Add_Item(&(tree_tree_Form->_tree[d_TREE_info]), &item);

        //}

        //[define]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            item.kind = '.';
            STR_Assign(item.name, "define");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_info]),
                                      &item,
                                      "이름정의");

            item.bmpindex = d_ITEMBMP_define;
            tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_info]), "root", &item, NULL);

        //}

        //[struct]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            item.kind = '.';
            STR_Assign(item.name, "struct");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_info]),
                                      &item,
                                      "구조체선언");

            item.bmpindex = d_ITEMBMP_struct_def;
            tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_info]), "root", &item, NULL);

        //}

        //[union]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            item.kind = '.';
            STR_Assign(item.name, "union");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_info]),
                                      &item,
                                      "공용체선언");

            item.bmpindex = d_ITEMBMP_union_def;
            tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_info]), "root", &item, NULL);

        //}

        //[전역변수]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            item.kind = '.';
            STR_Assign(item.name, "global");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_info]),
                                      &item,
                                      "전역변수");

            item.bmpindex = d_ITEMBMP_global;
            tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_info]), "root", &item, NULL);

        //}

        //[함수]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            item.kind = '.';
            STR_Assign(item.name, "function");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_info]),
                                      &item,
                                      "함수");

            item.bmpindex = d_ITEMBMP_function;
            tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_info]), "root", &item, NULL);

        //}

    //}

  }

  if(pTrees & d_Tree_Api)
  {
    //[2009.05.30.토][추가!!!]{----------------------------------------------------
    //[API] 항목을 추가한다.
    //초기에 [맷돌 폴더] 안의 [glib] 폴더안의 모든 내용이 자동 정리되므로 여기서는
    //간단하게 제목만 추가한다.
    //}----------------------------------------------------------------------------

    //[초기화]
    //{
        tree_tree_Form->_Tree_Init(&(tree_tree_Form->_tree[d_TREE_api]),
                                   //[2009.09.13.일][추가!!!]
                                   //항목수 250 개로 생성한다.
                                   250);

    //}

    //[설계정보]
    //{
        //[root]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            //처음은 아무 것도 없으므로 무조건 하나 root 를 추가한다.
            item.kind = '.';
            item.level = 0;
            STR_Assign(item.name, "root");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_api]),
                                      &item,
                                      "API");

            item.bmpindex = d_ITEMBMP_root;
            tree_tree_Form->_Tree_Add_Item(&(tree_tree_Form->_tree[d_TREE_api]), &item);

        //}

    //}

  }

  if(pTrees & d_Tree_Find)
  {
    //[2019.02.16.토][추가]{--------------------------------------------------
    //[찾기] 항목을 추가.
    //[전체찾기] 수행후 [찾은목록] 이 표시되므로 여기서는 [제목] 만 추가한다.
    //}-----------------------------------------------------------------------

    //[초기화]
    //{
        tree_tree_Form->_Tree_Init(&(tree_tree_Form->_tree[d_TREE_find]),
                                   //항목수 250 개로 생성한다.
                                   250);

    //}

    //[설계정보]
    //{
        //[root]
        //{
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            //처음은 아무 것도 없으므로 무조건 <root> 한개를 추가.
            item.kind = '.';
            item.level = 0;

            //[2019.02.21.목][추가]{---
            item.lastItem = true;
            //}------------------------

            STR_Assign(item.name, "root");
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_find]),
                                      &item,
                                      "전체찾기");

            item.bmpindex = d_ITEMBMP_root;
            tree_tree_Form->_Tree_Add_Item(&(tree_tree_Form->_tree[d_TREE_find]), &item);

        //}

    //}

  }

  if(pTrees & d_Tree_Sys)
  {
    //[2009.04.18.토][대폭수정!!!]{------------------------------------------
    //이전과 달리 AVR Studio4 처럼 [장치정보] 등을 보여주는 것으로 수정한다.
    //}----------------------------------------------------------------------

    //[초기화]
    //{
        tree_tree_Form->_Tree_Init(&(tree_tree_Form->_tree[d_TREE_system]),
                                   //[2009.09.13.일][추가!!!]
                                   //항목수 50 개로 생성한다.
                                   50);

    //}


    //[내장함수]
    //{
        //[root]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            //처음은 아무 것도 없으므로 무조건 하나 root 를 추가한다.
            item.kind = '-';
            item.level = 0;
            STR_Assign(item.name, "root");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                      &item,
                                      "상태정보");

            item.bmpindex = d_ITEMBMP_root;
            tree_tree_Form->_Tree_Add_Item(&(tree_tree_Form->_tree[d_TREE_system]), &item);

        //}

        //[item]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            item.kind = '+';
            STR_Assign(item.name, "reg");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                      &item,
                                      "레지스터");

            item.bmpindex = d_ITEMBMP_api;
            tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "root", &item, NULL);

            //[items]
            //{
                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.opcode");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "OPCODE ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.r0");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "R0     ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.r1");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "R1     ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.r2");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "R2     ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.pc");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "PC     ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.mp");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "MP     ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.sp");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "SP     ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.code");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "CODE   ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.data");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "DATA   ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.local");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "LOCAL  ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.temp");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "TEMP   ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);


                //[2012.04.17.화][추가!!!]
                //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
                tree_tree_Form->_Item_Init(&item);

                item.kind = '.';
                STR_Assign(item.name, "reg.func");
                //[2012.04.20.금][수정!!!]
                tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_system]),
                                          &item,
                                          "FUNC   ");

                item.bmpindex = d_ITEMBMP_item;
                tree_tree_Form->_Tree_Add_NodeItem(&(tree_tree_Form->_tree[d_TREE_system]), "reg", &item, NULL);

            //}

        //}

    //}

  }

  if(pTrees & d_Tree_DbgExp)
  {
    //[2011.07.11.월][추가!!!]{----------------------------------------
    //[검증식 보기창] 의 항목은 초기화 한다.
    //실제는 하위 항목이 없으므로 [제목] 만 [뿌리] 로 정해놓으면 된다.
    //}----------------------------------------------------------------

    //[초기화]
    //{
        tree_tree_Form->_Tree_Init(&(tree_tree_Form->_tree[d_TREE_dbgExp]),
                                   //항목수 50 개로 생성한다.
                                   50);

    //}

    //[초기 항목]
    //{
        //[!]
        //[검증식 보기창] 의 경우는 처음에는 추가된 [검증식] 이 없으므로
        //비워둔다.

        //[root]
        //{
            //[2012.04.17.화][추가!!!]
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            //처음은 아무 것도 없으므로 무조건 하나 root 를 추가한다.
            item.kind = '.';
            item.level = 0;
            STR_Assign(item.name, "root");
            //[2012.04.20.금][수정!!!]
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_dbgExp]),
                                      &item,
                                      "검증식보기");

            item.bmpindex = d_ITEMBMP_root;
            tree_tree_Form->_Tree_Add_Item(&(tree_tree_Form->_tree[d_TREE_dbgExp]), &item);

        //}

    //}

  }

  if(pTrees & d_Tree_ApiSrch)
  {
    //[2022.06.15.수][추가]{--------------------------------------------
    //[API 검색] 항목을 추가(별도 탭 없이 API 탭을 공유하는 임시 Tree).
    //여기서는 간단하게 제목만 추가.
    //}------------------------------------------------------------------

    //[초기화]
    //{
        tree_tree_Form->_Tree_Init(&(tree_tree_Form->_tree[d_TREE_apiSrch]),
                                   //API 검색결과를 표시하므로 API 와 동일하게 설정.
                                   250);

    //}

    //[설계정보]
    //{
        //[root]
        //{
            //항목에 <txt> 등 [동적생성] 되는 것이 있으므로 반드시 초기화 필요.
            tree_tree_Form->_Item_Init(&item);

            //처음은 아무 것도 없으므로 무조건 <root> 한 개 추가.
            item.kind = '.';
            item.level = 0;
            STR_Assign(item.name, "root");
            
            tree_tree_Form->_Item_Txt(&(tree_tree_Form->_tree[d_TREE_apiSrch]),
                                      &item,
                                      "API(검색결과)");

            item.bmpindex = d_ITEMBMP_root;
            
            tree_tree_Form->_Tree_Add_Item(&(tree_tree_Form->_tree[d_TREE_apiSrch]), &item);

        //}

    //}

  }

  //[표시]
  //{
      //[2012.06.03.일][수정!!!]{--------------
      //[다시 그리기] 요청이 있는 경우만 처리.
      //}--------------------------------------

      if(pRePaint == true)
      {
        //tree 를 한번 그려준다.
        tree_tree_Form->_TreeView(tree_tree_Form->_tree_select_index, false);

      }  

  //}

}

//[FUNCTION POINTER]------------------------------------------------------------

void __fastcall Tide_tree_Form::_EVENT_V_Scroll(void)
{
  //[2006.10.31.화][생성!!!]{--------------------------------------------
  //ide_tree_Form  안에 포함된 [수직스크롤바] 의 이동시 처리를 수행한다.
  //이는 해당 [스크롤바] 의 _position 값이 바뀌었음을 의미하므로,
  //_position 의 변화에 따른 처리를 수행하면 된다.
  //}--------------------------------------------------------------------

  //[포커스 주기]
  //{
      //[!]{------------------------------------------------------------
      //[휠마우스] 를 사용하게 하기 위하여 반드시 포커스를 주어야 한다.
      //휠은 수직 스크롤바에만 적용한다.
      //}---------------------------------------------------------------
      
      tree_tree_Form->SetFocus();

  //}

  //[스크롤 동기화]
  //{
      tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);

  //}

  return;

}

void __fastcall Tide_tree_Form::_EVENT_V_MouseDown(void)
{
  //[2006.11.28.화][생성!!!]{-------------------
  //[수직스크롤바] 의 click 시 처리를 수행한다.
  //}-------------------------------------------

  //[포커스 주기]
  //{
      //[!]{------------------------------------------------------------
      //[휠마우스] 를 사용하게 하기 위하여 반드시 포커스를 주어야 한다.
      //휠은 수직 스크롤바에만 적용한다.
      //}---------------------------------------------------------------

      tree_tree_Form->SetFocus();
      
  //}

  return;

}

void __fastcall Tide_tree_Form::_EVENT_PageUp(void)
{
  //[VAR]
  //{
      int  position = _scroll_v_Form->_position;
  //}

  position -= ((tree_tree_Form->Height - _tabs_Form->Height) / tree_tree_Form->_line_height);

  _scroll_v_Form->_Position(position);

  tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);

  return;

}

void __fastcall Tide_tree_Form::_EVENT_PageDown(void)
{
  //[VAR]
  //{
      int  position = _scroll_v_Form->_position;
  //}

  position += ((tree_tree_Form->Height - _tabs_Form->Height) / tree_tree_Form->_line_height);

  _scroll_v_Form->_Position(position);

  tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);

  return;

}

void __fastcall Tide_tree_Form::_EVENT_TabSelect(void)
{
  //[2006.11.06.월][생성!!!]{----------------------------------------------
  //탭이 선택된 경우를 처리한다.
  //
  //[2011.07.21.목][추가!!!]-----------------------------------------------
  //현재 선택된 항목이 [검증식 보기창] 인 경우는 자동으로 현재 등록돼 있는
  //모든 [검증식] 을 다시 계산해 준다.
  //단, 같은 항목이 다시 선택된 경우라면 계산하지 않는다.
  //
  //[2019.02.16.토][추가]--------------------------------------------------
  //[전체찾기:결과] 지원을 위한 [찾기] 추가.
  //}----------------------------------------------------------------------

  //[현재 scroll 위치 저장]
  //{
      tree_tree_Form->_tree[tree_tree_Form->_tree_select_index].scroll_position = _scroll_v_Form->_position;
  //}

  //[API 찾기 한줄편집기 감추기]
  //{
      //[2022.06.13.월][추가]{------------------------------------
      //[탭:API] 에서만 사용하는 기능이므로 다른 탭에서는 감춘다.
      //}---------------------------------------------------------

      //[API 검색 관련 감추기]
      //{
          //[2022.06.15.수][수정]{----------------------------------------------
          //[API:검색] 은 일시적인 기능으로 [탭:API] 을 공유하지만, [탭:API] 를
          //다시 선택하는 경우는 그대로 [Tree:API] 가 보여야 한다.
          //즉, 어떤 경우라도 기본탭의 항목이 보여야 하는 경우에는 감춰야 한다.
          //
          //[Tree:API 검색] 은 아래 선택 탭 처리 부에서 해당 [Tree] 가 보이면서
          //자동적으로 사라진다.
          //}-------------------------------------------------------------------

          if(tree_tree_Form->_tree_select_index == d_TREE_apiSrch)
          {
            //[2022.06.27.월][수정]{---------------
            //현재 <Tree:API 검색> 인 경우만 처리.
            //}------------------------------------

            _findEdit->Visible = false;

            //[정보창:제목줄]
            //{
                //[2022.06.15.수][추가]{-------------------
                //[정보창] 으로 원래 문자열로 돌려 놓는다.
                //}----------------------------------------

                _captionbar_Form->_Caption("정보창");

            //}

            //[<순간보기> 문서 감추기]
            //{
                //[2022.06.27.월][추가]{----------------------------------
                //현재 열려있는 [순간보기] 문서가 있다면 무조건 닫아준다.
                //}-------------------------------------------------------

                tree_tree_Form->_Tree_ApiInfo_Hide(d_TREE_apiSrch, false);

            //}

            //[편집기 <Ctrl+P> 로 활성화인 경우]
            //{
                //[2022.07.05.화][추가]{------------------------------
                //이 경우는 [편집기] 로 다시 촛점을 돌려 놓아야 한다.
                //}---------------------------------------------------

                if(ide_tree_Form->_editor_Ctrl_P == true)
                {
                  editor_edit_Form->SetFocus();

                }

            //}

          }

      //}

  //}

  switch(_tabs_Form->_tabindex)
  {
    case d_TREE_project :
    {
      //[tree 선택]
      //{
          tree_tree_Form->_tree_select_index = d_TREE_project;

          _scroll_v_Form->_position = tree_tree_Form->_tree[tree_tree_Form->_tree_select_index].scroll_position;

          //원래 scroll 위치를 기록한다.
          tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);
      //}

    } break;

    case d_TREE_info :
    {
      //[tree 선택]
      //{
          tree_tree_Form->_tree_select_index = d_TREE_info;

          _scroll_v_Form->_position= tree_tree_Form->_tree[tree_tree_Form->_tree_select_index].scroll_position;

          //원래 scroll 위치를 기록한다.
          tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);
      //}

    } break;

    case d_TREE_api :
    {
      //[tree 선택]
      //{
          tree_tree_Form->_tree_select_index = d_TREE_api;

          _scroll_v_Form->_position= tree_tree_Form->_tree[tree_tree_Form->_tree_select_index].scroll_position;

          //원래 scroll 위치를 기록한다.
          tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);
      //}

    } break;

    case d_TREE_find :
    {
      //[2019.02.16.토][추가]{------------------------------------------------
      //[전체찾기:결과] 로 만들어지는 [찾기목록] 을 정리해서 보여주는데 필요.
      //}---------------------------------------------------------------------

      //[tree 선택]
      //{
          tree_tree_Form->_tree_select_index = d_TREE_find;

          _scroll_v_Form->_position= tree_tree_Form->_tree[tree_tree_Form->_tree_select_index].scroll_position;

          //원래 scroll 위치를 기록한다.
          tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);
      //}

    } break;

    case d_TREE_system :
    {
      //[tree 선택]
      //{
          tree_tree_Form->_tree_select_index = d_TREE_system;

          _scroll_v_Form->_position = tree_tree_Form->_tree[tree_tree_Form->_tree_select_index].scroll_position;

          //원래 scroll 위치를 기록한다.
          tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);
      //}

    } break;

    //[2011.07.11.월][추가!!!]
    case d_TREE_dbgExp :
    {
      //[검증식 계산]
      //{
          //[2011.07.21.목][추가!!!]{------------------------------------------
          //현재 [Tree:검증식 보기창] 인 경우는 처리하지 않고 다른 [Tree] 에서
          //전환된 경우만 계산한다.
          //}------------------------------------------------------------------

          if(tree_tree_Form->_tree_select_index != d_TREE_dbgExp)
          {
            //[!]{------------------------------------------------------------
            //다른 [항목] 에서 [검증식 보기창] 으로 변환된 것이므로 계산한다.
            //단, 오류가 발생한 경우는 [값:?] 으로 표시되어야 하므로 여기서
            //종료하지 않고, 다음 단계를 전부 처리한다.
            //}---------------------------------------------------------------

            //[버튼 동작 대기열 등록]
            //{
                //[2011.07.21.목][중요추가!!!]{-------------------------
                //이 [검증식 보기창] 은 반드시 [검증] 시에만 보여지므로
                //일반 적인 경우를 고려할 필요는 없다.
                //}-----------------------------------------------------

                if(main_Form->timeOut_Timer->Enabled == true)
                {
                  //[!]{----------------------------------------------------------------
                  //중복으로 그려지겠지만 [항목 이동] 은 빈번한 것이 아니므로 무시한다.
                  //}-------------------------------------------------------------------

                  main_Form->BtnQueue_Event = _EVENT_TabSelect_DbgExpTree_ViewAll;
                  main_Form->btnQueue_Timer->Enabled = true;

                  //[주의!!!]{-----------------------------------------------
                  //여기서 종료하지 않고, 나머지 기본 처리는 해 주어야 한다.
                  //단지 <DbgExpTree_ViewAll()> 만 처리하지 않는 것이다.
                  //}--------------------------------------------------------

                }
                else
                {
                  //여기서는 다시그리지 않는다.
                  //-----------------v
                  DbgExpTree_ViewAll(false);

                }

            //}

            //[주의!!!]{---------------------------------------------------------------------
            //아래의 <tree_tree_Form->_V_Scroll()> 함수 내부적으로 자동으로 [다시 그리기] 를
            //하기 때문에 여기서 다시 그려줄 필요는 없다.
            //}------------------------------------------------------------------------------

          }

      //}

      //[tree 선택]
      //{
          tree_tree_Form->_tree_select_index = d_TREE_dbgExp;

          _scroll_v_Form->_position = tree_tree_Form->_tree[tree_tree_Form->_tree_select_index].scroll_position;

          //원래 scroll 위치를 기록한다.
          tree_tree_Form->_V_Scroll(_scroll_v_Form->_position, true);
      //}

    } break;

  }

}

void __fastcall Tide_tree_Form::_EVENT_TabSelect_DbgExpTree_ViewAll(void)
{
  //[2011.07.21.목][생성!!!]{----------------------------------------------
  //이 함수가 호출됐을때는 이미 [검증식 보기창] 인 경우가 된다.
  //이는 이 함수가 [검증식 보기창] 으로 전환시 [동작 대기열] 에 등록되므로
  //이 함수가 [실행] 될때는 이미 전환된 이후가 되기 때문이다.
  //
  //이 함수는 <_EVENT_TabSelect()> 함수에서 사용된다.
  //}----------------------------------------------------------------------

  //모든 검증식을 계산해 주고, 다시 그리기 까지 처리한다.
  //-----------------v
  DbgExpTree_ViewAll(true);

}

void __fastcall Tide_tree_Form::_EVENT_findEdit_KeyDown_Esc(void)
{
  //[2022.06.13.월][생성]{-------------------------
  //<키:ESC> 가 눌린 경우는 <_findEdit> 를 감춘다.
  //}----------------------------------------------

  _findEdit->Visible = false;

  //[<순간보기> 문서 감추기]
  //{
      //[2022.06.27.월][추가]{----------------------------------
      //현재 열려있는 [순간보기] 문서가 있다면 무조건 닫아준다.
      //}-------------------------------------------------------

       tree_tree_Form->_Tree_ApiInfo_Hide(d_TREE_apiSrch, false);

  //}

  //[Tree:API 로 북구]
  //{
      //[2022.06.15.수][추가]{---------------------------------------------------------
      //현재 <Tree[d_TREE_apiSrch]> 가 보이는 중이므로 원래 [Tree:API] 로 돌려 놓는다.
      //}------------------------------------------------------------------------------
      
      _tabs_Form->_TabIndex(d_TREE_api);

  //}

  //촛점을 [Tree:API] 로 이동 시켜 놓는다.
  if(tree_tree_Form->Visible == true) { tree_tree_Form->SetFocus(); }

  //[정보창:제목줄]
  //{
      //[2022.06.15.수][추가]{-------------------
      //[정보창] 으로 원래 문자열로 돌려 놓는다.
      //}----------------------------------------

      _captionbar_Form->_Caption("정보창");

  //}

  //[편집기 <Ctrl+P> 로 활성화인 경우]
  //{
      //[2022.07.05.화][추가]{------------------------------
      //이 경우는 [편집기] 로 다시 촛점을 돌려 놓아야 한다.
      //}---------------------------------------------------

      if(ide_tree_Form->_editor_Ctrl_P == true)
      {
        editor_edit_Form->SetFocus();

      }

  //}

}

void __fastcall Tide_tree_Form::_EVENT_findEdit_Change(void)
{
  //[2022.06.19.일][생성]{--------------------------------------------------------
  //[API 검색] 의 주 기능.
  //
  //<_findEdit> 에서 입력되는 문자열이 변경될때 마다 근접단어 정렬 방식으로
  //<txt> 를 검색하여 현재 입력 중인 문자열을 포함하고 있는 모든 항목을 보여준다.
  //}-----------------------------------------------------------------------------

  //[2022.06.21.화][수정]
  //[한줄편집기] 의 [전체 문자열] 을 사용하여 검색.
  //----------------------v
  Ide_Tree_ApiSrch_Search(true);

}

void __fastcall Tide_tree_Form::_EVENT_findEdit_CaretMove(void)
{
  //[2022.06.21.화][생성]{--------------------------------------------------------------
  //[입력지정자:이동] 시에도 [편집기:실시간 선언 정보판] 같이 [입력지정자] 위치까지의
  //문자열을 [검색문자열] 로 보고 이를 검색처리 후 결과를 실시간으로 정렬해서 보여준다.
  //}-----------------------------------------------------------------------------------

  //[2022.06.21.화][추가]
  //[한줄편집기] 의 [입력지정자까지의 문자열] 을 사용하여 검색.
  //----------------------v
  Ide_Tree_ApiSrch_Search(false);

}              

void __fastcall Tide_tree_Form::_EVENT_findEdit_KeyDown_Up(void)
{
  //[2022.06.27.월][생성]{-----------------------------------------------------
  //[Tree:API 검색] 에서 현재 항목의 이전 항목을 선택하고 해당 항목이 API 라면
  //API 정보 문서(gtxt/h) 를 [순간보기] 로 열어준다.
  //}--------------------------------------------------------------------------

  //[VAR]  
  //{
      //긴 이름을 간단하게 사용하기 위하여.
      struct  TREE  *tree;

  //}

  //[Tree 치환]--------------------------------------------------------
  //현재 보여지는 [Tree] 얻기.
  tree = &(tree_tree_Form->_tree[tree_tree_Form->_tree_select_index]);
  //}------------------------------------------------------------------

  lbStart:

  //[KEY:Up]
  //{
      //한 항목 위로 이동
      tree_tree_Form->_Key_Up();

  //}

  //[API 항목 인가?]
  //{
      //현재 항목이 [API] 가 아니라면 [API] 항목이 나올때 까지 다시 이동.
      if((tree->items[tree->select_itemindex].bmpindex != d_ITEMBMP_api) &&
         (tree->items[tree->select_itemindex].bmpindex != d_ITEMBMP_root)) goto lbStart;

  //}

  //[순간보기]
  //{
      //[!]{-----------------------------------------------------
      //현재 API 정보 문서인 <gtxt/h> 를 [순간보기] 로 보여준다.
      //}--------------------------------------------------------

      //깜박임 방지 처리 사용------------------------------------------------v
      tree_tree_Form->_Tree_ApiInfo_Hide(tree_tree_Form->_tree_select_index, true);

      tree_tree_Form->_Tree_ApiInfo_View(tree_tree_Form->_tree_select_index, tree->select_itemindex);

      //[<순간보기> 문서 후처리:편집기 요소 다시 그리기]
      //{
          //[!]{----------------------------------------------------------------
          //위에서 [순간보기] 시 [깜박임방지] 처리를 했으므로 여기서 반드시
          //[편집기 요소] 를 다시 그려준다.
          //이는 깜박임 방지 처리시에는 다시 그리기가 중지 되기 때문.
          //
          //물론 여기서 문서를 여는 경우는 <Tree:API/API 검색> 의 [순간보기] 로
          //이미 열려 있는 문서를 다시 여는 경우가 되어 다시 그리지 않아도 이전
          //문서 그대로라 상관이 없으나, 확실하게 하기 위해서 다시 그려준다.
          //}-------------------------------------------------------------------

          ide_editor_Form->_Shape();

      //}

  //}

  //[<API 검색:한줄편집기> 에 촛점 맞추기]
  //{
      _findEdit->SetFocus();

  //}    

}

void __fastcall Tide_tree_Form::_EVENT_findEdit_KeyDown_Down(void)
{
  //[2022.06.27.월][생성]{-----------------------------------------------------
  //[Tree:API 검색] 에서 현재 항목의 다음 항목을 선택하고 해당 항목이 API 라면
  //API 정보 문서(gtxt/h) 를 [순간보기] 로 열어준다.
  //}--------------------------------------------------------------------------

  //[VAR]
  //{
      //긴 이름을 간단하게 사용하기 위하여.
      struct  TREE  *tree;

  //}

  //[Tree 치환]--------------------------------------------------------
  //현재 보여지는 [Tree] 얻기.
  tree = &(tree_tree_Form->_tree[tree_tree_Form->_tree_select_index]);
  //}------------------------------------------------------------------

  lbStart:

  //[KEY:Down]
  //{
      //한 항목 아래로 이동
      tree_tree_Form->_Key_Down();

  //}

  //[API 항목 인가?]
  //{
      //현재 항목이 [API] 가 아니라면 [API] 항목이 나올때 까지 다시 이동.
      if((tree->items[tree->select_itemindex].bmpindex != d_ITEMBMP_api) &&
         (tree->items[tree->select_itemindex].bmpindex != d_ITEMBMP_root)) goto lbStart;

  //}
         
  //[순간보기]
  //{
      //[!]{-----------------------------------------------------
      //현재 API 정보 문서인 <gtxt/h> 를 [순간보기] 로 보여준다.
      //}--------------------------------------------------------

      //깜박임 방지 처리 사용------------------------------------------------v
      tree_tree_Form->_Tree_ApiInfo_Hide(tree_tree_Form->_tree_select_index, true);

      tree_tree_Form->_Tree_ApiInfo_View(tree_tree_Form->_tree_select_index, tree->select_itemindex);

      //[<순간보기> 문서 후처리:편집기 요소 다시 그리기]
      //{
          //[!]{----------------------------------------------------------------
          //위에서 [순간보기] 시 [깜박임방지] 처리를 했으므로 여기서 반드시
          //[편집기 요소] 를 다시 그려준다.
          //이는 깜박임 방지 처리시에는 다시 그리기가 중지 되기 때문.
          //
          //물론 여기서 문서를 여는 경우는 <Tree:API/API 검색> 의 [순간보기] 로
          //이미 열려 있는 문서를 다시 여는 경우가 되어 다시 그리지 않아도 이전
          //문서 그대로라 상관이 없으나, 확실하게 하기 위해서 다시 그려준다.
          //}-------------------------------------------------------------------

          ide_editor_Form->_Shape();

      //}

  //}

  //[<API 검색:한줄편집기> 에 촛점 맞추기]
  //{
      _findEdit->SetFocus();

  //}    

}

void __fastcall Tide_tree_Form::_EVENT_tree_tree_Form_KeyDown_Esc(void)
{
  //[2022.06.13.월][생성]{-------------------------
  //<키:ESC> 가 눌린 경우는 <_findEdit> 를 감춘다.
  //
  //단, <d_TREE_apiSrch> 인 경우만 대상으로 한다.
  //}----------------------------------------------

  //[<탭:API 검색> 인가?]
  //{
      //[2022.06.15.수][추가]{----------------------------------------------------
      //<tree_tree_Form->_Key_Ctrl_F()> 에서 보일때 <d_TREE_apiSrch> 지정했으므로
      //여기서는 <d_TREE_api> 가 아니라, <d_TREE_apiSrch> 로 비교해야 한다.
      //그냥 ESC 를 누를수도 있으므로 <d_TREE_api> 인 경우도 같이 처리한다.
      //}-------------------------------------------------------------------------

      if(!((tree_tree_Form->_tree_select_index == d_TREE_api) ||
           (tree_tree_Form->_tree_select_index == d_TREE_apiSrch))) return;

  //}

  if(_findEdit != NULL)
  {
    _findEdit->Visible = false;

    //[<순간보기> 문서 감추기]
    //{
        //[2022.06.27.월][추가]{----------------------------------
        //현재 열려있는 [순간보기] 문서가 있다면 무조건 닫아준다.
        //}-------------------------------------------------------

        tree_tree_Form->_Tree_ApiInfo_Hide(d_TREE_apiSrch, false);

    //}

    //[Tree:API 로 북구]
    //{
        //[2022.06.15.수][추가]{---------------------------------------------------------
        //현재 <Tree[d_TREE_apiSrch]> 가 보이는 중이므로 원래 [Tree:API] 로 돌려 놓는다.
        //}------------------------------------------------------------------------------
        
        _tabs_Form->_TabIndex(d_TREE_api);

    //}

    //[!]{---------------------------------------------------------------------------------
    //이미 [촛점] 이 있어서 [키입력] 이 동작 되고 있으므로 별도로 [촛점] 을 맞추지 않는다.
    //}------------------------------------------------------------------------------------

    //[정보창:제목줄]
    //{
        //[2022.06.15.수][추가]{-------------------
        //[정보창] 으로 원래 문자열로 돌려 놓는다.
        //}----------------------------------------

        _captionbar_Form->_Caption("정보창");

    //}

    //[편집기 <Ctrl+P> 로 활성화인 경우]
    //{
        //[2022.07.05.화][추가]{------------------------------
        //이 경우는 [편집기] 로 다시 촛점을 돌려 놓아야 한다.
        //}---------------------------------------------------

        if(ide_tree_Form->_editor_Ctrl_P == true)
        {
          editor_edit_Form->SetFocus();

        }

    //}

  }

}

//----------------------------------------------------------------------------------------------
//[부가함수]------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------

void __fastcall Tide_tree_Form::_Tab_Change(bool  pTdefault_Fdebug)
{
  //[2011.07.13.수][생성!!!]{-----------------------------------------------
  //[일반] 시와 [검증시] 의 구성이 다르므로 이를 구분 처리하도록 한다.
  //
  //이 함수는 [가상기계개발/검증] 의 전환분에서 호출되어 [정보창] 의 기능을
  //전환해 주는 역활을 한다.
  //}-----------------------------------------------------------------------

  //[항목 설정]
  //{
      //[!]{-------------------------------------------------------------
      //[선택제목] 의 항목이 늘거나 주는 것은 실제 [Tree] 와는 무관하다.
      //}----------------------------------------------------------------

      if(pTdefault_Fdebug == true)
      {
        //[!]{-------------------------------------------------------------------------
        //[상태정보/검증식보기] 는 [검증] 과 관련있는 것이므로 [기본] 에서는 제외한다.
        //}----------------------------------------------------------------------------

        //[2019.02.16.토][추가]
        //[찾기] 를 상시 표기 항목으로 추가([전체찾기:결과] 표시를 위한것).
        //-------------------------------------------------------v
        _tabs_Form->_Tabs(" 설계묶음 \r\n 설계정보 \r\n API \r\n 찾기 ");

        //[Tree 전환]
        //{
            //[!]{---------------------------------------------------------------------------
            //현재 [상태정보] 나 [검증식보기] 중 하나라면 강제로 [설계묶음] 으로 전환시킨다.
            //}------------------------------------------------------------------------------

            if((tree_tree_Form->_tree_select_index == d_TREE_system) ||
               (tree_tree_Form->_tree_select_index == d_TREE_dbgExp))
            {
              //[!]{-------------------------------------------
              //강제로 [설계묶음] 으로 전환시킨다.
              //이는 [선택제목] 을 전환하면 자동으로 처리된다.
              //}----------------------------------------------
              
              _tabs_Form->_TabIndex(d_TREE_project);

            }
            
        //}

      }
      else
      {
        //[!]{-----------------------------------------
        //[상태정보/검증식보기] 를 [검증] 에 추가한다.
        //}--------------------------------------------

        //[2019.02.16.토][추가]
        //[찾기] 를 상시 표기 항목으로 추가([전체찾기:결과] 표시를 위한것).
        //-------------------------------------------------------v
        _tabs_Form->_Tabs(" 설계묶음 \r\n 설계정보 \r\n API \r\n 찾기 \r\n 상태정보 \r\n 검증보기 ");

      }

  //}

}

