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

#include <vcl.h>
#pragma hdrstop

#include "GFindDialog.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TGFindDialog_Form *GFindDialog_Form;
//---------------------------------------------------------------------------


#include "..\gui_part.h"

#include "ide_library.h"

//대상이 되는 [편집기] 와 연결하기 위한것.
#include "GEditorEdit.h"

//[2019.02.16.토][추가]
#include "gui.h"


//[대상 편집기]
//{
    //[2010.02.05.금][추가!!!]{------------------------------------------------
    //처리 대상이 되는 [편집기].
    //별도 함수로 전달 받아야 한다.
    //이 <GFindDialog> 를 생성하는 <GEditor> 에서 자동으로 자신을 등록해 준다.
    //}------------------------------------------------------------------------

    //TGEditorEdit_Form  *_GEditorEdit = NULL;

//}


__fastcall TGFindDialog_Form::TGFindDialog_Form(TComponent* Owner)
        : TForm(Owner)
{
  //[VAR]
  //{
      int         width, height;
      AnsiString  bmp_path;

      //[2019.02.16.토][추가]
      int         color;

  //}

  //[환경변수]
  //{
      //[2018.03.03.토][추가!!!]{---
      //[Linux:wine] 지원을 위한것.
      //}---------------------------

      IDE_Get_Option(&_ide_option);

  //}

  //[개체존재:생성]{**************
  //[2012.05.01.화][추가!!!]
  //개체가 생성되었음을 알려준다.
  _this_ = true;
  //}*****************************

  //[사용구분 초기화]
  //{
      //[2012.05.04.금][추가!!!]{----------------
      //반드시 처음에는 <BCB:false> 로 설정한다.
      //}----------------------------------------

      _GUse = false;

  //}

  //[form]
  //{
      this->Left     = 0;
      this->Top      = 0;
      this->Width    = 300;
      this->Height   = 118;
      this->Color    = clWhite;

  //}

  //[내부사용인자]
  //{
      //기본적으로 선택되지 않은 상태.
      _captionSelected = false;

  //}

  //[속성]
  //{
      //[테두리]
      //{
          _borderColor = d_Color_FormBorder;

      //}

      //[외곽선]
      //{
          _outLineColor = d_Color_FormOutLine;

      //}

      //[바탕]
      //{
          _backColor = d_Color_Back;

      //}

      //[부품색]
      //{
          //[2010.02.05.금][추가!!!]
          //내부의 모든 부품에 사용되는 기본색을 지정한다.
          _partColor = d_Color_Part;

      //}

      //[대상 편집기]
      //{
          //처음에는 참조대상이 없으므로 비워둔다.
          _GEditorEdit = NULL;

      //}

      //[공용 알림창]
      //{
          //[2010.02.05.금][추가!!!]
          _GMsgBox = NULL;

          //[공용 알림창 위치 얻기]
          //{
              //[2012.05.01.화][중요수정!!!]{--------------------
              //<전역변수:_GPART_GBalloonBox> 자체주소를 얻는다.
              //}------------------------------------------------

              GPART_GMsgBox_GetPtr2(&_GMsgBox);

          //}

      //}

  //}

  //[컨트롤 생성]
  //{
      //[제목줄:제목]
      //{
          //[2010.02.02.화][추가!!!]{------------
          //<GLabel> 로 [제목줄] 을 하나 만든다.
          //모든 부품의 배치 기준이 된다.
          //}------------------------------------

          _captionTitleLabel          = new TGLabel_Form(this);
          _captionTitleLabel->Parent  = this;
          _captionTitleLabel->Visible = true;

          _captionTitleLabel->_Left(0);
          _captionTitleLabel->_Top(0);
          _captionTitleLabel->_Height(16);
          _captionTitleLabel->_Width(this->Width);

          _captionTitleLabel->_CaptionAutoPosH(true);
          _captionTitleLabel->_CaptionAutoPosV(true);

          _captionTitleLabel->_FontColor(d_Color_FontM);
          //_captionTitleLabel->_FontStyle(d_FONTSTYLE_bold);
          _captionTitleLabel->_BackColor(d_Color_Part);
          _captionTitleLabel->_Border(true);
          _captionTitleLabel->_BorderColor(_outLineColor);

          _captionTitleLabel->_Caption(" 찾기(형광문자)/교환 대화상자  ");

          //[중요!!!]{-----------------------------------------------------------------
          //실제 [제목줄] 로 전체를 끌기해야 하므로 현재 Form 의 함수로 전부 대체한다.
          _captionTitleLabel->OnMouseUp   = FormMouseUp;
          _captionTitleLabel->OnMouseDown = FormMouseDown;
          _captionTitleLabel->OnMouseMove = FormMouseMove;
          //}--------------------------------------------------------------------------

      //}

      //[바탕판]
      //{
          _baseForm          = new TGBase_Form(this);
          _baseForm->Parent  = this;
          _baseForm->Visible = true;

          _baseForm->Left    = d_Form_BorderWidth;
          _baseForm->Top     = _captionTitleLabel->Top + _captionTitleLabel->Height + d_Form_BorderWidth - 1;
          _baseForm->Width   = this->Width - d_Form_BorderWidth*2;
          _baseForm->Height  = this->Height - _baseForm->Top - d_Form_BorderWidth;

          _baseForm->_BackColor(_backColor);

      //}

      //[닫기 버튼]
      //{
          //[2010.02.02.화][추가!!!]{---------
          //[전체를 닫기] 할 버튼을 생성한다.
          //}---------------------------------

          _closeBmpBtn          = new TGBmpButton_Form(this);
          _closeBmpBtn->Parent  = this;
          _closeBmpBtn->Visible = true;

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

              _closeBmpBtn->_Top(2);
              _closeBmpBtn->_Width(12);
              _closeBmpBtn->_Left(this->Width - _closeBmpBtn->Width - 2);
              _closeBmpBtn->_Height(12);
              _closeBmpBtn->_Border(true);
              _closeBmpBtn->_Bitmap(bmp_path);
              _closeBmpBtn->_ImageWidth(12);
              _closeBmpBtn->_ImageHeight(12);

              _closeBmpBtn->_BorderColor(_outLineColor);
              _closeBmpBtn->_FrontColor(_outLineColor);
              _closeBmpBtn->_BackColor(_backColor);

              _closeBmpBtn->_EVENT_Click = _EVENT_Click_CloseButton;

          //}

      //}

      //[찾기 이름표]
      //{
          _findLabel          = new TGLabel_Form(this);
          _findLabel->Parent  = _baseForm;
          _findLabel->Visible = true;

          _findLabel->_Top(6);
          _findLabel->_Left(4);
          _findLabel->_Width(72);
          _findLabel->_FontColor(d_Color_Font);
          _findLabel->_Caption("찾을 문자열");
          _findLabel->_Border(false);


      //}

      //[찾을 문자열]
      //{
          _findEdit          = new TGEdit_Form(this);
          _findEdit->Parent  = _baseForm;
          _findEdit->Visible = true;

          _findEdit->_Width(this->Width - _findLabel->Width - 22);
          _findEdit->Left = (_findLabel->Left + _findLabel->Width + 4);
          _findEdit->Top  = (_findLabel->Top);
          _findEdit->_EDIT_TextOut("");
          _findEdit->_caret->_Hide();

          //[배경색 설정]
          //{
              //[2019.02.16.토][추가!!!]{------------------------------------------
              //전체 바탕이 [흰색] 으로 <edit> 의 것과 구분이 안되므로 [배경색] 을
              //기본 [테마색:밝기적용] 으로 설정해 준다.
              //}------------------------------------------------------------------

              BMP_Get_Bright_Color(_partColor, Ide_Bright_Edit, &color);
              _findEdit->_BackColor(color);

          //}

          _findEdit->_EVENT_KeyEnter = _EVENT_KeyEnter_findEdit;

      //}

      //[교환 이름표]
      //{
          _replaceLabel          = new TGLabel_Form(this);
          _replaceLabel->Parent  = _baseForm;
          _replaceLabel->Visible = true;

          _replaceLabel->_Width(72);
          _replaceLabel->_Left(4);
          _replaceLabel->_Top(_findLabel->Top + _findLabel->Height + 4);
          _replaceLabel->_FontColor(d_Color_Font);
          _replaceLabel->_Caption("교환 문자열");
          _replaceLabel->_Border(false);

      //}

      //[교환 문자열]
      //{
          _replaceEdit          = new TGEdit_Form(this);
          _replaceEdit->Parent  = _baseForm;
          _replaceEdit->Visible = true;

          //[초기화]{---------------------------------------------------------------
          _replaceEdit->_Width(this->Width - _replaceLabel->Width - 22);
          _replaceEdit->Left = (_replaceLabel->Left + _replaceLabel->Width + 4);
          _replaceEdit->Top  = (_replaceLabel->Top);
          _replaceEdit->_EDIT_TextOut("");
          _replaceEdit->_caret->_Hide();
          //}-----------------------------------------------------------------------

          //[배경색 설정]
          //{
              //[2019.02.16.토][추가!!!]{------------------------------------------
              //전체 바탕이 [흰색] 으로 <edit> 의 것과 구분이 안되므로 [배경색] 을
              //기본 [테마색:밝기적용] 으로 설정해 준다.
              //}------------------------------------------------------------------

              BMP_Get_Bright_Color(_partColor, Ide_Bright_Edit, &color);
              _replaceEdit->_BackColor(color);

          //}

      //}

      //[단어단위 구분]
      //{
          _wordCheckBtn          = new TGCheckButton_Form(this);
          _wordCheckBtn->Parent  = _baseForm;
          _wordCheckBtn->Visible = true;

          _wordCheckBtn->_Left(_replaceLabel->Left + 2);
          _wordCheckBtn->_Top(_replaceLabel->Top + _replaceLabel->Height + 8);

          //[2009.05.09.토][추가!!!]
          _wordCheckBtn->_EVENT_Click = _EVENT_Click_wordCheckBtn;

      //}

      //[단어단위 구분 이름표]
      //{
          _wordLabel          = new TGLabel_Form(this);
          _wordLabel->Parent  = _baseForm;
          _wordLabel->Visible = true;

          _wordLabel->_Width(60);
          _wordLabel->_Left(_wordCheckBtn->Left + _wordCheckBtn->Width + 2);
          _wordLabel->_Top(_wordCheckBtn->Top - 1);
          _wordLabel->_FontColor(d_Color_Font);
          _wordLabel->_Caption("단어 구분");
          _wordLabel->_Border(false);

      //}

      //[대소문자 구분]
      //{
          _caseCheckBtn          = new TGCheckButton_Form(this);
          _caseCheckBtn->Parent  = _baseForm;
          _caseCheckBtn->Visible = true;

          _caseCheckBtn->_Left(_wordLabel->Left + _wordLabel->Width + 102);
          _caseCheckBtn->_Top(_replaceLabel->Top + _replaceLabel->Height + 8);

          //[2009.05.09.토][추가!!!]
          _caseCheckBtn->_EVENT_Click = _EVENT_Click_caseCheckBtn;

      //}

      //[대소문자 구분 이름표]
      //{
          _caseLabel          = new TGLabel_Form(this);
          _caseLabel->Parent  = _baseForm;
          _caseLabel->Visible = true;

          _caseLabel->_Width(92);
          _caseLabel->_Left(_caseCheckBtn->Left + _caseCheckBtn->Width + 2);
          _caseLabel->_Top(_wordLabel->Top - 1);
          _caseLabel->_FontColor(d_Color_Font);
          _caseLabel->_Caption("대/소문자 구분");
          _caseLabel->_Border(false);

      //}

      //[찾기 버튼]
      //{
          _findBtn          = new TGButton_Form(this);
          _findBtn->Parent  = _baseForm;
          _findBtn->Visible = true;

          _findBtn->_Top(_wordCheckBtn->Top + _wordCheckBtn->Height + 8);
          _findBtn->_Left(_wordCheckBtn->Left);
          _findBtn->_Width(this->Width/3 - 5*2);
          _findBtn->_Height(20);
          _findBtn->_FontColor(d_Color_Font);
          _findBtn->_Caption("찾기(F3)");

          //[풍선 도움말 설정]
          //{
              _findBtn->_BalloonHelpUse(true);
              _findBtn->_BalloonHelpStr
              ("[찾을 문자열] 에 등록된 문자열과 일치하는 문자열을\r\n"
               "조건에 맞게 찾아줍니다."
              );

          //}

          _findBtn->_EVENT_Click = _EVENT_Click_findBtn;

      //}

      //[교환 버튼]
      //{
          _replaceBtn          = new TGButton_Form(this);
          _replaceBtn->Parent  = _baseForm;
          _replaceBtn->Visible = true;

          _replaceBtn->_Top(_wordCheckBtn->Top + _wordCheckBtn->Height + 8);
          _replaceBtn->_Left(_findBtn->Left + _findBtn->Width + 4);
          _replaceBtn->_Width(this->Width/3 - 5*2);
          _replaceBtn->_Height(20);
          _replaceBtn->_FontColor(d_Color_Font);
          _replaceBtn->_Caption("교환");

          //[풍선 도움말 설정]
          //{
              _replaceBtn->_BalloonHelpUse(true);
              _replaceBtn->_BalloonHelpStr
              ("[찾을 문자열] 에 등록된 문자열을 조건에 맞게 찾아서\r\n"
               "[교환 문자열] 에 등록된 문자열로 바꿔 줍니다.\r\n"
               "수정된 내용은 [되돌리기/되살리기] 기능으로 복구할수\r\n"
               "있습니다."
              );

          //}

          _replaceBtn->_EVENT_Click = _EVENT_Click_replaceBtn;

      //}

      //[모두교환 버튼]
      //{
          _replaceAllBtn          = new TGButton_Form(this);
          _replaceAllBtn->Parent  = _baseForm;
          _replaceAllBtn->Visible = true;

          _replaceAllBtn->_Top(_wordCheckBtn->Top + _wordCheckBtn->Height + 8);
          _replaceAllBtn->_Left(_replaceBtn->Left + _replaceBtn->Width + 4);
          _replaceAllBtn->_Width(this->Width/3 - 5*2 + 2);
          _replaceAllBtn->_Height(20);
          _replaceAllBtn->_FontColor(d_Color_Font);
          _replaceAllBtn->_Caption("모두 교환");

          //[풍선 도움말 설정]
          //{
              _replaceAllBtn->_BalloonHelpUse(true);
              _replaceAllBtn->_BalloonHelpStr
              ("[찾을 문자열] 에 등록된 문자열을 조건에 맞게 찾아서\r\n"
               "[교환 문자열] 에 등록된 문자열로 모두 바꿔 줍니다.\r\n"
               "수정된 내용은 [되돌리기/되살리기] 기능으로 복구할수\r\n"
               "있습니다."
              );

          //}

          _replaceAllBtn->_EVENT_Click = _EVENT_Click_replaceAllBtn;

      //}

  //}

  return;

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  //[개체존재:생성]{**************
  //[2012.05.01.화][추가!!!]
  //개체가 생성되었음을 알려준다.
  _this_ = false;
  //}*****************************

}

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

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

  //[개체존재:확인{*****************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 종료.
  if(_this_ != true) goto lbEnd;
  //}*******************************

  if(Message.Msg == WM_ERASEBKGND)
  {

    //전부 다시 그린다.
    _Shape();

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

  }

  lbEnd:

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

  return;

}

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

