From acd5feafeaf337d31f2e037a7d52298f04436643 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Tue, 10 Feb 2009 10:56:22 +0100
Subject: [PATCH] Fixes: React to desktop file manager drop events.

Task: 238143
---
 src/plugins/coreplugin/mainwindow.cpp  | 64 +++++++++++++++++++++++---
 src/plugins/coreplugin/mainwindow.h    |  6 ++-
 src/plugins/coreplugin/welcomemode.cpp |  1 +
 3 files changed, 62 insertions(+), 9 deletions(-)

diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index 91c2756d315..1c335c0af5e 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -77,6 +77,7 @@
 #include <QtCore/QSettings>
 #include <QtCore/QTimer>
 #include <QtCore/QtPlugin>
+#include <QtCore/QUrl>
 
 #include <QtGui/QApplication>
 #include <QtGui/QCloseEvent>
@@ -103,10 +104,9 @@ extern "C" void handleSigInt(int sig)
 using namespace Core;
 using namespace Core::Internal;
 
-namespace {
-    enum { debugMainWindow = 0 };
-}
+static const char *uriListMimeFormatC = "text/uri-list";
 
+enum { debugMainWindow = 0 };
 
 MainWindow::MainWindow() :
     QMainWindow(),
@@ -157,15 +157,15 @@ MainWindow::MainWindow() :
     QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
     QSettings::setDefaultFormat(QSettings::IniFormat);
     QString baseName = qApp->style()->objectName();
-#ifdef Q_WS_X11
-    if (baseName == "windows") {
+#ifdef Q_WS_X11    
+    if (baseName == QLatin1String("windows")) {
         // Sometimes we get the standard windows 95 style as a fallback
         // e.g. if we are running on a KDE4 desktop
         QByteArray desktopEnvironment = qgetenv("DESKTOP_SESSION");
         if (desktopEnvironment == "kde")
-            baseName = "plastique";
+            baseName = QLatin1String("plastique");
         else
-            baseName = "cleanlooks";
+            baseName = QLatin1String("cleanlooks");
     }
 #endif
     qApp->setStyle(new ManhattanStyle(baseName));
@@ -202,6 +202,7 @@ MainWindow::MainWindow() :
 #endif
 
     statusBar()->setProperty("p_styled", true);
+    setAcceptDrops(true);
 }
 
 void MainWindow::setSidebarVisible(bool visible)
@@ -361,6 +362,55 @@ void MainWindow::closeEvent(QCloseEvent *event)
     event->accept();
 }
 
+// Check for desktop file manager file drop events
+
+static bool isDesktopFileManagerDrop(const QMimeData *d, QStringList *files = 0)
+{
+    if (files)
+        files->clear();
+    // Extract dropped files from Mime data.
+    if (!d->hasFormat(QLatin1String(uriListMimeFormatC)))
+        return false;
+    const QList<QUrl> urls = d->urls();
+    if (urls.empty())
+        return false;
+    // Try to find local files
+    bool hasFiles = false;
+    const QList<QUrl>::const_iterator cend = urls.constEnd();
+    for (QList<QUrl>::const_iterator it = urls.constBegin(); it != cend; ++it) {
+        const QString fileName = it->toLocalFile();
+        if (!fileName.isEmpty()) {
+            hasFiles = true;
+            if (files) {
+                files->push_back(fileName);
+            } else {
+                break; // No result list, sufficient for checking
+            }
+        }
+    }
+    return hasFiles;
+}
+
+void MainWindow::dragEnterEvent(QDragEnterEvent *event)
+{
+    if (isDesktopFileManagerDrop(event->mimeData())) {
+        event->accept();
+    } else {
+        event->ignore();
+    }
+}
+
+void MainWindow::dropEvent(QDropEvent *event)
+{
+    QStringList files;
+    if (isDesktopFileManagerDrop(event->mimeData(), &files)) {
+        event->accept();
+        openFiles(files);
+    } else {
+        event->ignore();
+    }
+}
+
 IContext *MainWindow::currentContextObject() const
 {
     return m_activeContext;
diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h
index c0203a2af37..912c84482fa 100644
--- a/src/plugins/coreplugin/mainwindow.h
+++ b/src/plugins/coreplugin/mainwindow.h
@@ -139,8 +139,10 @@ public slots:
     void showOptionsDialog(const QString &category = QString(), const QString &page = QString());
 
 protected:
-    void changeEvent(QEvent *e);
-    void closeEvent(QCloseEvent *event);
+    virtual void changeEvent(QEvent *e);
+    virtual void closeEvent(QCloseEvent *event);
+    virtual void dragEnterEvent(QDragEnterEvent *event);
+    virtual void dropEvent(QDropEvent *event);
 
 private slots:
     void openFile();
diff --git a/src/plugins/coreplugin/welcomemode.cpp b/src/plugins/coreplugin/welcomemode.cpp
index 7cd17e3ddcd..21a25471101 100644
--- a/src/plugins/coreplugin/welcomemode.cpp
+++ b/src/plugins/coreplugin/welcomemode.cpp
@@ -150,6 +150,7 @@ WelcomeMode::WelcomeMode() :
     updateWelcomePage(welcomePageData);
 
     l->addWidget(m_d->m_webview);
+    m_d->m_webview->setAcceptDrops(false);
 
 #else
     m_d->m_label->setWordWrap(true);
-- 
GitLab