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" + " 현재 출력그룹 혹은 맵연동 아이디는 " + _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); } } } }