

#include "함수묶음.h"

#include "main.h"
#include "GUI.h"
#include "일반함수.h"

#include "GUI\GUI_모양만들기.h"

//[2011.11.26.토][추가!!!]
#include "제작정보.h"


void Ide_모양만들기(void)
{
  //[2011.09.23.금][생성!!!]{-------
  //[통합개발환경] 의 전체 모양을 만든다.
  //}------------------------------

  //[VAR]
  //{
      char  문자열[512];

      int   i;

  //}

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  //[중요!!!][2012.08.21.화]{***************************************
  //사용자가 [재기동] 을 반복하여 누르지 못하게 아예 생성 전에 바로 감춘다.
  //GUI 를 완성하는데 시간이 많이 걸리기 때문에 반복하여 누를 확률이 높다.
  //GUI 가 완성전 다시 [재기동] 시키는 경우는 문제가 발생할수 있으므로 먼저 처리.
  _Ide_크기_최소_();
  //}**************************************************************

  //[GUI 생성]
  //{
      //[GVmos]
      //{
          //[!]{------------------------------------------
          //오직 한개만 생성된다(API 내부적으로 오직 한개만 생성됨).
          //}---------------------------------------------

          //처음에는 보이지 않고 다 완성한 다음에 보인다.--------------------------------------v
          _GVmos_생성_(gui->GVmos, GID_GVmos, 10, 10, d_환경_GVmos_폭, d_환경_GVmos_높이, false);

          //[제목줄 문자열]
          //{
              //제목줄 문자열 합성.
              i = _Str_할당_(문자열, "::: AVR-ISP 영혼 주입기(");
              i = _Str_더하기_(&(문자열[i]), d_제작날짜);
              i = _Str_더하기_(&(문자열[i]), ") :::");

              _GVmos_제목줄문자열_(gui->GVmos, 문자열, d_쓰기);

          //}

          //[크기고정]
          //{
              //[2012.08.21.화][추가!!!]{---------------------------------
              //크기조정이 안되도록 고정.
              //[창버튼:최대화] 를 [무효] 로 설정하면 [전체 크기조정] 도 무효화 된다.
              //더불어, [제목줄 이중선택] 으로 인한 [최대화] 도 무효화 된다.
              //}--------------------------------------------------------

              _GVmos_창최대화버튼유효_(gui->GVmos, false, d_쓰기);

          //}

          //[이벤트]
          //{
              _GVmos_이벤트_XClose_(gui->GVmos, true, d_쓰기);
              _GVmos_이벤트_Resize_(gui->GVmos, true, d_쓰기);

          //}

          //[위치]
          //{
              //[!]{--------------------------
              //화면 중간에 나오도록 위치를 수정한다.
              //}-----------------------------

              _GVmos_X_(gui->GVmos, _Sys_화면폭_()/2 - _GVmos_폭_(gui->GVmos, 0, d_읽기)/2, d_쓰기);
              _GVmos_Y_(gui->GVmos, _Sys_화면높이_()/2 - _GVmos_높이_(gui->GVmos, 0, d_읽기)/2, d_쓰기);

          //}

      //}

      //[공용 알림창]
      //{
          _GX_MsgBox_생성자얻기_(gui->공용알림창);

          //_GMsgBox_그림색_(_공용알림창, clBlack, 쓰기);

      //}

      //[공용 풍선도움말]
      //{
          //[!]{-----------------------------------------------
          //각 [그림부품] 에서 사용하는 [공용 풍선도움말] 을 생성/설정한다.
          //}--------------------------------------------------

          _GX_BalloonBox_생성자얻기_(gui->공용풍선도움말);

          _GBalloonBox_문자색_(gui->공용풍선도움말, clWhite, d_쓰기);
          _GBalloonBox_배경색_(gui->공용풍선도움말, clGray, d_쓰기);
          _GBalloonBox_외곽선색_(gui->공용풍선도움말, clBlack, d_쓰기);

          _GBalloonBox_투명도_(gui->공용풍선도움말, 225, d_쓰기);
          _GBalloonBox_투명_(gui->공용풍선도움말, false, d_쓰기);

      //}

      //[내부 구성]
      //{
          Ide_모양만들기_목록줄();

          Ide_모양만들기_버튼줄();

          Ide_모양만들기_Flash문서();

          Ide_모양만들기_EEprom문서();

          Ide_모양만들기_설정비트();

          Ide_모양만들기_설정보안();

          Ide_모양만들기_설정확장();

          Ide_모양만들기_설정상위();

          Ide_모양만들기_설정하위();

          Ide_모양만들기_명세문서();

          //[2011.11.03.목][추가!!!]
          Ide_모양만들기_보기창();

          //[2011.11.12.토][추가!!!]
          Ide_모양만들기_맷돌에가상기계설치();

          //[2011.11.21.월][추가!!!]
          Ide_모양만들기_ISP활성화();

      //}

      //[후처리]
      //{
          //[2011.09.25.일][추가!!!]{----------------------------------------
          //<_List_AVR목록> 는 [목록줄] 의 [하위목록] 역활을 하므로 가장 위에 올려준다.
          //}---------------------------------------------------------------

          _GX_가장앞으로_(gui->List_AVR목록);

      //}

      //[가상 기동 화면 보이기]
      //{
          //내부 그림부품을 전부 완성하였으므로 보여준다.
          _GVmos_보이기_(gui->GVmos, true, d_쓰기);

          //[2012.08.21.화][추가!!!]{********************************
          //금일 <_Ide_크기_최소_()> 를 GUI 전에 먼저 처리했더니 완성후 보일때
          //다른 창의 뒤에 나오는 것을 발견하였다.
          //마지막으로 [항상위로] 처리로 가장 앞에 보이도록 처리.
          _GX_항상위로_(gui->GVmos, true);
          //한번 설정후 다시 원상복귀시키지 않으면 [열기대화상자] 등이 가려진다.
          _GX_항상위로_(gui->GVmos, false);
          //}*******************************************************

      //}

  //}

  //[초기화]
  //{
      //[2011.10.21.금][추가!!!]{------------------------------------
      //현재 선택된 AVR 의 [명세문서] 를 읽어들여 [전역:AVR설정정보] 에 정리하고
      //GUI 에 반영해 준다.
      //}-----------------------------------------------------------

      List_AVR목록_선택항목처리();

  //}

  //[IDE 감추기]
  //{
      //[!]{---------------------------------------------------------
      //[가상 기동환경] 만 보이도록 [맷돌-개발환경] 을 [작업표시줄] 로 이동 시킨다.
      //[가상 기동환경] 이 종료될때 다시 원래 [위치/크기] 로 북구시킨다.
      //}------------------------------------------------------------

      //[2012.08.21.화][주석처리!!!]{---------------------
      //GUI 만들기 전에 먼저 감추는 것으로 수정하였으므로 주석처리.
      //_Ide_크기_최소_();
      //}-----------------------------------------------

  //}

}

