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

#include <vcl.h>
#pragma hdrstop

#include "gui_Progress.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tgui_Progress_Form *gui_Progress_Form;
//---------------------------------------------------------------------------


//[2008.03.03.월][생성!!!]
//{
    //<gui_captionbar> 를 사용하여 생성하였다.
    //기본적인 <라벨> 의 역활을 수행한다.

//}


#include "ide_main.h"

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


__fastcall Tgui_Progress_Form::Tgui_Progress_Form(TComponent* Owner)
        : TForm(Owner)
{
  //[환경변수]
  //{
      //[2007.10.02.화][추가!!!]
      IDE_Get_Option(&_ide_option);

  //}

  //[form]
  //{ 
      this->Left   = 0;
      this->Top    = 0;
      this->Width  = 80;
      this->Height = 16;

      this->Color  = clWhite;
  //}

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

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

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

  //[글꼴 설정]
  //{
      //[기본 끌꼴 등록]{------------------------------------------------
      //모든 프로그램에서 기본적으로 사용하는 [system 글꼴] 을 등록한다.
      FONTPACK_SetDefault(&_font);
      //}----------------------------------------------------------------

      _font.margin_size   = 2;

      _font.offset_left   = 0;
      _font.offset_right  = 0;
      _font.offset_top    = 1;
      _font.offset_bottom = 1;

      //[2010.01.26.화][추가!!!]{---
      _font.en_offset_left  = 0;
      _font.en_offset_right = 0;
      //}---------------------------

  //}

  //[환경변수 설정]
  //{
      _backColor           = IDE_COLOR_2;           //배경색. (BASE : 바탕색)
      _borderColor         = _ide_option->color_0;  //테두리 색. (BASE : 테마색)

      _progressBorderColor = _ide_option->color_0;  //진행막대 테두리색. (BASE : 테마색)
      _progressBackColor   = IDE_COLOR_2;           //진행막대 바탕색. (BASE : 바탕색)
      _progressColor       = _ide_option->color_0;  //진행막대 색. (BASE : 테마색)

      _borderGap           = 2;                     //전체 테두리와 진행막대 테두리의 간격. (BASE : 2 pixel)

      _min                 = 0;                     //진행막대 최소값. (BASE : 0)
      _max                 = 100;                   //진행막대 최대값. (BASE : 100)
      _progress            = 50;                    //진행정도.        (BASE : 50)

      //[풍선도움말]{-------------
      //처음에는 사용하지 않는다.
      _balloonHelpUse = false;
      //문자열을 초기화 한다.
      _balloonHelpStr = NULL;
      //}-------------------------

  //}

  //[컨트롤 그리기]
  //{
      //컨트롤을 그려서 모양을 만든다.
      _Shape();
      
  //}

  return;

}

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

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

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

}

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

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

    }

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

    }  

  }

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

  return;

}

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

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

  _balloonHelpUse = pUse;

  return;

}

void __fastcall Tgui_Progress_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_Progress_Form::_Shape(void)
{
  //[2006.10.26.목][생성!!!]{---
  //[2008.03.03.월][수정!!!]
  //그리기 기본 함수.
  //}---------------------------

  //[VAR]
  //{
      TRect   progressBackRect,
              progressRect;

      int     progressBackWidth,
              progressWidth;

  //}

  //[바탕색]
  //{
      _bmp_->Canvas->Brush->Color = _backColor;
      _bmp_->Canvas->FillRect(_bmp_->Canvas->ClipRect);

  //}

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

  //[전체 테두리]
  //{
      _bmp_->Canvas->Pen->Color   = _borderColor;
      _bmp_->Canvas->Pen->Width   = 1;
      _bmp_->Canvas->Brush->Style = bsClear;
      _bmp_->Canvas->Rectangle(_bmp_->Canvas->ClipRect);

  //}

  //[진행 막대 영역 구하기]
  //{
      progressBackRect = _bmp_->Canvas->ClipRect;

      //전체 보다 작은 크기다.
      progressBackRect.Left   += _borderGap;
      progressBackRect.Right  -= _borderGap;
      progressBackRect.Top    += _borderGap;
      progressBackRect.Bottom -= _borderGap;

  //}

  //[진행막대 바탕색 칠하기]
  //{
      _bmp_->Canvas->Brush->Color = _progressBackColor;
      _bmp_->Canvas->FillRect(progressBackRect);

  //}

  //[진행막대색 칠하기]
  //{
      progressRect = progressBackRect;

      //[진행막대 바탕폭 얻기]{-------------------------------------------------
      progressBackWidth = progressBackRect.Width();
      //[진행막대폭 얻기]-------------------------------------------------------
      //[2009.08.10.월][중요수정!!!]
      //0 으로 나누는 경우가 발생할수 있으므로 이경우는 별도로 처리한다.
      if((_max - _min) > 0)
      {
        progressWidth = (progressBackWidth * (_progress - _min)) / (_max - _min);

      }
      else
      {
        //0 으로 나누는 경우는 max==min 이라는 것이므로 전체 길이로 설정한다.
        progressWidth = progressBackWidth;

      }

      progressRect.Right = progressRect.Left + progressWidth;
      //}-----------------------------------------------------------------------

      _bmp_->Canvas->Brush->Color = _progressColor;
      _bmp_->Canvas->FillRect(progressRect);

  //}

  //[진행막대 테두리]
  //{
      _bmp_->Canvas->Pen->Color   = _progressBorderColor;
      _bmp_->Canvas->Pen->Width   = 1;
      _bmp_->Canvas->Brush->Style = bsClear;
      _bmp_->Canvas->Rectangle(progressBackRect);

  //}

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


  return ;

}

