Пример #1
0
        /// <summary>
        /// Called when a project is loaded
        /// </summary>
        /// <param name="hierarchy"></param>
        public void RegisterHierarchy(IVsHierarchy hierarchy, XProject Prj, XSharpProjectNode ProjectNode)
        {
            // No Hierarchy or... Hierarchy already registered ?
            var optionsPage = XSharpProjectPackage.Instance.GetIntellisenseOptionsPage();

            // disable classview for now
            if (optionsPage.DisableClassViewObjectView)// || true)
            {
                return;
            }

            if ((null == hierarchy) || hierarchies.ContainsKey(hierarchy))
            {
                return;
            }
            //
            if (0 == objectManagerCookie)
            {
                IVsObjectManager2 objManager = provider.GetService(typeof(SVsObjectManager)) as IVsObjectManager2;
                if (null == objManager)
                {
                    return;
                }
                Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(
                    objManager.RegisterSimpleLibrary(library, out objectManagerCookie));
            }
            // The project is the Root of the Library
            XSharpLibraryProject prjNode = new XSharpLibraryProject(Prj, hierarchy);

            library.AddNode(prjNode);

            //this._defaultNameSpace = prjNode.DefaultNameSpace;
            //Define Callback
            ProjectNode.ProjectModel.FileWalkComplete    = new XProject.OnFileWalkComplete(OnFileWalkComplete);
            ProjectNode.ProjectModel.ProjectWalkComplete = new XProject.OnProjectWalkComplete(OnProjectWalkComplete);

            // Attach a listener to the Project/Hierarchy,so any change is raising an event
            HierarchyListener listener = new HierarchyListener(hierarchy);

            //listener.OnAddItem += new EventHandler<HierarchyEventArgs>(OnNewFile);
            listener.OnDeleteItem += new EventHandler <HierarchyEventArgs>(OnDeleteFile);
            listener.StartListening();
            hierarchies.Add(hierarchy, listener);
            // and ask for any change in the files that are opened in Source editor.
            RegisterForRDTEvents();
        }
Пример #2
0
        private void CreateModuleTree(XSharpLibraryProject prjNode, XFile scope, XSharpModuleId moduleId)
        {
            if (null == scope || XSolution.IsClosing)
            {
                return;
            }

            if (!scope.HasCode)
            {
                return;
            }
            // Retrieve all Types
            // !!! WARNING !!! The XFile object (scope) comes from the DataBase
            // We should retrieve TypeList from the DataBase.....
            var namespaces = XSharpModel.XDatabase.GetNamespacesInFile(scope.Id.ToString());

            if (namespaces == null)
            {
                return;
            }
            //
            var elements = XDbResultHelpers.BuildTypesInFile(scope, namespaces);

            // First search for NameSpaces
            foreach (XTypeDefinition xType in elements)
            {
                if (xType.Kind == Kind.Namespace)
                {
                    // Does that NameSpace already exist ?
                    // Search for the corresponding NameSpace
                    XSharpLibraryNode newNode;
                    LibraryNode       nsNode = prjNode.SearchNameSpace(xType.Name);
                    if (nsNode is XSharpLibraryNode)
                    {
                        newNode = (XSharpLibraryNode)nsNode;
                        newNode.Depends(moduleId.ItemID);
                    }
                    else
                    {
                        newNode = new XSharpLibraryNode(xType, "", moduleId.Hierarchy, moduleId.ItemID);

                        // NameSpaces are always added to the root.
                        prjNode.AddNode(newNode);
                        newNode.parent = prjNode;
                    }
                    // Handle Global Scope here
                    // It contains Function/Procedure/etc...
                    if (newNode.Name == "(Global Scope)")
                    {
                        CreateGlobalTree(newNode, xType, moduleId);
                    }
                    lock (files)
                    {
                        files.Add(moduleId, newNode);
                    }
                }
            }

            // Retrieve Classes from the file
            var types = XSharpModel.XDatabase.GetTypesInFile(scope.Id.ToString());

            if (types == null)
            {
                return;
            }
            elements = XDbResultHelpers.BuildFullTypesInFile(scope, types);
            // Now, look for Classes
            foreach (XTypeDefinition xType in elements)
            {
                // Is it a kind of Type ?
                if ((xType.Kind.IsType()))
                {
                    string nSpace = prjNode.DefaultNameSpace;
                    if (!String.IsNullOrEmpty(xType.Namespace))
                    {
                        nSpace = xType.Namespace;
                    }
                    // Search for the corresponding NameSpace
                    LibraryNode nsNode = prjNode.SearchNameSpace(nSpace);
                    if (nsNode == null)
                    {
                        nsNode = prjNode.SearchClass(nSpace);
                    }

                    if (nsNode is XSharpLibraryNode)
                    {
                        XSharpLibraryNode xsNSNode = (XSharpLibraryNode)nsNode;
                        // So the Class node will belong to that NameSpace Node
                        // Now, try to check if such Type already exist
                        XSharpLibraryNode newNode;
                        LibraryNode       newTmpNode;
                        newTmpNode = xsNSNode.SearchClass(xType.Name);
                        if (newTmpNode is XSharpLibraryNode)
                        {
                            newNode = (XSharpLibraryNode)newTmpNode;
                            newNode.Depends(moduleId.ItemID);
                        }
                        else
                        {
                            newNode = new XSharpLibraryNode(xType, "", moduleId.Hierarchy, moduleId.ItemID);
                            nsNode.AddNode(newNode);
                            newNode.parent = nsNode;
                        }
                        //
                        // Insert Members
                        CreateMembersTree(newNode, xType, moduleId);
                        //
                        lock (files)
                        {
                            files.Add(moduleId, newNode);
                        }
                    }
                    else
                    {
                        // Not found !?
                    }
                }
            }
        }