void __fastcall TGFindDialog_Form::_CaptionFontStyle(int  pCaptionFontStyle)
{
  //[2010.02.03.수][생성!!!]{-------------
  //출력 [제목줄문자열 속성] 을 설정한다.
  //}-------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _captionTitleLabel->_FontStyle(pCaptionFontStyle);

}

void __fastcall TGFindDialog_Form::_CaptionFontColor(int  pCaptionFontColor)
{
  //[2010.02.03.수][생성!!!]{-----------
  //출력 [제목줄문자열 색] 을 설정한다.
  //}-----------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _captionTitleLabel->_FontColor(pCaptionFontColor);

}

void __fastcall TGFindDialog_Form::_BtnBackColor(int  pBtnBackColor)
{
  //[2010.02.05.금][생성!!!]{---
  //버튼의 바탕색을 설정한다.
  //}---------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _findBtn->_BackColor(pBtnBackColor);
  _replaceBtn->_BackColor(pBtnBackColor);
  _replaceAllBtn->_BackColor(pBtnBackColor);

}

void __fastcall TGFindDialog_Form::_BackColor(int  pBackColor)
{
  //[2010.02.03.수][생성!!!]

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _backColor = pBackColor;

  //[부품에 반영]
  //{
      _closeBmpBtn->_BackColor(_backColor);

      _baseForm->_BackColor(_backColor);

      //[2010.02.05.금][추가!!!]
      _wordCheckBtn->_BackColor(_backColor);
      _caseCheckBtn->_BackColor(_backColor);

      _findLabel->_BackColor(_backColor);
      _replaceLabel->_BackColor(_backColor);
      _wordLabel->_BackColor(_backColor);
      _caseLabel->_BackColor(_backColor);

  //}

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

}

