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

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


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


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

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

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

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

  //[항목] 을 표시하는 문자열.(중복될수 있다.)
  char   txt[OPT_Tree_Item_Text_length];

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

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

      int  dbRecIndex;

  //}

};

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

  //[2009.09.13.일][중요수정!!!]{------------
  //동적 생성을 위한 것으로 포인터로 바꾼다.
  struct TREEITEM  *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 를 그릴때 줄기를 그려주기 위하여 필요하다.
      //즉, 그려줄때만 일시적으로 필요하다.
      //------------------------------------------------------------------------
  //}

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

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

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

  //스크롤 위치를 저장한다.
  int  scroll_position;

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

  //}

};


class TGTree_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);

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

        __fastcall TGTree_Form(TComponent* Owner);
        __fastcall ~TGTree_Form(void);

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

        //}

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

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

            //[식별자]
            //{
                //[2010.02.25.목][추가!!!]{----------------------------------------------------
                //사용자가 지정한 [식별자] 로 모든 그림 부품은 모두 다른 값이 지정돼야 한다.
                //이 [식별자] 는 [알림문] 안에 들어 있어, 알림문이 어떤 [그림부품] 의 것인지
                //VMOS 쪽에서 이 [식별자] 확인 만으로 간단하게 구분할수 있게 하기 위한 것이다.
                //}----------------------------------------------------------------------------

                unsigned short  _GID;

            //}

        //}

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

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

            //}

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

                Graphics::TBitmap  *_bmp_back_;

            //}

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

            //}

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

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

                //[bmp]
                //{
                    //-----------------------------------------------------------------------------------
                    //tree 를 만들기 위한 여러 작은 그림들.
                    //처리 속도를 빠르게 하기 위하여 그리지 않고 바로 복사할수 있도록 그림을 사용한다.
                    Graphics::TBitmap  *_bmp_tree_p,   //'+'
                                       *_bmp_tree_m,   //'-'
                                       *_bmp_tree_i,   //'.'
                                       *_bmp_tree_3,   //3방향 줄기.
                                       *_bmp_tree_end; //줄기 끝.

                    //이그림을 copy 할때는 별도의 gui 함수로 clBlack 부분으로 색이 있는 부분만 copy 하여
                    //배경이 비치도록 해야 한다.
                    //------------------------------------------------------------------------------------
                //}

                //[항목 bmp]
                //{
                    //각 항목을 대표하는 [엄지그림].
                    #define  d_ITEMBMP_max  14
                    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

                    //}

                //}

                //[tree]
                //{
                    //[2006.11.19.일][추가!!!]{---------
                    //tree 를 그려줄 3가지 정보 구조체.
                    //}---------------------------------

                    #define  d_TREE_max     4

                    struct TREE         _tree[d_TREE_max];
                    //{
                        #define  d_TREE_project   0
                        #define  d_TREE_info      1
                        #define  d_TREE_api       2
                        #define  d_TREE_system    3

                    //}

                    //표시할 tree 의 순번을 기록한다.([탭] 으로 선택 표시하는 경우)
                    int                 _tree_select_index;

                //}

            //}

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

            //}

        //}

        //[내부 사용 개체]
        //{
            //[빠른목록]
            //{
                //[2009.02.02.월][추가!!!]
                Tide_popup_Form  *_popupMenu;

                //[함수]
                //{
                    //[2009.05.31.일][완료!!!]
                    void __fastcall _PopupMemu_Set(//[빠른목록] 을 설정할 대상을 설정한다.
                                                   int  pTreeIndex);

                    //[2009.05.31.일][완료!!!]
                    void __fastcall _EVENT_PopupMenu_Prj(void);

                    //[2009.05.31.일][완료!!!]
                    void __fastcall _EVENT_PopupMenu_Info(void);

                    //[2009.05.31.일][완료!!!]
                    void __fastcall _EVENT_PopupMenu_Api(void);

                    //[2009.05.31.일][완료!!!]
                    void __fastcall _EVENT_PopupMenu_System(void);

                //}

            //}

        //}

        //[FUNCTION]
        //{
            //[2006.10.26.목][완료!!!]
            void __fastcall _Resize(void);

            void __fastcall _Draw(void);

            void __fastcall _V_Scroll(int  pPOSITION);

            //[TREE 관련]
            //{
                void __fastcall _TreeView(int   pTREEindex,
                                          bool  pCONTROL);

                //[2009.06.02.화][완료!!!]
                void __fastcall _Tree(struct TREE  *pTREE,
                                      bool          pCONTROL);

                //[2009.01.27.화][완료!!!]
                void __fastcall _Item_Init(struct TREEITEM  *pTREEitem);

                //[2009.10.06.화][완료!!!]
                void __fastcall _Item_Text(struct TREEITEM  *pTreeItem,
                                           char             *pText); 

                //[2009.09.13.일][완료!!!]
                void __fastcall _Tree_Delete(struct TREE  *pTree);

                //[2009.09.13.일][완료!!!]
                void __fastcall _Tree_Create(struct TREE  *pTree,
                                             //생성할 크기(관리할 항목 총수).
                                             int           pSize);

                //[2009.09.13.일][완료!!!]
                void __fastcall _Tree_ReSize(struct TREE  *pTree);


                //[2009.09.13.일][완료!!!]
                void __fastcall _Tree_Init(struct TREE  *pTREE,
                                           //[2009.09.13.일][추가!!!]
                                           //초기화시 저장소 크기를 지정할수 있게 한다.
                                           int           pSize);

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

                //[2009.09.13.일][완료!!!]
                bool __fastcall _Tree_Add_NodeItem(struct TREE      *pTREE,
                                                   char             *pNODEname,
                                                   struct TREEITEM  *pITEM);

                void __fastcall _Tree_Get_ItemIndex_withNAME(struct TREE  *pTREE,
                                                             char         *pITEMname,
                                                             int          *rITEMindex);

                //[2009.08.18.화][완료!!!]
                void __fastcall _Tree_Get_ItemIndex_withText(struct TREE  *pTree,
                                                             char         *pItemText,
                                                             int          *rItemIndex);

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

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

                void __fastcall _Tree_Get_XY(struct ITEMXY  *prITEMxy);

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

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


                //[2009.02.02.월][완료!!!]
                void __fastcall _Tree_Get_ThisItemNode_LastItemIndex(struct TREE  *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 TREE    *pTREE,
                                                        int             pLINEnumber,
                                                        int            *rITEMindex,
                                                        int            *rTEXTx,
                                                        int            *rTEXTy);

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

                //[2009.01.27.화][완료!!!]
                void __fastcall _Tree_Get_Node_ItemCount(struct TREE  *pTree,
                                                         //지정 [옹이] 의 [이름].
                                                         char         *pNodeName,
                                                         //이 [옹이] 의 item-index.
                                                         int          *rNodeItemindex,
                                                         //지정 [옹이] 의 직계 가지 수.
                                                         int          *rItemCount);

                //[2009.01.29.목][완료!!!]
                void __fastcall _Tree_Get_Node_ItemIndex_withText(struct TREE  *pTree,
                                                                  //지정 [옹이] 의 [이름].
                                                                  char         *pNodeName,
                                                                  //검사할 <text> 항목.
                                                                  char         *pItemText,
                                                                  //[대/소] 문자 구분 여부(true:구분).
                                                                  bool          pCase,
                                                                  //이 [옹이] 의 item-index.
                                                                  int          *rNodeItemindex,
                                                                  //<text> 를 가진 itemindex.
                                                                  int          *rItemindex);

                //[2009.02.02.월][완료!!!]
                bool __fastcall _Tree_Delete_Item(struct TREE  *pTree,
                                                  //삭제할 itemIndex.
                                                  int           pDeleteItemIndex);

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

                //[2009.02.02.월][완료!!!]
                void __fastcall _Tree_Get_NodeIndex_of_ThisItem(struct TREE  *pTree,
                                                                //지정 itemIndex.
                                                                int           pItemIndex,
                                                                //직계 [옹이] 의 itemIndex.
                                                                int          *rNodeIndex);

                //[2009.05.31.일][완료!!!]
                void __fastcall _Tree_ExpandAll(//처리 대상.
                                                int  pTreeIndex);

                //[2009.05.31.일][완료!!!]
                void __fastcall _Tree_CloseAll(//처리 대상.
                                               int  pTreeIndex);

                //[2009.05.31.일][완료!!!]
                void __fastcall _Tree_ThisItemExpandAll(//처리 대상.
                                                        int  pTreeIndex,
                                                        int  pItemIndex);

                //[2009.05.31.일][완료!!!]
                void __fastcall _Tree_ThisItemCloseAll(//처리 대상.
                                                       int  pTreeIndex,
                                                       int  pItemIndex);

                //[2009.05.31.일][완료!!!]
                void __fastcall _Tree_ThisLevelExpandAll(//처리 대상.
                                                         int  pTreeIndex,
                                                         int  pLevel);

                //[2009.05.31.일][완료!!!]
                void __fastcall _Tree_ThisLevelCloseAll(//처리 대상.
                                                        int  pTreeIndex,
                                                        int  pLevel);

            //}

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

        //}

        //[배경 설정]
        //{
            //[2009.04.20.월][완료!!!]
            void __fastcall _BACKBMP_Brightness(int  pBrightness);

            //[2009.04.20.월][완료!!!]
            void __fastcall _BACKBMP_ChangeJpeg(AnsiString  pJpegFilePath);

        //}



};
//---------------------------------------------------------------------------
extern PACKAGE TGTree_Form *GTree_Form;
//---------------------------------------------------------------------------
#endif
