cc13d2f0c827fc1e7cd2a584f2c5c5e4529d80c7.svn-base 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Collections;
  10. namespace IControls_FireManager
  11. {
  12. public partial class Form_Project_Open : Form
  13. {
  14. // 수신기 정보 복사본
  15. public ArrayList LoadReceiverID = new ArrayList();
  16. // 정보를 읽는 도중에 한번만 읽도록 함
  17. public bool LoadReceiverID_OnceExecute = false;
  18. // 프로젝트 읽기 중 팝업
  19. Form ProjectLoadingPopup = new Form();
  20. // 프로젝트 팝업창 잔상 문제로 인한 타이머 추가
  21. public int Project_Open_Timer_Cnt = 0;
  22. // 수신기 추가시에 약간의 지연 시간이 필요하다
  23. public int Receiver_Add_Timer_Cnt = 0;
  24. // 생성자
  25. public Form_Project_Open()
  26. {
  27. InitializeComponent();
  28. ///
  29. /// 이벤트
  30. ///
  31. // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
  32. this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing);
  33. // 윈도우 스타일 변경 이벤트 핸들러 등록
  34. _Event.WindowStyleSet_SendMessage_Event += new _Event.WindowStyleSet_SendMessage_Handler(_Event_WindowStyleSet_SendMessage_Event);
  35. // 트리뷰에서 수신기를 트리에 추가완료하였음을 알려주는 이벤트 핸들러 등록
  36. _Event.Receiver_NodeAddComplete_SendMessage_Event += new _Event.Receiver_NodeAddComplete_SendMessage_Handler(_Event_ProjectLoad_TreeToOpen_SendMessage_Event);
  37. ///
  38. /// 스타일 변경
  39. ///
  40. UI_Style_Initialize();
  41. ///
  42. /// UI
  43. ///
  44. UI_ListBox_Initialize();
  45. // 프로젝트 열기 창 속성은 반드시 보여주기 속성을 활성화해야함 (프로젝트 저장하지 않는 상태의 수신기를 열게 되는 경우 오류로 인하여 안보임)
  46. this.Visible = true;
  47. }
  48. // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
  49. public void CreateForm_FormClosing(object sender, FormClosingEventArgs e)
  50. {
  51. // 윈도우 스타일 변경 이벤트 핸들러 해제
  52. _Event.WindowStyleSet_SendMessage_Event -= new _Event.WindowStyleSet_SendMessage_Handler(_Event_WindowStyleSet_SendMessage_Event);
  53. // 트리뷰에서 수신기를 트리에 추가완료하였음을 알려주는 이벤트 핸들러 등록
  54. _Event.Receiver_NodeAddComplete_SendMessage_Event -= new _Event.Receiver_NodeAddComplete_SendMessage_Handler(_Event_ProjectLoad_TreeToOpen_SendMessage_Event);
  55. }
  56. // 윈도우 스타일 변경 이벤트
  57. public void _Event_WindowStyleSet_SendMessage_Event()
  58. {
  59. UI_Style_Initialize();
  60. }
  61. // 스타일 초기화 함수
  62. private void UI_Style_Initialize()
  63. {
  64. }
  65. // 리스트 박스 초기화 함수
  66. private void UI_ListBox_Initialize()
  67. {
  68. // 폴더명 리스트 가져오기
  69. string FolderNameString = _File.Get_Folder(_Data.Project_Path + "\\");
  70. if (FolderNameString != null)
  71. {
  72. string[] FolderNames = _Convert.String_to_ArrayString(FolderNameString);
  73. if (FolderNames != null)
  74. {
  75. // 리스트에 추가
  76. foreach (string FolderName in FolderNames)
  77. {
  78. this.listBox_ProjectNames.Items.Add(FolderName);
  79. }
  80. }
  81. }
  82. }
  83. // 열기 버튼
  84. private void UiButton_Project_Open_Click(object sender, EventArgs e)
  85. {
  86. try
  87. {
  88. // cyim 2016.12.05 : 만약 프로젝트를 열다가 중간에 예외 처리 및 강제 저장 옵션이 발동되었다면 경고 폼 출력 : 수신기 모델을 강제로 셋팅하였는지 체크
  89. _Data.Receiver_Model_TempSetting = false;
  90. // 예외처리
  91. if (this.listBox_ProjectNames.SelectedItem == null || this.listBox_ProjectNames.SelectedItem.ToString().Trim().Length == 0)
  92. {
  93. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 300, 150, _Text.NotSelectProjectInform, 0);
  94. return;
  95. }
  96. else
  97. {
  98. // 프로젝트 열기 잔상 문제
  99. _Timer_WindowBase.Delete("ProjectOpen_Timer");
  100. _Timer_WindowBase.Create("ProjectOpen_Timer", 1000, timer_ProjectOpen_Timer_Tick, true);
  101. }
  102. }
  103. catch (Exception ex)
  104. {
  105. // LOG
  106. _Event.DebugView_SendMessage_Write(ex.ToString());
  107. // 실패하였습니다
  108. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0);
  109. this.Close();
  110. }
  111. }
  112. // 프로젝트 열기
  113. private void timer_ProjectOpen_Timer_Tick(object sender, EventArgs e)
  114. {
  115. try
  116. {
  117. Project_Open_Timer_Cnt++;
  118. if (Project_Open_Timer_Cnt == 1)
  119. {
  120. // 프로젝트 열기창 감춤
  121. this.Hide();
  122. // 프로젝트 열기중이라는 팝업창 알림
  123. ProjectLoadingPopup = _Popup.Create(Popup_Type.ConfirmNoBtn, Popup_Style.Normal, _Text.OK, 220, 150, _Text.ProjectOpenLoading, 0);
  124. }
  125. else if (Project_Open_Timer_Cnt == 2)
  126. {
  127. // 해쉬 및 리스트 초기화 (수신기 전체 삭제와 동일)
  128. _Data.HASH_RECEIVER.Clear();
  129. _Data.LIST_RECEIVER_ID.Clear();
  130. _Data.HASH_XMLDEVTYPE.Clear();
  131. _Data.LIST_XMLDEVTYPE_ID.Clear();
  132. //_Data.HASH_PAGE.Clear();
  133. //_Data.LIST_PAGE_ID.Clear();
  134. // _Receiver.xml 제거 : cyim 2012.8.29 -> 복구 2013.5.27
  135. //_Data.HASH_XMLRECEIVER.Clear();
  136. _Data.LIST_XMLRECEIVER_ID.Clear();
  137. _Data.List_ExcelPoint.Clear();
  138. _Data.HASH_CodePosition.Clear();
  139. _Data.LIST_CodePosition_NAME.Clear();
  140. _Data.LIST_XmlDBNotSave_Receiver.Clear();
  141. _Data.Hash_ImportPoint.Clear();
  142. // 수신기 아이디 초기화
  143. _Data.INIT_RECEIVER_ID = 1;
  144. // 프로젝트명 전환
  145. _Data.Project_Name = this.listBox_ProjectNames.SelectedItem.ToString();
  146. // 프로젝트에 수신기가 몇개가 있는지 확인한다
  147. if (_File.Read_Receiver_XML(_Data.Project_Path + "\\" + _Data.Project_Name) == false)
  148. {
  149. // 단, 파일 자체가 없는경우에는 강제로 파일 생성(어차피 수신기 아이디가 1로 모두 셋팅되어 있음
  150. _Data.LIST_XMLRECEIVER_ID.Add(_Data.INIT_RECEIVER_ID.ToString());
  151. // 여는 동시에 파일이 생성되고, 다음부터 열때는 프로젝트 경로에 생성된 파일을 읽어서 루틴이 적용될 수 있다.
  152. // 프로젝트 폴더생성
  153. _File.Create_ProjectFolder(_Data.Project_Path, _Data.Project_Name);
  154. // 파일 생성
  155. _File.Write_Receiver_XML(_Data.Project_Path + "\\" + _Data.Project_Name);
  156. }
  157. // 프로젝트 열기
  158. // 워크뷰 및 트리뷰 에 알림
  159. _Event.WorkView_Clear_SendMessage_Write();
  160. _Event.TreeView_Clear_SendMessage_Write(this.listBox_ProjectNames.SelectedItem.ToString());
  161. // 파일을 읽거나 혹은 생성시켰으므로 다시 _Data.LIST_XMLRECEIVER_ID 를 토대로 자동으로 여러개의 수신기를 추가하고 트리를 생성하도록 한다
  162. LoadTree_Excute();
  163. }
  164. else
  165. {
  166. Project_Open_Timer_Cnt = 0;
  167. _Timer_WindowBase.Delete("ProjectOpen_Timer");
  168. }
  169. }
  170. catch (Exception ex)
  171. {
  172. // LOG
  173. _Event.DebugView_SendMessage_Write(ex.ToString());
  174. // 실패하였습니다
  175. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0);
  176. this.Close();
  177. }
  178. }
  179. // 프로젝트를 여는 경우 수신기 추가를 자동으로 한다
  180. public void LoadTree_Excute()
  181. {
  182. try
  183. {
  184. // 수신기가 없다면 그냥 리턴
  185. if (_Data.LIST_XMLRECEIVER_ID.Count == 0)
  186. {
  187. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.NotReceiver, 0);
  188. this.Close();
  189. }
  190. else
  191. {
  192. // 각 수신기 DB 를 읽어서 Temp DB 로 합치자
  193. LoadDB_Excute();
  194. // 복사본
  195. LoadReceiverID.Clear();
  196. LoadReceiverID = (ArrayList)_Data.LIST_XMLRECEIVER_ID.Clone();
  197. LoadReceiverID_OnceExecute = false;
  198. // 대기 타이머 시작
  199. Receiver_Add_Timer_Cnt = 0;
  200. _Timer_WindowBase.Delete("LoadTree_Excute");
  201. _Timer_WindowBase.Create("LoadTree_Excute", 1000, timer_LoadTree_Excute_Tick, true);
  202. }
  203. }
  204. catch (Exception ex)
  205. {
  206. // LOG
  207. _Event.DebugView_SendMessage_Write(ex.ToString());
  208. // 실패하였습니다
  209. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0);
  210. this.Close();
  211. }
  212. }
  213. // 열기의 경우 기존의 디비를 읽어야함
  214. public void LoadDB_Excute()
  215. {
  216. try
  217. {
  218. ArrayList TempRemoveConfigTable = (ArrayList)_Data.LIST_XMLRECEIVER_ID.Clone();
  219. // 제일 처음 찾은 수신기 폴더의 DB 를 Temp DB 로 복사해서 넣고 (어차피 TB_CONFIG 를 제외하고는 전부 동일하다)
  220. string Receiver_Id = _Data.LIST_XMLRECEIVER_ID[0].ToString();
  221. // 프로세스 삭제
  222. System.Diagnostics.Process[] mProcess = System.Diagnostics.Process.GetProcessesByName("fbserver");
  223. foreach (System.Diagnostics.Process p in mProcess)
  224. p.Kill();
  225. System.Threading.Thread.Sleep(1000);
  226. // Temp 폴더의 DB
  227. string TempDB_Path = _Data.DataBaseFilePath_Get(null);
  228. string ReceiverDB_Path = _Data.DataBaseFilePath_Get(Receiver_Id);
  229. System.IO.File.Copy(ReceiverDB_Path, TempDB_Path, true);
  230. // 파일복사는 시간이 걸릴것이다
  231. System.Threading.Thread.Sleep(1000);
  232. // 각 수신기폴더의 DB 의 내용을 토대로 Temp DB 에 추가한다
  233. foreach (string receiver_Id in _Data.LIST_XMLRECEIVER_ID)
  234. {
  235. // 제일 처음 찾은 수신기 아이디에 해당하는 데이타는 필요없다
  236. if (Receiver_Id != receiver_Id)
  237. {
  238. // 경로 재지정
  239. _Data.DataBaseFilePath_Set(receiver_Id);
  240. DataRowCollection DB_TABLE_TB_CONFIG = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_ConfigTable(Int32.Parse(receiver_Id)));
  241. if (DB_TABLE_TB_CONFIG != null)
  242. {
  243. foreach (DataRow Dr in DB_TABLE_TB_CONFIG)
  244. {
  245. // 경로 재지정 (temp로 복귀)
  246. _Data.DataBaseFilePath_Set(null);
  247. // Temp DB 에 저장한다
  248. string sSQL_Config = _Sql.TB_CONFIG_table_Insert(Int32.Parse(Dr["RECEIVER_ID"].ToString()), // 수신기 ID
  249. Dr["FIRE_ACCUMULATION_MODE"].ToString(), // 축적 모드 여부
  250. Int32.Parse(Dr["FIRE_ACCUMULATION_TIME"].ToString()), // 축적 시간
  251. Dr["FIRE_PROCESS_MODE"].ToString(), // 자동복구 (N) / 지속(Y)
  252. Dr["MASTER_USER_ID"].ToString(), // Master USER ID
  253. Dr["MASTER_PASSWORD"].ToString(), // Master Password
  254. Dr["BUILDING_NAME"].ToString(), // 빌딩명 (수신기명)
  255. Dr["JUMP_FIELD"].ToString(),// 화재시 화면 이동 여부 (Y/N)
  256. Dr["MASTER_FLAG"].ToString(), // 네트워크 수신기에 MASTER 여부 (Y/N)
  257. Dr["TEST_RUN_FLAG"].ToString() // 시운전 모드 Y/N
  258. );
  259. _Db.Execute(sSQL_Config);
  260. //_Db.ADD("TB_CONFIG",
  261. // "RECEIVER_ID=" + +
  262. // ";FIRE_ACCUMULATION_MODE=" + +
  263. // ";FIRE_ACCUMULATION_TIME=" + +
  264. // ";FIRE_PROCESS_MODE=" + +
  265. // ";SOUND_PROCESS_MODE=" + Dr["SOUND_PROCESS_MODE"].ToString() +
  266. // ";BUILDING_NAME=" + +
  267. // ";MASTER_USER_ID=" + +
  268. // ";MASTER_PASSWORD=" + +
  269. // ";UPDATE_USER_ID=" + Dr["UPDATE_USER_ID"].ToString() +
  270. // ";UPDATE_TIME=current_timestamp" +
  271. // ";BACKGROUND_IMAGE=" + Dr["BACKGROUND_IMAGE"].ToString() +
  272. // ";MASTER_FLAG=" + Dr["MASTER_FLAG"].ToString() +
  273. // ";JUMP_FIELD=" + );
  274. }
  275. }
  276. }
  277. }
  278. }
  279. catch (Exception ex)
  280. {
  281. // LOG
  282. _Event.DebugView_SendMessage_Write(ex.ToString());
  283. // 실패하였습니다
  284. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0);
  285. this.Close();
  286. }
  287. }
  288. // 트리뷰에서 트리 추가를 완료하였습니다.
  289. public void _Event_ProjectLoad_TreeToOpen_SendMessage_Event(string RECEIVER_ID)
  290. {
  291. try
  292. {
  293. LoadReceiverID.Remove(RECEIVER_ID);
  294. if (LoadReceiverID.Count != 0)
  295. {
  296. Receiver_Add_Timer_Cnt = 0;
  297. LoadReceiverID_OnceExecute = false;
  298. }
  299. else
  300. {
  301. // 먼저 클리어
  302. _Data.Hash_ImportPoint.Clear();
  303. // 해당 수신기 아이디만큼 루틴을 돌린다
  304. foreach (string pRECEIVER_ID in _Data.LIST_XMLRECEIVER_ID)
  305. {
  306. _ImportPoint ImportPoint = new _ImportPoint();
  307. // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
  308. if (((_RECEIVER)_Data.HASH_RECEIVER[pRECEIVER_ID]).MODEL == "IFC3300")
  309. {
  310. // 해당 수신기 아이디 값을 이용해서 입력용 데이타를 만들자
  311. ImportPoint.IN_Points = _Db.ExecuteRead_SqlDataAdapter(
  312. _Sql.Search_DEVICETable_With_EMERGENCY_BigReceiver("1", "I", "", "", "", "", "", "", pRECEIVER_ID, "", "", "", false));
  313. // 해당 수신기 아이디 값을 이용해서 출력용 데이타를 만들자
  314. ImportPoint.OUT_Points = _Db.ExecuteRead_SqlDataAdapter(
  315. _Sql.Search_DEVICETable_NoneBoardID_BigReceiver("1", "O", "", "", "", "", "", pRECEIVER_ID));
  316. }
  317. else
  318. {
  319. // 해당 수신기 아이디 값을 이용해서 입력용 데이타를 만들자
  320. ImportPoint.IN_Points = _Db.ExecuteRead_SqlDataAdapter(
  321. _Sql.Search_DEVICETable_With_EMERGENCY("1", "I", "15", "", "", "", "", "", pRECEIVER_ID, "", "", "", false));
  322. // 해당 수신기 아이디 값을 이용해서 출력용 데이타를 만들자
  323. ImportPoint.OUT_Points = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_DEVICETable("1", "O", "15", "", "", "", "", "", pRECEIVER_ID));
  324. }
  325. // 해쉬테이블에 삽입
  326. _Hash.Add(_Data.Hash_ImportPoint, pRECEIVER_ID, ImportPoint);
  327. }
  328. // 프로젝트 읽기 중이라는 팝업창이 종료
  329. ProjectLoadingPopup.Close();
  330. // 타이머 종료
  331. _Timer_WindowBase.Delete("LoadTree_Excute");
  332. // cyim 2016.12.05 : 만약 프로젝트를 열다가 중간에 예외 처리 및 강제 저장 옵션이 발동되었다면 경고 폼 출력
  333. if (_Data.Receiver_Model_TempSetting == true)
  334. {
  335. MessageBox.Show("수신기 모델 번호가 없습니다. 임시로 IFC3300 셋업합니다. 수신기 설정 팝업창에서 반드시 모델정보를 재저장해주세요. 수신기 설정 정보중 모델 정보를 저장하지 않으면 수신기가 이상 동작합니다");
  336. }
  337. // 폼을 종료
  338. this.Close();
  339. }
  340. }
  341. catch (Exception ex)
  342. {
  343. // LOG
  344. _Event.DebugView_SendMessage_Write(ex.ToString());
  345. // 실패하였습니다
  346. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0);
  347. this.Close();
  348. }
  349. }
  350. // 프로젝트 폼에서 일정 타이머동안 수신기 추가 이벤트를 강제로 발생시킨다
  351. public Form_Receiver_Add Form_ReceiverAdd = null;
  352. private void timer_LoadTree_Excute_Tick(object sender, EventArgs e)
  353. {
  354. try
  355. {
  356. if (LoadReceiverID_OnceExecute == false)
  357. {
  358. Receiver_Add_Timer_Cnt++;
  359. if (Receiver_Add_Timer_Cnt == 1)
  360. {
  361. // 해쉬 및 리스트 트리 및 폴더 셋팅
  362. Form_ReceiverAdd = new Form_Receiver_Add(Int32.Parse(LoadReceiverID[0].ToString()));
  363. }
  364. else if (Receiver_Add_Timer_Cnt == 2)
  365. {
  366. LoadReceiverID_OnceExecute = true;
  367. // 실제로 버튼을 누르는 것처럼 동작한다
  368. Form_ReceiverAdd.UiButton_SubPortAdd_Click(null, null);
  369. // 프로젝트 수정이 아니다
  370. _Data.ProJect_Save_Complete = true;
  371. }
  372. }
  373. }
  374. catch (Exception ex)
  375. {
  376. // LOG
  377. _Event.DebugView_SendMessage_Write(ex.ToString());
  378. // 실패하였습니다
  379. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform + ex.ToString(), 0);
  380. this.Close();
  381. }
  382. }
  383. }
  384. }