using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

/// 시스템 구조 Ver2012-07-20
///
/// 원래는 레지스트리에 있는 정보를 가지고 접근해야되지만 지금은 우선 프로그램안의 xml 파일에서 정보를 읽어와서 시스템을 구성한다
/// 주의할 점은 실행하는 프로그램 경로와 저장하고 열기하는 프로젝트의 경로를 따로 관리하게 되므로 아래를 참조바람
/// 
/// Program_Configuration.xml (옵션이므로 향후 제거될 수 있다)
/// => 맨처음 프로그램이 실행하는 경우 제일 먼저 기초데이터를 이파일로 불러들인다. 최근 사용한 프로젝트명, 데이타베이스 접속 정보 등이 여기 저장되어있다. 
/// => 위치는 실행 프로그램 exe 파일과 동일하다
/// 
/// 프로젝트 폴더
/// => 메뉴->시스템->환경옵션 메뉴에서 선택한 경로에서 프로젝트 관리하도록 한다. 
/// => 주의할 점! 프로젝트 폴더안에 DB 폴더 안에는 미리 데이타베이스를 복사해야 한다. 차후에는 데이타베이스를 직접 생성할수 있도록 구현해야된다 (현재는 데이타베이스 읽기만 가능하므로)
/// => 결국 반드시 프로그램 실행 전에 모든 프로젝트가 데이타베이스에 저장 완료되어 있다는 가정하에서 프로그램이 구동된다
///
/// 수신기 아이디
/// => 수신기 아이디는 1로서 각각 데이타베이스에 저장된다 (전제이다. 데이타베이스에 1이 아닌 다른 값이 들어가지는 않는다)
/// => UI에 표시될 수신기 아이디는 각각 숫자로 1씩 증가하여 관리된다
/// => 수신기 아이디에 따라 접근하는 데이타베이스 폴더는 달라지므로 폴더 패스로 수신기를 관리한다

namespace IControls_FireManager
{
    public partial class IControls_FireManager : Form
    {
        // 타이머 카운트 (종료없이 항상 타이머가 동작)
        public int timer_MainConfig_Cnt = 0;
        // 프로젝트 새로만들기 여부 대화 팝업창 
        public Form Popup_NewProjectInform = new Form();
        // XML 파일 및 데이타베이스 저장 여부 대화 팝업창
        public Form Popup_NotSaveXmlDBInform = new Form();
        // XML 및 DB 저장 직전 상태
        public XMLDB_BEFORE_STATUS Popup_NotSaveXmlDBInform_Status;
        // 프로젝트 저장 여부 대화 팝업창 
        public Form Popup_SaveProjectInform = new Form();
        // 수신기 전체 삭제 여부 대화 팝업창 
        public Form Popup_ReceiverAllDelInform = new Form();
        // 프로젝트 저장을 위한 페이지 저장을 위한 수신기 아이디 리스트 (처음시작시 수신기 아이디가 모두 저장되어 있다가 저장 완료마다 해당 수신기 정보가 삭제됩니다)
        public ArrayList List_PageSaved_By_ReceiverID = new ArrayList();
        // 프로젝트 저장시에 수신기별로 페이지 저장을 하기 위해 한번만 실행하도록 함
        public bool Project_Save_ReceiverOnceExecute = false;
        // 프로젝트 저장 중 팝업
        public Form ProjectSavingPopup = new Form();
        public Form ProjectSavinEtcgPopup = new Form();

        // 메인
        public IControls_FireManager()
        {
            // 디자이너 초기화
            InitializeComponent();

            // 데이타 초기화
            Initialize_Data();

            // 디버그뷰 프레임 초기화 
            Initialize_Frame_DebugView();

            // 트리뷰 프레임 초기화
            Initialize_Frame_TreeView();

            // 워크뷰 프레임 초기화
            Initialize_Frame_WorkView();

            // 개발자가 아니면 디버깅창이 필요없다
            this.uiPanel_DebugView.Closed = true;
            // 디버깅창이 없다면 창 사이즈도 고정되지 않도록 하고, 줄인다
            this.Size = new Size(1662, 858);//1608, 1028
        }

        // 디바이스 트리뷰 초기화
        public void Initialize_Frame_TreeView()
        {
            Frame_Tree Frame = new Frame_Tree();
            _Frame.Create(this.uiPanel_TreeViewContainer, Frame);
        }

        // 디바이스 워크뷰 초기화
        public void Initialize_Frame_WorkView()
        {
            Frame_Work Frame = new Frame_Work();
            _Frame.Create(this.uiPanel_WorkViewContainer, Frame);
        }