void __fastcall TGFindDialog_Form::_OutLineColor(int  pOutLineColor)
{
  //[2010.02.03.수][생성!!!]

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _outLineColor = pOutLineColor;

  //[부품에 반영]
  //{
      _captionTitleLabel->_BorderColor(_outLineColor);

      _closeBmpBtn->_BorderColor(_outLineColor);
      _closeBmpBtn->_FrontColor(_outLineColor);

  //}

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

}

void __fastcall TGFindDialog_Form::_BorderColor(int  pBorderColor)
{
  //[2010.02.03.수][생성!!!]{--------------------------------------------
  //[테두리색] 은 별도 속성이 없음로 적용되는 [부품] 들에 직접 설정한다.
  //}--------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _borderColor = pBorderColor;

  //[부품에 반영]
  //{
  
  //}

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

}

void __fastcall TGFindDialog_Form::_PartColor(int  pPartColor)
{
  //[2010.02.03.수][생성!!!]{--------------------------------------------
  //[테두리색] 은 별도 속성이 없음로 적용되는 [부품] 들에 직접 설정한다.
  //}--------------------------------------------------------------------

  //[VAR]
  //{
      //[2019.02.16.토][추가]
      int  color;

  //}

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _partColor = pPartColor;

  //[부품에 반영]
  //{
      _findEdit->_BorderColor(_partColor);

      //[배경색 설정]
      //{
          //[2019.02.16.토][추가!!!]{------------------------------------------
          //전체 바탕이 [흰색] 으로 <edit> 의 것과 구분이 안되므로 [배경색] 을
          //기본 [테마색:밝기적용] 으로 설정해 준다.
          //}------------------------------------------------------------------

          BMP_Get_Bright_Color(_partColor, Ide_Bright_Edit, &color);
          _findEdit->_BackColor(color);

      //}

      _replaceEdit->_BorderColor(_partColor);

      //[배경색 설정]
      //{
          //[2019.02.16.토][추가!!!]{------------------------------------------
          //전체 바탕이 [흰색] 으로 <edit> 의 것과 구분이 안되므로 [배경색] 을
          //기본 [테마색:밝기적용] 으로 설정해 준다.
          //}------------------------------------------------------------------

          BMP_Get_Bright_Color(_partColor, Ide_Bright_Edit, &color);
          _replaceEdit->_BackColor(color);

      //}

      _wordCheckBtn->_FrontColor(_partColor);

      _caseCheckBtn->_FrontColor(_partColor);

      _findBtn->_BorderColor(_partColor);
      _replaceBtn->_BorderColor(_partColor);
      _replaceAllBtn->_BorderColor(_partColor);

  //}

}

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

  //[2007.03.18.일][수정!!!]--------------------------------------------------
  //1 pixel 의 [통합개발환경] 전체 테두리를 마지막에 그려준다.
  //이는 윤곽을 더 뚜렷하게 하기 위한 것이다.
  //}-------------------------------------------------------------------------

  //[VAR]
  //{
      TRect  trect;

      int    top;

  //}

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[Top 위치 구하기]
  //{
      top = _captionTitleLabel->Height;

  //}

  //[테두리 만들기]
  //{
      //[위 테두리]{---------------------------------
      trect.Left   = 0;
      trect.Top    = top;
      trect.Right  = this->Width;
      trect.Bottom = top + d_Form_BorderWidth;

      this->Canvas->Brush->Color = _borderColor;
      this->Canvas->FillRect(trect);
      //[좌측 테두리]{-------------------------------
      trect.Left   = 0;
      trect.Top    = top;
      trect.Right  = d_Form_BorderWidth;
      trect.Bottom = this->Height;

      this->Canvas->Brush->Color = _borderColor;
      this->Canvas->FillRect(trect);
      //[우측 테두리]{-------------------------------
      trect.Left   = this->Width - d_Form_BorderWidth;
      trect.Top    = top;
      trect.Right  = this->Width;
      trect.Bottom = this->Height;

      this->Canvas->Brush->Color = _borderColor;
      this->Canvas->FillRect(trect);
      //[아래 테두리]{-------------------------------
      trect.Left   = 0;
      trect.Top    = this->Height - d_Form_BorderWidth;
      trect.Right  = this->Width;
      trect.Bottom = this->Height;

      this->Canvas->Brush->Color = _borderColor;
      this->Canvas->FillRect(trect);
      //---------------------------------------------
  //}

  //[윤곽선 만들기]
  //{
      //[2010.02.02.화][추가!!!]{---------------------------------------
      //윤곽선을 무조건 만들어 주되 1pixel 의 별도색의 선으로 그려준다.
      //}---------------------------------------------------------------

      //[전체 외곽선 만들기]
      //{
          trect.Left   = 0;
          trect.Top    = 0;
          trect.Right  = this->Width;
          trect.Bottom = this->Height;

          this->Canvas->Pen->Color   = _outLineColor;
          this->Canvas->Pen->Width   = 1;
          this->Canvas->Brush->Style = bsClear;
          this->Canvas->Rectangle(trect);

      //}

  //}

  return;

}

