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

#include <vcl.h>
#pragma hdrstop

#include "gui_List.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tgui_List_Form *gui_List_Form;
//---------------------------------------------------------------------------


//[다른 폼]
//{
    #include "main.h"
    #include "ide_main.h"
    #include "ide_mbutton.h"
    #include "ide_buttons.h"
    #include "ide_tree.h"
    #include "ide_editor.h"
    #include "ide_msg.h"
    #include "ide_vsplit.h"
    #include "ide_hsplit.h"

    #include "ide_msgbox.h"

    #include "gui.h"
    
//}


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

  //}

  //[중요!!!]
  //{
      //-------------------------------------------
      //일단 활성화를 위하여 보였다가 다시 감춘다.
      this->Visible = true;
      this->Visible = false;
      //-------------------------------------------
  //}

  //[초기화]
  //{
      this->Width  = 100;
      this->Height = 100;

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

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

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

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

      //[editor debug margin]
      //{
          //테두릭가 1 pixel 이므로 1 pixel 만큼 offset 을 준다.
          _font.margin_size = 1;
      //}

      //문자 margin 을 설정한다.
      _font.offset_left   = 0;
      _font.offset_right  = 0;
      _font.offset_top    = 3;
      _font.offset_bottom = 3;

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

  //[속성]
  //{
      _down = false;
      _in   = false;

      //[2007.12.23.일][추가!!!]
      _autoWidth      = false; //자동 크기는 사용하지 않는다.
      _autoHeight     = false; //자동 크기는 사용하지 않는다.
      _viewLineCount  = 5;     //기본적으로 5 개가 보이게 만든다.

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

      //[선택색 얻기]
      //{
          //선택색은 기본적으로 테두리 색의 약간 밝은 색을 사용한다.
          BMP_Get_Bright_Color(_colorBorder, IDE_BRIGHT_List_Select, &_colorSelect);

      //}

      //[줄이동자 색]
      //{
          _colorScrollArrow = _colorBorder;
          _colorScrollThumb = _colorBorder;
          _colorScrollBody  = _colorBorder;
          _colorScrollBack  = _colorBack;

      //}

  //}

  //[내부 컨트롤]
  //{
      //[2007.12.23.일][추가!!!]

      //[수직 줄이동자]
      //{
          _list_ScrollV          = new Tgui_scroll_v_Form(this);
          _list_ScrollV->Parent  = this;
          _list_ScrollV->Visible = true;

          //[컨트롤 초기화]
          //{
              _list_ScrollV->_Left(this->Width - _list_ScrollV->Width - 1);
              _list_ScrollV->_Top(1);
              _list_ScrollV->_Height(this->Height - 2);

              //색을 추가 설정한다.

              // ...

          //}

          //[환경변수설정]
          //{
              //처음에는 내용이 없는 것으로 간주한다.
              _list_ScrollV->_Min(0);
              _list_ScrollV->_Max(0);
              _list_ScrollV->_DesignSize(0);

          //}

          //[EVENT 함수]
          //{
              //event 시 호출될 함수를 등록한다.
              //_list_ScrollV->_EVENT_Scroll    = _EVENT_V_Scroll;
          //}

      //}

  //}



  


  //[확인]
  //{
      int  i = 0;

      _listItem.str[i++] = " @새설계묶음 ";
      _listItem.str[i++] = " @열기 ";
      _listItem.str[i++] = " @저장 ";
      _listItem.str[i++] = " @다른이름으로저장 ";
      _listItem.str[i++] = " @닫기 ";
      _listItem.str[i++] = " @개발환경종료 ";
      _listItem.str[i++] = " @http://www.gigyenics.co.kr ";

      _listItem.count        = i;
      _listItem.select_index = -1;

  //}







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

  return;

}

__fastcall Tgui_List_Form::~Tgui_List_Form(void)
{
  //[소멸]

  return;

  delete _bmp_;

  return;

}

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

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

  switch(Message.Msg)
  {
    case WM_ERASEBKGND :
    {
      _Draw();

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

    } break;

    case CM_MOUSEENTER :
    {
      //마우스가 안에 있음을 알린다.
      _in = true;

    } break;

    case CM_MOUSELEAVE :
    {
      //마우스가 안에 없음을 알린다.
      _in = false;

      //[선택 해제]
      //{
          //-----------------------------------------------------------------------
          //마우스가 submenu 영역을 벗어 나는 경우 선택된 것을 해제해 주어야 한다.

          //선택된 항목을 기록한다.
          _listItem.select_index = -1;

          //새로운 [항목] 이 선택되었다면 선택으로 표시한다.
          _Shape();
          //-----------------------------------------------------------------------
      //}

    } break;

    case WM_KILLFOCUS :
    {
      //[2007.12.23.일][수정!!!]
      //촛점을 읽은 경우는 보이지 않게 만든다.
      //this->Visible = false;

    } break;

  }

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

  return;

}

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

