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

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

#include "font.h"

#include "gui_bmpbutton.h"

//[2009.08.09.일][추가!!!]
#include "gui_radio_button.h"
#include "gui_label.h"
#include <ExtCtrls.hpp>

//[2009.08.14.금][추가!!!]
#include "c_define.h"

//[2011.11.15.화][추가!!!]{----------------------
//[하위항목] 의 일부를 <GList> 를 사용하여 구현.
#include  "GList.h"
//}----------------------------------------------

//[2021.03.24.수][추가]
#include  "GForm.h"

//[2021.03.29.월][추가]
#include  "GImageBox.h"


//[submenu]
//{
    //메뉴 항목 한개당 서브메뉴항목의 최대 수.
    #define  d_submenu_max_count     40
//}

struct SUBITEM
{
  //[설명]{-----------------------
  //subitem 한개의 정보를 갖는다.
  //}-----------------------------

  AnsiString  str[d_submenu_max_count];

  //하위 항목 사용수.
  int         count;
  
  //선택된 항목의 index.
  int         select_index;

};

//[menu]
//{
    //[2009.08.14.금][수정!!!]{---------------------------
    //#if ... #endif 를 사용하여 보다 설정을 쉽게 하였다.
    //}---------------------------------------------------
    
    //<c_define.h 안에 선언>-------------v
    #define  d_Menu_GIGYENICS    Opt_Ide_Gigyenics

    #if    d_Menu_GIGYENICS
    //{
        //개발자용.
        #define  d_menu_count        10  //[전광판] 사용시 11.

    //}
    #elif  !d_Menu_GIGYENICS
    //{
        //일반용.
        #define  d_menu_count        9  //[전광판] 사용시 10.

    //}
    #endif

    //[항목정의]
    //{
        #define  d_menu_project_ix      0
        #define  d_menu_file_ix         1
        #define  d_menu_edit_ix         2

        //[2007.12.13.목][추가!!!]
        #define  d_menu_option_ix       3

        //[2010.05.08.토][추가!!!]
        #define  d_menu_osx_ix          4


        //[2010.07.04.일][추가!!!]{********
        //[가상기계] 만 실행한다.
        #define  d_menu_gvm_ix          5
        //}********************************

        //[2011.11.14.월][추가!!!]{----------------------------------------
        //"ide\gigyenics\gvm\gvms" 안의 <*.gvms> 의 즉시 실행 가능한 목록.
        #define  d_menu_gvms_ix         6

        //"ide\gigyenics\gvm\gvms" 안의 <*.gvms> 의 즉시 설치 가능한 목록.
        #define  d_menu_gvmx_ix         7
        //}----------------------------------------------------------------

        //[2010.02.22.월]
        //[전광판] 사용시 주석 해제.
        //#define  d_menu_dotmatrix_ix    8

        //[2010.12.17.금][수정!!!]
        //[전광판] 은 이제 지원하지 않는다.
        //자원 낭비가 너무 심하다.
        #define  d_menu_help_ix         8  //[전광판] 사용시 9.

        #if  d_Menu_GIGYENICS
        //{
            #define  d_menu_gigyenics_ix     9  //[전광판] 사용시 10

        //}
        #endif

    //}

//}

struct MENUITEM
{
  //[설명]{---------------------------------
  //[주메뉴] 항목 한개의 정보를 갖는다.
  //해당 항목의 sub 항목정보도 전부 갖는다.
  //}---------------------------------------

  //[menuitem]
  //{
      //---------------------------------------------
      //[항목] 한개의 영역정보.
      TRect           rect;
      //[항목] 표시 문자열.
      AnsiString      str;

      //항목이 선택되어 하위 메뉴가 열려있는 것이다.
      //항목은 [토글] 속성을 가지고 있다.
      bool            selected;
      //---------------------------------------------
  //}

  //[subitem]
  //{
      //------------------------
      //각각의 하위 항목.
      struct SUBITEM  subitems;
      //------------------------
  //}