void GUI_이벤트(unsigned long  p알림문64)
{
  //[2011.09.23.금][생성!!!]{-------------------------------
  //<알림문:64비트> 전달 받아 해당 [그림부품] 의 해당 이벤트 처리.
  //[알림문] 내용에 따라 포함되는 정보가 다 다르며, 식별은 사용자가 직접
  //지정한 [식별자] 로 간단하게 구분.
  //}------------------------------------------------------

  //[VAR]
  //{
      unsigned short  식별자;
      unsigned char   알림문;
      unsigned char   lmr구분;
      short           정보x;
      short           정보y;
      int             정보int;

      char            문자열[256];

  //}

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  //[알림문64 구조]{-------------------------
  //
  //비트     48      40     32    16   0
  //{ [ 식별자 ][ 알림문 ][     ][    :   ] }
  //
  //}--------------------------------------

  //[알림문64 분해]
  //{
      //[!]{----------------------------------------------
      //[알림문64] 에서 필요한 정보를 분해/추출한다.
      //세부 정보는 [알림문] 에 따라 다를수 있으므로 기본 정보만 추출.
      //}-------------------------------------------------

      식별자 = (p알림문64 >> 48) & 0xffff;
      알림문 = (p알림문64 >> 40) & 0xff;

      //처리 시간 단축을 위하여 아예 여러 경우에 따른 정보를 추출해 놓는다.
      lmr구분 = (p알림문64 >> 32) & 0xff;
      정보x   = (p알림문64 >> 16) & 0xffff;
      정보y   = (p알림문64 >>  0) & 0xffff;
      정보int = (p알림문64 >>  0) & 0xffffffff;

  //}

  switch(식별자)
  {
    case GID_GVmos :
    {
      switch(알림문)
      {
        case d_GuiMsg_XClose :
        {
          //{ [ 식별자 ][ 알림문 ] }

          GVmos_이벤트_XClose();

        } break;

        case d_GuiMsg_Resize :
        {
          //{ [ 식별자 ][ 알림문 ] [ 폭 ] [ 높이 ] }

          //[!]{-------------------------------------------------------
          //[가상환경] 의 크기를 일정한 크기로 유지한다.
          //단, 최대화 시에는 적용하지 않는다.
          //
          //[주의!!!]{--------------------------------------------------
          //[화면높이] 는 아래 [작업표시줄] 이 있어 최대화시 크기과 일치하지 않으므로
          //[화면폭] 만 간단하게 비교한다.
          //}----------------------------------------------------------

          if(정보x != _Sys_화면폭_())
          {
            _GVmos_폭_(gui->GVmos, d_환경_GVmos_폭, d_쓰기);
            _GVmos_높이_(gui->GVmos, d_환경_GVmos_높이, d_쓰기);

          }

        } break;

      }

    } break;

    //[참고!!!]{------------------------------------------------
    //d_GuiMsg_MClick : { [ 식별자 ][ 알림문 ][ LMR ][ X ][ Y ] }
    //}--------------------------------------------------------

    //[목록줄]
    //{
        case GID_Btn_통신포트번호 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_통신포트번호_이벤트_MClick(); }

        } break;

        case GID_Btn_통신포트열기닫기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_통신포트열기닫기_이벤트_MClick(); }

        } break;

        case GID_Btn_AVR목록 :
        {
          //{ [ 식별자 ][ 알림문 ][ LMR ][ X ][ Y ] }

          if(알림문 == d_GuiMsg_MClick) { Btn_AVR목록_이벤트_MClick(lmr구분); }

        } break;

        //[2011.09.26.월][추가!!!]
        case GID_List_AVR목록 :
        {
          //{ [ 식별자 ][ 알림문 ][     ][ index  ] }
          if(알림문 == d_GuiMsg_Select) { List_AVR목록_이벤트_Select(정보int); }

        } break;

        case GID_Chk_풍선도움말 :
        {
          if(알림문 == d_GuiMsg_MClick) { Chk_풍선도움말_이벤트_MClick(); }

        } break;

        //[2011.11.09.수][추가!!!]
        case GID_Btn_회로도 :
        {
          //{ [ 식별자 ][ 알림문 ][ LMR ][ X ][ Y ] }

          if(알림문 == d_GuiMsg_MClick) { Btn_회로도_이벤트_MClick(); }

        } break;

    //}

    //[버튼줄]
    //{
        case GID_Btn_지우기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_지우기_이벤트_MClick(true); }

        } break;

        case GID_Btn_Flash_쓰기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_Flash_쓰기_이벤트_MClick(true); }

        } break;

        case GID_Btn_Flash_읽기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_Flash_읽기_이벤트_MClick(); }

        } break;

        case GID_Btn_Flash_확인 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_Flash_확인_이벤트_MClick(true); }

        } break;

        case GID_Btn_EEprom_쓰기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_EEprom_쓰기_이벤트_MClick(true); }

        } break;

        case GID_Btn_EEprom_읽기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_EEprom_읽기_이벤트_MClick(); }

        } break;

        case GID_Btn_EEprom_확인 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_EEprom_확인_이벤트_MClick(true); }

        } break;

        case GID_Btn_AVR설정_쓰기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_AVR설정_쓰기_이벤트_MClick(true); }

        } break;

        case GID_Btn_AVR설정_읽기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_AVR설정_읽기_이벤트_MClick(); }

        } break;

        case GID_Btn_자동진행 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_자동진행_이벤트_MClick(); }

        } break;

        case GID_Btn_실행 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_실행_이벤트_MClick(); }

        } break;

    //}

    //[Flash 문서]
    //{
        case GID_Btn_Flash문서_열기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_Flash문서_열기_이벤트_MClick(); }

        } break;

        case GID_Btn_Flash문서_닫기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_Flash문서_닫기_이벤트_MClick(); }

        } break;

        //[2011.11.03.목][추가!!!]
        case GID_Btn_Flash문서_보기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_Flash문서_보기_이벤트_MClick(); }

        } break;

    //}

    //[EEprom 문서]
    //{
        case GID_Btn_EEprom문서_열기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_EEprom문서_열기_이벤트_MClick(); }

        } break;

        case GID_Btn_EEprom문서_닫기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_EEprom문서_닫기_이벤트_MClick(); }

        } break;

        case GID_Btn_EEprom문서_보기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_EEprom문서_보기_이벤트_MClick(); }

        } break;

    //}

    //[AVR 설정]
    //{
        case GID_Btn_설정보안_쓰기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_설정보안_쓰기_이벤트_MClick(); }

        } break;

        case GID_Btn_설정보안_읽기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_설정보안_읽기_이벤트_MClick(); }

        } break;

        case GID_Btn_설정확장_쓰기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_설정확장_쓰기_이벤트_MClick(); }

        } break;

        case GID_Btn_설정확장_읽기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_설정확장_읽기_이벤트_MClick(); }

        } break;

        case GID_Btn_설정상위_쓰기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_설정상위_쓰기_이벤트_MClick(); }

        } break;

        case GID_Btn_설정상위_읽기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_설정상위_읽기_이벤트_MClick(); }

        } break;

        case GID_Btn_설정하위_쓰기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_설정하위_쓰기_이벤트_MClick(); }

        } break;

        case GID_Btn_설정하위_읽기 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_설정하위_읽기_이벤트_MClick(); }

        } break;

    //}

    //[명세문서]
    //{
        case GID_Btn_명세문서값으로초기화 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_명세문서값으로초기화_이벤트_MClick(); }

        } break;

        case GID_Btn_명세문서안에설정저장 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_명세문서안에설정저장_이벤트_MClick(); }

        } break;

    //}

    //[맷돌에가상기계설치]
    //{
        //[2011.11.12.토][추가!!!]
        case GID_Btn_맷돌에가상기계설치 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_맷돌에가상기계설치_이벤트_MClick(); }

        } break;

    //}

    //[ISP 활성화]
    //{
        //[2011.11.21.월][추가!!!]
        case GID_Chk_ISP활성화 :
        {
          if(알림문 == d_GuiMsg_MClick) { Chk_ISP활성화_이벤트_MClick(); }

        } break;

        case GID_Btn_ISP활성화_회로도 :
        {
          if(알림문 == d_GuiMsg_MClick) { Btn_ISP활성화_회로도_이벤트_MClick(); }

        } break;

    //}

    //[보기창]
    //{
        //[2011.11.03.목][추가!!!]
        case GID_Form_보기창 :
        {
          if(알림문 == d_GuiMsg_Resize)
          {
            //{ [ 식별자 ][ 알림문 ] [ 폭 ] [ 높이 ] }

            //[!]{-------------------------------------------------------
            //[가상환경] 의 크기를 일정한 크기로 유지한다.
            //단, 최대화 시에는 적용하지 않는다.
            //
            //[주의!!!]{--------------------------------------------------
            //[화면높이] 는 아래 [작업표시줄] 이 있어 최대화시 크기과 일치하지 않으므로
            //[화면폭] 만 간단하게 비교한다.
            //
            //[중요!!!]---------------------------------------------------
            //특정 높이 이하로 줄어줄지 않도록 한다.
            //<높이:0> 이 되어 화면에서 사라지는 경우가 발생하면 안된다.
            //}----------------------------------------------------------

            //[2011.11.04.금][수정!!!]
            //<정보x:폭>, <정보y:높이> 를 전달.
            Form_보기창_이벤트_Resize(정보x, 정보y);

          }

        } break;

    //}

  }

}

