diff --git a/src/plugins/coreplugin/actionmanager/commandsfile.cpp b/src/plugins/coreplugin/actionmanager/commandsfile.cpp index b91da010262a70bb44589ef365e00cf74b08481b..9d3f50f2ca1f37a73fa7c90f01a64aaf35f1b9bd 100644 --- a/src/plugins/coreplugin/actionmanager/commandsfile.cpp +++ b/src/plugins/coreplugin/actionmanager/commandsfile.cpp @@ -36,12 +36,39 @@ #include "command_p.h" #include <coreplugin/uniqueidmanager.h> +#include <coreplugin/coreconstants.h> + +#include <utils/qtcassert.h> #include <QtCore/QFile> -#include <QtXml/QDomDocument> +#include <QtCore/QXmlStreamAttributes> +#include <QtCore/QXmlStreamWriter> +#include <QtCore/QXmlStreamReader> +#include <QtCore/QDebug> +#include <QtCore/QDateTime> + +namespace Core { +namespace Internal { -using namespace Core; -using namespace Core::Internal; +struct Context // XML parsing context with strings. +{ + Context(); + + const QString mappingElement; + const QString shortCutElement; + const QString idAttribute; + const QString keyElement; + const QString valueAttribute; +}; + +Context::Context() : + mappingElement(QLatin1String("mapping")), + shortCutElement(QLatin1String("shortcut")), + idAttribute(QLatin1String("id")), + keyElement(QLatin1String("key")), + valueAttribute(QLatin1String("value")) +{ +} /*! \class CommandsFile @@ -66,29 +93,36 @@ QMap<QString, QKeySequence> CommandsFile::importCommands() const QMap<QString, QKeySequence> result; QFile file(m_filename); - if (!file.open(QIODevice::ReadOnly)) - return result; - - QDomDocument doc("KeyboardMappingScheme"); - if (!doc.setContent(&file)) - return result; - - QDomElement root = doc.documentElement(); - if (root.nodeName() != QLatin1String("mapping")) + if (!file.open(QIODevice::ReadOnly|QIODevice::Text)) return result; - QDomElement ks = root.firstChildElement(); - for (; !ks.isNull(); ks = ks.nextSiblingElement()) { - if (ks.nodeName() == QLatin1String("shortcut")) { - QString id = ks.attribute(QLatin1String("id")); - QKeySequence shortcutkey; - QDomElement keyelem = ks.firstChildElement("key"); - if (!keyelem.isNull()) - shortcutkey = QKeySequence(keyelem.attribute("value")); - result.insert(id, shortcutkey); - } - } - + Context ctx; + QXmlStreamReader r(&file); + + QString currentId; + + while (!r.atEnd()) { + switch (r.readNext()) { + case QXmlStreamReader::StartElement: { + const QStringRef name = r.name(); + if (name == ctx.shortCutElement) { + currentId = r.attributes().value(ctx.idAttribute).toString(); + } else if (name == ctx.keyElement) { + QTC_ASSERT(!currentId.isEmpty(), return result; ) + const QXmlStreamAttributes attributes = r.attributes(); + if (attributes.hasAttribute(ctx.valueAttribute)) { + const QString keyString = attributes.value(ctx.valueAttribute).toString(); + result.insert(currentId, QKeySequence(keyString)); + } else { + result.insert(currentId, QKeySequence()); + } + currentId.clear(); + } // if key element + } // case QXmlStreamReader::StartElement + default: + break; + } // switch + } // while !atEnd file.close(); return result; } @@ -96,29 +130,43 @@ QMap<QString, QKeySequence> CommandsFile::importCommands() const /*! ... */ + bool CommandsFile::exportCommands(const QList<ShortcutItem *> &items) { - UniqueIDManager *idmanager = UniqueIDManager::instance(); + const UniqueIDManager *idmanager = UniqueIDManager::instance(); QFile file(m_filename); - if (!file.open(QIODevice::WriteOnly)) + if (!file.open(QIODevice::WriteOnly|QIODevice::Text)) return false; - QDomDocument doc("KeyboardMappingScheme"); - QDomElement root = doc.createElement("mapping"); - doc.appendChild(root); - + const Context ctx; + QXmlStreamWriter w(&file); + w.setAutoFormatting(true); + w.setAutoFormattingIndent(1); // Historical, used to be QDom. + w.writeStartDocument(); + w.writeDTD(QLatin1String("<!DOCTYPE KeyboardMappingScheme>")); + w.writeComment(QString::fromAscii(" Written by Qt Creator %1, %2. "). + arg(QLatin1String(Core::Constants::IDE_VERSION_LONG), + QDateTime::currentDateTime().toString(Qt::ISODate))); + w.writeStartElement(ctx.mappingElement); foreach (const ShortcutItem *item, items) { - QDomElement ctag = doc.createElement("shortcut"); - ctag.setAttribute(QLatin1String("id"), idmanager->stringForUniqueIdentifier(item->m_cmd->id())); - root.appendChild(ctag); - - QDomElement ktag = doc.createElement("key"); - ktag.setAttribute(QLatin1String("value"), item->m_key.toString()); - ctag.appendChild(ktag); + const QString id = idmanager->stringForUniqueIdentifier(item->m_cmd->id()); + if (item->m_key.isEmpty()) { + w.writeEmptyElement(ctx.shortCutElement); + w.writeAttribute(ctx.idAttribute, id); + } else { + w.writeStartElement(ctx.shortCutElement); + w.writeAttribute(ctx.idAttribute, id); + w.writeEmptyElement(ctx.keyElement); + w.writeAttribute(ctx.valueAttribute, item->m_key.toString()); + w.writeEndElement(); // Shortcut + } } - - file.write(doc.toByteArray()); + w.writeEndElement(); + w.writeEndDocument(); file.close(); return true; } + +} // namespace Internal +} // namespace Core diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index 63a4a52aba73d170004ecdd6b3c599af5429f3f7..a3b0f4928c8eca7f0c28d09f5d9f335480e95f32 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -1,8 +1,7 @@ TEMPLATE = lib TARGET = Core DEFINES += CORE_LIBRARY -QT += xml \ - network \ +QT += network \ script \ sql CONFIG += help diff --git a/src/plugins/coreplugin/uniqueidmanager.cpp b/src/plugins/coreplugin/uniqueidmanager.cpp index 556df4c71b3ceaecbb5cc715d82914ded2c34950..87e5618b6a85135acad4943e9d24d5534e83b72e 100644 --- a/src/plugins/coreplugin/uniqueidmanager.cpp +++ b/src/plugins/coreplugin/uniqueidmanager.cpp @@ -63,7 +63,7 @@ int UniqueIDManager::uniqueIdentifier(const Id &id) return uid; } -QString UniqueIDManager::stringForUniqueIdentifier(int uid) +QString UniqueIDManager::stringForUniqueIdentifier(int uid) const { return m_uniqueIdentifiers.key(uid); } diff --git a/src/plugins/coreplugin/uniqueidmanager.h b/src/plugins/coreplugin/uniqueidmanager.h index 8c7287d695307e4c68a29f55ce963c333f7bde49..bc4d2982609fcb7f147d4c7c9cfb67843509e0c4 100644 --- a/src/plugins/coreplugin/uniqueidmanager.h +++ b/src/plugins/coreplugin/uniqueidmanager.h @@ -81,7 +81,7 @@ public: bool hasUniqueIdentifier(const Id &id) const; int uniqueIdentifier(const Id &id); - QString stringForUniqueIdentifier(int uid); + QString stringForUniqueIdentifier(int uid) const; private: QHash<Id, int> m_uniqueIdentifiers; diff --git a/src/plugins/projectexplorer/persistentsettings.cpp b/src/plugins/projectexplorer/persistentsettings.cpp index 8f9c412bfd0ec1c4a63b73c5a677bd2866a0441a..63b15f8e811aa925f99d17e29f1702946be0a334 100644 --- a/src/plugins/projectexplorer/persistentsettings.cpp +++ b/src/plugins/projectexplorer/persistentsettings.cpp @@ -33,184 +33,375 @@ #include "persistentsettings.h" +#include <coreplugin/coreconstants.h> + #include <QtCore/QDebug> #include <QtCore/QFile> #include <QtCore/QVariant> -#include <QtXml/QDomDocument> -#include <QtXml/QDomCDATASection> -#include <QtXml/QDomElement> +#include <QtCore/QStack> +#include <QtCore/QXmlStreamAttributes> +#include <QtCore/QXmlStreamReader> +#include <QtCore/QXmlStreamWriter> +#include <QtCore/QDateTime> + +#include <utils/qtcassert.h> + +/*! + \class ProjectExplorer::PersistentSettingsReader + + \brief Reads a QVariantMap of arbitrary, nested data structures from a XML file. + + Handles all string-serializable simple types and QVariantList and QVariantMap. Example: + \code +<qtcreator> + <data> + <variable>ProjectExplorer.Project.ActiveTarget</variable> + <value type="int">0</value> + </data> + <data> + <variable>ProjectExplorer.Project.EditorSettings</variable> + <valuemap type="QVariantMap"> + <value type="bool" key="EditorConfiguration.AutoIndent">true</value> + </valuemap> + </data> + \endcode + + When parsing the structure, a parse stack of ParseValueStackEntry is used for each + <data> element. ParseValueStackEntry is a variant/union of: + \list + \o simple value + \o map + \o list + \endlist + + When entering a value element ( \c <value> / \c <valuelist> , \c <valuemap> ), entry is pushed + accordingly. When leaving the element, the QVariant-value of the entry is taken off the stack + and added to the stack entry below (added to list or inserted into map). The first element + of the stack is the value of the <data> element. + + \sa ProjectExplorer::PersistentSettingsWriter +*/ + +namespace ProjectExplorer { + +struct Context // Basic context containing element name string constants. +{ + Context(); + + const QString qtCreatorElement; + const QString dataElement; + const QString variableElement; + const QString typeAttribute; + const QString valueElement; + const QString valueListElement; + const QString valueMapElement; + const QString keyAttribute; +}; + +Context::Context() : + qtCreatorElement(QLatin1String("qtcreator")), + dataElement(QLatin1String("data")), + variableElement(QLatin1String("variable")), + typeAttribute(QLatin1String("type")), + valueElement(QLatin1String("value")), + valueListElement(QLatin1String("valuelist")), + valueMapElement(QLatin1String("valuemap")), + keyAttribute(QLatin1String("key")) +{ +} + +struct ParseValueStackEntry +{ + explicit ParseValueStackEntry(QVariant::Type t = QVariant::Invalid, const QString &k = QString()) : type(t), key(k) {} + explicit ParseValueStackEntry(const QVariant &aSimpleValue, const QString &k); + QVariant value() const; + void addChild(const QString &key, const QVariant &v); -using namespace ProjectExplorer; + QVariant::Type type; + QString key; + QVariant simpleValue; + QVariantList listValue; + QVariantMap mapValue; +}; -PersistentSettingsReader::PersistentSettingsReader() +ParseValueStackEntry::ParseValueStackEntry(const QVariant &aSimpleValue, const QString &k) : + type(aSimpleValue.type()), key(k), simpleValue(aSimpleValue) { - + QTC_ASSERT(simpleValue.isValid(), return ; ) } -QVariant PersistentSettingsReader::restoreValue(const QString & variable) const +QVariant ParseValueStackEntry::value() const { - if (m_valueMap.contains(variable)) - return m_valueMap.value(variable); - return QVariant(); + switch (type) { + case QVariant::Invalid: + return QVariant(); + case QVariant::Map: + return QVariant(mapValue); + case QVariant::List: + return QVariant(listValue); + default: + break; + } + return simpleValue; } -QVariantMap PersistentSettingsReader::restoreValues() const +void ParseValueStackEntry::addChild(const QString &key, const QVariant &v) { - return m_valueMap; + switch (type) { + case QVariant::Map: + mapValue.insert(key, v); + break; + case QVariant::List: + listValue.push_back(v); + break; + default: + qWarning() << "ParseValueStackEntry::Internal error adding " << key << v << " to " + << QVariant::typeToName(type) << value(); + break; + } } -bool PersistentSettingsReader::load(const QString & fileName) +class ParseContext : public Context { - m_valueMap.clear(); +public: + QVariantMap parse(QFile &file); - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly)) - return false; +private: + enum Element { QtCreatorElement, DataElement, VariableElement, + SimpleValueElement, ListValueElement, MapValueElement, UnknownElement }; - QDomDocument doc; - if (!doc.setContent(&file)) - return false; + Element element(const QStringRef &r) const; + static inline bool isValueElement(Element e) + { return e == SimpleValueElement || e == ListValueElement || e == MapValueElement; } + QVariant readSimpleValue(QXmlStreamReader &r, const QXmlStreamAttributes &attributes) const; - QDomElement root = doc.documentElement(); - if (root.nodeName() != QLatin1String("qtcreator")) - return false; + bool handleStartElement(QXmlStreamReader &r); + bool handleEndElement(const QStringRef &name); - QDomElement child = root.firstChildElement(); - for (; !child.isNull(); child = child.nextSiblingElement()) { - if (child.nodeName() == QLatin1String("data")) - readValues(child); - } + QStack<ParseValueStackEntry> m_valueStack; + QVariantMap m_result; + QString m_currentVariableName; +}; - file.close(); - return true; +QVariantMap ParseContext::parse(QFile &file) +{ + QXmlStreamReader r(&file); + + m_result.clear(); + m_currentVariableName.clear(); + + while (!r.atEnd()) { + switch (r.readNext()) { + case QXmlStreamReader::StartElement: + if (handleStartElement(r)) + return m_result; + break; + case QXmlStreamReader::EndElement: + if (handleEndElement(r.name())) + return m_result; + break; + case QXmlStreamReader::Invalid: + qWarning("Error reading %s:%d: %s", qPrintable(file.fileName()), + int(r.lineNumber()), qPrintable(r.errorString())); + return QVariantMap(); + break; + default: + break; + } // switch token + } // while (!r.atEnd()) + return m_result; } -QVariant PersistentSettingsReader::readValue(const QDomElement &valElement) const +bool ParseContext::handleStartElement(QXmlStreamReader &r) { - QString name = valElement.nodeName(); - QString type = valElement.attribute(QLatin1String("type")); - QVariant v; + const QStringRef name = r.name(); + const Element e = element(name); + if (e == VariableElement) { + m_currentVariableName = r.readElementText(); + return false; + } + if (!ParseContext::isValueElement(e)) + return false; - if (name == QLatin1String("value")) { - if(type == QLatin1String("QChar")) { - //Workaround: QTBUG-12345 - v.setValue(QChar(valElement.text().at(0))); - } else { - v.setValue(valElement.text()); - v.convert(QVariant::nameToType(type.toLatin1().data())); - } - } else if (name == QLatin1String("valuelist")) { - QDomElement child = valElement.firstChildElement(); - QList<QVariant> valList; - for (; !child.isNull(); child = child.nextSiblingElement()) { - valList << readValue(child); - } - v.setValue(valList); - } else if (name == QLatin1String("valuemap")) { - QDomElement child = valElement.firstChildElement(); - QMap<QString, QVariant> valMap; - for (; !child.isNull(); child = child.nextSiblingElement()) { - QString key = child.attribute(QLatin1String("key")); - valMap.insert(key, readValue(child)); - } - v.setValue(valMap); + const QXmlStreamAttributes attributes = r.attributes(); + const QString key = attributes.hasAttribute(keyAttribute) ? + attributes.value(keyAttribute).toString() : QString(); + switch (e) { + case SimpleValueElement: + // This reads away the end element, so, handle end element right here. + m_valueStack.push_back(ParseValueStackEntry(readSimpleValue(r, attributes), key)); + return handleEndElement(name); + case ListValueElement: + m_valueStack.push_back(ParseValueStackEntry(QVariant::List, key)); + break; + case MapValueElement: + m_valueStack.push_back(ParseValueStackEntry(QVariant::Map, key)); + break; + default: + break; } + return false; +} - return v; +bool ParseContext::handleEndElement(const QStringRef &name) +{ + const Element e = element(name); + if (ParseContext::isValueElement(e)) { + QTC_ASSERT(!m_valueStack.isEmpty(), return true; ) + const ParseValueStackEntry top = m_valueStack.pop(); + if (m_valueStack.isEmpty()) { // Last element? -> Done with that variable. + QTC_ASSERT(!m_currentVariableName.isEmpty(), return true; ) + m_result.insert(m_currentVariableName, top.value()); + m_currentVariableName.clear(); + return false; + } + m_valueStack.top().addChild(top.key, top.value()); + } + return e == QtCreatorElement; } -void PersistentSettingsReader::readValues(const QDomElement &data) +ParseContext::Element ParseContext::element(const QStringRef &r) const { - QString variable; - QVariant v; + if (r == valueElement) + return SimpleValueElement; + if (r == valueListElement) + return ListValueElement; + if (r == valueMapElement) + return MapValueElement; + if (r == qtCreatorElement) + return QtCreatorElement; + if (r == dataElement) + return DataElement; + if (r == variableElement) + return VariableElement; + return UnknownElement; +} - QDomElement child = data.firstChildElement(); - for (; !child.isNull(); child = child.nextSiblingElement()) { - if (child.nodeName() == QLatin1String("variable")) { - variable = child.text(); - } else { - v = readValue(child); - } +QVariant ParseContext::readSimpleValue(QXmlStreamReader &r, const QXmlStreamAttributes &attributes) const +{ + // Simple value + const QString type = attributes.value(typeAttribute).toString(); + const QString text = r.readElementText(); + if (type == QLatin1String("QChar")) { // Workaround: QTBUG-12345 + QTC_ASSERT(text.size() == 1, return QVariant(); ) + return QVariant(QChar(text.at(0))); } + QVariant value; + value.setValue(text); + value.convert(QVariant::nameToType(type.toLatin1().data())); + return value; +} - m_valueMap.insert(variable, v); +// =================================== PersistentSettingsReader + +PersistentSettingsReader::PersistentSettingsReader() +{ } -/// -/// PersistentSettingsWriter -/// +QVariant PersistentSettingsReader::restoreValue(const QString & variable) const +{ + if (m_valueMap.contains(variable)) + return m_valueMap.value(variable); + return QVariant(); +} -PersistentSettingsWriter::PersistentSettingsWriter() +QVariantMap PersistentSettingsReader::restoreValues() const { + return m_valueMap; +} +bool PersistentSettingsReader::load(const QString & fileName) +{ + m_valueMap.clear(); + + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly|QIODevice::Text)) + return false; + ParseContext ctx; + m_valueMap = ctx.parse(file); + file.close(); + return true; } -void PersistentSettingsWriter::writeValue(QDomElement &ps, const QVariant &variant) +/*! + \class ProjectExplorer::PersistentSettingsWriter + + \brief Serializes a QVariantMap of arbitrary, nested data structures to a XML file. + \sa ProjectExplorer::PersistentSettingsReader +*/ + +PersistentSettingsWriter::PersistentSettingsWriter() { - if (variant.type() == QVariant::StringList || variant.type() == QVariant::List) { - QDomElement values = ps.ownerDocument().createElement("valuelist"); - values.setAttribute("type", QVariant::typeToName(QVariant::List)); - QList<QVariant> varList = variant.toList(); - foreach (const QVariant &var, varList) { - writeValue(values, var); - } - ps.appendChild(values); - } else if (variant.type() == QVariant::Map) { - QDomElement values = ps.ownerDocument().createElement("valuemap"); - values.setAttribute("type", QVariant::typeToName(QVariant::Map)); - - QMap<QString, QVariant> varMap = variant.toMap(); - QMap<QString, QVariant>::const_iterator i = varMap.constBegin(); - while (i != varMap.constEnd()) { - writeValue(values, i.value()); - values.lastChild().toElement(). - setAttribute(QLatin1String("key"), i.key()); - ++i; - } +} - ps.appendChild(values); - } else { - QDomElement value = ps.ownerDocument().createElement("value"); - ps.appendChild(value); - QDomText valueText = ps.ownerDocument().createTextNode(variant.toString()); - value.appendChild(valueText); - value.setAttribute("type", variant.typeName()); - ps.appendChild(value); +static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx, + const QVariant &variant, const QString &key = QString()) +{ + switch (variant.type()) { + case QVariant::StringList: + case QVariant::List: + w.writeStartElement(ctx.valueListElement); + w.writeAttribute(ctx.typeAttribute, QVariant::typeToName(QVariant::List)); + if (!key.isEmpty()) + w.writeAttribute(ctx.keyAttribute, key); + foreach (const QVariant &var, variant.toList()) + writeVariantValue(w, ctx, var); + w.writeEndElement(); + break; + case QVariant::Map: { + w.writeStartElement(ctx.valueMapElement); + w.writeAttribute(ctx.typeAttribute, QVariant::typeToName(QVariant::Map)); + if (!key.isEmpty()) + w.writeAttribute(ctx.keyAttribute, key); + const QVariantMap varMap = variant.toMap(); + const QVariantMap::const_iterator cend = varMap.constEnd(); + for (QVariantMap::const_iterator i = varMap.constBegin(); i != cend; ++i) + writeVariantValue(w, ctx, i.value(), i.key()); + w.writeEndElement(); + } + break; + default: + w.writeStartElement(ctx.valueElement); + w.writeAttribute(ctx.typeAttribute, QLatin1String(variant.typeName())); + if (!key.isEmpty()) + w.writeAttribute(ctx.keyAttribute, key); + w.writeCharacters(variant.toString()); + w.writeEndElement(); + break; } } void PersistentSettingsWriter::saveValue(const QString & variable, const QVariant &value) { - m_valueMap[variable] = value; + m_valueMap.insert(variable, value); } -bool PersistentSettingsWriter::save(const QString & fileName, const QString & docType) +bool PersistentSettingsWriter::save(const QString & fileName, const QString &docType) const { QFile file(fileName); - if (!file.open(QIODevice::WriteOnly)) + if (!file.open(QIODevice::WriteOnly|QIODevice::Text)) return false; - QDomDocument doc(docType); - - QDomElement root = doc.createElement("qtcreator"); - doc.appendChild(root); - - QMap<QString, QVariant>::const_iterator i = m_valueMap.constBegin(); - while (i != m_valueMap.constEnd()) { - QDomElement ps = doc.createElement("data"); - root.appendChild(ps); - - QDomElement variable = doc.createElement("variable"); - ps.appendChild(variable); - QDomText variableText = doc.createTextNode(i.key()); - variable.appendChild(variableText); - - writeValue(ps, i.value()); - ++i; + const Context ctx; + QXmlStreamWriter w(&file); + w.setAutoFormatting(true); + w.setAutoFormattingIndent(1); // Historical, used to be QDom. + w.writeStartDocument(); + w.writeDTD(QLatin1String("<!DOCTYPE ") + docType + QLatin1Char('>')); + w.writeComment(QString::fromAscii(" Written by Qt Creator %1, %2. "). + arg(QLatin1String(Core::Constants::IDE_VERSION_LONG), + QDateTime::currentDateTime().toString(Qt::ISODate))); + w.writeStartElement(ctx.qtCreatorElement); + const QVariantMap::const_iterator cend = m_valueMap.constEnd(); + for (QVariantMap::const_iterator it = m_valueMap.constBegin(); it != cend; ++it) { + w.writeStartElement(ctx.dataElement); + w.writeTextElement(ctx.variableElement, it.key()); + writeVariantValue(w, ctx, it.value()); + w.writeEndElement(); } - - file.write(doc.toByteArray()); + w.writeEndDocument(); file.close(); return true; } +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/persistentsettings.h b/src/plugins/projectexplorer/persistentsettings.h index 605cb9cfbf1777cc8dacbfd7aa77e90e7f9b150c..747778b1ce22a49c40dc6e668516c7c846b55035 100644 --- a/src/plugins/projectexplorer/persistentsettings.h +++ b/src/plugins/projectexplorer/persistentsettings.h @@ -39,10 +39,6 @@ #include <QtCore/QMap> #include <QtCore/QVariant> -QT_BEGIN_NAMESPACE -class QDomElement; -QT_END_NAMESPACE - namespace ProjectExplorer { class PROJECTEXPLORER_EXPORT PersistentSettingsReader @@ -54,8 +50,6 @@ public: bool load(const QString & fileName); private: - QVariant readValue(const QDomElement &valElement) const; - void readValues(const QDomElement &data); QMap<QString, QVariant> m_valueMap; }; @@ -64,10 +58,9 @@ class PROJECTEXPLORER_EXPORT PersistentSettingsWriter public: PersistentSettingsWriter(); void saveValue(const QString & variable, const QVariant &value); - bool save(const QString & fileName, const QString & docType); + bool save(const QString & fileName, const QString & docType) const; private: - void writeValue(QDomElement &ps, const QVariant &value); QMap<QString, QVariant> m_valueMap; }; diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index e008145cb9003b53b2f5ce4d6b3654204abce46a..6adc7b80e8519ee037912e3f9597983213d68391 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -1,7 +1,6 @@ TEMPLATE = lib TARGET = ProjectExplorer -QT += xml \ - script \ +QT += script \ network include(../../qtcreatorplugin.pri) include(projectexplorer_dependencies.pri)