Пример #1
0
        private IntPtr CreateDocumentView(
            string physicalView,
            string documentName,
            IVsHierarchy hierarchy,
            VSConstants.VSITEMID itemid,
            IVsTextLines textLines,
            IntPtr docDataExisting,
            Guid languageServiceId,
            out string editorCaption,
            out Guid cmdUI)
        {
            // Init out params
            editorCaption = string.Empty;
            cmdUI         = Guid.Empty;

            if (string.IsNullOrEmpty(physicalView))
            {
                // create code window as default physical view
                return(CreateTextView(
                           textLines,
                           documentName,
                           hierarchy,
                           itemid,
                           docDataExisting,
                           languageServiceId,
                           ref editorCaption,
                           ref cmdUI));
            }

            // We couldn't create the view
            // Return special error code so VS can try another editor factory.
            ErrorHandler.ThrowOnFailure((int)VSConstants.VS_E_UNSUPPORTEDFORMAT);

            return(IntPtr.Zero);
        }
        public TextBufferInitializationTracker(
            string documentName,
            IVsHierarchy hierarchy,
            VSConstants.VSITEMID itemid,
            IVsTextLines textLines,
            Guid languageServiceId,
            List <TextBufferInitializationTracker> trackers)
        {
            VsAppShell.Current.CompositionService.SatisfyImportsOnce(this);

            _documentName        = documentName;
            _hierarchy           = hierarchy;
            _itemid              = itemid;
            _textLines           = textLines;
            _languageServiceGuid = languageServiceId;
            _trackers            = trackers;

            IConnectionPointContainer cpc = textLines as IConnectionPointContainer;
            Guid g = typeof(IVsTextBufferDataEvents).GUID;

            cpc.FindConnectionPoint(g, out cp);
            cp.Advise(this, out cookie);

            _trackers.Add(this);
        }
Пример #3
0
 public SourceFile(FileInfo file, VSConstants.VSITEMID itemId, IVsProject project, DTE dte)
 {
     this.File    = file ?? throw new ArgumentNullException(nameof(file));
     this.ItemId  = itemId;
     this.Dte     = dte ?? throw new ArgumentNullException(nameof(dte));
     this.Project = project ?? throw new ArgumentNullException(nameof(project));
     this.Reader  = this.ReaderFor(dte, file);
 }
        private static VSConstants.VSITEMID NextSibling(IVsHierarchy hierarchy, VSConstants.VSITEMID firstID)
        {
            object siblingIDObj = null;

            hierarchy.GetProperty((uint)firstID, (int)__VSHPROPID.VSHPROPID_NextSibling, out siblingIDObj);
            if (siblingIDObj != null)
            {
                return((VSConstants.VSITEMID)(int) siblingIDObj);
            }

            return(VSConstants.VSITEMID.Nil);
        }
        private static VSConstants.VSITEMID FirstChild(IVsHierarchy hierarchy, VSConstants.VSITEMID rootID)
        {
            object childIDObj = null;

            hierarchy.GetProperty((uint)rootID, (int)__VSHPROPID.VSHPROPID_FirstChild, out childIDObj);
            if (childIDObj != null)
            {
                return((VSConstants.VSITEMID)(int) childIDObj);
            }

            return(VSConstants.VSITEMID.Nil);
        }
        private List <VSConstants.VSITEMID> ChildrenOf(IVsHierarchy hierarchy, VSConstants.VSITEMID rootID)
        {
            var result = new List <VSConstants.VSITEMID>();

            for (VSConstants.VSITEMID itemID = FirstChild(hierarchy, rootID); itemID != VSConstants.VSITEMID.Nil; itemID = NextSibling(hierarchy, itemID))
            {
                result.Add(itemID);
                result.AddRange(ChildrenOf(hierarchy, itemID));
            }

            return(result);
        }
        public static IEnumerable <VSConstants.VSITEMID> GetChildrenIds(this IVsHierarchy hierarchy, VSConstants.VSITEMID startingWith)
        {
            hierarchy.GetProperty((uint)startingWith, (int)__VSHPROPID.VSHPROPID_FirstChild, out object idObj);
            while (idObj != null)
            {
                if (idObj is System.Reflection.Missing)
                {
                    break;
                }

                VSConstants.VSITEMID id = (VSConstants.VSITEMID)(int) idObj;
                yield return(id);

                hierarchy.GetProperty((uint)id, (int)__VSHPROPID.VSHPROPID_NextSibling, out idObj);
            }
        }
