# Common Navigator Framework



## dzim (14. Nov 2008)

Wie ich gedroht(vermutet hab, habe ich einige Frage zu CNF - ich hoffe, das mir da wer weiterhelfen kann...

http://rcpquickstart.com/2007/04/25/common-navigator-tutorial-1-hello-world/

Mit dem Tutorial hab ich es geshafft, meine bisherige Baumstruktur schön darzustellen - musste nur eine Stelle meines Modells anpassen (Modellklassen extenden nun PlatformObject) und den kleinen Hack von dem Tutorial machen müssen (dazu Extende ich den CommonNavigatorViewer und überschreiben in 2 Zeilen die Methode getInitialInput() )

Soweit so gut - ich bin schon mal froh, dass alles schön angezeigt wird.

Aber: Jetzt sollen meine Edioren geöffnet werden und ich finde jetzt wirds eklig.
Ich habe die LinkHelper Extension hinzugefügt, und die "Editor-öffnen"-Klasse implementiert (also vor allem die activateEditor-Methode, mit der findSelection kann ich irgendwie noch nix anfangen...)
Dann habe ich als selectionEnablement meine Modellklasse als instanceof angegeben (immerhin wird der CNF-Baum ja daraus aufgebaut)
und als editorInputEnablement meine Oberklasse meiner Variante vom EditorInput (der halt immer noch ein sog. Task-Objekt übergeben werden muss - also ein Modell-Objekt).
Ich habe gelesen, das es dann irgendwie in der *navigator..viewer extension mit im viewerContenBinding angegeben werden muss - aber wo genau... Ich hab keine Ahnung - ich weiß nur eins: Es passiert nix, nicht mal eine Exeption (laut .log)

Könnt ihr mir da Tipps geben?

Vielen vielen Dank!

(Sicher werde ich das nächste Problem haben, wenn ich dann weitere Plugins da reinballern will, aber eines das Funktioniert wär ja erst schon mal schön! - Und wenn ich das hinbekomme wär ich ja schon ein ganzes Stück weiter...)


----------



## Wildcard (14. Nov 2008)

LinkHelper ist nicht zum öffnen eines Editors, sondern um eine Selektion einem Baum Element zuzuordnen.
Registriere einen CommonActionProvider und definiere eine Action mit overrides org.eclipse.ui.navigator.resources.OpenActions


----------



## dzim (14. Nov 2008)

Hm... Ich dachte das hätte hier dev.eclipse.org/newslists/news.eclipse.platform/msg76901.html hätte mir sagen wollen: Nutze LinkHelper...

und ich hab jetzt die Erweiterte Version des CN-Views wieder mit dem original ausgetauscht und der Anleitung hier 
help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/cnf_rcp.htm folgend mein Modell in den WorkbenchAdvisor ind die getDefaultPageInput() gelegt.
Ich hoffe nur, dass ich dann noch irgendwann anderen Kontent hinzufügen kann...

Aber Ok.
Muss ich dann das navigatorActionBinding verwenden? Ich denke mal schon, oder?


----------



## Wildcard (14. Nov 2008)

Der LinkHelper is für den Button im zB Project Explorer 'Link with Editor'. Was beim (in der Regel) Doppelklick passiert ist eine OpenAction


----------



## dzim (14. Nov 2008)

Ok, das hab ich gerafft, aber auch nach einigem suchen finde ich nicht org.eclipse.ui.navigator.resources.OpenActions.
Ich hab eine neue Klasse angelegt, die CommonActionProvider extendet, aber weiter...


----------



## dzim (14. Nov 2008)

kannst du vielleicht dazu ein kleines Codebeispiel posten? wie diese Klasse aussehen müsste?


----------



## Wildcard (14. Nov 2008)

Das kommt in die plugin.xml, das ist keine Klasse. Ein CommonActionProvider im navigatorContent


----------



## dzim (14. Nov 2008)

Aber ich muss eine Klasse implementieren (@class-Attribut), oder reicht die Standard-Klasse?
Das hat ja wieder mal ein enablement... Muss ich da jetzt was konkretes eintragen?

Es tut mir leid, dass ich dich da so quäle, aber ich hab was das angeht echt keinen Plan... Sorry!


----------



## dzim (14. Nov 2008)

Die große Frage ist: Woher weiß er, welchen Editor er nehmen soll, welchen Input, u.s.w
Das konnte ich ja ohne CNF in meinem eigenen View immer mit meiner eigenen Action erledigen... wenn auch fest verdrahtet, welche Klasse er zum laden verwenden soll.


----------



## dzim (14. Nov 2008)

Ok - Wenn ich es nicht schon den ganzen Tag verfluchen würde, würde ich jetzt behaupten: Ich hasse das CNF

ich habe gerade (zum wiederholten Male) folgende Fehlermeldung (Log) erhalten:

```
!ENTRY org.eclipse.ui.navigator 4 0 2008-11-14 15:57:51.934
!MESSAGE Disabling actionProvider: com.ipoque.p2p.tracker.rcp.pfs.ui.view.action.OpenTaskRelatedWidgetActionProvider
!SESSION 2008-11-14 15:59:53.385 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.6.0_07
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=de_DE
Framework arguments:  -product com.ipoque.p2p.tracker.rcp.pfs.product
Command-line arguments:  -product com.ipoque.p2p.tracker.rcp.pfs.product -data /home/danielz/workspaces/pfs_workspace/../runtime-pfsManagerProduct.product -dev file:/home/danielz/workspaces/pfs_workspace/.metadata/.plugins/org.eclipse.
pde.core/pfsManagerProduct.product/dev.properties -os linux -ws gtk -arch x86

!ENTRY org.eclipse.ui.navigator 4 0 2008-11-14 15:59:56.492
!MESSAGE An actionProvider has been defined as the child of a navigatorContent extension that does not specify an <enablement/> or <possibleChildren /> expression. Please review the documenation and correct this error.

!ENTRY org.eclipse.ui.navigator 4 0 2008-11-14 15:59:56.492
!MESSAGE Disabling actionProvider: com.ipoque.p2p.tracker.rcp.pfs.ui.view.action.OpenTaskRelatedWidgetActionProvider
```

Da ich keine Standard-Editoren verwenden kann, habe ich, wie man sieht, einen eigenenen ActionProvider (nebst entsprechender Action) implementiiert - ich habe als Vorbild die Beispielcodes von den CNF-Machern selbst genommen
https://bugs.eclipse.org/bugs/show_bug.cgi?id=143127
(siehe unten)
Aber obwohl ich jetzt in meiner plugin.xml alle einträge wie sie gemacht habe, kommt der Fehler, auch wenn ich ein enablement-Element hinzufüge kommt der Fehler.

Ich weiß wirklich nicht mehr, was dieses blöde Framework noch hat - es kann doch nicht SO schwer sein nen Editor zu öffnen, den ich ihm explizit angebe...

plugin.xml

```
<extension
         point="org.eclipse.ui.views">
      <view
            class="org.eclipse.ui.navigator.CommonNavigator"
            id="com.ipoque.p2p.tracker.rcp.pfs.ui.view.CNFNavigatorView"
            name="PFS Navigator"
            restorable="true">
      </view>
   </extension>
   <extension
         point="org.eclipse.ui.editors">
      <editor
            class="com.ipoque.p2p.tracker.rcp.pfs.ui.editor.DatabaseLocationsEditor"
            icon="icons/javax/swing/plaf/metal/icons/ocean/file.gif"
            id="com.ipoque.p2p.tracker.rcp.pfs.ui.editor.DatabaseLocationsEditor"
            name="Maintain Locations">
      </editor>
   </extension>
   <extension
         point="org.eclipse.ui.navigator.viewer">
      <viewer
            viewerId="com.ipoque.p2p.tracker.rcp.pfs.ui.view.CNFNavigatorView">
      </viewer>
      <viewerContentBinding
            viewerId="com.ipoque.p2p.tracker.rcp.pfs.ui.view.CNFNavigatorView">
         <includes>
            <contentExtension
                  pattern="com.ipoque.p2p.tracker.rcp.pfs.ui.CNFTestViewNavigatorContent">
            </contentExtension>
         </includes>
      </viewerContentBinding>
   </extension>
   <extension
         point="org.eclipse.ui.navigator.navigatorContent">
      <navigatorContent
            contentProvider="com.ipoque.p2p.tracker.rcp.pfs.ui.util.TaskTreeContentProvider"
            icon="icons/alt_window_16.gif"
            id="com.ipoque.p2p.tracker.rcp.pfs.ui.CNFTestViewNavigatorContent"
            labelProvider="com.ipoque.p2p.tracker.rcp.pfs.ui.util.TaskTreeLabelProvider"
            name="PFS Manager Tasks">
         <triggerPoints>
            <instanceof
                  value="com.ipoque.p2p.tracker.rcp.pfs.model.Task">
            </instanceof>
         </triggerPoints>
         <actionProvider
               class="com.ipoque.p2p.tracker.rcp.pfs.ui.view.action.OpenTaskRelatedWidgetActionProvider"
               id="com.ipoque.p2p.tracker.rcp.pfs.ui.view.action.OpenTaskRelatedWidgetActionProvider">
            <enablement>
               <adapt
                     type="com.ipoque.p2p.tracker.rcp.pfs.model.Task">
               </adapt>
            </enablement>
         </actionProvider>
      </navigatorContent>
   </extension>
```


----------



## dzim (14. Nov 2008)

Nach einer kleinen Pause hab ich meinen Fehler dann endlich selbst gesehen:
Ich hatte kein possibleChildren-Element direkt im navigatorContent nach hinzufügen mit meiner Modellklasse klappe es, meinen eigenen Editor zu öffnen.

Nächstes Ziel: ander Plugins, die auch in den CN-View ihr Modell propagieren.

Ein erster Versuch allerding schlug mal wieder fehl, nachdem ich fas identische Einstellungen verwendet habe.
Aber ich denke, hier habe ich einfach das Prinzip falsch verstanden.

Any advice?

Vielen Dank schon mal!


----------



## Wildcard (14. Nov 2008)

Ich habe bisher noch keinen CommonViewer direkt verwendet, sondern nur eigenen Content in den ProjectExplorer eingebunden, dabei kann ich also wenig helfen.
In meinem Fall habe ich Navigator Content für spezielle IFiles eingebunden und dann per Viewer Binding mit dem Project Explorer bekannt gemacht. Das Prinzip muss das gleiche sein, was man aber bei der Implementierung des eigenen Viewers beachten muss ist mir nicht bekannt.


----------



## dzim (18. Nov 2008)

Also neuen Content zu erstellen ist ja recht einfach.
Ich habe nur derzeit das Problem, ihn auch angezeigt zu bekommen, wenn ich das PlugIn lade, dass auch CNF verwenden soll.
Ich weiß halt nicht, wie ich jetzt begreigbar mache, dass das Hauptprogramm, oder besser der CN-View jetzt auch den eigenen Content anzeigt.
Irgendwo muss ich das ja triggern - ähnlich wie im ApplicationWindowWorkbenchAdvisor, wo ich den getDefaultPageInput umbiege auf meine eigene Modell-Klasse.
Das habe ich halt leider noch nicht begriffen, wie ich das mache...


----------



## dzim (18. Nov 2008)

Aber sagt mal:
Wenn ich den CN-Viewer um Content erweitern will, der genauso aufgebaut ist wie in der Anwendung, die das PlugIn verwendet, wie müsste ich denn rein hypothetisch den content anbinden? Wie gesagt: Der Trigger scheint mir da zu fehlen. ich lass das lokale plugin-model als solches vom Activator des Plugins erzeugen, bin mir aber schon nicht sicher, wann denn überhaupt das Plugin aktiviert wird (und ob überhaupt) und wie ich begreiflich mache, das er den eigenene plugin-content auch an den global exisierenden hängt, oder es dem CN-Viewer wenigstens begreigbar macht, das neuer content zum darstellen hinzugekommen ist.

Vielleicht ist dieses Problem zu speziell, aber ich bin mir da ganz sicher das es geht - die Frage ist nur wie!


----------



## dzim (25. Nov 2008)

ok, da ich hier wohl alle ahnung-habenden (sprich Wildcard) verwirrt habe, schließe ich den Thread erst mal, auch wenn ich noch nicht 100%ig fertig damit bin.
Danke jedenfalls für die Mühe, meine wirrent Gedanken zu verfolgen...


----------

