From 22c9b652b0cc7fe4aafd68a620c7bada5ff0a5d9 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Tue, 23 Nov 2010 11:31:57 +0100 Subject: Snippets: Move code from the manager to the collection. Reloading and synchronizing are now directly accessible from the collection interface. --- .../texteditor/snippets/snippetscollection.cpp | 133 ++++++++++++++++++++- 1 file changed, 132 insertions(+), 1 deletion(-) (limited to 'src/plugins/texteditor/snippets/snippetscollection.cpp') diff --git a/src/plugins/texteditor/snippets/snippetscollection.cpp b/src/plugins/texteditor/snippets/snippetscollection.cpp index a2f7320cf0..1aad27644c 100644 --- a/src/plugins/texteditor/snippets/snippetscollection.cpp +++ b/src/plugins/texteditor/snippets/snippetscollection.cpp @@ -28,7 +28,18 @@ **************************************************************************/ #include "snippetscollection.h" +#include "reuse.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -65,6 +76,15 @@ RemovedSnippetPred removedSnippetPred; } // Anonymous +const QLatin1String SnippetsCollection::kSnippet("snippet"); +const QLatin1String SnippetsCollection::kSnippets("snippets"); +const QLatin1String SnippetsCollection::kTrigger("trigger"); +const QLatin1String SnippetsCollection::kId("id"); +const QLatin1String SnippetsCollection::kComplement("complement"); +const QLatin1String SnippetsCollection::kGroup("group"); +const QLatin1String SnippetsCollection::kRemoved("removed"); +const QLatin1String SnippetsCollection::kModified("modified"); + // Hint SnippetsCollection::Hint::Hint(int index) : m_index(index) {} @@ -80,7 +100,10 @@ int SnippetsCollection::Hint::index() const // SnippetsCollection SnippetsCollection::SnippetsCollection() : m_snippets(Snippet::GroupSize), - m_activeSnippetsEnd(Snippet::GroupSize) + m_activeSnippetsEnd(Snippet::GroupSize), + m_builtInSnippetsPath(QLatin1String(":/texteditor/snippets/")), + m_userSnippetsPath(Core::ICore::instance()->userResourcePath() + QLatin1String("/snippets/")), + m_snippetsFileName(QLatin1String("snippets.xml")) { for (Snippet::Group group = Snippet::Cpp; group < Snippet::GroupSize; ++group) m_activeSnippetsEnd[group] = m_snippets[group].end(); @@ -210,3 +233,111 @@ void SnippetsCollection::updateActiveSnippetsEnd(Snippet::Group group) m_snippets[group].end(), removedSnippetPred); } + +void SnippetsCollection::reload() +{ + clear(); + + QHash activeBuiltInSnippets; + const QList &builtInSnippets = readXML(m_builtInSnippetsPath + m_snippetsFileName); + foreach (const Snippet &snippet, builtInSnippets) + activeBuiltInSnippets.insert(snippet.id(), snippet); + + const QList &userSnippets = readXML(m_userSnippetsPath + m_snippetsFileName); + foreach (const Snippet &snippet, userSnippets) { + if (snippet.isBuiltIn()) + // This user snippet overrides the corresponding built-in snippet. + activeBuiltInSnippets.remove(snippet.id()); + insertSnippet(snippet, snippet.group()); + } + + foreach (const Snippet &snippet, activeBuiltInSnippets) + insertSnippet(snippet, snippet.group()); +} + +void SnippetsCollection::synchronize() +{ + if (QFile::exists(m_userSnippetsPath) || QDir().mkpath(m_userSnippetsPath)) { + QFile file(m_userSnippetsPath + m_snippetsFileName); + if (file.open(QFile::WriteOnly | QFile::Truncate)) { + QXmlStreamWriter writer(&file); + writer.setAutoFormatting(true); + writer.writeStartDocument(); + writer.writeStartElement(kSnippets); + for (Snippet::Group group = Snippet::Cpp; group < Snippet::GroupSize; ++group) { + const int size = totalSnippets(group); + for (int i = 0; i < size; ++i) { + const Snippet ¤t = snippet(i, group); + if (!current.isBuiltIn() || + (current.isBuiltIn() && (current.isRemoved() || current.isModified()))) { + writeSnippetXML(current, &writer); + } + } + } + writer.writeEndElement(); + writer.writeEndDocument(); + file.close(); + } + } + + reload(); +} + +void SnippetsCollection::writeSnippetXML(const Snippet &snippet, QXmlStreamWriter *writer) +{ + writer->writeStartElement(kSnippet); + writer->writeAttribute(kGroup, fromSnippetGroup(snippet.group())); + writer->writeAttribute(kTrigger, snippet.trigger()); + writer->writeAttribute(kId, snippet.id()); + writer->writeAttribute(kComplement, snippet.complement()); + writer->writeAttribute(kRemoved, fromBool(snippet.isRemoved())); + writer->writeAttribute(kModified, fromBool(snippet.isModified())); + writer->writeCharacters(snippet.content()); + writer->writeEndElement(); +} + +QList SnippetsCollection::readXML(const QString &fileName) +{ + QList snippets; + QFile file(fileName); + if (file.exists() && file.open(QIODevice::ReadOnly)) { + QXmlStreamReader xml(&file); + if (xml.readNextStartElement()) { + if (xml.name() == kSnippets) { + while (xml.readNextStartElement()) { + if (xml.name() == kSnippet) { + const QXmlStreamAttributes &atts = xml.attributes(); + + Snippet snippet(atts.value(kId).toString()); + snippet.setTrigger(atts.value(kTrigger).toString()); + snippet.setComplement(atts.value(kComplement).toString()); + snippet.setGroup(toSnippetGroup(atts.value(kGroup).toString())); + snippet.setIsRemoved(toBool(atts.value(kRemoved).toString())); + snippet.setIsModified(toBool(atts.value(kModified).toString())); + + QString content; + while (!xml.atEnd()) { + xml.readNext(); + if (xml.isCharacters()) { + content += xml.text(); + } else if (xml.isEndElement()) { + snippet.setContent(content); + snippets.append(snippet); + break; + } + } + } else { + xml.skipCurrentElement(); + } + } + } else { + xml.skipCurrentElement(); + } + } + if (xml.hasError()) + qWarning() << fileName << xml.errorString() << xml.lineNumber() << xml.columnNumber(); + file.close(); + } + + return snippets; +} -- cgit v1.2.1