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

#include <vcl.h>
#pragma hdrstop

#include "gui_radio_button.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tgui_radio_button_Form *gui_radio_button_Form;
//---------------------------------------------------------------------------


#include "ide_main.h"
#include "ide_library.h"
#include "gui.h"

//[2008.02.03.일][추가!!!]
#include "ide_BalloonBox.h"


//[2007.09.29.토][생성!!!]
//{
    //<gui_bmpbutton> 를 사용하여 TCheckBox 와 같은 것을 만든다.
    //그림버튼을 가지고 구현하는 것이 제일 간단하다.
//}


__fastcall Tgui_radio_button_Form::Tgui_radio_button_Form(TComponent* Owner)
        : TForm(Owner)
{

  //[VAR]
  //{
      AnsiString  bmp_path;
      
  //}

  //[환경변수]
  //{
      //[2007.10.02.화][추가!!!]
      IDE_Get_Option(&_ide_option);

  //}

  //[초기화]
  //{
      //--------------------------------------------------------------------------
      //크기는 표시되는 내용에 따라 자동으로 처리 되지만 일단 임의 값을 기록한다.
      this->Left     = 0;
      this->Top      = 0;

      //[2009.10.02.금][수정!!!]{--------------------------------------------
      //12*12 => 11*11 로 크기를 수정하였다(훨씬 보기 좋음).
      //12*12 크기의 문자와 실체 출력 크기에서 잘 어울리게 좀 작게 만들었다.
      this->Width    = 11;
      this->Height   = 11;
      //}--------------------------------------------------------------------

      this->Color    = clWhite;

      //실제 그림 영역을 생성한다.
      _bmp_ = new Graphics::TBitmap;

      //그림 영역 크기 설정.
      _bmp_->Width       = this->Width;
      _bmp_->Height      = this->Height;

      //24bit bitmap 으로 지정한다.
      _bmp_->PixelFormat = pf24bit;
      //--------------------------------------------------------------------------
  //}

  //[속성 초기화]
  //{
      //실제 그림 영역을 생성한다.
      _bitmap_ = new Graphics::TBitmap;
      //24bit bitmap 으로 지정한다.

      _bitmap_->PixelFormat = pf24bit;

      //[그림 경로 읽기]
      //{
          //[2007.09.29.금][추가!!!]
          bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\control\\radio_btn_all.bmp";

          _Bitmap(bmp_path);

      //}

      //[이미지 영역 정보]
      //{
          _image_x       = 0;
          _image_y       = 0;
          _image_width   = _bmp_->Width;
          _image_height  = _bmp_->Height;

      //}

      //두개의 그림을 index 로 사용한다.(상태 전환을 위하여)
      _index_bitmap = true;
      _index_width  = _image_width;
      _index        = 0;

      //기본적으로 테두리는 없다.
      _border       = false;

      //기본적으로 버튼은 눌리지 않은 것이다.
      _down         = false;

      //기본적으로 마우스가 안에 없는 것이다.
      _in           = false;

      //버튼은 아무것도 눌리지 않은 것이다.
      _mouse_button = d_mouse_null;

      //[2007.09.29.금][추가!!!]
      _checked      = false;

      //[2009.08.09.일][추가!!!]
      _enable       = true;

      _frontColor   = _ide_option->color_0;

  //}

  //[풍선도움말]
  //{
      //[2008.02.03.일][추가!!!]
      //처음에는 사용하지 않는다.
      _balloonHelpUse = false;

      //문자열을 초기화 한다.
      _balloonHelpStr = NULL;
      
  //}

  //[EVENT 함수포인터 초기화]
  //{
      //---------------------------------------------------------
      //외부에서 함수를 등록해서 사용하므로 NULL 로 초기화 한다.
      _EVENT_Down  = NULL;
      _EVENT_Up    = NULL;
      _EVENT_Click = NULL;
      //---------------------------------------------------------
  //}

  //[모양 그리기]
  //{
      _Shape();

  //}

  return;
  
}

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

  if(_balloonHelpStr != NULL) { delete [] _balloonHelpStr; _balloonHelpStr = NULL; }

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

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

}

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

