2012-05-04 14 views
6

Per il mio plugin sto provando ad accedere al codice selezionato in CompilationUnitEditor. Quindi ho aggiunto un contributo per il menu di contesto e l'uso seguente codice:Come posso ottenere il codice selezionato in Eclipse?

public class ContextMenuHandler implements IEditorActionDelegate { 

    private IEditorPart editorPart; 

    @Override 
    public void setActiveEditor(IAction action, IEditorPart editorPart) { 
     this.editorPart = editorPart; 
    } 

    @Override 
    public void run(IAction action) { 
     JavaUI.getEditorInputJavaElement(editorPart.getEditorInput()); 
    } 

    @Override 
    public void selectionChanged(IAction action, ISelection selection) { 
     if (selection instanceof TextSelection) { 
      TextSelection text = (TextSelection) selection; 
      System.out.println("Text: " + text.getText()); 
     } else { 
      System.out.println(selection); 
     } 
    } 

} 

Ora il problema è che il metodo SelectionChanged (...) viene chiamato solo quando ho realmente selezionare qualcosa in modo che ho potuto copia/incolla è . Ma voglio accedere agli elementi di codice che vengono evidenziati come questo (qui vorrei ottenere il "IEditorPart")

enter image description here

Purtroppo, non ho idea di cosa dovrei cercare.

risposta

1

Utilizzando gli ingressi dalle altre risposte, ho finito con la seguente soluzione:

@Override 
public void setActiveEditor(IAction action, IEditorPart editorPart) { 
    ((CompilationUnitEditor) editorPart).getViewer().addTextListener(new ITextListener() { 

     @Override 
     public void textChanged(TextEvent event) { 
      selectedText = event.getText(); 
     } 
    }); 

} 
3

Non sarebbe più facile rilevare la posizione corrente del cursore. Avere la posizione consente di rilevare facilmente se il cursore è su una parola (definire la parola come si preferisce, ad esempio identificatore java separato da spazio o con un'espressione regolare).

Non sono in grado di eseguire eclissi qui, ma vorrei utilizzare la classe CaretListener per rilevare i movimenti del cursore e quindi estrarre la parola sotto di esso. Il CaretEvent dato come parametro per il metodo caretMoved conterrà l'offset.

Il CaretListener può essere collegato alla Adapter del componente StyledText, che si può ottenere dal vostro EditorPart (non hanno più informazioni, per il momento, in quanto non ho eclisse correre qui).

Spero che aiuti.

Modifica: alcuni codici.

Questa è una semplice implementazione per ottenere la parola sotto il cursore in base al carattere dello spazio che lo circonda. Un'implementazione più robusta dovrebbe essere utilizzata per rilevare identificatori Java validi ecc. Ad esempio utilizzando Character.isJavaIdentifierStart e Character.isJavaIdentifierPart o utilizzando una libreria per questo.

+0

che avrebbe funzionato credo, però presumo fortemente che ci deve essere una scelta migliore. – RoflcoptrException

+0

Questo potrebbe funzionare, ma vorrei raccomandare contro questa soluzione poiché fare ciò accederà a un'API di livello molto basso. Dovresti interagire con l'editor tramite API JFace come il visualizzatore sorgente. –

+0

Modificato per aggiungere del codice. – Alex

7

Si dovrebbe fare questo:

 ((CompilationUnitEditor) editorPart).getViewer().getSelectedRange(); 

Il ISourceViewer classe ha un bel paio di metodi utili e interessanti per quanto riguarda posizioni di origine e l'editor. Potresti anche voler dare un'occhiata a JavaSourceViewer.


EDIT

sembra che non ho abbastanza rispondere alla tua domanda. Il problema è che gli eventi selectionChanged vengono chiamati solo quando la lunghezza della selezione è> 0. Non so perché questo è il caso, ma questo è il modo in cui i delegati d'azione hanno sempre funzionato.

Se si desidera ricevere una notifica ogni volta che il cursore si modifica, è necessario registrare una selezione di listener modificato con il visualizzatore per l'editor. Fare qualcosa di simile:

((CompilationUnitEditor) editorPart).getViewer() 
    .addSelectionChangedListener(mySelectionListener); 

mySelectionListener è di tipo org.eclipse.jface.viewers.ISelectionChangedListener. Registrandoti in questo modo, dovresti darti tutti gli eventi che stai cercando. Basta fare attenzione per annullare la registrazione quando l'editor si chiude.

+0

Poi torno a Punto. Cosa dovrei fare con quello? – RoflcoptrException

+0

se si legge JavaDoc, verrà visualizzato: "Restituisce l'intervallo della selezione corrente nelle coordinate del documento di questo visualizzatore Ritorni: a Punto con x come offset e y come lunghezza della selezione corrente" –

+0

In realtà , rileggendo la tua domanda e non sono più sicuro di cosa stai cercando. Vuoi la gamma selezionata? Vuoi l'elemento Java che contiene il testo selezionato? O vuoi risolvere la cosa attualmente selezionata per determinarne la dichiarazione? –

Problemi correlati