private bool IsAnalyzableSource(uint itemId, out string canonicalName) { // Find out if this item is a physical file. Guid typeGuid; canonicalName = null; int hr = Hierarchy.GetGuidProperty(itemId, (int)__VSHPROPID.VSHPROPID_TypeGuid, out typeGuid); if (Microsoft.VisualStudio.ErrorHandler.Failed(hr) || VSConstants.GUID_ItemType_PhysicalFile != typeGuid) { // It is not a file, we can exit now. return(false); } // This item is a file; find if current language can recognize it. hr = Hierarchy.GetCanonicalName(itemId, out canonicalName); if (ErrorHandler.Failed(hr)) { return(false); } return((System.IO.Path.GetExtension(canonicalName).Equals(".xaml", StringComparison.OrdinalIgnoreCase)) || _package.IsRecognizedFile(canonicalName)); }
public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame) { // Check if this document is in the list of the documents. if (_documents.ContainsKey(docCookie)) { return(VSConstants.S_OK); } // Get the information about this document from the RDT. IVsRunningDocumentTable rdt = GetPackageService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; if (null != rdt) { // Note that here we don't want to throw in case of error. uint flags; uint readLocks; uint writeLoks; string documentMoniker; IVsHierarchy hierarchy; uint itemId; IntPtr unkDocData; int hr = rdt.GetDocumentInfo(docCookie, out flags, out readLocks, out writeLoks, out documentMoniker, out hierarchy, out itemId, out unkDocData); try { if (Microsoft.VisualStudio.ErrorHandler.Failed(hr) || (IntPtr.Zero == unkDocData)) { return(VSConstants.S_OK); } // Check if the herarchy is one of the hierarchies this service is monitoring. if (!_hierarchies.ContainsKey(hierarchy)) { // This hierarchy is not monitored, we can exit now. return(VSConstants.S_OK); } // Check the file to see if a listener is required. if (_package.IsRecognizedFile(documentMoniker)) { return(VSConstants.S_OK); } // Create the module id for this document. ModuleId docId = new ModuleId(hierarchy, itemId); // Try to get the text buffer. IVsTextLines buffer = Marshal.GetObjectForIUnknown(unkDocData) as IVsTextLines; // Create the listener. TextLineEventListener listener = new TextLineEventListener(buffer, documentMoniker, docId); // Set the event handler for the change event. Note that there is no difference // between the AddFile and FileChanged operation, so we can use the same handler. listener.OnFileChanged += new EventHandler <HierarchyEventArgs>(OnNewFile); // Add the listener to the dictionary, so we will not create it anymore. _documents.Add(docCookie, listener); } finally { if (IntPtr.Zero != unkDocData) { Marshal.Release(unkDocData); } } } // Always return success. return(VSConstants.S_OK); }