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

#include <vcl.h>
#pragma hdrstop

#include "editor_info.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Teditor_info_Form *editor_info_Form;
//---------------------------------------------------------------------------

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

//[2012.03.31.토]
#include "editor_top.h"

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

  //}

  //[form]
  //{
      this->Left   = 0;
      this->Height = 16;
      this->Top    = ((TForm *)Owner)->Height - this->Height;
      //기본 크기.
      this->Width  = 197 - 22 + 30;

      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;
      //}---------------------------
      
  //}

  //[속성 초기화]
  //{
      _row     = 0;
      _col     = 0;
      _changed = false;

      //[2007.04.10.화][추가!!!]
      _blink   = true;
  //}

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

  //[한/영전환판 만들기]
  //{
      //[2009.04.23.목][추가!!!]{---
      //[한/영전환판] 을 생성한다.
      //}---------------------------

      _han_eng_Label          = new Tgui_Label_Form(this);
      _han_eng_Label->Parent  = this;
      _han_eng_Label->Visible = true;

      _han_eng_Label->_Width(30);
      _han_eng_Label->_Height(this->Height);
      _han_eng_Label->_Left(197 - 22);
      _han_eng_Label->_Top(0);
      _han_eng_Label->_FontXY(1, 1);
      _han_eng_Label->_FontColor(IDE_COLOR_1);
      _han_eng_Label->_Caption("영문");
      _han_eng_Label->_Border(true);

      //기본은 영문 상태가 된다.
      _HanEngLabel_Eng();

  //}

  return;

}

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

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

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

}

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

void __fastcall Teditor_info_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 Teditor_info_Form::_Shape(void)
{
  //[2006.11.27.월][생성!!!]

  //[VAR]
  //{
      TRect       rect;
      AnsiString  str;
      int         w, h;
      int         x = 0;

      int         color_select;
  //}

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

  //[테두리 만들기]
  //{
      _bmp_->Canvas->Pen->Color   = _ide_option->color_0;
      _bmp_->Canvas->Pen->Width   = 1;
      _bmp_->Canvas->Brush->Style = bsClear;
      _bmp_->Canvas->Rectangle(_bmp_->Canvas->ClipRect);
  //}

  //[행 정보 출력]
  //{
      //문자열 합성.
      str = "행:" + IntToStr(_row);

      x += 2;

      //문자열 출력.
      FONT_Out_StyleString2(_bmp_, &_font, x, 2, IDE_COLOR_1, IDE_COLOR_2, true,
                            d_FONTSTYLE_default,
                            str.c_str(),
                            d_FONT_underline_no, true, 1, IDE_COLOR_1,
                            &w, &h);

      //[칸막이]
      //{
          x += 71;

          _bmp_->Canvas->Pen->Color   = _ide_option->color_0;
          _bmp_->Canvas->Pen->Width   = 1;
          _bmp_->Canvas->Brush->Style = bsClear;
          _bmp_->Canvas->MoveTo(x, 0);
          _bmp_->Canvas->LineTo(x, this->Height);
      //}
  //}

  //[행 정보 출력]
  //{
      //문자열 합성.
      str = "열:" + IntToStr(_col);

      x += 2;

      //문자열 출력.
      FONT_Out_StyleString2(_bmp_, &_font, x, 2, IDE_COLOR_1, IDE_COLOR_2, true,
                            d_FONTSTYLE_default,
                            str.c_str(),
                            d_FONT_underline_no, true, 1, IDE_COLOR_1,
                            &w, &h);

      //[칸막이]
      //{
          x += 71;

          _bmp_->Canvas->Pen->Color   = _ide_option->color_0;
          _bmp_->Canvas->Pen->Width   = 1;
          _bmp_->Canvas->Brush->Style = bsClear;
          _bmp_->Canvas->MoveTo(x, 0);
          _bmp_->Canvas->LineTo(x, this->Height);
      //}
  //}

  //[편집 정보 출력]
  //{
      if(_changed == false)
      {
        str = "저장";

        x += 2;

        //문자열 출력.
        FONT_Out_StyleString2(_bmp_, &_font, x, 2, IDE_COLOR_1, IDE_COLOR_2, true,
                              d_FONTSTYLE_default,
                              str.c_str(),
                              d_FONT_underline_no, true, 1, IDE_COLOR_1,
                              &w, &h);

      }
      else
      {
        //[반전 출력]

        //[테마색처리]
        //{
            //[2007.04.05.목][수정!!!]
            //바탕색을 테마색으로 칠한다.
            BMP_Get_Bright_Color(_ide_option->color_0, IDE_BRIGHT_editinfo_select, &color_select);
        //}

        str = "수정";

        //[배경칠하기]
        //{
            //칠할 영역 구하기.
            rect         = _bmp_->Canvas->ClipRect;

            //[영역수정]
            //{
                //[테두리] 를 제외한 영역을 구한다.(바탕색을 입히기 위하여)
                rect.Left    = x + 1;
                rect.Right  -= 1;
                rect.Top    += 1;
                rect.Bottom -= 1;
            //}

            //배경을 [테두리색] 으로 칠한다.
            _bmp_->Canvas->Brush->Color = color_select;//IDE_COLOR_0;
            _bmp_->Canvas->FillRect(rect);
        //}

        x += 2;

        //문자열 출력.
        FONT_Out_StyleString2(_bmp_, &_font, x, 2, IDE_COLOR_3, color_select/*IDE_COLOR_0*/, true,
                              d_FONTSTYLE_default,
                              str.c_str(),
                              d_FONT_underline_no, true, 1, IDE_COLOR_1,
                              &w, &h);

      }
  //}

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

  return ;

}

