| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204 | 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;using System.Threading;namespace IControls_FireManager{    public partial class Frame_Tree : Form    {        // Device Tree 에서 사용자가 선택한 노드        public TreeNode SystemTree_SelectedNode;        // 수신기 를 표시하기 위한 델리게이트        delegate void TreeView_SetTextCallback(TreeNode pNode, _RECEIVER RECEIVER);        // 수신기 전체 삭제 여부 대화 팝업창         public Form Popup_ReceiverAllDelInform = new Form();        // 수신기 삭제 여부 대화 팝업창         public Form Popup_ReceiverDelInform = new Form();        // 페이지 전체 삭제 여부 대화 팝업창        public Form Popup_PageAllDelInform = new Form();        // 페이지 삭제 여부 대화 팝업창        public Form Popup_PageDelInform = new Form();        // 페이지 저장 여부 대화 팝업창        public Form Popup_PageSaveInform = new Form();        // 동기화 진행시 트리 노드에 접근하기 위한 델리게이트        delegate void TreeView_SyncXmlDataNodeCallback();        // 동기화 진행 여부 대화 팝업창         public Form Popup_XmlSyncStartInform = new Form();        // 동기화 진행시 진행 팝업창        public Form Popup_XmlSyncStartProgress = new Form();        public int Popup_XmlSyncStartProgress_Count = 0; // 카운트         public int Popup_XmlSyncStartProgress_Count_End = 3; // 최종카운트        // 디바이스 정보를 DB에 저장 시 진행팝업창        public Form Popup_DeviceIconSave_Progress = new Form();        public int Popup_DeviceIconSave_Progress_Count = 0; // 카운트         public int Popup_DeviceIconSave_Progress_Count_End = 0; // 최종카운트        // 프로젝트 -> 수신기 추가 -> 확인 버튼을 누르는 경우, 수신기 정보를 임시 저장하는 클래스        public _RECEIVER Temp_RECEIVER = new _RECEIVER();        // 맵디자이너에서 페이지 동기화 스레드        public Thread WorkingThread = null;        //        // 가변엑티브 레포트용 데이타        //        // 수신기 - 포인트 - 출력        string[] ColumnNames_Point_Output = _Convert.String_to_ArrayString(_Text.UI_WORKFRAME_POINT_OUTPUT_COLUMNNAME);        // 수신기 - 포인트 - 입력        string[] ColumnNames_Point_Input = _Convert.String_to_ArrayString(_Text.UI_WORKFRAME_POINT_INPUT_COLUMNNAME);        // 컬럼헤더         public Single temp = 1.51F; // 0.280             public Single temp2 = 1.11F;        public ArrayList Point_Input_ColumnHeader = new ArrayList();  // 1.728        public ArrayList Point_Output_ColumnHeader = new ArrayList();  // 1.728        // 화면캡쳐        public int Caputure_Process_Cnt = 0;        public string Capure_Receiver_ID = null;        public int Capture_Page_Index = 0;        public Form Capture_Warning = null;        // 생성자        public Frame_Tree()        {            ///            /// 초기화            ///             InitializeComponent();            ///            /// 이벤트            ///            // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)            this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing);            // 트리뷰에 페이지 노드를 생성 및 편집하기 위한 이벤트 등록            _Event.TreeView_PageNodeSet_SendMessage_Event += new _Event.TreeView_PageNodeSet_SendMessage_Handler(_Event_TreeView_PageNodeSet_SendMessage_Event);            // 트리 추가 이벤트 핸들러 등록            _Event.TreeView_ReceiverNodeSet_SendMessage_Event += new _Event.TreeView_ReceiverNodeSet_SendMessage_Handler(_Event_TreeView_ReceiverNodeSet_SendMessage_Event);            // 다른이름으로 페이지 명을 변경하여 저장하는 이벤트 핸들러 등록            _Event.Page_Rename_SendMessage_Event += new _Event.Page_Rename_SendMessage_Handler(_Event_Page_Rename_SendMessage_Event);            // 페이지 저장 (XML 및 DB 저장) 이벤트 핸들러 등록            _Event.Page_Save_SendMessage_Event += new _Event.Page_Save_SendMessage_Handler(_Event_Page_Save_SendMessage_Event);            // 트리뷰 초기화 이벤트 및 프로젝트 열기 혹은 새로만들기 겸용 핸들러 등록             _Event.TreeView_Clear_SendMessage_Event += new _Event.TreeView_Clear_SendMessage_Handler(_Event_TreeView_Clear_SendMessage_Event);            // 수신기 초기화 이벤트 핸들러 등록            _Event.Receiver_Clear_SendMessage_Event += new _Event.Receiver_Clear_SendMessage_Handler(_Event_Receiver_Clear_SendMessage_Event);            // 수신기 추가 및 편집 폼에서 작업 완료 이벤트 핸들러 등록            _Event.WorkViewPageName_Receiver_SendMessage_Event += new _Event.WorkViewPageName_Receiver_SendMessage_Handler(_Event_WorkViewPageName_Receiver_SendMessage_Event);            ///            /// UI 셋팅            ///            // 트리 초기화            this.treeView_SystemTree.Nodes.Clear();            // 가변레포트용 데이타            // 입력포인트            _ActiveReport.Print_Default_Column(Point_Input_ColumnHeader, ColumnNames_Point_Input[0], ColumnNames_Point_Input[0], 0.31F);            _ActiveReport.Print_Default_Column(Point_Input_ColumnHeader, ColumnNames_Point_Input[1], ColumnNames_Point_Input[1], temp2);            _ActiveReport.Print_Default_Column(Point_Input_ColumnHeader, ColumnNames_Point_Input[2], ColumnNames_Point_Input[2], temp2);            _ActiveReport.Print_Default_Column(Point_Input_ColumnHeader, ColumnNames_Point_Input[3], ColumnNames_Point_Input[3], temp2);            _ActiveReport.Print_Default_Column(Point_Input_ColumnHeader, ColumnNames_Point_Input[4], ColumnNames_Point_Input[4], temp2);            _ActiveReport.Print_Default_Column(Point_Input_ColumnHeader, ColumnNames_Point_Input[5], ColumnNames_Point_Input[5], temp2);            _ActiveReport.Print_Default_Column(Point_Input_ColumnHeader, ColumnNames_Point_Input[6], ColumnNames_Point_Input[6], temp2);            // 출력포인트            _ActiveReport.Print_Default_Column(Point_Output_ColumnHeader, ColumnNames_Point_Output[0], ColumnNames_Point_Output[0], 0.31F);            _ActiveReport.Print_Default_Column(Point_Output_ColumnHeader, ColumnNames_Point_Output[1], ColumnNames_Point_Output[1], temp);            _ActiveReport.Print_Default_Column(Point_Output_ColumnHeader, ColumnNames_Point_Output[2], ColumnNames_Point_Output[2], temp);            _ActiveReport.Print_Default_Column(Point_Output_ColumnHeader, ColumnNames_Point_Output[3], ColumnNames_Point_Output[3], temp);            _ActiveReport.Print_Default_Column(Point_Output_ColumnHeader, ColumnNames_Point_Output[4], ColumnNames_Point_Output[4], temp);        }        // _Receiver.xml 제거 : cyim 2012.8.29        /////        ///// Receiver XML 로 부터 읽은 값을 토대로 트리에 표시하기        /////        //private void treeView_Read_Receiver_XML()        //{        //    // 프로젝트명이 있는 경우에 한해서 트리를 자동으로 추가해주자        //    // 단, Receiver.xml 에 아무런 데이타가 없다면 표시할 의미가 없다        //    if (_Data.HASH_XMLRECEIVER.Count != 0)        //    {        //        foreach (string XMLRECEIVER_ID in _Data.LIST_XMLRECEIVER_ID)        //        {        //            _RECEIVER RECEIVER = new _RECEIVER();        //            // 수신기 아이디        //            RECEIVER.ID = ((_ReceiverXML)_Data.HASH_XMLRECEIVER[XMLRECEIVER_ID]).ID;        //            // 수신기 아이피        //            RECEIVER.IP = ((_ReceiverXML)_Data.HASH_XMLRECEIVER[XMLRECEIVER_ID]).IP;        //            // 수신기 이름        //            RECEIVER.KEY_NAME = ((_ReceiverXML)_Data.HASH_XMLRECEIVER[XMLRECEIVER_ID]).KEY_NAME;        //            // 해쉬에 추가         //            if (_Hash.Add(_Data.HASH_RECEIVER, RECEIVER.ID, RECEIVER) == true)        //            {        //                // 키리스트에 추가        //                _Data.LIST_RECEIVER_ID.Add(RECEIVER.ID);        //            }        //        }        //        // 파일 읽기에 사용한 정보는 클리어        //        _Data.LIST_XMLRECEIVER_ID.Clear();        //        _Data.HASH_XMLRECEIVER.Clear();        //        // 저장된 정보를 토대로 트리에 표시        //        foreach (string RECEIVER_ID in _Data.LIST_RECEIVER_ID)        //        {        //            // 수신기 노드 추가        //            _Event_TreeView_ReceiverNodeSet_SendMessage_Event((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]);        //        }        //        // 동기화 작업 시작        //        // 리스트 및 해쉬 삭제        //        _Data.LIST_PAGE_ID.Clear();        //        _Data.HASH_PAGE.Clear();        //        ///        //        /// 스레드 시작전에 첫번째 수신기의 그래픽 노드를 선택했다고 지정하자        //        ///         //        // 서브키를 조회하기 위해 임시로 클래스 생성        //        _RECEIVER tempRECEIVER = new _RECEIVER();        //        // 첫번째 수신기의 그래픽 노드 키값 조회        //        string temp_key = tempRECEIVER.Set_SubKey(((_RECEIVER)_Data.HASH_RECEIVER[_Data.LIST_RECEIVER_ID[0].ToString()]), _Text.UI_TREE_IMAGE);        //        // 해당 그래픽 노드 정보        //        TreeNode tempNode = _Tree.GetNode_By_Name(this.treeView_SystemTree, temp_key);        //        // 선택된 노드를 지정        //        SystemTree_SelectedNode = tempNode;        //        // 스레드 시작        //        Sync_Xml_Data_Thread(((_RECEIVER)_Data.HASH_RECEIVER[_Data.LIST_RECEIVER_ID[0].ToString()]));        //    }        //}        ///        /// Device Tree 노드의 마우스 클릭        ///         private void treeView_SystemTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)        {            // LOG            _Event.DebugView_SendMessage_Write(e.Node.Name + _Text.Minus + e.Node.Text + _Text.Blank + _Text.LOG_PushTreeNode);            // 오른쪽마우스를 누르면 왼쪽마우스 버튼을 누른것처럼 포커스를 이동한다             treeView_SystemTree.SelectedNode = treeView_SystemTree.GetNodeAt(e.X, e.Y);            // 선택한 트리 노드를 저장한다            SystemTree_SelectedNode = e.Node;            // 왼쪽마우스 혹은 오른쪽 마우스 버튼으로 노드를 선택하면 페이지가 출력된다            switch (e.Node.ImageIndex)            {                // 프로젝트                 case (int)Object_Type.PROJECT:                    _Event.WorkViewPageName_SendMessage_Write(null, Object_Type.PROJECT, null, null);                    break;                // 수신기                case (int)Object_Type.RECEIVER:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Name, Object_Type.RECEIVER, null, null);                    break;                // 수신기 - 입출력                case (int)Object_Type.INOUT:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Name, Object_Type.INOUT, null, null);                    break;                // 수신기 - 입출력 - 통신보드                case (int)Object_Type.COM_BOARD:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.COM_BOARD, null, null);                    break;                // 수신기 - 입출력 - IO보드                case (int)Object_Type.IO_BOARD:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.IO_BOARD, null, null);                    break;                // 수신기 - 입출력 - 키패드                 case (int)Object_Type.KEYPAD:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.KEYPAD, null, null);                    break;                // 수신기 -입출력 - 비상방송                case (int)Object_Type.EMERGENCY_BROADCAST:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.EMERGENCY_BROADCAST, null, null);                    break;                // 수신기 - 포인트                case (int)Object_Type.POINT:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Name, Object_Type.POINT, null, null);                    break;                // 수신기 - 포인트 - 입력                case (int)Object_Type.INPUT:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.INPUT, null, null);                    break;                // 수신기 - 포인트 - 출력                case (int)Object_Type.OUTPUT:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.OUTPUT, null, null);                    break;                // 수신기 - 연동                case (int)Object_Type.OPER:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Name, Object_Type.OPER, null, null);                    break;                // 수신기 - 연동 - 그룹                case (int)Object_Type.OPER_GROUP:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.OPER_GROUP, null, null);                    break;                // 수신기 - 연동 - 연동설정                case (int)Object_Type.OPER_SET:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.OPER_SET, null, null);                    break;                // 수신기 - 그래픽                case (int)Object_Type.IMAGE:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Name, Object_Type.IMAGE, null, null);                    break;                // 수신기 - 그래픽 - 페이지                case (int)Object_Type.PAGE:                    _Event.WorkViewPageName_SendMessage_Write(SystemTree_SelectedNode.Parent.Parent.Name, Object_Type.PAGE, SystemTree_SelectedNode.Name, SystemTree_SelectedNode.Text);                    break;            }            // 오른쪽마우스 버튼            if (e.Button == System.Windows.Forms.MouseButtons.Right)            {                switch (e.Node.ImageIndex)                {                    // 프로젝트를 선택하는 경우                     case (int)Object_Type.PROJECT:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.ReceiverAdd + ";" +                                _Text.ContextStripSeparator + ";" +                                _Text.TreeCollapse + ";" +                                _Text.TreeExpand + ";" +                                _Text.ContextStripSeparator + ";" +                                _Text.ReceiverAllDel + ";" +                                _Text.ContextStripSeparator + ";" + // cyim 2016.12.15 : 모바일앱용 사용자 관리                                _Text.UserEdit + ";" +                                _Text.ContextStripSeparator,                                //+ ";" + // 엑셀로부터 이벤트타입을 읽어오는 방법으로 수정하였으므로 필요없음                                //_Text.EventTypeCreate,                                Selected_Project_Menustrip_ItemClicked);                        }                        break;                    // 수신기를 선택하는 경우                     case (int)Object_Type.RECEIVER:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.ReceiverDel + ";" +                                _Text.ReceiverEdit,                                Selected_Receiver_Menustrip_ItemClicked);                        }                        break;                    // 수신기 입출력을  선택하는 경우                     case (int)Object_Type.INOUT:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.INOUTEdit,                                Selected_InOut_Menustrip_ItemClicked);                        }                        break;                    // 포인트를 선택하는 경우                    case (int)Object_Type.POINT:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.ExcelImport,                                Selected_Point_Menustrip_ItemClicked);                        }                        break;                    // 포인트중 입력을 선택하는 경우                    case (int)Object_Type.INPUT:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.PointInputReport + ";" +                                _Text.EmergencyEditor + ";" +                                _Text.OPCOperationData,                                Selected_Point_Menustrip_ItemClicked);                        }                        break;                    // 포인트중 출력을 선택하는 경우                    case (int)Object_Type.OUTPUT:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.PointOutputReport,                                Selected_Point_Menustrip_ItemClicked);                        }                        break;                    // 연동의 그룹을 선택하는 경우                    case (int)Object_Type.OPER_GROUP:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.ExcelImport + ";" +                                _Text.OperGroupReport,                                Selected_OperGroup_Menustrip_ItemClicked);                        }                        break;                    // 연동의 설정을 선택하는 경우                    case (int)Object_Type.OPER_SET:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.ExcelImport + ";" +                                _Text.OperSetReport + ";" +                                _Text.MapProcessFile,                                Selected_OperSet_Menustrip_ItemClicked);                        }                        break;                    // 그래픽을 선택하는 경우                     case (int)Object_Type.IMAGE:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.PageAdd + ";" +                                _Text.PageSave + ";" +                                _Text.PageSync + ";" +                                _Text.ContextStripSeparator + ";" +                                _Text.PageAllDel + ";" +                                _Text.ContextStripSeparator + ";" +                                _Text.PageReport,                                Selected_Image_Menustrip_ItemClicked);                        }                        break;                    // 페이지를 선택하는 경우                     case (int)Object_Type.PAGE:                        {                            // 팝업 메뉴 생성                            _Contextmenustrip.Create(this.treeView_SystemTree, e.Location,                                _Text.PageEdit + ";" +                                _Text.PageRename + ";" +                                _Text.ContextStripSeparator + ";" +                                _Text.PageDel,                                Selected_Page_Menustrip_ItemClicked);                        }                        break;                }            }        }        ///        /// 팝업 메뉴 선택        ///         // Root         public void Selected_Project_Menustrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)        {            // 수신기 전체 삭제            if (e.ClickedItem.Text == _Text.ReceiverAllDel)            {                // 수신기가 존재하는 경우에만                 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);                }            }            // 수신기 추가            else if (e.ClickedItem.Text == _Text.ReceiverAdd)            {                // 수신기 추가를 시도하는 경우 수신기 아이디의 값은 1이다                Form_Receiver_Add Receiver_Add = new Form_Receiver_Add(_Data.CREATE_RECEIVER_ID());                _Form.Create(Receiver_Add, null);            }            // 트리축소            else if (e.ClickedItem.Text == _Text.TreeCollapse)            {                this.treeView_SystemTree.CollapseAll();                this.treeView_SystemTree.Nodes[0].Expand();            }            // 트리확대            else if (e.ClickedItem.Text == _Text.TreeExpand)            {                this.treeView_SystemTree.ExpandAll();            }            // EVENT TYPE 생성            else if (e.ClickedItem.Text == _Text.EventTypeCreate)            {                Create_TB_EVENT_TYPE();            }            // 사용자관리 [모바일앱전용] // cyim 2016.12.15 : 모바일앱용 사용자 관리            else if (e.ClickedItem.Text == _Text.UserEdit)            {                Form_System_UserEdit System_UserEdit = new Form_System_UserEdit();                _Form.Create(System_UserEdit, null);            }        }        // 수신기 노드를 선택한 후 팝업창 출력후 메뉴 선택        public void Selected_Receiver_Menustrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)        {            // 수신기 삭제            if (e.ClickedItem.Text == _Text.ReceiverDel)            {                // 수신기가 존재하는 경우에만                 if (_Data.LIST_RECEIVER_ID.Count == 0)                {                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotReceiver, 0);                }                else                {                    Popup_ReceiverDelInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.Delete_Continue, 0);                    // 대화 팝업은 특별처리                    _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_ReceiverDel_PopupClose_SendMessage_Event);                }            }            // 수신기 수정            else if (e.ClickedItem.Text == _Text.ReceiverEdit)            {                // 장치검색 폼생성 (수정 모드)                Form_Receiver_Add Config_Device = new Form_Receiver_Add(Int32.Parse(SystemTree_SelectedNode.Name)); // 수신기 노드의 키값                 _Form.Create(Config_Device, null);            }        }        // 포인트 노드를 선택한 후 팝업창 출력후 메뉴 선택        public void Selected_Point_Menustrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)        {            // 엑셀연동            if (e.ClickedItem.Text == _Text.ExcelImport)            {                // 엑셀 연동 폼					                Form_PointConfig PointConfig = new Form_PointConfig(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]), SystemTree_SelectedNode.Text);                _Form.Create(PointConfig, null);            }            // 비상방송 편집            else if (e.ClickedItem.Text == _Text.EmergencyEditor)            {                // 비상방송 편집 폼 (기존 UI 는 그대로 두고 여기 폼에서 일괄적으로 삭제를 진행할 수 있도록 한다)                 _Data.MenuActivedForm = new Form_AddDevice_Emergency(SystemTree_SelectedNode.Parent.Parent.Name, "Emergency", "I");                _Form.Create(_Data.MenuActivedForm, null);            }            // 입력포인트 OPC 연동데이타 생성            else if (e.ClickedItem.Text == _Text.OPCOperationData)            {                // OPC 연동 데이터 생성 폼					                Form_PointOpcData PointOpcData = new Form_PointOpcData(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Parent.Name]));                _Form.Create(PointOpcData, null);            }            // 입력포인트 보고서            else if (e.ClickedItem.Text == _Text.PointInputReport)            {                // 레포트 폼생성                 if (_Data.ActiveReportViewer_Enable == false)                {                    // 테이블 생성                    DataSet DataSet_Point_Input = new DataSet();                    _Dataset.Create_Table(DataSet_Point_Input);                    _Dataset.Add_DataColumn(DataSet_Point_Input, ColumnNames_Point_Input, ColumnNames_Point_Input); // 키 정보와 UI 표시부는 동일하다                    // 매개변수 순서 => COMM_ID, INOUT_TYPE, BOARD_ID, LOOP_NO, REPEATER_ID, POSITION_CODE, DEVICE_TYPE_NAME, DEVICE_NAME                                   DataRowCollection DB_TABLE_DEVICE = ((_ImportPoint)_Data.Hash_ImportPoint[SystemTree_SelectedNode.Parent.Parent.Name]).IN_Points;                    // cyim 2016.04.01 : 입력 및 출력회로 정렬 기능                    ArrayList SortSupport = new ArrayList();                    // DataSet  내용을 수정한다                    for (int i = 0; i < DB_TABLE_DEVICE.Count; i++)                    {                        // 레코드 정보                        DataRow dr = DB_TABLE_DEVICE[i];                        if (_Convert.Exception_Into_object(dr[3], dr[4], dr[5], dr[6], dr[7]) == true)                        {                            // 매개변수 순서 => COMM_ID, BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID, INOUT_TYPE                            MskDeviceIDString dev_s = new MskDeviceIDString(                                _Convert.Null_to_IntZero(dr[3].ToString()),                                _Convert.Null_to_IntZero(dr[4].ToString()),                                _Convert.Null_to_IntZero(dr[5].ToString()),                                _Convert.Null_to_IntZero(dr[6].ToString()),                                _Convert.Null_to_IntZero(dr[7].ToString()),                                dr[8].ToString(), SystemTree_SelectedNode.Parent.Parent.Name); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경                            // cyim 2016.04.01 : 입력 및 출력회로 정렬 기능                            _OrderByCircuitNo OrderByCircuitNo = new _OrderByCircuitNo();                            OrderByCircuitNo.CircuitNo = dev_s.MskId;                            OrderByCircuitNo.Type = dr[0].ToString();                            OrderByCircuitNo.Location = dr[1].ToString();                            OrderByCircuitNo.DeviceNickName = dr[2].ToString();                            OrderByCircuitNo.EmergencyCode = dr[10].ToString() + "-" + dr[11].ToString() + "-" + dr[12].ToString();                            OrderByCircuitNo.XML = string.Format("MI{0:00}{1:00}{2:0}{3:000}{4}",                                Int32.Parse(SystemTree_SelectedNode.Parent.Parent.Name),                                _Convert.Null_to_IntZero(dr[4].ToString()),                                _Convert.Null_to_IntZero(dr[5].ToString()),                                _Convert.Null_to_IntZero(dr[6].ToString()),                                _Convert.Null_to_IntZero(dr[7].ToString()));                            SortSupport.Add(OrderByCircuitNo);                            //DataSet_Point_Input.Tables[0].Rows.Add(                            //    // No                            //    (i + 1).ToString(),                            //    // 회로번호                            //    dev_s.MskId,                            //    // 설비종류                            //    dr[0].ToString(),                            //    // 위치                            //    dr[1].ToString(),                            //    // 디바이스명칭                            //    dr[2].ToString(),                            //    // 비상방송                            //    dr[10].ToString() + "-" + dr[11].ToString() + "-" + dr[12].ToString()                            //    );                        }                    }                    // cyim 2016.04.01 : 입력 및 출력회로 정렬 기능                    SortSupport.Sort(_Data.Sort_CircuitNo);                    for (int i = 0; i < SortSupport.Count; i++)                    {                        _OrderByCircuitNo OrderByCircuitNo = (_OrderByCircuitNo)SortSupport[i];                        DataSet_Point_Input.Tables[0].Rows.Add(                            // No                            //string.Format("{0:d5}", (i + 1)),                            (i + 1),                            // 회로번호                            OrderByCircuitNo.CircuitNo,                            // 설비종류                            OrderByCircuitNo.Type,                            // 위치                            OrderByCircuitNo.Location,                            // 디바이스명칭                            OrderByCircuitNo.DeviceNickName,                            // 비상방송                            OrderByCircuitNo.EmergencyCode,                            // XML                            OrderByCircuitNo.XML                            );                    }                    // 레포트 생성                    Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer(                        // 레포트 타입                        ACTIVE_REPORT_DATA.VARIABLE_HEIGHT,                        // 실제데이타                        DataSet_Point_Input.Tables[0].Rows,                        // 컬럼데이타                        Point_Input_ColumnHeader,                        // 제목                        "입력 포인트 보고서",                        // 개요                        string.Format(" 수신기아이디 [ {0} ]  전체 [ {1}건 ]", SystemTree_SelectedNode.Parent.Parent.Name, DataSet_Point_Input.Tables[0].Rows.Count),                        // 컬럼높이                        0.21F,                        // 폰트사이즈                        8);                    _Form.Create(Report, null);                }                else                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0);            }            // 출력포인트 보고서            else if (e.ClickedItem.Text == _Text.PointOutputReport)            {                // 레포트 폼생성                 if (_Data.ActiveReportViewer_Enable == false)                {                    // 테이블 생성                    DataSet DataSet_Point_Output = new DataSet();                    _Dataset.Create_Table(DataSet_Point_Output);                    _Dataset.Add_DataColumn(DataSet_Point_Output, ColumnNames_Point_Output, ColumnNames_Point_Output); // 키 정보와 UI 표시부는 동일하다                    // 매개변수 순서 => COMM_ID, INOUT_TYPE, BOARD_ID, LOOP_NO, REPEATER_ID, POSITION_CODE, DEVICE_TYPE_NAME, DEVICE_NAME                                   DataRowCollection DB_TABLE_DEVICE = ((_ImportPoint)_Data.Hash_ImportPoint[SystemTree_SelectedNode.Parent.Parent.Name]).OUT_Points;                    // cyim 2016.04.01 : 입력 및 출력회로 정렬 기능                    ArrayList SortSupport = new ArrayList();                    // DataSet  내용을 수정한다                    for (int i = 0; i < DB_TABLE_DEVICE.Count; i++)                    {                        // 레코드 정보                        DataRow dr = DB_TABLE_DEVICE[i];                        if (_Convert.Exception_Into_object(dr[3], dr[4], dr[5], dr[6], dr[7]) == true)                        {                            // 매개변수 순서 => COMM_ID, BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID, INOUT_TYPE                            MskDeviceIDString dev_s = new MskDeviceIDString(                                _Convert.Null_to_IntZero(dr[3].ToString()),                                _Convert.Null_to_IntZero(dr[4].ToString()),                                _Convert.Null_to_IntZero(dr[5].ToString()),                                _Convert.Null_to_IntZero(dr[6].ToString()),                                _Convert.Null_to_IntZero(dr[7].ToString()),                                dr[8].ToString(), SystemTree_SelectedNode.Parent.Parent.Name); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경                            // cyim 2016.04.01 : 입력 및 출력회로 정렬 기능                            _OrderByCircuitNo OrderByCircuitNo = new _OrderByCircuitNo();                            OrderByCircuitNo.CircuitNo = dev_s.MskId;                            OrderByCircuitNo.Type = dr[0].ToString();                            OrderByCircuitNo.Location = dr[1].ToString();                            OrderByCircuitNo.DeviceNickName = dr[2].ToString();                            //_OrderByCircuitNo.EmergencyCode = dr[10].ToString() + "-" + dr[11].ToString() + "-" + dr[12].ToString();                            SortSupport.Add(OrderByCircuitNo);                            //DataSet_Point_Output.Tables[0].Rows.Add(                            //    // No                            //    (i + 1).ToString(),                            //    // 회로번호                            //    dev_s.MskId,                            //    // 설비종류                            //    dr[0].ToString(),                            //    // 위치                            //    dr[1].ToString(),                            //    // 디바이스명칭                            //    dr[2].ToString());                        }                    }                    // cyim 2016.04.01 : 입력 및 출력회로 정렬 기능                    SortSupport.Sort(_Data.Sort_CircuitNo);                    for (int i = 0; i < SortSupport.Count; i++)                    {                        _OrderByCircuitNo OrderByCircuitNo = (_OrderByCircuitNo)SortSupport[i];                        DataSet_Point_Output.Tables[0].Rows.Add(                            // No                            //string.Format("{0:d5}", (i + 1)),                            (i + 1),                            // 회로번호                            OrderByCircuitNo.CircuitNo,                            // 설비종류                            OrderByCircuitNo.Type,                            // 위치                            OrderByCircuitNo.Location,                            // 디바이스명칭                            OrderByCircuitNo.DeviceNickName                            // 비상방송                            //_OrderByCircuitNo.EmergencyCode                            );                    }                    // 레포트 생성                    Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer(                        // 레포트 타입                        ACTIVE_REPORT_DATA.VARIABLE_HEIGHT,                        // 실제데이타                        DataSet_Point_Output.Tables[0].Rows,                        // 컬럼데이타                        Point_Output_ColumnHeader,                        // 제목                        "출력 포인트 보고서",                        // 개요                        string.Format(" 수신기아이디 [ {0} ]  전체 [ {1}건 ]", SystemTree_SelectedNode.Parent.Parent.Name, DataSet_Point_Output.Tables[0].Rows.Count),                        // 컬럼높이                        0.21F,                        // 폰트사이즈                        8);                    _Form.Create(Report, null);                }                else                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0);            }        }        // 입출력 노드를 선택한 후 팝업창 출력후 메뉴 선택        public void Selected_InOut_Menustrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)        {            // 입출력 수정            if (e.ClickedItem.Text == _Text.INOUTEdit)            {                // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경                if (((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]).MODEL == "IFC3300")                {                    // 입출력 설정                    Form_Receiver_Port_BigReceiver Config_InOut_BigReceiver = new Form_Receiver_Port_BigReceiver(Int32.Parse(SystemTree_SelectedNode.Parent.Name)); // 입출력 노드의 부모 키값                     _Form.Create(Config_InOut_BigReceiver, null);                }                else                {                    // 입출력 설정                    Form_Receiver_Port Config_InOut = new Form_Receiver_Port(Int32.Parse(SystemTree_SelectedNode.Parent.Name)); // 입출력 노드의 부모 키값                     _Form.Create(Config_InOut, null);                }            }        }        // 그룹 노드를 선택한 후 팝업창 출력후 메뉴 선택        public void Selected_OperGroup_Menustrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)        {            if (e.ClickedItem.Text == _Text.ExcelImport) // 엑셀 Import            {                // 엑셀 연동 폼					                Form_PointConfig PointConfig = new Form_PointConfig(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Parent.Name]), SystemTree_SelectedNode.Text);                _Form.Create(PointConfig, null);            }            else if (e.ClickedItem.Text == _Text.OperGroupReport) // 그룹 보고서            {                // 레포트 폼생성                 if (_Data.ActiveReportViewer_Enable == false)                {                    //Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer(SystemTree_SelectedNode.Parent.Parent.Name, ACTIVE_REPORT_DATA.OPER_GROUP);                    //_Form.Create(Report, null);                    // 용량이 크면 화면이 멈춘것처럼 보이므로 팝업창을 출력함                    Form Temp = _Popup.Create(Popup_Type.ConfirmNoBtn, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.ReportReady, 0);                    this.Update();                    _ActiveReport.Create_ReportViewer_OperGroup(SystemTree_SelectedNode.Parent.Parent.Name);                    Temp.Close();                }                else                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0);            }        }        // 연동설정 노드를 선택한 후 팝업창 출력후 메뉴 선택        public void Selected_OperSet_Menustrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)        {            if (e.ClickedItem.Text == _Text.ExcelImport) // 엑셀 Import            {                // 엑셀 연동 폼					                Form_PointConfig PointConfig = new Form_PointConfig(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Parent.Name]), SystemTree_SelectedNode.Text);                _Form.Create(PointConfig, null);            }            else if (e.ClickedItem.Text == _Text.OperSetReport) // 연동설정 보고서            {                // 레포트 폼생성                                           if (_Data.ActiveReportViewer_Enable == false)                {                    //Form_ActiveReport_Viewer ActiveReportViewer = new Form_ActiveReport_Viewer(SystemTree_SelectedNode.Parent.Parent.Name, ACTIVE_REPORT_DATA.OPER_SET);                    //_Form.Create(ActiveReportViewer, null);                    // 용량이 크면 화면이 멈춘것처럼 보이므로 팝업창을 출력함                    Form Temp = _Popup.Create(Popup_Type.ConfirmNoBtn, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.ReportReady, 0);                    this.Update();                    _ActiveReport.Create_ReportViewer_OperSet(SystemTree_SelectedNode.Parent.Parent.Name);                    Temp.Close();                }                else                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0);            }            else if (e.ClickedItem.Text == _Text.MapProcessFile) // 연동 맵 파일 생성            {                //  연동 맵 파일 생성 폼					                Form_OperSetMapProcessFile OperSetMapProcessFile = new Form_OperSetMapProcessFile(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Parent.Name]));                _Form.Create(OperSetMapProcessFile, null);            }        }        // 이미지 노드 를 선택한 후 팝업창 출력후 메뉴 선택        public void Selected_Image_Menustrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)        {            // 이미지 추가            if (e.ClickedItem.Text == _Text.PageAdd)            {                ///                /// 맵디자이너                ///                // 신규 이미지 추가하는 경우에는 오로지 한개의 화면만 존재하면 된다                // 하지만 기존의 이미지를 편집하는 화면은 여러개의 화면이 존재할수 있다.                // 주의할점은 기존의 화면을 닫지않는 상태에서 화면으로 돌릴때 폼의 이름으로 포커스를 맞추므로 수동으로 폼 이름을 조절한다                string Form_MapDesigner_Name = "Form_MapDesigner_New";                // 신규 이미지 추가용 맵디자이너 화면이 켜져 있는 경우                if (_Form.CreatedForm.Contains(Form_MapDesigner_Name) == true)                {                    // 이벤트 알림                    _Event.PictrueEdit_NodeSeleted_SendMessage_Write(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]), null);                }                // 신규 이미지 추가용 맵디자이너 화면이 켜져 있지 않은 경우                else                {                    // 신규 생성 : 맵디자이너 폼생성 , 수신기 노드 및 그래픽 노드의 정보를 전달                     Form_MapDesigner MapDesigner = new Form_MapDesigner(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]).ID, null, null);                    MapDesigner.Name = Form_MapDesigner_Name;                    _Form.Create(MapDesigner, null);                }            }            // 모두 삭제            else if (e.ClickedItem.Text == _Text.PageAllDel)            {                string Form_MapDesigner_Name = "Form_MapDesigner_" + SystemTree_SelectedNode.Name;                // 맵디자이너 화면이 켜져 있는 경우                if (_Form.CreatedForm.Contains(Form_MapDesigner_Name) == true)                {                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.MapDesignerActive, 0);                }                else                {                    Popup_PageAllDelInform = _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_PageAllDel_PopupClose_SendMessage_Event);                }            }            // 동기화            // 삭제할지도 모름 -> 우선 적용해봄            else if (e.ClickedItem.Text == _Text.PageSync)            {                // 작업중인 페이지가 하나라도 있다면 경고창 팝업 생성                if (((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]).HASH_PAGE.Count != 0)                {                    Popup_XmlSyncStartInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 450, 150, _Text.XmlSyncStartInform, 0);                    // 대화 팝업은 특별처리                    _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_XmlSyncStart_PopupClose_SendMessage_Event);                }                else                {                    // 스레드 시작                    FieldSettingXml_Sync(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]));                }            }            // 페이지 저장            else if (e.ClickedItem.Text == _Text.PageSave)            {                if (((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]).HASH_PAGE.Count != 0)                {                    Popup_PageSaveInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 450, 150, _Text.PageSaveXmlDB, 0);                    // 대화 팝업은 특별처리                    _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_PageSaveXmlDB_PopupClose_SendMessage_Event);                }                else                {                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.PageNotInform, 0);                }            }            // 화면 설정 보고서            else if (e.ClickedItem.Text == _Text.PageReport)            {                if (_Data.Enable_Capture == false)                {                    _Data.Enable_Capture = true;                    // 화면 최대화                    _Event.Windows_MaxSize_SendMessage_Write();                    // 캡쳐 경고 팝업                    Capture_Warning = _Popup.Create(Popup_Type.ConfirmNoBtn, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.CaptureReady, 0);                    Capture_Warning.Location = new Point(this.Location.X, this.Location.Y); // 위치는 가장자리로 배치                    // 트리 누르지 못하도록 방지                    this.treeView_SystemTree.Enabled = false;                    // 타이머 동작하면서 화면캡쳐 시도                    Capure_Receiver_ID = SystemTree_SelectedNode.Parent.Name;                    Caputure_Process_Cnt = 0;                    Capture_Page_Index = 0;                    _Timer_WindowBase.Delete("CAPTURE_IMAGE");                    _Timer_WindowBase.Create("CAPTURE_IMAGE", 1000, CAPTURE_IMAGE_Tick, true);                }                else                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.CapturingNotAccess, 0);            }        }        // 특별처리        // 화면 캡쳐를 위해 타이머를 동작시킨다. 1초마다 번갈아가면서 화면을 선택한후, 캡쳐하는 방식이므로 조작은 금지하도록 유도한다        private void CAPTURE_IMAGE_Tick(object sender, EventArgs e)        {            // 카운터 증가            Caputure_Process_Cnt++;            // 페이지 정보 추출            _RECEIVER RECEIVER = (_RECEIVER)_Data.HASH_RECEIVER[Capure_Receiver_ID];            if (RECEIVER.LIST_PAGE_ID.Count == 0)            {                Capture_Warning.Close();                _Data.Enable_Capture = false;                _Timer_WindowBase.Delete("CAPTURE_IMAGE");                this.treeView_SystemTree.Enabled = true;                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, "캡쳐할 페이지가 없습니다.", 0);                return;            }            // 1초마다 번갈아가면서 페이지를 선택하고 캡쳐하는 것처럼 동작하게 한다            if (Caputure_Process_Cnt % 2 == 0)            {                // 화면 캡쳐                _Event.Capture_Save_SendMessage_Write(Capure_Receiver_ID, (string)RECEIVER.LIST_PAGE_ID[Capture_Page_Index]);                // 페이지 인덱스 증가 (화면 캡쳐 이후에야 인덱스가 증가된다)                Capture_Page_Index++;            }            else            {                // 자식노드 검색                                TreeNode temp_treenode = _Tree.GetNode_By_Name(this.treeView_SystemTree, (string)RECEIVER.LIST_PAGE_ID[Capture_Page_Index]);                // 화면 전환                _Event.WorkViewPageName_SendMessage_Write(Capure_Receiver_ID, Object_Type.PAGE, temp_treenode.Name, temp_treenode.Text);            }            // 만약 모든 페이지를 돌았다면            if (((_RECEIVER)_Data.HASH_RECEIVER[Capure_Receiver_ID]).LIST_PAGE_ID.Count * 2 <= Caputure_Process_Cnt)            {                // 초기화                Capture_Warning.Close();                _Data.Enable_Capture = false;                _Timer_WindowBase.Delete("CAPTURE_IMAGE");                // 트리 누르지 못하도록 방지 해제                this.treeView_SystemTree.Enabled = true;                Form Temp = _Popup.Create(Popup_Type.ConfirmNoBtn, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.ReportReady, 0);                this.Update();                _ActiveReport.Create_ReportViewer_Page(SystemTree_SelectedNode.Parent.Name);                Temp.Close();            }        }        // 디바이스 정보를 DB에 저장                private void DeviceIcon_Save(string RECEIVER_ID)        {            // 데이타베이스에 접속하지 못하면 사용못한다            if (_Db.OpenTest() == true)            {                // 작업량 예상                Popup_DeviceIconSave_Progress_Count_End = 0;                foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID)                    foreach (string ICON_ID in ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).LIST_ICON_ID)                        if (((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).HASH_ICON[ICON_ID]).ItemType == Item_Type.Device)                            Popup_DeviceIconSave_Progress_Count_End++;                // 카운터 초기화                Popup_DeviceIconSave_Progress_Count = 0;                // 진행 팝업창 생성                 _Data.Result_Text = _Text.CompleteInform; // 진행 결과 메세지                if (Popup_DeviceIconSave_Progress != null) Popup_DeviceIconSave_Progress.Close();                // 맵디자이너에서 페이지 저장시에 디바이스 아이콘이 없어도 완료 팝업창이 출력하도록 수정 ( +1 로 수정)                Popup_DeviceIconSave_Progress = _Popup.Create(Popup_Type.Progress, Popup_Style.Normal, _Text.OK, 250, 200, _Text.DataBaseSaveProgress, Popup_DeviceIconSave_Progress_Count_End + 1);                // 스레드 생성                WorkingThread = new Thread(new ParameterizedThreadStart(DeviceIcon_Save_Thread));                // 스레드시작                WorkingThread.Start(RECEIVER_ID);            }        }        // 디바이스 정보를 DB에 저장 스레드        private void DeviceIcon_Save_Thread(object pReceiver_ID)        {            string RECEIVER_ID = pReceiver_ID.ToString();            string Debug_Device_Ope_ID = null;            try            {                // 페이지별로 루틴이 실행된다                foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID)                {                    // 페이지 번호                    string JumpFiledID = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).ID;                    // 점프필드에는 널값이 들어가면 수신기UI 가 에러처리됨 - 2013.6.18                    JumpFiledID = _Data.Get_Verify_ID(JumpFiledID);                    _Page Page = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]);                    // 디바이스 아이콘을 추출해서 아이디를 가져온다                    foreach (string ICON_ID in Page.LIST_ICON_ID)                    {                        if (((_PictureBoxItem)Page.HASH_ICON[ICON_ID]).ItemType == Item_Type.Device)                        {                            _PictureBoxItem PictureBoxItem = ((_PictureBoxItem)Page.HASH_ICON[ICON_ID]);                            // 단, 디바이스 아이콘중 연동아이디가 없는 것은 무시                            if (PictureBoxItem != null                                && PictureBoxItem.Device_Oper_ID != null                                && PictureBoxItem.Device_Oper_ID.ToString().Length != 0)                            {                                // 디버깅 용도                                Debug_Device_Ope_ID = PictureBoxItem.Device_Oper_ID;                                // 아이디 예시 :MI-01-0-002-1                                 // 입출력                                 string InOut = PictureBoxItem.Device_Oper_ID[1].ToString(); // I 혹은 O                                // 수신기 ID : 1자리로 만들자                                string Receiver_ID = Page.Receiver_ID;                                // 통신보드 ID : 1자리로 만들자                                string ComBoard_ID = Int32.Parse(PictureBoxItem.Device_Oper_ID[3].ToString() + PictureBoxItem.Device_Oper_ID[4].ToString()).ToString();                                // 계통                                string Loop_No = PictureBoxItem.Device_Oper_ID[6].ToString();                                // 중계기 ID                                 string Repeater_ID = Int32.Parse(PictureBoxItem.Device_Oper_ID[8].ToString() + PictureBoxItem.Device_Oper_ID[9].ToString() + PictureBoxItem.Device_Oper_ID[10].ToString()).ToString();                                // 중계기 포트번호                                string Device_ID = PictureBoxItem.Device_Oper_ID[12].ToString();                                _Db.UPDATE("TB_DEVICE",                                    // Target Data                                    "RECEIVER_ID=" + Receiver_ID +                                    ";BOARD_ID=" + ComBoard_ID +                                    ";LOOP_NO=" + Loop_No +                                    ";REPEATER_ID=" + Repeater_ID +                                    ";DEVICE_ID=" + Device_ID +                                    ";INOUT_TYPE=" + InOut,                                    // Updata Data                                    "JUMP_FIELD_ID=" + JumpFiledID);                            }                            // 진행바 카운터가 증가한다                                                  _Event.ProgressPopupCount_SendMessage(Popup_DeviceIconSave_Progress, ++Popup_DeviceIconSave_Progress_Count);                        }                    }                }                // 저장하면 리스트에서 삭제                if (_Data.LIST_XmlDBNotSave_Receiver.Contains(RECEIVER_ID) == true)                    _Data.LIST_XmlDBNotSave_Receiver.Remove(RECEIVER_ID);                // 맵디자이너에서 페이지 저장시에 디바이스 아이콘이 없어도 완료 팝업창이 출력하도록 수정                // 즉, 완료후 마지막 카운터 증가 (스레드 시작전에 1개를 플러스 하였음)                _Event.ProgressPopupCount_SendMessage(Popup_DeviceIconSave_Progress, ++Popup_DeviceIconSave_Progress_Count);                // 저장하면 이벤트 발생                _Event.Receiver_PageSaveComplete_SendMessage_Write(RECEIVER_ID);            }            catch (Exception ex)            {                // LOG                                _Event.DebugView_SendMessage_Write(Debug_Device_Ope_ID + _Text.Blank + ex.ToString());                // 진행바 팝업창 종료                                                  _Data.Result_Text = _Text.FailInform;                _Event.ProgressPopupCount_SendMessage(Popup_DeviceIconSave_Progress, Popup_DeviceIconSave_Progress_Count_End);                // 스레드 중지                if (WorkingThread != null) WorkingThread.Abort();            }        }        // 수신기 전부 삭제 여부 팝업창 이벤트        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)            {                ReceiverAllDel();            }            // 대화 팝업은 특별처리            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_ReceiverAllDel_PopupClose_SendMessage_Event);        }        public void ReceiverAllDel()        {            //// 프로젝트명 임시 저장            //string temp = this.treeView_SystemTree.Nodes[0].Text;            //// 트리 삭제            //this.treeView_SystemTree.Nodes.Clear();            //// 트리에 기존의 프로젝트명은 그대로 표시한다            //_Tree.NodeAdd_Root(this.treeView_SystemTree, _Text.UI_TREE_ROOT_KEY, temp, Object_Type.PROJECT);            // 해쉬 및 리스트 초기화            _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.DB_FullPath = null;            // 프로세스 삭제            System.Diagnostics.Process[] mProcess = System.Diagnostics.Process.GetProcessesByName("fbserver");            foreach (System.Diagnostics.Process p in mProcess)                p.Kill();            System.Threading.Thread.Sleep(1000);            //            // 수신기 폴더 삭제            //            // 지정된 경로에 폴더 조회            string result = _File.Get_FolderNameList(_Data.Project_Path + "\\" + _Data.Project_Name);            if (result != null)            {                // 폴더리스트 생성                string[] FolderNames = _Convert.String_to_ArrayString(result);                // 폴더 삭제                foreach (string FolderName in FolderNames)                    if (FolderName != _Text.DEFALUT_FOLDER_TEMP) // 전체삭제시 Temp 폴더는 삭제하지 않는다                        _File.Delete_Folder(_Data.Project_Path, _Data.Project_Name + "\\" + FolderName);            }            // 수신기 파일 갱신            _File.Write_Receiver_XML(_Data.Project_Path + "\\" + _Data.Project_Name);            // 경로 재지정 (temp를 지운다)            _Data.DataBaseFilePath_Set(null);            // 데이타베이스에서 삭제            _Sql.Delete_Table("TB_BOARD", null);            _Sql.Delete_Table("TB_COMM", null);            _Sql.Delete_Table("TB_CONFIG", null);            _Sql.Delete_Table("TB_DEVICE", null);            _Sql.Delete_Table("TB_ANALOG_DEVICE_2", null);            _Sql.Delete_Table("TB_EMERGENCY_BROADCASTION", null);            _Sql.Delete_Table("TB_GROUP_DEVICE", null);            _Sql.Delete_Table("TB_MAP", null);            _Sql.Delete_Table("TB_MAP_PROCESS", null);            _Sql.Delete_Table("TB_GROUP", null);            _Sql.Delete_Table("TB_GROUP_DEVICE", null);            _Sql.Delete_Table("TB_RECEIVER", null);            _Sql.Delete_Table("TB_REPEATER", null);            _Sql.Delete_Table("TB_POSITION_CODE", null);// 전체 삭제의 경우 삭제해도 상관없음            //_Sql.Delete_Table("TB_DEVICE_TYPE", null);// -> RECEIVER_ID 없음 // 삭제하면 안됨 (어차피 기본값)            // 워크뷰에 알림            _Event.WorkView_Clear_SendMessage_Write();            _Event.TreeView_Clear_SendMessage_Write(_Data.Project_Name);        }        // 수신기 삭제 여부 팝업창 이벤트        public void _Event_ReceiverDel_PopupClose_SendMessage_Event(object sender, object etc)        {            // 대화 팝업 주체            Form popup = (Form)sender;            if (Popup_ReceiverAllDelInform.Name == popup.Name && etc.ToString() == _Text.OK)            {                // 리스트 및 해쉬에 반영                foreach (string RECEIVER_ID in _Data.LIST_RECEIVER_ID)                {                    if (SystemTree_SelectedNode.Name == RECEIVER_ID)                    {                        _Data.HASH_RECEIVER.Remove(SystemTree_SelectedNode.Name);                        _Data.LIST_RECEIVER_ID.Remove(SystemTree_SelectedNode.Name);                        _Data.LIST_XMLRECEIVER_ID.Remove(SystemTree_SelectedNode.Name);                        _Data.Hash_ImportPoint.Remove(SystemTree_SelectedNode.Name);                        // 경로 재지정 (temp를 지운다)                        _Data.DataBaseFilePath_Set(null);                        // 데이타베이스에서 삭제                        _Sql.Delete_Table("TB_BOARD", RECEIVER_ID);                        _Sql.Delete_Table("TB_COMM", RECEIVER_ID);                        _Sql.Delete_Table("TB_CONFIG", RECEIVER_ID);                        _Sql.Delete_Table("TB_DEVICE", RECEIVER_ID);                        _Sql.Delete_Table("TB_ANALOG_DEVICE_2", RECEIVER_ID);                        _Sql.Delete_Table("TB_EMERGENCY_BROADCASTION", RECEIVER_ID);                        _Sql.Delete_Table("TB_GROUP_DEVICE", RECEIVER_ID);                        _Sql.Delete_Table("TB_MAP", RECEIVER_ID);                        _Sql.Delete_Table("TB_MAP_PROCESS", RECEIVER_ID);                        _Sql.Delete_Table("TB_GROUP", RECEIVER_ID);                        _Sql.Delete_Table("TB_GROUP_DEVICE", RECEIVER_ID);                        _Sql.Delete_Table("TB_RECEIVER", RECEIVER_ID);                        _Sql.Delete_Table("TB_REPEATER", RECEIVER_ID);                        //_Sql.Delete_Table("TB_POSITION_CODE", RECEIVER_ID);// -> RECEIVER_ID 없음 // 삭제하면 안됨                         //_Sql.Delete_Table("TB_DEVICE_TYPE", RECEIVER_ID);// -> RECEIVER_ID 없음 // 삭제하면 안됨                        break;                    }                }                // 데이타베이스 경로 초기화                _Data.DB_FullPath = null;                // 프로세스 삭제                System.Diagnostics.Process[] mProcess = System.Diagnostics.Process.GetProcessesByName("fbserver");                foreach (System.Diagnostics.Process p in mProcess)                    p.Kill();                System.Threading.Thread.Sleep(1000);                // 수신기 폴더 삭제                string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + SystemTree_SelectedNode.Name;                _File.Delete_Folder(_Data.Project_Path, _Data.Project_Name + "\\" + ReiceiverFolderName);                // 수신기 파일 갱신                _File.Write_Receiver_XML(_Data.Project_Path + "\\" + _Data.Project_Name);                // 화면 전환                _Event.WorkViewPageName_SendMessage_Write(null, Object_Type.PROJECT, null, null);                // 트리에 반영                _Tree.DelNodeName_By_Name(this.treeView_SystemTree, SystemTree_SelectedNode.Name);            }            // 대화 팝업은 특별처리            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_ReceiverDel_PopupClose_SendMessage_Event);        }        // 페이지 전부 삭제 여부 팝업창 이벤트        public void _Event_PageAllDel_PopupClose_SendMessage_Event(object sender, object etc)        {            // 대화 팝업 주체            Form popup = (Form)sender;            if (Popup_PageAllDelInform.Name == popup.Name && etc.ToString() == _Text.OK)            {                // 반드시 한단계 위에 수신기 노드가 있다                string Temp_Receiver_ID = SystemTree_SelectedNode.Parent.Name;                // 무조건 편집 혹은 새로만들기의 경우 차후 저장을 위해 셋팅                if (_Data.LIST_XmlDBNotSave_Receiver.Contains(Temp_Receiver_ID) == false)                    _Data.LIST_XmlDBNotSave_Receiver.Add(Temp_Receiver_ID);                // 트리에서 전부 삭제                foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[Temp_Receiver_ID]).LIST_PAGE_ID)                    _Tree.DelNodeName_By_Name_Check_ReceiverID(this.treeView_SystemTree, ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[Temp_Receiver_ID]).HASH_PAGE[PAGE_ID]).NodeKey, Temp_Receiver_ID);                // 리스트 및 해쉬 삭제                ((_RECEIVER)_Data.HASH_RECEIVER[Temp_Receiver_ID]).LIST_PAGE_ID.Clear();                ((_RECEIVER)_Data.HASH_RECEIVER[Temp_Receiver_ID]).HASH_PAGE.Clear();                // FieldSetting.xml 초기화                // 수신기 폴더명                string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + Temp_Receiver_ID;                // 경로 지정                string Default_Xml_FullPath = _Data.Project_Path + "\\" + _Data.Project_Name + "\\" + ReiceiverFolderName + "\\" + _Text.DEFAULT_FOLDER_MAPVIEW + "\\" + _Text.DEFAULT_FOLDER_XML;                // 기본 내용으로 변경 (FieldSetting_XML)                _File.Write_FieldSetting_XML(Temp_Receiver_ID, Default_Xml_FullPath);                // 화면 전환                _Event.WorkViewPageName_SendMessage_Write(Temp_Receiver_ID, Object_Type.IMAGE, null, null);            }            // 대화 팝업은 특별처리            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_PageAllDel_PopupClose_SendMessage_Event);        }        // 동기화를 진행하려는 경우 작업중인 페이지가 있다고 경고창을 생성하고 난후에 확인 버튼을 누를때 발생하는 이벤트        public void _Event_XmlSyncStart_PopupClose_SendMessage_Event(object sender, object etc)        {            // 대화 팝업 주체            Form popup = (Form)sender;            if (Popup_XmlSyncStartInform.Name == popup.Name && etc.ToString() == _Text.OK)            {                ///                /// 페이지 노드를 삭제한다                ///                // 트리에서 전부 삭제                foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).LIST_PAGE_ID)                    _Tree.DelNodeName_By_Name_Check_ReceiverID(this.treeView_SystemTree, ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).HASH_PAGE[PAGE_ID]).NodeKey, Temp_RECEIVER.ID);                // 리스트 및 해쉬 삭제                ((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).LIST_PAGE_ID.Clear();                ((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).HASH_PAGE.Clear();                // 스레드 시작                FieldSettingXml_Sync(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]));            }            // 대화 팝업은 특별처리            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_XmlSyncStart_PopupClose_SendMessage_Event);        }        // 페이지저장 (XML 및 DB 저장) 이벤트        public void _Event_PageSaveXmlDB_PopupClose_SendMessage_Event(object sender, object etc)        {            // 대화 팝업 주체            Form popup = (Form)sender;            if (Popup_PageSaveInform.Name == popup.Name && etc.ToString() == _Text.OK)            {                // 밑에 코드 삭제 - cyim 무조건 저장루틴을 타도록 만듬 2013.7.4                //// 컬렉션 개체의 복사본으로 돌린다                //ArrayList Temp_LIST_XmlDBNotSave_Receiver = new ArrayList();                //object Temp=_Data.LIST_XmlDBNotSave_Receiver.Clone();                //Temp_LIST_XmlDBNotSave_Receiver = (ArrayList)Temp;                 //foreach (string RECEIVER_ID in Temp_LIST_XmlDBNotSave_Receiver)                _Event_Page_Save_SendMessage_Event(SystemTree_SelectedNode.Parent.Name);            }            // 대화 팝업은 특별처리            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_PageSaveXmlDB_PopupClose_SendMessage_Event);        }        public void _Event_Page_Save_SendMessage_Event(string RECEIVER_ID)        {            ///            /// FieldSetting.xml 쓰기            ///            // 맵디자이너 XML 데이터 저장            // 현재 DevType.xml 데이터는 오로지 읽기 전용이며            // FieldSetting.xml 데이터는 쓰기 전용이다            // 수신기 폴더명            //string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + ((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Name]).ID;            string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).ID;            _File.Write_FieldSetting_XML(RECEIVER_ID, _Data.Project_Path + "\\" + _Data.Project_Name + "\\" + ReiceiverFolderName + "\\" + _Text.DEFAULT_FOLDER_MAPVIEW + "\\" + _Text.DEFAULT_FOLDER_XML);            ///            /// Receiver.xml 쓰기 (임시-오후 2:25 2012-08-23)             ///            //_File.Write_Receiver_XML(_Data.Project_Path + "\\" + _Data.Project_Name);            ///            /// TB_DEVICE -> 디바이스 아이콘이 속해져있는 페이지 번호 아이디를 JumpFieldID 로 치환하여 수정함            ///            DeviceIcon_Save(RECEIVER_ID);            // LOG            _Event.DebugView_SendMessage_Write(_Text.SaveFieldSettingInform);        }        ///         /// 초기화        ///         public void _Event_TreeView_Clear_SendMessage_Event(string ProjectName)        {            // 트리 초기화            this.treeView_SystemTree.Nodes.Clear();            // 프로젝트명이 없다면 프로젝트 삭제            if (ProjectName != null)                _Tree.NodeAdd_Root(this.treeView_SystemTree, _Text.UI_TREE_ROOT_KEY, ProjectName, Object_Type.PROJECT);        }        public void _Event_Receiver_Clear_SendMessage_Event()        {            ReceiverAllDel();        }        //        // 수신기 모델명 변경        //        // cyim 2016.12.05 : 트리뷰에 수신기 모델 표시         delegate void CallBack_DataApplytoGridex_Receiver_Set(string RECEIVER_ID);        public void _Event_WorkViewPageName_Receiver_SendMessage_Event(string RECEIVER_ID)        {            if (this.InvokeRequired)            {                CallBack_DataApplytoGridex_Receiver_Set d = new CallBack_DataApplytoGridex_Receiver_Set(_Event_WorkViewPageName_Receiver_SendMessage_Event);                this.Invoke(d, new object[] { RECEIVER_ID });            }            else            {                _RECEIVER RECEIVER = (_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID];                _Tree.SetNodeText_By_Name(this.treeView_SystemTree, RECEIVER.ID, RECEIVER.KEY_NAME);            }        }        ///         /// 동기화        ///         // 파일을 읽는 스레드        public void FieldSettingXml_Sync(_RECEIVER RECEIVER)        {            try            {                // 수신기 폴더명                string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + RECEIVER.ID;                // 경로                string Default_Xml_FullPath = _Data.Project_Path + "\\" + _Data.Project_Name + "\\" + ReiceiverFolderName + "\\" + _Text.DEFAULT_FOLDER_MAPVIEW + "\\" + _Text.DEFAULT_FOLDER_XML;                // 파일 읽기                ArrayList Result = _File.Read_FieldSetting_XML(Default_Xml_FullPath);                // 임시로 현재 추가하는 수신기 정보를 저장하고 스레드를 실행시킨다                Temp_RECEIVER = RECEIVER;                // 파일이 없거나 페이지 정보가 없다면 사용못한다                if (Result != null && Result.Count != 0)                {                    // 현재 생성중인 맵디자이너 창을 닫는다                    _Event.MapDesigner_Close_SendMessage_Write();                    // 트리에서 전부 삭제                    foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).LIST_PAGE_ID)                        _Tree.DelNodeName_By_Name_Check_ReceiverID(this.treeView_SystemTree, ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).HASH_PAGE[PAGE_ID]).NodeKey, RECEIVER.ID);                    // 작업량 예상                    Popup_XmlSyncStartProgress_Count_End = 0;                    foreach (_FieldSetting FieldSetting in Result)                    {                        // 페이지수                        Popup_XmlSyncStartProgress_Count_End++;                        // 버튼 아이콘                        foreach (_FieldSetting_Button FieldSetting_Button in FieldSetting.Button)                            Popup_XmlSyncStartProgress_Count_End++;                        // 디바이스 아이콘                        foreach (_FieldSetting_Device FieldSetting_Device in FieldSetting.Device)                            Popup_XmlSyncStartProgress_Count_End++;                    }                    // 카운터 초기화                    Popup_XmlSyncStartProgress_Count = 0;                    // 진행 팝업창 생성                     _Data.Result_Text = _Text.CompleteInform; // 진행 결과 메세지                    if (Popup_XmlSyncStartProgress != null) Popup_XmlSyncStartProgress.Close();                    Popup_XmlSyncStartProgress = _Popup.Create(Popup_Type.Progress, Popup_Style.Normal, _Text.OK, 250, 200, _Text.XmlSyncProgress, Popup_XmlSyncStartProgress_Count_End);                    // 스레드 생성                    Thread WorkingThread = new Thread(new ParameterizedThreadStart(FieldSettingXml_Sync_Thread));                    // 스레드시작                    WorkingThread.Start(Result);                }                else                {                    // 수신기 추가를 완료하였습니다!                    _Event.Receiver_NodeAddComplete_SendMessage_Write(RECEIVER.ID);                }            }            catch (Exception ex)            {                // LOG                                _Event.DebugView_SendMessage_Write(ex.ToString());                // 스레드 중지                if (WorkingThread != null) WorkingThread.Abort();                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 450, 150, _Text.XmlSyncFileNotInform, 0);            }        }        // 동기화 진행 스레드        public void FieldSettingXml_Sync_Thread(object result)        {            Form_MapDesigner Temp_MapDesigner = null;            try            {                // 수신기 폴더명                string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + Temp_RECEIVER.ID;                // 경로 지정                string Default_Xml_FullPath = _Data.Project_Path + "\\" + _Data.Project_Name + "\\" + ReiceiverFolderName + "\\" + _Text.DEFAULT_FOLDER_MAPVIEW + "\\" + _Text.DEFAULT_FOLDER_XML;                string Default_Field_FullPath = _Data.Project_Path + "\\" + _Data.Project_Name + "\\" + ReiceiverFolderName + "\\" + _Text.DEFAULT_FOLDER_MAPVIEW + "\\" + _Text.DEFAULT_FOLDER_FIELD;                string Default_Symbol_FullPath = _Data.Project_Path + "\\" + _Data.Project_Name + "\\" + ReiceiverFolderName + "\\" + _Text.DEFAULT_FOLDER_MAPVIEW + "\\" + _Text.DEFAULT_FOLDER_SYMBOL;                // 파일 읽기                //ArrayList Result = _File.Read_FieldSetting_XML(Default_Xml_FullPath);                ArrayList Result = (ArrayList)result;                // 리스트 및 해쉬 삭제                ((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).HASH_PAGE.Clear();                ((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).LIST_PAGE_ID.Clear();                // 리스트 및 해쉬에 반영                foreach (_FieldSetting FieldSetting in Result)                {                    _Page Page = new _Page();                    // 페이지 아이디                    Page.ID = FieldSetting.ID;                    // 페이지 이름                    Page.NodeKey = _Data.CREATE_PAGE_ID(Temp_RECEIVER.ID, FieldSetting.Name);// Temp_RECEIVER.ID + _Text.Minus + FieldSetting.Name;                    Page.NodeText = FieldSetting.Name;                    // 관할 수신기 아이디                    Page.Receiver_ID = FieldSetting.Receiver_ID;                    // 배경그림을 저장하기 위해서 임시 맵디자이너 클래스 생성                    Temp_MapDesigner = new Form_MapDesigner(Page.Receiver_ID, null, null);                    // 배경그림                    Page.PictureBoxItem_BackGround = Temp_MapDesigner.UI_Create_PictureBoxItem(                        null,                        Item_Type.BackGround,                        Default_Field_FullPath + "\\" + FieldSetting.IMAGE,                        FieldSetting.IMAGE,                        Page.NodeKey,                        0, 0);                    // 진행바 카운터가 증가한다                                          _Event.ProgressPopupCount_SendMessage(Popup_XmlSyncStartProgress, ++Popup_XmlSyncStartProgress_Count);                    if (Page.PictureBoxItem_BackGround != null)                    {                        // 아이콘 번호                        int ICON_ID_Order = 0;                        // 버튼 아이콘                        foreach (_FieldSetting_Button FieldSetting_Button in FieldSetting.Button)                        {                            _PictureBoxItem PictureBoxItem = new _PictureBoxItem();                            // 버튼의 경우 순번이 B자가 붙어서 시작한다. 제거한다                            //string Icon_ID = FieldSetting_Button.ID.Remove(0,1);// 특별히 XML 문서에서 버튼 아이디를 그대로 사용하지않고 순번으로 치환해서 사용해야함                            string Icon_ID = ICON_ID_Order++.ToString();                            // 픽쳐박스 생성                            PictureBoxItem = Temp_MapDesigner.UI_Create_PictureBoxItem(                                Page.PictureBoxItem_BackGround,                                Item_Type.Button,                                Default_Field_FullPath + "\\" + FieldSetting_Button.Image,                                FieldSetting_Button.Image,                                Icon_ID,                                Int32.Parse(FieldSetting_Button.Xposition),                                Int32.Parse(FieldSetting_Button.Yposition));                            if (PictureBoxItem != null)                            {                                ///                                 /// 동적 할당 변수 처리                                ///                                 // 버튼의 경우 일단 사이즈가 XML 우선시 한다                                //PictureBoxItem.Width = Int32.Parse(FieldSetting_Button.Width);                                //PictureBoxItem.Height = Int32.Parse(FieldSetting_Button.Height);                                // 점프페이지 (페이지 아이디를 이름으로 대체한다)                                                    PictureBoxItem.Button_JumpPageName = _File.Read_Page_ID_Order(Result, FieldSetting_Button.JumpField);                                // 리스트 추가                                Page.LIST_ICON_ID.Add(Icon_ID);                                // 해쉬 추가                                Page.HASH_ICON.Add(Icon_ID, PictureBoxItem);                            }                            else                            {                                // LOG                                                _Event.DebugView_SendMessage_Write(_Text.FieldSettingXmlFailInform + _Text.LeftBracket + FieldSetting.IMAGE + ":" + FieldSetting_Button.Image + ":" + FieldSetting_Button.ID + ":" + FieldSetting_Button.NAME + _Text.RightBracket);                            }                            // 진행바 카운터가 증가한다                                                  _Event.ProgressPopupCount_SendMessage(Popup_XmlSyncStartProgress, ++Popup_XmlSyncStartProgress_Count);                        }                        // 디바이스 아이콘                        foreach (_FieldSetting_Device FieldSetting_Device in FieldSetting.Device)                        {                            _PictureBoxItem PictureBoxItem = new _PictureBoxItem();                            // 실제 디바이스 아이콘의 파일이름                            string TempFileName = ((_DevTypeXML)_File.Read_DevType_FileName_by_IconID(FieldSetting_Device.DevIconID)).FILENAME;                            if (TempFileName != null)                            {                                string Icon_ID = ICON_ID_Order++.ToString();                                // 픽쳐박스 생성                                PictureBoxItem = Temp_MapDesigner.UI_Create_PictureBoxItem(                                    Page.PictureBoxItem_BackGround,                                    Item_Type.Device,                                    Default_Symbol_FullPath + "\\" + TempFileName,                                    TempFileName,                                    Icon_ID,                                    Int32.Parse(FieldSetting_Device.Xposition),                                    Int32.Parse(FieldSetting_Device.Yposition));                                if (PictureBoxItem != null)                                {                                    ///                                     /// 동적 할당 변수 처리                                    ///                                     // 디바이스 연동 회로 번호 (포맷에 맞게 변환한다)                                                            PictureBoxItem.Device_Oper_ID = _File.Read_Device_Oper_ID(FieldSetting_Device.ID);                                    // 데이타베이스로 부터 디바이스 명칭을 불러온다                                    MskDeviceIDString device_id = new MskDeviceIDString(PictureBoxItem.Device_Oper_ID, Page.Receiver_ID); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경                                    DataRowCollection DB_TABLE_DEVICE =                                        _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchDeviceName_Table_Value("TB_DEVICE",                                            "RECEIVER_ID", Page.Receiver_ID,                                            "COMM_ID", device_id.Comm_id,                                            "BOARD_ID", device_id.Board_id,                                            "LOOP_NO", device_id.Loop_no,                                            "REPEATER_ID", device_id.Repeater_id,                                            "DEVICE_ID", device_id.Device_id,                                            "INOUT_TYPE", device_id.Inout_type,                                            Page.Receiver_ID));                                    if (DB_TABLE_DEVICE != null)                                    {                                        foreach (DataRow dr in DB_TABLE_DEVICE)                                        {                                            PictureBoxItem.Device_DB_Name = dr[0].ToString();                                        }                                    }                                    // 리스트 추가                                    Page.LIST_ICON_ID.Add(Icon_ID);                                    // 해쉬 추가                                    Page.HASH_ICON.Add(Icon_ID, PictureBoxItem);                                }                            }                            else                            {                                // LOG                                                _Event.DebugView_SendMessage_Write(_Text.FieldSettingXmlFailInform + _Text.LeftBracket + FieldSetting.IMAGE + ":" + FieldSetting_Device.DevIconID + ":" + FieldSetting_Device.ID + _Text.RightBracket);                            }                            // 진행바 카운터가 증가한다                                                  _Event.ProgressPopupCount_SendMessage(Popup_XmlSyncStartProgress, ++Popup_XmlSyncStartProgress_Count);                        }                        // 해쉬 추가                        if (_Hash.Add(((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).HASH_PAGE, Page.NodeKey, Page) == true)                        {                            ((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).LIST_PAGE_ID.Add(Page.NodeKey);                        }                        // 임시로 사용한 맵디자이너는 삭제                        Temp_MapDesigner.Close();                    }                    else                    {                        // LOG                                        _Event.DebugView_SendMessage_Write(_Text.FieldSettingXmlFailInform + _Text.LeftBracket + FieldSetting.IMAGE + _Text.RightBracket);                        // 임시로 사용한 맵디자이너는 삭제                        if (Temp_MapDesigner != null) Temp_MapDesigner.Close();                        // 진행바 팝업창 종료                                                          _Data.Result_Text = _Text.FailInform;                        _Event.ProgressPopupCount_SendMessage(Popup_XmlSyncStartProgress, Popup_XmlSyncStartProgress_Count_End);                        // 스레드 중지                        if (WorkingThread != null) WorkingThread.Abort();                    }                }                // 스레드 완료후 최종 함수                FieldSettingXml_Sync_Thread_Complete();            }            catch (Exception ex)            {                // LOG                                _Event.DebugView_SendMessage_Write(ex.ToString());                // 임시로 사용한 맵디자이너는 삭제                if (Temp_MapDesigner != null) Temp_MapDesigner.Close();                // 진행바 팝업창 종료                                                  _Data.Result_Text = _Text.FailInform;                _Event.ProgressPopupCount_SendMessage(Popup_XmlSyncStartProgress, Popup_XmlSyncStartProgress_Count_End);                // 스레드 중지                if (WorkingThread != null) WorkingThread.Abort();            }        }        // 스레드 종료직전 호출되는 함수        private void FieldSettingXml_Sync_Thread_Complete()        {            if (this.treeView_SystemTree.InvokeRequired)            {                TreeView_SyncXmlDataNodeCallback d = new TreeView_SyncXmlDataNodeCallback(FieldSettingXml_Sync_Thread_Complete);                this.treeView_SystemTree.Invoke(d, new object[] { });            }            else            {                // 생성된 리스트와 해쉬테이블을 토대로 트리에 반영                foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).LIST_PAGE_ID)                {                    // 해당 수신기 노드 정보                    TreeNode ReceiverNode = _Tree.GetNode_By_Name(this.treeView_SystemTree, Temp_RECEIVER.ID);                    // 해당 그래픽 노드 키정보 가져옴                    string temp_key = Temp_RECEIVER.Set_SubKey(Temp_RECEIVER, _Text.UI_TREE_IMAGE);                    TreeNode ImageNode = _Tree.GetNode_By_Name(this.treeView_SystemTree, temp_key);                    string Temp_NodeKey = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).HASH_PAGE[PAGE_ID]).NodeKey;                    string Temp_NodeText = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[Temp_RECEIVER.ID]).HASH_PAGE[PAGE_ID]).NodeText;                    // 그래픽 노드 밑에 페이지 노드를 추가한다                     _Tree.NodeAdd_Root_Node_Node_Node(this.treeView_SystemTree, 0, ReceiverNode.Index, ImageNode.Index, Temp_NodeKey, Temp_NodeText, Object_Type.PAGE);                    // 그래픽 노드 모두 펼침                    ImageNode.Expand();                }                // 수신기 추가를 완료하였습니다!                _Event.Receiver_NodeAddComplete_SendMessage_Write(Temp_RECEIVER.ID);            }        }        // 페이지 노드를 선택한 후 팝업창 출력후 메뉴선택        public void Selected_Page_Menustrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)        {            // 페이지 삭제            if (e.ClickedItem.Text == _Text.PageDel)            {                string Form_MapDesigner_Name = "Form_MapDesigner_" + SystemTree_SelectedNode.Name;                // 맵디자이너 화면이 켜져 있는 경우                if (_Form.CreatedForm.Contains(Form_MapDesigner_Name) == true)                {                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.MapDesignerActive, 0);                }                else                {                    Popup_PageDelInform = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 350, 150, _Text.PageDelDataInform, 0);                    // 대화 팝업은 특별처리                    _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageDelInform_SendMessage_Event);                }            }            // 페이지 수정            else if (e.ClickedItem.Text == _Text.PageEdit)            {                // 신규 이미지 추가하는 경우에는 오로지 한개의 화면만 존재하면 된다                // 하지만 기존의 이미지를 편집하는 화면은 여러개의 화면이 존재할수 있다.                // 주의할점은 기존의 화면을 닫지않는 상태에서 화면으로 돌릴때 폼의 이름으로 포커스를 맞추므로 수동으로 폼 이름을 조절한다                string Form_MapDesigner_Name = "Form_MapDesigner_" + SystemTree_SelectedNode.Name;                // 맵디자이너 화면이 켜져 있는 경우                if (_Form.CreatedForm.Contains(Form_MapDesigner_Name) == true)                {                    // 이벤트 알림                    _Event.PictrueEdit_NodeSeleted_SendMessage_Write(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Parent.Name]), SystemTree_SelectedNode.Name);                }                else                {                    // 신규 생성 : 맵디자이너 폼생성 , 수신기 노드 및 그래픽 노드의 정보를 전달                     Form_MapDesigner MapDesigner = new Form_MapDesigner(((_RECEIVER)_Data.HASH_RECEIVER[SystemTree_SelectedNode.Parent.Parent.Name]).ID, SystemTree_SelectedNode.Name, SystemTree_SelectedNode.Text);                    MapDesigner.Name = Form_MapDesigner_Name;                    _Form.Create(MapDesigner, null);                }            }            // 이름 변경            else if (e.ClickedItem.Text == _Text.PageRename)            {                string Form_MapDesigner_Name = "Form_MapDesigner_" + SystemTree_SelectedNode.Name;                // 맵디자이너 화면이 켜져 있는 경우                if (_Form.CreatedForm.Contains(Form_MapDesigner_Name) == true)                {                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.MapDesignerActive, 0);                }                else                {                    Form Page_Rename = new Form_MapDesigner_Rename(SystemTree_SelectedNode.Parent.Parent.Name, SystemTree_SelectedNode.Name, SystemTree_SelectedNode.Text);                    _Form.Create(Page_Rename, null);                }            }        }        // 페이지 삭제 여부 팝업창 이벤트        public void _Event_Popup_PageDelInform_SendMessage_Event(object sender, object etc)        {            // 대화 팝업 주체            Form popup = (Form)sender;            if (Popup_PageDelInform == popup && etc.ToString() == _Text.OK)            {                // 페이지 삭제는 반드시 두단계 위에 수신기 노드가 있다                string Temp_Receiver_ID = SystemTree_SelectedNode.Parent.Parent.Name;                // 트리에 반영                _Tree.DelNodeName_By_Name_Check_ReceiverID(this.treeView_SystemTree, SystemTree_SelectedNode.Name, SystemTree_SelectedNode.Parent.Parent.Name);                // 리스트 및 해쉬에 반영                foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[Temp_Receiver_ID]).LIST_PAGE_ID)                {                    if (SystemTree_SelectedNode.Name == PAGE_ID)                    {                        ((_RECEIVER)_Data.HASH_RECEIVER[Temp_Receiver_ID]).HASH_PAGE.Remove(SystemTree_SelectedNode.Name);                        ((_RECEIVER)_Data.HASH_RECEIVER[Temp_Receiver_ID]).LIST_PAGE_ID.Remove(SystemTree_SelectedNode.Name);                        // 무조건 편집 혹은 새로만들기의 경우 차후 저장을 위해 셋팅                        if (_Data.LIST_XmlDBNotSave_Receiver.Contains(Temp_Receiver_ID) == false)                            _Data.LIST_XmlDBNotSave_Receiver.Add(Temp_Receiver_ID);                        // 화면 전환                        _Event.WorkViewPageName_SendMessage_Write(Temp_Receiver_ID, Object_Type.IMAGE, null, null);                        break;                    }                }            }            // 대화 팝업은 특별처리            _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_Popup_PageDelInform_SendMessage_Event);        }        ///        /// EVENT 처리부        ///        // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)        public void CreateForm_FormClosing(object sender, FormClosingEventArgs e)        {            // 트리뷰에 페이지 노드를 생성 및 편집하기 위한 이벤트 해제            _Event.TreeView_PageNodeSet_SendMessage_Event -= new _Event.TreeView_PageNodeSet_SendMessage_Handler(_Event_TreeView_PageNodeSet_SendMessage_Event);            // 트리 추가 이벤트 핸들러 해제                        _Event.TreeView_ReceiverNodeSet_SendMessage_Event -= new _Event.TreeView_ReceiverNodeSet_SendMessage_Handler(_Event_TreeView_ReceiverNodeSet_SendMessage_Event);            // 다른이름으로 페이지 명을 변경하여 저장하는 이벤트 핸들러 해제            _Event.Page_Rename_SendMessage_Event -= new _Event.Page_Rename_SendMessage_Handler(_Event_Page_Rename_SendMessage_Event);            // 페이지 저장 (XML 및 DB 저장) 이벤트 핸들러 해제            _Event.Page_Save_SendMessage_Event -= new _Event.Page_Save_SendMessage_Handler(_Event_Page_Save_SendMessage_Event);            // 트리뷰 초기화 이벤트 및 프로젝트 열기 혹은 새로만들기 겸용 핸들러 등록             _Event.TreeView_Clear_SendMessage_Event -= new _Event.TreeView_Clear_SendMessage_Handler(_Event_TreeView_Clear_SendMessage_Event);            // 수신기 초기화 이벤트 핸들러 해제            _Event.Receiver_Clear_SendMessage_Event -= new _Event.Receiver_Clear_SendMessage_Handler(_Event_Receiver_Clear_SendMessage_Event);            // 수신기 추가 및 편집 폼에서 작업 완료 이벤트 핸들러 해제            _Event.WorkViewPageName_Receiver_SendMessage_Event -= new _Event.WorkViewPageName_Receiver_SendMessage_Handler(_Event_WorkViewPageName_Receiver_SendMessage_Event);        }        //// 프로젝트 새로 만들기 이벤트 핸들러 등록        //public void _Event_Project_New_SendMessage_Event(string ProjectName)        //{        //    // 트리 초기화        //    this.treeView_SystemTree.Nodes.Clear();        //    // 노드 추가        //    _Tree.NodeAdd_Root(this.treeView_SystemTree, _Text.UI_TREE_ROOT_KEY, ProjectName, Object_Type.PROJECT);         //}        //// 프로젝트 열기 이벤트        //public void _Event_Project_Open_SendMessage_Event(string ProjectName)        //{        //    // 트리 초기화        //    this.treeView_SystemTree.Nodes.Clear();        //    // 프로젝트명 표시        //    _Tree.NodeAdd_Root(this.treeView_SystemTree, _Text.UI_TREE_ROOT_KEY, ProjectName, Object_Type.PROJECT);        //    // _Receiver.xml 제거 : cyim 2012.8.29        //    //// 트리에 표시        //    //treeView_Read_Receiver_XML();        //}        // 다른이름으로 페이지 명을 변경하여 저장하는 이벤트        public void _Event_Page_Rename_SendMessage_Event(string RECEIVER_ID, string PageNodeKey, string PageNodeText)        {            // 트리에 반영            TreeNode PageReame = _Tree.GetNode_By_Name(this.treeView_SystemTree, PageNodeKey);            // 임시 저장             string temp_BeforePageName = PageReame.Text;            // 노드 키와 텍스트 정보는 페이지 이름으로 통일한다            PageReame.Name = PageNodeKey;            PageReame.Text = PageNodeText;            // 리스트에 반영            //((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID.Remove(OriginalName);            //((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID.Add(PageName);            //// 페이지 값 복사            //_Page Page = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[OriginalName]);            //Page.Name=PageName;            // 해쉬에 반영            //((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE.Remove(OriginalName);            //((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE.Add(Page.Name, Page);            // 페이지명 변경            ((_Page)(((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PageNodeKey])).NodeText = PageNodeText;            // 기존의 버튼의 점프페이지명은 해당 페이지명으로 변경해야한다            _RECEIVER RECEIVER = (_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID];            // 수신기에 해당하는 페이지 정보 추출            foreach (string PAGE_ID in RECEIVER.LIST_PAGE_ID)            {                _Page Page = ((_Page)RECEIVER.HASH_PAGE[PAGE_ID]);                // 페이지에 해당하는 아이콘 정보 추출                foreach (string ICON_ID in Page.LIST_ICON_ID)                {                    _PictureBoxItem PictureBoxItem = ((_PictureBoxItem)Page.HASH_ICON[ICON_ID]);                    // 버튼 아이콘만 추출 (기존의 페이지명이 있는 경우에만)                    if (PictureBoxItem.ItemType == Item_Type.Button && PictureBoxItem.Button_JumpPageName == temp_BeforePageName)                    {                        // 모든 점프페이지명을 변경시켜준다                        PictureBoxItem.Button_JumpPageName = PageReame.Text;                    }                }            }            // 무조건 편집 혹은 새로만들기의 경우 차후 저장을 위해 셋팅            if (_Data.LIST_XmlDBNotSave_Receiver.Contains(RECEIVER_ID) == false)                _Data.LIST_XmlDBNotSave_Receiver.Add(RECEIVER_ID);            // 화면 전환            _Event.WorkViewPageName_SendMessage_Write(RECEIVER_ID, Object_Type.IMAGE, null, null);        }        // 트리 노드 생성 및 편집 이벤트 처리        public void _Event_TreeView_ReceiverNodeSet_SendMessage_Event(_RECEIVER RECEIVER)        {            Delegate_New_SystemTree(treeView_SystemTree.Nodes[0], RECEIVER);        }        // 트리에 새로운 노드 추가         private void Delegate_New_SystemTree(TreeNode pNode, _RECEIVER RECEIVER) // 시스템 트리에 추가하기        {            if (this.treeView_SystemTree.InvokeRequired)            {                TreeView_SetTextCallback d = new TreeView_SetTextCallback(Delegate_New_SystemTree);                this.Invoke(d, new object[] { pNode, RECEIVER });            }            else            {                string temp_key = null;                string temp_name = null;                ///                /// 수신기                ///                // 수신기 노드 추가                temp_key = RECEIVER.ID;                temp_name = RECEIVER.KEY_NAME;                _Tree.NodeAdd_Root_Node(treeView_SystemTree, 0, temp_key, temp_name, Object_Type.RECEIVER);                // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다                TreeNode Added_RECEIVER = _Tree.GetNode_By_Name(treeView_SystemTree, RECEIVER.ID);                ///                /// 입출력                ///                // 입출력 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_INOUTPUT);                temp_name = _Text.UI_TREE_INOUTPUT;                _Tree.NodeAdd_Root_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, temp_key, temp_name, Object_Type.INOUT);                // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다                TreeNode Added_INOUTPUT = _Tree.GetNode_By_Name(treeView_SystemTree, temp_key);                // 통신 보드 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_COM_BOARD);                temp_name = _Text.UI_TREE_COM_BOARD;                _Tree.NodeAdd_Root_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_INOUTPUT.Index, temp_key, temp_name, Object_Type.COM_BOARD);                //// 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다                //TreeNode Added_COM_BOARD = _Tree.GetNode_By_Name(treeView_SystemTree, temp_key);                //for (int i = 1; i <= RECEIVER.COM_BOARD_MAX_NUM; i++)                //{                //    temp_key = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_COM_BOARD_KEY, i));                //    temp_name = _Text.UI_TREE_COM_BOARD + i.ToString();                //    _Tree.NodeAdd_Root_Node_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_INOUTPUT.Index, Added_COM_BOARD.Index, temp_key, temp_name, Object_Type.COM_BOARDS);                //}                // IO 보드 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_IO_BOARD);                _Tree.NodeAdd_Root_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_INOUTPUT.Index, temp_key, _Text.UI_TREE_IO_BOARD, Object_Type.IO_BOARD);                //// 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다                //TreeNode Added_IO_BOARD = _Tree.GetNode_By_Name(treeView_SystemTree, temp_key);                //for (int i = 1; i <= RECEIVER.IO_BOARD_MAX_NUM; i++)                //{                //    temp_key = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_IO_BOARD_KEY, i));                //    temp_name = _Text.UI_TREE_IO_BOARD + i.ToString();                //    _Tree.NodeAdd_Root_Node_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_INOUTPUT.Index, Added_IO_BOARD.Index, temp_key, temp_name, Object_Type.IO_BOARD);                //}                // 키패드 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_KEYPAD);                _Tree.NodeAdd_Root_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_INOUTPUT.Index, temp_key, _Text.UI_TREE_KEYPAD, Object_Type.KEYPAD);                // 비상방송 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_EMERGENCY_BROADCAST);                _Tree.NodeAdd_Root_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_INOUTPUT.Index, temp_key, _Text.UI_TREE_EMERGENCY_BROADCAST, Object_Type.EMERGENCY_BROADCAST);                ///                /// 포인트                ///                // 포인트 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_POINT);                _Tree.NodeAdd_Root_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, temp_key, _Text.UI_TREE_POINT, Object_Type.POINT);                // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다                TreeNode Added_POINT = _Tree.GetNode_By_Name(treeView_SystemTree, temp_key);                // 입력 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_POINT_INPUT);                _Tree.NodeAdd_Root_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_POINT.Index, temp_key, _Text.UI_TREE_POINT_INPUT, Object_Type.INPUT);                // 출력 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_POINT_OUTPUT);                _Tree.NodeAdd_Root_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_POINT.Index, temp_key, _Text.UI_TREE_POINT_OUTPUT, Object_Type.OUTPUT);                ///                /// 연동                ///                // 연동 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_OPER);                _Tree.NodeAdd_Root_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, temp_key, _Text.UI_TREE_OPER, Object_Type.OPER);                // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다                TreeNode Added_OPER = _Tree.GetNode_By_Name(treeView_SystemTree, temp_key);                // 그룹 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_OPER_GROUP);                _Tree.NodeAdd_Root_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_OPER.Index, temp_key, _Text.UI_TREE_OPER_GROUP, Object_Type.OPER_GROUP);                // 연동설정 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_OPER_SET);                _Tree.NodeAdd_Root_Node_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, Added_OPER.Index, temp_key, _Text.UI_TREE_OPER_SET, Object_Type.OPER_SET);                ///                /// 그래픽                ///                // 그래픽 노드 추가                temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_IMAGE);                _Tree.NodeAdd_Root_Node_Node(treeView_SystemTree, 0, Added_RECEIVER.Index, temp_key, _Text.UI_TREE_IMAGE, Object_Type.IMAGE);                // 트리 전체 확대                 treeView_SystemTree.ExpandAll();                //// 트리는 ACU 노드만 표시할수있도록 한다                //treeView_SystemTree.Nodes[0].Expand();                //// 추가한 수신기 노드 개수 만큼 열수 있도록 카운트                //int temp = 0;                //foreach (string RECEIVER_ID in _Data.LIST_RECEIVER_ID)                //{                //    treeView_SystemTree.Nodes[0].Nodes[temp++].Expand();                //}                // 트리정보 저장                _Tree.Save_SystemTreeInfo(this.treeView_SystemTree);                // 수신기 노드가 추가되면 워크뷰에 리스트를 보여주도록 함 (프로젝트를 클릭한 것처럼 화면 전환)                _Event.WorkViewPageName_SendMessage_Write(RECEIVER.ID, Object_Type.PROJECT, null, null);                // 수신기 추가는 무조건                this.treeView_SystemTree.SelectedNode = _Tree.GetNode_By_Name(treeView_SystemTree, _Text.UI_TREE_ROOT_KEY);                ///                /// 강제 페이지 동기화                ///                // 페이지 동기화 루틴 추가                FieldSettingXml_Sync(RECEIVER);            }        }        // 트리뷰에 페이지 노드를 생성 및 편집하기 위한 이벤트 (예시 : 맵디자이너에서 페이지 추가)                private void _Event_TreeView_PageNodeSet_SendMessage_Event(string RECEIVER_ID, _Page Page)        {            // 해당 수신기 노드 정보            TreeNode ReceiverNode = _Tree.GetNode_By_Name(this.treeView_SystemTree, RECEIVER_ID);            // 그래픽 노드 밑에 페이지 노드를 추가한다 (그래픽 노드의 키값 형태 : RECEIVER.ID + _Text.Minus + PORT_NUM)            TreeNode ImageNode = _Tree.GetNode_By_Name(this.treeView_SystemTree, RECEIVER_ID + _Text.Minus + _Text.UI_TREE_IMAGE);            // 노드 키와 텍스트 정보는 페이지 이름으로 통일한다            _Tree.NodeAdd_Root_Node_Node_Node(this.treeView_SystemTree, 0, ReceiverNode.Index, ImageNode.Index, Page.NodeKey, Page.NodeText, Object_Type.PAGE);            // 그래픽 노드 모두 펼침            ImageNode.Expand();        }        // 이벤트 테이블 (TB_EVENT_TYPE) 생성         private void Create_TB_EVENT_TYPE()        {            try            {                OpenFileDialog openFileDialog = new OpenFileDialog();                // 파일을 읽는 경로는 우선 프로그램에서 배포하는 파일을 따라간다                openFileDialog.InitialDirectory = _File.ProgramPath; //_Data.Project_Path + "\\" + _Data.Project_Name;                //openFileDialog.Filter = "(*.xls)|*.xls|(*.xlsx)|*.xlsx";                openFileDialog.Filter = "(*.csv*)|*.csv";                if (openFileDialog.ShowDialog() == DialogResult.OK)                {                    string[] EventTypeString = System.IO.File.ReadAllLines(openFileDialog.FileName, Encoding.Default);                    if (EventTypeString.Length == 0)                    {                        // 데이타가 잘못되었습니다                        _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform, 0);                        return;                    }                    // 임시저장소                    ArrayList Type = new ArrayList();                    ArrayList TypeName = new ArrayList();                    foreach (string EventType in EventTypeString)                    {                        string[] Temps = EventType.Split(',');                        if (Temps.Length < 2)                        {                            // 데이타가 잘못되었습니다                            _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform, 0);                            return;                        }                        // 첫째줄은 제외                        if (Temps[0] != "EVENT_TYPE")                        {                            Type.Add(Temps[0]);                            TypeName.Add(Temps[1]);                        }                    }                    // TB_EVENT_TYPE 모든 데이타 삭제                    _Db.Execute(_Sql.Delete_Table("TB_EVENT_TYPE", null));                    foreach (string Data in Type)                    {                        _Db.ADD("TB_EVENT_TYPE",                            "EVENT_TYPE=" + Data +                            ";EVENT_TYPE_NAME=" + TypeName[Type.IndexOf(Data)].ToString() +                            ";UPDATE_USER_ID=" + "FireManager" +                            ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));                    }                    // 저장하였습니다                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.SaveInform, 0);                }            }            catch (Exception e)            {                // 데이타가 잘못되었습니다                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform, 0);                _Event.DebugView_SendMessage_Write(e.ToString());            }        }    }}
 |