From 2ed31967c418a3d232ecd049312484cd973ab229 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 4 Feb 2015 16:29:42 +0100 Subject: [PATCH] Mime type settings: Restore user changes Change-Id: I6c83989113de3beb5d27eb7c39b5c9e825b541e8 Reviewed-by: David Schulz --- src/plugins/coreplugin/coreplugin.cpp | 2 - src/plugins/coreplugin/mainwindow.cpp | 1 + src/plugins/coreplugin/mimetypesettings.cpp | 157 +++++++++++++++++--- src/plugins/coreplugin/mimetypesettings.h | 1 + 4 files changed, 135 insertions(+), 26 deletions(-) diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 746f650dd07..923bd2cdcb1 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -211,8 +211,6 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) void CorePlugin::extensionsInitialized() { - // TODO -// MimeDatabase::syncUserModifiedMimeTypes(); if (m_designMode->designModeIsRequired()) addObject(m_designMode); m_findPlugin->extensionsInitialized(); diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 00134e9e98e..9d966f8a338 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -331,6 +331,7 @@ bool MainWindow::init(QString *errorMessage) void MainWindow::extensionsInitialized() { + MimeTypeSettings::restoreSettings(); m_windowSupport = new WindowSupport(this, Context("Core.MainWindow")); m_windowSupport->setCloseActionEnabled(false); m_statusBarManager->extensionsInitalized(); diff --git a/src/plugins/coreplugin/mimetypesettings.cpp b/src/plugins/coreplugin/mimetypesettings.cpp index e656b84d45f..e549bf5de2a 100644 --- a/src/plugins/coreplugin/mimetypesettings.cpp +++ b/src/plugins/coreplugin/mimetypesettings.cpp @@ -39,9 +39,12 @@ #include #include #include +#include #include #include +#include +#include #include #include #include @@ -50,9 +53,28 @@ #include #include +static const char kModifiedMimeTypesFile[] = "/mimetypes/modifiedmimetypes.xml"; + +static const char mimeTypeTagC[] = "mime-type"; +static const char mimeTypeAttributeC[] = "type"; +static const char patternAttributeC[] = "pattern"; +static const char matchTagC[] = "match"; +static const char matchValueAttributeC[] = "value"; +static const char matchTypeAttributeC[] = "type"; +static const char matchOffsetAttributeC[] = "offset"; +static const char priorityAttributeC[] = "priority"; + namespace Core { namespace Internal { +class UserMimeType +{ +public: + QString name; + QStringList globPatterns; + QMap > rules; +}; + // MimeTypeSettingsModel class MimeTypeSettingsModel : public QAbstractTableModel { @@ -198,8 +220,8 @@ public: void configureUi(QWidget *w); - bool checkSelectedMimeType() const; - bool checkSelectedMagicHeader() const; +// bool checkSelectedMimeType() const; +// bool checkSelectedMagicHeader() const; void markMimeForPatternSync(int index); void markMimeForMagicSync(int index); @@ -232,20 +254,25 @@ private slots: public: static const QChar kSemiColon; + static QHash readUserModifiedMimeTypes(); // name -> mime type + static void applyUserModifiedMimeTypes(const QHash &mimeTypes); + static QHash m_userModifiedMimeTypes; MimeTypeSettingsModel *m_model; QSortFilterProxyModel *m_filterModel; - int m_mimeForPatternSync; - int m_mimeForMagicSync; - bool m_reset; - bool m_persist; QList m_modifiedMimeTypes; QString m_filterPattern; Ui::MimeTypeSettingsPage m_ui; QPointer m_widget; + int m_mimeForPatternSync; + int m_mimeForMagicSync; + bool m_reset; + bool m_persist; }; const QChar MimeTypeSettingsPrivate::kSemiColon(QLatin1Char(';')); +QHash MimeTypeSettingsPrivate::m_userModifiedMimeTypes + = QHash(); MimeTypeSettingsPrivate::MimeTypeSettingsPrivate() : m_model(new MimeTypeSettingsModel(this)) @@ -291,25 +318,25 @@ void MimeTypeSettingsPrivate::configureUi(QWidget *w) updateMagicHeaderButtons(); } -bool MimeTypeSettingsPrivate::checkSelectedMimeType() const -{ - const QModelIndex &modelIndex = m_ui.mimeTypesTreeView->currentIndex(); - if (!modelIndex.isValid()) { - QMessageBox::critical(0, tr("Error"), tr("No MIME type selected.")); - return false; - } - return true; -} +//bool MimeTypeSettingsPrivate::checkSelectedMimeType() const +//{ +// const QModelIndex &modelIndex = m_ui.mimeTypesTreeView->currentIndex(); +// if (!modelIndex.isValid()) { +// QMessageBox::critical(0, tr("Error"), tr("No MIME type selected.")); +// return false; +// } +// return true; +//} -bool MimeTypeSettingsPrivate::checkSelectedMagicHeader() const -{ - const QModelIndex &modelIndex = m_ui.magicHeadersTreeWidget->selectionModel()->currentIndex(); - if (!modelIndex.isValid()) { - QMessageBox::critical(0, tr("Error"), tr("No magic header selected.")); - return false; - } - return true; -} +//bool MimeTypeSettingsPrivate::checkSelectedMagicHeader() const +//{ +// const QModelIndex &modelIndex = m_ui.magicHeadersTreeWidget->selectionModel()->currentIndex(); +// if (!modelIndex.isValid()) { +// QMessageBox::critical(0, tr("Error"), tr("No magic header selected.")); +// return false; +// } +// return true; +//} void MimeTypeSettingsPrivate::markMimeForPatternSync(int index) { @@ -537,6 +564,82 @@ void MimeTypeSettingsPrivate::setFilterPattern(const QString &pattern) m_filterModel->setFilterWildcard(pattern); } +static QPair rangeFromString(const QString &offset) +{ + const QStringList list = offset.split(QLatin1Char(':')); + QPair range; + QTC_ASSERT(list.size() > 0, return range); + range.first = list.at(0).toInt(); + if (list.size() > 1) + range.second = list.at(1).toInt(); + else + range.second = range.first; + return range; +} + +QHash MimeTypeSettingsPrivate::readUserModifiedMimeTypes() +{ + static QString modifiedMimeTypesPath = ICore::userResourcePath() + + QLatin1String(kModifiedMimeTypesFile); + QHash userMimeTypes; + QFile file(modifiedMimeTypesPath); + if (file.open(QFile::ReadOnly)) { + UserMimeType mt; + QXmlStreamReader reader(&file); + QXmlStreamAttributes atts; + while (!reader.atEnd()) { + switch (reader.readNext()) { + case QXmlStreamReader::StartElement: + atts = reader.attributes(); + if (reader.name() == QLatin1String(mimeTypeTagC)) { + mt.name = atts.value(QLatin1String(mimeTypeAttributeC)).toString(); + mt.globPatterns = atts.value(QLatin1String(patternAttributeC)).toString() + .split(QLatin1Char(';')); + } else if (reader.name() == QLatin1String(matchTagC)) { + QByteArray value = atts.value(QLatin1String(matchValueAttributeC)).toUtf8(); + QByteArray typeName = atts.value(QLatin1String(matchTypeAttributeC)).toUtf8(); + const QString rangeString = atts.value(QLatin1String(matchOffsetAttributeC)).toString(); + QPair range = rangeFromString(rangeString); + int priority = atts.value(QLatin1String(priorityAttributeC)).toString().toInt(); + Utils::Internal::MimeMagicRule rule(Utils::Internal::MimeMagicRule::type(typeName), + value, range.first, range.second); + mt.rules[priority].append(rule); + } + break; + case QXmlStreamReader::EndElement: + if (reader.name() == QLatin1String(mimeTypeTagC)) { + userMimeTypes.insert(mt.name, mt); + mt.name.clear(); + mt.globPatterns.clear(); + mt.rules.clear(); + } + break; + default: + break; + } + } + if (reader.hasError()) + qWarning() << modifiedMimeTypesPath << reader.errorString() << reader.lineNumber() + << reader.columnNumber(); + file.close(); + } + return userMimeTypes; +} + +void MimeTypeSettingsPrivate::applyUserModifiedMimeTypes(const QHash &mimeTypes) +{ + // register in mime data base, and remember for later + Utils::MimeDatabase mdb; + for (auto it = mimeTypes.constBegin(); it != mimeTypes.constEnd(); ++it) { + Utils::MimeType mt = mdb.mimeTypeForName(it.key()); + if (!mt.isValid()) // loaded from settings + continue; + m_userModifiedMimeTypes.insert(it.key(), it.value()); + Utils::MimeDatabase::setGlobPatternsForMimeType(mt, it.value().globPatterns); + Utils::MimeDatabase::setMagicRulesForMimeType(mt, it.value().rules); + } +} + // MimeTypeSettingsPage MimeTypeSettings::MimeTypeSettings(QObject *parent) : IOptionsPage(parent) @@ -600,6 +703,12 @@ void MimeTypeSettings::finish() delete d->m_widget; } +void MimeTypeSettings::restoreSettings() +{ + QHash mimetypes = MimeTypeSettingsPrivate::readUserModifiedMimeTypes(); + MimeTypeSettingsPrivate::applyUserModifiedMimeTypes(mimetypes); +} + } // Internal } // Core diff --git a/src/plugins/coreplugin/mimetypesettings.h b/src/plugins/coreplugin/mimetypesettings.h index 4ac778b0f95..466e6de6f63 100644 --- a/src/plugins/coreplugin/mimetypesettings.h +++ b/src/plugins/coreplugin/mimetypesettings.h @@ -50,6 +50,7 @@ public: virtual void apply(); virtual void finish(); + static void restoreSettings(); private: MimeTypeSettingsPrivate *d; };