From e2a06db32e6c5bd02265021b9ad1da798f0b7d20 Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Tue, 7 Jul 2009 15:26:56 +0200
Subject: [PATCH] Make FileWatcher more robust, fix a few bugs in that code.

Also cache a lastModified time, so that we don't emit a signal if it
didn't change.
---
 src/plugins/coreplugin/mainwindow.cpp       |  1 -
 src/plugins/projectexplorer/filewatcher.cpp | 48 +++++++++++++--------
 src/plugins/projectexplorer/filewatcher.h   |  5 ++-
 3 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index 3d2909c31f7..a5c22d53ecd 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -304,7 +304,6 @@ bool MainWindow::init(QString *errorMessage)
     OutputPanePlaceHolder *oph = new OutputPanePlaceHolder(m_outputMode);
     oph->setCloseable(false);
     outputModeWidget->layout()->addWidget(oph);
-    oph->setVisible(true);
     outputModeWidget->layout()->addWidget(new Core::FindToolBarPlaceHolder(m_outputMode));
     outputModeWidget->setFocusProxy(oph);
 
diff --git a/src/plugins/projectexplorer/filewatcher.cpp b/src/plugins/projectexplorer/filewatcher.cpp
index 4a12840d88d..76dcd45d092 100644
--- a/src/plugins/projectexplorer/filewatcher.cpp
+++ b/src/plugins/projectexplorer/filewatcher.cpp
@@ -55,8 +55,10 @@ FileWatcher::FileWatcher(QObject *parent) :
 
 FileWatcher::~FileWatcher()
 {
-    foreach (const QString &file, m_files)
+    QStringList keys = m_files.keys();
+    foreach(const QString &file, keys)
         removeFile(file);
+
     if (--m_objectCount == 0) {
         delete m_watcher;
         m_watcher = 0;
@@ -65,29 +67,41 @@ FileWatcher::~FileWatcher()
 
 void FileWatcher::slotFileChanged(const QString &file)
 {
-    if (m_files.contains(file))
-        emit fileChanged(file);
-}
-
-QStringList FileWatcher::files()
-{
-    return m_files;
+    if (m_files.contains(file)) {
+        QDateTime lastModified = QFileInfo(file).lastModified();
+        if (lastModified != m_files.value(file)) {
+            m_files[file] = lastModified;
+            qDebug() << "slotFileChanged" << file << lastModified;
+            emit fileChanged(file);
+        } else {
+            qDebug() << "WTF:" << file<<lastModified.toString();
+        }
+    }
 }
 
 void FileWatcher::addFile(const QString &file)
 {
-    if (m_files.contains(file))
-        return;
-    m_files += file;
-    if (m_fileCount[file] == 0)
+    const int count = ++m_fileCount[file];
+    Q_ASSERT(count > 0);
+
+    m_files.insert(file, QDateTime());
+
+    if (count == 1)
         m_watcher->addPath(file);
-    m_fileCount[file] += 1;
 }
 
 void FileWatcher::removeFile(const QString &file)
 {
-    m_files.removeOne(file);
-    m_fileCount[file] -= 1;
-    if (m_fileCount[file] == 0)
-      m_watcher->removePath(file);
+    if (!m_files.contains(file))
+        return;
+
+    const int count = --m_fileCount[file];
+    Q_ASSERT(count >= 0);
+
+    m_files.remove(file);
+
+    if (!count) {
+        m_watcher->removePath(file);
+        m_fileCount.remove(file);
+    }
 }
diff --git a/src/plugins/projectexplorer/filewatcher.h b/src/plugins/projectexplorer/filewatcher.h
index 24a1c40e03a..242c5ac1f6f 100644
--- a/src/plugins/projectexplorer/filewatcher.h
+++ b/src/plugins/projectexplorer/filewatcher.h
@@ -36,6 +36,8 @@
 #include <QtCore/QHash>
 #include <QtCore/QObject>
 #include <QtCore/QStringList>
+#include <QtCore/QDateTime>
+#include <QtCore/QMap>
 
 QT_BEGIN_NAMESPACE
 class QTimer;
@@ -52,7 +54,6 @@ public:
     explicit FileWatcher(QObject *parent = 0);
     virtual ~FileWatcher();
 
-    QStringList files();
     void addFile(const QString &file);
     void removeFile(const QString &file);
 signals:
@@ -66,7 +67,7 @@ private:
     static int m_objectCount;
     static QHash<QString, int> m_fileCount;
     static QFileSystemWatcher *m_watcher;
-    QStringList m_files;
+    QMap<QString, QDateTime> m_files;
 };
 
 } // namespace ProjectExplorer
-- 
GitLab