7

Sto scrivendo la mia estensione di Visual Studio 2010 che dovrebbe aiutarmi a navigare una soluzione piuttosto grande.
Ho già una finestra VS Extension basata sulla finestra di dialogo che mi mostra un nome di classe e un nome di funzione in base ad alcuni criteri di ricerca. Ora posso fare clic su questa classe/metodo e quindi posso già aprire il file corretto e passare alla funzione.
Quello che ora voglio fare è impostare il cursore all'inizio di quella funzione.
Il mio codice per passare alla funzione è:Impostazione posizione del cursore con estensione Visual Studio

Solution currentSolution = ((EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0")).Solution; 
ProjectItem requestedItem = GetRequestedProjectItemToOpen(currentSolution.Projects, "fileToBeOpened"); 
if (requestedItem != null) 
{ 
    // open the document 
    Window window = requestedItem.Open(Constants.vsViewKindCode); 
    window.Activate(); 

    // search for the function to be opened 
    foreach (CodeElement codeElement in requestedItem.FileCodeModel.CodeElements) 
    { 
     // get the namespace elements 
     if (codeElement.Kind == vsCMElement.vsCMElementNamespace) 
     { 
      foreach (CodeElement namespaceElement in codeElement.Children) 
      { 
       // get the class elements 
       if (namespaceElement.Kind == vsCMElement.vsCMElementClass) 
       { 
        foreach (CodeElement classElement in namespaceElement.Children) 
        { 
         try 
         { 
          // get the function elements 
          if (classElement.Kind == vsCMElement.vsCMElementFunction) 
          { 
           if (classElement.Name.Equals("functionToBeOpened", StringComparison.Ordinal)) 
           { 
            classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null); 
            this.Close(); 
           } 
          } 
         } 
         catch 
         { 
         } 
        } 
       } 
      } 
     } 
    } 
} 

I punti importanti sono window.Activate(); per aprire il file corretto e classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null); per passare alla funzione corretta.
Sfortunatamente il cursore non è impostato all'inizio della funzione richiesta. Come posso fare questo? Sto pensando a qualcosa come classElement.StartPoint.SetCursor().
Acclamazioni Simon

+0

complesso Cyclomatically? Inoltre, sembra che tu non stia salvando il metodo quando trovi quello che stai cercando, il che potrebbe avere alcuni effetti collaterali (WAG). – Will

+0

@Will: Sì, lo so. Questa è solo una specie di codice prototipo. Solo per dimostrare come apro la classe e la funzione richieste ... –

risposta

12

ho finalmente capito ...
Non vi resta che utilizzare l'interfaccia TextSelection dove si ha il metodo MoveToPoint.
Quindi il codice dall'alto è ora:

// open the file in a VS code window and activate the pane 
Window window = requestedItem.Open(Constants.vsViewKindCode); 
window.Activate(); 

// get the function element and show it 
CodeElement function = CodeElementSearcher.GetFunction(requestedItem, myFunctionName); 

// get the text of the document 
TextSelection textSelection = window.Document.Selection as TextSelection; 

// now set the cursor to the beginning of the function 
textSelection.MoveToPoint(function.StartPoint); 
Problemi correlati