/// <summary>
        /// Do a recursive walk on the hierarchy to find all this language files in it.
        /// It will generate an event for every file found.
        /// </summary>
        private void InternalScanHierarchy(uint itemId)
        {
            uint currentItem = itemId;

            while (VSConstants.VSITEMID_NIL != currentItem)
            {
                // If this item is a my language file, then send the add item event.
                string itemName;
                if ((null != onItemAdded) && IsAnalyzableSource(currentItem, out itemName))
                {
                    HierarchyEventArgs args = new HierarchyEventArgs(currentItem, itemName);
                    onItemAdded(_hierarchy, args);
                }

                // NOTE: At the moment we skip the nested hierarchies, so here  we look for the
                // children of this node.
                // Before looking at the children we have to make sure that the enumeration has not
                // side effects to avoid unexpected behavior.
                object propertyValue;
                bool   canScanSubitems = true;
                int    hr = _hierarchy.GetProperty(currentItem, (int)__VSHPROPID.VSHPROPID_HasEnumerationSideEffects, out propertyValue);
                if ((VSConstants.S_OK == hr) && (propertyValue is bool))
                {
                    canScanSubitems = !(bool)propertyValue;
                }
                // If it is allow to look at the sub-items of the current one, lets do it.
                if (canScanSubitems)
                {
                    object child;
                    hr = _hierarchy.GetProperty(currentItem, (int)__VSHPROPID.VSHPROPID_FirstChild, out child);
                    if (VSConstants.S_OK == hr)
                    {
                        // There is a sub-item, call this same function on it.
                        InternalScanHierarchy(GetItemId(child));
                    }
                }

                // Move the current item to its first visible sibling.
                object sibling;
                hr = _hierarchy.GetProperty(currentItem, (int)__VSHPROPID.VSHPROPID_NextSibling, out sibling);
                if (VSConstants.S_OK != hr)
                {
                    currentItem = VSConstants.VSITEMID_NIL;
                }
                else
                {
                    currentItem = GetItemId(sibling);
                }
            }
        }
        public int OnItemDeleted(uint itemid)
        {
            // Notify that the item is deleted only if it is my language file.
            string name;

            if (!IsAnalyzableSource(itemid, out name))
            {
                return(VSConstants.S_OK);
            }
            if (null != onItemDeleted)
            {
                HierarchyEventArgs args = new HierarchyEventArgs(itemid, name);
                onItemDeleted(_hierarchy, args);
            }
            return(VSConstants.S_OK);
        }
Пример #3
0
        public void OnIdle()
        {
            if (!_isDirty)
            {
                return;
            }
            var onFileChanged = OnFileChanged;

            if (null != onFileChanged)
            {
                HierarchyEventArgs args = new HierarchyEventArgs(_fileId.ItemID, _fileName);
                args.TextBuffer = _buffer;
                onFileChanged(_fileId.Hierarchy, args);
            }

            _isDirty = false;
        }
        public int OnItemAdded(uint itemidParent, uint itemidSiblingPrev, uint itemidAdded)
        {
            // Check if the item is my language file.
            string name;

            if (!IsAnalyzableSource(itemidAdded, out name))
            {
                return(VSConstants.S_OK);
            }

            // This item is a my language file, so we can notify that it is added to the hierarchy.
            if (null != onItemAdded)
            {
                HierarchyEventArgs args = new HierarchyEventArgs(itemidAdded, name);
                onItemAdded(_hierarchy, args);
            }
            return(VSConstants.S_OK);
        }
Пример #5
0
        private void OnNewFile(object sender, HierarchyEventArgs args)
        {
            IVsHierarchy hierarchy = sender as IVsHierarchy;

            if (null == hierarchy)
            {
                return;
            }

            ITextBuffer buffer = null;

            if (null != args.TextBuffer)
            {
                buffer = _adapterFactory.GetDocumentBuffer(args.TextBuffer);
            }

            OnNewFile(new LibraryTask(args.CanonicalName, buffer, new ModuleId(hierarchy, args.ItemID)));
        }
Пример #6
0
        public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
        {
            if ((0 != dwEditLocksRemaining) || (0 != dwReadLocksRemaining))
            {
                return(VSConstants.S_OK);
            }
            TextLineEventListener listener;

            if (!_documents.TryGetValue(docCookie, out listener) || (null == listener))
            {
                return(VSConstants.S_OK);
            }
            using (listener) {
                _documents.Remove(docCookie);
                // Now make sure that the information about this file are up to date (e.g. it is
                // possible that Class View shows something strange if the file was closed without
                // saving the changes).
                HierarchyEventArgs args = new HierarchyEventArgs(listener.FileID.ItemID, listener.FileName);
                OnNewFile(listener.FileID.Hierarchy, args);
            }
            return(VSConstants.S_OK);
        }
Пример #7
0
        private void OnDeleteFile(object sender, HierarchyEventArgs args)
        {
            IVsHierarchy hierarchy = sender as IVsHierarchy;

            if (null == hierarchy)
            {
                return;
            }

            ModuleId    id   = new ModuleId(hierarchy, args.ItemID);
            LibraryNode node = null;

            lock (_files) {
                if (_files.TryGetValue(id, out node))
                {
                    _files.Remove(id);
                }
            }
            if (null != node)
            {
                _library.RemoveNode(node);
            }
        }
