Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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);
            }
        }