using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; // DataRowCollection using System.Windows.Forms; using System.Drawing; namespace IControls_FireManager { // 트리뷰 공통 루틴은 여기에서 구현한다 public static class _Tree { // 트리 생성 public static TreeView Create(string TreeViewName) { TreeView treeview = new TreeView(); treeview.Dock = System.Windows.Forms.DockStyle.Fill; treeview.Location = new System.Drawing.Point(0, 0); treeview.Name = TreeViewName; return treeview; } // Name 검색해서 노드삭제 public static bool DelNodeName_By_Name(TreeView pTreeView, string Name) { TreeNode[] Ctrls = pTreeView.Nodes.Find(Name, true); if (Ctrls.Length > 0) { try { Ctrls[0].Remove(); return true; } catch { return false; } } return false; } // Name 검색해서 노드삭제 (단 해당 수신기에 해당하는 것만 삭제, 페이지 삭제에서만 사용하도록 한다) public static bool DelNodeName_By_Name_Check_ReceiverID(TreeView pTreeView, string Name, string RECEIVER_ID) { TreeNode[] Ctrls = pTreeView.Nodes.Find(Name, true); if (Ctrls.Length > 0) { try { // 페이지 노드의 경우 if(Ctrls[0].Parent.Parent.Name==RECEIVER_ID) Ctrls[0].Remove(); return true; } catch { return false; } } return false; } // Name 검색해서 Text 변경 public static bool SetNodeText_By_Name(TreeView pTreeView, string Name, string Text) { TreeNode[] Ctrls = pTreeView.Nodes.Find(Name, true); if (Ctrls.Length > 0) { try { Ctrls[0].Text = Text; return true; } catch { return false; } } return false; } // Name 검색해서 SelectedImageIndex 변경 public static bool SetNodeSelectedImageIndex_By_Name(TreeView pTreeView, string Name, int ImageIndex) { TreeNode[] Ctrls = pTreeView.Nodes.Find(Name, true); if (Ctrls.Length > 0) { try { Ctrls[0].SelectedImageIndex = ImageIndex; return true; } catch { return false; } } return false; } // Name 검색해서 모든노드 색 지정하기 public static bool SetNodeColor_By_Name(TreeView pTreeView, string Name, Color pColor) { TreeNode[] Ctrls = pTreeView.Nodes.Find(Name, true); if (Ctrls.Length > 0) { try { Ctrls[0].ForeColor = pColor; return true; } catch { return false; } } return false; } // Name 검색해서 노드 정보 가져오기 public static TreeNode GetNode_By_Name(TreeView pTreeView, string Name) { TreeNode[] Ctrls = pTreeView.Nodes.Find(Name, true); if (Ctrls.Length > 0) { try { return Ctrls[0]; } catch { return null; } } return null; } // Name 검색해서 해당 노드의 자식노드를 셋팅하자 public static bool SetChildNodeText_By_Name(TreeView pTreeView, TreeNode pNode, string Name, string Text) { TreeNode[] Ctrls = pTreeView.Nodes[0].Nodes[pNode.Index].Nodes.Find(Name, true); if (Ctrls.Length > 0) { try { Ctrls[0].Text = Text; return true; } catch { return false; } } return false; } /// /// 노드추가 (노드 위치 정보를 아는 경우) /// public static void NodeAdd(TreeView pTreeView, TreeNode pNode, string key, string text, Object_Type ImageType) { if (pNode.Nodes.ContainsKey(key) == true) { _Popup.MessageBoxPopup(0, _Text.OverLapSame, _Text.OK); return; } else { //pTreeView.BeginUpdate(); // 트리 편집 시작 switch(pNode.Level) { case 0: // Root pTreeView.Nodes.Add(key, text, (int)ImageType, (int)ImageType); break; case 1: // Root - Node pTreeView.Nodes[0].Nodes.Add(key, text, (int)ImageType, (int)ImageType); break; case 2: // Root - Node - Node pTreeView.Nodes[0].Nodes[pNode.Index].Nodes.Add(key, text, (int)ImageType, (int)ImageType); break; case 3: // Root - Node - Node - Node pTreeView.Nodes[0].Nodes[pNode.Parent.Index].Nodes[pNode.Index].Nodes.Add(key, text, (int)ImageType, (int)ImageType); break; case 4: // Root - Node - Node - Node - Node pTreeView.Nodes[0].Nodes[pNode.Parent.Parent.Index].Nodes[pNode.Parent.Index].Nodes[pNode.Index].Nodes.Add(key, text, (int)ImageType, (int)ImageType); break; } //SetNodeSelectedImageIndex_By_Name(pTreeView, key, (int)ImageType); // 노드를 선택하면 이미지가 변경되지 않도록 지정해준다 //pTreeView.EndUpdate();// 트리 편집 종료 } } /// /// 노드추가 (노드 위치 정보를 모르는 경우) /// // Root public static void NodeAdd_Root(TreeView pTreeView, string key, string text, Object_Type ImageType) { if (pTreeView.Nodes.ContainsKey(key) == true) { _Popup.MessageBoxPopup(0, _Text.OverLapSame, _Text.OK); return; } else { //pTreeView.BeginUpdate(); // 트리 편집 시작 pTreeView.Nodes.Add(key, text, (int)ImageType, (int)ImageType); //SetNodeSelectedImageIndex_By_Name(pTreeView, key, (int)ImageType); // 노드를 선택하면 이미지가 변경되지 않도록 지정해준다 //pTreeView.EndUpdate();// 트리 편집 종료 } } // Root - Node public static void NodeAdd_Root_Node(TreeView pTreeView, int root_index, string key, string text, Object_Type ImageType) { if (pTreeView.Nodes.ContainsKey(key) == true) { _Popup.MessageBoxPopup(0, _Text.OverLapSame, _Text.OK); return; } else { //pTreeView.BeginUpdate(); // 트리 편집 시작 pTreeView.Nodes[root_index].Nodes.Add(key, text, (int)ImageType, (int)ImageType); //ex) 아이콘트롤스 ->기술연구소 또는 프로젝트사업부 추가 //SetNodeSelectedImageIndex_By_Name(pTreeView, key, (int)ImageType); // 노드를 선택하면 이미지가 변경되지 않도록 지정해준다 //pTreeView.EndUpdate();// 트리 편집 종료 } } // Root - Node - Node public static void NodeAdd_Root_Node_Node(TreeView pTreeView, int root_index, int depth1_index, string key, string text, Object_Type ImageType) { if (pTreeView.Nodes.ContainsKey(key) == true) { _Popup.MessageBoxPopup(0, _Text.OverLapSame, _Text.OK); return; } else { //pTreeView.BeginUpdate(); // 트리 편집 시작 pTreeView.Nodes[root_index].Nodes[depth1_index].Nodes.Add(key, text, (int)ImageType, (int)ImageType); //SetNodeSelectedImageIndex_By_Name(pTreeView, key, (int)ImageType); // 노드를 선택하면 이미지가 변경되지 않도록 지정해준다 //pTreeView.EndUpdate();// 트리 편집 종료 } } // Root - Node - Node - Node public static void NodeAdd_Root_Node_Node_Node(TreeView pTreeView, int root_index, int depth1_index, int depth2_index, string key, string text, Object_Type ImageType) { if (pTreeView.Nodes.ContainsKey(key) == true) { _Popup.MessageBoxPopup(0, _Text.OverLapSame, _Text.OK); return; } else { //pTreeView.BeginUpdate(); // 트리 편집 시작 pTreeView.Nodes[root_index].Nodes[depth1_index].Nodes[depth2_index].Nodes.Add(key, text, (int)ImageType, (int)ImageType); //SetNodeSelectedImageIndex_By_Name(pTreeView, key, (int)ImageType); // 노드를 선택하면 이미지가 변경되지 않도록 지정해준다 //pTreeView.EndUpdate();// 트리 편집 종료 } } // Root - Node - Node - Node - Node public static void NodeAdd_Root_Node_Node_Node_Node(TreeView pTreeView, int root_index, int depth1_index, int depth2_index, int depth3_index, string key, string text, Object_Type ImageType) { if (pTreeView.Nodes.ContainsKey(key) == true) { _Popup.MessageBoxPopup(0, _Text.OverLapSame, _Text.OK); return; } else { //pTreeView.BeginUpdate(); // 트리 편집 시작 pTreeView.Nodes[root_index].Nodes[depth1_index].Nodes[depth2_index].Nodes[depth3_index].Nodes.Add(key, text, (int)ImageType, (int)ImageType); //SetNodeSelectedImageIndex_By_Name(pTreeView, key, (int)ImageType); // 노드를 선택하면 이미지가 변경되지 않도록 지정해준다 //pTreeView.EndUpdate();// 트리 편집 종료 } } // 트리 노드를 선택하고 Text 를 변경하는 경우 public static void TreeViewNodeTextChanged(TreeView pTreeView, string Text, ToolStripItemClickedEventArgs e) { if (e.ClickedItem.Text == Text) { pTreeView.LabelEdit = true; if (!pTreeView.SelectedNode.IsEditing) { pTreeView.SelectedNode.BeginEdit(); } } } /// /// 정보에 의해 트리 정보를 변경 /// public static void ChangeColor_By_Data(TreeView pTreeView, string Name, string Data) { // 노드 색상 Color Apply_Color = Color.Blue; Color Basic_Color = Color.Black; // 트리 검색 TreeNode EditNode = GetNode_By_Name(pTreeView, Name); // 오브젝트 트리 색상 반영 if (Data == null || Data.Trim().Length == 0 || Data == _Text.None) { EditNode.ForeColor = Basic_Color; } else { EditNode.ForeColor = Apply_Color; } } /// /// 트리 정보를 가져오는 루틴 /// // DB를 이용해서 Device System 트리 로드 public static void Load_SystemTreeInfo(TreeView treeview) { // 노드 추가 // 트리 초기화 treeview.Nodes.Clear(); // 일단 기본값 if (_Data.Project_Name == null) _Tree.NodeAdd_Root(treeview, _Text.UI_TREE_ROOT_KEY, _Text.DEFAULT_PROJECT_NAME, Object_Type.PROJECT); else _Tree.NodeAdd_Root(treeview, _Text.UI_TREE_ROOT_KEY, _Data.Project_Name, Object_Type.PROJECT); // 트리 인덱스 int TreeNodeInfo_Level_1th_MaxIndex = 0; /// /// 수신기 최대 인덱스 값 구하기 /// foreach (string RECEIVER_ID in _Data.LIST_RECEIVER_ID) if (TreeNodeInfo_Level_1th_MaxIndex <= ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).NODE.T_INDEX) TreeNodeInfo_Level_1th_MaxIndex = ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).NODE.T_INDEX; // 수신기 의 트리 인덱스 정보 for (int h = 0; h <= TreeNodeInfo_Level_1th_MaxIndex; h++) { foreach (string RECEIVER_ID in _Data.LIST_RECEIVER_ID) { if (((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).NODE.T_INDEX == h) { _RECEIVER RECEIVER = (_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]; /// /// LEVEL 1 수신기 노드 추가 /// NodeAdd_Root_Node(treeview, 0, RECEIVER.ID, RECEIVER.KEY_NAME, Object_Type.RECEIVER); /// /// LEVEL 2 노드 추가 /// string temp_key = null; string temp_name = null; // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다 TreeNode Added_RECEIVER = _Tree.GetNode_By_Name(treeview, RECEIVER.ID); /// /// 입출력 /// // 입출력 노드 추가 temp_key = ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Set_SubKey(RECEIVER, _Text.UI_TREE_INOUTPUT); temp_name = _Text.UI_TREE_INOUTPUT; _Tree.NodeAdd_Root_Node_Node(treeview, 0, Added_RECEIVER.Index, temp_key, temp_name, Object_Type.INOUT); // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다 TreeNode Added_INOUTPUT = _Tree.GetNode_By_Name(treeview, 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, 0, Added_RECEIVER.Index, Added_INOUTPUT.Index, temp_key, temp_name, Object_Type.COM_BOARD); // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다 TreeNode Added_COM_BOARD = _Tree.GetNode_By_Name(treeview, 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 = ((_COM_BOARD)RECEIVER.Hash_COM_BOARD[temp_key]).Get_KEY_NAME(); _Tree.NodeAdd_Root_Node_Node_Node_Node(treeview, 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, 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, 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 = ((_IO_BOARD)RECEIVER.Hash_IO_BOARD[temp_key]).Get_KEY_NAME(); //_Text.UI_TREE_IO_BOARD + i.ToString(); _Tree.NodeAdd_Root_Node_Node_Node_Node(treeview, 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, 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, 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, 0, Added_RECEIVER.Index, temp_key, _Text.UI_TREE_POINT, Object_Type.POINT); // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다 TreeNode Added_POINT = _Tree.GetNode_By_Name(treeview, temp_key); // 입력 노드 추가 temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_POINT_INPUT); _Tree.NodeAdd_Root_Node_Node_Node(treeview, 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, 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, 0, Added_RECEIVER.Index, temp_key, _Text.UI_TREE_OPER, Object_Type.OPER); // 추가한 노드의 정보를 알아야 하위 트리에 추가할수 있다 TreeNode Added_OPER = _Tree.GetNode_By_Name(treeview, temp_key); // 그룹 노드 추가 temp_key = RECEIVER.Set_SubKey(RECEIVER, _Text.UI_TREE_OPER_GROUP); _Tree.NodeAdd_Root_Node_Node_Node(treeview, 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, 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, 0, Added_RECEIVER.Index, temp_key, _Text.UI_TREE_IMAGE, Object_Type.IMAGE); } } } // 변수 초기화 TreeNodeInfo_Level_1th_MaxIndex = 0; //// 트리 전체 축소 //treeview.CollapseAll(); //// 트리는 수신기 노드만 표시할수있도록 한다 //treeview.Nodes[0].Expand(); //// 추가한 수신기 노드 개수 만큼 열수 있도록 카운트 //int temp = 0; //foreach (string RECEIVER_ID in _Data.LIST_RECEIVER_ID) //{ // treeview.Nodes[0].Nodes[temp++].Expand(); //} } // Device System 트리 저장 public static void Save_SystemTreeInfo(TreeView treeview) { TreeNode result = null; //// 루트 : 프로젝트 명 //result = GetNode_By_Name(treeview, _Text.UI_TREE_ROOT_KEY); //_Data.Project_Name = result.Text; // foreach (string RECEIVER_ID in _Data.LIST_RECEIVER_ID) // 수신기 해쉬테이블 및 키리스트 조회 { result = GetNode_By_Name(treeview, RECEIVER_ID); if (result != null) { /// /// 수신기 /// ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).NODE.T_DEPTH = result.Level; ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).NODE.T_INDEX = result.Index; ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).NODE.T_PARENT = result.Parent.Name; /// /// 입출력 /// /// /// 입출력 - 통신 보드 /// //foreach (string COM_BOARD_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).List_COM_BOARD_ID) //{ // result = GetNode_By_Name(treeview, COM_BOARD_ID); // ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Hash_COM_BOARD[COM_BOARD_ID]).NODE.T_DEPTH = result.Level; // ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Hash_COM_BOARD[COM_BOARD_ID]).NODE.T_INDEX = result.Index; // ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Hash_COM_BOARD[COM_BOARD_ID]).NODE.T_INDEX = result.Index; //} /// /// 입출력 - IO 보드 /// //foreach (string IO_BOARD_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).List_IO_BOARD_ID) //{ // result = GetNode_By_Name(treeview, IO_BOARD_ID); // ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Hash_IO_BOARD[IO_BOARD_ID]).NODE.T_DEPTH = result.Level; // ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Hash_IO_BOARD[IO_BOARD_ID]).NODE.T_INDEX = result.Index; // ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Hash_IO_BOARD[IO_BOARD_ID]).NODE.T_INDEX = result.Index; //} /// /// 입출력 - 키패드 /// /// /// 입출력 - 비상방송 /// /// /// 포인트 /// /// /// 포인트 - 입력 /// /// /// 포인트 - 출력 /// /// /// 연동 /// /// /// 연동 - 그래픽 /// /// /// 연동 - 연동설정 /// /// /// 그래픽 /// /// /// 그래픽 - 이미지 /// } } } } }