Пример #3
0
        private void CreateModuleTree(XSharpLibraryProject prjNode, XFile scope, XSharpModuleId moduleId)
        {
            if ((null == scope))
            {
                return;
            }
            if (!scope.HasCode)
            {
                return;
            }
            // Retrieve all Types
            var elements = scope.TypeList;

            if (elements == null)
            {
                return;
            }
            //
            // First search for NameSpaces
            foreach (KeyValuePair <string, XType> pair in elements)
            {
                XType xType = pair.Value;
                if (xType.Kind == Kind.Namespace)
                {
                    // Does that NameSpave already exist ?
                    // Search for the corresponding NameSpace
                    XSharpLibraryNode newNode;
                    LibraryNode       nsNode = prjNode.SearchNameSpace(xType.Name);
                    if (nsNode is XSharpLibraryNode)
                    {
                        newNode = (XSharpLibraryNode)nsNode;
                        newNode.Depends(moduleId.ItemID);
                    }
                    else
                    {
                        newNode = new XSharpLibraryNode(xType, "", moduleId.Hierarchy, moduleId.ItemID);

                        // NameSpaces are always added to the root.
                        prjNode.AddNode(newNode);
                        newNode.parent = prjNode;
                    }
                    // Handle Global Scope here
                    // It contains Function/Procedure/etc...
                    if (newNode.Name == "(Global Scope)")
                    {
                        CreateGlobalTree(newNode, xType, moduleId);
                    }
                    lock (files)
                    {
                        files.Add(moduleId, newNode);
                    }
                }
            }

            // Now, look for Classes
            foreach (KeyValuePair <string, XType> pair in elements)
            {
                XType xType = pair.Value;
                // Is it a kind of Type ?
                if ((xType.Kind.IsType()))
                {
                    string nSpace = prjNode.DefaultNameSpace;
                    if (!String.IsNullOrEmpty(xType.NameSpace))
                    {
                        nSpace = xType.NameSpace;
                    }
                    // Search for the corresponding NameSpace
                    LibraryNode nsNode = prjNode.SearchNameSpace(nSpace);
                    if (nsNode is XSharpLibraryNode)
                    {
                        XSharpLibraryNode xsNSNode = (XSharpLibraryNode)nsNode;
                        // So the Class node will belong to that NameSpace Node
                        // Now, try to check if such Type already exist
                        XSharpLibraryNode newNode;
                        LibraryNode       newTmpNode;
                        newTmpNode = xsNSNode.SearchClass(xType.Name);
                        if (newTmpNode is XSharpLibraryNode)
                        {
                            newNode = (XSharpLibraryNode)newTmpNode;
                            newNode.Depends(moduleId.ItemID);
                        }
                        else
                        {
                            newNode = new XSharpLibraryNode(xType, "", moduleId.Hierarchy, moduleId.ItemID);
                            nsNode.AddNode(newNode);
                            newNode.parent = nsNode;
                        }
                        // Insert Members
                        CreateMembersTree(newNode, xType, moduleId);
                        //
                        lock (files)
                        {
                            files.Add(moduleId, newNode);
                        }
                    }
                    else
                    {
                        // Not found !?
                    }
                }
            }
        }