PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FTP Eclipse Plugin



daggz
21-05-2006, 12:23
Hi ich habe ein Problem mit meinem Eclipse Plugin. Ich benutze SWT um die Oberfläche des Plugins zu programmieren. Um das entfernte Verzeichnis anzeigen zu lassen, habe ich mir eine Klasse RemoteSite die von ViewPart abgeleitet wird angelegt. Das funktioniert auch alles wunderbar. Ich lasse mir dann das FileSystem mit einem TableViewer anzeigen. Auch dafür habe ich mir eine eigene Klasse MyTableViewer extends TableViewer geschrieben.

public class MyRemoteTableViewer extends TableViewer {
MyRemoteTableViewer tbv;

public MyRemoteTableViewer(Composite parent, int style) {
super(parent, style);
tbv = this;

setContentProvider(new FileRemoteTableContentProvider());
setLabelProvider(new FileRemoteTableLabelProvider());
...
}

In der gleichen Klasse habe ich mir einen DoppelklickListener hinzugefügt, um immer wenn ich einen Doppelklick auf einen Ordner mache, in den Ordner darunter gewechselt wird. Und da kommt mein Problem. Ich benutze um die FTP Verbindung aufzubauen die Klasse FTPClient und zum Listen des entfernten Dateisystems die FTPFile Klasse. Lege ich mir nun ein FTP File Object an (//zeigt das entfernte Dateisystem an
FTPFile[] ftpFiles = connection.listFiles();)
und will dieses mit setInput(ftpFiles) im TableViewer anzeigen lassen, bekomme ich eine Fehlermeldung(LoopEvent Reason:../.././FTPFile)
Ich habe schon heraus gefunden, dass das wohl an meinem ContentProvider liegt, denn da habe ich mir für die Klasse File folgendes geschrieben:
public class FileLocalTableContentProvider implements IStructuredContentProvider
{
public Object[] getElements(Object element)
{
Object[] kids = null;
kids = ((File) element).listFiles();
return kids == null ? new Object[0] : kids;

}

Da die FTPFile Klasse aber leider keine Methde listFiles() besitzt, habe ich mir diese Klasse dann umgeschrieben:
public class FileRemoteTableContentProvider implements IStructuredContentProvider{
public Object[] getElements(Object element){

FTPFile[] kids = null;
if(element instanceof FTPFile){
kids = ((FTPFile[]) element);
}

return (Object[]) (kids == null ? new Object[0] : kids);
}
Damit kann ich mir das Filesystem dann anzeigen lassen. Nun habe ich aber folgendes Problem. Wenn ich auf eine Datei einen Doppelklick mache, dann kann ich mir das darunter liegende nicht anzeigen lassen. Habe echt schon alles versucht, aber es klappt nicht. Ich wäre um Hilfe sehr dankbar. Hir der Quellcode von den betreffenden Klassen:

MyRemoteTableViewer:
tbv.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {

//Finde heraus, welches Element angeklickt wurde
ISelection selection = (ISelection) event.getSelection();

//Ermittle von diesem Element das erste Element
final Object selectedFile = ((IStructuredSelection) selection).getFirstElement();

//setze dieses Element als neuen Input
//wenn es ein Directory ist
if(((FTPFile)selectedFile).isDirectory()){
tbv.setInput(selectedFile);
}

//ansonsten kopiere die Datei in das Remote-Verzeichnis
else{
return;
//kopiere in Remote-Vewrzeichins
}
}
});

Vielen Dank schon mal!

daggz
24-05-2006, 11:07
ok hat sich erledigt.hab das problem gelöst. man muss einfach erst in das selektierte Verzeichnis wechseln und es dann auflisten. also in meinem fall:

try {

//wenn das Element ein Ordner ist
if(selectedFile.isDirectory()){

//wechsle in das Arbeitsverzeichnis in diesen Ordner
ftp.changeWorkingDirectory(selectedFile.getName()) ;

//und liste das Verzeichnis auf
tbv.setInput(ftp.getRemoteFileSystem());

}