void __fastcall TGFindDialog_Form::_Shape(void)
{
  //[2010.02.02.화][생성!!!]{-------------------------------------------
  //이전과 달리 this->Canvas 를 사용하지 않고 직접 그리는 방식으로 변경한다.
  //사실상 개별적인 [부품] 을 사용하므로 실제 그려주는 것은 [제목줄] 과
  //[테두리] 뿐이기 때문이다.
  //this->Canvas 를 사용하는 것은 낭비다.
  //}-------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[바탕 지우기]
  //{
      this->Canvas->Brush->Color = _backColor;
      this->Canvas->FillRect(this->Canvas->ClipRect);

  //}

  _Border();

  return;

}

void __fastcall TGFindDialog_Form::_Set_EditorEdit(void  *pEditorEdit)
{
  //[2010.02.07.일][생성!!!]{-----------------------------------------------------
  //굳이 <GEditorEdit> 를 사용하지 않고 <void *> 로 처리한다.
  //이게 가장 합리적이며, <*.h> 중복으로 인한 여러 오류도 간단하게 해결할수 있다.
  //}-----------------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _GEditorEdit = (TGEditorEdit_Form *)pEditorEdit;

}

void __fastcall TGFindDialog_Form::_Show(void)
{
  //[2012.07.22.일][생성!!!]{----------------------------------------
  //[항상 위로] 보이도록 하기 위한 처리를 위하여 별도 함수를 만든다.
  //}----------------------------------------------------------------

  this->FormStyle = fsNormal;
  this->FormStyle = fsStayOnTop;

  this->BringToFront();

  this->Show();

}

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

void __fastcall TGFindDialog_Form::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2006.11.07.화][생성!!!]{-------
  //현재 [폼 이동] 처리에 사용한다.
  //}-------------------------------

  //[VAR]
  //{
      //[2018.03.17.토][추가!!!]
      TPoint  mousePos;

  //}

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[캡션바] 영역에서만 처리되어야 한다.
  if(((0 <= X) && (X < _captionTitleLabel->Width)) &&
     ((0 <= Y) && (Y < _captionTitleLabel->Height)))
  {
    if(Button == mbLeft)
    {
      //[위치 기록]
      //{
          //[2018.03.17.토][수정!!!]{-----------------------------------------------------
          //[전체화면] 을 대상으로한 위치 사용.
          //이는 <GVmos> 등 다른 Form 안에 생성되는 경우에도 동일하게 동작 시키기 위한것.
          //}-----------------------------------------------------------------------------

          //[전체화면] 을 대상으로 마우스 위치 얻기.
          GetCursorPos(&mousePos);

          //현재 <this> 위치와 [마우스] 위치 간의 거리 얻기.
          //항상 같은 거리를 유지하는 방법으로 [제목줄 이동] 을 구현하기 위한것.
          deltaLeft = mousePos.x - this->Left;
          deltaTop  = mousePos.y - this->Top;

      //}

      //caption 이 선택된 것을 알린다.
      _captionSelected = true;

      //[wine 지원]
      //{
          //[2018.03.03.토][추가!!!]{---------
          //[제목줄] 이동을 위한 타이머 켜기.
          //}---------------------------------

          if(_ide_option->wine == true)
          {
            captionMoveTimer->Enabled = true;

          }

      //}

    }

  }

  return;

}

