Eigene Einträge im Projektbaum

Auch wenn es etwas pathetisch klingt, aber je mehr ich mit der NetBeans Plattform arbeite desto mehr möchte ich in die Lobeshymnen einstimmen ((Zugegeben, ich habe bisher noch nicht mit einer anderen RC Plattform gearbeitet, aber das ändert nichts an meiner Begeisterung für die NetBeans RCP ;-))). Ich bin einfach begeistert, wie einfach es geht eine RCP Anwendung – und damit auch die NetBeans IDE selbst – zu erweitern. Zum Beispiel die “Project API”. Die NetBeans IDE kennt diverse Projekttypen. Die häufigsten werden sicherlich die Java Projekttypen sein. Jeder wird damit schon mal gearbeitet haben, der die NetBeans IDE benutzt.

Aber was ist, wenn in der Projektansicht nicht alle Informationen angezeigt werden, die man gerne hätte? Klar, man sieht die Dateien in der “Files” Ansicht, aber das ist nicht das gleiche. Warum nicht die Ansicht nehmen, die sowieso schon offen ist? Kein Problem. Dank dem genialen Konzept der XML Layer Struktur von NetBeans.

Wir schreiben zum Beispiel bei uns hier die Hilfeseiten für unsere RCP Anwendung als DocBook Dokumente. Aus diesen werden dann automatisch die JavaHelp Quellen generiert, die dann wiederum in der Anwendung angezeigt werden können. Das dumme an der Sache ist, dass NetBeans offiziell ((Ja, ich kenne das DocBook Modul aus der Develop Version der IDE, aber das benötigt ein neuen, eigenes Projekt für die DocBooks)) kein DocBook versteht. Schon gar nicht als Teil eines Modulprojekts:
ProjektNode für DocBook Quelldateien

Dabei ist es denkbar einfach ein solchen Eintrag in einem bestehenden Projekttyp von NetBeans einzufügen. Das wichtigste an der Sache ist eigentlich in Erfahrung zu bringen, wie der gewünscht Projekttyp eigentlich heißt. Aber auch hier liefert NetBeans selbst die Information völlig bereitwillig. In den “Project Metadata” (oder besser gesagt in der Datei nbproject/project.xml) steht sie direkt zu beginn:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
  <type>org.netbeans.modules.apisupport.project</type>
  <configuration>
    [...]
  </configuration>
</project>

Jedes Projekt, welches von der NetBeans IDE verstanden werden soll enthält einen solchen <type> Eintrag.

Der nächste Schritt ist die Information, dass NetBeans die Projektansicht komplett über die layer.xml steuert. Der Pfad für eigene Nodes in einem Projekt ist Projects/<projecttype>/Nodes/ in dem man einfach einen .instance Eintrag für eine NodeFactory anlegt. In unserem Fall sieht der Eintrag so aus:

1
2
3
4
5
6
7
8
9
<folder name="Projects">
  <folder name="org-netbeans-modules-apisupport-project">
    <folder name="Nodes">
      <file name="de.rwthaachen.wzl.gt.nbm.docbook.DocbookFolderNodeFactory.instance">
        <attr name="position" intvalue="175"/>
      </file>
    </folder>
  </folder>
</folder>

Das Attribut position definiert, an welcher Stelle der eigene Node in der Projektansicht auftauchen soll. Den passenden Wert dazu kann man sich am besten über die Ansicht “Important Files/XML Layer/ ” herausfinden, in dem man einfach den eigenen Eintrag an die gewünschte Stelle verschiebt. Den Rest macht NetBeans.

Die einfachste Implementierung der Methode createNodes() in der NodeFactory prüft nach, ob sich unterhalb des Projektverzeichnisses ein Ordner docbook befindet und liefert zu diesem Ordner dann einen passenden Node zurück:

1
2
3
4
5
6
7
8
9
10
11
12
public NodeList<?> createNodes(Project p)
{
  FileObject projectDirectory = p.getProjectDirectory();
  FileObject dbkDirectory =
      projectDirectory.getFileObject("docbook");
  if(dbkDirectory == null || !projectDirectory.isFolder())
    return NodeFactorySupport.fixedNodeList();
  DataFolder folder = DataFolder.findFolder(dbkDirectory);
  Node original = folder.getNodeDelegate();
  Node filter = new DocBookFolderNode(original);
  return NodeFactorySupport.fixedNodeList(filter);
}

NodeList ist nur ein Interface. Darum können wir keine direkte Instanz erstellen um z.B. eine Leere Liste “mal eben” zurück liefern können für den Fall, dass im Modul kein “docbook” Verzeichnis existiert. Allerdings kann die Utilitiesklasse NodeFactorySupport für diese Zwecke auch missbraucht werden in dem man der Methode fixedNodeList einfach keine Argumente mit gibt.

DocBookFolderNode ist in diesem Fall ein FilterNode in dem eine eigene ChildFactory dafür sorgt, dass nur die DocBook Dokumente selbst in der Ansicht auftauchen und nicht die zusätzlichen Hilfsdateien, die meistens in diesem Verzeichnis auch noch herum schwirren. Bei uns liegen dort zum Beispiel oft noch irgendwelche erzeugten PDF Dateien mit denen wird das DocBook selbst “testen”.

Das Beispiel lässt sich auch noch nach Belieben erweitern. So hat sich gezeigt, dass man unbedingt einen FileChangeListener implementieren sollte, der die ChildFactory zu einem refresh bewegt, sollte eine neue Datei hinzu kommen und eine der Dokumente gelöscht werden. Außerdem erkennt die oben genannte Version nicht, wenn in einem Modulprojekt der Ordner “docbook” selbst erstellt oder gelöscht wurde. Für diesen Fall bleibt

3 Gedanken zu „Eigene Einträge im Projektbaum“

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


8 + = elf

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>