/// <summary> /// 绘制编辑文本框 /// </summary> /// <param name="cell">单元格</param> /// <param name="paint">绘图对象</param> /// <param name="rect">区域</param> /// <param name="clipRect">裁剪区域</param> public override void onPaintEditTextBox(FCGridCell cell, FCPaint paint, FCRect rect, FCRect clipRect) { FCTextBox editTextBox = EditTextBox; if (editTextBox != null) { FCTreeNode node = cell as FCTreeNode; if (node != null) { int indent = node.Indent; rect.left += indent; if (rect.right < rect.left) { rect.right = rect.left; } editTextBox.Bounds = rect; editTextBox.DisplayOffset = false; editTextBox.bringToFront(); } else { base.onPaintEditTextBox(cell, paint, rect, clipRect); } } }
/// <summary> /// 创建树的节点 /// </summary> /// <param name="node">节点</param> /// <param name="control">控件</param> /// <param name="treeNode">树节点</param> protected virtual void createTreeNode(XmlNode node, FCView control, FCTreeNode treeNode) { FCTree tree = control as FCTree; if (tree != null) { FCTreeNode appendNode = new FCTreeNode(); if (treeNode == null) { tree.appendNode(appendNode); } else { treeNode.appendNode(appendNode); } setAttributesBefore(node, appendNode); foreach (XmlNode subNode in node.ChildNodes) { if (subNode.Name.ToLower() == "node") { createTreeNode(subNode, control, appendNode); } } setAttributesAfter(node, appendNode); } }
/// <summary> /// 插入节点 /// </summary> /// <param name="index">索引</param> /// <param name="node">节点</param> public void insertNode(int index, FCTreeNode node) { int rowIndex = -1; if (index == 0) { if (node.Parent != null) { rowIndex = node.Parent.Row.Index + 1; } else { rowIndex = 0; } } else { if (m_nodes.size() > 0) { rowIndex = m_nodes.get(index).Row.Index; } } node.Tree = m_tree; node.Parent = this; node.onAddingNode(rowIndex); m_nodes.Insert(index, node); }
/// <summary> /// 获取最后节点的索引 /// </summary> /// <param name="nodes">节点</param> /// <returns>索引</returns> protected FCTreeNode getLastNode(ArrayList <FCTreeNode> nodes) { int size = nodes.size(); if (size > 0) { for (int i = size - 1; i >= 0; i--) { FCTreeNode lastNode = nodes.get(i); if (lastNode.Row != null) { ArrayList <FCTreeNode> childNodes = lastNode.getChildNodes(); FCTreeNode subLastNode = getLastNode(childNodes); if (subLastNode != null) { return(subLastNode); } else { return(lastNode); } } } } return(null); }
/// <summary> /// 添加节点 /// </summary> /// <param name="node">节点</param> public void appendNode(FCTreeNode node) { node.Parent = this; node.Tree = m_tree; node.onAddingNode(-1); m_nodes.add(node); }
/// <summary> /// 表格选中行改变方法 /// </summary> public void onGridSelectedRowsChanged() { ArrayList <FCTreeNode> selectedNodes = m_tvTypes.SelectedNodes; int selectedNodesSize = selectedNodes.Count; if (selectedNodesSize > 0) { FCTreeNode node = selectedNodes[0]; String name = node.Name.Replace("node_", ""); ArrayList <FCGridRow> rows = m_gridTemplate.m_rows; int rowsSize = rows.Count; ArrayList <FCGridRow> selectedRows = new ArrayList <FCGridRow>(); if (name.IndexOf('_') != -1) { String language = name.Substring(0, name.IndexOf('_')); String platform = name.Substring(name.IndexOf('_') + 1); for (int i = 0; i < rowsSize; i++) { FCGridRow row = rows[i]; if (row.getCell("COLT2").getString() == language && row.getCell("COLT3").getString() == platform) { if (selectedRows.Count == 0) { selectedRows.Add(row); } row.Visible = true; } else { row.Visible = false; } } } else { for (int i = 0; i < rowsSize; i++) { FCGridRow row = rows[i]; if (row.getCell("COLT2").getString() == name) { if (selectedRows.Count == 0) { selectedRows.Add(row); } row.Visible = true; } else { row.Visible = false; } } } m_gridTemplate.VScrollBar.Pos = 0; m_gridTemplate.SelectedRows = selectedRows; m_gridTemplate.update(); m_gridTemplate.invalidate(); } }
/// <summary> /// 加载树的模板 /// </summary> /// <param name="tree">树</param> /// <param name="node">节点</param> public static void TreeTemplate(FCTree tree, UIXmlEx xml, XmlNode node) { XmlDocument xmlDoc = node.OwnerDocument; tree.Size = new FCSize(200, 200); FCGridColumn column = new FCGridColumn("Column1"); column.AllowSort = false; tree.addColumn(column); FCGridColumn column2 = new FCGridColumn("Column2"); column2.AllowSort = false; tree.addColumn(column2); tree.update(); FCTreeNode treeNode = new FCTreeNode(); treeNode.Text = "Node1"; tree.appendNode(treeNode); FCTreeNode subTreeNode = new FCTreeNode(); subTreeNode.Text = "Node2"; treeNode.appendNode(subTreeNode); tree.update(); XmlNode columnsNode = xmlDoc.CreateNode(XmlNodeType.Element, "tr", ""); node.AppendChild(columnsNode); XmlNode column1Node = xmlDoc.CreateNode(XmlNodeType.Element, "th", ""); columnsNode.AppendChild(column1Node); XmlAttribute xmlAtr1 = xmlDoc.CreateAttribute("text"); xmlAtr1.Value = "Column1"; column1Node.Attributes.Append(xmlAtr1); XmlNode column2Node = xmlDoc.CreateNode(XmlNodeType.Element, "th", ""); columnsNode.AppendChild(column2Node); XmlAttribute xmlAtr2 = xmlDoc.CreateAttribute("text"); xmlAtr2.Value = "Column2"; column2Node.Attributes.Append(xmlAtr2); XmlNode nodesNode = xmlDoc.CreateNode(XmlNodeType.Element, "nodes", ""); node.AppendChild(nodesNode); XmlNode nodeNode = xmlDoc.CreateNode(XmlNodeType.Element, "node", ""); nodesNode.AppendChild(nodeNode); XmlAttribute xmlAtr3 = xmlDoc.CreateAttribute("text"); xmlAtr3.Value = "Node1"; nodeNode.Attributes.Append(xmlAtr3); XmlNode subNodeNode = xmlDoc.CreateNode(XmlNodeType.Element, "node", ""); nodeNode.AppendChild(subNodeNode); XmlAttribute xmlAtr4 = xmlDoc.CreateAttribute("text"); xmlAtr4.Value = "Node2"; subNodeNode.Attributes.Append(xmlAtr4); }
/// <summary> /// 单元格触摸抬起方法 /// </summary> /// <param name="cell">单元格</param> /// <param name="touchInfo">触摸信息</param> public override void onCellTouchUp(FCGridCell cell, FCTouchInfo touchInfo) { base.onCellTouchUp(cell, touchInfo); FCPoint mp = touchInfo.m_firstPoint; if (m_movingNode != null) { FCGridRow curRow = getRow(mp); //移动 if (curRow != null) { FCTreeNode curNode = curRow.getCell(0) as FCTreeNode; if (curNode.AllowDragIn && m_movingNode != curNode) { FCTreeNode curNodeParent = curNode.Parent; FCTreeNode movingNodeParent = m_movingNode.Parent; if (movingNodeParent != null) { movingNodeParent.removeNode(m_movingNode); } else { removeNode(m_movingNode); } //有父节点 if (curNodeParent != null) { if (movingNodeParent == curNodeParent) { curNodeParent.insertNode(curNodeParent.getNodeIndex(curNode), m_movingNode); } else { curNode.appendNode(m_movingNode); } } //无父节点 else { if (movingNodeParent == curNodeParent) { insertNode(getNodeIndex(curNode), m_movingNode); } else { curNode.appendNode(m_movingNode); } } curNode.expend(); } } m_movingNode = null; update(); } }
/// <summary> /// 单元格触摸按下方法 /// </summary> /// <param name="cell">单元格</param> /// <param name="touchInfo">触摸信息</param> public override void onCellTouchDown(FCGridCell cell, FCTouchInfo touchInfo) { base.onCellTouchDown(cell, touchInfo); FCPoint mp = touchInfo.m_firstPoint; FCTreeNode node = cell as FCTreeNode; if (node != null) { int scrollH = 0; FCHScrollBar hscrollBar = HScrollBar; if (hscrollBar != null && hscrollBar.Visible) { scrollH = hscrollBar.Pos; } FCRect headerRect = node.TargetColumn.Bounds; headerRect.left += HorizontalOffset - scrollH; headerRect.top += VerticalOffset - scrollH; int left = headerRect.left; //复选框 if (m_checkBoxes) { int cw = m_checkBoxSize.cx; if (mp.x >= left && mp.x <= left + cw) { node.Checked = !node.Checked; return; } left += cw + 10; } //折叠节点 ArrayList <FCTreeNode> childNodes = node.getChildNodes(); if (childNodes != null && childNodes.size() > 0) { int nw = m_nodeSize.cx; if (mp.x >= left && mp.x <= left + nw) { if (node.Expended) { node.collapse(); } else { node.expend(); } update(); return; } } //移动 if (node.AllowDragOut) { m_movingNode = node; } } }
/// <summary> /// 属性改变方法 /// </summary> /// <param name="name">属性名称</param> /// <param name="value">属性值</param> public void onPropertyChanged(String name, String value) { if (name.ToLower() == "text") { List <FCGridRow> selectedRows = m_tvCollection.SelectedRows; int selectedRowsSize = selectedRows.Count; if (selectedRowsSize > 0) { FCTreeNode node = selectedRows[0].getCell(0) as FCTreeNode; node.Text = value; } } }
/// <summary> /// 获取节点的索引 /// </summary> /// <param name="node">节点</param> /// <returns>索引</returns> public int getNodeIndex(FCTreeNode node) { int nodeSize = m_nodes.size(); for (int i = 0; i < nodeSize; i++) { if (m_nodes.get(i) == node) { return(i); } } return(-1); }
/// <summary> /// 选中所有子节点 /// </summary> /// <param name="nodes">节点集合</param> /// <param name="isChecked">是否选中</param> protected void checkChildNodes(ArrayList <FCTreeNode> nodes, bool isChecked) { int nodeSize = m_nodes.size(); for (int i = 0; i < nodeSize; i++) { FCTreeNode node = nodes.get(i); node.Checked = isChecked; ArrayList <FCTreeNode> childNodes = node.getChildNodes(); if (childNodes != null && childNodes.size() > 0) { checkChildNodes(childNodes, isChecked); } } }
/// <summary> /// 显示 /// </summary> public override void showDialog() { if (m_collectionName == "TabPages") { FCTabControl tabControlA = m_target as FCTabControl; List <FCTabPage> tabPages = tabControlA.getTabPages(); int tabPagesSize = tabPages.Count; for (int i = 0; i < tabPagesSize; i++) { FCTabPage tabPage = tabPages[i]; FCTreeNode node = new FCTreeNode(); node.setString(tabPage.Text); m_tvCollection.appendNode(node); node.Row.Tag = tabPage; } } else if (m_collectionName == "Columns") { FCGrid grid = m_target as FCGrid; List <FCGridColumn> columns = grid.getColumns(); int columnsSize = columns.Count; for (int i = 0; i < columnsSize; i++) { FCGridColumn column = columns[i]; FCTreeNode node = new FCTreeNode(); node.setString(column.Text); m_tvCollection.appendNode(node); node.Row.Tag = column; } } m_tvCollection.update(); m_gridSelectedRowsChangedEvent = new FCEvent(gridSelectedRowsChanged); m_gridProperty.Xml = m_xml; m_gridProperty.DesignerDiv = m_designerDiv; m_tvCollection.addEvent(m_gridSelectedRowsChangedEvent, FCEventID.GRIDSELECTEDROWSCHANGED); if (m_tvCollection.getRows().Count > 0) { ArrayList <FCGridRow> selectedRows = new ArrayList <FCGridRow>(); selectedRows.Add(m_tvCollection.getRow(0)); m_tvCollection.SelectedRows = selectedRows; } base.showDialog(); }
/// <summary> /// 折叠子节点 /// </summary> /// <param name="nodes">节点集合</param> /// <param name="expendAll">是否折叠儿子节点</param> protected void collapseChildNodes(ArrayList <FCTreeNode> nodes, bool collapseAll) { int nodeSize = nodes.size(); for (int i = 0; i < nodeSize; i++) { FCTreeNode node = nodes.get(i); if (collapseAll) { node.Expended = false; } node.Row.Visible = false; ArrayList <FCTreeNode> childNodes = node.getChildNodes(); if (childNodes != null && childNodes.size() > 0) { collapseChildNodes(childNodes, collapseAll); } } }
/// <summary> /// 父节点是否可见 /// </summary> /// <param name="node">节点</param> /// <returns>是否可见</returns> public bool isNodeVisible(FCTreeNode node) { FCTreeNode parentNode = node.Parent; if (parentNode != null) { if (!parentNode.Expended) { return(false); } else { return(isNodeVisible(parentNode)); } } else { return(true); } }
/// <summary> /// 展开所有的节点 /// </summary> /// <param name="nodes">节点集合</param> /// <param name="parentExpened">父节点是否展开</param> /// <param name="expendAll">儿子节点是否展开</param> protected void expendChildNodes(ArrayList <FCTreeNode> nodes, bool parentExpened, bool expendAll) { int nodeSize = nodes.size(); for (int i = 0; i < nodeSize; i++) { FCTreeNode node = nodes.get(i); bool pExpended = parentExpened; if (expendAll) { pExpended = true; node.Row.Visible = true; node.Expended = true; } else { if (parentExpened) { node.Row.Visible = true; } else { node.Row.Visible = false; } if (!node.Expended) { pExpended = false; } } ArrayList <FCTreeNode> childNodes = node.getChildNodes(); if (childNodes != null && childNodes.size() > 0) { expendChildNodes(childNodes, pExpended, expendAll); } } }
/// <summary> /// 移除节点 /// </summary> /// <param name="node">节点</param> public void removeNode(FCTreeNode node) { node.onRemovingNode(); m_nodes.remove(node); }
/// <summary> /// 添加节点 /// </summary> /// <param name="index">行索引</param> public virtual void onAddingNode(int index) { FCGridRow row = Row; if (Row == null) { //创建行 row = new FCGridRow(); FCTreeNode parentNode = m_parent; if (parentNode == null) { if (index != -1) { //插入行 m_tree.insertRow(index, row); //重置行的索引 ArrayList <FCGridRow> rows = m_tree.getRows(); int rowSize = rows.size(); for (int i = 0; i < rowSize; i++) { rows.get(i).Index = i; } } else { //添加行 m_tree.addRow(row); //设置索引 ArrayList <FCGridRow> rows = m_tree.getRows(); row.Index = rows.size() - 1; } row.addCell(0, this); m_targetColumn = m_tree.getColumn(0); } else { //获取行索引 int rowIndex = parentNode.Row.Index + 1; if (index != -1) { rowIndex = index; } else { //查找上个节点 FCTreeNode lastNode = getLastNode(parentNode.getChildNodes()); if (lastNode != null) { if (lastNode.Row == null) { return; } rowIndex = lastNode.Row.Index + 1; } } //插入行 m_tree.insertRow(rowIndex, row); ArrayList <FCGridRow> rows = m_tree.getRows(); int rowSize = rows.size(); //重置索引 if (rowIndex == rowSize - 1) { row.Index = rowIndex; } else { for (int i = 0; i < rowSize; i++) { rows.get(i).Index = i; } } row.addCell(0, this); m_targetColumn = m_tree.getColumn(parentNode.m_targetColumn.Index + 1); } ColSpan = m_tree.getColumns().size(); //添加子节点 if (m_nodes != null && m_nodes.size() > 0) { int nodeSize = m_nodes.size(); for (int i = 0; i < nodeSize; i++) { m_nodes.get(i).onAddingNode(-1); } } row.Visible = isNodeVisible(this); } }
/// <summary> /// 添加类 /// </summary> public void addClass() { XmlDocument xmlDoc = m_xml.XmlDoc; if (m_collectionName == "TabPages") { FCTabControl tabControl = m_target as FCTabControl; FCTabPage tabPage = new FCTabPage(); tabControl.addControl(tabPage); String newControlName = UITemplate.CreateControlName(tabPage, m_xml); tabPage.Name = newControlName; tabPage.Text = newControlName; XmlNode tabControlNode = m_xml.Nodes[tabControl]; XmlNode tabpageNode = m_xml.XmlDoc.CreateNode(XmlNodeType.Element, "div", ""); tabControlNode.AppendChild(tabpageNode); XmlAttribute xmlAtr1 = xmlDoc.CreateAttribute("name"); xmlAtr1.Value = tabPage.Text; tabpageNode.Attributes.Append(xmlAtr1); XmlAttribute xmlAtr2 = xmlDoc.CreateAttribute("text"); xmlAtr2.Value = tabPage.Text; tabpageNode.Attributes.Append(xmlAtr2); XmlAttribute xmlAtr3 = xmlDoc.CreateAttribute("type"); xmlAtr3.Value = "tabpage"; tabpageNode.Attributes.Append(xmlAtr3); m_xml.m_controls.Add(tabPage); m_xml.Nodes[tabPage] = tabpageNode; FCTreeNode node = new FCTreeNode(); node.setString(tabPage.Name); m_tvCollection.appendNode(node); node.Row.Tag = tabPage; m_tvCollection.update(); m_tvCollection.selectNextRow(); tabControl.update(); } else if (m_collectionName == "Columns") { FCGrid grid = m_target as FCGrid; FCGridColumn column = new FCGridColumn(); grid.addColumn(column); String newControlName = UITemplate.CreateControlName(column, m_xml); column.Name = newControlName; column.Text = newControlName; XmlNode gridNode = m_xml.Nodes[grid]; XmlNode columnsNode = null; foreach (XmlNode subNode in gridNode.ChildNodes) { if (subNode.Name.ToLower() == "columns" || subNode.Name.ToLower() == "tr") { columnsNode = subNode; break; } } if (columnsNode == null) { columnsNode = xmlDoc.CreateNode(XmlNodeType.Element, "tr", ""); gridNode.AppendChild(columnsNode); } XmlNode columnNode = m_xml.XmlDoc.CreateNode(XmlNodeType.Element, "th", ""); columnNode.InnerText = column.Text; columnsNode.AppendChild(columnNode); XmlAttribute xmlAtr1 = xmlDoc.CreateAttribute("name"); xmlAtr1.Value = column.Text; columnNode.Attributes.Append(xmlAtr1); m_xml.m_controls.Add(column); m_xml.Nodes[column] = columnNode; FCTreeNode node = new FCTreeNode(); node.setString(column.Name); m_tvCollection.appendNode(node); node.Row.Tag = column; grid.update(); } m_tvCollection.update(); m_tvCollection.selectNextRow(); Native.invalidate(); m_designerDiv.saveUndo(); }