void __fastcall Tgui_Progress_Form::_BackColor(int  pBackColor)
{
  //[2008.03.03.월][생성!!!]{--------
  //배경색을 수정하고 다시 그려준다.
  //}--------------------------------

  _backColor = pBackColor;

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_BorderColor(int  pBorderColor)
{
  //[2008.03.03.월][생성!!!]{-----------
  //테두리 색을 수정하고 다시 그려준다.
  //}-----------------------------------

  _borderColor = pBorderColor;

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_ProgressBorderColor(int  pProgressBorderColor)
{
  //[2008.03.09.일][생성!!!]{----------
  //진행막대 테두리색. (BASE : 테마색)
  //}----------------------------------

  _progressBorderColor = pProgressBorderColor;

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_ProgressBackColor(int  pProgressBackColor)
{
  //[2008.03.09.일][생성!!!]{--------
  //진행막대 바탕색. (BASE : 바탕색)
  //}--------------------------------

  _progressBackColor = pProgressBackColor;

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_ProgressColor(int  pProgressColor)
{
  //[2008.03.09.일][생성!!!]{----
  //진행막대 색. (BASE : 테마색)
  //}----------------------------

  _progressColor = pProgressColor;

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_BorderGap(int  pBorderGap)
{
  //[2008.03.09.일][생성!!!]{------------------------------
  //전체 테두리와 진행막대 테두리의 간격. (BASE : 2 pixel)
  //}------------------------------------------------------

  _borderGap = pBorderGap;

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_Min(int  pMin)
{
  //[2008.03.09.일][생성!!!]{---
  //진행막대 최소값. (BASE : 0)
  //}---------------------------

  _min = pMin;

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_Max(int  pMax)
{
  //[2008.03.09.일][생성!!!]{-----
  //진행막대 최대값. (BASE : 100)
  //}-----------------------------

  _max = pMax;

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_Progress(int  pProgress)
{
  //[2008.03.09.일][생성!!!]{------------------------------
  //진행정도.        (BASE : 50)
  //만드시 { _min <= _progress <= _max } 를 만족해야 한다.
  //}------------------------------------------------------

  if     (pProgress < _min)
  {
    _progress = _min;

  }
  else if(pProgress > _max)
  {
    _progress = _max;

  }
  else
  {
    _progress = pProgress;

  }

  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_Left(int  pLeft)
{
  //[2008.03.03.월][생성!!!]{---
  //Left 를 수정한다.
  //}---------------------------

  this->Left = pLeft;

  return;

}

void __fastcall Tgui_Progress_Form::_Top(int  pTop)
{
  //[2008.03.03.월][생성!!!]{---
  //Top 을 수정한다.
  //}---------------------------

  this->Top = pTop;

  return;

}

void __fastcall Tgui_Progress_Form::_Width(int  pWidth)
{
  //[2008.03.03.월][생성!!!]{-------------------------
  //폭을 수정하고 이에 따라 bmp 크기도 같이 수정한다.
  //}-------------------------------------------------

  this->Width   = pWidth;

  //bmp 크기도 다시 조정한다.
  _bmp_->Width  = this->Width;

  //전부 다시 그려준다.
  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_Height(int  pHeight)
{
  //[2008.03.03.월][생성!!!]{---------------------------
  //높이를 수정하고 이에 따라 bmp 크기도 같이 수정한다.
  //}---------------------------------------------------

  this->Height  = pHeight;

  //bmp 크기도 다시 조정한다.
  _bmp_->Height = this->Height;

  //전부 다시 그려준다.
  _Shape();

  return;

}

void __fastcall Tgui_Progress_Form::_Draw(void)
{
  //[2006.10.31.화][생성!!!]

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

  return;

}

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

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

  return;

}