void GVmos_이벤트_XClose(void)
{
  //[2011.09.23.금][생성!!!]{-----
  //[가상기동화면] 의 종료시 처리 수행.
  //}----------------------------

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  //[내부 그림부품 삭제]
  //{
      //[2011.11.22.화][추가!!!]{--------------------------------------
      //이론적으로는 [삭제] 가 되야 맞는데, 실제는 [동적삭제] 가 안되서 계속 쌓인다.
      //현재는 원인을 알수 없기 때문에 일단 그대로 둔다.
      //
      //[2012.04.30.월][중요설명!!!]------------------------------------
      //금일 까지 각 [그림부품]의 [소멸자] 부분을 완벽하게 수정하여 확실하게 [삭제]
      //동작으로 [메모리:해제] 가 됨을 확인하였다.
      //실행후 확실하게 원상 복구된다.
      //
      //[주의!!!]------------------------------------------------------
      //[삭제] 시에는 가급적 [생성] 된 역순으로 삭제하는 것이 확실하고 안전하다.
      //[맷돌C] 에서는 전혀 차이가 없으나 BCB 에서는 큰 차이가 있다.
      //기본적으로 [역순 삭제] 로 기술하는 것으로 한다.
      //}-------------------------------------------------------------

      Ide_모양삭제_ISP활성화();

      Ide_모양삭제_맷돌에가상기계설치();

      Ide_모양삭제_보기창();

      Ide_모양삭제_명세문서();

      Ide_모양삭제_설정하위();

      Ide_모양삭제_설정상위();

      Ide_모양삭제_설정확장();

      Ide_모양삭제_설정보안();

      Ide_모양삭제_설정비트();

      Ide_모양삭제_EEprom문서();

      Ide_모양삭제_Flash문서();

      Ide_모양삭제_버튼줄();

      Ide_모양삭제_목록줄();

  //}

  //[통신포트 닫기]
  //{
      if(_Ide_통신포트_닫기_() != true)
      {
        _GVmos_유효_(gui->GVmos, false, d_쓰기);
        //{
            _GMsgBox_기본_(gui->공용알림창, d_오류, "통신포트를 닫을수 없습니다.");

        //}
        _GVmos_유효_(gui->GVmos, true, d_쓰기);

      }

  //}

  //[개발환경 크기 복구]
  //{
      //[개발환경] 을 원래 [크기/위치] 로 복구 시킨다.
      _Ide_크기_기본_();

  //}

  //[VMOS 정지]
  //{
      //[!]{----------------------------------------------------------
      //<GVmos> 가 주가되는 경우 <GVmos> 가 종료하는 경우는 <VMOS> 의 구동이
      //더이상 필요 없으므로 CPU 점유율을 낮추어 주기 위하여 <VMOS> 를 정지시킨다.
      //}-------------------------------------------------------------

      _Ide_Vmos_정지_();

  //}

}

void Ide_알림(int    p기호,
             char  *p문자열)
{
  //[2011.09.25.일][생성!!!]{--
  //표기를 간단하게 만들기 위한것.
  //}-------------------------

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  _GVmos_유효_(gui->GVmos, false, d_쓰기);
  //{
       _GMsgBox_기본_(gui->공용알림창, p기호, p문자열);

  //}
  _GVmos_유효_(gui->GVmos, true, d_쓰기);

}


















