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

#include <vcl.h>
#pragma hdrstop

#include "gui_page.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tgui_page_Form *gui_page_Form;
//---------------------------------------------------------------------------

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

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

  //}

  //[form]
  //{
      //[고정크기]{-----------------------------------
      //크기는 변화 없이 고정 크기를 갖는다. (13* 16)
      this->Width  = 13;
      this->Height = 16;
      //}---------------------------------------------

      //위치의 초기화는 이 컨트롤을 생성하는 부분에서 수행한다.
      this->Left   = 0;
      this->Top    = 0;

      this->Color  = clWhite;
  //}

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

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

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

  //[환경변수]
  //{
      _arrow_up_downed   = false;
      _arrow_down_downed = false;
  //}

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

      //위 화살표가 눌린 경우 처리 함수를 등록한다.
      _EVENT_ArrowUp   = NULL;

      //아래 화살표가 눌린 경우 처리 함수를 등록한다.
      _EVENT_ArrowDown = NULL;
      //---------------------------------------------------------
  //}

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

  return;

}

__fastcall Tgui_page_Form::~Tgui_page_Form(void)
{
  //[2012.04.29.일][수정!!!]

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

}

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

void __fastcall Tgui_page_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;

  }

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

  return;

}

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

void __fastcall Tgui_page_Form::_Shape_Up_Arrow(bool  pDOWN)
{
  //[2006.10.26.목][생성!!!]

  //[VAR]
  //{
      TRect  rect;
      int    x, y;
      int    color_back;
      int    color_arrow;
  //}

  //[down]
  //{
      if(pDOWN == true)
      {
        //눌린 상태이므로 "반전" 시킨다.
        color_back  = _ide_option->color_0;
        color_arrow = IDE_COLOR_2;
      }
      else
      {
        //기본상태로 만든다.
        color_back  = IDE_COLOR_2;
        color_arrow = _ide_option->color_0;
      }
  //}

  //[바탕색]
  //{
      //위 화살표 영역 절반만 칠한다.
      rect        = _bmp_->Canvas->ClipRect;
      rect.Bottom = this->Height/2;

      _bmp_->Canvas->Brush->Color = color_back;
      _bmp_->Canvas->FillRect(rect);
  //}

  //[위삼각형]
  //{
      for(y = 0; y < 6; y++)
      {
        for(x = (6 - y); x <= (6 + y); x++)
        {
          BMP_Dot(_bmp_, x, y + 1, color_arrow);

        }

      }
  //}

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

  return ;

}

void __fastcall Tgui_page_Form::_Shape_Down_Arrow(bool  pDOWN)
{
  //[2006.10.26.목][생성!!!]

  //[VAR]
  //{
      TRect  rect;
      int    x, y;
      int    color_back;
      int    color_arrow;
  //}

  //[down]
  //{
      if(pDOWN == true)
      {
        //눌린 상태이므로 "반전" 시킨다.
        color_back  = _ide_option->color_0;
        color_arrow = IDE_COLOR_2;
      }
      else
      {
        //기본상태로 만든다.
        color_back  = IDE_COLOR_2;
        color_arrow = _ide_option->color_0;
      }
  //}

  //[바탕색]
  //{
      //위 화살표 영역 절반만 칠한다.
      rect     = _bmp_->Canvas->ClipRect;
      rect.Top = this->Height/2;

      _bmp_->Canvas->Brush->Color = color_back;
      _bmp_->Canvas->FillRect(rect);
  //}

  //[아래삼각형]
  //{
      for(y = 0; y < 6; y++)
      {
        for(x = (6 - y); x <= (6 + y); x++)
        {
          BMP_Dot(_bmp_, x, 14- y, color_arrow);

        }

      }
  //}

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

  return ;

}

