From 6de52c401becd4995b6ac4985c408eb95b8d9452 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Wed, 25 Nov 2009 10:09:45 +0100
Subject: [PATCH] FileManager: Introduce FileManagerPrivate, cleanup
 Task-number:  QTCREATORBUG-333

---
 src/plugins/coreplugin/filemanager.cpp | 163 +++++++++++++++----------
 src/plugins/coreplugin/filemanager.h   |  31 +----
 2 files changed, 105 insertions(+), 89 deletions(-)

diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp
index ebd5c91333e..86cc0ffc0e0 100644
--- a/src/plugins/coreplugin/filemanager.cpp
+++ b/src/plugins/coreplugin/filemanager.cpp
@@ -34,7 +34,6 @@
 #include "icore.h"
 #include "ifile.h"
 #include "iversioncontrol.h"
-#include "mainwindow.h"
 #include "mimedatabase.h"
 #include "saveitemsdialog.h"
 #include "vcsmanager.h"
@@ -48,11 +47,10 @@
 #include <QtCore/QDir>
 #include <QtCore/QTimer>
 #include <QtCore/QFileSystemWatcher>
+#include <QtCore/QDateTime>
 #include <QtGui/QFileDialog>
 #include <QtGui/QMessageBox>
-
-using namespace Core;
-using namespace Core::Internal;
+#include <QtGui/QMainWindow>
 
 /*!
   \class FileManager
@@ -82,32 +80,69 @@ using namespace Core::Internal;
 static const char *settingsGroup = "RecentFiles";
 static const char *filesKey = "Files";
 
-FileManager::FileManager(MainWindow *mw)
-  : QObject(mw),
+namespace Core {
+namespace Internal {
+
+struct FileInfo
+{
+    QString fileName;
+    QDateTime modified;
+    QFile::Permissions permissions;
+};
+
+struct FileManagerPrivate {
+    explicit FileManagerPrivate(QObject *q, QMainWindow *mw);
+
+    QMap<IFile*, FileInfo> m_managedFiles;
+
+    QStringList m_recentFiles;
+    static const int m_maxRecentFiles = 7;
+
+    QString m_currentFile;
+
+    QMainWindow *m_mainWindow;
+    QFileSystemWatcher *m_fileWatcher;
+    QList<QPointer<IFile> > m_changedFiles;
+    bool m_blockActivated;
+};
+
+FileManagerPrivate::FileManagerPrivate(QObject *q, QMainWindow *mw) :
     m_mainWindow(mw),
-    m_fileWatcher(new QFileSystemWatcher(this)),
+    m_fileWatcher(new QFileSystemWatcher(q)),
     m_blockActivated(false)
 {
-    connect(m_fileWatcher, SIGNAL(fileChanged(QString)),
+}
+
+} // namespace Internal
+
+FileManager::FileManager(QMainWindow *mw)
+  : QObject(mw),
+    d(new Internal::FileManagerPrivate(this, mw))
+{
+    Core::ICore *core = Core::ICore::instance();
+    connect(d->m_fileWatcher, SIGNAL(fileChanged(QString)),
         this, SLOT(changedFile(QString)));
-    connect(m_mainWindow, SIGNAL(windowActivated()),
+    connect(d->m_mainWindow, SIGNAL(windowActivated()),
         this, SLOT(mainWindowActivated()));
-    connect(Core::ICore::instance(), SIGNAL(contextChanged(Core::IContext*)),
+    connect(core, SIGNAL(contextChanged(Core::IContext*)),
         this, SLOT(syncWithEditor(Core::IContext*)));
 
-    QSettings *s = m_mainWindow->settings();
-    s->beginGroup(QLatin1String(settingsGroup));
-    m_recentFiles = s->value(QLatin1String(filesKey), QStringList()).toStringList();
-    s->endGroup();
-    for (QStringList::iterator it = m_recentFiles.begin(); it != m_recentFiles.end(); ) {
+    const QSettings *s = core->settings();
+    d->m_recentFiles = s->value(QLatin1String(settingsGroup) + QLatin1Char('/') + QLatin1String(filesKey), QStringList()).toStringList();
+    for (QStringList::iterator it = d->m_recentFiles.begin(); it != d->m_recentFiles.end(); ) {
         if (QFileInfo(*it).isFile()) {
             ++it;
         } else {
-            it = m_recentFiles.erase(it);
+            it = d->m_recentFiles.erase(it);
         }
     }
 }
 
+FileManager::~FileManager()
+{
+    delete d;
+}
+
 /*!
     \fn bool FileManager::addFiles(const QList<IFile *> &files)
 
@@ -119,7 +154,7 @@ bool FileManager::addFiles(const QList<IFile *> &files)
 {
     bool filesAdded = false;
     foreach (IFile *file, files) {
-        if (!file || m_managedFiles.contains(file))
+        if (!file || d->m_managedFiles.contains(file))
             continue;
         connect(file, SIGNAL(changed()), this, SLOT(checkForNewFileName()));
         connect(file, SIGNAL(destroyed(QObject *)), this, SLOT(fileDestroyed(QObject *)));
@@ -146,8 +181,8 @@ void FileManager::fileDestroyed(QObject *obj)
 {
     // we can't use qobject_cast here, because meta data is already destroyed
     IFile *file = static_cast<IFile*>(obj);
-    const QString filename = m_managedFiles.value(file).fileName;
-    m_managedFiles.remove(file);
+    const QString filename = d->m_managedFiles.value(file).fileName;
+    d->m_managedFiles.remove(file);
     removeWatch(filename);
 }
 
@@ -166,9 +201,9 @@ bool FileManager::removeFile(IFile *file)
     disconnect(file, SIGNAL(changed()), this, SLOT(checkForNewFileName()));
     disconnect(file, SIGNAL(destroyed(QObject *)), this, SLOT(fileDestroyed(QObject *)));
 
-    if (!m_managedFiles.contains(file))
+    if (!d->m_managedFiles.contains(file))
         return false;
-    const FileInfo info = m_managedFiles.take(file);
+    const Internal::FileInfo info = d->m_managedFiles.take(file);
     const QString filename = info.fileName;
     removeWatch(filename);
     return true;
@@ -177,13 +212,13 @@ bool FileManager::removeFile(IFile *file)
 void FileManager::addWatch(const QString &filename)
 {
     if (!filename.isEmpty() && managedFiles(filename).isEmpty())
-        m_fileWatcher->addPath(filename);
+        d->m_fileWatcher->addPath(filename);
 }
 
 void FileManager::removeWatch(const QString &filename)
 {
     if (!filename.isEmpty() && managedFiles(filename).isEmpty())
-        m_fileWatcher->removePath(filename);
+        d->m_fileWatcher->removePath(filename);
 }
 
 void FileManager::checkForNewFileName()
@@ -191,9 +226,9 @@ void FileManager::checkForNewFileName()
     IFile *file = qobject_cast<IFile *>(sender());
     QTC_ASSERT(file, return);
     const QString newfilename = fixFileName(file->fileName());
-    const QString oldfilename = m_managedFiles.value(file).fileName;
+    const QString oldfilename = d->m_managedFiles.value(file).fileName;
     if (!newfilename.isEmpty() && newfilename != oldfilename) {
-        m_managedFiles[file].fileName = newfilename;
+        d->m_managedFiles[file].fileName = newfilename;
         removeWatch(oldfilename);
         addWatch(newfilename);
     }
@@ -233,8 +268,8 @@ QList<IFile *> FileManager::modifiedFiles() const
 {
     QList<IFile *> modifiedFiles;
 
-    const QMap<IFile*, FileInfo>::const_iterator cend =  m_managedFiles.constEnd();
-    for (QMap<IFile*, FileInfo>::const_iterator i = m_managedFiles.constBegin(); i != cend; ++i) {
+    const QMap<IFile*, Internal::FileInfo>::const_iterator cend =  d->m_managedFiles.constEnd();
+    for (QMap<IFile*, Internal::FileInfo>::const_iterator i = d->m_managedFiles.constBegin(); i != cend; ++i) {
         IFile *fi = i.key();
         if (fi->isModified())
             modifiedFiles << fi;
@@ -250,7 +285,7 @@ QList<IFile *> FileManager::modifiedFiles() const
 void FileManager::blockFileChange(IFile *file)
 {
     if (!file->fileName().isEmpty())
-        m_fileWatcher->removePath(file->fileName());
+        d->m_fileWatcher->removePath(file->fileName());
 }
 
 /*!
@@ -263,18 +298,18 @@ void FileManager::unblockFileChange(IFile *file)
     foreach (IFile *managedFile, managedFiles(file->fileName()))
         updateFileInfo(managedFile);
     if (!file->fileName().isEmpty())
-        m_fileWatcher->addPath(file->fileName());
+        d->m_fileWatcher->addPath(file->fileName());
 }
 
 void FileManager::updateFileInfo(IFile *file)
 {
     const QString fixedname = fixFileName(file->fileName());
     const QFileInfo fi(file->fileName());
-    FileInfo info;
+    Internal::FileInfo info;
     info.fileName = fixedname;
     info.modified = fi.lastModified();
     info.permissions = fi.permissions();
-    m_managedFiles.insert(file, info);
+    d->m_managedFiles.insert(file, info);
 }
 
 /*!
@@ -342,7 +377,7 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files,
         if (silently) {
             filesToSave = modifiedFiles;
         } else {
-            SaveItemsDialog dia(m_mainWindow, modifiedFiles);
+            Internal::SaveItemsDialog dia(d->m_mainWindow, modifiedFiles);
             if (!message.isEmpty())
                 dia.setMessage(message);
             if (!alwaysSaveMessage.isNull())
@@ -361,11 +396,11 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files,
         }
 
         bool yestoall = false;
+        Core::VCSManager *vcsManager = Core::ICore::instance()->vcsManager();
         foreach (IFile *file, filesToSave) {
             if (file->isReadOnly()) {
-                QString directory = QFileInfo(file->fileName()).absolutePath();
-                IVersionControl *versionControl = m_mainWindow->vcsManager()->findVersionControlForDirectory(directory);
-                if (versionControl)
+                const QString directory = QFileInfo(file->fileName()).absolutePath();
+                if (IVersionControl *versionControl = vcsManager->findVersionControlForDirectory(directory))
                     versionControl->vcsOpen(file->fileName());
             }
             if (!file->isReadOnly() && !file->fileName().isEmpty()) {
@@ -378,7 +413,7 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files,
                 if (yestoall)
                     continue;
                 const QFileInfo fi(file->fileName());
-                switch (skipFailedPrompt(m_mainWindow, fi.fileName())) {
+                switch (skipFailedPrompt(d->m_mainWindow, fi.fileName())) {
                 case QMessageBox::YesToAll:
                     yestoall = true;
                     break;
@@ -413,11 +448,11 @@ QString FileManager::getSaveFileNameWithExtension(const QString &title, const QS
     bool repeat;
     do {
         repeat = false;
-        fileName = QFileDialog::getSaveFileName(m_mainWindow, title, path, fileFilter);
+        fileName = QFileDialog::getSaveFileName(d->m_mainWindow, title, path, fileFilter);
         if (!fileName.isEmpty() && !extension.isEmpty() && !fileName.endsWith(extension)) {
             fileName.append(extension);
             if (QFile::exists(fileName)) {
-                if (QMessageBox::warning(m_mainWindow, tr("Overwrite?"),
+                if (QMessageBox::warning(d->m_mainWindow, tr("Overwrite?"),
                         tr("An item named '%1' already exists at this location. Do you want to overwrite it?").arg(fileName),
                         QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)
                     repeat = true;
@@ -462,10 +497,10 @@ QString FileManager::getSaveAsFileName(IFile *file)
 
 void FileManager::changedFile(const QString &file)
 {
-    const bool wasempty = m_changedFiles.isEmpty();
+    const bool wasempty = d->m_changedFiles.isEmpty();
     foreach (IFile *fileinterface, managedFiles(file))
-        m_changedFiles << fileinterface;
-    if (wasempty && !m_changedFiles.isEmpty()) {
+        d->m_changedFiles << fileinterface;
+    if (wasempty && !d->m_changedFiles.isEmpty()) {
         QTimer::singleShot(200, this, SLOT(checkForReload()));
     }
 }
@@ -480,17 +515,17 @@ void FileManager::mainWindowActivated()
 
 void FileManager::checkForReload()
 {
-    if (QApplication::activeWindow() == m_mainWindow &&
-        !m_blockActivated && !m_changedFiles.isEmpty()) {
-        m_blockActivated = true;
-        const QList<QPointer<IFile> > changed = m_changedFiles;
-        m_changedFiles.clear();
+    if (QApplication::activeWindow() == d->m_mainWindow &&
+        !d->m_blockActivated && !d->m_changedFiles.isEmpty()) {
+        d->m_blockActivated = true;
+        const QList<QPointer<IFile> > changed = d->m_changedFiles;
+        d->m_changedFiles.clear();
         IFile::ReloadBehavior behavior = EditorManager::instance()->reloadBehavior();
         foreach (IFile *f, changed) {
             if (!f)
                 continue;
             QFileInfo fi(f->fileName());
-            FileInfo info = m_managedFiles.value(f);
+            Internal::FileInfo info = d->m_managedFiles.value(f);
             if (info.modified != fi.lastModified()
                     || info.permissions != fi.permissions()) {
                 if (info.modified != fi.lastModified())
@@ -503,11 +538,11 @@ void FileManager::checkForReload()
                 updateFileInfo(f);
 
                 // the file system watchers loses inodes when a file is removed/renamed. Work around it.
-                m_fileWatcher->removePath(f->fileName());
-                m_fileWatcher->addPath(f->fileName());
+                d->m_fileWatcher->removePath(f->fileName());
+                d->m_fileWatcher->addPath(f->fileName());
             }
         }
-        m_blockActivated = false;
+        d->m_blockActivated = false;
         checkForReload();
     }
 }
@@ -532,10 +567,10 @@ void FileManager::addToRecentFiles(const QString &fileName)
     if (fileName.isEmpty())
         return;
     QString prettyFileName(QDir::toNativeSeparators(fileName));
-    m_recentFiles.removeAll(prettyFileName);
-    if (m_recentFiles.count() > m_maxRecentFiles)
-        m_recentFiles.removeLast();
-    m_recentFiles.prepend(prettyFileName);
+    d->m_recentFiles.removeAll(prettyFileName);
+    if (d->m_recentFiles.count() > d->m_maxRecentFiles)
+        d->m_recentFiles.removeLast();
+    d->m_recentFiles.prepend(prettyFileName);
 }
 
 /*!
@@ -545,14 +580,14 @@ void FileManager::addToRecentFiles(const QString &fileName)
 */
 QStringList FileManager::recentFiles() const
 {
-    return m_recentFiles;
+    return d->m_recentFiles;
 }
 
 void FileManager::saveRecentFiles()
 {
-    QSettings *s = m_mainWindow->settings();
+    QSettings *s = Core::ICore::instance()->settings();
     s->beginGroup(QLatin1String(settingsGroup));
-    s->setValue(QLatin1String(filesKey), m_recentFiles);
+    s->setValue(QLatin1String(filesKey), d->m_recentFiles);
     s->endGroup();
 }
 
