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

#include <vcl.h>
#pragma hdrstop

#include "ide_vsplit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tide_vsplit_Form *ide_vsplit_Form;
//---------------------------------------------------------------------------


//[다른 폼]
//{
    #include "main.h"
    #include "ide_main.h"
    #include "ide_tree.h"
    #include "ide_editor.h"

    #include "gui.h"
//}


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

  //}

  //[초기화]
  //{
      //-------------------------------------------------------------
      this->Left   = ide_tree_Form->Left + ide_tree_Form->Width - 1;
      this->Top    = ide_tree_Form->Top;
      this->Width  = 6;
      this->Height = ide_tree_Form->Height;

      this->Color  = clWhite;

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

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

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

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

  //}

  //[2009.11.28.토][추가!!!]{---------------
  //[동작함수] 는 처음에는 사용중이지 않다.
  FormMouseMove_Running = false;
  //}---------------------------------------

  return;

}

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

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

}

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

void __fastcall Tide_vsplit_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 Tide_vsplit_Form::_Shape(void)
{
  //[2006.10.23.월][생성!!!]{-------------------
  //[하위항목] 구조체 정보를 대상으로 처리한다.
  //}-------------------------------------------

  //[VAR]
  //{
      TRect  rect;
      int    x, y, w, h;
  //}

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

  //[테두리]
  //{
      _bmp_->Canvas->Pen->Color   = _ide_option->color_0;
      _bmp_->Canvas->Pen->Width   = 1;
      _bmp_->Canvas->Brush->Style = bsClear;

      //spliter 가 결합된 것처럼 보이도록 맨 아래 테두리는 보이지 않게 한다.
      rect.Bottom += 1;
      
      _bmp_->Canvas->Rectangle(_bmp_->Canvas->ClipRect);
  //}

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

  return ;

}

void __fastcall Tide_vsplit_Form::_Resize(void)
{
  //[2006.10.22.일][생성!!!]{--
  //컨트롤 크기를 조정한다.
  //}--------------------------

  //[크기조정]
  //{
      //IDE Form 에 맞게 크기를 조정한다.
      this->Top    = ide_tree_Form->Top;
      this->Height = ide_tree_Form->Height;
  //}

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

  return;

}

void __fastcall Tide_vsplit_Form::_Splits(void)
{
  //[2006.10.24.화][생성!!!]{-----------
  //관련 컨트롤의 크기를 정부 조정한다.
  //}-----------------------------------

  ide_tree_Form->_Split_v();
  ide_editor_Form->_Split_v();

  return;

}

void __fastcall Tide_vsplit_Form::_Split_h(void)
{
  //[2006.10.24.화][생성!!!]{------
  //수평 spliter 동작시 크기 조정.
  //}------------------------------

  //[크기조정]
  //{
      //IDE Form 에 맞게 크기를 조정한다.
      this->Top    = ide_tree_Form->Top;
      this->Height = ide_tree_Form->Height;
  //}

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

  return;

}

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

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

  return;

}

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

void __fastcall Tide_vsplit_Form::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if(Button == mbLeft)
  {
    //마우스로 집어끌기 위하여 시작 좌표를 기록한다.
    _mouse_down_point.x = X;
    _mouse_down_point.y = Y;

  }

  return;

}

void __fastcall Tide_vsplit_Form::FormMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  //[중복 실행 방지]
  //{
      //[2009.11.28.토][추가!!!]{-------------
      //[동작함수] 의 [재귀호출] 을 막아준다.
      //}-------------------------------------

      //현재 [동작함수] 가 동작중인 경우는 처리하지 않는다.
      if(FormMouseMove_Running == true) return;

      //현재 [동작함수] 가 동작 중임을 표시.
      FormMouseMove_Running = true;

  //}

  //[2010.04.08.목][수정!!!]{---------------------------------------
  //크기 조정은 <FormMouseUp> 에서 한번한 처리하는 것으로 처리한다.
  //여기는 일단 주석으로 만들어 놓는다.
  //}---------------------------------------------------------------

  /*
  if(Shift.Contains(ssLeft))
  {
    if     ((this->Left < 80) && (0 < (X - _mouse_down_point.x)))
    {
      //처리해야 한다.
      this->Left += (X - _mouse_down_point.x);

      //연관된 모든 컨트롤의 크기를 조정한다.
      _Splits();

    }
    else if((this->Left > (main_Form->Width - 80)) && (0 > (X - _mouse_down_point.x)))
    {
      //처리해야 한다.
      this->Left += (X - _mouse_down_point.x);

      //연관된 모든 컨트롤의 크기를 조정한다.
      _Splits();

    }
    else if((80 <= this->Left) && (this->Left <= (main_Form->Width - 80)))
    {
      this->Left += (X - _mouse_down_point.x);

      //연관된 모든 컨트롤의 크기를 조정한다.
      _Splits();

    }

  }
  */

  //[2009.11.28.토][추가!!!]{--------
  //[동작함수] 동작이 끝났음을 표시.
  FormMouseMove_Running = false;
  //}--------------------------------

  return;

}

void __fastcall Tide_vsplit_Form::FormMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[크기조정]
  //{
      //[2010.04.08.목][추가!!!]{-------------------------------------------------
      //크기를 <FormMouseMove> 에서 계속 처리하지 않고 여기서 [한번] 만 처리한다.
      //}-------------------------------------------------------------------------

      if(Button == mbLeft)
      {
        if     ((this->Left < 80) && (0 < (X - _mouse_down_point.x)))
        {
          //처리해야 한다.
          this->Left += (X - _mouse_down_point.x);

          //연관된 모든 컨트롤의 크기를 조정한다.
          _Splits();

        }
        else if((this->Left > (main_Form->Width - 80)) && (0 > (X - _mouse_down_point.x)))
        {
          //처리해야 한다.
          this->Left += (X - _mouse_down_point.x);

          //연관된 모든 컨트롤의 크기를 조정한다.
          _Splits();

        }
        else if((80 <= this->Left) && (this->Left <= (main_Form->Width - 80)))
        {
          this->Left += (X - _mouse_down_point.x);

          //연관된 모든 컨트롤의 크기를 조정한다.
          _Splits();

        }

      }

  //}

  //[최소 크기 조정]
  //{
      //[2010.04.08.목][수정!!!]{----------------------
      //최소 크기를 유지 할수 있도록 다시 조정해 준다.
      //}----------------------------------------------
      
      if     (this->Left < 80)
      {
        //처리해야 한다.
        this->Left = 80;

        //연관된 모든 컨트롤의 크기를 조정한다.
        _Splits();

      }
      else if(this->Left > (main_Form->Width - 80))
      {
        //처리해야 한다.
        this->Left = (main_Form->Width - 80);

        //연관된 모든 컨트롤의 크기를 조정한다.
        _Splits();

      }

  //}

  return;

}



