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

#include <vcl.h>
#pragma hdrstop

#include "gui_ListCaptionBar.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tgui_ListCaptionBar_Form *gui_ListCaptionBar_Form;
//---------------------------------------------------------------------------


#include "ide_main.h"

#include "ide_library.h"


//[2007.12.21.금][생성!!!]
//{
    //<gui_label> 을 사용하여 생성한다.

//}


__fastcall Tgui_ListCaptionBar_Form::Tgui_ListCaptionBar_Form(TComponent* Owner)
        : TForm(Owner)
{
  //[VAR]
  //{
      AnsiString  bmp_path;

  //} 

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

  //}

  //[form]
  //{
      this->Left   = 0 ;
      this->Top    = 0;
      this->Width  = 95;
      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   = 0;

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

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

  //}

  //[내부 환경 변수]
  //{
      //폼이 눌린 상태라면 true.
      _down         = false;

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

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

  //}

  //[property]
  //{
      _listBtnX      = 2;
      _listBtnY      = 2;
      _listBtn       = true;  //[목록버튼] 은 보여준다.
      _listBtnBorder = true;  //[목록버튼] 테두리를 보여준다.

      //caption 을 출력할 위치.
      _captionX = _listBtnX + 12 + 2; //[목록버튼] 이 있는 경우로 위치를 산정한다.
      _captionY = 2;

      STR_Assign(_caption, "목록 제목줄");

      _edge         = true;  //모서리를 만든다.
      _border       = true;  //테두리를 보여준다.
      _borderBottom = true;  //아래 테두리도 보여준다.

      //문자 형식(기본/굵은)
      _fontStyle    = d_FONTSTYLE_default;

      //[색설정]
      //{
          _colorListBtnBorder = _ide_option->color_0;
          _colorListBtnFront  = _ide_option->color_0;
          _colorListBtnBack   = IDE_COLOR_2;

          _colorFont          = IDE_COLOR_1;
          _colorBack          = IDE_COLOR_2;
          _colorBorder        = _ide_option->color_0;

          //모서리 색은 일단 바탕색과 같은 색으로 한다.
          _colorEdge          = _colorBack;

      //}

  //}

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

      _EVENT_MouseEnter = NULL;
      _EVENT_MouseLeave = NULL;
      //---------------------------------------------------------
  //}

  //[목록 버튼]
  //{
      //[2007.12.22.토][추가!!!]
      //[목록버튼] 을 만든다.(사용하지 않더라도 기본적으로 만들어 주기는 해야 한다.)
      _list_BmpBtn          = new Tgui_bmpbutton_Form(this);
      _list_BmpBtn->Parent  = this;
      _list_BmpBtn->Visible = true;

      //[초기화]
      //{
          //그림 할당하기.
          bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\control\\trigger_all.bmp";

          _list_BmpBtn->_Left(_listBtnX);
          _list_BmpBtn->_Top(_listBtnY);
          _list_BmpBtn->_Width(12);
          _list_BmpBtn->_Height(12);
          _list_BmpBtn->_Border(_listBtnBorder);
          _list_BmpBtn->_Bitmap(bmp_path);
          _list_BmpBtn->_Image_Width(12);
          _list_BmpBtn->_Image_Height(12);
          _list_BmpBtn->_ColorFront(_colorListBtnFront);
          _list_BmpBtn->_ColorBack(_colorListBtnBack);
          _list_BmpBtn->_ColorBorder(_colorListBtnBorder);

          //[index 로 접근]
          //{
              //---------------------------------------
              //그림조각을 index 로 접근하여 사용한다.
              _list_BmpBtn->_IndexBitmap(true);
              //조각그림 하나의 폭은 38 이다.
              _list_BmpBtn->_IndexWidth(12);
              _list_BmpBtn->_Index(0);
              //---------------------------------------
          //}

          //[동작 함수 등록]
          //{
              _list_BmpBtn->_EVENT_Click = _EVENT_ListBmpBtn_Click;

          //}

      //}

  //}

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

  //}

  return;

}

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

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

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

}

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

void __fastcall Tgui_ListCaptionBar_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();

    }

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

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

    }

  }

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

  return;

}

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