        // 디버그뷰 프레임 초기화
        public void Initialize_Frame_DebugView()
        {
            Frame_Debug Frame = new Frame_Debug();
            _Frame.Create(this.uiPanel_DebugViewContainer, Frame);
        }

        // 데이타 초기화
        public void Initialize_Data()
        {
            ///
            /// 폴더 생성 (강제로 폴더 생성 - 차후 삭제할수도있다. 사용자가 환경 옵션 지정시 폴더만 생성하는 역할만 한다)
            /// 

            _File.Create_Folder("C:\\", "IControls_FireManager");

            ///
            /// 설정 파일 로드
            ///

            if (_File.Read_ProgramConfiguration() == false)
            {
                _Popup.MessageBoxPopup(0, _Text.GetDamagedConfigFile, _Text.OK);
            }

            ///
            /// 프로젝트 생성 위치, 즉 프로젝트 경로가 없다면 기본값으로 대체함.
            ///

            if (_Data.Project_Path.Length == 0) _Data.Project_Path = _File.ProgramPath;

            ///
            /// 타이머 시작 (폼이름으로 타이머 이름을 생성함)
            ///

            _Timer_WindowBase.Create(null, 1000, timer_MainConfig_Tick, true);

            ///
            /// 상태바 표시
            ///

            Update_StatusBar();

            ///
            /// 이벤트
            /// 

            // 폼닫기 이벤트 핸들러 등록 (이벤트 핸들러 해제용)
            this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing);

            // 프로젝트 저장기능중 페이지 저장이 완료되었음을 알리는 이벤트 핸들러 등록
            _Event.Receiver_PageSaveComplete_SendMessage_Event += new _Event.Receiver_PageSaveComplete_SendMessage_Handler(_Event_Receiver_PageSaveComplete_SendMessage_Event);

            // 화면 최대화 명령 (TreeView Form -> Main Form) 이벤트 핸들러 등록
            _Event.Windows_MaxSize_SendMessage_Event += new _Event.Windows_MaxSize_SendMessage_Handler(_Event_Windows_MaxSize_SendMessage_Event);

            ///
            /// 스타일 
            /// 
            UI_Style_Initialize();
        }

        // 폼닫기
        public void CreateForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // XML 및 DB 저장되지 않은 수신기가 존재한다면
            if (_Data.LIST_XmlDBNotSave_Receiver.Count != 0 || _Data.ProJect_Save_Complete == false)
            {
                // 이벤트 해제
                e.Cancel = true;

                // XML 파일 및 데이타베이스 저장 여부
                Popup_NotSaveXmlDBInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.NotSaveProjectConfirm, 0);

