diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index ee0c58e0a4c..9bc7c468b84 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1173,6 +1173,8 @@ bool EditorManager::saveFile(IEditor *editor) return false; IFile *file = editor->file(); + file->checkPermissions(); + const QString &fileName = file->fileName(); if (!fileName.isEmpty() && file->isReadOnly()) { MakeWritableResult answer = @@ -1242,6 +1244,7 @@ EditorManager::makeEditorWritable(IEditor *editor) QMessageBox::warning(m_d->m_core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with SCC.")); return Failed; } + file->checkPermissions(); return OpenedWithVersionControl; case RO_MakeWriteable: { const bool permsOk = QFile::setPermissions(fileName, QFile::permissions(fileName) | QFile::WriteUser); @@ -1250,6 +1253,7 @@ EditorManager::makeEditorWritable(IEditor *editor) return Failed; } } + file->checkPermissions(); return MadeWritable; case RO_SaveAs : return saveFileAs(editor) ? SavedAs : Failed; diff --git a/src/plugins/coreplugin/ifile.h b/src/plugins/coreplugin/ifile.h index 9dd658faf4e..06179c16e57 100644 --- a/src/plugins/coreplugin/ifile.h +++ b/src/plugins/coreplugin/ifile.h @@ -60,6 +60,8 @@ public: virtual void modified(ReloadBehavior *behavior) = 0; + virtual void checkPermissions() {} + signals: void changed(); }; diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp index 665dd5617aa..55b9e143792 100644 --- a/src/plugins/texteditor/basetextdocument.cpp +++ b/src/plugins/texteditor/basetextdocument.cpp @@ -70,6 +70,7 @@ BaseTextDocument::BaseTextDocument() { m_documentMarker = new DocumentMarker(m_document); m_lineTerminatorMode = NativeLineTerminator; + m_fileIsReadOnly = false; m_isBinaryData = false; m_codec = QTextCodec::codecForLocale(); m_hasDecodingError = false; @@ -149,17 +150,8 @@ bool BaseTextDocument::isReadOnly() const const QFileInfo fi(m_fileName); -#ifdef Q_OS_WIN - // Check for permissions on NTFS file systems - qt_ntfs_permission_lookup++; -#endif + return m_fileIsReadOnly; - const bool ro = !fi.isWritable(); - -#ifdef Q_OS_WIN - qt_ntfs_permission_lookup--; -#endif - return ro; } bool BaseTextDocument::isModified() const @@ -167,11 +159,33 @@ bool BaseTextDocument::isModified() const return m_document->isModified(); } +void BaseTextDocument::checkPermissions() +{ + if (!m_fileName.isEmpty()) { + const QFileInfo fi(m_fileName); + +#ifdef Q_OS_WIN + // Check for permissions on NTFS file systems + qt_ntfs_permission_lookup++; +#endif + + m_fileIsReadOnly = !fi.isWritable(); + +#ifdef Q_OS_WIN + qt_ntfs_permission_lookup--; +#endif + + } else { + m_fileIsReadOnly = false; + } +} + bool BaseTextDocument::open(const QString &fileName) { QString title = tr("untitled"); if (!fileName.isEmpty()) { const QFileInfo fi(fileName); + m_fileIsReadOnly = !fi.isWritable(); m_fileName = fi.absoluteFilePath(); QFile file(fileName); diff --git a/src/plugins/texteditor/basetextdocument.h b/src/plugins/texteditor/basetextdocument.h index a07528f11fa..a8326514894 100644 --- a/src/plugins/texteditor/basetextdocument.h +++ b/src/plugins/texteditor/basetextdocument.h @@ -83,6 +83,7 @@ public: virtual bool isReadOnly() const; virtual bool isModified() const; virtual bool isSaveAsAllowed() const { return true; } + virtual void checkPermissions(); virtual void modified(Core::IFile::ReloadBehavior *behavior); virtual QString mimeType() const; void setMimeType(const QString &mt); @@ -141,6 +142,7 @@ private: LineTerminatorMode m_lineTerminatorMode; QTextCodec *m_codec; + bool m_fileIsReadOnly; bool m_isBinaryData; bool m_hasDecodingError; QByteArray m_decodingErrorSample; diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 5ef655e7997..568718d8893 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -1312,15 +1312,6 @@ void BaseTextEditorPrivate::setupDocumentSignals(BaseTextDocument *document) q->slotUpdateExtraAreaWidth(); } -#ifndef TEXTEDITOR_STANDALONE -bool BaseTextEditorPrivate::needMakeWritableCheck() const -{ - return !m_document->isModified() - && !m_document->fileName().isEmpty() - && m_document->isReadOnly(); -} -#endif - bool Parenthesis::hasClosingCollapse(const Parentheses &parentheses) { return closeCollapseAtPos(parentheses) >= 0; diff --git a/src/plugins/texteditor/basetexteditor_p.h b/src/plugins/texteditor/basetexteditor_p.h index e7a39515f8d..b1373d82fa6 100644 --- a/src/plugins/texteditor/basetexteditor_p.h +++ b/src/plugins/texteditor/basetexteditor_p.h @@ -128,9 +128,6 @@ public: #endif void setupDocumentSignals(BaseTextDocument *document); void updateLineSelectionColor(); -#ifndef TEXTEDITOR_STANDALONE - bool needMakeWritableCheck() const; -#endif void print(QPrinter *printer);