void __fastcall TGFindDialog_Form::FormMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  //[2006.11.07.화][생성!!!]{----------------------
  //마우스로 caption 을 집어 끄는 경우를 처리한다.
  //}----------------------------------------------

  //[VAR]
  //{
      //[2018.03.17.토][추가!!!]
      TPoint  mousePos;

  //}

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[캡션바 이동]
  //{
      //[캡션바] 영역에서만 처리되어야 한다.
      if(((0 <= X) && (X < _captionTitleLabel->Width)) &&
         ((0 <= Y) && (Y < _captionTitleLabel->Height)) ||
         //마우스로 집어  끄는 경우 영역을 벗어난 경우도 처리 되어야 한다.
         //이는 집어 끌다가 놓치는 경우를 막기 위한 것이다.
         (Shift.Contains(ssLeft)))
      {
        if((Shift.Contains(ssLeft)) && (_captionSelected == true))
        {
          //caption 을 마우스로 집어끄는 경우 Form 을 이동 시켜야 한다.

          //[wine 지원]
          //{
              //[2018.03.03.토][추가!!!]{-------------------------------
              //<Linux:wine> 에서 구동 중이라면 여기서 처리하지 않는다.
              //<captionMoveTimerTimer()> 안에서 처리된다.
              //}-------------------------------------------------------

              if(_ide_option->wine == true)
              {
                //[Linux:wine]
                //이 경우 아래에서 사용하는 <Left>, <Top> 값은 <captionMoveTimer> 안에서
                //수정되고 있는 정확한 값으로 처리.

              }
              else
              {
                //[윈도우]

                //[위치 이동]
                //{
                    //[2018.03.17.토][수정!!!]{-----------------------------------------------------
                    //[전체화면] 을 대상으로한 위치 사용.
                    //이는 <GVmos> 등 다른 Form 안에 생성되는 경우에도 동일하게 동작 시키기 위한것.
                    //}-----------------------------------------------------------------------------

                    //[전체화면] 을 대상으로 마우스 위치 얻기.
                    GetCursorPos(&mousePos);

                    //현재 <this> 위치와 [마우스] 위치 간의 거리를
                    //항상 같은 거리로 유지하는 방법으로 [제목줄 이동] 을 구현.
                    this->Left = mousePos.x - deltaLeft;
                    this->Top  = mousePos.y - deltaTop;

                //}
                
              }

          //}

        }

      }
  //}

  return;

}

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

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[wine 지원]
  //{
      //[2018.03.03.토][추가!!!]{---------
      //[제목줄] 이동을 위한 타이머 끄기.
      //}---------------------------------

      if(_ide_option->wine == true)
      {
        //<FormMouseUp> 에서는 무조건 타이머 정지.
        captionMoveTimer->Enabled = false;

      }

  //}

  if(((0 <= X) && (X < _captionTitleLabel->Width)) &&
     ((0 <= Y) && (Y < _captionTitleLabel->Height)))
  {
    //[화면 영역안 존재 검사]
    //{
        //[2010.02.05.금][추가!!!]{---------------------------------------------------
        //현재 끌기중 화면 영역을 벗어난 생태일 경우는 다시 끌어서 화면 영역안에
        //놓을수 없게 되므로, 화면 영역을 벗어난 경우는 다시 화면 안으로 위치 시킨다.
        //}---------------------------------------------------------------------------

        if((_captionSelected == true) &&
           //[2010.03.03.수][중요추가!!!]{-------------------------------
           //생성시 <Parent> 를 설정하지 않으면 전체 회면이 대상이되는데
           //이때는 <Parent:0> 이 되므로 이 경우는 처리하지 않아야 한다.
           //이는 내부 적으로 <Parent> 의 정보를 사용하는 부분이 있어어
           //<Parent:0> 인 경우 사용하면 오류가 발생한다.
           (this->Parent != NULL)
           //}-----------------------------------------------------------
          )
        {
          if     (this->Top < 0)
          {
            //[!]{-------------------------------------------
            //위쪽으로 벗어난 경우는 가장 위쪽에 배치시킨다.
            //}----------------------------------------------

            this->Top = 0;

          }
          else if(this->Top >= (this->Parent->Height - _captionTitleLabel->Height))
          {
            //[!]{---------------------------------------------
            //아래쪽으로 벗어난 경우는 가장 아래에 배치 시키되
            //반드시 [제목줄] 이 다 나오게 만든다
            //}------------------------------------------------

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

          }

          if     (this->Left < 0)
          {
            //왼쪽으로 벗어난 경우는 가장 왼쪽에 배치시킨다.
            this->Left = 0;

          }
          else if(this->Left >= (this->Parent->Width - _captionTitleLabel->Width))
          {
            //이 경우는 [제목줄] 을 끌어 들일수 있는 조금의 영역만 보이게 한다.
            this->Left = this->Parent->Width - _captionTitleLabel->Width;

          }

        }

    //}

  }

  //[해제]
  //{
      //caption 선택을 해제한다.
      _captionSelected = false;
  //}

  return;

}

//------------------------------------------------------------------------------
//[찾기관련 함수]---------------------------------------------------------------
//------------------------------------------------------------------------------