Пример #8
0
        public void OnIdle()
        {
            if (!_isDirty) {
                return;
            }
            var onFileChanged = OnFileChanged;
            if (null != onFileChanged) {
                HierarchyEventArgs args = new HierarchyEventArgs(_fileId.ItemID, _fileName);
                args.TextBuffer = _buffer;
                onFileChanged(_fileId.Hierarchy, args);
            }

            _isDirty = false;
        }
Пример #9
0
        private void OnNewFile(object sender, HierarchyEventArgs args)
        {
            IVsHierarchy hierarchy = sender as IVsHierarchy;
            if (null == hierarchy) {
                return;
            }

            ITextBuffer buffer = null;
            if (null != args.TextBuffer) {
                buffer = _adapterFactory.GetDocumentBuffer(args.TextBuffer);
            }

            OnNewFile(new LibraryTask(args.CanonicalName, buffer, new ModuleId(hierarchy, args.ItemID)));
        }
Пример #10
0
        private void OnDeleteFile(object sender, HierarchyEventArgs args)
        {
            IVsHierarchy hierarchy = sender as IVsHierarchy;
            if (null == hierarchy) {
                return;
            }

            ModuleId id = new ModuleId(hierarchy, args.ItemID);
            LibraryNode node = null;
            lock (_files) {
                if (_files.TryGetValue(id, out node)) {
                    _files.Remove(id);
                }
            }
            if (null != node) {
                _library.RemoveNode(node);
            }
        }
Пример #11
0
 public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
 {
     if ((0 != dwEditLocksRemaining) || (0 != dwReadLocksRemaining)) {
         return VSConstants.S_OK;
     }
     TextLineEventListener listener;
     if (!_documents.TryGetValue(docCookie, out listener) || (null == listener)) {
         return VSConstants.S_OK;
     }
     using (listener) {
         _documents.Remove(docCookie);
         // Now make sure that the information about this file are up to date (e.g. it is
         // possible that Class View shows something strange if the file was closed without
         // saving the changes).
         HierarchyEventArgs args = new HierarchyEventArgs(listener.FileID.ItemID, listener.FileName);
         OnNewFile(listener.FileID.Hierarchy, args);
     }
     return VSConstants.S_OK;
 }
Пример #12
0
        /// <summary>
        /// Do a recursive walk on the hierarchy to find all this language files in it.
        /// It will generate an event for every file found.
        /// </summary>
        private void InternalScanHierarchy(uint itemId)
        {
            uint currentItem = itemId;
            while (VSConstants.VSITEMID_NIL != currentItem) {
                // If this item is a my language file, then send the add item event.
                string itemName;
                if ((null != onItemAdded) && IsAnalyzableSource(currentItem, out itemName)) {
                    HierarchyEventArgs args = new HierarchyEventArgs(currentItem, itemName);
                    onItemAdded(_hierarchy, args);
                }

                // NOTE: At the moment we skip the nested hierarchies, so here  we look for the
                // children of this node.
                // Before looking at the children we have to make sure that the enumeration has not
                // side effects to avoid unexpected behavior.
                object propertyValue;
                bool canScanSubitems = true;
                int hr = _hierarchy.GetProperty(currentItem, (int)__VSHPROPID.VSHPROPID_HasEnumerationSideEffects, out propertyValue);
                if ((VSConstants.S_OK == hr) && (propertyValue is bool)) {
                    canScanSubitems = !(bool)propertyValue;
                }
                // If it is allow to look at the sub-items of the current one, lets do it.
                if (canScanSubitems) {
                    object child;
                    hr = _hierarchy.GetProperty(currentItem, (int)__VSHPROPID.VSHPROPID_FirstChild, out child);
                    if (VSConstants.S_OK == hr) {
                        // There is a sub-item, call this same function on it.
                        InternalScanHierarchy(GetItemId(child));
                    }
                }

                // Move the current item to its first visible sibling.
                object sibling;
                hr = _hierarchy.GetProperty(currentItem, (int)__VSHPROPID.VSHPROPID_NextSibling, out sibling);
                if (VSConstants.S_OK != hr) {
                    currentItem = VSConstants.VSITEMID_NIL;
                } else {
                    currentItem = GetItemId(sibling);
                }
            }
        }
Пример #13
0
 public int OnItemDeleted(uint itemid)
 {
     // Notify that the item is deleted only if it is my language file.
     string name;
     if (!IsAnalyzableSource(itemid, out name)) {
         return VSConstants.S_OK;
     }
     if (null != onItemDeleted) {
         HierarchyEventArgs args = new HierarchyEventArgs(itemid, name);
         onItemDeleted(_hierarchy, args);
     }
     return VSConstants.S_OK;
 }
Пример #14
0
        public int OnItemAdded(uint itemidParent, uint itemidSiblingPrev, uint itemidAdded)
        {
            // Check if the item is my language file.
            string name;
            if (!IsAnalyzableSource(itemidAdded, out name)) {
                return VSConstants.S_OK;
            }

            // This item is a my language file, so we can notify that it is added to the hierarchy.
            if (null != onItemAdded) {
                HierarchyEventArgs args = new HierarchyEventArgs(itemidAdded, name);
                onItemAdded(_hierarchy, args);
            }
            return VSConstants.S_OK;
        }