void __fastcall Tgui_radio_button_Form::WndProc(Messages::TMessage  &Message)
{
  //[2006.12.12.화][생성!!!]{-----------------------------------------------------
  //TForm 의 경우는 바탕을 칠하고 OnPaint() 를 발생하게 되므로 실제 _Draw() 를
  //OnPaint() 에서 사용하는 경우는 크기가 변경되는 경우 바로 칠해지지 않아서
  //하얀색 바탕이 그대로 나오게 되어 보기 좋지 않게 된다.
  //따라서 TForm 자체의 바탕을 그리는 WM_ERASEBKGND 에서 바로 _Draw() 를 사용하여
  //그리고 OnPaint() 는 처리하지 않는다.
  //C++Builder 와 같이 완벽하게 처리되는 깜박임이 전혀 없는 화면을 만들수 있다.
  //}-----------------------------------------------------------------------------

  if     (Message.Msg == WM_ERASEBKGND)
  {
    _Draw();

    //바로 죵료하지 않으면 WM_ERASEBKGND 메세지가 다음 TForm::WndProc(Message); 에서
    //다시 처리 되어 TForm->Color 로 칠해지게 되어 _Draw() 로 그린 것이 다 지워지므로
    //바로 종료한다.
    return;

  }
  else if(Message.Msg == CM_MOUSEENTER)
  {
    //마우스가 안에 있음을 알린다.
    _in = true;

    //해당 처리 함수사용.
    if(_EVENT_MouseEnter != NULL)
    {
      _EVENT_MouseEnter();

    }

    //[2008.02.03.일][추가!!!]
    //[풍선도움말] 을 설정해 준다.
    if(_balloonHelpUse == true)
    {
      ide_BalloonBox_Form->_BalloonBox(Mouse->CursorPos.x,
                                       Mouse->CursorPos.y,
                                       true,
                                       _balloonHelpStr);

    }

  }
  else if(Message.Msg == CM_MOUSELEAVE)
  {
    //마우스가 안에 없음을 알린다.
    _in = false;

    //해당 처리 함수사용.
    if(_EVENT_MouseLeave != NULL)
    {
      _EVENT_MouseLeave();

    }

    //[2008.02.03.일][추가!!!]
    //[풍선도움말] 을 감춘다.
    if(_balloonHelpUse == true)
    {
      ide_BalloonBox_Form->_Hide();

    }

  }

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

  return;

}

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

void __fastcall Tgui_radio_button_Form::_BalloonHelpUse(bool    pUse)
{
  //[2008.02.03.일][생성!!!]{-----------------
  //[풍선도움말] 기능의 사용 유무를 결정한다.
  //}-----------------------------------------

  _balloonHelpUse = pUse;

  return;

}

void __fastcall Tgui_radio_button_Form::_BalloonHelpStr(char   *pStr)
{
  //[2008.02.03.일][생성!!!]{-----------------
  //[풍선도움말] 에 표시할 문자열을 기록한다.
  //지정된 문자열의 길이만큼 동적 생성한다.
  //}-----------------------------------------

  //지금 버퍼에 내용이 있다면 삭제한다.
  if(_balloonHelpStr != NULL) { delete [] _balloonHelpStr; _balloonHelpStr = NULL; }

  //동적으로 공간을 생성한다.
  //_balloonHelpStr = new char [strlen(pStr) + 1];
  //[동적생성단위적용][2021.01.24.일][수정]
  _balloonHelpStr = new char [UnitX(1024, strlen(pStr) + 1)];

  //문자열을 복사한다.
  STR_Assign(_balloonHelpStr, pStr);

  return;

}