void __fastcall Tgui_List_Form::_Border(void)
{
  //[2006.10.17.화]{----------------------------------------------------------
  //IDE-Form 전체의 테두리를 만든다.
  //두께는 4pixel, 동서남 3 면만 그리면 된다.
  //테두리는 직접 보이는 것이고 내용에 영향을 주지 않아야 하므로 직접 그린다.
  //}-------------------------------------------------------------------------

  //[테두리 만들기]
  //{
      _bmp_->Canvas->Pen->Color   = _ide_option->color_0;

      _bmp_->Canvas->Pen->Width   = 1;

      _bmp_->Canvas->Brush->Style = bsClear;

      _bmp_->Canvas->Rectangle(this->ClientRect);
  //}

  return;

}

void __fastcall Tgui_List_Form::_Shape(void)
{
  //[2006.10.19.목][생성!!!]{-------------------------------------------------
  //[하위항목] 구조체 정보를 대상으로 처리한다.

  //[2006.12.04.월][수정!!!]
  //이전에는 문자 출력 자체의 밑줄 기능을 사용하였으나 순수하게 다시
  //그려주는 방법을 사용한다. 문자는 단지 투명 속성으로 순수 문자만 출력한다.
  //[메뉴폭] 은 가장 긴 문자열의 폭에 맞춘다.

  //[2007.03.04.일][수정!!!]
  //[보조메뉴] 의 바탕색을 테마색으로 바꾸었다.
  //}-------------------------------------------------------------------------

  //[VAR]
  //{
      TRect  rect;

      int    x, y, w, h;
      int    line_height;
      int    i;

      //가장 큰 문자열 폭을 기록한다.
      int    max_string_width = 0;

  //}

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

  //}

  //[글꼴 정보 얻기]
  //{
      //[글꼴] 의 크기를 알기 위한 CRLF 문자 출력.
      FONT_Out_Moonja(_bmp_, &_font, 0, 0, _colorFont, _colorBack, false, 0x0d0a, &w, &line_height);

      //행의 높이 값을 기록한다.
      _line_height = line_height;

  //}







  //[자동폭 설정 확인]
  //{
      if(_autoWidth == true)
      {
        //[자동폭] 적용인 경우는 가장 긴 문자열의 폭을 알아야 한다.




        //caption 문자열의 width 를 구한다.
        //FONT_Get_StringOutAreaInfo(&_font, _caption, &width, &height);

        //자동폭 지정.
        //_font.margin_size 는 처음 기본값인 0 을 사용한다.(한번만 그려주면 된다.)
        //this->Width = _caption_x + width + (_font.margin_size * 2) + 4;

        _bmp_->Width = this->Width;

      }

  //}






  //[Menu 문자열]
  //{
      x = 0; y = 1;

      for(i = 0; i < _listItem.count; i++)
      {
        //[선택 유/무 구분 표시]
        //{
            if(i == _listItem.select_index)
            {
              //선택된 항목은 바탕색을 [테두리 색] 으로 바꾸고 문자색은 [음각색] 으로 지정한다.

              //[바탕색]
              //{
                  rect        = _bmp_->Canvas->ClipRect;
                  rect.Top    = y;
                  rect.Bottom = y + _line_height;

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

              //문자열 출력.
              FONT_Out_StyleString2(_bmp_, &_font, x, y,
                                    IDE_COLOR_3, _colorBack, true,
                                    d_FONTSTYLE_default,
                                    _listItem.str[i].c_str(),
                                    d_FONT_underline_no, false, 0, _ide_option->color_0,
                                    &w, &h);

            }
            else
            {
              FONT_Out_StyleString2(_bmp_, &_font, x, y,
                                    _colorFont, _colorBack, true,
                                    d_FONTSTYLE_default,
                                    _listItem.str[i].c_str(),
                                    d_FONT_underline_no, false, 0, _ide_option->color_0,
                                    &w, &h);

            }
        //}

        y += line_height;

        //[최대폭 계산]{-----------------------------------
        //가장 큰 폭을 저장한다.
        if(max_string_width < w) { max_string_width = w; }
        //}------------------------------------------------

      }
  //}

  //[크기 지정]
  //{
      //----------------------------------------------------------
      //폭은 가장 큰 값을 지정한다.
      this->Width  = 2 + max_string_width + _list_ScrollV->Width;

      //높이는 전체 행의 높이를 합한 값이면 된다.(테두리 포함)
      this->Height = 2 + h + line_height - 1;
      //----------------------------------------------------------
  //}

  //[테두리 만들기]
  //{
      //-----------------
      //테두리를 그린다.
      _Border();
      //-----------------
  //}

  //[줄이동자 위치/크기 수정]
  //{
      //[2007.12.23.일][추가!!!]
      _list_ScrollV->_Left(this->Width - _list_ScrollV->Width - 1);
      _list_ScrollV->_Top(1);
      _list_ScrollV->_Height(this->Height - 2);

  //}

  //[view]{------------------------
  //그린 것을 보여준다.
  //this->Canvas->Draw(0, 0, _bmp_);
  _Draw();
  //}------------------------------

  return ;

}

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

  if(_bmp_ == NULL) return;

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

  return;

}

