return selectedId;
}
-static QString formatFileFilters(const Core::ICore *core, QString *selectedFilter = 0)
-{
- if (selectedFilter)
- selectedFilter->clear();
-
- // Compile list of filter strings, sort, and remove duplicates (different mime types might
- // generate the same filter).
- QStringList filters = core->mimeDatabase()->filterStrings();
- if (filters.empty())
- return QString();
- filters.sort();
- filters.erase(std::unique(filters.begin(), filters.end()), filters.end());
-
- static const QString allFilesFilter =
- QCoreApplication::translate("Core", Constants::ALL_FILES_FILTER);
- if (selectedFilter)
- *selectedFilter = allFilesFilter;
-
- // Prepend all files filter (instead of appending to work around a bug in Qt/Mac).
- filters.prepend(allFilesFilter);
-
- return filters.join(QLatin1String(";;"));
-}
-
IEditor *EditorManager::openEditor(const QString &fileName, const QString &editorId,
OpenEditorFlags flags, bool *newEditor)
{
QStringList EditorManager::getOpenFileNames() const
{
QString selectedFilter;
- const QString &fileFilters = formatFileFilters(m_d->m_core, &selectedFilter);
+ const QString &fileFilters = m_d->m_core->mimeDatabase()->allFiltersString(&selectedFilter);
return ICore::instance()->fileManager()->getOpenFileNames(fileFilters,
QString(), &selectedFilter);
}
bool EditorManager::saveEditor(IEditor *editor)
{
- return saveFile(editor);
+ return saveFile(editor->file());
}
-bool EditorManager::saveFile(IEditor *editor)
+bool EditorManager::saveFile(IFile *fileParam)
{
- if (!editor)
- editor = currentEditor();
- if (!editor)
+ IFile *file = fileParam;
+ if (!file && currentEditor())
+ file = currentEditor()->file();
+ if (!file)
return false;
- IFile *file = editor->file();
file->checkPermissions();
const QString &fileName = file->fileName();
if (fileName.isEmpty())
- return saveFileAs(editor);
+ return saveFileAs(file);
bool success = false;
if (!success) {
MakeWritableResult answer =
- makeEditorWritable(editor);
+ makeFileWritable(file);
if (answer == Failed)
return false;
if (answer == SavedAs)
m_d->m_core->fileManager()->unblockFileChange(file);
}
- if (success && !editor->isTemporary())
- m_d->m_core->fileManager()->addToRecentFiles(editor->file()->fileName());
-
- return success;
-}
-
-EditorManager::ReadOnlyAction
- EditorManager::promptReadOnlyFile(const QString &fileName,
- const IVersionControl *versionControl,
- QWidget *parent,
- bool displaySaveAsButton)
-{
- // Version Control: If automatic open is desired, open right away.
- bool promptVCS = false;
- if (versionControl && versionControl->supportsOperation(IVersionControl::OpenOperation)) {
- if (versionControl->settingsFlags() & IVersionControl::AutoOpen)
- return RO_OpenVCS;
- promptVCS = true;
+ if (success) {
+ addFileToRecentFiles(file);
}
- // Create message box.
- QMessageBox msgBox(QMessageBox::Question, tr("File is Read Only"),
- tr("The file <i>%1</i> is read only.").arg(QDir::toNativeSeparators(fileName)),
- QMessageBox::Cancel, parent);
-
- QPushButton *vcsButton = 0;
- if (promptVCS)
- vcsButton = msgBox.addButton(tr("Open with VCS (%1)").arg(versionControl->displayName()), QMessageBox::AcceptRole);
-
- QPushButton *makeWritableButton = msgBox.addButton(tr("Make writable"), QMessageBox::AcceptRole);
-
- QPushButton *saveAsButton = 0;
- if (displaySaveAsButton)
- saveAsButton = msgBox.addButton(tr("Save as ..."), QMessageBox::ActionRole);
-
- msgBox.setDefaultButton(vcsButton ? vcsButton : makeWritableButton);
- msgBox.exec();
-
- QAbstractButton *clickedButton = msgBox.clickedButton();
- if (clickedButton == vcsButton)
- return RO_OpenVCS;
- if (clickedButton == makeWritableButton)
- return RO_MakeWriteable;
- if (clickedButton == saveAsButton)
- return RO_SaveAs;
- return RO_Cancel;
+ return success;
}
-
MakeWritableResult
-EditorManager::makeEditorWritable(IEditor *editor)
+EditorManager::makeFileWritable(IFile *file)
{
- if (!editor || !editor->file())
+ if (!file)
return Failed;
- QString directory = QFileInfo(editor->file()->fileName()).absolutePath();
+ QString directory = QFileInfo(file->fileName()).absolutePath();
IVersionControl *versionControl = m_d->m_core->vcsManager()->findVersionControlForDirectory(directory);
- IFile *file = editor->file();
const QString &fileName = file->fileName();
- switch (promptReadOnlyFile(fileName, versionControl, m_d->m_core->mainWindow(), true)) {
- case RO_OpenVCS:
+ switch (FileManager::promptReadOnlyFile(fileName, versionControl, m_d->m_core->mainWindow(), true)) {
+ case FileManager::RO_OpenVCS:
if (!versionControl->vcsOpen(fileName)) {
QMessageBox::warning(m_d->m_core->mainWindow(), tr("Failed!"), tr("Could not open the file for editing with SCC."));
return Failed;
}
file->checkPermissions();
return OpenedWithVersionControl;
- case RO_MakeWriteable: {
+ case FileManager::RO_MakeWriteable: {
const bool permsOk = QFile::setPermissions(fileName, QFile::permissions(fileName) | QFile::WriteUser);
if (!permsOk) {
QMessageBox::warning(m_d->m_core->mainWindow(), tr("Failed!"), tr("Could not set permissions to writable."));
}
file->checkPermissions();
return MadeWritable;
- case RO_SaveAs :
- return saveFileAs(editor) ? SavedAs : Failed;
- case RO_Cancel:
+ case FileManager::RO_SaveAs :
+ return saveFileAs(file) ? SavedAs : Failed;
+ case FileManager::RO_Cancel:
break;
}
return Failed;
}
-bool EditorManager::saveFileAs(IEditor *editor)
+bool EditorManager::saveFileAs(IFile *fileParam)
{
- if (!editor)
- editor = currentEditor();
- if (!editor)
+ IFile *file = fileParam;
+ if (!file && currentEditor())
+ file = currentEditor()->file();
+ if (!file)
return false;
- IFile *file = editor->file();
- const QString &filter = formatFileFilters(m_d->m_core);
+ const QString &filter = m_d->m_core->mimeDatabase()->allFiltersString();
QString selectedFilter =
m_d->m_core->mimeDatabase()->findByFile(QFileInfo(file->fileName())).filterString();
const QString &absoluteFilePath =
if (absoluteFilePath.isEmpty())
return false;
+
if (absoluteFilePath != file->fileName()) {
+ // close existing editors for the new file name
const QList<IEditor *> existList = editorsForFileName(absoluteFilePath);
if (!existList.isEmpty()) {
closeEditors(existList, false);
// a good way out either (also the undo stack would be lost). Perhaps the best is to
// re-think part of the editors design.
- if (success && !editor->isTemporary())
- m_d->m_core->fileManager()->addToRecentFiles(file->fileName());
-
+ if (success) {
+ addFileToRecentFiles(file);
+ }
updateActions();
return success;
}
+void EditorManager::addFileToRecentFiles(IFile *file)
+{
+ bool isTemporary = true;
+ QList<IEditor *> editors = editorsForFile(file);
+ foreach (IEditor *editor, editors) {
+ if (!editor->isTemporary()) {
+ isTemporary = false;
+ break;
+ }
+ }
+ if (!isTemporary)
+ m_d->m_core->fileManager()->addToRecentFiles(file->fileName());
+}
+
void EditorManager::gotoNextDocHistory()
{
OpenEditorsWindow *dialog = windowPopup();
void EditorManager::makeCurrentEditorWritable()
{
if (IEditor* curEditor = currentEditor())
- makeEditorWritable(curEditor);
+ makeFileWritable(curEditor->file());
}
void EditorManager::updateWindowTitle()
bool closeEditors(const QList<IEditor *> &editorsToClose, bool askAboutModifiedEditors = true);
- MakeWritableResult makeEditorWritable(IEditor *editor);
+ MakeWritableResult makeFileWritable(IFile *file);
QByteArray saveState() const;
bool restoreState(const QByteArray &state);
QTextCodec *defaultTextEncoding() const;
- // Helper to display a message dialog when encountering a read-only
- // file, prompting the user about how to make it writeable.
- enum ReadOnlyAction { RO_Cancel, RO_OpenVCS, RO_MakeWriteable, RO_SaveAs };
-
- static ReadOnlyAction promptReadOnlyFile(const QString &fileName,
- const IVersionControl *versionControl,
- QWidget *parent,
- bool displaySaveAsButton = false);
-
static qint64 maxTextFileSize();
void setWindowTitleAddition(const QString &addition);
bool closeAllEditors(bool askAboutModifiedEditors = true);
void openInExternalEditor();
- bool saveFile(Core::IEditor *editor = 0);
- bool saveFileAs(Core::IEditor *editor = 0);
+ bool saveFile(Core::IFile *file = 0);
+ bool saveFileAs(Core::IFile *file = 0);
void revertToSaved();
void closeEditor();
void closeOtherEditors();
void emptyView(Core::Internal::EditorView *view);
Core::Internal::EditorView *currentEditorView() const;
IEditor *pickUnusedEditor() const;
+ void addFileToRecentFiles(IFile *file);
static EditorManager *m_instance;
EditorManagerPrivate *m_d;
void EditorToolBar::makeEditorWritable()
{
if (currentEditor())
- ICore::instance()->editorManager()->makeEditorWritable(currentEditor());
+ ICore::instance()->editorManager()->makeFileWritable(currentEditor()->file());
}
void EditorToolBar::setCanGoBack(bool canGoBack)
#include <QtGui/QFileDialog>
#include <QtGui/QMessageBox>
#include <QtGui/QMainWindow>
+#include <QtGui/QPushButton>
/*!
\class Core::FileManager
struct FileManagerPrivate {
- explicit FileManagerPrivate(QObject *q, QMainWindow *mw);
+ explicit FileManagerPrivate(FileManager *q, QMainWindow *mw);
+ static FileManager *m_instance;
QMap<QString, FileState> m_states;
QStringList m_changedFiles;
QList<IFile *> m_filesWithoutWatch;
IFile *m_blockedIFile;
};
-FileManagerPrivate::FileManagerPrivate(QObject *q, QMainWindow *mw) :
+FileManager *FileManagerPrivate::m_instance = 0;
+
+FileManagerPrivate::FileManagerPrivate(FileManager *q, QMainWindow *mw) :
m_mainWindow(mw),
m_fileWatcher(new QFileSystemWatcher(q)),
m_blockActivated(false),
#endif
m_blockedIFile(0)
{
+ m_instance = q;
q->connect(m_fileWatcher, SIGNAL(fileChanged(QString)),
q, SLOT(changedFile(QString)));
#ifdef Q_OS_UNIX
delete d;
}
+FileManager *FileManager::instance()
+{
+ return Internal::FileManagerPrivate::m_instance;
+}
+
/*!
\fn bool FileManager::addFiles(const QList<IFile *> &files, bool addWatcher)
if (!addWatcher) {
// We keep those in a separate list
- foreach(IFile *file, files) {
+ foreach (IFile *file, files) {
if (file && !d->m_filesWithoutWatch.contains(file)) {
connect(file, SIGNAL(destroyed(QObject *)), this, SLOT(fileDestroyed(QObject *)));
d->m_filesWithoutWatch.append(file);
information to avoid annoying the user with "file has been removed"
popups.
*/
-void FileManager::renamedFile(const QString &from, QString &to)
+void FileManager::renamedFile(const QString &from, const QString &to)
{
const QString &fixedFrom = fixFileName(from, KeepLinks);
return files;
}
+FileManager::ReadOnlyAction
+ FileManager::promptReadOnlyFile(const QString &fileName,
+ const IVersionControl *versionControl,
+ QWidget *parent,
+ bool displaySaveAsButton)
+{
+ // Version Control: If automatic open is desired, open right away.
+ bool promptVCS = false;
+ if (versionControl && versionControl->supportsOperation(IVersionControl::OpenOperation)) {
+ if (versionControl->settingsFlags() & IVersionControl::AutoOpen)
+ return RO_OpenVCS;
+ promptVCS = true;
+ }
+
+ // Create message box.
+ QMessageBox msgBox(QMessageBox::Question, tr("File is Read Only"),
+ tr("The file <i>%1</i> is read only.").arg(QDir::toNativeSeparators(fileName)),
+ QMessageBox::Cancel, parent);
+
+ QPushButton *vcsButton = 0;
+ if (promptVCS)
+ vcsButton = msgBox.addButton(tr("Open with VCS (%1)").arg(versionControl->displayName()), QMessageBox::AcceptRole);
+
+ QPushButton *makeWritableButton = msgBox.addButton(tr("Make writable"), QMessageBox::AcceptRole);
+
+ QPushButton *saveAsButton = 0;
+ if (displaySaveAsButton)
+ saveAsButton = msgBox.addButton(tr("Save as ..."), QMessageBox::ActionRole);
+
+ msgBox.setDefaultButton(vcsButton ? vcsButton : makeWritableButton);
+ msgBox.exec();
+
+ QAbstractButton *clickedButton = msgBox.clickedButton();
+ if (clickedButton == vcsButton)
+ return RO_OpenVCS;
+ if (clickedButton == makeWritableButton)
+ return RO_MakeWriteable;
+ if (clickedButton == saveAsButton)
+ return RO_SaveAs;
+ return RO_Cancel;
+}
void FileManager::changedFile(const QString &fileName)
{
class ICore;
class IContext;
class IFile;
+class IVersionControl;
namespace Internal {
struct FileManagerPrivate;
explicit FileManager(QMainWindow *ew);
virtual ~FileManager();
+ static FileManager *instance();
+
// file pool to monitor
void addFiles(const QList<IFile *> &files, bool addWatcher = true);
void addFile(IFile *file, bool addWatcher = true);
void removeFile(IFile *file);
QList<IFile *> modifiedFiles() const;
- void renamedFile(const QString &from, QString &to);
+ void renamedFile(const QString &from, const QString &to);
void blockFileChange(IFile *file);
void unblockFileChange(IFile *file);
bool *alwaysSave = 0);
+ // Helper to display a message dialog when encountering a read-only
+ // file, prompting the user about how to make it writeable.
+ enum ReadOnlyAction { RO_Cancel, RO_OpenVCS, RO_MakeWriteable, RO_SaveAs };
+ static ReadOnlyAction promptReadOnlyFile(const QString &fileName,
+ const IVersionControl *versionControl,
+ QWidget *parent,
+ bool displaySaveAsButton = false);
+
QString fileDialogLastVisitedDirectory() const;
void setFileDialogLastVisitedDirectory(const QString &);
**************************************************************************/
#include "mimedatabase.h"
+#include "coreconstants.h"
#include <utils/qtcassert.h>
m_mutex.unlock();
return rc;
}
+QString MimeDatabase::allFiltersString(QString *allFilesFilter) const
+{
+ if (allFilesFilter)
+ allFilesFilter->clear();
+
+ // Compile list of filter strings, sort, and remove duplicates (different mime types might
+ // generate the same filter).
+ QStringList filters = filterStrings();
+ if (filters.empty())
+ return QString();
+ filters.sort();
+ filters.erase(std::unique(filters.begin(), filters.end()), filters.end());
+
+ static const QString allFiles =
+ QCoreApplication::translate("Core", Constants::ALL_FILES_FILTER);
+ if (allFilesFilter)
+ *allFilesFilter = allFiles;
+
+ // Prepend all files filter (instead of appending to work around a bug in Qt/Mac).
+ filters.prepend(allFiles);
+
+ return filters.join(QLatin1String(";;"));
+}
QString MimeDatabase::preferredSuffixByType(const QString &type) const
{
friend QDebug operator<<(QDebug d, const MimeDatabase &mt);
+ // returns a string with all the possible file filters, for use with file dialogs
+ QString allFiltersString(QString *allFilesFilter = 0) const;
private:
MimeType findByFileUnlocked(const QFileInfo &f) const;
const QString dir = QFileInfo(path).dir().path();
Core::ICore *core = Core::ICore::instance();
Core::IVersionControl *versionControl = core->vcsManager()->findVersionControlForDirectory(dir);
- switch (Core::EditorManager::promptReadOnlyFile(path, versionControl, core->mainWindow(), false)) {
- case Core::EditorManager::RO_OpenVCS:
+ switch (Core::FileManager::promptReadOnlyFile(path, versionControl, core->mainWindow(), false)) {
+ case Core::FileManager::RO_OpenVCS:
if (!versionControl->vcsOpen(path)) {
QMessageBox::warning(core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with VCS."));
return false;
}
break;
- case Core::EditorManager::RO_MakeWriteable: {
+ case Core::FileManager::RO_MakeWriteable: {
const bool permsOk = QFile::setPermissions(path, QFile::permissions(path) | QFile::WriteUser);
if (!permsOk) {
QMessageBox::warning(core->mainWindow(), tr("Failed!"), tr("Could not set permissions to writable."));
}
break;
}
- case Core::EditorManager::RO_SaveAs:
- case Core::EditorManager::RO_Cancel:
+ case Core::FileManager::RO_SaveAs:
+ case Core::FileManager::RO_Cancel:
return false;
}
return true;