Пример #8
0
        private IntPtr CreateTextView(
            IVsTextLines textLines,
            string documentName,
            IVsHierarchy hierarchy,
            VSConstants.VSITEMID itemid,
            IntPtr docDataExisting,
            Guid languageServiceId,
            ref string editorCaption)
        {
            IVsCodeWindow window = _adaptersFactory.CreateVsCodeWindowAdapter(VsServiceProvider);

            ErrorHandler.ThrowOnFailure(window.SetBuffer(textLines));
            ErrorHandler.ThrowOnFailure(window.SetBaseEditorCaption(null));
            ErrorHandler.ThrowOnFailure(window.GetEditorCaption(READONLYSTATUS.ROSTATUS_Unknown, out editorCaption));

            CreateTextBufferInitializationTracker(textLines, documentName, hierarchy, itemid, docDataExisting, languageServiceId);

            return(Marshal.GetIUnknownForObject(window));
        }
Пример #9
0
        protected virtual void CreateTextBufferInitializationTracker(
            IVsTextLines textLines,
            string documentName,
            IVsHierarchy hierarchy,
            VSConstants.VSITEMID itemid,
            IntPtr docDataExisting,
            Guid languageServiceId)
        {
            // At this point buffer hasn't been initialized with content yet and hence we cannot
            // get ITextBuffer from the adapter. In order to get text buffer and properly attach
            // view filters we need to create a proxy class which will get called when document
            // is fully loaded and text buffer is finally populated with content.

            TextBufferInitializationTracker tracker = new TextBufferInitializationTracker(
                documentName, hierarchy, itemid, textLines, languageServiceId, InitializationTrackers);

            if (docDataExisting != IntPtr.Zero)
            {
                // When creating a new view for an existing buffer, the tracker object has to clean itself up
                tracker.OnLoadCompleted(0);
            }
        }
        public TextBufferInitializationTracker(
            string documentName,
            IVsHierarchy hierarchy,
            VSConstants.VSITEMID itemid,
            IVsTextLines textLines,
            Guid languageServiceId,
            List<TextBufferInitializationTracker> trackers) {
            VsAppShell.Current.CompositionService.SatisfyImportsOnce(this);

            _documentName = documentName;
            _hierarchy = hierarchy;
            _itemid = itemid;
            _textLines = textLines;
            _languageServiceGuid = languageServiceId;
            _trackers = trackers;

            IConnectionPointContainer cpc = textLines as IConnectionPointContainer;
            Guid g = typeof(IVsTextBufferDataEvents).GUID;
            cpc.FindConnectionPoint(g, out cp);
            cp.Advise(this, out cookie);

            _trackers.Add(this);
        }
Пример #11
0
 private static IEnumerable <ISource> GetSourceFiles(this IVsProject inProject, DTE dte, VSConstants.VSITEMID startingWith) =>
 ((IVsHierarchy)inProject).GetChildrenIds(startingWith).SelectMany(id => inProject.FilesUnder(dte, id));
Пример #12
0
        private static IEnumerable <ISource> FilesUnder(this IVsProject inProject, DTE dte, VSConstants.VSITEMID id)
        {
            Option <ISource> file = inProject.TryFindFile(dte, id);

            IEnumerable <ISource> result =
                file.OfType <SourceFile>() is Some <SourceFile> some ? new [] { some.Content }.Concat(inProject.GetSourceFiles(some.Content.Dte, some.Content.ItemId))
                : file is Some <ISource> general ? new[] { general.Content }
                : inProject.GetSourceFiles(dte, id);

            return(result);
        }
Пример #13
0
 private static Option <string> FilePathFor(this IVsProject project, VSConstants.VSITEMID itemId) =>
 project.GetMkDocument((uint)itemId, out string path) == VSConstants.S_OK ? (Option <string>)path : None.Value;
Пример #14
0
 private static Option <ISource> TryFindFile(this IVsProject project, DTE dte, VSConstants.VSITEMID itemId) =>
 project.FilePathFor(itemId)
 .When(path => !string.IsNullOrEmpty(path))
 .When(File.Exists)
 .Map(path => new FileInfo(path))
 .Map <ISource>(file => new SourceFile(file, itemId, project, dte));
Пример #15
0
 public static object GetPropertyValue(this IVsProject project, __VSHPROPID propid, VSConstants.VSITEMID itemId = VSConstants.VSITEMID.Root)
 {
     return(GetPropertyValue((IVsHierarchy)project, propid, itemId));
 }
Пример #16
0
 public static object GetPropertyValue(this IVsHierarchy vsHierarchy, __VSHPROPID propid, VSConstants.VSITEMID itemId = VSConstants.VSITEMID.Root)
 {
     return(GetPropertyValue(vsHierarchy, (int)propid, (uint)itemId));
 }
Пример #17
0
        public static void Open(this IVsProject project, VSConstants.VSITEMID itemId)
        {
            Guid view = Guid.Empty;

            project.OpenItem((uint)itemId, ref view, IntPtr.Zero, out IVsWindowFrame _);
        }