/// <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 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 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; }
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; }
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))); }
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); } }
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; }