bool __fastcall TGFindDialog_Form::_Find(//선택 된것 항상 보이기
                                            bool  pSelectView,
                                            //다시 그릴 것인가.
                                            bool  pReDraw,
                                            //찾을수 없는 경우 대화상자 보여주려면 true.
                                            bool  pMsgView,
                                            //[2009.05.08.금][추가!!!]
                                            //[입력지정자] 위쪽 보기 설정.
                                            bool  pAlwaysTopMiddle,
                                            //[입력지정자] 아래쪽 보기 설정.
                                            bool  pAlwaysBottomMiddle)
{
  //[2009.05.06.수][생성!!!]{------------------------------------------------------------------------
  //[찾을 문자열] 을 현재 편집중인 문서의 [입력지정자] 위치부터 찾는다.
  //찾으면 멈춘다.
  //
  //[2012.05.01.화][수정!!!]-------------------------------------------------------------------------
  //
  //[2012.05.04.금][중요수정!!!]---------------------------------------------------------------------
  //<MsgBox> 에 [유사모달속성] 을 적용하는 경우 내부에서 <while()> 문으로 정지하게 되는데
  //[VMOS:쓰레드] 강제 종료시 이 부분 때문에 종료가 안된다.
  //
  //[맷돌C:API] 에서 이 함수가 호출된 상태에서 <MsgBox:유사모달> 로 보이는 경우는 [맷돌C:API] 자체를
  //종료하지 못한 상태가 계속 되므로 [VMOS:쓰레드] 자체가 정지하게 되어 종료에  반응하지 않는다.
  //따라서, 그림 부품 안에서 <MsgBox> 를 사용하지 않도록 하고, 사용시에는 [유사모달] 속성이 아닌
  //단순 보이기 용도로만 사용한다.
  //}------------------------------------------------------------------------------------------------

  //[VAR]
  //{
      //찾기 시작할 위치.
      int  findStartIndex;
      int  findIndex;

  //}

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return(false);
  //}******************************************

  //[대상존재확인]
  //{
      //대상 [편집기] 가 존재하지 않는 경우는 처리하지 않는다.
      if(_GEditorEdit == NULL) return(false);

  //}

  //[찾을 문자열이 있나?]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(_findEdit->_editbuf[0] == '\0') return(false);

  //}

  //[찾기 시작 위치 지정]
  //{
      //이미 찾은 단어가 선택된 상태인 경우는 이 다음위치 부터 처리해야 한다.
      if((((TGEditorEdit_Form *)_GEditorEdit)->_select_start.caret_index >= 0) &&
         (((TGEditorEdit_Form *)_GEditorEdit)->_select_end.caret_index >= 0) &&
         //같은 위치라면 [선택영역] 이 없는 것으로 본다.
         (((TGEditorEdit_Form *)_GEditorEdit)->_select_start.caret_index != ((TGEditorEdit_Form *)_GEditorEdit)->_select_end.caret_index))
      {
        //이 경우는 이미 선택된 것이 있으므로 다음 위치로 이동한다.
        findStartIndex = ((TGEditorEdit_Form *)_GEditorEdit)->_select_start.caret_index + 1;

      }
      else
      {
        //새로 시작하는 경우로 보고 현재 [입력지정자] 위치를 할당한다.
        findStartIndex = ((TGEditorEdit_Form *)_GEditorEdit)->_caretindex;

      }

  //}

  //[찾기]
  //{
      //지정한 조건으로 찾는다.
      STR_Find(((TGEditorEdit_Form *)_GEditorEdit)->_editbuf, ((TGEditorEdit_Form *)_GEditorEdit)->_filesize,
               findStartIndex, _wordCheckBtn->_checked, _caseCheckBtn->_checked,
               _findEdit->_editbuf, &findIndex);

      if(findIndex == -1)
      {
        if(pMsgView == true)
        {
          //[2012.05.03.목][중요수정!!!]{----------------------------------------
          //[알림창] 을 [BCB] 용으로 구동 지정.
          //더불어 [VMOS:쓰레드] 강제 종료시 [공용개체] 가 삭제되었을수 있으므로
          //반드시 존재 유무를 확인하고 처리한다.
          //
          //[2012.05.04.금][중요수정!!!]-----------------------------------------
          //[BCB/맷돌C] 용을 구분하여 처리.
          //}--------------------------------------------------------------------

          //이 경우는 찾는 것이 없는 것이다.
          if((*_GMsgBox) != NULL)
          {
            //[2012.05.05.토][수정!!!]{--------------------------------------------
            //<_MsgBox> 는 이미 [BCB/맷돌C] 구분을 위한 <_GUse> 를 가지고 있으므로
            //여기서는 그냥 사용하면 된다.
            //}--------------------------------------------------------------------

            (*_GMsgBox)->_MsgBox(d_MSGBOX_info,
                                 "현재 문서에서 더이상 해당 문자열을 찾을수 없습니다."
                                );

          }

        }

        return(false);

      }

  //}

  //[<선택영역> 으로 지정]
  //{
      //찾을 문자열을 [선택영역] 으로 지정해준다.
      //아래 함수에서 자동으로 [선택] 한것이 보이는 위치에 있도록 처리된다.
      ((TGEditorEdit_Form *)_GEditorEdit)->History_SelectX(findIndex,
                                           findIndex + STR_Length(_findEdit->_editbuf),
                                           pSelectView,
                                           NULL,
                                           pReDraw,
                                           pAlwaysTopMiddle,
                                           pAlwaysBottomMiddle);

  //}

  return(true);

}

