7 Stimmen

Eclipse PDE, Navigator View, TreeSelection - Abfrage von Dateityp und -name

Ich versuche, Details über die strukturierte Auswahl eines Eclipse-Benutzers in der Navigator-Baumansicht zu erhalten. Derzeit habe ich die folgenden, die auf der org.eclipse.ui.popMenus Erweiterung Punkt basiert:

public void run(IAction action) {

Shell shell = new Shell();

ISelection selection = workbenchPart.getSite().getSelectionProvider().getSelection();

if (structuredSelection instanceof org.eclipse.jface.viewers.TreeSelection) {

   org.eclipse.jface.viewers.TreeSelection treeSelection = (org.eclipse.jface.viewers.TreeSelection) structuredSelection;
   IAdaptable firstElement = (IAdaptable) treeSelection.getFirstElement();

   // Relies on an internal API, bad juju
   if (firstElement instanceof org.eclipse.jdt.internal.core.CompilationUnit) {
    org.eclipse.jdt.internal.core.CompilationUnit compilationUnit = (org.eclipse.jdt.internal.core.CompilationUnit) firstElement;                                   
    String editorSelection = new String(compilationUnit.getContents());
   }            
}

Das Problem dabei ist, dass es derzeit an die JDT Compilation Unit API gekoppelt ist, die intern und zu spezifisch für das ist, was ich will.

Im Idealfall möchte ich den zugrundeliegenden Dateinamen, den Typ und den Inhalt der Datei abrufen können, ohne dass ich mich auf diese Angaben verlassen muss:

  1. Eine interne API
  2. Der JDT Compilation Unit Code.

Dies würde es mir dann ermöglichen, die Eigenschaften einer generischen Datei abzurufen, wenn der Benutzer mit der rechten Maustaste auf eine Datei in der Navigationsansicht klickt.

Kann mir jemand Tipps geben, wie ich das am besten anstellen kann?

0 Stimmen

Ist es möglich, dies ohne Abhängigkeit von JDT zu tun? Gibt es irgendwelche Updates ab Januar 2014?

9voto

Scott Stanchfield Punkte 28549

[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:

  1. Verwenden Sie die ICompilationUnit direkt (siehe weiter unten)
  2. 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

Sicher, aber: Diese Schnittstelle ist nicht für die Implementierung durch Clients vorgesehen.

1 Stimmen

Sie setzen es nicht um; Sie sind mit es als Handle zu den Implementierungen. Dies ist die beabsichtigte Verwendung. Sehen Sie sich die Doku-Seite an (und entfernen Sie bitte die Ablehnung!)

0 Stimmen

Und das hilft mir sowieso nicht, da es immer noch an die JDT gebunden ist, ich war auf der Suche nach "erhalten die Eigenschaften einer generischen Datei" gemäß der Frage, lesen Sie es bitte sorgfältig - danke trotzdem.

4voto

VonC Punkte 1117238

Dies (Entkopplung der Ressourcen von JDT) war eines der Ziele von E4 (Eclipse 4) .
Die Plugin-Liste für REsources wird JDT nicht mehr erwähnt (wieder nur Eclipse 4.x):

  • org.eclipse.core.filesystem - Eine abstrakte, generische Dateisystem-API, einschließlich einer Implementierung dieser API für das lokale Dateisystem. Dies ist die API, über die das Ressourcen-Plugin auf ein zugrunde liegendes Dateisystem zugreift.
  • org.eclipse.core.resources - Enthält die API und die Implementierung des Ressourcenmodells
  • org.eclipse.core.resources.compatibility - Ein Plug-in, das Migrationsunterstützung für Benutzer bietet, die alte Workspaces in Eclipse 3.1 oder höher öffnen

Ein Demo-Projekt wie e4foto benötigen keine JDT für Zugriff auf IResource aus der Auswahl eines IContainers .

void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION)
        IResource selection) {
...
IResource[] members = input.members();
...
IResource resource = members[i];
if (resource.getType() == IResource.FILE) {
  InputStream contents = ((IFile) resource).getContents();

3voto

Eugene Punkte 8869

Was wollen Sie erreichen? Möchten Sie den Inhalt einer Datei abrufen? Dann können Sie es versuchen:

IAdaptable firstElement = (IAdaptable) treeSelection.getFirstElement();

IFile file = (IFile) firstElement.getAdapter(IFile.class);
if (file != null && file.isAccessible()) {
    // Use getContents API
    ....
}

0 Stimmen

"Im Idealfall möchte ich den zugrundeliegenden Dateinamen, den Typ und den Inhalt abrufen können.

2 Stimmen

Dies wird nicht funktionieren, es sei denn, ein Adapter wurde registriert, um die Auswahl in eine IFile zu konvertieren -- siehe meine Antwort unten, wie man das macht

3voto

greg-449 Punkte 106101

Es sieht so aus, als ob der JDT bereits eine IAdapterFactory für alle Java-Elemente einschließlich der Kompiliereinheit ( org.eclipse.jdt.internal.ui.JavaElementAdapterFactory ). Der Adapter ist definiert für IResource statt IFile Sie sollten also in der Lage sein, das zu tun:

Object firstElement = treeSelection.getFirstElement();

IResource resource = (IResource)Platform.getAdapterManager().getAdapter(firstElement, IResource.class);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X