2012-10-22 7 views
8

Ich mag, wenn Eclipse ermöglicht mir zwischen den Parametern in einem Methodenaufruf mit einer Tab-Taste springen. Ich möchte, dass mein Plugin eine ähnliche Funktionalität bietet. Um genau zu sein, injiziere ich etwas Text in den Editor, und ich möchte die spezifische Syntax hervorheben und den Programmierer mit der Tab-Taste zur nächsten Übereinstimmung springen lassen.Java-Code-Vorlage programmgesteuert hinzufügen

Hier ist ein Beispiel. Lets nehme ich erstellt dynamisch die folgenden Ausschnitt:

String a = "bogus string"; 
int i = a.[?] 

ich, dass in den Editor injizieren, und ich würde für die Änderung, dass [?] markiert ist und bereit, wie (Benutzer möglicherweise Typ length()). Darüber hinaus, wenn es mehr [?] Fragmente gibt, möchte ich Benutzer Tab verwenden, um zum nächsten zu wechseln.

Nach ein wenig Forschung, fand ich, dass es getan werden könnte mit templates. Ich kann jedoch keine relevanten Beispiele im Web finden. Hat jemand Erfahrung damit?

UPDATE:

fand ich zwei Links, die nützlich sein könnten, obwohl ich nach wie vor nicht in der Lage bin mit einer Lösung zu kommen.

link one

link two

Antwort

8

Sample Handler Codes:

AbstractTextEditor activeEditor = 
     (AbstractTextEditor) HandlerUtil.getActiveEditor(event); 

ISourceViewer sourceViewer = 
     (ISourceViewer) activeEditor.getAdapter(ITextOperationTarget.class); 

Point range = sourceViewer.getSelectedRange(); 

// You can generate template dynamically here! 
Template template = new Template("sample", 
     "sample description", 
     "no-context", 
     "private void ${name}(){\r\n" + 
     "\tSystem.out.println(\"${name}\")\r\n" 
     + "}\r\n", true); 

IRegion region = new Region(range.x, range.y); 
TemplateContextType contextType = new TemplateContextType("test"); 
TemplateContext ctx = 
    new DocumentTemplateContext(contextType, 
     sourceViewer.getDocument(), 
     range.x, 
     range.y); 

TemplateProposal proposal 
    = new TemplateProposal(template, ctx, region, null); 

proposal.apply(sourceViewer, (char) 0, 0, 0); 

Ergebnis:

enter image description here

Ich schlage vor, Sie org.eclipse.jdt.ui.javaCompletionProposalComputer Erweiterung verwenden. Es ermöglicht Ihnen, Vorlage legaler Weise beizutragen. In meinen Codes gibt es Hacks, da es keine Möglichkeit gibt, ISourceViewer legal zu bekommen. Ich weiß, ISourceViewer ist ITextTargetOperation selbst, aber es ist nicht API (Illegal Casting). Und Vorlage soll entworfen sein, um von TemplateCompletionProcessor oder TemplateCompletionProposalComputer verwendet zu werden.

+0

Funktioniert wie ein Charme! – bellpeace

1

Ich bin nicht ganz sicher, was Sie wollen, aber Sie können in der Lage sein zu tun, was Sie mit Vorlagen wollen.

Öffnen Sie beispielsweise einen Java-Editor, platzieren Sie den Cursor in eine Methode, geben Sie arraya und dann ctlr-space ein, und wählen Sie im Popup-Menü arrayadd aus. Sie erhalten eine Vorlage mit hervorgehobener Zeichenkette, die Tabulatortaste springt zur nächsten Variablen. > Java - -> Editor -> Vorlagen die eine $

${array_type}[] ${result:newName(array)} = new ${array_type}[${array}.length + 1]; 
System.arraycopy(${array}, 0, ${result}, 0, ${array}.length); 
${result}[${array}.length]= ${var}; 

Alles beginnt, ist eine Variable, die Sie füllen können, und Sie können mit der Tabulatortaste zwischen Variablen, während die Vorlage Quelle werden kann,

Einstellungen gesehen Füllen Sie die Vorlage aus.

+0

Ja, das ist, wie Vorlagen arbeiten. Ich entwickle jedoch ein Plugin, das Code-Snippets zur Laufzeit erstellt. Ich versuche herauszufinden, wie, wenn möglich, Vorlagen-API verwendet werden, damit Benutzer zwischen Platzhaltern ändern und navigieren können. Gibt es weitere Informationen, die Sie mir geben möchten? – bellpeace

+0

Die beste Wette ist, die Quelle des Vorlagenplugins aufzuspüren und zu sehen, wie es dann funktioniert. – sbridges

+1

Haben Sie org.eclipse.jface.text.templates.TemplateProposal überprüft? Was ist, wenn Sie ein Snippet einfügen möchten, das keine Inhaltshilfe verwendet? Sie können auch die TemplateProposal # apply() -Methode einsehen. – jeeeyul

0

Meine Antwort basiert auf Jeeeyuls Antwort. Der Unterschied ist, dass ich nicht nur Vorlage selbst wollte, sondern auch importiert, damit sie automatisch aufgelöst und hinzugefügt wird.Dies kann auf folgende Weise erfolgen, JDT Sachen mit:

AbstractTextEditor activeEditor = 
      (AbstractTextEditor) HandlerUtil.getActiveEditor(event); 
    if (activeEditor == null) { 
     return null; 
    } 
    ITypeRoot element = EditorUtility.getEditorInputJavaElement(activeEditor, true); 
    if (element == null) { 
     return null; 
    } 
    ICompilationUnit unit = element.getAdapter(ICompilationUnit.class); 
    if (unit == null) { 
     return null; 
    } 
    ISourceViewer sourceViewer = (ISourceViewer) activeEditor.getAdapter(ITextOperationTarget.class); 
    Point range = sourceViewer.getSelectedRange(); 
    // You can generate template dynamically here! 
    Template template = new Template("new List", "Add new list creation", JavaContextType.ID_STATEMENTS, 
      "List<${type}> ${name:newName(java.util.List)} = new ArrayList<${type}>();${:import(java.util.List, java.util.ArrayList)}", 
      true); 
    IRegion region = new Region(range.x, range.y); 
    JavaContextType contextType = new JavaContextType(); 
    contextType.setId(JavaContextType.ID_STATEMENTS); //Set context type, for which we apply this template 
    contextType.addResolver(new ImportsResolver("import","import")); //Add imports resolver if we want imports to be added automatically for some template 
    CompilationUnitContext ctx = new JavaContext(contextType, sourceViewer.getDocument(), range.x, 
      range.y, unit); 
    TemplateProposal proposal = new TemplateProposal(template, ctx, region, null); 
    proposal.apply(sourceViewer, (char) 0, 0, 0); 
Verwandte Themen