bool __fastcall TGFindDialog_Form::_Find_ReplaceStr(//선택 된것 항상 보이기
                                                    bool  pSelectView,
                                                    //다시 그릴 것인가.
                                                    bool  pReDraw,
                                                    //찾을수 없는 경우 대화상자 보여주려면 true.
                                                    bool  pMsgView,
                                                    //[입력지정자] 위쪽 보기 설정.
                                                    bool  pAlwaysTopMiddle,
                                                    //[입력지정자] 아래쪽 보기 설정.
                                                    bool  pAlwaysBottomMiddle)
{
  //[2019.02.14.목][생성]{------------------------------------------------
  //<_Fine()> 함수를 사용하여 만든다.
  //
  //[교환 문자열] 을 현재 편집중인 문서의 [입력지정자] 위치부터 찾는다.
  //찾으면 멈춘다.
  //
  //이 함수는 [키:F4] 를 누르면 [교환:문자열] 을 찾아 주는 기능을 위한것.
  //[키:F3] 와 유사한 기능.
  //}---------------------------------------------------------------------

  //[VAR]
  //{
      //찾기 시작할 위치.
      int  findStartIndex;
      int  findIndex;

  //}

  //[개체존재:확인{****************************
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return(false);
  //}******************************************

  //[대상존재확인]
  //{
      //대상 [편집기] 가 존재하지 않는 경우는 처리하지 않는다.
      if(_GEditorEdit == NULL) return(false);

  //}

  //[찾을 문자열이 있나?]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(_replaceEdit->_editbuf[0] == '\0') return(false);

  //}

  //[찾기 시작 위치 지정]
  //{
      //이미 찾은 단어가 선택된 상태인 경우는 이 다음위치 부터 처리해야 한다.
      if((((TGEditorEdit_Form *)_GEditorEdit)->_select_start.caret_index >= 0) &&
         (((TGEditorEdit_Form *)_GEditorEdit)->_select_end.caret_index >= 0) &&
         //같은 위치라면 [선택영역] 이 없는 것으로 본다.
         (((TGEditorEdit_Form *)_GEditorEdit)->_select_start.caret_index != ((TGEditorEdit_Form *)_GEditorEdit)->_select_end.caret_index))
      {
        //이 경우는 이미 선택된 것이 있으므로 다음 위치로 이동한다.
        findStartIndex = ((TGEditorEdit_Form *)_GEditorEdit)->_select_start.caret_index + 1;

      }
      else
      {
        //새로 시작하는 경우로 보고 현재 [입력지정자] 위치를 할당한다.
        findStartIndex = ((TGEditorEdit_Form *)_GEditorEdit)->_caretindex;

      }

  //}

  //[찾기]
  //{
      //지정한 조건으로 찾는다.
      STR_Find(((TGEditorEdit_Form *)_GEditorEdit)->_editbuf, ((TGEditorEdit_Form *)_GEditorEdit)->_filesize,
               findStartIndex, _wordCheckBtn->_checked, _caseCheckBtn->_checked,
               _replaceEdit->_editbuf, &findIndex);

      if(findIndex == -1)
      {
        if(pMsgView == true)
        {
          //[2012.05.03.목][중요수정!!!]{----------------------------------------
          //[알림창] 을 [BCB] 용으로 구동 지정.
          //더불어 [VMOS:쓰레드] 강제 종료시 [공용개체] 가 삭제되었을수 있으므로
          //반드시 존재 유무를 확인하고 처리한다.
          //
          //[2012.05.04.금][중요수정!!!]-----------------------------------------
          //[BCB/맷돌C] 용을 구분하여 처리.
          //}--------------------------------------------------------------------

          //이 경우는 찾는 것이 없는 것이다.
          if((*_GMsgBox) != NULL)
          {
            //[2012.05.05.토][수정!!!]{--------------------------------------------
            //<_MsgBox> 는 이미 [BCB/맷돌C] 구분을 위한 <_GUse> 를 가지고 있으므로
            //여기서는 그냥 사용하면 된다.
            //}--------------------------------------------------------------------

            (*_GMsgBox)->_MsgBox(d_MSGBOX_info,
                                 "현재 문서에서 더이상 해당 문자열을 찾을수 없습니다."
                                );

          }

        }

        return(false);

      }

  //}

  //[<선택영역> 으로 지정]
  //{
      //찾을 문자열을 [선택영역] 으로 지정해준다.
      //아래 함수에서 자동으로 [선택] 한것이 보이는 위치에 있도록 처리된다.
      ((TGEditorEdit_Form *)_GEditorEdit)->History_SelectX(findIndex,
                                           findIndex + STR_Length(_replaceEdit->_editbuf),
                                           pSelectView,
                                           NULL,
                                           pReDraw,
                                           pAlwaysTopMiddle,
                                           pAlwaysBottomMiddle);

  //}

  return(true);

}

void __fastcall TGFindDialog_Form::FormShow(TObject *Sender)
{
  //[2009.05.08.금][생성!!!]{---------
  //[찾을 문자열] 에 촛점을 맞춰준다.
  //}---------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _findEdit->SetFocus();

  //[2009.05.14.목][수정!!!]{---------------------------------------
  //이렇게 하지 않는 경우는 [입력지정자] 가 2 개 동시에 나온다.
  //따라서 [교환문자열] 의 것은 사라지게 만든다.
  //아마도 <KillFocus> 를 제대로 받지 못해서 발생하는 문제인것같다.
  _replaceEdit->_caret->_Hide();
  //}---------------------------------------------------------------

}
//---------------------------------------------------------------------------

void __fastcall TGFindDialog_Form::FormHide(TObject *Sender)
{
  //[2009.05.09.토][생성!!!]{-------------------------------------------------
  //현재 [찾을문자열] 에 등록된 문자열이 [편집기] 의 [형광문자] 로 등록되도록
  //다시 그려준다.
  //}-------------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _EVENT_KeyEnter_findEdit();

}

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

void __fastcall TGFindDialog_Form::_EVENT_Click_CloseButton(void)
{
  //[2010.02.02.화][생성!!!]{---
  //자체를 닫아준다.
  //}---------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  this->Close();

  return;

}

void __fastcall TGFindDialog_Form::_EVENT_Click_findBtn(void)
{
  //[2009.05.06.수][생성!!!]{-------------------------------------------
  //[찾을 문자열] 을 현재 편집중인 문서의 [입력지정자] 위치부터 찾는다.
  //찾으면 멈춘다.
  //}-------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  _Find(true, true, true,
        //[3009.05.08.금][추가!!!]
        //하나씩 찾는 경우는 무조건 위나 중간에 위치하게 만든다.
        false, true);

  //if(_GEditorEdit != NULL) { _GEditorEdit->_Caret_ViewAlways_Middle(true, true); }

  return;

}

void __fastcall TGFindDialog_Form::_EVENT_Click_replaceBtn(void)
{
  //[2009.05.06.수][생성!!!]{-------------------------------------------
  //현재 편집중인 문서의 [입력지정자] 위치부터 검사하여 [찾을문자열] 을
  //[교환문자열] 로 하나씩 찾은후 교환한다.
  //}-------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[대상존재확인]
  //{
      //대상 [편집기] 가 존재하지 않는 경우는 처리하지 않는다.
      if(_GEditorEdit == NULL) return;

  //}

  //[찾기]
  //{
      //먼저 현재 문자열을 조건에 맞게 찾는다.
      //선택영역은 보이지 않게 한다. 어차피 아래 함수에서 다시 그려지므로.
      if(_Find(false, false, true,
               //하나씩 교체 경우는 무조건 위나 중간에 위치하게 만든다.
               false, true) != true) return;

  //}

  //[교체]
  //{
      //이미 [선택영역] 으로 지정된 상태이므로 이상태에서 붙여넣기하면 된다.
      ((TGEditorEdit_Form *)_GEditorEdit)->_EDIT_Paste(_replaceEdit->_editbuf, true);

  //}

  //[문서수정]{---------------------------------
  //[2009.06.03.수][추가!!!]
  //문서가 수정됬음을 기록한다.
  ((TGEditorEdit_Form *)_GEditorEdit)->_EDIT_Changed(false, true);
  //}-------------------------------------------

  return;

}

