7

Estoy escribiendo mi propia extensión de Visual Studio 2010 que me debería ayudar a navegar una solución bastante grande.
Ya tengo una extensión VS basada en diálogo que me muestra un nombre de clase y un nombre de función dependiendo de algunos criterios de búsqueda. Ahora puedo hacer clic en esta clase/método y luego ya puedo abrir el archivo correcto y saltar a la función.
Lo que ahora quiero hacer es colocar el cursor al inicio de esa función.
Mi código para saltar a la función es:Configuración de la posición del cursor con Visual Studio Extension

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 
         { 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Los puntos importantes aquí son window.Activate(); para abrir el archivo correcto y classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null); para saltar a la función correcta.
Desafortunadamente, el cursor no está configurado para el inicio de la función solicitada. ¿Cómo puedo hacer esto? Estoy pensando en algo como classElement.StartPoint.SetCursor().
Saludos Simon

+0

complejo Cyclomatically? Además, parece que no estás abandonando el método cuando encuentras lo que estás buscando, que podría tener algunos efectos secundarios (WAG). – Will

+0

@Will: Sí, lo sé. Este es solo un tipo de código de prototipo. Solo por demostrar cómo abro la clase y la función solicitadas ... –

Respuesta

12

finalmente lo tengo ...
sólo hay que utilizar la interfaz TextSelection donde se tiene el método MoveToPoint.
Así que el código de arriba es ahora:

// 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); 
Cuestiones relacionadas