void __fastcall Tgui_radio_button_Form::_Shape(void)
{
  //[2006.11.11.토][생성!!!]

  //[VAR]
  //{
      int  width, height;

      //[2009.08.09.일][추가!!!]

      int  color;
  //}

  //[바탕색]
  //{
      //바탕을 일단 배경색으로 지운다.
      _bmp_->Canvas->Brush->Color = IDE_COLOR_2;
      _bmp_->Canvas->FillRect(_bmp_->Canvas->ClipRect);
      
  //}

  //[비활성화색 얻기]
  //{
      //[2009.04.04.토][추가!!!]{------------------------
      //[비활성화] 인 경우 적용할 색을 미리 구해 놓는다.
      //}------------------------------------------------

      if(_enable == false)
      {
        BMP_Get_Bright_Color(_frontColor, Ide_Bright_RadioBtn_Disable, &color);

      }
      else
      {
        //활성상태인 경우는 기본 그림색을 그대로 사용한다.
        color = _frontColor;

      }

  //}

  //[그림표시]
  //{
      //그림을 표시하면서 지정색에 테두리 색을 사용한다.
      //이는 그림의 색을 테두리 색과 일치하여 보기 좋게 하기 위한 것이다.

      //[index 그림 접근]{-------------------------------------------------------------------
      //_bitmap_ 의 그림을 index 를 사용하여 부분별로 읽어서 _bmp_ 의 그림영역에 올려준다.
      //높이는 _bitmap_->Height 와 같은 것으로 간주하고, 폭만 _index_width 의 값을 적용한다.
      //}------------------------------------------------------------------------------------

      if(_index_bitmap == true)
      {
        BMP_Copy_ChangeColor(//원본 정보.
                             _bitmap_, _index*_index_width, 0, _index_width, _bitmap_->Height,
                             //복사본 정보.
                             _bmp_, _image_x, _image_y, _image_width, _image_height,
                             //바꿀 대상 색.
                             clBlack,
                             //바꿀색.(테두리색)
                             color);
      }
      else
      {
        BMP_Copy_ChangeColor(//원본 정보.
                             _bitmap_, 0, 0, _bitmap_->Width, _bitmap_->Height,
                             //복사본 정보.
                             _bmp_, _image_x, _image_y, _image_width, _image_height,
                             //바꿀 대상 색.
                             clBlack,
                             //바꿀색.(테두리색)
                             color);
      }
      
  //}

  //[버튼 눌림 여부 처리]
  //{
      //버튼이 늘린 경우는 그림을 반전 시켜 주어야 한다.
      //이미 출력된 _bmp_ 를 반전시키는 것으로 처리한다.
      //원본과 복사본을 전부 _bmp_ 로 하면 자신을 그대로 변환시킬수 있다.

      //[2007.09.29.금][수정!!!]
      //확인표시만 중요하므로 반전 처리는 하지 않는다.
      /*
      if(_down == true)
      {
        //반전 시킨다.
        BMP_Self_ChangeColor2(_bmp_,
                              //테두리색 -> 바탕색
                              IDE_COLOR_0, IDE_COLOR_2,
                              //바탕색   -> 테두리색.
                              IDE_COLOR_2, IDE_COLOR_0);
      }
      */

  //}

  //[테두리 만들기]
  //{
      //테두리는 [유/무] 를 선택하여 처리한다.
      if(_border == true)
      {
        _bmp_->Canvas->Pen->Color   = color;
        _bmp_->Canvas->Pen->Width   = 1;
        _bmp_->Canvas->Brush->Style = bsClear;
        _bmp_->Canvas->Rectangle(_bmp_->Canvas->ClipRect);

      }
  //}

  //[view]{-------------
  //그린 것을 보여준다.
  _Draw();
  //}-------------------

  return ;

}

