diff -urN psi_old/src/filetransdlg.cpp psi_new/src/filetransdlg.cpp
--- psi_old/src/filetransdlg.cpp	2009-12-29 10:12:42.000000000 +0800
+++ psi_new/src/filetransdlg.cpp	2009-12-29 10:26:20.000000000 +0800
@@ -27,6 +27,10 @@
 #include <Q3PtrList>
 #include <QHBoxLayout>
 #include <QPixmap>
+#include <QDesktopServices>
+#include <QPixmap>
+#include <QFileIconProvider>
+#include <QProcess>
 
 #include "psicon.h"
 #include "psiaccount.h"
@@ -143,6 +147,7 @@
 	S5BConnection *c;
 	Jid peer;
 	QString fileName, saveName;
+	QString filePath;
 	qlonglong fileSize, sent, offset, length;
 	QString desc;
 	bool sending;
@@ -197,6 +202,7 @@
 
 	d->peer = to;
 	QFileInfo fi(fname);
+	d->filePath = fname;
 	d->fileName = fi.fileName();
 	d->fileSize = fi.size(); // TODO: large file support
 	d->desc = desc;
@@ -233,11 +239,27 @@
 	return d->fileName;
 }
 
+QString FileTransferHandler::filePath() const
+{
+	return d->filePath;
+}
+
 qlonglong FileTransferHandler::fileSize() const
 {
 	return d->fileSize;
 }
 
+QPixmap FileTransferHandler::fileIcon() const
+{
+	QPixmap icon;
+	QFileIconProvider provider;
+	QFileInfo file(d->filePath);
+	if (file.exists()){
+		icon = provider.icon(file).pixmap(32, 32);
+	}
+	return icon;
+}
+
 QString FileTransferHandler::description() const
 {
 	return d->desc;
@@ -272,6 +294,8 @@
 		return;
 	d->fileName = fileName;
 	d->saveName = saveName;
+	d->filePath = saveName;
+	d->filePath.chop(5);
 	d->offset = offset;
 	d->length = d->fileSize;
 	d->f.setFileName(saveName);
@@ -964,9 +988,10 @@
 class FileTransItem : public Q3ListViewItem
 {
 public:
-	QPixmap icon;
+	QPixmap icon, fileicon;
 	bool sending;
 	QString name;
+	QString path;
 	qlonglong size;
 	QString peer;
 	QString rate;
@@ -979,12 +1004,13 @@
 	bool done;
 	QString error;
 
-	FileTransItem(Q3ListView *parent, const QString &_name, qlonglong _size, const QString &_peer, bool _sending)
+	FileTransItem(Q3ListView *parent, const QString &_name, const QString &_path, qlonglong _size, const QString &_peer, bool _sending)
 	:Q3ListViewItem(parent)
 	{
 		done = false;
 		sending = _sending;
 		name = _name;
+		path = _path;
 		size = _size;
 		peer = _peer;
 		rate = FileTransDlg::tr("N/A");
@@ -1244,9 +1270,19 @@
 		p->fillRect(0, 0, width, h, br);
 
 		// icon
-		p->drawPixmap(m, m + yoff, icon);
-		int tm = m + icon.width() + 4;
-		tw = tw - (icon.width() + 4);
+		int fullIconWidth;
+		if(!fileicon.isNull()) {
+			fullIconWidth = fileicon.width() + icon.width()/2;
+			p->drawPixmap(m, m + yoff, fileicon);
+			p->drawPixmap(m + fullIconWidth - icon.width(), m + yoff + fileicon.height() - icon.height()/2, icon);
+		}
+		else {
+			fullIconWidth = icon.width();
+			p->drawPixmap(m, m + yoff, icon);
+		}
+
+		int tm = m + fullIconWidth + 4;
+		tw = tw - (fullIconWidth + 4);
 
 		// filename / peer
 		if(isSelected())
@@ -1359,7 +1395,7 @@
 		Q3PopupMenu p;
 		p.insertItem(tr("&Cancel"), 0);
 		p.insertSeparator();
-		//p.insertItem(tr("&Open Destination Folder"), 1);
+		p.insertItem(tr("&Open Containing Folder"), 1);
 		p.insertItem(tr("Cl&ear"), 2);
 
 		if(i->done) {
@@ -1522,7 +1558,6 @@
 			fi->done = true;
 		}
 
-		parent->setProgress(i->id, i->p, i->h->totalSteps(), i->sent, bps, updateAll);
 
 		if(done) {
 			bool recv = (i->h->mode() == FileTransferHandler::Receiving);
@@ -1530,12 +1565,7 @@
 			if(recv) {
 				fname = i->h->fileName();
 				savename = i->h->saveName();
-			}
 
-			PsiAccount *pa = i->h->account();
-			transferList.removeRef(i);
-
-			if(recv) {
 				//printf("fname: [%s], savename: [%s]\n", fname.latin1(), savename.latin1());
 
 				// rename .part to original filename
@@ -1546,10 +1576,18 @@
 				if(!dir.rename(fi.fileName(), fname)) {
 					// TODO: display some error about renaming
 				}
+				findItem(i->id)->fileicon = i->h->fileIcon();
 			}
 
+			PsiAccount *pa = i->h->account();
 			pa->playSound(PsiOptions::instance()->getOption("options.ui.notifications.sounds.completed-file-transfer").toString());
 		}
+
+		parent->setProgress(i->id, i->p, i->h->totalSteps(), i->sent, bps, updateAll);
+
+		if(done) {
+			transferList.removeRef(i);
+		}
 	}
 };
 
@@ -1573,6 +1611,7 @@
 	connect(d->lv, SIGNAL(itemCancel(int)), SLOT(itemCancel(int)));
 	connect(d->lv, SIGNAL(itemOpenDest(int)), SLOT(itemOpenDest(int)));
 	connect(d->lv, SIGNAL(itemClear(int)), SLOT(itemClear(int)));
+	connect(d->lv, SIGNAL(doubleClicked ( Q3ListViewItem * ) ), SLOT(openFile(Q3ListViewItem *)));
 	vb->addWidget(d->lv);
 	QHBoxLayout *hb = new QHBoxLayout;
 	vb->addLayout(hb);
@@ -1603,14 +1642,17 @@
 	delete d;
 }
 
