using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Collections; namespace IControls_FireManager { public partial class Form_Project_Open : Form { // 수신기 정보 복사본 public ArrayList LoadReceiverID = new ArrayList(); // 정보를 읽는 도중에 한번만 읽도록 함 public bool LoadReceiverID_OnceExecute = false; // 프로젝트 읽기 중 팝업 Form ProjectLoadingPopup = new Form(); // 프로젝트 팝업창 잔상 문제로 인한 타이머 추가 public int Project_Open_Timer_Cnt = 0; // 수신기 추가시에 약간의 지연 시간이 필요하다 public int Receiver_Add_Timer_Cnt = 0; // 생성자 public Form_Project_Open() { InitializeComponent(); /// /// 이벤트 /// // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용) this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing); // 윈도우 스타일 변경 이벤트 핸들러 등록 _Event.WindowStyleSet_SendMessage_Event += new _Event.WindowStyleSet_SendMessage_Handler(_Event_WindowStyleSet_SendMessage_Event); // 트리뷰에서 수신기를 트리에 추가완료하였음을 알려주는 이벤트 핸들러 등록 _Event.Receiver_NodeAddComplete_SendMessage_Event += new _Event.Receiver_NodeAddComplete_SendMessage_Handler(_Event_ProjectLoad_TreeToOpen_SendMessage_Event); /// /// 스타일 변경 /// UI_Style_Initialize(); /// /// UI /// UI_ListBox_Initialize(); // 프로젝트 열기 창 속성은 반드시 보여주기 속성을 활성화해야함 (프로젝트 저장하지 않는 상태의 수신기를 열게 되는 경우 오류로 인하여 안보임) this.Visible = true; } // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용) public void CreateForm_FormClosing(object sender, FormClosingEventArgs e) { // 윈도우 스타일 변경 이벤트 핸들러 해제 _Event.WindowStyleSet_SendMessage_Event -= new _Event.WindowStyleSet_SendMessage_Handler(_Event_WindowStyleSet_SendMessage_Event); // 트리뷰에서 수신기를 트리에 추가완료하였음을 알려주는 이벤트 핸들러 등록 _Event.Receiver_NodeAddComplete_SendMessage_Event -= new _Event.Receiver_NodeAddComplete_SendMessage_Handler(_Event_ProjectLoad_TreeToOpen_SendMessage_Event); } // 윈도우 스타일 변경 이벤트 public void _Event_WindowStyleSet_SendMessage_Event() { UI_Style_Initialize(); } // 스타일 초기화 함수 private void UI_Style_Initialize() { } // 리스트 박스 초기화 함수 private void UI_ListBox_Initialize() { // 폴더명 리스트 가져오기 string FolderNameString = _File.Get_Folder(_Data.Project_Path + "\\"); if (FolderNameString != null) { string[] FolderNames = _Convert.String_to_ArrayString(FolderNameString); if (FolderNames != null) { // 리스트에 추가 foreach (string FolderName in FolderNames) { this.listBox_ProjectNames.Items.Add(FolderName); } } } } // 열기 버튼 private void UiButton_Project_Open_Click(object sender, EventArgs e) { try { // cyim 2016.12.05 : 만약 프로젝트를 열다가 중간에 예외 처리 및 강제 저장 옵션이 발동되었다면 경고 폼 출력 : 수신기 모델을 강제로 셋팅하였는지 체크 _Data.Receiver_Model_TempSetting = false; // 예외처리 if (this.listBox_ProjectNames.SelectedItem == null || this.listBox_ProjectNames.SelectedItem.ToString().Trim().Length == 0) { _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 300, 150, _Text.NotSelectProjectInform, 0); return; } else { // 프로젝트 열기 잔상 문제 _Timer_WindowBase.Delete("ProjectOpen_Timer"); _Timer_WindowBase.Create("ProjectOpen_Timer", 1000, timer_ProjectOpen_Timer_Tick, true); } } catch (Exception ex) { // LOG _Event.DebugView_SendMessage_Write(ex.ToString()); // 실패하였습니다 _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0); this.Close(); } } // 프로젝트 열기 private void timer_ProjectOpen_Timer_Tick(object sender, EventArgs e) { try { Project_Open_Timer_Cnt++; if (Project_Open_Timer_Cnt == 1) { // 프로젝트 열기창 감춤 this.Hide(); // 프로젝트 열기중이라는 팝업창 알림 ProjectLoadingPopup = _Popup.Create(Popup_Type.ConfirmNoBtn, Popup_Style.Normal, _Text.OK, 220, 150, _Text.ProjectOpenLoading, 0); } else if (Project_Open_Timer_Cnt == 2) { // 해쉬 및 리스트 초기화 (수신기 전체 삭제와 동일) _Data.HASH_RECEIVER.Clear(); _Data.LIST_RECEIVER_ID.Clear(); _Data.HASH_XMLDEVTYPE.Clear(); _Data.LIST_XMLDEVTYPE_ID.Clear(); //_Data.HASH_PAGE.Clear(); //_Data.LIST_PAGE_ID.Clear(); // _Receiver.xml 제거 : cyim 2012.8.29 -> 복구 2013.5.27 //_Data.HASH_XMLRECEIVER.Clear(); _Data.LIST_XMLRECEIVER_ID.Clear(); _Data.List_ExcelPoint.Clear(); _Data.HASH_CodePosition.Clear(); _Data.LIST_CodePosition_NAME.Clear(); _Data.LIST_XmlDBNotSave_Receiver.Clear(); _Data.Hash_ImportPoint.Clear(); // 수신기 아이디 초기화 _Data.INIT_RECEIVER_ID = 1; // 프로젝트명 전환 _Data.Project_Name = this.listBox_ProjectNames.SelectedItem.ToString(); // 프로젝트에 수신기가 몇개가 있는지 확인한다 if (_File.Read_Receiver_XML(_Data.Project_Path + "\\" + _Data.Project_Name) == false) { // 단, 파일 자체가 없는경우에는 강제로 파일 생성(어차피 수신기 아이디가 1로 모두 셋팅되어 있음 _Data.LIST_XMLRECEIVER_ID.Add(_Data.INIT_RECEIVER_ID.ToString()); // 여는 동시에 파일이 생성되고, 다음부터 열때는 프로젝트 경로에 생성된 파일을 읽어서 루틴이 적용될 수 있다. // 프로젝트 폴더생성 _File.Create_ProjectFolder(_Data.Project_Path, _Data.Project_Name); // 파일 생성 _File.Write_Receiver_XML(_Data.Project_Path + "\\" + _Data.Project_Name); } // 프로젝트 열기 // 워크뷰 및 트리뷰 에 알림 _Event.WorkView_Clear_SendMessage_Write(); _Event.TreeView_Clear_SendMessage_Write(this.listBox_ProjectNames.SelectedItem.ToString()); // 파일을 읽거나 혹은 생성시켰으므로 다시 _Data.LIST_XMLRECEIVER_ID 를 토대로 자동으로 여러개의 수신기를 추가하고 트리를 생성하도록 한다 LoadTree_Excute(); } else { Project_Open_Timer_Cnt = 0; _Timer_WindowBase.Delete("ProjectOpen_Timer"); } } catch (Exception ex) { // LOG _Event.DebugView_SendMessage_Write(ex.ToString()); // 실패하였습니다 _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0); this.Close(); } } // 프로젝트를 여는 경우 수신기 추가를 자동으로 한다 public void LoadTree_Excute() { try { // 수신기가 없다면 그냥 리턴 if (_Data.LIST_XMLRECEIVER_ID.Count == 0) { _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.NotReceiver, 0); this.Close(); } else { // 각 수신기 DB 를 읽어서 Temp DB 로 합치자 LoadDB_Excute(); // 복사본 LoadReceiverID.Clear(); LoadReceiverID = (ArrayList)_Data.LIST_XMLRECEIVER_ID.Clone(); LoadReceiverID_OnceExecute = false; // 대기 타이머 시작 Receiver_Add_Timer_Cnt = 0; _Timer_WindowBase.Delete("LoadTree_Excute"); _Timer_WindowBase.Create("LoadTree_Excute", 1000, timer_LoadTree_Excute_Tick, true); } } catch (Exception ex) { // LOG _Event.DebugView_SendMessage_Write(ex.ToString()); // 실패하였습니다 _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0); this.Close(); } } // 열기의 경우 기존의 디비를 읽어야함 public void LoadDB_Excute() { try { ArrayList TempRemoveConfigTable = (ArrayList)_Data.LIST_XMLRECEIVER_ID.Clone(); // 제일 처음 찾은 수신기 폴더의 DB 를 Temp DB 로 복사해서 넣고 (어차피 TB_CONFIG 를 제외하고는 전부 동일하다) string Receiver_Id = _Data.LIST_XMLRECEIVER_ID[0].ToString(); // 프로세스 삭제 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(ReceiverDB_Path, TempDB_Path, true); // 파일복사는 시간이 걸릴것이다 System.Threading.Thread.Sleep(1000); // 각 수신기폴더의 DB 의 내용을 토대로 Temp DB 에 추가한다 foreach (string receiver_Id in _Data.LIST_XMLRECEIVER_ID) { // 제일 처음 찾은 수신기 아이디에 해당하는 데이타는 필요없다 if (Receiver_Id != receiver_Id) { // 경로 재지정 _Data.DataBaseFilePath_Set(receiver_Id); DataRowCollection DB_TABLE_TB_CONFIG = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_ConfigTable(Int32.Parse(receiver_Id))); if (DB_TABLE_TB_CONFIG != null) { foreach (DataRow Dr in DB_TABLE_TB_CONFIG) { // 경로 재지정 (temp로 복귀) _Data.DataBaseFilePath_Set(null); // Temp DB 에 저장한다 string sSQL_Config = _Sql.TB_CONFIG_table_Insert(Int32.Parse(Dr["RECEIVER_ID"].ToString()), // 수신기 ID Dr["FIRE_ACCUMULATION_MODE"].ToString(), // 축적 모드 여부 Int32.Parse(Dr["FIRE_ACCUMULATION_TIME"].ToString()), // 축적 시간 Dr["FIRE_PROCESS_MODE"].ToString(), // 자동복구 (N) / 지속(Y) Dr["MASTER_USER_ID"].ToString(), // Master USER ID Dr["MASTER_PASSWORD"].ToString(), // Master Password Dr["BUILDING_NAME"].ToString(), // 빌딩명 (수신기명) Dr["JUMP_FIELD"].ToString(),// 화재시 화면 이동 여부 (Y/N) Dr["MASTER_FLAG"].ToString(), // 네트워크 수신기에 MASTER 여부 (Y/N) Dr["TEST_RUN_FLAG"].ToString() // 시운전 모드 Y/N ); _Db.Execute(sSQL_Config); //_Db.ADD("TB_CONFIG", // "RECEIVER_ID=" + + // ";FIRE_ACCUMULATION_MODE=" + + // ";FIRE_ACCUMULATION_TIME=" + + // ";FIRE_PROCESS_MODE=" + + // ";SOUND_PROCESS_MODE=" + Dr["SOUND_PROCESS_MODE"].ToString() + // ";BUILDING_NAME=" + + // ";MASTER_USER_ID=" + + // ";MASTER_PASSWORD=" + + // ";UPDATE_USER_ID=" + Dr["UPDATE_USER_ID"].ToString() + // ";UPDATE_TIME=current_timestamp" + // ";BACKGROUND_IMAGE=" + Dr["BACKGROUND_IMAGE"].ToString() + // ";MASTER_FLAG=" + Dr["MASTER_FLAG"].ToString() + // ";JUMP_FIELD=" + ); } } } } } catch (Exception ex) { // LOG _Event.DebugView_SendMessage_Write(ex.ToString()); // 실패하였습니다 _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0); this.Close(); } } // 트리뷰에서 트리 추가를 완료하였습니다. public void _Event_ProjectLoad_TreeToOpen_SendMessage_Event(string RECEIVER_ID) { try { LoadReceiverID.Remove(RECEIVER_ID); if (LoadReceiverID.Count != 0) { Receiver_Add_Timer_Cnt = 0; LoadReceiverID_OnceExecute = false; } else { // 먼저 클리어 _Data.Hash_ImportPoint.Clear(); // 해당 수신기 아이디만큼 루틴을 돌린다 foreach (string pRECEIVER_ID in _Data.LIST_XMLRECEIVER_ID) { _ImportPoint ImportPoint = new _ImportPoint(); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경 if (((_RECEIVER)_Data.HASH_RECEIVER[pRECEIVER_ID]).MODEL == "IFC3300") { // 해당 수신기 아이디 값을 이용해서 입력용 데이타를 만들자 ImportPoint.IN_Points = _Db.ExecuteRead_SqlDataAdapter( _Sql.Search_DEVICETable_With_EMERGENCY_BigReceiver("1", "I", "", "", "", "", "", "", pRECEIVER_ID, "", "", "", false)); // 해당 수신기 아이디 값을 이용해서 출력용 데이타를 만들자 ImportPoint.OUT_Points = _Db.ExecuteRead_SqlDataAdapter( _Sql.Search_DEVICETable_NoneBoardID_BigReceiver("1", "O", "", "", "", "", "", pRECEIVER_ID)); } else { // 해당 수신기 아이디 값을 이용해서 입력용 데이타를 만들자 ImportPoint.IN_Points = _Db.ExecuteRead_SqlDataAdapter( _Sql.Search_DEVICETable_With_EMERGENCY("1", "I", "15", "", "", "", "", "", pRECEIVER_ID, "", "", "", false)); // 해당 수신기 아이디 값을 이용해서 출력용 데이타를 만들자 ImportPoint.OUT_Points = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_DEVICETable("1", "O", "15", "", "", "", "", "", pRECEIVER_ID)); } // 해쉬테이블에 삽입 _Hash.Add(_Data.Hash_ImportPoint, pRECEIVER_ID, ImportPoint); } // 프로젝트 읽기 중이라는 팝업창이 종료 ProjectLoadingPopup.Close(); // 타이머 종료 _Timer_WindowBase.Delete("LoadTree_Excute"); // cyim 2016.12.05 : 만약 프로젝트를 열다가 중간에 예외 처리 및 강제 저장 옵션이 발동되었다면 경고 폼 출력 if (_Data.Receiver_Model_TempSetting == true) { MessageBox.Show("수신기 모델 번호가 없습니다. 임시로 IFC3300 셋업합니다. 수신기 설정 팝업창에서 반드시 모델정보를 재저장해주세요. 수신기 설정 정보중 모델 정보를 저장하지 않으면 수신기가 이상 동작합니다"); } // 폼을 종료 this.Close(); } } catch (Exception ex) { // LOG _Event.DebugView_SendMessage_Write(ex.ToString()); // 실패하였습니다 _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0); this.Close(); } } // 프로젝트 폼에서 일정 타이머동안 수신기 추가 이벤트를 강제로 발생시킨다 public Form_Receiver_Add Form_ReceiverAdd = null; private void timer_LoadTree_Excute_Tick(object sender, EventArgs e) { try { if (LoadReceiverID_OnceExecute == false) { Receiver_Add_Timer_Cnt++; if (Receiver_Add_Timer_Cnt == 1) { // 해쉬 및 리스트 트리 및 폴더 셋팅 Form_ReceiverAdd = new Form_Receiver_Add(Int32.Parse(LoadReceiverID[0].ToString())); } else if (Receiver_Add_Timer_Cnt == 2) { LoadReceiverID_OnceExecute = true; // 실제로 버튼을 누르는 것처럼 동작한다 Form_ReceiverAdd.UiButton_SubPortAdd_Click(null, null); // 프로젝트 수정이 아니다 _Data.ProJect_Save_Complete = true; } } } catch (Exception ex) { // LOG _Event.DebugView_SendMessage_Write(ex.ToString()); // 실패하였습니다 _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0); this.Close(); } } } }