void __fastcall Teditor_info_Form::_Resize(void)
{
  //[2006.11.27.월][생성!!]

  this->Top = this->Parent->Height - this->Height;

  return;

}

void __fastcall Teditor_info_Form::_Draw(void)
{
  //[2006.11.27.월][생성!!!]

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

  return;

}

void __fastcall Teditor_info_Form::_Row(int  pROW)
{
  //[2006.11.27.월][생성!!!]

  _row = pROW;

  _Shape();

  return;

}

void __fastcall Teditor_info_Form::_Col(int  pCOL)
{
  //[2006.11.27.월][생성!!!]

  _col = pCOL;

  _Shape();

  return;

}

void __fastcall Teditor_info_Form::_Row_Col(int  pROW,
                                            int  pCOL)
{
  //[2006.12.24.일][생성!!!]{--------------------------------------------------
  //[행/열] 을 같이 처리한다.
  //이는 각각의 정보가 같이 바뀌는 경우 다시 그리는 시간을 줄이기 위한 것이다.
  //}--------------------------------------------------------------------------

  _row = pROW;
  _col = pCOL;

  _Shape();

  return;

}

void __fastcall Teditor_info_Form::_Changed(bool  pCHANGED)
{
  //[2007.04.05.목][생성!!!]

  _changed = pCHANGED;

  _Shape();

  return;

}

void __fastcall Teditor_info_Form::_Blink(bool  pTon_Foff)
{
  //[2007.04.10.화][생성!!!]{----------------------------------
  //[저장/수정] 부분을 점멸시킨다.
  //이는 해당 표시 영역에 국한되고 바탕색은 태마색이 적용된다.
  //표시된 문자열은 그대로 사용되고 상태만 반전되는 것이다.
  //}----------------------------------------------------------

  //[VAR]
  //{
      TRect       rect;
      AnsiString  str;
      int         w, h;
      int         x = 0;

      int         color_select;
  //}

  //[값 설정]
  //{
      _blink = pTon_Foff;
  //}

  //[위치수정]
  //{
      x += 2;
      x += 71;
      x += 2;
      x += 71;
  //}

  //[출력문자열얻기]
  //{
      if(_changed == false)
      {
        str = "저장";

      }
      else
      {
        str = "수정";

      }
  //}

  //[그리기]
  //{
      if(pTon_Foff == true)
      {
        //기본으로 출력한다.

        //[배경칠하기]
        //{
            //칠할 영역 구하기.
            rect = _bmp_->Canvas->ClipRect;

            //[영역수정]
            //{
                //[테두리] 를 제외한 영역을 구한다.(바탕색을 입히기 위하여)
                rect.Left    = x + 1;
                rect.Right  -= 1;
                rect.Top    += 1;
                rect.Bottom -= 1;
            //}

            //배경을 [테두리색] 으로 칠한다.
            _bmp_->Canvas->Brush->Color = IDE_COLOR_2;
            _bmp_->Canvas->FillRect(rect);
        //}

        x += 2;

        //문자열 출력.
        FONT_Out_StyleString2(_bmp_, &_font, x, 2, IDE_COLOR_1, IDE_COLOR_2, true,
                              d_FONTSTYLE_default,
                              str.c_str(),
                              d_FONT_underline_no, true, 1, IDE_COLOR_1,
                              &w, &h);

      }
      else
      {
        //[반전 출력]

        //[테마색처리]
        //{
            //바탕색을 테마색으로 칠한다.
            BMP_Get_Bright_Color(_ide_option->color_0, IDE_BRIGHT_editinfo_select, &color_select);
        //}

        //[배경칠하기]
        //{
            //칠할 영역 구하기.
            rect = _bmp_->Canvas->ClipRect;

            //[영역수정]
            //{
                //[테두리] 를 제외한 영역을 구한다.(바탕색을 입히기 위하여)
                rect.Left    = x + 1;
                rect.Right  -= 1;
                rect.Top    += 1;
                rect.Bottom -= 1;
            //}

            //배경을 [테두리색] 으로 칠한다.
            _bmp_->Canvas->Brush->Color = color_select;
            _bmp_->Canvas->FillRect(rect);
        //}

        x += 2;

        //문자열 출력.
        FONT_Out_StyleString2(_bmp_, &_font, x, 2, IDE_COLOR_3, color_select, true,
                              d_FONTSTYLE_default,
                              str.c_str(),
                              d_FONT_underline_no, true, 1, IDE_COLOR_1,
                              &w, &h);

      }
  //}

  //[표시]
  //{
      BitBlt(this->Canvas->Handle, x-2, 0,
             this->Width, this->Height,
             _bmp_->Canvas->Handle, x-2, 0, SRCCOPY);
  //}

  return;

}