void __fastcall Tgui_ListCaptionBar_Form::_Shape(void)
{
  //[2006.11.06.월][생성!!!]
  //[2007.12.22.토][수정!!!]

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

  //}

  //[바탕색]
  //{
      //일단 전체 를 새로 그리기 위하여 바탕을 전부 지정 바탕색으로 지운다.
      _bmp_->Canvas->Brush->Color = _colorBack;
      _bmp_->Canvas->FillRect(_bmp_->Canvas->ClipRect);

  //}

  //[제목 문자열 출력]
  //{
      //[문자열](X, Y) 위치에 지정 문자색으로 [문자열] 을 출력한다.
      FONT_Out_StyleString2(_bmp_, &_font, _captionX, _captionY, _colorFont, _colorBack, true,
                            _fontStyle,
                            _caption,
                            d_FONT_underline_no, true, 0, _colorFont,
                            &width, &height);

  //}

  //[목록버튼 배치]
  //{
      //[목록버튼] 을 사용하는 경우 지정 위치에 보여준다.
      //이미 보여지는 지 결정은 된 상태이므로 특별히 할것은 없다.

  //}

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

        //}

        //[가장 아래 테두리 결정]
        //{
            if(_borderBottom != true)
            {
              //가장 아래 테두리를 사용하지 않는 경우는 다시 [바탕색] 으로 지워 준다.
              _bmp_->Canvas->Pen->Color = _colorBack;
              _bmp_->Canvas->Pen->Width = 1;
              _bmp_->Canvas->MoveTo(1, _bmp_->Height - 1);
              _bmp_->Canvas->LineTo(_bmp_->Width - 1, _bmp_->Height - 1);

            }

        //}

      }

  //}

  //[모서리 만들기]
  //{
      //[모서리] 를 만들어야 하는 경우, [모서리] 를 만든다.
      if(_edge == true)
      {
        //가장 아래 테두리를 사용하지 않는 경우는 다시 [바탕색] 으로 지워 준다.
        _bmp_->Canvas->Pen->Color   = _colorEdge;
        _bmp_->Canvas->Pen->Width   = 1;
        _bmp_->Canvas->Brush->Style = bsClear;

        //[모서리배경 지우기]
        //{
            //영역이 삼각형이므로 그냥 줄을 사용하여 지운다.
            _bmp_->Canvas->MoveTo(_bmp_->Width - 5, 0); _bmp_->Canvas->LineTo(_bmp_->Width, 0);
            _bmp_->Canvas->MoveTo(_bmp_->Width - 4, 1); _bmp_->Canvas->LineTo(_bmp_->Width, 1);
            _bmp_->Canvas->MoveTo(_bmp_->Width - 3, 2); _bmp_->Canvas->LineTo(_bmp_->Width, 2);
            _bmp_->Canvas->MoveTo(_bmp_->Width - 2, 3); _bmp_->Canvas->LineTo(_bmp_->Width, 3);
            _bmp_->Canvas->MoveTo(_bmp_->Width - 1, 4); _bmp_->Canvas->LineTo(_bmp_->Width, 4);

        //}

        //[모서리 테두리 그리기]
        //{
            //테두리 색으로 다시 지정해 준다.
            _bmp_->Canvas->Pen->Color   = _colorBorder;

            //모서리 테두리.
            _bmp_->Canvas->MoveTo(_bmp_->Width - 6, 0); _bmp_->Canvas->LineTo(_bmp_->Width, 6);

        //}

      }

  //}

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

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_Left(int  pLEFT)
{
  //[2006.11.06.월][생성!!!]

  this->Left = pLEFT;

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_Top(int  pTOP)
{
  //[2006.11.06.월][생성!!!]

  this->Top = pTOP;

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_Width(int  pWIDTH)
{
  //[2006.11.06.월][생성!!!]

  this->Width = pWIDTH;

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

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

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_Height(int  pHEIGHT)
{
  //[2006.11.06.월][생성!!!]

  this->Height = pHEIGHT;

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

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

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_Caption(char  *pCAPTION)
{
  //[2006.11.06.월][생성!!!]

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

  //}

  //caption 문자열을 할당한다.
  STR_Assign(_caption, pCAPTION);

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

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_CaptionX(int  pCAPTIONx)
{
  //[2006.11.06.월][생성!!!]

  this->_captionX = pCAPTIONx;

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

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_CaptionY(int  pCAPTIONy)
{
  //[2006.11.06.월][생성!!!]

  this->_captionY = pCAPTIONy;

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

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_Border(bool  pBorder)
{
  //[2007.12.20.목][생성!!!]

  _border = pBorder;

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_ColorBorder(int   pColorBorder)
{
  //[2007.12.20.목][생성!!!]

  _colorBorder = pColorBorder;

  _Shape();

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_ColorBack(int   pColorBack)
{
  //[2007.12.20.목][생성!!!]

  _colorBack = pColorBack;

  _Shape();

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_ColorFont(int   pColorFont)
{
  //[2007.12.20.목][생성!!!]

  _colorFont = pColorFont;

  _Shape();

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_FontStyle(int   pFontStyle)
{
  //[2007.12.20.목][생성!!!]

  _fontStyle = pFontStyle;

  _Shape();

  return ;

}

void __fastcall Tgui_ListCaptionBar_Form::_ListBtnX(int   pListBtnX)
{
  //[2007.12.22.토][생성!!!]

  _listBtnX = pListBtnX;

  //[목록버튼] 에 반영한다.
  _list_BmpBtn->_Left(_listBtnX);

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_ListBtnY(int   pListBtnY)
{
  //[2007.12.22.토][생성!!!]

  _listBtnY = pListBtnY;

  //[목록버튼] 에 반영한다.
  _list_BmpBtn->_Top(_listBtnY);

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_ListBtn(bool  pListBtn)
{
  //[2007.12.22.토][생성!!!]

  _listBtn = pListBtn;

  //사용되는 경우는 자동으로 보여 주어야 한다.
  _list_BmpBtn->Visible = _listBtn;

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_ListBtnBorder(bool  pListBtnBorder)
{
  //[2007.12.22.토][생성!!!]

  _listBtnBorder = pListBtnBorder;

  //[목록버튼] 에 반영한다.
  _list_BmpBtn->_Border(_listBtnBorder);

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_Edge(bool  pEdge)
{
  //[2007.12.22.토][생성!!!]

  _edge = pEdge;

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_BorderBottom(bool  pBorderBottom)
{
  //[2007.12.22.토][생성!!!]

  _borderBottom = pBorderBottom;

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_ColorListBtnBorder(int   pColorListBtnBorder)
{
  //[2007.12.22.토][생성!!!]

  _colorListBtnBorder = pColorListBtnBorder;

  //[목록버튼] 에 반영한다.
  _list_BmpBtn->_ColorBorder(_colorListBtnBorder);

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_ColorListBtnFront(int   pColorListBtnFront)
{
  //[2007.12.22.토][생성!!!]

  _colorListBtnFront = pColorListBtnFront;

  //[목록버튼] 에 반영한다.
  _list_BmpBtn->_ColorFront(_colorListBtnFront);

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_ColorListBtnBack(int   pColorListBtnBack)
{
  //[2007.12.22.토][생성!!!]

  _colorListBtnBack = pColorListBtnBack;

  //[목록버튼] 에 반영한다.
  _list_BmpBtn->_ColorBack(_colorListBtnBack);

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_ColorEdge(int   pColorEdge)
{
  //[2007.12.22.토][생성!!!]

  _colorEdge = pColorEdge;

  _Shape();

  return;

}

void __fastcall Tgui_ListCaptionBar_Form::_Draw(void)
{
  //[2006.11.06.월][생성!!!]

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

  return;

}

//[동작함수]--------------------------------------------------------------------

void __fastcall Tgui_ListCaptionBar_Form::_EVENT_ListBmpBtn_Click(void)
{
  //[2007.12.22.토][생성!!!]{-----------
  //[목록버튼] 이 눌린 경우를 처리한다.
  //}-----------------------------------

  //등록되 있는 <gui_List> 가 있다면 이 폼의 아래에 바로 붙여서 보여준다.

  /*
  X->Left = this->Left;

  //아래 테두리와 1 pixel 겹치게 해야 보기 좋다.
  X->Top  = this->Top + this->Height - 1;

  X->Visible = true;
  */








  return;

}

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

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

  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)
  {
    _EVENT_Down();

  }

  return;

}

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

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

      if((_down == true) && (_in == true))
      {
        //OnClick 을 발생시킨다.
        if(_EVENT_Click != NULL)
        {
          _EVENT_Click();

        }

      }
  //}

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

  _Shape();

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

  }

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

  return;

}

