17e8a4ca21cdec780eb23ae224f2d1fa41fdb98b.svn-base 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. using System.Threading;
  11. /// 시스템 구조 Ver2012-07-20
  12. ///
  13. /// 원래는 레지스트리에 있는 정보를 가지고 접근해야되지만 지금은 우선 프로그램안의 xml 파일에서 정보를 읽어와서 시스템을 구성한다
  14. /// 주의할 점은 실행하는 프로그램 경로와 저장하고 열기하는 프로젝트의 경로를 따로 관리하게 되므로 아래를 참조바람
  15. ///
  16. /// Program_Configuration.xml (옵션이므로 향후 제거될 수 있다)
  17. /// => 맨처음 프로그램이 실행하는 경우 제일 먼저 기초데이터를 이파일로 불러들인다. 최근 사용한 프로젝트명, 데이타베이스 접속 정보 등이 여기 저장되어있다.
  18. /// => 위치는 실행 프로그램 exe 파일과 동일하다
  19. ///
  20. /// 프로젝트 폴더
  21. /// => 메뉴->시스템->환경옵션 메뉴에서 선택한 경로에서 프로젝트 관리하도록 한다.
  22. /// => 주의할 점! 프로젝트 폴더안에 DB 폴더 안에는 미리 데이타베이스를 복사해야 한다. 차후에는 데이타베이스를 직접 생성할수 있도록 구현해야된다 (현재는 데이타베이스 읽기만 가능하므로)
  23. /// => 결국 반드시 프로그램 실행 전에 모든 프로젝트가 데이타베이스에 저장 완료되어 있다는 가정하에서 프로그램이 구동된다
  24. ///
  25. /// 수신기 아이디
  26. /// => 수신기 아이디는 1로서 각각 데이타베이스에 저장된다 (전제이다. 데이타베이스에 1이 아닌 다른 값이 들어가지는 않는다)
  27. /// => UI에 표시될 수신기 아이디는 각각 숫자로 1씩 증가하여 관리된다
  28. /// => 수신기 아이디에 따라 접근하는 데이타베이스 폴더는 달라지므로 폴더 패스로 수신기를 관리한다
  29. namespace IControls_FireManager
  30. {
  31. public partial class IControls_FireManager : Form
  32. {
  33. // 타이머 카운트 (종료없이 항상 타이머가 동작)
  34. public int timer_MainConfig_Cnt = 0;
  35. // 프로젝트 새로만들기 여부 대화 팝업창
  36. public Form Popup_NewProjectInform = new Form();
  37. // XML 파일 및 데이타베이스 저장 여부 대화 팝업창
  38. public Form Popup_NotSaveXmlDBInform = new Form();
  39. // XML 및 DB 저장 직전 상태
  40. public XMLDB_BEFORE_STATUS Popup_NotSaveXmlDBInform_Status;
  41. // 프로젝트 저장 여부 대화 팝업창
  42. public Form Popup_SaveProjectInform = new Form();
  43. // 수신기 전체 삭제 여부 대화 팝업창
  44. public Form Popup_ReceiverAllDelInform = new Form();
  45. // 프로젝트 저장을 위한 페이지 저장을 위한 수신기 아이디 리스트 (처음시작시 수신기 아이디가 모두 저장되어 있다가 저장 완료마다 해당 수신기 정보가 삭제됩니다)
  46. public ArrayList List_PageSaved_By_ReceiverID = new ArrayList();
  47. // 프로젝트 저장시에 수신기별로 페이지 저장을 하기 위해 한번만 실행하도록 함
  48. public bool Project_Save_ReceiverOnceExecute = false;
  49. // 프로젝트 저장 중 팝업
  50. public Form ProjectSavingPopup = new Form();
  51. public Form ProjectSavinEtcgPopup = new Form();
  52. // 메인
  53. public IControls_FireManager()
  54. {
  55. // 디자이너 초기화
  56. InitializeComponent();
  57. // 데이타 초기화
  58. Initialize_Data();
  59. // 디버그뷰 프레임 초기화
  60. Initialize_Frame_DebugView();
  61. // 트리뷰 프레임 초기화
  62. Initialize_Frame_TreeView();
  63. // 워크뷰 프레임 초기화
  64. Initialize_Frame_WorkView();
  65. // 개발자가 아니면 디버깅창이 필요없다
  66. this.uiPanel_DebugView.Closed = true;
  67. // 디버깅창이 없다면 창 사이즈도 고정되지 않도록 하고, 줄인다
  68. this.Size = new Size(1662, 858);//1608, 1028
  69. }
  70. // 디바이스 트리뷰 초기화
  71. public void Initialize_Frame_TreeView()
  72. {
  73. Frame_Tree Frame = new Frame_Tree();
  74. _Frame.Create(this.uiPanel_TreeViewContainer, Frame);
  75. }
  76. // 디바이스 워크뷰 초기화
  77. public void Initialize_Frame_WorkView()
  78. {
  79. Frame_Work Frame = new Frame_Work();
  80. _Frame.Create(this.uiPanel_WorkViewContainer, Frame);
  81. }
  82. // 디버그뷰 프레임 초기화
  83. public void Initialize_Frame_DebugView()
  84. {
  85. Frame_Debug Frame = new Frame_Debug();
  86. _Frame.Create(this.uiPanel_DebugViewContainer, Frame);
  87. }
  88. // 데이타 초기화
  89. public void Initialize_Data()
  90. {
  91. ///
  92. /// 폴더 생성 (강제로 폴더 생성 - 차후 삭제할수도있다. 사용자가 환경 옵션 지정시 폴더만 생성하는 역할만 한다)
  93. ///
  94. _File.Create_Folder("C:\\", "IControls_FireManager");
  95. ///
  96. /// 설정 파일 로드
  97. ///
  98. if (_File.Read_ProgramConfiguration() == false)
  99. {
  100. _Popup.MessageBoxPopup(0, _Text.GetDamagedConfigFile, _Text.OK);
  101. }
  102. ///
  103. /// 프로젝트 생성 위치, 즉 프로젝트 경로가 없다면 기본값으로 대체함.
  104. ///
  105. if (_Data.Project_Path.Length == 0) _Data.Project_Path = _File.ProgramPath;
  106. ///
  107. /// 타이머 시작 (폼이름으로 타이머 이름을 생성함)
  108. ///
  109. _Timer_WindowBase.Create(null, 1000, timer_MainConfig_Tick, true);
  110. ///
  111. /// 상태바 표시
  112. ///
  113. Update_StatusBar();
  114. ///
  115. /// 이벤트
  116. ///
  117. // 폼닫기 이벤트 핸들러 등록 (이벤트 핸들러 해제용)
  118. this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing);
  119. // 프로젝트 저장기능중 페이지 저장이 완료되었음을 알리는 이벤트 핸들러 등록
  120. _Event.Receiver_PageSaveComplete_SendMessage_Event += new _Event.Receiver_PageSaveComplete_SendMessage_Handler(_Event_Receiver_PageSaveComplete_SendMessage_Event);
  121. // 화면 최대화 명령 (TreeView Form -> Main Form) 이벤트 핸들러 등록
  122. _Event.Windows_MaxSize_SendMessage_Event += new _Event.Windows_MaxSize_SendMessage_Handler(_Event_Windows_MaxSize_SendMessage_Event);
  123. ///
  124. /// 스타일
  125. ///
  126. UI_Style_Initialize();
  127. }
  128. // 폼닫기
  129. public void CreateForm_FormClosing(object sender, FormClosingEventArgs e)
  130. {
  131. // XML 및 DB 저장되지 않은 수신기가 존재한다면
  132. if (_Data.LIST_XmlDBNotSave_Receiver.Count != 0 || _Data.ProJect_Save_Complete == false)
  133. {
  134. // 이벤트 해제
  135. e.Cancel = true;
  136. // XML 파일 및 데이타베이스 저장 여부
  137. Popup_NotSaveXmlDBInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.NotSaveProjectConfirm, 0);
  138. // 대화 팝업은 특별처리
  139. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);
  140. // 프로그램 종료 직전
  141. Popup_NotSaveXmlDBInform_Status = XMLDB_BEFORE_STATUS.PROGRAM_END;
  142. }
  143. else
  144. {
  145. // 종료시 잔상이 남는 문제
  146. this.Hide();
  147. }
  148. }
  149. ///
  150. /// 스타일
  151. ///
  152. // 스타일 초기화 함수
  153. private void UI_Style_Initialize()
  154. {
  155. // 스타일 적용
  156. this.uiPanelManager.VisualStyle = _Data.Style_PanelVisualStyle;
  157. this.uiCommandManager.VisualStyle = _Data.Style_VisualStyle;
  158. this.MainBar.VisualStyle = _Data.Style_VisualStyle;
  159. this.IconBar_1.VisualStyle = _Data.Style_VisualStyle;
  160. this.TopRebar.VisualStyle = _Data.Style_VisualStyle;
  161. this.officeFormAdorner.Office2007ColorScheme = _Data.Style_Office2007ColorScheme;
  162. }
  163. // 스타일 변경 함수
  164. private void UI_Style_Change(
  165. Janus.Windows.UI.Dock.PanelVisualStyle PanelVisualStyle,
  166. Janus.Windows.UI.VisualStyle VisualStyle,
  167. Janus.Windows.Ribbon.Office2007ColorScheme Office2007ColorScheme)
  168. {
  169. // 스타일 변수 저장
  170. _Data.Style_PanelVisualStyle = PanelVisualStyle;
  171. _Data.Style_VisualStyle = VisualStyle;
  172. _Data.Style_Office2007ColorScheme = Office2007ColorScheme;
  173. // 스타일 적용
  174. UI_Style_Initialize();
  175. // 체크 상태 초기화 (메뉴에서 선택한 체크 모두 해제)
  176. UI_Style_CheckStatusClear();
  177. // 다른폼에 알림
  178. _Event.WindowStyleSet_SendMessage_Write();
  179. // 파일에 저장
  180. _File.Write_ProgramConfiguration();
  181. }
  182. // 스타일 변경 체크 상태 초기화
  183. private void UI_Style_CheckStatusClear()
  184. {
  185. this.Menu_Style_Office2007.IsChecked = false;
  186. this.Menu_Style_Office2003.IsChecked = false;
  187. this.Menu_Style_VS2005.IsChecked = false;
  188. this.Menu_Style_Standard.IsChecked = false;
  189. }
  190. ///
  191. /// 이벤트
  192. ///
  193. // 윈도우 최대화
  194. private void _Event_Windows_MaxSize_SendMessage_Event()
  195. {
  196. this.WindowState = FormWindowState.Maximized;
  197. }
  198. // 메인 메뉴바에서 클릭시
  199. private void MainBar_CommandClick(object sender, Janus.Windows.UI.CommandBars.CommandEventArgs e)
  200. {
  201. switch (e.Command.Key)
  202. {
  203. ///
  204. /// 메뉴 -> 시스템
  205. ///
  206. case "Menu_System_ConfigOption":
  207. // 시스템 환경 옵션
  208. Form_System_Config System_Config = new Form_System_Config();
  209. _Form.Create(System_Config, null);// this.uiCommandManager.Commands[e.Command.Key]);
  210. break;
  211. case "Menu_System_End":
  212. Program_End();
  213. break;
  214. ///
  215. /// 메뉴 -> 프로젝트
  216. ///
  217. case "Menu_Project_New":
  218. Project_New();
  219. break;
  220. case "Menu_Project_Open":
  221. Project_Open();
  222. break;
  223. case "Menu_Project_Del":
  224. Project_Del();
  225. break;
  226. case "Menu_Project_Save":
  227. Project_Save();
  228. break;
  229. ///
  230. /// 메뉴 -> 수신기
  231. ///
  232. case "Menu_Receiver_Add":
  233. // 프로젝트가 존재하는 경우에만
  234. if (_Data.Project_Name != null)
  235. {
  236. Form_Receiver_Add Receiver_Add = new Form_Receiver_Add(_Data.CREATE_RECEIVER_ID());
  237. _Form.Create(Receiver_Add, null);
  238. }
  239. else
  240. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotSelectProjectInform, 0);
  241. break;
  242. case "Menu_Receiver_Del":
  243. // 프로젝트가 존재하는 경우에만
  244. if (_Data.Project_Name == null)
  245. {
  246. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotSelectProjectInform, 0);
  247. }
  248. // 수신기가 존재하는 경우에만
  249. else if (_Data.LIST_RECEIVER_ID.Count == 0)
  250. {
  251. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotReceiver, 0);
  252. }
  253. else
  254. {
  255. Popup_ReceiverAllDelInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.AllDelete_Continue, 0);
  256. // 대화 팝업은 특별처리
  257. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_ReceiverAllDel_PopupClose_SendMessage_Event);
  258. }
  259. break;
  260. ///
  261. /// 메뉴 -> 보기
  262. ///
  263. case "Menu_View_Status":
  264. this.StatusBar.Visible = !(this.StatusBar.Visible);
  265. break;
  266. case "Menu_View_Debug":
  267. this.uiPanel_DebugView.Closed = !(this.uiPanel_DebugView.Closed);
  268. break;
  269. ///
  270. /// 메뉴 -> 도움말
  271. ///
  272. case "Menu_Help_Helper":
  273. Form__Sample Temp_Sample = new Form__Sample();
  274. _Form.Create(Temp_Sample, null);// this.uiCommandManager.Commands[e.Command.Key]);
  275. break;
  276. case "Menu_Help_MAP":
  277. break;
  278. ///
  279. /// 메뉴 -> 스타일 (현재 비활성화)
  280. ///
  281. case "Menu_Style_Office2007":
  282. // 변경
  283. UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Office2007, Janus.Windows.UI.VisualStyle.Office2007, Janus.Windows.Ribbon.Office2007ColorScheme.Blue);
  284. // 체크
  285. this.Menu_Style_Office2007.IsChecked = true;
  286. break;
  287. case "Menu_Style_Office2003":
  288. // 변경
  289. UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Office2003, Janus.Windows.UI.VisualStyle.Office2003, Janus.Windows.Ribbon.Office2007ColorScheme.Blue);
  290. // 체크
  291. this.Menu_Style_Office2003.IsChecked = true;
  292. break;
  293. case "Menu_Style_VS2005":
  294. // 변경
  295. UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.VS2005, Janus.Windows.UI.VisualStyle.VS2005, Janus.Windows.Ribbon.Office2007ColorScheme.Black);
  296. // 체크
  297. this.Menu_Style_VS2005.IsChecked = true;
  298. break;
  299. case "Menu_Style_Standard":
  300. // 변경
  301. UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Standard, Janus.Windows.UI.VisualStyle.Standard, Janus.Windows.Ribbon.Office2007ColorScheme.Black);
  302. // 체크
  303. this.Menu_Style_Standard.IsChecked = true;
  304. break;
  305. }
  306. }
  307. ///
  308. /// 아이콘바 스타일
  309. ///
  310. private void IconBar_2_CommandClick(object sender, Janus.Windows.UI.CommandBars.CommandEventArgs e)
  311. {
  312. switch (e.Command.Key)
  313. {
  314. ///
  315. /// 메뉴 -> 스타일
  316. ///
  317. case "Icon_Office2007":
  318. // 변경
  319. UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Office2007, Janus.Windows.UI.VisualStyle.Office2007, Janus.Windows.Ribbon.Office2007ColorScheme.Blue);
  320. // 체크
  321. this.Menu_Style_Office2007.IsChecked = true;
  322. break;
  323. case "Icon_Office2003":
  324. // 변경
  325. UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Office2003, Janus.Windows.UI.VisualStyle.Office2003, Janus.Windows.Ribbon.Office2007ColorScheme.Blue);
  326. // 체크
  327. this.Menu_Style_Office2003.IsChecked = true;
  328. break;
  329. case "Icon_VS2005":
  330. // 변경
  331. UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.VS2005, Janus.Windows.UI.VisualStyle.VS2005, Janus.Windows.Ribbon.Office2007ColorScheme.Black);
  332. // 체크
  333. this.Menu_Style_VS2005.IsChecked = true;
  334. break;
  335. case "Icon_Standard":
  336. // 변경
  337. UI_Style_Change(Janus.Windows.UI.Dock.PanelVisualStyle.Standard, Janus.Windows.UI.VisualStyle.Standard, Janus.Windows.Ribbon.Office2007ColorScheme.Black);
  338. // 체크
  339. this.Menu_Style_Standard.IsChecked = true;
  340. break;
  341. }
  342. }
  343. ///
  344. /// 타이머
  345. ///
  346. // 초당 호출
  347. private void timer_MainConfig_Tick(object sender, EventArgs e)
  348. {
  349. // 반드시 타이머는 사용후 종료해야한다
  350. // 타이머를 종료하려면 아래의 주석코드를 제거한다
  351. // _Timer_WindowBase.Delete((string)((System.Windows.Forms.Timer)sender).Tag);
  352. // 타이머 카운트 갱신
  353. timer_MainConfig_Cnt++;
  354. // 타이머 카운트 초기화 (2초 갱신)
  355. if (timer_MainConfig_Cnt > 2)
  356. {
  357. // 초기화
  358. timer_MainConfig_Cnt = 0;
  359. ///
  360. /// 상태바 표시
  361. ///
  362. Update_StatusBar();
  363. //
  364. // cyim 2016.04.01 : 6자리 혹은 4자리로 맵아이디와 그룹아이디 지정할수 있도록함
  365. //
  366. this.Text = "IControls_FireManager Ver3.1" + " 현재 출력그룹 혹은 맵연동 아이디는 " + _Data.Project_MapGroupIDTypeNumber + " 자리로 셋팅되어 있습니다";
  367. }
  368. // 시간정보 갱신
  369. this.Status_Time.Text = _Text.Blank + _Text.UI_STATUSBAR_PROGRAM_TIME + _Text.Blank + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  370. }
  371. // 상태바 갱신
  372. private void Update_StatusBar()
  373. {
  374. // 프로젝트 명
  375. this.Status_ProjectName.Text = _Text.Blank + _Text.UI_STATUSBAR_PROJECT_NAME + _Text.Blank + _Data.Project_Name;
  376. // 프로젝트 패스
  377. this.Status_ProjectPath.Text = _Text.Blank + _Text.UI_STATUSBAR_PROJECT_PATH + _Text.Blank + _Data.Project_Path;
  378. // 현재 데이타베이스 경로
  379. this.Status_DatabasePath.Text = _Text.Blank + _Text.UI_STATUSBAR_DATABASE_PATH + _Text.Blank + _Data.DB_FullPath;
  380. // 프로그램 버전
  381. this.Status_ProgramVersion.Text = _Text.Blank + _Text.UI_STATUSBAR_PROGRAM_VERSION + _Text.Blank + _Data.Program_Version;
  382. }
  383. // 프로그램 종료
  384. private void Program_End()
  385. {
  386. // XML 및 DB 저장되지 않은 수신기가 존재한다면
  387. if (_Data.LIST_XmlDBNotSave_Receiver.Count != 0 || _Data.ProJect_Save_Complete == false)
  388. {
  389. // XML 파일 및 데이타베이스 저장 여부
  390. Popup_NotSaveXmlDBInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.NotSaveProjectConfirm, 0);
  391. // 대화 팝업은 특별처리
  392. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);
  393. // 프로그램 종료 직전
  394. Popup_NotSaveXmlDBInform_Status = XMLDB_BEFORE_STATUS.PROGRAM_END;
  395. }
  396. else
  397. {
  398. this.Close();
  399. }
  400. }
  401. ///
  402. /// 프로젝트
  403. ///
  404. // 새로 만들기
  405. private void Project_New()
  406. {
  407. // 프로젝트 새로만들기 여부
  408. Popup_NewProjectInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 250, 150, _Text.NewProjectInform, 0);
  409. // 대화 팝업은 특별처리
  410. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_NewProjectInform_SendMessage_Event);
  411. }
  412. // 프로젝트 새로만들기 여부 경고창을 생성하고 난후에 확인 버튼을 누를때 발생하는 이벤트
  413. public void _Event_Popup_NewProjectInform_SendMessage_Event(object sender, object etc)
  414. {
  415. // 대화 팝업 주체
  416. Form popup = (Form)sender;
  417. if (Popup_NewProjectInform.Name == popup.Name && etc.ToString() == _Text.OK)
  418. {
  419. // XML 및 DB 저장되지 않은 수신기가 존재한다면
  420. if (_Data.LIST_XmlDBNotSave_Receiver.Count != 0 || _Data.ProJect_Save_Complete == false)
  421. {
  422. // XML 파일 및 데이타베이스 저장 여부
  423. Popup_NotSaveXmlDBInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.NotSaveProjectConfirm, 0);
  424. // 대화 팝업은 특별처리
  425. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);
  426. // 프로젝트 새로 만들기 직전
  427. Popup_NotSaveXmlDBInform_Status = XMLDB_BEFORE_STATUS.PROJECT_NEW;
  428. }
  429. else
  430. {
  431. // 워크뷰 및 트리뷰 에 알림
  432. _Event.WorkView_Clear_SendMessage_Write();
  433. _Event.TreeView_Clear_SendMessage_Write(null);
  434. // 폼 생성
  435. _Data.MenuActivedForm = new Form_Project_New();
  436. _Form.Create(_Data.MenuActivedForm, null);
  437. }
  438. }
  439. // 대화 팝업은 특별처리
  440. _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_Popup_NewProjectInform_SendMessage_Event);
  441. }
  442. // 열기
  443. private void Project_Open()
  444. {
  445. // XML 및 DB 저장되지 않은 수신기가 존재한다면
  446. if (_Data.LIST_XmlDBNotSave_Receiver.Count != 0 || _Data.ProJect_Save_Complete == false)
  447. {
  448. // XML 파일 및 데이타베이스 저장 여부
  449. Popup_NotSaveXmlDBInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.NotSaveProjectConfirm, 0);
  450. // 대화 팝업은 특별처리
  451. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);
  452. // 프로젝트 열기 직전
  453. Popup_NotSaveXmlDBInform_Status = XMLDB_BEFORE_STATUS.PROJECT_OPEN;
  454. }
  455. else
  456. {
  457. // 열기 폼 생성
  458. _Data.MenuActivedForm = new Form_Project_Open();
  459. _Form.Create(_Data.MenuActivedForm, null);
  460. }
  461. }
  462. // 삭제
  463. private void Project_Del()
  464. {
  465. // 삭제 폼 생성
  466. _Data.MenuActivedForm = new Form_Project_Delete();
  467. _Form.Create(_Data.MenuActivedForm, null);
  468. }
  469. // 저장
  470. private void Project_Save()
  471. {
  472. if (_Data.LIST_XMLRECEIVER_ID.Count == 0 || _Data.HASH_RECEIVER.Count == 0)
  473. {
  474. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.NotReceiver, 0);
  475. }
  476. else if (_Data.Check_Verify_EVENT_TYPE() == false)
  477. {
  478. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 450, 150, _Text.NothingEventType, 0);
  479. }
  480. else
  481. {
  482. // 프로젝트 저장여부
  483. Popup_SaveProjectInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.SaveProject, 0);
  484. // 대화 팝업은 특별처리
  485. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_SaveProjectInform_SendMessage_Event);
  486. }
  487. }
  488. // 프로젝트 저장 여부 확인 버튼을 누를때 발생하는 이벤트
  489. public void _Event_Popup_SaveProjectInform_SendMessage_Event(object sender, object etc)
  490. {
  491. // 대화 팝업 주체
  492. Form popup = (Form)sender;
  493. if (Popup_SaveProjectInform.Name == popup.Name && etc.ToString() == _Text.OK)
  494. {
  495. // 프로젝트 저장 시작
  496. Project_Save_Start();
  497. }
  498. // 대화 팝업은 특별처리
  499. _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_Popup_SaveProjectInform_SendMessage_Event);
  500. }
  501. // 폼닫기, 프로젝트 새로열기, 프로젝트 새로만들기 -> 프로젝트 저장 여부 확인 버튼을 누를때 발생하는 이벤트
  502. public void _Event_Popup_PageSaveXmlDB_SendMessage_Event(object sender, object etc)
  503. {
  504. // 대화 팝업 주체
  505. Form popup = (Form)sender;
  506. if (Popup_NotSaveXmlDBInform.Name == popup.Name && etc.ToString() == _Text.OK)
  507. {
  508. // 프로젝트를 저장하자
  509. Project_Save_Start();
  510. }
  511. else
  512. {
  513. // 팝업창 직전 상태
  514. switch (Popup_NotSaveXmlDBInform_Status)
  515. {
  516. case XMLDB_BEFORE_STATUS.PROGRAM_END:
  517. // 저장되지 않았던 리스트 초기화
  518. _Data.LIST_XmlDBNotSave_Receiver.Clear();
  519. // 프로젝트 저장여부 완료로 변경
  520. _Data.ProJect_Save_Complete = true;
  521. // 프로그램 종료
  522. this.Close();
  523. break;
  524. case XMLDB_BEFORE_STATUS.PROJECT_NEW:
  525. // 워크뷰 및 트리뷰 에 알림
  526. _Event.WorkView_Clear_SendMessage_Write();
  527. _Event.TreeView_Clear_SendMessage_Write(null);
  528. // 폼 생성
  529. _Data.MenuActivedForm = new Form_Project_New();
  530. _Form.Create(_Data.MenuActivedForm, null);
  531. break;
  532. case XMLDB_BEFORE_STATUS.PROJECT_OPEN:
  533. // 열기 폼 생성
  534. _Data.MenuActivedForm = new Form_Project_Open();
  535. _Form.Create(_Data.MenuActivedForm, null);
  536. break;
  537. }
  538. }
  539. // 대화 팝업은 특별처리
  540. _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageSaveXmlDB_SendMessage_Event);
  541. }
  542. // 수신기 전부 삭제 여부 팝업창 이벤트
  543. public void _Event_ReceiverAllDel_PopupClose_SendMessage_Event(object sender, object etc)
  544. {
  545. // 대화 팝업 주체
  546. Form popup = (Form)sender;
  547. if (Popup_ReceiverAllDelInform.Name == popup.Name && etc.ToString() == _Text.OK)
  548. {
  549. // 전체 삭제 이벤트 발생
  550. _Event.Receiver_Clear_SendMessage_Write();
  551. }
  552. // 대화 팝업은 특별처리
  553. _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_ReceiverAllDel_PopupClose_SendMessage_Event);
  554. }
  555. // 프로젝트 저장을 시작한다
  556. public void Project_Save_Start()
  557. {
  558. // 수신기가 없다면 저장 못함
  559. if (_Data.LIST_XMLRECEIVER_ID.Count == 0)
  560. {
  561. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.NotReceiver, 0);
  562. return;
  563. }
  564. // 프로젝트 저장 중
  565. ProjectSavingPopup = _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.SaveProjectInform, 0);
  566. // 저장을 위한 리스트 생성
  567. List_PageSaved_By_ReceiverID.Clear();
  568. List_PageSaved_By_ReceiverID = (ArrayList)_Data.LIST_XMLRECEIVER_ID.Clone();
  569. // 화면 전환 (프로젝트 메인 페이지의 경우 특별히 매개변수에 SystenTeee 정보는 필요없다)
  570. _Event.WorkViewPageName_SendMessage_Write(null, Object_Type.PROJECT, null, null);
  571. // 프로젝트 저장
  572. Project_Save_ReceiverOnceExecute = false;
  573. // 대기 타이머 시작
  574. _Timer_WindowBase.Delete("Project_Save_Start");
  575. _Timer_WindowBase.Create("Project_Save_Start", 1000, timer_Project_Save_Start_Tick, true);
  576. }
  577. // 수신기별로 페이지 저장 완료 알림
  578. public void _Event_Receiver_PageSaveComplete_SendMessage_Event(string RECEIVER_ID)
  579. {
  580. // 저장완료했으므로 삭제
  581. List_PageSaved_By_ReceiverID.Remove(RECEIVER_ID);
  582. // 타이머 재동작
  583. Project_Save_ReceiverOnceExecute = false;
  584. }
  585. // 프로젝트 저장을 타이머로 처리함
  586. private void timer_Project_Save_Start_Tick(object sender, EventArgs e)
  587. {
  588. try
  589. {
  590. if (Project_Save_ReceiverOnceExecute == false)
  591. {
  592. Project_Save_ReceiverOnceExecute = true;
  593. // 마지막 수신기 처리
  594. if (List_PageSaved_By_ReceiverID.Count == 0)
  595. {
  596. // 팝업 종료(프로젝트 저장완료했습니다 -> 종료)
  597. ProjectSavingPopup.Close();
  598. // 팝업 시작(맵파일 저장중입니다 -> 시작)
  599. ProjectSavinEtcgPopup = _Popup.Create(Popup_Type.ConfirmNoBtn, Popup_Style.Normal, _Text.OK, 450, 150, _Text.SaveProjectEtcInform, 0);
  600. // 파일 복사 및 최종 마무리
  601. Project_Save_EndRoutine();
  602. // 팝업 시작(맵파일 저장중입니다 -> 종료)
  603. ProjectSavinEtcgPopup.Close();
  604. // 타이머종료
  605. _Timer_WindowBase.Delete("Project_Save_Start");
  606. }
  607. else
  608. {
  609. // 배열중 처음 수신기 아이디
  610. string Receiver_ID = (string)List_PageSaved_By_ReceiverID[0];
  611. // 페이지 저장
  612. _Event.Page_Save_SendMessage_Write(Receiver_ID);
  613. }
  614. }
  615. }
  616. catch (Exception ex)
  617. {
  618. // LOG
  619. _Event.DebugView_SendMessage_Write(ex.ToString());
  620. }
  621. }
  622. // 프로젝트 저장 최종 루틴
  623. private void Project_Save_EndRoutine()
  624. {
  625. try
  626. {
  627. ArrayList TempRemoveConfigTable = (ArrayList)_Data.LIST_XMLRECEIVER_ID.Clone();
  628. // 현재 몇개의 수신기가 있는지 알아내자
  629. foreach (string Receiver_Id in _Data.LIST_XMLRECEIVER_ID)
  630. {
  631. // 프로세스 삭제
  632. System.Diagnostics.Process[] mProcess = System.Diagnostics.Process.GetProcessesByName("fbserver");
  633. foreach (System.Diagnostics.Process p in mProcess)
  634. p.Kill();
  635. System.Threading.Thread.Sleep(1000);
  636. // Temp 폴더의 DB 를 각 수신기에 복사한다
  637. string TempDB_Path = _Data.DataBaseFilePath_Get(null);
  638. string ReceiverDB_Path = _Data.DataBaseFilePath_Get(Receiver_Id);
  639. System.IO.File.Copy(TempDB_Path, ReceiverDB_Path, true);
  640. // 파일복사는 시간이 걸릴것이다
  641. System.Threading.Thread.Sleep(1000);
  642. // 경로 재지정
  643. _Data.DataBaseFilePath_Set(Receiver_Id);
  644. // 각 수신기의 DB 의 TB_CONFIG 를 조절한다 (상관없는 디비는 모두 지워버린다)
  645. foreach (string Remove_Id in TempRemoveConfigTable)
  646. if (Remove_Id != Receiver_Id)
  647. _Db.Execute(_Sql.Delete_Table("TB_CONFIG", Remove_Id));
  648. // 맵프로세스 자동생성
  649. Project_Save_MapProcess(Receiver_Id);
  650. }
  651. // 경로 재지정 (temp로 복귀)
  652. _Data.DataBaseFilePath_Set(null);
  653. // cyim 2016.12.15 : 프로젝트 강제 쿼리 (수신반용 테이블)
  654. // 수신반에 연동할 모바일앱용 테이블을 저장한다
  655. _Db.Execute("delete from TB_RECEIVER_ERROR_COUNT");
  656. foreach (string ID in _Data.LIST_RECEIVER_ID)
  657. _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)",
  658. ((_RECEIVER)_Data.HASH_RECEIVER[ID]).IP));
  659. // 프로젝트 완료
  660. _Data.ProJect_Save_Complete = true;
  661. }
  662. catch (Exception ex)
  663. {
  664. // LOG
  665. _Event.DebugView_SendMessage_Write(ex.ToString());
  666. }
  667. }
  668. // 프로젝트 저장시에 맵프로세스 파일을 자동 생성해준다
  669. private void Project_Save_MapProcess(string Receiver_Id)
  670. {
  671. // 맵연동 파일 생성용 전용 쿼리
  672. DataRowCollection DB_TABLE_MAPPROCESS = _Db.ExecuteRead_SqlDataAdapter(_Sql.MapProcessFile_Create(Receiver_Id));
  673. if (DB_TABLE_MAPPROCESS != null && DB_TABLE_MAPPROCESS.Count != 0)
  674. {
  675. // 맵연동설정파일 포맷
  676. // - 한개의 레코드 길이 : 40 Byte (개행문자 포함)
  677. // - 구분자 는 |
  678. // - 마지막에 개행문자 (CR/LF)
  679. // - 순서 : A.MAP_NO,A.MAP_TYPE (ASC)
  680. // 1. RECEIVER ID : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
  681. // 2. MAP NO. : 7 Bytes (7자리가 아닐 경우 왼쪽 0으로 채움) // cyim 2015.10.30 : 포맷변경 포함 5->7, 즉 2번째 Map no 가 7자리로 변경
  682. // 3. MAP TYPE : 1 Bytes (NULL일 경우 공백으로 채움)
  683. // 4. PROCESS TYPE : 1 Bytes (NULL일 경우 공백으로 채움)
  684. // 5. COMM. ID : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
  685. // 6. BOARD ID : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
  686. // 7. LOOP NO. : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
  687. // 8. REPEATER ID : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
  688. // 9. DEVICE ID : 3 Bytes (3자리가 아닐 경우 왼쪽 0으로 채움)
  689. // 10. IN/OUT TYPE : 1 Bytes (NULL일 경우 공백으로 채움)
  690. // 11. USE FLAG : 1 Bytes (NULL일 경우 공백으로 채움)
  691. // 12. CR/LF : 2 Bytes
  692. // ex) C 소스코드
  693. // // MAP DATA 구성
  694. // 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자리로 변경
  695. // nReceiverID,nMapNo,
  696. // (szMapType[0]!='\0'?szMapType[0]:' '),
  697. // (szProcessType[0]!='\0'?szProcessType[0]:' '),
  698. // nCommID,nBoardID,nLoopNo,nRepeaterID,nDeviceID,
  699. // (szInoutType[0]!='\0'?szInoutType[0]:' '),
  700. // (szUseFlag[0]!='\0'?szUseFlag[0]:' '));
  701. // ex) 001|0000001|I|D|001|001|000|002|001|I|Y| // cyim 2015.10.30 : 포맷변경 포함 5->7, 즉 2번째 Map no 가 7자리로 변경
  702. StringBuilder Contents = new StringBuilder();
  703. foreach (DataRow dr in DB_TABLE_MAPPROCESS)
  704. {
  705. if (dr[0].ToString().Length != 0 && dr[1].ToString().Length != 0 && dr[2].ToString().Length != 0 && dr[3].ToString().Length != 0
  706. && dr[4].ToString().Length != 0 && dr[5].ToString().Length != 0 && dr[6].ToString().Length != 0 && dr[7].ToString().Length != 0
  707. && dr[8].ToString().Length != 0 && dr[9].ToString().Length != 0 && dr[10].ToString().Length != 0)
  708. {
  709. // 데이타 추출 및 포맷 적용
  710. string RECEIVER_ID = Int32.Parse(dr["RECEIVER_ID"].ToString()).ToString("D3");
  711. // cyim 2016.04.01 : 6자리 혹은 4자리로 맵아이디와 그룹아이디 지정할수 있도록함
  712. string MAP_NO = "";
  713. if (_Data.Project_MapGroupIDTypeNumber == "6")
  714. MAP_NO = Int32.Parse(dr["MAP_NO"].ToString()).ToString("D7"); // cyim 2015.10.30 : 포맷변경 포함 5->7, 즉 2번째 Map no 가 7자리로 변경
  715. else
  716. MAP_NO = Int32.Parse(dr["MAP_NO"].ToString()).ToString("D5");
  717. string MAP_TYPE = dr["MAP_TYPE"].ToString();
  718. string PROCESS_TYPE = dr["PROCESS_TYPE"].ToString();
  719. string COMM_ID = Int32.Parse(dr["COMM_ID"].ToString()).ToString("D3");
  720. string BOARD_ID = Int32.Parse(dr["BOARD_ID"].ToString()).ToString("D3");
  721. string LOOP_NO = Int32.Parse(dr["LOOP_NO"].ToString()).ToString("D3");
  722. string REPEATER_ID = Int32.Parse(dr["REPEATER_ID"].ToString()).ToString("D3");
  723. string DEVICE_ID = Int32.Parse(dr["DEVICE_ID"].ToString()).ToString("D3");
  724. string INOUT_TYPE = dr["INOUT_TYPE"].ToString();
  725. string USE_FLAG = dr["USE_FLAG"].ToString();
  726. // 구분자 포함하여 레코드 단위 생성
  727. Contents.Append(
  728. RECEIVER_ID + "|" +
  729. MAP_NO + "|" +
  730. MAP_TYPE + "|" +
  731. PROCESS_TYPE + "|" +
  732. COMM_ID + "|" +
  733. BOARD_ID + "|" +
  734. LOOP_NO + "|" +
  735. REPEATER_ID + "|" +
  736. DEVICE_ID + "|" +
  737. INOUT_TYPE + "|" +
  738. USE_FLAG + "|"
  739. // + _Text.CarrageReturn // cyim 2016.03.29 : 통신데몬과 마차가지로 개행문자 삭제
  740. );
  741. }
  742. }
  743. ///
  744. /// 폴더생성 및 기본경로 지정
  745. ///
  746. // 수신기 폴더명
  747. string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + Receiver_Id;
  748. // 경로 지정
  749. string MapProcessFile_ProjectPath = _Data.Project_Path + "\\" + _Data.Project_Name + "\\" + ReiceiverFolderName;
  750. //
  751. // 파일생성
  752. //
  753. _Cfg.Create_Cfg(Contents.ToString(), MapProcessFile_ProjectPath + "\\" + _Text.DEFALUT_MAPPROCESS_FILENAME);
  754. }
  755. }
  756. }
  757. }