void __fastcall TGFindDialog_Form::_EVENT_Click_replaceAllBtn(void)
{
  //[2009.05.06.수][생성!!!]{_-----------------------------------------------
  //현재 위치에서 문서의 끝까지 모두 [교체] 한다.
  //단, 문서 용량이 너무 많은 경우는 거의 멈춘것 같이 될수 있으므로 사용자가
  //도중에 중단 시킬수 있도록 처리한다.
  //}------------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[대상존재확인]
  //{
      //대상 [편집기] 가 존재하지 않는 경우는 처리하지 않는다.
      if(_GEditorEdit == NULL) return;

  //}

  if(STR_Match(_replaceAllBtn->_captionStr, "모두 교환") == true)
  {
    //버튼의 문자열을 교체한다.
    _replaceAllBtn->_Caption("중지");

    _loop = true;


    //[_EditBuf_Text() 기능 제어]{--------------------
    //_EditBuf_Text() 함수가 동작되지 못하게 한다.
    ((TGEditorEdit_Form *)_GEditorEdit)->_editBuf_Text_No_Select = true;
    //}-----------------------------------------------

    while(_loop)
    {
      Application->ProcessMessages();

      //[찾기]
      //{
          //먼저 현재 문자열을 조건에 맞게 찾는다.
          //더이상 찾는 것이 없다는 것은 문서의 끝이라는 것도 되므로 여기서
          //[반복문] 을 종료한다.
          //<return> 을 사용하면 마지막에 [다시그리기] 를 할수 없으므로 주의한다.
          if(_Find(false, false, false,
                   //연속 교체의 경우는 계속 [줄이동] 되는 것을 막기 위하여
                   //위/중간에 항상 위치하도록 설정한다.
                   false, true) != true) break;

      //}

      //[교체]
      //{
          //이미 [선택영역] 으로 지정된 상태이므로 이상태에서 붙여넣기하면 된다.
          ((TGEditorEdit_Form *)_GEditorEdit)->_EDIT_Paste(_replaceEdit->_editbuf, false);

      //}

    }

    //[_EditBuf_Text() 기능 제어]{---------------------
    //_EditBuf_Text() 함수의 동작을 허용한다.
    ((TGEditorEdit_Form *)_GEditorEdit)->_editBuf_Text_No_Select = false;
    //}------------------------------------------------

    //[문서수정]{---------------------------------
    //[2009.06.03.수][추가!!!]
    //문서가 수정됬음을 기록한다.
    ((TGEditorEdit_Form *)_GEditorEdit)->_EDIT_Changed(false, true);
    //}-------------------------------------------

    //다 처리 했다면 다시 원상복구 시켜준다.
    _replaceAllBtn->_Caption("모두 교환");

  }
  else
  {
    //이 경우는 "중지" 인 경우다.
    _replaceAllBtn->_Caption("모두 교환");

    _loop = false;

    Application->ProcessMessages();

  }

  return;

}

void __fastcall TGFindDialog_Form::_EVENT_KeyEnter_findEdit(void)
{
  //[2009.05.09.토][생성!!!]{-------------------------------------------------
  //현재 [찾을문자열] 에 등록된 문자열이 [편집기] 의 [형광문자] 로 등록되도록
  //다시 그려준다.
  //}-------------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[대상존재확인]
  //{
      //대상 [편집기] 가 존재하지 않는 경우는 처리하지 않는다.
      if(_GEditorEdit == NULL) return;

  //}

  ((TGEditorEdit_Form *)_GEditorEdit)->_EditBuf_Text();

  return;

}

void __fastcall TGFindDialog_Form::_EVENT_Click_wordCheckBtn(void)
{
  //[2009.05.09.토][생성!!!]{-------------------------------------------------
  //현재 [찾을문자열] 에 등록된 문자열이 [편집기] 의 [형광문자] 로 등록되도록
  //다시 그려준다.
  //}-------------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[대상존재확인]
  //{
      //대상 [편집기] 가 존재하지 않는 경우는 처리하지 않는다.
      if(_GEditorEdit == NULL) return;

  //}

  ((TGEditorEdit_Form *)_GEditorEdit)->_EditBuf_Text();

  return;

}

void __fastcall TGFindDialog_Form::_EVENT_Click_caseCheckBtn(void)
{
  //[2009.05.09.토][생성!!!]{-------------------------------------------------
  //현재 [찾을문자열] 에 등록된 문자열이 [편집기] 의 [형광문자] 로 등록되도록
  //다시 그려준다.
  //}-------------------------------------------------------------------------

  //[개체존재:확인{****************************
  //[2012.05.01.화][추가!!!]
  //개체가 이미 해제된 뒤라면 처리하지 않는다.
  if(_this_ != true) return;
  //}******************************************

  //[대상존재확인]
  //{
      //대상 [편집기] 가 존재하지 않는 경우는 처리하지 않는다.
      if(_GEditorEdit == NULL) return;

  //}

  ((TGEditorEdit_Form *)_GEditorEdit)->_EditBuf_Text();

  return;

}

void __fastcall TGFindDialog_Form::captionMoveTimerTimer(TObject *Sender)
{
  //[2018.03.03.토][생성!!!]{---------------------------
  //[Linux:wine] 에서 [제목줄:이동] 을 지원하기 위한것.
  //}---------------------------------------------------

  //[VAR]
  //{
      TPoint  mousePos;

  //}

  //[위치 수정]
  //{
      //[!]{-----------------------------------------------------------------------------
      //이전 방식은 <Linux:wine> 에서는 빠르게 이동하는 경우 [떨림] 현상이 생기고
      //이동이 끊어지는 문제가 발생.
      //이는 <Linux:wine> 에서 [제목줄] 밖으로 [화면지정자] 가 나가는 경우를 제대로
      //처리하지 못하는 문제인듯.
      //따라서, 기존처럼 [상대좌표] 를 사용하지 않고 [절대좌표] 를 사용하는 것으로 수정.
      //}--------------------------------------------------------------------------------

      //[마우스 절대 위치 얻기]
      //{
          //화면상의 [마우스] 절대 위치를 얻는다.
          GetCursorPos(&mousePos);

      //}

      //[이동]
      //{
          //[2018.03.17.토][수정!!!]{---------------------------------
          //현재 <this> 위치와 [마우스] 위치 간의 거리를
          //항상 같은 거리로 유지하는 방법으로 [제목줄 이동] 을 구현.
          //자세한 내용은 [제목줄 이동] 관련 부분 설명 연관 참고.
          //}---------------------------------------------------------
          
          this->Left = mousePos.x - deltaLeft;
          this->Top  = mousePos.y - deltaTop;

      //}

  //}
  
}






