
#include "font.h"

#include  "GBalloonBox.h"
#include <ExtCtrls.hpp>

//[폼디자인:모드]
//[2018.06.13.수][추가!!!]
#include "GVmos.h"
#include "GCover.h"
#include <Classes.hpp>


#ifndef GButtonH
#define GButtonH

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

class TGButton_Form : public TForm
{
__published:	// IDE-managed Components
    TTimer *mouseLeaveTimer;
        void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
        void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
        void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y);
    void __fastcall FormClick(TObject *Sender);
    void __fastcall mouseLeaveTimerTimer(TObject *Sender);
    void __fastcall FormResize(TObject *Sender);
private:	// User declarations
public:		// User declarations

        __fastcall TGButton_Form(TComponent* Owner);

        //[2012.04.30.월][완료!!!]
        __fastcall ~TGButton_Form(void);

        //[그림부품 독립구동]
        //{
            //[2018.10.13.토][추가!!!]
            void __fastcall CreateParams(TCreateParams &Params);

        //}

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

        //}

        //[환경변수]
        //{
            //[2018.04.25.수][추가!!!]{---
            //[Linux:wine] 지원을 위한것.
            //}---------------------------

            struct  IDE_OPTION   *_ide_option;

        //}

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

            bool  _this_;

        //}

        //[사용구분]
        //{
            //[2012.05.05.토][설명!!!]{----------------------------------------------------
            //[편집기] 는 [GVmos] 상의 [공용그림부품] 이 아니므로 <_GUse> 값으로
            //BCB 용으로 사용되는지 [맷돌C:그림부품] 으로 사용되는지 쉽게 구분가능하다.
            //이 구분은 일반 [그림부품] 에는 필요없고, 내부적으로 <MsgBox> 를 사용하는
            //그림부품에서만 필요하다.
            //
            //1) <_GUse==NULL> : BCB 용.
            //
            //2) <_GUse!=NULL> : [맷돌C:그림부품] 용.
            //
            //이 구분은 <MsgBox> 때문인데 [모달/유사모달] 로 처리할지를 결정하기 위한것.
            //
            //1) 의 경우는 [모달] 로 일반 적으로 보여준다.
            //2) 의 경우는 [맷돌C:그림부품] 용으로 [유사모달] 처리된다.
            //   단, 이 경우는 [맷돌C:API] 에서 VMOS 로 구동 처리된다.
            //
            //<API:_GMsgBox_기본_()> 원본 [설계묶음] 안의 설명을 참고한다.
            //
            //[중요!!!]--------------------------------------------------------------------
            //
            //[맷돌C] 용으로 사용하는 경우는 반드시 <GXXX_Create()> 함수를 사용하므로
            //이 함수안에서만 <true> 로 설정되고, 나머지는 <false> 로 설정해야 한다.
            //단, [공용그림부품] 의 경우는 <GXXX_Create()> 를 사용하지 않고 <gui_part.cpp>
            //안에 선언돼 있는 <GPART_GMsgBox_Create()> 등으로 선언되므로 반드시 이 안에서
            //<true> 로 선언해 주어야 한다.
            //}----------------------------------------------------------------------------

            //처음에는 반드시 BCB 용으로 설정.
            bool  _GUse; //(기본값:false)

        //}

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

            //버튼이 눌린 상태라면 true.
            bool                _down;

            //마우스포인터가 안에 있는 경우는 true.
            //이는 OnClick [동작함수] 를 만들기 위하여 필요하다.
            //(BASE : false)
            bool                _in;

            //눌린 버튼의 종류를 기록한다.
            int                 _mouse_button;
            //{
                #define  d_mouse_null    0
                #define  d_mouse_left    1
                #define  d_mouse_right   2
                #define  d_mouse_middle  3

            //}

        //}

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

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

            //[식별자]
            //{
                //[2010.02.25.목][추가!!!]{----------------------------------------------------
                //사용자가 지정한 [식별자] 로 모든 그림 부품은 모두 다른 값이 지정돼야 한다.
                //이 [식별자] 는 [알림문] 안에 들어 있어, 알림문이 어떤 [그림부품] 의 것인지
                //VMOS 쪽에서 이 [식별자] 확인 만으로 간단하게 구분할수 있게 하기 위한 것이다.
                //[2012.07.09.월][중요수정!!!]*************************************************
                //
                //[생성자(12)] = { [절대주소(8)] + [부품고유ID(2)] + [GID(2)] }
                //
                //로 <GID> 가 추가 되었으므로 사용하지 않고 주석처리.
                //이는 [맷돌C:이벤트] 처리시 생성자] 만으로 쉽게 <GID> 를 구분처리하기 위한것.
                //unsigned short  _GID;
                //}----------------------------------------------------------------------------

            //}

            //[생성자]
            //{
                //[2010.03.04.목][추가!!!]{---------------------------------------------------
                //[생성자] 의 실제 물리위치를 관리한다.
                //이는 직접 해당 API 로 삭제되는 경우는 해당 함수에서 자동으로 [생성자가]
                //초기화 되지만, 다른 [그림부품] 에 생성된 경우, 이 [그림부품] 이 삭제될때
                //자동으로 같이 [삭제] 는 되지만, 해당 [생성자] 는 초기화 되지 않기 때문이다.
                //이를 위하여 [생성자] 를 관리하고, [파괴자] 부분에서 직접 해당 초기화 함수를
                //호출하여 반드시 [생성자] 정보를 초기화 해 주어야 한다.
                //}---------------------------------------------------------------------------

                void  *_GPart;

            //}

        //}

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

        //[글꼴]
        //{
            //[VAR]
            //{
                struct FONTPACK     _font;

                //[2009.04.07.화][추가!!!]
                //문자색을 지정한다.
                int    _fontColor;

                //[2010.01.30.토][추가!!!]
                //문자 형식(BASE : d_FONTSTYLE_default).
                int    _fontStyle;

            //}

            //[2009.04.07.화][완료!!!]
            void __fastcall _FontColor(int  pFontColor);

            //[2010.01.30.토][완료!!!]
            void __fastcall _FontStyle(int  pFontStyle);

        //}

        //[버튼 활성화]
        //{
            //[VAR]
            //{
                //[2012.07.22.일][추가!!!]
                //활성화:true, 비활성화:false 상태만 저장한다(BASE: true).
                bool  _enable;

            //}

            //[2012.07.22.일][완료!!!]
            void __fastcall _Enable(bool  pEnable);

        //}

        //[버튼 문자열]
        //{
            //[VAR]
            //{
                //버튼 문자열.(한글 32 자면 충분할듯)
                //[2010.01.26.화][수정!!!]
                //기본적으로 256 바이트로 설정한다.
                char  _captionStr[256];

                //caption 을 출력할 버튼상의 위치.
                int   _captionX;
                int   _captionY;

                //자동으로 문자가 버튼의 중간에 위치하도록한다.(기본값 : true)
                bool  _captionAutoPos;

            //}

            void __fastcall _Caption(char  *pCAPTION);

            void __fastcall _CaptionX(int  pCAPTIONx);

            void __fastcall _CaptionY(int  pCAPTIONy);

            //[2006.11.09.목][완료!!!]
            void __fastcall _CaptionAutoPos(bool  pAUTOPOS);

        //}

        //[바탕]
        //{
            //[VAR]
            //{
                //[2009.10.02.금][추가!!!]
                //바탕색을 지정한다.
                int   _backColor;

            //}

            //[2009.10.02.금][완료!!!]
            void __fastcall _BackColor(int  pBackColor);

        //}

        //[테두리]
        //{
            //[2010.01.27.수][추가!!!]{----
            //테두리 관련 속성을 추가한다.
            //}----------------------------

            //[VAR]
            //{
                //테두리 유무.
                bool  _border;

                //테두리 색.
                int   _borderColor;

            //}

            //[2010.01.27.수][완료!!!]
            void __fastcall _Border(bool  pBorder);

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

        //}

        //[가선택색]
        //{
            //[2018.04.25.수][추가!!!]{---------------------------
            //[가선택] 관련 속성 추가.
            //[마우스] 가 올려질때 바탕색을 교체하여 알려주는 색.
            //<_borderColor> 의 밝은색으로 기본값 처리.
            //}---------------------------------------------------

            //[VAR]
            //{
                int   _selectColor;

                //[2018.09.23.일][추가!!!]
                //[가선택:색] 기능을 사용할지 유/무.
                //<GButton> 을 [메뉴버튼] 으로 사용하는 경우는 [가선택] 기능이 방해가 된다.
                bool  _selColorUse; //(기본값:true)

            //}

            //[2018.04.25.수][완료!!!]
            void __fastcall _SelectColor(int  pSelectColor);

        //}

        //[풍선도움말]
        //{
            //[VAR]
            //{
                //[2010.01.28.목][추가!!!]{-----------------------------------------
                //[풍선도움말] 에 출력할 문자열을 가진다.
                //단, 메모리 낭비를 막기 위하여 해당 사용이 설정된 경우만 처리한다.
                //}-----------------------------------------------------------------

                bool   _balloonHelpUse; //(기본 : false)

                //동적 생성시 크기를 주어 설정한다.
                char  *_balloonHelpStr;

                //[2010.01.28.목][추가!!!]{------------------------------------------------------
                //[풍선도움말] 사용시 각각의 [그림부품] 에서 [포인터] 로 관리되는 것을 사용한다.
                //[풍선도움말] 은 무조건 1개는 VMOS 차원에서 생성하므로 이것을 받아서 사용한다.
                //즉, [풍선도움말] 은 공유자원으로 분류한다.
                //
                //[2012.05.01.화][생성!!!]{------------------------------------------------------
                //자세한 내용은 <GPART_GFindDialog_GetPtr2()> 함수안 설명 참고.
                //
                //<*> => <**> 로 수정.
                //[개체] 위치가 아니라 이를 관리하는 <전역변수> 의 위치를 관리.
                //[개체] 가 이미 [삭제] 된상태라도 이 [유/무] 를 확인할수 있다.
                //
                //[2012.05.05.토][설명!!!]-------------------------------------------------------
                //[BCB용] 으로 사용하는 경우는 이미 등록돼 있는 [공용부품] 을
                //무시하고 별도로 생성한 [그리부품] 을 등록하면 된다.
                TGBalloonBox_Form  **_GBalloonBox;
                //}------------------------------------------------------------------------------

            //}

            //[2008.02.03.일][완료!!!]
            void __fastcall _BalloonHelpUse(bool  pUse);

            //[2008.02.03.일][완료!!!]
            void __fastcall _BalloonHelpStr(char  *pStr);

        //}

        //[이벤트 사용 유/무]
        //{
            //[2010.03.22.월][추가!!!]{----------------------
            //[이벤트] 사용설정을 위한 것.
            //기본적으로 모두 사용하지 않는 상태이다.
            //이는 오직 [맷돌-C] 안에서 사용될때만 적용된다.
            //}----------------------------------------------

            bool  _evtMDown;
            bool  _evtMUp;
            bool  _evtMClick;
            bool  _evtMEnter;
            bool  _evtMLeave;

        //}

        //[크기조정]
        //{
            //[2006.11.06.월][완료!!!]
            void __fastcall _Left(int  pLEFT);
            void __fastcall _Top(int  pTOP);
            void __fastcall _Width(int  pWIDTH);
            void __fastcall _Height(int  pHEIGHT);

            //[2018.06.17.일][완료!!!][폼디자인:모드]
            void __fastcall _Width_Height(int  pWidth, int  pHeight);

        //}

        //[EVENT 함수]
        //{
            //[주의!!!]{------------------------------------------------------------------------
            //__closure 는 BCB 에만 있는 것이나 멤버함수 함수포인터를 사용하기 위하여 사용한다.
            //}---------------------------------------------------------------------------------

            //버튼의 동작에 따른 처리 함수 포인터를 설정한다.
            void __fastcall (__closure * _EVENT_Down)(void);
            void __fastcall (__closure * _EVENT_Up)(void);
            void __fastcall (__closure * _EVENT_Click)(void);
            void __fastcall (__closure * _EVENT_MouseEnter)(void);
            void __fastcall (__closure * _EVENT_MouseLeave)(void);

        //}

        //[FUNCTION]
        //{
            //[2018.08.26.일][완료!!!]
            void __fastcall _Shape(void);

            //[2006.11.06.월][완료!!!]
            void __fastcall _Draw(void);

            //[2007.11.30.금][완료!!!]
            void __fastcall _BtnUp(void);

        //}

        //[폼디자인:모드]
        //{
            //[속성]
            //{
                //[2018.06.17.일][추가!!!]
                //[그림부품] 을 [폼디자인:모드] 로 사용하는 경우는 true.
                bool  _GFormDesignMode; //(기본값:false)

            //}

            //[부품]
            //{
                //<gui_part.cpp> 에 전역변수로 선언돼 있는 포인터 위치를 참조.
                //유일하게 [한개] 만 존재하므로 초기화 할필요가 없고 관리가 편해진다.
                TGCover_Form  **_GCover;

            //}

            //[2018.06.17.일][완료!!!]
            void __fastcall _FormDesignMode(bool  pUse);

            //[이벤트]
            //{
                //[2018.06.17.일][완료!!!]
                void __fastcall FormDesignMode_FormMouseDown(TObject *Sender, TMouseButton Button,
                                                             TShiftState Shift, int X, int Y);

            //}

        //}


};

//[API GUI 지원함수]
//{
    //[2012.07.09.월][완료!!!]
    void __fastcall GButton_Create(//개체 생성자.
                                   void            *pPart,
                                   //모체 생성자.
                                   void            *pMother,
                                   //사용자가 직접 지정한 [식별자].
                                   unsigned short   pID,
                                   int              pLeft,
                                   int              pTop,
                                   int              pWidth,
                                   int              pHeight,
                                   //생성후 보일것인지 아닌지.
                                   bool             pVisible);

    //[2012.07.09.월][완료!!!]
    void __fastcall GButton_Delete(//개체 생성자.
                                   void  *pPart);

    //[2012.07.09.월][완료!!!]
    void __fastcall GButton_CreatorInit(//개체 생성자.
                                        void  *pPart);

//}

//---------------------------------------------------------------------------
extern PACKAGE TGButton_Form *GButton_Form;
//---------------------------------------------------------------------------
#endif