  //[유/무효]
  //{
      //[2010.07.04.일][추가!!!]{---------------------------------------------------
      //특정 조건에서 특정 항목만 처리되어야 할 경우도 있으므로, 이를 위하여
      //false 라면 해당 [하위항목] 이 아예 펼쳐지지 않도록 만들어준다.
      //즉, [메뉴] 의 각 [항목] 을 선별적으로 [유/무효] 화 할수 있다.
      //이는 금일 <*.gvms> 가상기계를 직접 읽어들여 바로 실행하는 경우는 아예
      //다른 [항목] 은 동작되지 않아야 하는 조건을 만족하기 위하여 추가하는 것이다.
      //}---------------------------------------------------------------------------

      bool  enabled; //(기본값 : true).

  //}

};


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

    TTimer *comTxd_Timer;
    TTimer *comRxd_Timer;
        void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
        void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall comTxd_TimerTimer(TObject *Sender);
    void __fastcall comRxd_TimerTimer(TObject *Sender);

private:	// User declarations

public:		// User declarations

        __fastcall Tide_menu_Form(TComponent* Owner);

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

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

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

            //}

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

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

            //[menu]
            //{
                struct  MENUITEM _menuitems[d_menu_count];

                //선택된 [항목] 의 index;
                int              _menuitem_select_index;

                //[메뉴] 폭.
                int              _menu_width;
                int              _menu_height;
            //}

            //[내부 컨트롤]
            //{
                //최소화 버튼.
                Tgui_bmpbutton_Form  *_min_bmpbtns;
                //최대/기본크기 전환 버튼.
                Tgui_bmpbutton_Form  *_max_bmpbtns;
                //닫기 버튼.
                Tgui_bmpbutton_Form  *_close_bmpbtns;

                //[통신상태 LED]
                //{
                    //[2009.08.09.일][추가!!!]{---------------------
                    //[송신/수신] 통신상태 를 보여줄 LED 를 만든다.
                    //}---------------------------------------------

                    Tgui_radio_button_Form  *_comPort_RadioBtn,
                                            *_comTxd_RadioBtn,
                                            *_comRxd_RadioBtn;

                    Tgui_Label_Form         *_comPort_Label,
                                            *_comTxd_Label,
                                            *_comRxd_Label;

                //}

            //}

            //[추가변수]
            //{
                //[2007.03.27.화][추가!!!]
                //이 폼에 [마우스] 가 들어온 경우는 true.
                //단, 순수 [항목] 영역(0 ~ _menu_width 까지)에 한정된다.(옆의 공백은 해당되지 않는다.)
                bool  _mouse_in; //(BASE : false)

            //}

            //[속성]
            //{
                //[2009.04.10.금][추가!!!]
                //이 컨트롤의 [유/무효] 를 설정한다.
                bool  _enable; //(BASE : true)

            //}

        //}

        //[내부 사용 개체]
        //{
            //[특수 하위항목]
            //{
                //[2011.11.15.화][추가!!!]{-------------------------------------------
                //<GVMS(PC)> 와 <GVMX(맷돌)> 항목을 위한 특수 [하위항목] 을 지원한다.
                //목록의 개수가 일반적인 [하위항목 개수] 를 초과할수 있으므로 별도의
                //맷돌용 GUI 로 만든 <GList> 를 사용하여 처리한다.
                //}-------------------------------------------------------------------

                TGList_Form  *_listSubMenu;

                //[하위항목 목록]
                //{
                    //[2011.11.16.수][추가!!!]{----------------------------------
                    //<GVMS> 와 <GVMX> 의 해당 폴더안의 항목을 관리.
                    //<ide_menu> 생성시 자동으로 [지정폴더] 안의 목록을 추출하여
                    //여기에 저장한다.
                    //
                    //[참고!!!]--------------------------------------------------
                    //동적으로 생성하므로 반드시 NULL 로 초기화 해주어야 한다.
                    //NULL 인 경우는 해당 항목이 아무것도 없는 경우.
                    //}----------------------------------------------------------

                    char  *_listSubMenu_GVMS_ItemList;
                    char  *_listSubMenu_GVMX_ItemList;

                //}

                //[동작함수]
                //{
                    //[2023.01.02.월][완료]
                    void __fastcall _EVENT_ItemSelect_listSubMenu(void);

                    void __fastcall _EVENT_FocusSet_listSubMenu(void);

                    //[2023.01.02.월][완료]
                    void __fastcall _EVENT_FocusKill_listSubMenu(void);

                //}

                //[함수]
                //{
                    //[2011.11.16.수][완료!!!]
                    void __fastcall _ListSubMenu_ViewSet(int  pY);

                //}

                //[썸네일 관련]
                //{
                    //[2023.01.02.월][추가]{---------------------------------------------------
                    //[항목선택] 시에 해당 항목(GVMS)의 [썸네일] 을 항목 옆에 보여주기 위한것.
                    //}------------------------------------------------------------------------

                    TGImageBox_Form  *_gvms_GImageBox;

                    //[동작함수]
                    //{
                        //[2023.01.02.월][완료]
                        void __fastcall _EVENT_ItemMouseSelect_listSubMenu(void);

                        //[2023.01.02.월][완료]
                        void __fastcall _EVENT_MouseLeave_listSubMenu(void);

                        //[2023.01.26.목][완료료]
                        void __fastcall _EVENT_MouseEnter_listSubMenu(void);

                    //}

                //}

            //}

        //}

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

            //[2012.06.06.수][완료!!!]
            void __fastcall _Width(int  pWidth);

            //[2009.04.10.금][완료!!!]
            void __fastcall _Enable(bool  pEnable);

            //[2010.07.05.월][완료!!!]
            void __fastcall _ItemEnable(//항목 번호.
                                        int   pItemIndex,
                                        //유(true)/무효(false).
                                        bool  pEnable);

            //[2018.05.09.수][완료!!!]
            void __fastcall _MenuItem_Init(void);

            void __fastcall _Menu(void);

            void __fastcall _Menu2(void);

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

            void __fastcall _SelectNo(void);

            //[2011.11.18.금][완료!!!]
            bool __fastcall _SubMenu_Show(int  pITEMindex);

            void __fastcall _SubMenu_Hide(void);

            //[2011.11.17.목][완료!!!]
            void __fastcall _SubMenu_HideAll(void);

            void __fastcall _Draw(void);

        //}

        //[LED 함수]
        //{
            //[2009.08.09.일][완료!!!]
            void __fastcall _Led_Comport(bool  pTonFoff);

            //[2009.08.09.일][완료!!!]
            void __fastcall _Led_Txd(bool  pTonFoff);

            //[2009.08.09.일][완료!!!]
            void __fastcall _Led_Rxd(bool  pTonFoff);

        //}

        //[EVENT FUNCTION]
        //{
            //[2006.11.26.일][완료!!!]
            void __fastcall _EVENT_MinButton_Click(void);
            void __fastcall _EVENT_MaxButton_Click(void);

            //[2007.04.06.금][완료!!!]
            void __fastcall _EVENT_CloseButton_Click(void);

            //[2018.05.09.수][완료!!!]
            void __fastcall _EVENT_CloseButton_Down(void);

            //[2018.05.08.화][완료!!!]
            void __fastcall _EVENT_CloseButton_Up(void);

            //[2018.05.08.화][완료!!!]
            void __fastcall _EVENT_CloseButton_MouseEnter(void);

            //[2018.05.08.화][완료!!!]
            void __fastcall _EVENT_CloseButton_MouseLeave(void);

            //[2018.05.06.일][완료!!!]
            void __fastcall _EVENT_Select_SubMenuItem(int  pMENUindex,
                                                      int  pSUBMENUindex);
        //}

        //[맷돌 핀배치도 관련]
        //{
            //[2021.03.24.수][추가]
            
            //[VAR]
            //{
                TGForm_Form      *_gmtdlxPin_GForm;

                TGImageBox_Form  *_gmtdlxPin_GImageBox;

            //}

            //[2021.03.29.월][완료]
            void __fastcall GmtdlxPin_View(char  *pJpeg_PathNameExt);

            //[이벤트]
            //{
                void __fastcall _EVENT_Close_gmtdlxPin(void);

            //}

        //}

};
//---------------------------------------------------------------------------
extern PACKAGE Tide_menu_Form *ide_menu_Form;
//---------------------------------------------------------------------------
#endif
