/// <summary> /// Add tags to browse tree /// </summary> /// <param name="root"></param> /// <param name="tags"></param> void _InsertTags2(TreeNode root, List <ITag> tags) { if (tags.Count == 0) { return; } //tags.Sort(new Comparison<ITag>(_CompareTag)); ClassViewIndex index = root.Tag as ClassViewIndex; foreach (ITag tag in tags) { // The case of a node with the same name that will not appear in the view if (index.TagFullName2TreeNode_Index.ContainsKey(tag.FullName)) { continue; } TreeNode n = new TreeNode(); if (!tag.BindToTreeNode(n)) { continue; } n.Tag = tag; index.TagFullName2TreeNode_Index[tag.FullName] = n; if (!index.FileName2TreeNode_Index.ContainsKey(tag.SourceFile)) { index.FileName2TreeNode_Index[tag.SourceFile] = new List <TreeNode>(); } index.FileName2TreeNode_Index[tag.SourceFile].Add(n); // For the Python language, all import is placed under the Import folder and all variable are placed under the variable folder //For C + +, all macros are placed under the Macro folder, TypeDef, function, global var in a separate folder //For C, macro, TypeDef, global var into a separate folder TreeNode parent = null; //if (tag.FullName.IndexOf('.') == -1 || tag.TagType == TagType.CSharp_Namespace) if (tag.FullName == tag.TagName) // Top-level objects { if (tag.Lang == Language.Cpp && tag.TagType == TagType.Cpp_Macro || tag.Lang == Language.C && tag.TagType == TagType.C_Macro) { if (index.CppMacroNode == null) { index.CppMacroNode = new TreeNode("Macro", Resource.ClassViewIcon_Cpp_Macro, Resource.ClassViewIcon_Cpp_Macro); index.CppMacroNode.Tag = "CppMacroNode"; root.Nodes.Insert(0, index.CppMacroNode); } parent = index.CppMacroNode; } else if ((tag.Lang == Language.Cpp && tag.TagType == TagType.Cpp_Function || tag.Lang == Language.C && tag.TagType == TagType.C_Function) && string.IsNullOrEmpty(tag.BelongTo)) { if (index.CppGloalFuncNode == null) { index.CppGloalFuncNode = new TreeNode("Global Function", Resource.ClassViewIcon_Cpp_Function, Resource.ClassViewIcon_Cpp_Function); index.CppGloalFuncNode.Tag = "CppGlobalFuncNode"; root.Nodes.Insert(0, index.CppGloalFuncNode); } parent = index.CppGloalFuncNode; } else if ((tag.Lang == Language.Cpp && tag.TagType == TagType.Cpp_Typedef || tag.Lang == Language.C && tag.TagType == TagType.C_Typedef) && string.IsNullOrEmpty(tag.BelongTo)) { if (index.CppTypedefNode == null) { index.CppTypedefNode = new TreeNode("Global Typedef", Resource.ClassViewIcon_Cpp_Typedef, Resource.ClassViewIcon_Cpp_Typedef); index.CppTypedefNode.Tag = "CppTypedefNode"; root.Nodes.Insert(0, index.CppTypedefNode); } parent = index.CppTypedefNode; } else if ((tag.Lang == Language.Cpp && tag.TagType == TagType.Cpp_Variable || tag.Lang == Language.C && tag.TagType == TagType.C_Variable) && string.IsNullOrEmpty(tag.BelongTo)) { if (index.CppGlobalVar == null) { index.CppGlobalVar = new TreeNode("Global Variable", Resource.ClassViewIcon_Cpp_Variable, Resource.ClassViewIcon_Cpp_Variable); index.CppGlobalVar.Tag = "CppGlobalVarNode"; root.Nodes.Insert(0, index.CppGlobalVar); } parent = index.CppGlobalVar; } else { parent = root; } } else { Utility.Assert(tag.FullName.EndsWith(tag.TagName)); string key = tag.FullName.Substring(0, tag.FullName.Length - tag.TagName.Length); while (key.Length > 0 && key.EndsWith(".") || key.EndsWith(":")) // Remove the last member accessor, generally ".", C + + is "::" { key = key.Substring(0, key.Length - 1); } if (string.IsNullOrEmpty(key)) { continue; } if (!index.TagFullName2TreeNode_Index.ContainsKey(key)) { continue; } parent = index.TagFullName2TreeNode_Index[key]; } _InsertNode(parent, n); } }
/// <summary> /// 将标签添加到浏览树 /// </summary> /// <param name="root"></param> /// <param name="tags"></param> void _InsertTags2(TreeNode root, List <ITag> tags) { if (tags.Count == 0) { return; } //tags.Sort(new Comparison<ITag>(_CompareTag)); ClassViewIndex index = root.Tag as ClassViewIndex; foreach (ITag tag in tags) { // 同名结点的情况, 视图中将不显示 if (index.TagFullName2TreeNode_Index.ContainsKey(tag.FullName)) { continue; } TreeNode n = new TreeNode(); if (!tag.BindToTreeNode(n)) { continue; } n.Tag = tag; index.TagFullName2TreeNode_Index[tag.FullName] = n; if (!index.FileName2TreeNode_Index.ContainsKey(tag.SourceFile)) { index.FileName2TreeNode_Index[tag.SourceFile] = new List <TreeNode>(); } index.FileName2TreeNode_Index[tag.SourceFile].Add(n); // 对于Python语言,所有的import放到Import文件夹下,所有的Variable放到Variable文件夹下 // 对于c++, 所有的宏放到Macro文件夹下, typedef, function, global var放到单独的文件夹下 // 对于C, macro, typedef, global var 放入单独的文件夹下 TreeNode parent = null; //if (tag.FullName.IndexOf('.') == -1 || tag.TagType == TagType.CSharp_Namespace) if (tag.FullName == tag.TagName) // 顶层对象 { if (tag.Lang == Language.Python && tag.TagType == TagType.Python_Import) { if (index.PyImportNode == null) { index.PyImportNode = new TreeNode("Import", ResourceManager.ClassViewIcon_Python_Import, ResourceManager.ClassViewIcon_Python_Import); index.PyImportNode.Tag = "PyImportNode"; root.Nodes.Insert(0, index.PyImportNode); } parent = index.PyImportNode; } else if (tag.Lang == Language.Python && tag.TagType == TagType.Python_Variable) { if (index.PyVarNode == null) { index.PyVarNode = new TreeNode("Variable", ResourceManager.ClassViewIcon_Python_Variable, ResourceManager.ClassViewIcon_Python_Variable); index.PyVarNode.Tag = "PyVarNode"; root.Nodes.Insert(0, index.PyVarNode); } parent = index.PyVarNode; } else if (tag.Lang == Language.Cpp && tag.TagType == TagType.Cpp_Macro || tag.Lang == Language.C && tag.TagType == TagType.C_Macro) { if (index.CppMacroNode == null) { index.CppMacroNode = new TreeNode("Macro", ResourceManager.ClassViewIcon_Cpp_Macro, ResourceManager.ClassViewIcon_Cpp_Macro); index.CppMacroNode.Tag = "CppMacroNode"; root.Nodes.Insert(0, index.CppMacroNode); } parent = index.CppMacroNode; } else if ((tag.Lang == Language.Cpp && tag.TagType == TagType.Cpp_Function || tag.Lang == Language.C && tag.TagType == TagType.C_Function) && string.IsNullOrEmpty(tag.BelongTo)) { if (index.CppGloalFuncNode == null) { index.CppGloalFuncNode = new TreeNode("Global Function", ResourceManager.ClassViewIcon_Cpp_Function, ResourceManager.ClassViewIcon_Cpp_Function); index.CppGloalFuncNode.Tag = "CppGlobalFuncNode"; root.Nodes.Insert(0, index.CppGloalFuncNode); } parent = index.CppGloalFuncNode; } else if ((tag.Lang == Language.Cpp && tag.TagType == TagType.Cpp_Typedef || tag.Lang == Language.C && tag.TagType == TagType.C_Typedef) && string.IsNullOrEmpty(tag.BelongTo)) { if (index.CppTypedefNode == null) { index.CppTypedefNode = new TreeNode("Global Typedef", ResourceManager.ClassViewIcon_Cpp_Typedef, ResourceManager.ClassViewIcon_Cpp_Typedef); index.CppTypedefNode.Tag = "CppTypedefNode"; root.Nodes.Insert(0, index.CppTypedefNode); } parent = index.CppTypedefNode; } else if ((tag.Lang == Language.Cpp && tag.TagType == TagType.Cpp_Variable || tag.Lang == Language.C && tag.TagType == TagType.C_Variable) && string.IsNullOrEmpty(tag.BelongTo)) { if (index.CppGlobalVar == null) { index.CppGlobalVar = new TreeNode("Global Variable", ResourceManager.ClassViewIcon_Cpp_Variable, ResourceManager.ClassViewIcon_Cpp_Variable); index.CppGlobalVar.Tag = "CppGlobalVarNode"; root.Nodes.Insert(0, index.CppGlobalVar); } parent = index.CppGlobalVar; } #region C与C++共用一些结点 #endregion else if (tag.Lang == Language.JavaScript) { if (index.JS == null) { index.JS = new TreeNode("JavaScript", ResourceManager.ClassViewIcon_JavaScript, ResourceManager.ClassViewIcon_JavaScript); index.JS.Tag = "JavaScript"; root.Nodes.Insert(0, index.JS); } if (tag.TagType == TagType.JavaScript_Method && tag.TagName.IndexOf('.') > -1) { string key = tag.TagName.Substring(0, tag.TagName.IndexOf('.')); if (index.TagFullName2TreeNode_Index.ContainsKey(key)) { parent = index.TagFullName2TreeNode_Index[key]; } else { parent = index.JS; } } else { parent = index.JS; } } else { parent = root; } } else { Utility.Assert(tag.FullName.EndsWith(tag.TagName)); string key = tag.FullName.Substring(0, tag.FullName.Length - tag.TagName.Length); while (key.Length > 0 && key.EndsWith(".") || key.EndsWith(":")) // 去除最后的成员访问符, 一般是".", c++里是"::" { key = key.Substring(0, key.Length - 1); } if (string.IsNullOrEmpty(key)) { continue; } if (!index.TagFullName2TreeNode_Index.ContainsKey(key)) { continue; } parent = index.TagFullName2TreeNode_Index[key]; } _InsertNode(parent, n); //parent.Nodes.Add(n); } }