void __fastcall Tgui_List_Form::_AutoWidth(bool   pAutoWidth)
{
  //[2007.12.23.일][생성!!!]

  _autoWidth = pAutoWidth;

  _Shape();

  return;

}

void __fastcall Tgui_List_Form::_AutoHeight(bool   pAutoHeight)
{
  //[2007.12.23.일][생성!!!]

  _autoHeight = pAutoHeight;

  _Shape();

  return;

}

void __fastcall Tgui_List_Form::_ViewLineCount(int   pViewLineCount)
{
  //[2007.12.23.일][생성!!!]

  _viewLineCount = pViewLineCount;

  _Shape();

  return;

}

void __fastcall Tgui_List_Form::_ColorBorder(int   pColorBorder)
{
  //[2007.12.23.일][생성!!!]






  return;

}

void __fastcall Tgui_List_Form::_ColorBack(int   pColorBack)
{
  //[2007.12.23.일][생성!!!]






  return;

}

void __fastcall Tgui_List_Form::_ColorFont(int   pColorFont)
{
  //[2007.12.23.일][생성!!!]






  return;

}

void __fastcall Tgui_List_Form::_ColorSelect(int   pColorSelect)
{
  //[2007.12.23.일][생성!!!]






  return;

}

void __fastcall Tgui_List_Form::_ColorScrollArrow(int   pColorScrollArrow)
{
  //[2007.12.23.일][생성!!!]






  return;

}

void __fastcall Tgui_List_Form::_ColorScrollThumb(int   pColorScrollThumb)
{
  //[2007.12.23.일][생성!!!]






  return;

}

void __fastcall Tgui_List_Form::_COlorScrollBody(int   pColorScrollBody)
{
  //[2007.12.23.일][생성!!!]






  return;

}

void __fastcall Tgui_List_Form::_ColorScrollBack(int   pColorScrollBack)
{
  //[2007.12.23.일][생성!!!]







  return;

}

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

void __fastcall Tgui_List_Form::FormMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  //[2006.10.21.토][생성!!!]{------------------------------------------------
  //해당 [항목] 에 마우스가 위치하는 경우는 해당 [항목] 에 선택 표시를 한다.
  //width 는 의미가 없으므로 height 를 사용하여 [항목] 을 구분할수 있다.
  //영역 검사시 테두리는 제외 해야 한다.
  //
  //Height 를 행의 높이로 나누어 나오는 몫이 [선택] index 가 된다.
  //이미 선택되 있는 경우는 다시 그리지 않아야 한다.
  //}------------------------------------------------------------------------

  //[참고]
  //{
      //-------------------------------------------------------------------
      //마우스가 이 Form 영역을 벗어난 경우는 Message_CM_MOUSELEAVE() 함수
      //안에서 처리한다.
      //-------------------------------------------------------------------
  //}

  //[VAR]
  //{
      int   index;
  //}

  if((0 < Y) && (Y < this->Height))
  {
    index = Y / _line_height;

    if(index != _listItem.select_index)
    {
      //선택된 항목을 기록한다.
      _listItem.select_index = index;

      //새로운 [항목] 이 선택되었다면 선택으로 표시한다.
      _Shape();

    }

  }

  return;

}

void __fastcall Tgui_List_Form::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  _down = true;

  return;

}

void __fastcall Tgui_List_Form::FormMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2006.10.22.일][생성]{-------------------------------------------------------
  //일단 메뉴를 보이지 않게 하고 선택된 항목에 맞는 실행 함수를 불러서 실행한다.
  //[주메뉴] 항목에 따라 [하위메뉴] 가 달라지므로 해당 실행 함수도 달라진다.
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      int  menu_select_index;
  //}

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

      if((_down == true) && (_in == true))
      {
        //OnClick 의 경우만 처리한다.

        //[감추기]
        //{
            //




            Application->ProcessMessages();

        //}

        //[함수처리]
        //{
            //선택항목을 처리할 함수를 불러준다.

            //ide_menu_Form->_EVENT_Select_SubMenuItem(menu_select_index, _listItem.select_index);


        //}

      }

  //}

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

  return;

}

