
#include "font.h"

#include "GScrollV.h"
#include "GScrollH.h"
#include "GEdgeBox.h"

//[폼디자인:모드]
//[2018.06.24.일][추가!!!]
#include "GVmos.h"
#include "GCover.h"


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


struct GPrintBox_PRINTITEM
{
  //[2010.02.19.금][생성!!!]{-------------------
  //출력시 설정되는 출력설정값 한개를 관리한다.
  //}-------------------------------------------

  int  line;       //적용을 시작할 행번호(기본 : 0).
  int  fontColor;  //문자색.
  int  fontStyle;  //문자속성(기본/굵은).
  int  backColor;  //행 자체의 배경색(전체행에 색이 입혀진다).

};



class TGPrintBox_Form : public TForm
{
__published:	// IDE-managed Components
        void __fastcall FormMouseWheel(TObject *Sender, TShiftState Shift,
          int WheelDelta, TPoint &MousePos, bool &Handled);
        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 FormResize(TObject *Sender);
private:	// User declarations
public:		// User declarations

        __fastcall TGPrintBox_Form(TComponent* Owner);

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

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

        //}

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

        //}

        //[생성자]
        //{
            //[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_;

            Graphics::TBitmap  *_bmp_back_;
            //}-----------------------------

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

            //[내부 부품]
            //{
                //[2010.02.18.목][추가!!!]{----
                //줄이동자를 위한 내부 부품들.
                //}----------------------------

                TGScrollV_Form  *_scrollV;
                TGScrollH_Form  *_scrollH;
                TGEdgeBox_Form  *_edgeBox;

            //}

        //}

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

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

                void  *_GPart;

            //}

        //}

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

        //[유/무효]
        //{
            //[2018.08.26.일][추가!!!]
            void __fastcall _Enable(bool  pEnable);

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

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

                //사용 폰트를 적용한 문자 한개의 넓이.
                int  _word_width;

            //}

        //}

        //[문서관리]
        //{
            //[2010.02.18.목][추가!!!]

            //[VAR]
            //{
                //실제 표시할 내용의 위치.
                //이 [그림부품] 자체적으로 문자열을 보관 관리 하지 않으며, 해당 저장소의
                //위치만 받아서 직접 사용한다.
                char  *_buf;

                //표시할 내용의 전체 크기('\0' 까지 포함된 크기).
                //만일 이 크기를 넘는 경우는 <_buf[]> 를 비우고 처음부터 다시 저장한다.
                //반드시 사용하기전에 이 크기를 지정해 주어야 한다.
                int    _bufSize;

                //현재까지 저장돼 있는 크기(내부적으로 자동 관리된다).
                int    _bufCount;

            //}

            //[2010.02.19.금][완료!!!]
            void __fastcall _Buf(char  *pBuf);

            //[2010.02.19.금][완료!!!]
            void __fastcall _BufSize(int  pBufSize);

            //[2010.02.18.목][완료!!!]
            void __fastcall _Print(char  *pSTR);

            //[2010.02.18.목][완료!!!]
            void __fastcall _PrintAdd(char  *pSTR);

        //}

        //[배경]
        //{
            //[VAR]
            //{
                //[2010.02.18.목][추가!!!]{-------------------------------------------------
                //[배경그림 이름] 을 관리한다.
                //이는 [배경밝기  를 조정하는 경우 다시 그림을 불러들여 처리해야 하므로
                //반드시 필요하다.
                //
                //[참고!!!]-----------------------------------------------------------------
                //단, 처음에는 [배경그림] 을 사용하지 않는데 이 경우 <_backBmpPath : ""> 로
                //어떤 그림도 지정돼 있지 않으면 된다.
                //이경우 자동으로 지정 [배경색] 이 [배경그림] 을 대신하게 된다.
                //}-------------------------------------------------------------------------

                AnsiString  _backBmpPath;

                //배경 밝기(기본값 : 225).
                int         _backBrightness;

                //<_backBmpUse : false> 인 경우 그림대신 바탕에 칠할색.
                int         _backColor;

            //}

            //[2010.02.18.목][완료!!!]
            void __fastcall _EditorBack_Brightness(int  pBrightness);

            //[2018.07.31.화][완료!!!]
            void __fastcall _EditorBack_SetJpeg(//맷돌 API 구성이 용이하게 <AnsiString> 으로 하지 않는다.
                                                char  *pJpegFilePath);

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

        //}

        //[테두리]
        //{
            //[VAR]
            //{
                //[2010.02.18.목][추가!!!]
                int  _borderColor;

            //}

            //[2010.02.19.금][완료!!!]
            void __fastcall _BorderColor(int  pBorderColor);

        //}

