private void tvwSceneList_MouseDown(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { //自动选中当前鼠标指针下的节点 TreeNode node = tvwSceneList.GetNodeAt(e.X, e.Y); if (node != null) { tvwSceneList.SelectedNode = node; //根据节点类型弹出不同的上下文菜单 GxTreeNode selectedNode = (GxTreeNode)node; if (selectedNode != null) { GXNodeType type = selectedNode.getGxNodeType(); if (type == GXNodeType.GX_NODE_TYPE_DIRECTORY) { tvwSceneList.ContextMenuStrip = ctmSceneDirectory; } else if (type == GXNodeType.GX_NODE_TYPE_SCENE) { tvwSceneList.ContextMenuStrip = ctmSceneNode; } else if (type == GXNodeType.GX_NODE_TYPE_PROJECT) { tvwSceneList.ContextMenuStrip = ctmProjectNode; } } } } }
public GxTreeNode( string text = "", object tag = null, GXNodeType type = GXNodeType.GX_NODE_TYPE_NONE, ICON_TYPE imageIndex = ICON_TYPE.ICON_SCENE, ICON_TYPE selectedImageIndex = ICON_TYPE.ICON_SCENE) { base.Text = text; base.Tag = tag; setGxNodeType(type); base.ImageIndex = Convert.ToInt32(imageIndex); base.SelectedImageIndex = Convert.ToInt32(selectedImageIndex); }
/// <summary> /// 处理场景列表 /// </summary> /// <param name="sceneDirPath"></param> /// <param name="parentNode"></param> /*private void traversalSceneList(string sceneDirPath, GxTreeNode parentNode) * { * DirectoryInfo sceneDirInfo = new DirectoryInfo(sceneDirPath); * * try * { * foreach (DirectoryInfo dir in sceneDirInfo.GetDirectories()) * { * GxSceneDirectory gxSceneDir = new GxSceneDirectory(); * gxSceneDir.setPath(dir.FullName); * * GxTreeNode node = new GxTreeNode(); * node.setGxNodeType(GXNodeType.GX_NODE_TYPE_DIRECTORY); * node.Tag = gxSceneDir; * node.Text = dir.Name; * node.ImageIndex = 1; * node.SelectedImageIndex = 1; * parentNode.Nodes.Add(node); * * traversalSceneList(sceneDirInfo + "\\" + dir.ToString() + "\\", node); * } * * foreach (FileInfo file in sceneDirInfo.GetFiles("*.gxs")) //查找文件 * { * GxScene gxScene = new GxScene(file.FullName); * GxTreeNode node = new GxTreeNode(); * node.setGxNodeType(GXNodeType.GX_NODE_TYPE_SCENE); * node.Tag = gxScene; * node.Text = Path.GetFileNameWithoutExtension(file.Name); * node.ImageIndex = 2; * node.SelectedImageIndex = 2; * parentNode.Nodes.Add(node); * } * } * catch (Exception e) * { * Logger.Error(e.Message); * } * }*/ private void ctmSceneNode_Cut_Click(object sender, EventArgs e) { //设置剪切板内容 GxTreeNode selectedNode = (GxTreeNode)tvwSceneList.SelectedNode; if (selectedNode != null) { GXNodeType nodeType = selectedNode.getGxNodeType(); if (nodeType == GXNodeType.GX_NODE_TYPE_NONE || nodeType == GXNodeType.GX_NODE_TYPE_PROJECT) { Logger.Error("could not cut an invalid node."); return; } //当前节点是否已经是剪切板的节点 if (selectedNode == _clipboardTreeNode) { Logger.Error("The selected node is equals _cliboardTreeNode."); return; } //把当前处于剪切状态的透明图标还原为正常 //restoreNodeOriginalIcon(); //取得要剪切的节点的图标索引 int rawImageIndex = Convert.ToInt32(selectedNode.ImageIndex); //查找是否含有透明的图标 string tranImageKey = "TransIndex_" + Convert.ToString(rawImageIndex); int tranImageIndex = imgTreeIcons.Images.IndexOfKey(tranImageKey); //找不到rawImageIndex索引的透明版本图标则生成一个 if (tranImageIndex == -1) { //生成一个透明的图标 Bitmap bitmap = new Bitmap(imgTreeIcons.Images[rawImageIndex]); bitmap = transparentAdjust(bitmap, 180); imgTreeIcons.Images.Add(tranImageKey, bitmap); tranImageIndex = imgTreeIcons.Images.IndexOfKey(tranImageKey); } //更新图标 selectedNode.ImageIndex = tranImageIndex; selectedNode.SelectedImageIndex = tranImageIndex; selectedNode.setTransImageIndex(tranImageIndex); //设置剪切板内容 setClipboard(selectedNode, OPERATION_TYPE.OP_CUT); } }
/// <summary> /// 根据节点类型获取原始图标 /// </summary> /// <param name="nodeType"></param> /// <returns></returns> private ICON_TYPE getRawImageIndex(GXNodeType nodeType) { switch (nodeType) { case GXNodeType.GX_NODE_TYPE_PROJECT: return(ICON_TYPE.ICON_PROJECT); case GXNodeType.GX_NODE_TYPE_DIRECTORY: return(ICON_TYPE.ICON_SCENE_DIR); case GXNodeType.GX_NODE_TYPE_SCENE: return(ICON_TYPE.ICON_SCENE); } return(ICON_TYPE.ICON_SCENE); }
private void ctmSceneNode_Copy_Click(object sender, EventArgs e) { GxTreeNode selectedNode = (GxTreeNode)tvwSceneList.SelectedNode; if (selectedNode != null) { GXNodeType nodeType = selectedNode.getGxNodeType(); if (nodeType == GXNodeType.GX_NODE_TYPE_NONE || nodeType == GXNodeType.GX_NODE_TYPE_PROJECT) { Logger.Error("could not copy an invalid node."); return; } //设置剪切板内容 setClipboard(selectedNode, OPERATION_TYPE.OP_COPY); } }
private void tvwSceneList_DragOver(object sender, DragEventArgs e) { Point position = new Point(0, 0); position.X = e.X; position.Y = e.Y; position = tvwSceneList.PointToClient(position); GxTreeNode dropNode = (GxTreeNode)tvwSceneList.GetNodeAt(position); if (dropNode == null) { return; } tvwSceneList.SelectedNode = dropNode; GXNodeType type = dropNode.getGxNodeType(); if (type == GXNodeType.GX_NODE_TYPE_DIRECTORY || type == GXNodeType.GX_NODE_TYPE_PROJECT || type == GXNodeType.GX_NODE_TYPE_SCENE) { e.Effect = DragDropEffects.Move; } }
/// <summary> /// 移动一个节点 /// </summary> /// <param name="srcNode">要移动的节点</param> /// <param name="detNode">父节点</param> /// <returns>返回移动成功的节点</returns> public GxTreeNode moveNode(GxTreeNode srcNode, GxTreeNode dstNode) { if (srcNode == null || dstNode == null) { Logger.Error("srcNode == null || dstNode == null."); return(null); } if (srcNode == dstNode) { Logger.Error("srcNode is equals to dstNode."); return(null); } if (findNode(srcNode) == false || findNode(dstNode) == false) { Logger.Error("srcNode or dstNode not in NodeCollection"); return(null); } //目标节点不能是源节点的子节点 if (findNode(dstNode, srcNode) == true) { Logger.Error("dstNode is the childNode of srcNode"); return(null); } //判断目标节点是否文件夹节点或工程节点 GXNodeType dstNodeType = dstNode.getGxNodeType(); if (dstNodeType != GXNodeType.GX_NODE_TYPE_DIRECTORY && dstNodeType != GXNodeType.GX_NODE_TYPE_PROJECT) { Logger.Error("destination node is not directory type or not project type."); return(null); } //取得场景目录完整路径 string sceneDirFullPath = GxEnvManager.getEnv(GxEnvVarType.GXENV_PROJECT_SCENE_DIR); //如果原节点是目录 if (srcNode.getGxNodeType() == GXNodeType.GX_NODE_TYPE_DIRECTORY) { //取得源目录完整路径 GxNodeData srcNodeData = (GxNodeData)srcNode.Tag; string srcDirFullPath = srcNodeData.getPath(); if (Directory.Exists(srcDirFullPath) == false) { Logger.Error("srcNode dir path not exists."); return(null); } //DirectoryInfo srcDirInfo = new DirectoryInfo(srcDirFullPath); string srcDirName = Path.GetFileName(srcDirFullPath); //取得目标目录完整路径,默认为场景根目录 GxNodeData dstNodeData = (GxNodeData)dstNode.Tag; string dstDirFullPath = dstNodeData.getPath(); if (Directory.Exists(dstDirFullPath) == false) { Logger.Error("dstNode dir path not exists."); return(null); } //取得移动后的目录路径 string newDirFullPath = dstDirFullPath + "\\" + srcDirName; //检查目标路径是否存在了 if (Directory.Exists(newDirFullPath) == true) { Logger.Error("Destination dir is exists!"); return(null); } //检查目标路径是否与自己相等 if (srcDirFullPath == newDirFullPath) { Logger.Error("Two path equals."); return(null); } //移动目录 Directory.Move(srcDirFullPath, newDirFullPath); Logger.Debug(string.Format("Direcotry [{0}] moved to [{1}] finished!", srcDirFullPath, newDirFullPath)); //取得节点相关XML元素 XmlNode srcRelatedXmlNode = srcNodeData.getRelatedXmlNode(); XmlNode dstRelatedXmlNode = dstNodeData.getRelatedXmlNode(); //复制源xml节点的副本 XmlNode appendNode = srcRelatedXmlNode.CloneNode(true); //把复制的副本插入到目标节点中 dstRelatedXmlNode.AppendChild(appendNode); //把源xml节点删除 srcRelatedXmlNode.ParentNode.RemoveChild(srcRelatedXmlNode); //更新源节点的关联XMLNode srcNodeData.setRelatedXmlNode(appendNode); //取得父节点的基本数据 string newPath = IOUtil.getRelPath(newDirFullPath, sceneDirFullPath); srcNodeData.saveRealPathToXml(newPath, srcNode, true); } //移除原节点 srcNode.Remove(); //加到目标节点 dstNode.Nodes.Add(srcNode); return(srcNode); }
public void setGxNodeType(GXNodeType nodeType) { _gxNodeType = nodeType; }
/// <summary> /// 根据节点类型获取原始图标 /// </summary> /// <param name="nodeType"></param> /// <returns></returns> private ICON_TYPE getRawImageIndex(GXNodeType nodeType) { switch (nodeType) { case GXNodeType.GX_NODE_TYPE_PROJECT: return ICON_TYPE.ICON_PROJECT; case GXNodeType.GX_NODE_TYPE_DIRECTORY: return ICON_TYPE.ICON_SCENE_DIR; case GXNodeType.GX_NODE_TYPE_SCENE: return ICON_TYPE.ICON_SCENE; } return ICON_TYPE.ICON_SCENE; }