-int FileTransDlg::addItem(const QString &filename, qlonglong size, const QString &peer, bool sending)
+int FileTransDlg::addItem(const QString &filename, const QString &path, const QPixmap &fileicon, qlonglong size, const QString &peer, bool sending)
 {
 	int id = d->findFreeId();
-	FileTransItem *i = new FileTransItem(d->lv, filename, size, peer, sending);
+	FileTransItem *i = new FileTransItem(d->lv, filename, path, size, peer, sending);
 	if(sending)
 		i->icon = IconsetFactory::icon("psi/upload").impix().pixmap();
 	else
 		i->icon = IconsetFactory::icon("psi/download").impix().pixmap();
+		
+		i->fileicon = fileicon;
+		
 	i->id = id;
 	d->t.start(1000);
 	return id;
@@ -1671,7 +1713,7 @@
 
 	TransferMapping *i = new TransferMapping;
 	i->h = h;
-	i->id = addItem(h->fileName(), h->fileSize(), peer, (h->mode() == FileTransferHandler::Sending));
+	i->id = addItem(h->fileName(), h->filePath(), h->fileIcon(), h->fileSize(), peer, (h->mode() == FileTransferHandler::Sending));
 	i->p = p;
 	i->sent = sent;
 	d->transferList.append(i);
@@ -1753,15 +1795,23 @@
 
 void FileTransDlg::itemOpenDest(int id)
 {
-	TransferMapping *i = d->findMapping(id);
-
-	QString path;
-	bool recv = (i->h->mode() == FileTransferHandler::Receiving);
-	if(recv)
-		path = QFileInfo(i->h->saveName()).path();
-	else
-		path = QFileInfo(i->h->fileName()).path();
-
+	FileTransItem *i = d->findItem(id);
+		
+#if defined(Q_OS_WIN)
+	QProcess::startDetached("explorer.exe", QStringList(QLatin1String("/select,") + QDir::toNativeSeparators(i->path)));
+#elif defined(Q_OS_MAC)
+	QProcess::execute("/usr/bin/osascript", QStringList()
+						<< "-e"
+						<< QString("tell application \"Finder\" to reveal POSIX file \"%1\"")
+						.arg(i->path));
+	QProcess::execute("/usr/bin/osascript", QStringList()
+						<< "-e"
+						<< "tell application \"Finder\" to activate");
+#else
+	// we cannot select a file here, because no file browser really supports it...
+	const QFileInfo fileInfo(i->path);
+	QProcess::startDetached("xdg-open", QStringList(fileInfo.path()));
+#endif
 	//printf("item open dest: [%s]\n", path.latin1());
 }
 
@@ -1773,6 +1823,16 @@
 	delete fi;
 }
 
+void FileTransDlg::openFile( Q3ListViewItem * item ){
+	FileTransItem *i = static_cast<FileTransItem*>(item);
+	if (i->done) {
+		QFileInfo fi(i->path);
+		if(fi.exists()){
+			QDesktopServices::openUrl(QUrl::fromLocalFile(i->path));
+		}
+	}
+}
+
 void FileTransDlg::killTransfers(PsiAccount *pa)
 {
 	Q3PtrList<TransferMapping> list = d->transferList;
diff -urN psi_old/src/filetransdlg.h psi_new/src/filetransdlg.h
--- psi_old/src/filetransdlg.h	2009-12-29 10:11:43.000000000 +0800
+++ psi_new/src/filetransdlg.h	2009-12-28 22:04:18.000000000 +0800
@@ -7,6 +7,8 @@
 
 class PsiCon;
 class PsiAccount;
+class Q3ListViewItem;
+class QPixmap;
 namespace XMPP {
 	class FileTransfer;
 	class Jid;
@@ -32,6 +34,9 @@
 	int totalSteps() const;
 	bool resumeSupported() const;
 	QString saveName() const;
+	QString filePath() const;
+	QPixmap fileIcon() const;
+	
 
 	void send(const Jid &to, const QString &fname, const QString &desc);
 	void accept(const QString &saveName, const QString &fileName, qlonglong offset=0);
@@ -111,7 +116,7 @@
 	FileTransDlg(PsiCon *);
 	~FileTransDlg();
 
-	int addItem(const QString &filename, qlonglong size, const QString &peer, bool sending);
+	int addItem(const QString &filename, const QString &path, const QPixmap &fileicon, qlonglong size, const QString &peer, bool sending);
 	void setProgress(int id, int step, int total, qlonglong sent, int bytesPerSecond, bool updateAll=false);
 	void setError(int id, const QString &reason);
 	void removeItem(int id);
@@ -128,6 +133,7 @@
 	void itemCancel(int);
 	void itemOpenDest(int);
 	void itemClear(int);
+	void openFile(Q3ListViewItem *);
 
 private:
 	class Private;