        //[줄이동자]
        //{
            //[2010.02.18.목][추가!!!]{-------------------------------------------------------------
            //[수평/수직 줄 이동자] 의 색을 설정한다.
            //[테두리색] 은 <_borderColor> 와 동일하게 설정되므로 순수하게 내부 색만 설정하면 된다.
            //이는 [편집기] 의 설정과 동일하다.
            //
            //기본적인 색은 _BorderColor() 에서 [편집기 테두리색] 과 동일하게 설정된다.
            //그러므로, 아래 함수를 사용할때는 반드시 _BorderColor() 함수를 사용한 뒤에
            //사용해야 한다.
            //}-------------------------------------------------------------------------------------

            //[2010.02.14.일][완료!!!]
            void __fastcall _ScrollVColor(int  pColor);

            //[2010.02.14.일][완료!!!]
            void __fastcall _ScrollHColor(int  pColor);

        //}

        //[출력설정]
        //{
            //[2010.02.19.금][추가!!!]{-----------------------------------------
            //출력시 반영할 설정값을 관리한다.
            //이는 한번 출력하는 것이 아니라 계속 [줄이동자] 등으로 다시 그리고
            //보여 주어야 하기 때문에 관리가 필요하다.
            //}-----------------------------------------------------------------

            //[VAR]
            //{
                //[2010.02.19.금][추가!!!]{--------------------------------------
                //[출력설정] 을 관리하며, 추가된 행 순으로 적용되고, 현재 설정은
                //다시 새로운 설정이 추가되기 전까지 계속 적용된다.
                //모든 정보는 자동으로 관리된다.
                //}--------------------------------------------------------------

                //기본적으로 100 개를 사용하고 부족한 경우는 추가로 100개씩 동적생성한다.
                #define  d_PrintItemsMax    100
                struct GPrintBox_PRINTITEM  *_printItems;
                int                          _printItemsSize;  //생성된 크기(기본 : 100).
                int                          _printItemsCount; //현재까지 저정돼 있는 개수.

                //실제 출력시 적용되는 기본 설정.
                //반드시 초기화 해주어야 한다.
                struct GPrintBox_PRINTITEM   _printItem;

                //[2010.02.19.금][추가!!!]
                //현재 문자열을 출력할 [행 번호] 를 가진다.
                //이는 문자열이 출력될때마다 자동으로 계산된다.
                //이때 계산하는 것이 가장 확실하고 간단하다(어차피 행단위로 출력하므로).
                int                          _printLine; //(기본값 : 0)

            //}

            //[2010.02.19.금][완료!!!]
            void __fastcall _PrintItem_Set(int  pFontColor,
                                           int  pFontStyle,
                                           int  pBackColor);

            //[2022.01.19.수][완료]                               
            int __fastcall _PrintItem_Search(int  pLine);

            //[부가함수]
            //{
                //[2010.02.19.금][완료!!!]
                void __fastcall _PrintItem_Clear(void);

                //[2010.02.19.금][완료!!!]
                void __fastcall _PrintItem_Add(struct GPrintBox_PRINTITEM  *pPrintItem);

            //}

        //}

        //[크기 조정]
        //{
            //[2010.03.12.금][완료!!!]
            void __fastcall _Left(int  pLeft);

            //[2010.03.12.금][완료!!!]
            void __fastcall _Top(int  pTop);

            //[2010.03.12.금][완료!!!]
            void __fastcall _Width(int  pWidth);

            //[2010.03.12.금][완료!!!]
            void __fastcall _Height(int  pHeight);

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

        //}

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

            //[2010.03.12.금][완료!!!]
            void __fastcall _Resize(void);

            void __fastcall _Draw(void);

            //[2018.08.26.일][완료!!!]
            //[2022.01.19.수][완료]
            void __fastcall _Text(void);

            //[2020.10.14.수][완료]
            void __fastcall _BufAdd(//저장소 처음부터 다시 저장하는 경우는 true.
                                    bool   pClearAdd,
                                    char  *pStr);

            //[2019.02.03.일][완료!!!]
            void __fastcall _Scroll_Set(void);

        //}

        //[동작함수]
        //{
            //[2018.07.29.일][완료!!!]
            void __fastcall _EVENT_V_Scroll(void);

            //[2010.02.18.목][처리중!!!]
            void __fastcall _EVENT_V_MouseDown(void);

            //[2018.07.29.일][완료!!!]
            void __fastcall _EVENT_H_Scroll(void);

            //[2010.02.18.목][처리중!!!]
            void __fastcall _EVENT_H_MouseDown(void);

        //}

        //[폼디자인:모드]
        //{
            //[2018.06.24.일][추가!!!]

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

            //}

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

            //}

            void __fastcall _FormDesignMode(bool  pUse);

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

            //}

        //}


        

};

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

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

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

//}

//---------------------------------------------------------------------------
extern PACKAGE TGPrintBox_Form *GPrintBox_Form;
//---------------------------------------------------------------------------
#endif