void __fastcall Tgui_page_Form::_Shape(void)
{
  //[2006.10.26.목][생성!!!]

  //[모양]
  //{
      _arrow_up_downed   = false;
      _arrow_down_downed = false;

      //[위쪽]
      _Shape_Up_Arrow(_arrow_up_downed);
      //[아래쪽]
      _Shape_Down_Arrow(_arrow_down_downed);
  //}

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

  return ;

}

void __fastcall Tgui_page_Form::_Top(int  pTOP)
{
  //[2006.11.01.수][생성!!!]

  this->Top = pTOP;

  return;

}

void __fastcall Tgui_page_Form::_Left(int  pLEFT)
{
  //[2006.10.28.토][생성!!!]

  this->Left = pLEFT;

  return;

}

void __fastcall Tgui_page_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_page_Form::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2006.10.26.목][생성!!!]{---------------------------------------
  //Y 만 검사하여 [위쪽/아래쪽] 중 어느 화살표가 눌렸는지 확인하고,
  //해당 화살표를 눌린것으로 표시한다.
  //}---------------------------------------------------------------

  if(Button == mbLeft)
  {
    if(Y <(this->Height/2))
    {
      //[위쪽]
      if(page_Timer->Enabled != true)
      {
        //해당 처리 함수를 불러들인다.
        if(_EVENT_ArrowUp != NULL)
        {
          _EVENT_ArrowUp();

        }

      }

      //타이머 동작 시작.
      page_Timer->Enabled = true;

      _arrow_up_downed   = true;
      _arrow_down_downed = false;

      _Shape_Up_Arrow(_arrow_up_downed);
      _Shape_Down_Arrow(_arrow_down_downed);

    }
    else
    {
      //[아래쪽]
      if(page_Timer->Enabled != true)
      {
        //해당 처리 함수를 불러들인다.
        if(_EVENT_ArrowDown != NULL)
        {
          _EVENT_ArrowDown();

        }

      }

      //타이머 동작 시작.
      page_Timer->Enabled = true;

      _arrow_up_downed   = false;
      _arrow_down_downed = true;

      _Shape_Up_Arrow(_arrow_up_downed);
      _Shape_Down_Arrow(_arrow_down_downed);

    }

  }

  return;

}

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

  if(Button == mbLeft)
  {
    if(Y <(this->Height/2))
    {
      //모두 해제.
      _arrow_up_downed   = false;
      _arrow_down_downed = false;

      _Shape_Up_Arrow(_arrow_up_downed);
      _Shape_Down_Arrow(_arrow_down_downed);

    }
    else
    {
      //모두 해제.
      _arrow_up_downed   = false;
      _arrow_down_downed = false;

      _Shape_Up_Arrow(_arrow_up_downed);
      _Shape_Down_Arrow(_arrow_down_downed);

    }

  }

  //[해제]{---------------------
  //타이머를 해제한다.
  page_Timer->Enabled  = false;
  page_Timer->Interval = 500;
  //}---------------------------

  return;

}

void __fastcall Tgui_page_Form::page_TimerTimer(TObject *Sender)
{
  //[2006.11.05.일][생성!!!]{------------------------------
  //화살표를 사용하여 자동 page 되는 시간 간격을 설정한다.
  //}------------------------------------------------------

  //화살표가 눌려있는 동안은 계속 position 을 1 씩 증가시켜  scroll 해준다.
  if     (_arrow_up_downed == true)
  {
    //해당 처리 함수를 불러들인다.
    if(_EVENT_ArrowUp != NULL)
    {
      _EVENT_ArrowUp();

    }

    //timer 로 자동 스크롤하는 경우는 20ms 정도의 주기를 사용한다.
    page_Timer->Interval = 20;

  }
  else if(_arrow_down_downed == true)
  {
    //해당 처리 함수를 불러들인다.
    if(_EVENT_ArrowDown != NULL)
    {
      _EVENT_ArrowDown();

    }

    //timer 로 자동 스크롤하는 경우는 20ms 정도의 주기를 사용한다.
    page_Timer->Interval = 20;

  }

  return;

}