                // 대화 팝업은 특별처리
                _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);

                // 프로그램 종료 직전
                Popup_NotSaveXmlDBInform_Status = XMLDB_BEFORE_STATUS.PROGRAM_END;
            }
            else
            {
                // 종료시 잔상이 남는 문제
                this.Hide();
            }
        }
        ///
        /// 스타일
        ///

        // 스타일 초기화 함수
        private void UI_Style_Initialize()
        {
            // 스타일 적용
            this.uiPanelManager.VisualStyle = _Data.Style_PanelVisualStyle;
            this.uiCommandManager.VisualStyle = _Data.Style_VisualStyle;
            this.MainBar.VisualStyle = _Data.Style_VisualStyle;
            this.IconBar_1.VisualStyle = _Data.Style_VisualStyle;
            this.TopRebar.VisualStyle = _Data.Style_VisualStyle;
            this.officeFormAdorner.Office2007ColorScheme = _Data.Style_Office2007ColorScheme;
        }

        // 스타일 변경 함수
        private void UI_Style_Change(
            Janus.Windows.UI.Dock.PanelVisualStyle PanelVisualStyle,
            Janus.Windows.UI.VisualStyle VisualStyle,
            Janus.Windows.Ribbon.Office2007ColorScheme Office2007ColorScheme)
        {
            // 스타일 변수 저장
            _Data.Style_PanelVisualStyle = PanelVisualStyle;
            _Data.Style_VisualStyle = VisualStyle;
            _Data.Style_Office2007ColorScheme = Office2007ColorScheme;

            // 스타일 적용
            UI_Style_Initialize();

            // 체크 상태 초기화 (메뉴에서 선택한 체크 모두 해제)
            UI_Style_CheckStatusClear();

            // 다른폼에 알림
            _Event.WindowStyleSet_SendMessage_Write();

            // 파일에 저장
            _File.Write_ProgramConfiguration();
        }

        // 스타일 변경 체크 상태 초기화
        private void UI_Style_CheckStatusClear()
        {
            this.Menu_Style_Office2007.IsChecked = false;
            this.Menu_Style_Office2003.IsChecked = false;
            this.Menu_Style_VS2005.IsChecked = false;
            this.Menu_Style_Standard.IsChecked = false;
        }

        ///
        /// 이벤트
        ///

        // 윈도우 최대화
        private void _Event_Windows_MaxSize_SendMessage_Event()
        {
            this.WindowState = FormWindowState.Maximized;
        }

        // 메인 메뉴바에서 클릭시
        private void MainBar_CommandClick(object sender, Janus.Windows.UI.CommandBars.CommandEventArgs e)
        {
            switch (e.Command.Key)
            {
                ///
                /// 메뉴 -> 시스템
                ///

                case "Menu_System_ConfigOption":
                    // 시스템 환경 옵션					
                    Form_System_Config System_Config = new Form_System_Config();
                    _Form.Create(System_Config, null);// this.uiCommandManager.Commands[e.Command.Key]);
                    break;
                case "Menu_System_End":
                    Program_End();
                    break;

                ///
                /// 메뉴 -> 프로젝트 
                ///

                case "Menu_Project_New":
                    Project_New();
                    break;
                case "Menu_Project_Open":
                    Project_Open();
                    break;
                case "Menu_Project_Del":
                    Project_Del();
                    break;
                case "Menu_Project_Save":
                    Project_Save();
                    break;

                ///
                /// 메뉴 -> 수신기 
                ///

                case "Menu_Receiver_Add":
                    // 프로젝트가 존재하는 경우에만
                    if (_Data.Project_Name != null)
                    {
                        Form_Receiver_Add Receiver_Add = new Form_Receiver_Add(_Data.CREATE_RECEIVER_ID());
                        _Form.Create(Receiver_Add, null);
                    }
                    else
                        _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotSelectProjectInform, 0);
                    break;
                case "Menu_Receiver_Del":
                    // 프로젝트가 존재하는 경우에만
                    if (_Data.Project_Name == null)
                    {
                        _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotSelectProjectInform, 0);
                    }
                    // 수신기가 존재하는 경우에만 
                    else if (_Data.LIST_RECEIVER_ID.Count == 0)
                    {
                        _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotReceiver, 0);
                    }
                    else
                    {
                        Popup_ReceiverAllDelInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.AllDelete_Continue, 0);

                        // 대화 팝업은 특별처리
                        _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_ReceiverAllDel_PopupClose_SendMessage_Event);
                    }
                    break;

                ///
                /// 메뉴 -> 보기
                ///

                case "Menu_View_Status":
                    this.StatusBar.Visible = !(this.StatusBar.Visible);
                    break;

                case "Menu_View_Debug":
                    this.uiPanel_DebugView.Closed = !(this.uiPanel_DebugView.Closed);
                    break;

                ///
                /// 메뉴 -> 도움말
                ///

                case "Menu_Help_Helper":
                    Form__Sample Temp_Sample = new Form__Sample();
                    _Form.Create(Temp_Sample, null);// this.uiCommandManager.Commands[e.Command.Key]);                    
                    break;
                case "Menu_Help_MAP":
                    break;

                ///
                /// 메뉴 -> 스타일 (현재 비활성화)
                ///

                case "Menu_Style_Office2007":
                    // 변경
                    UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Office2007, Janus.Windows.UI.VisualStyle.Office2007, Janus.Windows.Ribbon.Office2007ColorScheme.Blue);
                    // 체크                    
                    this.Menu_Style_Office2007.IsChecked = true;
                    break;
                case "Menu_Style_Office2003":
                    // 변경
                    UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Office2003, Janus.Windows.UI.VisualStyle.Office2003, Janus.Windows.Ribbon.Office2007ColorScheme.Blue);
                    // 체크
                    this.Menu_Style_Office2003.IsChecked = true;
                    break;
                case "Menu_Style_VS2005":
                    // 변경
                    UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.VS2005, Janus.Windows.UI.VisualStyle.VS2005, Janus.Windows.Ribbon.Office2007ColorScheme.Black);
                    // 체크
                    this.Menu_Style_VS2005.IsChecked = true;
                    break;
                case "Menu_Style_Standard":
                    // 변경
                    UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Standard, Janus.Windows.UI.VisualStyle.Standard, Janus.Windows.Ribbon.Office2007ColorScheme.Black);
                    // 체크                    
                    this.Menu_Style_Standard.IsChecked = true;
                    break;
            }
        }

        ///
        /// 아이콘바 스타일
        /// 
        private void IconBar_2_CommandClick(object sender, Janus.Windows.UI.CommandBars.CommandEventArgs e)
        {
            switch (e.Command.Key)
            {
                ///
                /// 메뉴 -> 스타일
                ///

                case "Icon_Office2007":
                    // 변경
                    UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Office2007, Janus.Windows.UI.VisualStyle.Office2007, Janus.Windows.Ribbon.Office2007ColorScheme.Blue);
                    // 체크                    
                    this.Menu_Style_Office2007.IsChecked = true;
                    break;
                case "Icon_Office2003":
                    // 변경
                    UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Office2003, Janus.Windows.UI.VisualStyle.Office2003, Janus.Windows.Ribbon.Office2007ColorScheme.Blue);
                    // 체크
                    this.Menu_Style_Office2003.IsChecked = true;
                    break;
                case "Icon_VS2005":
                    // 변경
                    UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.VS2005, Janus.Windows.UI.VisualStyle.VS2005, Janus.Windows.Ribbon.Office2007ColorScheme.Black);
                    // 체크
                    this.Menu_Style_VS2005.IsChecked = true;
                    break;
                case "Icon_Standard":
                    // 변경
                    UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Standard, Janus.Windows.UI.VisualStyle.Standard, Janus.Windows.Ribbon.Office2007ColorScheme.Black);
                    // 체크                    
                    this.Menu_Style_Standard.IsChecked = true;
                    break;
            }
        }

        ///
        /// 타이머
        ///

        // 초당 호출
        private void timer_MainConfig_Tick(object sender, EventArgs e)
        {
            // 반드시 타이머는 사용후 종료해야한다
            // 타이머를 종료하려면 아래의 주석코드를 제거한다
            // _Timer_WindowBase.Delete((string)((System.Windows.Forms.Timer)sender).Tag);

            // 타이머 카운트 갱신
            timer_MainConfig_Cnt++;

            // 타이머 카운트 초기화 (2초 갱신)
            if (timer_MainConfig_Cnt > 2)
            {
                // 초기화
                timer_MainConfig_Cnt = 0;

                ///
                /// 상태바 표시
                ///
                Update_StatusBar();

                //
                // cyim 2016.04.01 : 6자리 혹은 4자리로 맵아이디와 그룹아이디 지정할수 있도록함	
                // 
                this.Text = "IControls_FireManager Ver3.1.1.1" + "      현재 출력그룹 혹은 맵연동 아이디는 " + _Data.Project_MapGroupIDTypeNumber + " 자리로 셋팅되어 있습니다";
            }

            // 시간정보 갱신
            this.Status_Time.Text = _Text.Blank + _Text.UI_STATUSBAR_PROGRAM_TIME + _Text.Blank + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }

        // 상태바 갱신
        private void Update_StatusBar()
        {
            // 프로젝트 명
            this.Status_ProjectName.Text = _Text.Blank + _Text.UI_STATUSBAR_PROJECT_NAME + _Text.Blank + _Data.Project_Name;

            // 프로젝트 패스
            this.Status_ProjectPath.Text = _Text.Blank + _Text.UI_STATUSBAR_PROJECT_PATH + _Text.Blank + _Data.Project_Path;

            // 현재 데이타베이스 경로
            this.Status_DatabasePath.Text = _Text.Blank + _Text.UI_STATUSBAR_DATABASE_PATH + _Text.Blank + _Data.DB_FullPath;

            // 프로그램 버전
            this.Status_ProgramVersion.Text = _Text.Blank + _Text.UI_STATUSBAR_PROGRAM_VERSION + _Text.Blank + _Data.Program_Version;
        }

        // 프로그램 종료
        private void Program_End()
        {
            // XML 및 DB 저장되지 않은 수신기가 존재한다면
            if (_Data.LIST_XmlDBNotSave_Receiver.Count != 0 || _Data.ProJect_Save_Complete == false)
            {
                // XML 파일 및 데이타베이스 저장 여부
                Popup_NotSaveXmlDBInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.NotSaveProjectConfirm, 0);

                // 대화 팝업은 특별처리
                _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);

                // 프로그램 종료 직전
                Popup_NotSaveXmlDBInform_Status = XMLDB_BEFORE_STATUS.PROGRAM_END;
            }
            else
            {
                this.Close();
            }
        }

        ///
        /// 프로젝트 
        ///
        // 새로 만들기
        private void Project_New()
        {
            // 프로젝트 새로만들기 여부 
            Popup_NewProjectInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 250, 150, _Text.NewProjectInform, 0);

            // 대화 팝업은 특별처리
            _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_NewProjectInform_SendMessage_Event);
        }

        // 프로젝트 새로만들기 여부 경고창을 생성하고 난후에 확인 버튼을 누를때 발생하는 이벤트
        public void _Event_Popup_NewProjectInform_SendMessage_Event(object sender, object etc)
        {
            // 대화 팝업 주체
            Form popup = (Form)sender;
            if (Popup_NewProjectInform.Name == popup.Name && etc.ToString() == _Text.OK)
            {
                // XML 및 DB 저장되지 않은 수신기가 존재한다면
                if (_Data.LIST_XmlDBNotSave_Receiver.Count != 0 || _Data.ProJect_Save_Complete == false)
                {
                    // XML 파일 및 데이타베이스 저장 여부
                    Popup_NotSaveXmlDBInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.NotSaveProjectConfirm, 0);

                    // 대화 팝업은 특별처리
                    _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);

                    // 프로젝트 새로 만들기 직전
                    Popup_NotSaveXmlDBInform_Status = XMLDB_BEFORE_STATUS.PROJECT_NEW;
                }
                else
                {
                    // 워크뷰 및 트리뷰 에 알림
                    _Event.WorkView_Clear_SendMessage_Write();
                    _Event.TreeView_Clear_SendMessage_Write(null);

                    // 폼 생성
                    _Data.MenuActivedForm = new Form_Project_New();
                    _Form.Create(_Data.MenuActivedForm, null);
                }
            }
            // 대화 팝업은 특별처리
            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_Popup_NewProjectInform_SendMessage_Event);
        }

        // 열기
        private void Project_Open()
        {
            // XML 및 DB 저장되지 않은 수신기가 존재한다면
            if (_Data.LIST_XmlDBNotSave_Receiver.Count != 0 || _Data.ProJect_Save_Complete == false)
            {
                // XML 파일 및 데이타베이스 저장 여부
                Popup_NotSaveXmlDBInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.NotSaveProjectConfirm, 0);

                // 대화 팝업은 특별처리
                _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);

                // 프로젝트 열기 직전
                Popup_NotSaveXmlDBInform_Status = XMLDB_BEFORE_STATUS.PROJECT_OPEN;
            }
            else
            {
                // 열기 폼 생성
                _Data.MenuActivedForm = new Form_Project_Open();
                _Form.Create(_Data.MenuActivedForm, null);
            }
        }

        // 삭제
        private void Project_Del()
        {
            // 삭제 폼 생성
            _Data.MenuActivedForm = new Form_Project_Delete();
            _Form.Create(_Data.MenuActivedForm, null);
        }

        // 저장
        private void Project_Save()
        {
            if (_Data.LIST_XMLRECEIVER_ID.Count == 0 || _Data.HASH_RECEIVER.Count == 0)
            {
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.NotReceiver, 0);
            }
            else if (_Data.Check_Verify_EVENT_TYPE() == false)
            {
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 450, 150, _Text.NothingEventType, 0);
            }
            else
            {
                // 프로젝트 저장여부
                Popup_SaveProjectInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.SaveProject, 0);

                // 대화 팝업은 특별처리
                _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_SaveProjectInform_SendMessage_Event);
            }
        }

        // 프로젝트 저장 여부 확인 버튼을 누를때 발생하는 이벤트
        public void _Event_Popup_SaveProjectInform_SendMessage_Event(object sender, object etc)
        {
            // 대화 팝업 주체
            Form popup = (Form)sender;
            if (Popup_SaveProjectInform.Name == popup.Name && etc.ToString() == _Text.OK)
            {
                // 프로젝트 저장 시작
                Project_Save_Start();
            }
            // 대화 팝업은 특별처리
            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_Popup_SaveProjectInform_SendMessage_Event);
        }

        // 폼닫기, 프로젝트 새로열기, 프로젝트 새로만들기 -> 프로젝트 저장 여부 확인 버튼을 누를때 발생하는 이벤트
        public void _Event_Popup_PageSaveXmlDB_SendMessage_Event(object sender, object etc)
        {
            // 대화 팝업 주체
            Form popup = (Form)sender;
            if (Popup_NotSaveXmlDBInform.Name == popup.Name && etc.ToString() == _Text.OK)
            {
                // 프로젝트를 저장하자
                Project_Save_Start();
            }
            else
            {
                // 팝업창 직전 상태
                switch (Popup_NotSaveXmlDBInform_Status)
                {
                    case XMLDB_BEFORE_STATUS.PROGRAM_END:
                        // 저장되지 않았던 리스트 초기화
                        _Data.LIST_XmlDBNotSave_Receiver.Clear();
                        // 프로젝트 저장여부 완료로 변경
                        _Data.ProJect_Save_Complete = true;
                        // 프로그램 종료
                        this.Close();
                        break;
                    case XMLDB_BEFORE_STATUS.PROJECT_NEW:
                        // 워크뷰 및 트리뷰 에 알림
                        _Event.WorkView_Clear_SendMessage_Write();
                        _Event.TreeView_Clear_SendMessage_Write(null);
                        // 폼 생성
                        _Data.MenuActivedForm = new Form_Project_New();
                        _Form.Create(_Data.MenuActivedForm, null);
                        break;
                    case XMLDB_BEFORE_STATUS.PROJECT_OPEN:
                        // 열기 폼 생성
                        _Data.MenuActivedForm = new Form_Project_Open();
                        _Form.Create(_Data.MenuActivedForm, null);
                        break;
                }
            }
            // 대화 팝업은 특별처리
            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);
        }

        // 수신기 전부 삭제 여부 팝업창 이벤트
        public void _Event_ReceiverAllDel_PopupClose_SendMessage_Event(object sender, object etc)
        {
            // 대화 팝업 주체
            Form popup = (Form)sender;
            if (Popup_ReceiverAllDelInform.Name == popup.Name && etc.ToString() == _Text.OK)
            {
                // 전체 삭제 이벤트 발생
                _Event.Receiver_Clear_SendMessage_Write();
            }

            // 대화 팝업은 특별처리
            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_ReceiverAllDel_PopupClose_SendMessage_Event);
        }

        // 프로젝트 저장을 시작한다
        public void Project_Save_Start()
        {
            // 수신기가 없다면 저장 못함
            if (_Data.LIST_XMLRECEIVER_ID.Count == 0)
            {
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.NotReceiver, 0);
                return;
            }

            // 프로젝트 저장 중
            ProjectSavingPopup = _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.SaveProjectInform, 0);

            // 저장을 위한 리스트 생성
            List_PageSaved_By_ReceiverID.Clear();
            List_PageSaved_By_ReceiverID = (ArrayList)_Data.LIST_XMLRECEIVER_ID.Clone();

            // 화면 전환 (프로젝트 메인 페이지의 경우 특별히 매개변수에 SystenTeee 정보는 필요없다)
            _Event.WorkViewPageName_SendMessage_Write(null, Object_Type.PROJECT, null, null);

            // 프로젝트 저장
            Project_Save_ReceiverOnceExecute = false;

            // 대기 타이머 시작            
            _Timer_WindowBase.Delete("Project_Save_Start");
            _Timer_WindowBase.Create("Project_Save_Start", 1000, timer_Project_Save_Start_Tick, true);
        }

        // 수신기별로 페이지 저장 완료 알림
        public void _Event_Receiver_PageSaveComplete_SendMessage_Event(string RECEIVER_ID)
        {
            // 저장완료했으므로 삭제
            List_PageSaved_By_ReceiverID.Remove(RECEIVER_ID);
            // 타이머 재동작
            Project_Save_ReceiverOnceExecute = false;
        }

        // 프로젝트 저장을 타이머로 처리함
        private void timer_Project_Save_Start_Tick(object sender, EventArgs e)
        {
            try
            {
                if (Project_Save_ReceiverOnceExecute == false)
                {
                    Project_Save_ReceiverOnceExecute = true;

                    // 마지막 수신기 처리
                    if (List_PageSaved_By_ReceiverID.Count == 0)
                    {
                        // 팝업 종료(프로젝트 저장완료했습니다 -> 종료)
                        ProjectSavingPopup.Close();

                        // 팝업 시작(맵파일 저장중입니다 -> 시작)
                        ProjectSavinEtcgPopup = _Popup.Create(Popup_Type.ConfirmNoBtn, Popup_Style.Normal, _Text.OK, 450, 150, _Text.SaveProjectEtcInform, 0);

                        // 파일 복사 및 최종 마무리
                        Project_Save_EndRoutine();

                        // 팝업 시작(맵파일 저장중입니다 -> 종료)
                        ProjectSavinEtcgPopup.Close();

                        // 타이머종료
                        _Timer_WindowBase.Delete("Project_Save_Start");
                    }
                    else
                    {
                        // 배열중 처음 수신기 아이디
                        string Receiver_ID = (string)List_PageSaved_By_ReceiverID[0];

                        // 페이지 저장
                        _Event.Page_Save_SendMessage_Write(Receiver_ID);
                    }
                }
            }
            catch (Exception ex)
            {
                // LOG                
                _Event.DebugView_SendMessage_Write(ex.ToString());
            }
        }

        // 프로젝트 저장 최종 루틴
        private void Project_Save_EndRoutine()
        {
            try
            {
                ArrayList TempRemoveConfigTable = (ArrayList)_Data.LIST_XMLRECEIVER_ID.Clone();

                // 현재 몇개의 수신기가 있는지 알아내자
                foreach (string Receiver_Id in _Data.LIST_XMLRECEIVER_ID)
                {
                    // 프로세스 삭제
                    System.Diagnostics.Process[] mProcess = System.Diagnostics.Process.GetProcessesByName("fbserver");
                    foreach (System.Diagnostics.Process p in mProcess)
                        p.Kill();
                    System.Threading.Thread.Sleep(1000);

                    // Temp 폴더의 DB 를 각 수신기에 복사한다
                    string TempDB_Path = _Data.DataBaseFilePath_Get(null);
                    string ReceiverDB_Path = _Data.DataBaseFilePath_Get(Receiver_Id);
                    System.IO.File.Copy(TempDB_Path, ReceiverDB_Path, true);

                    // 파일복사는 시간이 걸릴것이다
                    System.Threading.Thread.Sleep(1000);

                    // 경로 재지정
                    _Data.DataBaseFilePath_Set(Receiver_Id);

                    // 각 수신기의 DB 의 TB_CONFIG 를 조절한다 (상관없는 디비는 모두 지워버린다)
                    foreach (string Remove_Id in TempRemoveConfigTable)
                        if (Remove_Id != Receiver_Id)
                            _Db.Execute(_Sql.Delete_Table("TB_CONFIG", Remove_Id));

                    // 맵프로세스 자동생성
                    Project_Save_MapProcess(Receiver_Id);
                }

                // 경로 재지정 (temp로 복귀)
                _Data.DataBaseFilePath_Set(null);

                // cyim 2016.12.15 : 프로젝트 강제 쿼리	(수신반용 테이블)
                // 수신반에 연동할 모바일앱용 테이블을 저장한다
                _Db.Execute("delete from TB_RECEIVER_ERROR_COUNT");
                foreach (string ID in _Data.LIST_RECEIVER_ID)
                    _Db.Execute(string.Format("insert into TB_RECEIVER_ERROR_COUNT (IP_ADDRESS,INFO1,INFO2,INFO3,INFO4,INFO5,INFO6,UPDATE_TIME) values ('{0}',0,0,0,0,0,0,current_timestamp)",
                        ((_RECEIVER)_Data.HASH_RECEIVER[ID]).IP));

                // 프로젝트 완료
                _Data.ProJect_Save_Complete = true;
            }
            catch (Exception ex)
            {
                // LOG                
                _Event.DebugView_SendMessage_Write(ex.ToString());
            }
        }

        // 프로젝트 저장시에 맵프로세스 파일을 자동 생성해준다
        private void Project_Save_MapProcess(string Receiver_Id)
        {
            // 맵연동 파일 생성용 전용 쿼리
            DataRowCollection DB_TABLE_MAPPROCESS = _Db.ExecuteRead_SqlDataAdapter(_Sql.MapProcessFile_Create(Receiver_Id));

            if (DB_TABLE_MAPPROCESS != null && DB_TABLE_MAPPROCESS.Count != 0)
            {
                //    맵연동설정파일 포맷
                //  - 한개의 레코드 길이 : 40 Byte (개행문자 포함)
                //  - 구분자 는 |
                //  - 마지막에 개행문자 (CR/LF)
                //  - 순서 : A.MAP_NO,A.MAP_TYPE (ASC)

                //    1. RECEIVER ID  : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
                //    2. MAP NO.      : 7 Bytes (7자리가 아닐 경우 왼쪽 0으로 채움) // cyim 2015.10.30 : 포맷변경 포함 5->7, 즉 2번째 Map no 가 7자리로 변경
                //    3. MAP TYPE     : 1 Bytes (NULL일 경우 공백으로 채움)
                //    4. PROCESS TYPE : 1 Bytes (NULL일 경우 공백으로 채움)
                //    5. COMM. ID     : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
                //    6. BOARD ID     : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
                //    7. LOOP NO.     : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
                //    8. REPEATER ID  : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
                //    9. DEVICE ID    : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
                //    10. IN/OUT TYPE : 1 Bytes (NULL일 경우 공백으로 채움)
                //    11. USE FLAG    : 1 Bytes (NULL일 경우 공백으로 채움)
                //    12. CR/LF       : 2 Bytes

                //        ex) C 소스코드
                //       // MAP DATA 구성
                //       sprintf (szMapData,"%03d|%07d|%c|%c|%03d|%03d|%03d|%03d|%03d|%c|%c|\r\n",  // cyim 2015.10.30 : 포맷변경 포함 5->7, 즉 2번째 Map no 가 7자리로 변경
                //              nReceiverID,nMapNo,
                //              (szMapType[0]!='\0'?szMapType[0]:' '),
                //              (szProcessType[0]!='\0'?szProcessType[0]:' '),
                //              nCommID,nBoardID,nLoopNo,nRepeaterID,nDeviceID,
                //              (szInoutType[0]!='\0'?szInoutType[0]:' '),
                //              (szUseFlag[0]!='\0'?szUseFlag[0]:' ')); 

                //       ex) 001|0000001|I|D|001|001|000|002|001|I|Y|  // cyim 2015.10.30 : 포맷변경 포함 5->7, 즉 2번째 Map no 가 7자리로 변경

                StringBuilder Contents = new StringBuilder();

                foreach (DataRow dr in DB_TABLE_MAPPROCESS)
                {
                    if (dr[0].ToString().Length != 0 && dr[1].ToString().Length != 0 && dr[2].ToString().Length != 0 && dr[3].ToString().Length != 0
                        && dr[4].ToString().Length != 0 && dr[5].ToString().Length != 0 && dr[6].ToString().Length != 0 && dr[7].ToString().Length != 0
                        && dr[8].ToString().Length != 0 && dr[9].ToString().Length != 0 && dr[10].ToString().Length != 0)
                    {
                        // 데이타 추출 및 포맷 적용
                        string RECEIVER_ID = Int32.Parse(dr["RECEIVER_ID"].ToString()).ToString("D3");
                        // cyim 2016.04.01 : 6자리 혹은 4자리로 맵아이디와 그룹아이디 지정할수 있도록함	
                        string MAP_NO = "";
                        if (_Data.Project_MapGroupIDTypeNumber == "6")
                            MAP_NO = Int32.Parse(dr["MAP_NO"].ToString()).ToString("D7"); // cyim 2015.10.30 : 포맷변경 포함 5->7, 즉 2번째 Map no 가 7자리로 변경
                        else
                            MAP_NO = Int32.Parse(dr["MAP_NO"].ToString()).ToString("D5");
                        string MAP_TYPE = dr["MAP_TYPE"].ToString();
                        string PROCESS_TYPE = dr["PROCESS_TYPE"].ToString();
                        string COMM_ID = Int32.Parse(dr["COMM_ID"].ToString()).ToString("D3");
                        string BOARD_ID = Int32.Parse(dr["BOARD_ID"].ToString()).ToString("D3");
                        string LOOP_NO = Int32.Parse(dr["LOOP_NO"].ToString()).ToString("D3");
                        string REPEATER_ID = Int32.Parse(dr["REPEATER_ID"].ToString()).ToString("D3");
                        string DEVICE_ID = Int32.Parse(dr["DEVICE_ID"].ToString()).ToString("D3");
                        string INOUT_TYPE = dr["INOUT_TYPE"].ToString();
                        string USE_FLAG = dr["USE_FLAG"].ToString();

                        // 구분자 포함하여 레코드 단위 생성
                        Contents.Append(
                            RECEIVER_ID + "|" +
                            MAP_NO + "|" +
                            MAP_TYPE + "|" +
                            PROCESS_TYPE + "|" +
                            COMM_ID + "|" +
                            BOARD_ID + "|" +
                            LOOP_NO + "|" +
                            REPEATER_ID + "|" +
                            DEVICE_ID + "|" +
                            INOUT_TYPE + "|" +
                            USE_FLAG + "|"
                            // + _Text.CarrageReturn // cyim 2016.03.29 : 통신데몬과 마차가지로 개행문자 삭제
                            );
                    }
                }

                ///
                /// 폴더생성 및 기본경로 지정
                ///

                // 수신기 폴더명
                string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + Receiver_Id;

                // 경로 지정
                string MapProcessFile_ProjectPath = _Data.Project_Path + "\\" + _Data.Project_Name + "\\" + ReiceiverFolderName;

                //
                // 파일생성
                //
                _Cfg.Create_Cfg(Contents.ToString(), MapProcessFile_ProjectPath + "\\" + _Text.DEFALUT_MAPPROCESS_FILENAME);
            }
        }
    }
}