[EDIT: Ich habe die folgende Alternative hinzugefügt - die ursprüngliche Antwort ist Vater unten]
Erstens: Wenn Sie im Paket-Explorer etwas auswählen, handelt es sich bei den ausgewählten Objekten um Java-Modell-Objekte - Sie müssen sich auf irgendeiner Ebene mit ihnen befassen. Es gibt zwei Möglichkeiten, wie Sie dies tun können:
- Verwenden Sie die ICompilationUnit direkt (siehe weiter unten)
- Erstellen Sie eine Eclipe-Adapterfabrik, um die Konvertierung zu automatisieren
Adapter Factory-Ansatz
Sie können eine Adapter-Factory erstellen (die sich in Ihrem Haupt-Plugin oder einem anderen befinden kann), die Eclipse verwenden kann, um automatisch von einer ICompilationUnit in eine IFile zu konvertieren.
Hinweis: Wenn Sie die Adapterfabrik in einem anderen Plugin erstellen, müssen Sie wahrscheinlich einen Frühstart für dieses Plugin einrichten, damit die Adapterfabrik geladen wird. Andernfalls müssen Sie Ihr Plugin, das mit der Auswahl arbeiten wird, von dem Plugin abhängig machen, das den Adapter bereitstellt.
Tolle Details zu Adaptern finden Sie unter http://www.eclipse.org/resources/resource.php?id=407 aber ich werde hier eine Implementierung für dieses Problem beschreiben.
Abhängigkeiten
Das Plugin, das den Adapter hosten wird, benötigt folgende Abhängigkeiten
- org.eclispe.core.resources
- org.eclipse.jdt.core
Die Adapter-Fabrikklasse
Definieren Sie die folgende Klasse in Ihrem neuen Plugin
package com.javadude.foo;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.jdt.core.ICompilationUnit;
public class CompilationUnitToFileAdapter implements IAdapterFactory {
@Override
public Object getAdapter(Object adaptableObject, Class adapterType) {
if (adaptableObject instanceof ICompilationUnit)
// note: "adapting" it here just means returning the ref'd IFile
return (IFile) ((ICompilationUnit)adaptableObject).getResource();
return null;
}
@Override
public Class[] getAdapterList() {
return new Class[] {IFile.class};
}
}
Die Verlängerung
Fügen Sie in dem Plugin, das die Adapterfabrik beherbergen wird, folgendes zu Ihrer plugin.xml hinzu:
<extension point="org.eclipse.core.runtime.adapters">
<factory
adaptableType="org.eclipse.jdt.core.ICompilationUnit"
class="com.javadude.foo.AdapterFactory1">
<adapter type="org.eclipse.core.resources.IFile" />
</factory>
</extension>
Verwendung des Adapters
Mit den oben genannten Voraussetzungen können Sie jetzt schreiben:
Object firstElement = ((ITreeSelection) selection).getFirstElement();
IFile file = (IFile) Platform.getAdapterManager().
getAdapter(firstElement, IFile.class);
if (file == null)
// adapter not present; cannot use as IFile
else
// adapter present - you can use it as an IFile
Mit diesem Ansatz können Sie zusätzliche Adapter hinzufügen, um andere Typen in IFile zu konvertieren, und Ihr Auswahlcode kümmert sich nicht darum.
Direkter ICompilationUnit-Ansatz
[EDIT: Ich habe die Antwort geändert, aber die folgenden als Referenzinformationen b/c es ist der Standardweg, um den Inhalt einer Kompilierungseinheit zu erkunden, die im Paket-Explorer ausgewählt wurde]
Dies ist eigentlich der bevorzugte Weg, um den Inhalt einer Datei im Paket-Explorer zu erhalten...
Anstatt CompilationUnit zu verwenden, sollten Sie ICompilationUnit verwenden. Die meisten Eclipse-APIs verwenden Schnittstellen für den öffentlichen Gebrauch und Klassen für interne Details.
Wenn Sie Ihren Code ändern in
if (firstElement instanceof ICompilationUnit) {
ICompilationUnit unit = (ICompilationUnit firstElement;
String contents = new String(unit.getContents());
}
Sie werden gut in Form sein.
Einzelheiten zur Prüfung/Änderung des Java-Modells und des Quellcodes:
(In Eclipse)
Help->
Help Contents->
JDT Plug-in Developer's Guide->
Programmer's Guide->
JDT Core
Das zeigt, wie man mit dem Java Model richtig arbeitet
Um zu isolieren, wo Sie das Java Model referenzieren, können Sie einen (Eclipse-)Adapter erstellen, der Java Model-Objekte in Dateien konvertiert. Angenommen, ein solcher Adapter existiert, dann können Sie den AdapterManager bitten, ihn für Sie in eine Java-Datei zu konvertieren. Ich werde mal nachsehen, ob es einen gibt.
0 Stimmen
Ist es möglich, dies ohne Abhängigkeit von JDT zu tun? Gibt es irgendwelche Updates ab Januar 2014?