void __fastcall Tgui_radio_button_Form::_Border(bool  pBORDER)
{
  //[2006.11.12.일][생성!!!]

  _border = pBORDER;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_Left(int  pLEFT)
{
  //[2006.11.12.일][생성!!!]

  this->Left = pLEFT;

  return ;

}

void __fastcall Tgui_radio_button_Form::_Top(int  pTOP)
{
  //[2006.11.12.일][생성!!!]

  this->Top = pTOP;

  return ;

}

void __fastcall Tgui_radio_button_Form::_Width(int  pWIDTH)
{
  //[2006.11.12.일][생성!!!]

  this->Width = pWIDTH;

  //[bmp 크기 조정]
  //{
      //다른 컨트롤과 달리 크기 조정이 될수 있으므로 이 경우 bmp 도 같이 조정한다.
      _bmp_->Width = this->Width;
  //}

  //높이가 바뀌었으므로 다시 그려준다.
  _Shape();

  return ;

}

void __fastcall Tgui_radio_button_Form::_Height(int  pHEIGHT)
{
  //[2006.11.12.일][생성!!!]

  this->Height = pHEIGHT;

  //[bmp 크기 조정]
  //{
      //다른 컨트롤과 달리 크기 조정이 될수 있으므로 이 경우 bmp 도 같이 조정한다.
      _bmp_->Height = this->Height;
  //}

  //높이가 바뀌었으므로 다시 그려준다.
  _Shape();

  return ;

}

void __fastcall Tgui_radio_button_Form::_Bitmap(AnsiString  pBITMAPname)
{
  //[2006.11.12.일][생성!!!]

  //지정 이름의 bmp 를 읽어들인다.
  _bitmap_->LoadFromFile(pBITMAPname);

  //24bit bitmap 으로 지정한다.
  _bitmap_->PixelFormat = pf24bit;

  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_IndexBitmap(bool  pINDEXBITMAP)
{
  //[2006.11.12.일][생성!!!]

  _index_bitmap = pINDEXBITMAP;

  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_IndexWidth(int  pINDEXWIDTH)
{
  //[2006.11.12.일][생성!!!]

  _index_width = pINDEXWIDTH;

  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_Index(int  pINDEX)
{
  //[2006.11.12.일][생성!!!]

  _index = pINDEX;

  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_Image_X(int  pIMAGEx)
{
  //[2006.11.12.일][생성!!!]

  _image_x = pIMAGEx;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_Image_Y(int  pIMAGEy)
{
  //[2006.11.12.일][생성!!!]

  _image_y = pIMAGEy;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_Image_Width(int  pIMAGEwidth)
{
  //[2006.11.12.일][생성!!!]

  _image_width = pIMAGEwidth;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_Image_Height(int  pIMAGEheight)
{
  //[2006.11.12.일][생성!!!]

  _image_height = pIMAGEheight;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_radio_button_Form::_Draw(void)
{
  //[2006.11.11.토][생성!!!]

  BitBlt(this->Canvas->Handle, 0, 0,
         this->Width, this->Height,
         _bmp_->Canvas->Handle, 0, 0, SRCCOPY);

  return;

}

void __fastcall Tgui_radio_button_Form::_Checked(bool pChecked)
{
  //[2007.09.29.금][생성!!!]{------------
  //_checked 의 상태를 설정한다.
  //설정 상태는 즉시 반영해 주어야 한다.
  //}------------------------------------

  _checked = pChecked;

  //그림을 바꾼다.
  if(_checked == true)
  {
    //체크된 것으로 표시한다.
    _Index(1);

  }
  else
  {
    //체크되지 않은 것으로 표시한다.
    _Index(0);

  }

  return;

}

void __fastcall Tgui_radio_button_Form::_Enable(bool  pEnable)
{
  //[2009.08.09.일][생성!!!]{----------------------------------------------
  //현재 [버튼] 이 비활성화 되는 경우를 처리한다.
  //
  //[방법]-----------------------------------------------------------------
  //(1) 먼저 버튼의 그림을 최대한 밝게 하여 비활성 상태라는 것을 알려준다.
  //(2) 버튼을 비활성화 시킨다.
  //}----------------------------------------------------------------------

  _enable = pEnable;

  //다시 그려서 반영한다.
  _Shape();

  //비활성화 시킨다.
  this->Enabled = _enable;

  return;

}

void __fastcall Tgui_radio_button_Form::_FrontColor(int  pFrontColor)
{
  //[2009.08.09.일][생성!!!]{---
  //현재 [대표색] 을 설정한다.
  //}---------------------------

  _frontColor = pFrontColor;

  //다시 그려서 반영한다.
  _Shape();
  
  return;

}

//------------------------------------------------------------------------------
//[EVENT]-----------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tgui_radio_button_Form::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2006.11.12.일][생성!!!]

  switch(Button)
  {
    case  mbLeft :
    {
      //[버튼 기록]{----------------
      _mouse_button = d_mouse_left;
      //}---------------------------

      //버튼을 눌린 상태로 표시한다.
      _down = true;

      _Shape();

    } break;

    case  mbRight :
    {
      //[버튼 기록]{-----------------
      _mouse_button = d_mouse_right;
      //}----------------------------

    } break;

    case  mbMiddle :
    {
      //[버튼 기록]{------------------
      _mouse_button = d_mouse_middle;
      //}-----------------------------

    } break;

  }

  //해당 처리 함수사용.
  if(_EVENT_Down != NULL)
  {
    //[풍선도움말 감추기][2008.04.05.토][추가!!!]{----------------
    //다른 기능이 동작한다면 표시하지 않아야 한다.
    if(_balloonHelpUse == true) { ide_BalloonBox_Form->_Hide(); }
    //}-----------------------------------------------------------

    _EVENT_Down();

  }

  return;
}

void __fastcall Tgui_radio_button_Form::FormMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2006.11.12.일][생성!!!]

  //[OnClick 발생]
  //{
      //[2006.12.08.목][추가!!!]{------------------------------------------
      //Form 의 OnClick-Event 는 동작 속도가 늦고 제대로 동작되지 않으므로
      //아예 직접 만든다. OnDown, OnUp 은 다른 것과 같이 빠르게 동작된다.
      //((_down == true) && (_in == true)) 인 경우만 발생한다.
      //}------------------------------------------------------------------

      if((_down == true) && (_in == true))
      {
        //[check 상태 전환]
        //{
            //[2007.09.29.금][추가!!!]
            //_checked 의 상태를 반전시킨다.
            _checked = (!_checked);

            //그림을 바꾼다.
            if(_checked == true)
            {
              //체크된 것으로 표시한다.
              _Index(1);

            }
            else
            {
              //체크되지 않은 것으로 표시한다.
              _Index(0);

            }

        //}

        //OnClick 을 발생시킨다.
        if(_EVENT_Click != NULL)
        {
          //[풍선도움말 감추기][2008.04.05.토][추가!!!]{----------------
          //다른 기능이 동작한다면 표시하지 않아야 한다.
          if(_balloonHelpUse == true) { ide_BalloonBox_Form->_Hide(); }
          //}-----------------------------------------------------------

          _EVENT_Click();

        }

      }
  //}

  //버튼이 올라온 상태로 표시한다.
  _down = false;

  _Shape();

  //해당 처리 함수사용.
  if(_EVENT_Up != NULL)
  {
    //[풍선도움말 감추기][2008.04.05.토][추가!!!]{----------------
    //다른 기능이 동작한다면 표시하지 않아야 한다.
    if(_balloonHelpUse == true) { ide_BalloonBox_Form->_Hide(); }
    //}-----------------------------------------------------------

    _EVENT_Up();

  }

  //[버튼 기록]{----------------
  //모두 해제한다.
  _mouse_button = d_mouse_null;
  //}---------------------------

  return;

}

void __fastcall Tgui_radio_button_Form::FormMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  //[2008.02.03.일][추가!!!]{--------------------------------------------------
  //[풍선도움말] 을 설정해 준다.
  ide_BalloonBox_Form->_BalloonBoxPos(Mouse->CursorPos.x, Mouse->CursorPos.y);
  //}--------------------------------------------------------------------------

  return;

}


