--- /dev/null
+#include "filelistwidget.h"
+#include <QHeaderView>
+#include <QMessageBox>
+#include <QInputDialog>
+#include <QDesktopServices>
+#include <QUrl>
+#include <QProcess>
+#include <QDBusInterface>
+#ifdef Q_WS_MAEMO_5
+# include <hildon-mime.h>
+# include <dbus/dbus.h>
+#endif
+/*!
+Widget that shows filesystemmodel and handles navigation
+in directory tree and opening files with assosiated programs
+
+@todo in symbian and windows filesystems navigating to "root" wont show drives
+ */
+FileListWidget::FileListWidget(QWidget *parent) :
+ QListView(parent),
+ fileSystemModel( new QFileSystemModel(this)),
+ currentDir(QDir::homePath()),
+ mode_cut(false),
+ mode_copy(false),
+ select(false)
+{
+ this->setModel(fileSystemModel);
+ this->setRootIndex(fileSystemModel->index(currentDir.absolutePath()));
+ fileSystemModel->setRootPath(currentDir.absolutePath());
+ fileSystemModel->setFilter(fileSystemModel->filter() | QDir::System);
+ connect(this, SIGNAL(activated(QModelIndex)), this, SLOT(handleItemActivation(QModelIndex)));
+
+}
+
+/**
+ Switches view mode
+ @param iconmode true shows iconview, false shows listview
+ */
+void FileListWidget::actionSwitchMode(bool iconmode)
+{
+ if(iconmode) {
+ this->setViewMode(QListView::IconMode);
+ this->setWordWrap(true);
+ this->setGridSize(QSize(80,80));
+ } else {
+ this->setViewMode(QListView::ListMode);
+ this->setWordWrap(false);
+ this->setGridSize(QSize());
+ }
+}
+
+/**
+ Switches show hidden
+ @param show true shows hidden files
+ */
+void FileListWidget::actionShowHidden(bool show)
+{
+ if(show)
+ fileSystemModel->setFilter(fileSystemModel->filter() | QDir::Hidden);
+ else
+ fileSystemModel->setFilter(fileSystemModel->filter() &~ QDir::Hidden);
+
+ this->clearSelection();
+}
+
+/**
+ Rename selected file
+ */
+void FileListWidget::actionRename()
+{
+ QFileInfo file = fileSystemModel->fileInfo(this->selectedIndexes().first());
+ QString newName = QInputDialog::getText(this, tr("Rename"), tr("New filename: "), QLineEdit::Normal, file.fileName());
+ if(newName != file.fileName() && !newName.isEmpty())
+ {
+ if(QFile::rename(file.absoluteFilePath(), file.absolutePath()+"/"+newName))
+ return;
+ else
+ QMessageBox::critical(this,tr("Error!")
+ ,tr("Renaming file %1 failed")
+ .arg(file.fileName())
+ ,QMessageBox::Ok);
+ }
+}
+/**
+ Selected files will be moved when actionPaste is called
+ */
+void FileListWidget::actionCut()
+{
+ mode_cut = true;
+ mode_copy = false;
+ selectedFiles = this->selectedIndexes();
+}
+/**
+ Selected files will be copied when actionPaste is called
+ */
+void FileListWidget::actionCopy()
+{
+ mode_cut = false;
+ mode_copy = true;
+ selectedFiles = this->selectedIndexes();
+}
+
+/**
+ Moves or copies files that were selected when actionCut or actionCopy called
+ */
+void FileListWidget::actionPaste()
+{
+ fileSystemModel->setReadOnly(false);
+ if(mode_copy) {
+ //Copy files until filelist is empty or error occured
+ while(!selectedFiles.isEmpty()) {
+ if(QFile::copy(fileSystemModel->fileInfo(selectedFiles.first()).absoluteFilePath()
+ , fileSystemModel->rootPath()+"/"+fileSystemModel->fileName(selectedFiles.first()))) {
+ selectedFiles.removeFirst();
+ }
+ else if(QFile::copy(fileSystemModel->fileInfo(selectedFiles.first()).absoluteFilePath()
+ , fileSystemModel->rootPath()+"/copy_"+fileSystemModel->fileName(selectedFiles.first()))) {
+ selectedFiles.removeFirst();
+ } else {
+ QMessageBox::critical(this,tr("Error!")
+ ,tr("Copying file %1 failed")
+ .arg(fileSystemModel->fileName(selectedFiles.first()))
+ ,QMessageBox::Ok);
+ break;
+ }
+ }
+ if(selectedFiles.isEmpty())
+ mode_copy = false;
+ } else if(mode_cut) {
+ //Move files until filelist is empty or error occured
+ while(!selectedFiles.isEmpty()) {
+ if(QFile::rename(fileSystemModel->fileInfo(selectedFiles.first()).absoluteFilePath()
+ , fileSystemModel->rootPath()+"/"+fileSystemModel->fileName(selectedFiles.first()))) {
+ selectedFiles.removeFirst();
+ } else {
+ QMessageBox::critical(this,tr("Error!")
+ ,tr("Moving file %1 failed")
+ .arg(fileSystemModel->fileName(selectedFiles.first()))
+ ,QMessageBox::Ok);
+ break;
+ }
+ }
+ if(selectedFiles.isEmpty())
+ mode_cut = false;
+ }
+ fileSystemModel->setReadOnly(true);
+ this->clearSelection();
+}
+
+/**
+ Deletes selected files
+ */
+void FileListWidget::actionDelete()
+{
+ mode_cut = false;
+ mode_copy = false;
+ if(QMessageBox::Yes == QMessageBox::warning(this, tr("Deleting file")
+ ,tr("You are about to delete %1 file(s).\nAre you sure you want to continue?")
+ .arg(this->selectedIndexes().count())
+ , QMessageBox::Yes, QMessageBox::No)) {
+ fileSystemModel->setReadOnly(false);
+ selectedFiles = this->selectedIndexes();
+ //delete files until filelist empty or error occured
+ while(!selectedFiles.isEmpty()) {
+ if(fileSystemModel->remove(selectedFiles.first())) {
+ selectedFiles.removeFirst();
+ } else {
+ QMessageBox::critical(this,tr("Error!")
+ ,tr("Deleting file %1 failed")
+ .arg(fileSystemModel->fileName(selectedFiles.first()))
+ ,QMessageBox::Ok);
+ break;
+ }
+ }
+ fileSystemModel->setReadOnly(true);
+ this->clearSelection();
+ }
+}
+
+/**
+ @return Current directory shown
+ */
+QString FileListWidget::getPath()
+{
+ return currentDir.absolutePath();
+}
+
+/**
+ Changes current directory
+ @param path directory to change to
+ */
+void FileListWidget::changePath(QString path)
+{
+ currentDir.cd(path);
+ QString newPath = currentDir.absolutePath();
+ fileSystemModel->setRootPath(newPath);
+ this->clearSelection();
+ this->setRootIndex(fileSystemModel->index(newPath));
+ emit pathChanged(newPath);
+}
+
+/**
+ Equivalent to changePath("..")
+ */
+void FileListWidget::changePathUp()
+{
+ changePath("..");
+}
+
+void FileListWidget::handleItemActivation(QModelIndex index)
+{
+ if(!select) {
+ QFileInfo file = fileSystemModel->fileInfo(index);
+ if(file.isDir()) {
+ changePath(file.absoluteFilePath());
+ } else if(file.isExecutable()) {
+ // Make process
+ QProcess::startDetached(file.absoluteFilePath());
+ } else {
+#ifdef Q_WS_MAEMO_5 // Uses native file opening method
+ //TODO: find better solution for this, maybe get fixed in Qt
+ DBusConnection* conn;
+ conn = dbus_bus_get(DBUS_BUS_SESSION, 0);
+ hildon_mime_open_file(conn, QUrl::fromLocalFile(file.absoluteFilePath()).toEncoded().constData());
+#else
+ /*
+ Not working with maemo5.
+ Uses hildon_uri_open function from
+ libhildonmime which should work,
+ but all files opened in browser.
+ */
+ QDesktopServices::openUrl(QUrl::fromLocalFile(file.absoluteFilePath()));
+#endif
+ }
+ }
+}
+/**
+ @param mode true activates file selection
+ */
+void FileListWidget::setSelectMode(bool mode)
+{
+ if(mode)
+ this->setSelectionMode(QAbstractItemView::ExtendedSelection);
+ else
+ this->setSelectionMode(QAbstractItemView::SingleSelection);
+ select = mode;
+}
+
+/**
+ Opens native bluetooth dialog to choose receiving device and sends selected files there.
+ */
+void FileListWidget::actionSendFiles()
+{
+#ifdef Q_WS_MAEMO_5
+ // Create list of file urls
+ QStringList files;
+ QFileInfo file;
+ foreach(QModelIndex index, this->selectedIndexes()) {
+ file = fileSystemModel->fileInfo(index);
+ if(file.isDir()) {
+ QMessageBox::warning(this,
+ tr("Sending files"),
+ tr("Sending directories not supported"),
+ QMessageBox::Cancel);
+ return;
+ }
+ files.append(QUrl::fromLocalFile(file.absoluteFilePath()).toString());
+ }
+
+ // Make dbuscall to send files
+ QDBusInterface interface("com.nokia.bt_ui", "/com/nokia/bt_ui", "com.nokia.bt_ui",QDBusConnection::systemBus());
+ interface.call(QDBus::Block, "show_send_file_dlg", files);
+
+#else
+ QMessageBox::information(this,
+ tr("Sending files"),
+ tr("Only in maemo5 for now"),
+ QMessageBox::Cancel);
+#endif
+
+}
+