diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 3eb7503ac8aed9dbf788b25c91a15524d8173dad..52f1a51195d5384fea48ec4a8ffb900bfb033a21 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1201,6 +1201,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 = @@ -1270,6 +1272,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); @@ -1278,6 +1281,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 9dd658faf4e0ac436f43b941d65a143e4881f0e1..06179c16e5740c9b20e939f00838b8d27acda0ab 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 665dd5617aa72dcc61c2c067545eae7ce6f3947c..55b9e143792280d9aed4aea59c39486d7f3eb859 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,22 +150,34 @@ bool BaseTextDocument::isReadOnly() const const QFileInfo fi(m_fileName); + return m_fileIsReadOnly; + +} + +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++; + // Check for permissions on NTFS file systems + qt_ntfs_permission_lookup++; #endif - const bool ro = !fi.isWritable(); + m_fileIsReadOnly = !fi.isWritable(); #ifdef Q_OS_WIN - qt_ntfs_permission_lookup--; + qt_ntfs_permission_lookup--; #endif - return ro; -} -bool BaseTextDocument::isModified() const -{ - return m_document->isModified(); + } else { + m_fileIsReadOnly = false; + } } bool BaseTextDocument::open(const QString &fileName) @@ -172,6 +185,7 @@ 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 a07528f11fa834979c3c6143ad82f267781a9b21..a8326514894c987766bc17272089e0abf780657e 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 0918c841548413fcf621e84439078b52d0f7db77..6a635c32dec01e3cf265f5dea00b462cc63b9dcf 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -1332,15 +1332,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 80422f88a61c5030b15f6dcc25573928f545801b..86f43ff22d57cfe9f490a2761da238fb35d91518 100644 --- a/src/plugins/texteditor/basetexteditor_p.h +++ b/src/plugins/texteditor/basetexteditor_p.h @@ -142,9 +142,6 @@ public: #endif void setupDocumentSignals(BaseTextDocument *document); void updateLineSelectionColor(); -#ifndef TEXTEDITOR_STANDALONE - bool needMakeWritableCheck() const; -#endif void print(QPrinter *printer);