void __fastcall Teditor_info_Form::_Blink_Timer(bool  pTon_Foff)
{
  //[2007.04.10.화][생성!!!]{--
  //점멸 타이머를 동작시킨다.
  //}--------------------------

  if(pTon_Foff == true)
  {
    //점멸하기.
    _Blink(true);

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

    //[2012.03.31.토][추가!!!]
    //해당 함수 설명 참고.
    //editor_top_Form->_Blink_BalloonBox(true);
    //[2018.05.08.화][수정!!!]
    //기본 상태로 시작하게 만든다.
    editor_top_Form->_Blink_BalloonBox(false);

  }
  else
  {
    //끄기.

    //타이머 정지.
    info_Timer->Enabled = false;

    //다음에 Shape() 에서 다시 그려주므로 _Blink() 를 사용하지 않고
    //여기서는 변수만 초기화 한다.
    _blink = true;

    //종료하는 경우는 [수정] 의 경우는 반전출력해야 하므로 전체를 그냥 다시 그려준다.
    _Shape();

    //[2012.03.31.토][추가!!!]
    //해당 함수 설명 참고.
    editor_top_Form->_Blink_BalloonBox(false);

  }

  return;

}

//------------------------------------------------------------------------------
//[한/영 전환 관련]-------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Teditor_info_Form::_HanEngLabel_Han(void)
{
  //[2009.04.23.목][생성!!!]{---
  //현재 [한글] 상태로 만든다.
  //}---------------------------

  //[VAR]
  //{
      int   color;

  //}

  //[바탕색]{------------------------------------------------------------
  BMP_Get_Bright_Color(_ide_option->color_0, Ide_Bright_ImeHan, &color);
  _han_eng_Label->_BackColor(color);
  //[문자색]-------------------------------------------------------------
  _han_eng_Label->_FontColor(IDE_COLOR_2);
  //[한글 입력 상태]-----------------------------------------------------
  _han_eng_Label->_Caption("한글");
  //}--------------------------------------------------------------------

  return;

}

void __fastcall Teditor_info_Form::_HanEngLabel_Eng(void)
{
  //[2009.04.23.목][생성!!!]{---
  //현재 [영문] 상태로 만든다.
  //}---------------------------

  //[VAR]
  //{
      int   color;

  //}

  //[바탕색]{------------------------------------------------------------
  BMP_Get_Bright_Color(_ide_option->color_0, Ide_Bright_ImeEng, &color);
  _han_eng_Label->_BackColor(color);
  //[문자색]-------------------------------------------------------------
  _han_eng_Label->_FontColor(_ide_option->color_0);
  //_han_eng_Label->_FontColor(IDE_COLOR_1);
  //[한글 입력 상태]-----------------------------------------------------
  _han_eng_Label->_Caption("영문");
  //}--------------------------------------------------------------------

  return;

}

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

void __fastcall Teditor_info_Form::info_TimerTimer(TObject *Sender)
{
  //[2007.04.10.화][생성!!!]{--
  //계속 점멸하게 만든다.
  //
  //[2018.05.08.화][수정!!!]---
  //}--------------------------

  _blink = !_blink;

  _Blink(_blink);

  //[2012.03.31.토][추가!!!]{-------------------------------------
  //실제 적용시 너무 큰 면적이 [점멸] 되므로 좀 산만해 진다.
  //일단, 적용되는 것을 확인하였으므로 [주석] 으로 처리해 놓는다.
  //editor_top_Form->_Blink_BalloonBox(_blink);
  //
  //[2018.05.08.화][추가!!!]**************************************
  //[점멸] 하지 않고 기본 상태로 보여주도록 설정.
  //[Linux:wine] 에서는 한번만 보이는 경우 사라지므로 여기서 계속
  //보여지도록 설정.
  editor_top_Form->_Blink_BalloonBox(false);
  //editor_top_Form->_Blink_BalloonBox(_blink);
  //}-------------------------------------------------------------

  return;

}
