# Common Navigator (CNF) mit Drag'n'Drop (DnD): refresh Viewer



## mandypb86 (3. Feb 2011)

Hallo zusammen,

nach etlichen Tutorials und Internet-Recherchen musste ich leider feststellen, dass es zu der Anwendung von DnD im Zusammenhang mit dem CNF noch nicht allzu viele Infos gibt. Das bisschen, was ich gefunden habe, hilft mir in meinem konkreten Fall gerade leider nicht.

Die grundlegende DnD-Funktionalität hab ich für meinen Common Navigator hinbekommen (ich hab eine eigene Navigator-Klasse, die vom CommonNavigator erbt). Über den ExtensionPoint dropAssistant unter navigatorContent hab ich eine Klasse erstellt, die von CommonDropAdapterAssistant erbt und das DnD-Handling übernimmt.

Die beiden Methoden validateDrop und handleDrop sind implementiert bzw letztere noch in Bearbeitung, weil genau DORT nun mein kleines aber feines Problem auftritt.

Ich kopiere mittels EFS Dateien per DnD hin und her. Kopieren funktioniert auch, sprich die Dateien werden im Zielverzeichnis angelegt. Aber wie krieg ich jetzt meinen Navigator refresht?

Ich weiß, dass meine Navigator-Klasse per getCommonViewer einen CommonViewer ausspuckt, mit dem ich ein refresh machen könnte. Nur befinde ich mich gerade in der Klasse CommonDropAdapterAssistant (bzw. meinem Ableger davon) in der Methode handleDrop. Dort hab ich keine getCommonViewer-Methode zur Verfügung.

Wie komm ich nun an einen konkreten Viewer ran, den ich refreshen kann?
Ich hatte erst überlegt im Konstruktor der Klasse einen Viewer mitzugeben, aber ich instantiiere die Klasse bzw das Objekt ja nicht selbst, sondern das macht das Plugin ja über den Extension-Point.

Über einen Hinweis wär ich sehr dankbar.

Lieben Gruß

M@ndy


----------



## Wildcard (3. Feb 2011)

> Wie komm ich nun an einen konkreten Viewer ran, den ich refreshen kann?


Du bekommst den Viewer im ContentProvider. Mit anderen Worten, entweder dein Filesystem muss wissen das es verändert wurde und informiert den ContentProvider (per Listener zB), oder du musst irgendwie in der Action dem ContentProvider bescheidsagen.


----------



## mandypb86 (25. Feb 2011)

Das müsste doch eigentlich auch mittels Databinding zu realisieren sein. Hat schonmal jemand einen Navigator mit JFace Databinding kombiniert?

Ich finde zwar ein paar (wenige) Snippets zu Databinding in Kombination mit "normalen" Viewern und ContentProvidern (vogella z.B.), sowie einen Hinweis auf den "neuen" ObservableListTreeContentProvider, aber nichts, was in Kombination mit einem Navigator realisiert wurde.

Ich habe versucht das Beispiel von vogella auf meine Bedürfnisse anzupassen. Soll heißen:


in der Navigatorklasse gebe ich bei getInitialInput eine WritableList zurück
den ContentProvider hab ich in dem navigatorContent-ExtensionPoint auf 
	
	
	
	





```
org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider
```
 anstatt - wie vorher - auf einen eigenen gesetzt

doch gibt es irgendwo eine "internal Exception", wegen falschem Realm bei der "Decoration Calculation" . Das Beispiel von vogella läuft aber problemlos.

Ein Stück Code in der getInitialInput() der Navigatorklasse sieht momentan so aus:

```
List<SongFolder> folders = new Vector<SongFolder>();
folders.add(new SongFolder(workspaceRoot,null));
WritableList wl = new WritableList(folders, SongFolder.class);
return wl;
```

und die entsprechende Exception:

```
org.eclipse.core.runtime.AssertionFailedException: assertion failed: Getter called outside realm of observable org.eclipse.core.databinding.observable.list.WritableList@180f545
```

Wo setze ich hier jetzt am Besten an?
Passenden Realm suchen? Wo?
Navigator weglassen und View selber implementieren? (ungern)
Anderes?

Hab grad echt keine Idee mehr, an welcher Stelle ich weitermachen soll.
Bitte um Hilfe oder wenigstens einen Hinweis in die richtige Richtung. Ich bin gewiss nicht zu faul zum Suchen, aber die Doc über Jface Databinding ist etwas dürftig. Vor allem, wenn man über die Standard-Implementation hinaus will.

Lieben Gruß und für jede Hilfe dankbar

M@ndy


----------