@@ -565,10 +600,10 @@ void FileManager::saveRecentFiles()
   */
 void FileManager::setCurrentFile(const QString &filePath)
 {
-    if (m_currentFile == filePath)
+    if (d->m_currentFile == filePath)
         return;
-    m_currentFile = filePath;
-    emit currentFileChanged(m_currentFile);
+    d->m_currentFile = filePath;
+    emit currentFileChanged(d->m_currentFile);
 }
 
 /*!
@@ -581,7 +616,7 @@ void FileManager::setCurrentFile(const QString &filePath)
   */
 QString FileManager::currentFile() const
 {
-    return m_currentFile;
+    return d->m_currentFile;
 }
 
 /*!
@@ -594,8 +629,8 @@ QList<IFile *> FileManager::managedFiles(const QString &fileName) const
     const QString fixedName = fixFileName(fileName);
     QList<IFile *> result;
     if (!fixedName.isEmpty()) {
-        const QMap<IFile*, FileInfo>::const_iterator cend =  m_managedFiles.constEnd();
-        for (QMap<IFile*, FileInfo>::const_iterator i = m_managedFiles.constBegin(); i != cend; ++i) {
+        const QMap<IFile*, Internal::FileInfo>::const_iterator cend =  d->m_managedFiles.constEnd();
+        for (QMap<IFile*, Internal::FileInfo>::const_iterator i = d->m_managedFiles.constBegin(); i != cend; ++i) {
             if (i.value().fileName == fixedName)
                 result << i.key();
         }
@@ -632,3 +667,5 @@ bool FileChangeBlocker::modifiedReload() const
 {
     return m_reload;
 }
+
+} // namespace Core
diff --git a/src/plugins/coreplugin/filemanager.h b/src/plugins/coreplugin/filemanager.h
index 129da98503a..b3cf4b4c9b7 100644
--- a/src/plugins/coreplugin/filemanager.h
+++ b/src/plugins/coreplugin/filemanager.h
@@ -33,14 +33,10 @@
 #include <coreplugin/core_global.h>
 
 #include <QtCore/QObject>
-#include <QtCore/QMap>
-#include <QtCore/QDateTime>
-#include <QtCore/QFile>
 #include <QtCore/QStringList>
-#include <QtCore/QPointer>
 
 QT_BEGIN_NAMESPACE
-class QFileSystemWatcher;
+class QMainWindow;
 QT_END_NAMESPACE
 
 namespace Core {
@@ -50,22 +46,15 @@ class IContext;
 class IFile;
 
 namespace Internal {
-class MainWindow;
+struct FileManagerPrivate;
 }
 
 class CORE_EXPORT FileManager : public QObject
 {
     Q_OBJECT
-
-    struct FileInfo
-    {
-        QString fileName;
-        QDateTime modified;
-        QFile::Permissions permissions;
-    };
-
 public:
-    explicit FileManager(Internal::MainWindow *ew);
+    explicit FileManager(QMainWindow *ew);
+    virtual ~FileManager();
 
     // file pool to monitor
     bool addFiles(const QList<IFile *> &files);
@@ -123,17 +112,7 @@ private:
                                const QString &alwaysSaveMessage = QString::null,
                                bool *alwaysSave = 0);
 
-    QMap<IFile*, FileInfo> m_managedFiles;
-
-    QStringList m_recentFiles;
-    static const int m_maxRecentFiles = 7;
-
-    QString m_currentFile;
-
-    Internal::MainWindow *m_mainWindow;
-    QFileSystemWatcher *m_fileWatcher;
-    QList<QPointer<IFile> > m_changedFiles;
-    bool m_blockActivated;
+    Internal::FileManagerPrivate *d;
 };
 
 /*! The FileChangeBlocker blocks all change notifications to all IFile * that
-- 
GitLab