OSDN Git Service

Snippets: Make it flexible for adding builtin snippets
authorLeandro Melo <leandro.melo@nokia.com>
Fri, 3 Dec 2010 14:55:51 +0000 (15:55 +0100)
committerLeandro Melo <leandro.melo@nokia.com>
Wed, 8 Dec 2010 16:22:14 +0000 (17:22 +0100)
Instead of in one XML embedded as a resource, now builtin
snippets can be specified on any XML distributed under share.

share/qtcreator/snippets/cpp.xml [new file with mode: 0644]
share/qtcreator/snippets/qml.xml [new file with mode: 0644]
share/qtcreator/snippets/text.xml [new file with mode: 0644]
share/qtcreator/static.pro
src/plugins/texteditor/snippets/snippets.xml [deleted file]
src/plugins/texteditor/snippets/snippetscollection.cpp
src/plugins/texteditor/snippets/snippetscollection.h
src/plugins/texteditor/texteditor.qrc

diff --git a/share/qtcreator/snippets/cpp.xml b/share/qtcreator/snippets/cpp.xml
new file mode 100644 (file)
index 0000000..8c871d1
--- /dev/null
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<snippets>
+<snippet group="C++" trigger="class" id="cpp_genericclass">class $name$
+{
+public:
+    $name$() {}
+};</snippet>
+<snippet group="C++" trigger="class" id="cpp_qobjectclass" complement="derived from QObject">class $name$ : public QObject
+{
+    Q_OBJECT
+public:
+    $name$() {}
+    virtual ~$name$() {}
+};</snippet>
+<snippet group="C++" trigger="class" id="cpp_qwidgetclass" complement="derived from QWidget">class $name$ : public QWidget
+{
+    Q_OBJECT
+public:
+    $name$() {}
+    virtual ~$name$() {}
+};</snippet>
+<snippet group="C++" trigger="class" id="cpp_classtemplate" complement="template">template &lt;typename $T$&gt;
+class $name$
+{
+public:
+    $name$() {}
+};</snippet>
+<snippet group="C++" trigger="do" id="cpp_do">do {
+
+} while ($condition$);</snippet>
+<snippet group="C++" trigger="else" id="cpp_else" >else {
+
+}</snippet>
+<snippet group="C++" trigger="else" id="cpp_elsewithif" complement="with if">else if ($condition$) {
+
+}</snippet>
+<snippet group="C++" trigger="for" id="cpp_for">for (int $var$ = 0; $var$ &lt; $total$; ++$var$) {
+
+}</snippet>
+<snippet group="C++" trigger="foreach" id="cpp_foreach">foreach ($var$, $container$) {
+
+}</snippet>
+<snippet group="C++" trigger="if" id="cpp_if">if ($condition$) {
+
+}</snippet>
+<snippet group="C++" trigger="if" id="cpp_ifandelse" complement="and else">if ($condition$) {
+
+} else {
+
+}</snippet>
+<snippet group="C++" trigger="namespace" id="cpp_namespace">namespace $name$ {
+
+}</snippet>
+<snippet group="C++" trigger="try" id="cpp_trycatch" complement="and catch">try {
+
+} catch (...) {
+
+}</snippet>
+<snippet group="C++" trigger="using" id="cpp_usingnamespace" complement="namespace">using namespace $name$;</snippet>
+<snippet group="C++" trigger="while" id="cpp_while">while ($condition$) {
+
+}</snippet>
+</snippets>
diff --git a/share/qtcreator/snippets/qml.xml b/share/qtcreator/snippets/qml.xml
new file mode 100644 (file)
index 0000000..0aa17af
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<snippets>
+<snippet group="QML" trigger="property" id="qml_property">property $type$ $name$: $value$</snippet>
+<snippet group="QML" trigger="Item" id="qml_item">Item {
+    id: $name$
+}</snippet>
+<snippet group="QML" trigger="BorderImage" id="qml_borderimage">BorderImage {
+    id: $name$
+    source: "$file$"
+    width: $100$; height: $100$
+    border.left: $5$; border.top: $5$
+    border.right: $5$; border.bottom: $5$
+}</snippet>
+<snippet  group="QML" trigger="Image" id="qml_image">Image {
+    id: $name$
+    source: "$file$"
+}</snippet>
+<snippet group="QML" trigger="Text" id="qml_text">Text {
+    id: $name$
+    text: "$text$"
+}</snippet>
+<snippet group="QML" trigger="states" id="qml_states">states: [
+    State {
+        name: "$name$"
+        PropertyChanges {
+            target: $name$
+            $$
+        }
+    }
+]</snippet>
+<snippet group="QML" trigger="State" id="qml_state">State {
+    name: "$name$"
+    PropertyChanges {
+        target: $name$
+        $$
+    }
+}</snippet>
+<snippet group="QML" trigger="transitions" id="qml_transitions">transitions: [
+    Transition {
+        from: "$name$"
+        to: "$name$"
+        $$
+     }
+]</snippet>
+<snippet group="QML" trigger="Transition" id="qml_transition">Transition {
+    from: "$name$"
+    to: "$name$"
+    $$
+}</snippet>
+<snippet group="QML" trigger="PropertyChanges" id="qml_propertychanges">PropertyChanges {
+    target: $name$
+    $$
+}</snippet>
+<snippet group="QML" trigger="NumberAnimation" id="qml_numberanimationwithtargets" complement="with targets">NumberAnimation { targets: [$name$]; properties: "$name$"; duration: $200$ }</snippet>
+<snippet group="QML" trigger="NumberAnimation" id="qml_numberanimationwithtarget" complement="with target">NumberAnimation { target: $name$; property: "$name$"; to: $value$; duration: $200$ }</snippet>
+<snippet group="QML" trigger="PropertyAction" id="qml_propertyactionwithtargets" complement="with targets">PropertyAction { targets: [$name$]; properties: "$name$" }</snippet>
+<snippet group="QML" trigger="PropertyAction" id="qml_propertyactionwithtarget" complement="with target">PropertyAction { target: $name$; property: "$name$"; value: $value$ }</snippet>
+<snippet group="QML" trigger="PauseAnimation" id="qml_pauseanimation">PauseAnimation { duration: $200$ }</snippet>
+<snippet group="QML" trigger="ColorAnimation" id="qml_coloranimation">ColorAnimation { from: $"white"$; to: $"black"$; duration: $200$ }</snippet>
+</snippets>
diff --git a/share/qtcreator/snippets/text.xml b/share/qtcreator/snippets/text.xml
new file mode 100644 (file)
index 0000000..a1e3cf4
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<snippets>
+<snippet group="Text" trigger="global" id="text_global" complement="example">// This is available in all editors.</snippet>
+</snippets>
index 57a3d2f..c060ff3 100644 (file)
@@ -25,6 +25,7 @@ isEmpty(vcproj) {
 
 DATA_DIRS = \
     examplebrowser \
+    snippets \
     templates \
     designer \
     schemes \
diff --git a/src/plugins/texteditor/snippets/snippets.xml b/src/plugins/texteditor/snippets/snippets.xml
deleted file mode 100644 (file)
index 0febaac..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<snippets>
-<snippet group="C++" trigger="class" id="genericclass">class $name$
-{
-public:
-    $name$() {}
-};</snippet>
-<snippet group="C++" trigger="class" id="qobjectclass" complement="derived from QObject">class $name$ : public QObject
-{
-    Q_OBJECT
-public:
-    $name$() {}
-    virtual ~$name$() {}
-};</snippet>
-<snippet group="C++" trigger="class" id="qwidgetclass" complement="derived from QWidget">class $name$ : public QWidget
-{
-    Q_OBJECT
-public:
-    $name$() {}
-    virtual ~$name$() {}
-};</snippet>
-<snippet group="C++" trigger="class" id="classtemplate" complement="template">template &lt;typename $T$&gt;
-class $name$
-{
-public:
-    $name$() {}
-};</snippet>
-<snippet group="C++" trigger="do" id="do">do {
-
-} while ($condition$);</snippet>
-<snippet group="C++" trigger="else" id="else" >else {
-
-}</snippet>
-<snippet group="C++" trigger="else" id="elsewithif" complement="with if">else if ($condition$) {
-
-}</snippet>
-<snippet group="C++" trigger="for" id="for">for (int $var$ = 0; $var$ &lt; $total$; ++$var$) {
-
-}</snippet>
-<snippet group="C++" trigger="foreach" id="foreach">foreach ($var$, $container$) {
-
-}</snippet>
-<snippet group="C++" trigger="if" id="if">if ($condition$) {
-
-}</snippet>
-<snippet group="C++" trigger="if" id="ifandelse" complement="and else">if ($condition$) {
-
-} else {
-
-}</snippet>
-<snippet group="C++" trigger="namespace" id="namespace">namespace $name$ {
-
-}</snippet>
-<snippet group="C++" trigger="try" id="trycatch" complement="and catch">try {
-
-} catch (...) {
-
-}</snippet>
-<snippet group="C++" trigger="using" id="usingnamespace" complement="namespace">using namespace $name$;</snippet>
-<snippet group="C++" trigger="while" id="while">while ($condition$) {
-
-}</snippet>
-<snippet group="QML" trigger="property" id="property">property $type$ $name$: $value$</snippet>
-<snippet group="QML" trigger="Item" id="item">Item {
-    id: $name$
-}</snippet>
-<snippet group="QML" trigger="BorderImage" id="borderimage">BorderImage {
-    id: $name$
-    source: "$file$"
-    width: $100$; height: $100$
-    border.left: $5$; border.top: $5$
-    border.right: $5$; border.bottom: $5$
-}</snippet>
-<snippet  group="QML" trigger="Image" id="image">Image {
-    id: $name$
-    source: "$file$"
-}</snippet>
-<snippet group="QML" trigger="Text" id="text">Text {
-    id: $name$
-    text: "$text$"
-}</snippet>
-<snippet group="QML" trigger="states" id="states">states: [
-    State {
-        name: "$name$"
-        PropertyChanges {
-            target: $name$
-            $$
-        }
-    }
-]</snippet>
-<snippet group="QML" trigger="State" id="state">State {
-    name: "$name$"
-    PropertyChanges {
-        target: $name$
-        $$
-    }
-}</snippet>
-<snippet group="QML" trigger="transitions" id="transitions">transitions: [
-    Transition {
-        from: "$name$"
-        to: "$name$"
-        $$
-     }
-]</snippet>
-<snippet group="QML" trigger="Transition" id="transition">Transition {
-    from: "$name$"
-    to: "$name$"
-    $$
-}</snippet>
-<snippet group="QML" trigger="PropertyChanges" id="propertychanges">PropertyChanges {
-    target: $name$
-    $$
-}</snippet>
-<snippet group="QML" trigger="NumberAnimation" id="numberanimationwithtargets" complement="with targets">NumberAnimation { targets: [$name$]; properties: "$name$"; duration: $200$ }</snippet>
-<snippet group="QML" trigger="NumberAnimation" id="numberanimationwithtarget" complement="with target">NumberAnimation { target: $name$; property: "$name$"; to: $value$; duration: $200$ }</snippet>
-<snippet group="QML" trigger="PropertyAction" id="propertyactionwithtargets" complement="with targets">PropertyAction { targets: [$name$]; properties: "$name$" }</snippet>
-<snippet group="QML" trigger="PropertyAction" id="propertyactionwithtarget" complement="with target">PropertyAction { target: $name$; property: "$name$"; value: $value$ }</snippet>
-<snippet group="QML" trigger="PauseAnimation" id="pauseanimation">PauseAnimation { duration: $200$ }</snippet>
-<snippet group="QML" trigger="ColorAnimation" id="coloranimation">ColorAnimation { from: $"white"$; to: $"black"$; duration: $200$ }</snippet>
-<snippet group="Text" trigger="global" id="global" complement="example">// This is available in all editors.</snippet>
-</snippets>
index dd2531e..72fa608 100644 (file)
@@ -100,10 +100,14 @@ int SnippetsCollection::Hint::index() const
 
 // SnippetsCollection
 SnippetsCollection::SnippetsCollection() :
-    m_builtInSnippetsPath(QLatin1String(":/texteditor/snippets/")),
     m_userSnippetsPath(Core::ICore::instance()->userResourcePath() + QLatin1String("/snippets/")),
-    m_snippetsFileName(QLatin1String("snippets.xml"))
+    m_userSnippetsFile(QLatin1String("snippets.xml"))
 {
+    QDir dir(Core::ICore::instance()->resourcePath() + QLatin1String("/snippets/"));
+    dir.setNameFilters(QStringList(QLatin1String("*.xml")));
+    foreach (const QFileInfo &fi, dir.entryInfoList())
+        m_builtInSnippetsFiles.append(fi.absoluteFilePath());
+
     connect(Core::ICore::instance(), SIGNAL(coreOpened()), this, SLOT(identifyGroups()));
 }
 
@@ -261,10 +265,11 @@ Snippet SnippetsCollection::revertedSnippet(int index, const QString &groupId) c
     const Snippet &candidate = snippet(index, groupId);
     Q_ASSERT(candidate.isBuiltIn());
 
-    const QList<Snippet> &builtIn =
-        readXML(m_builtInSnippetsPath + m_snippetsFileName, candidate.id());
-    if (builtIn.size() == 1)
-        return builtIn.at(0);
+    foreach (const QString &fileName, m_builtInSnippetsFiles) {
+        const QList<Snippet> &builtIn = readXML(fileName, candidate.id());
+        if (builtIn.size() == 1)
+            return builtIn.at(0);
+    }
     return Snippet(groupId);
 }
 
@@ -272,7 +277,7 @@ void SnippetsCollection::reset(const QString &groupId)
 {
     clearSnippets(groupIndex(groupId));
 
-    const QList<Snippet> &builtInSnippets = readXML(m_builtInSnippetsPath + m_snippetsFileName);
+    const QList<Snippet> &builtInSnippets = allBuiltInSnippets();
     foreach (const Snippet &snippet, builtInSnippets)
         if (groupId == snippet.groupId())
             insertSnippet(snippet);
@@ -282,12 +287,12 @@ void SnippetsCollection::reload()
 {
     clearSnippets();
 
-    const QList<Snippet> &builtInSnippets = readXML(m_builtInSnippetsPath + m_snippetsFileName);
+    const QList<Snippet> &builtInSnippets = allBuiltInSnippets();
     QHash<QString, Snippet> activeBuiltInSnippets;
     foreach (const Snippet &snippet, builtInSnippets)
         activeBuiltInSnippets.insert(snippet.id(), snippet);
 
-    const QList<Snippet> &userSnippets = readXML(m_userSnippetsPath + m_snippetsFileName);
+    const QList<Snippet> &userSnippets = readXML(m_userSnippetsPath + m_userSnippetsFile);
     foreach (const Snippet &snippet, userSnippets) {
         if (snippet.isBuiltIn())
             // This user snippet overrides the corresponding built-in snippet.
@@ -302,7 +307,7 @@ void SnippetsCollection::reload()
 void SnippetsCollection::synchronize()
 {
     if (QFile::exists(m_userSnippetsPath) || QDir().mkpath(m_userSnippetsPath)) {
-        QFile file(m_userSnippetsPath + m_snippetsFileName);
+        QFile file(m_userSnippetsPath + m_userSnippetsFile);
         if (file.open(QFile::WriteOnly | QFile::Truncate)) {
             QXmlStreamWriter writer(&file);
             writer.setAutoFormatting(true);
@@ -389,6 +394,14 @@ QList<Snippet> SnippetsCollection::readXML(const QString &fileName, const QStrin
     return snippets;
 }
 
+QList<Snippet> SnippetsCollection::allBuiltInSnippets() const
+{
+    QList<Snippet> builtInSnippets;
+    foreach (const QString &fileName, m_builtInSnippetsFiles)
+        builtInSnippets.append(readXML(fileName));
+    return builtInSnippets;
+}
+
 int SnippetsCollection::groupIndex(const QString &groupId) const
 {
     return m_groupIndexById.value(groupId);
index 0926a33..97a122d 100644 (file)
@@ -33,7 +33,7 @@
 #include "snippet.h"
 
 #include <QtCore/QVector>
-#include <QtCore/QList>
+#include <QtCore/QStringList>
 #include <QtCore/QHash>
 
 QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter)
@@ -101,6 +101,7 @@ private slots:
 
 private:
     int groupIndex(const QString &groupId) const;
+    bool isGroupKnown(const QString &groupId) const;
 
     void clearSnippets();
     void clearSnippets(int groupIndex);
@@ -110,6 +111,8 @@ private:
     QList<Snippet> readXML(const QString &fileName, const QString &snippetId = QString()) const;
     void writeSnippetXML(const Snippet &snippet, QXmlStreamWriter *writer) const;
 
+    QList<Snippet> allBuiltInSnippets() const;
+
     static const QLatin1String kSnippet;
     static const QLatin1String kSnippets;
     static const QLatin1String kTrigger;
@@ -119,14 +122,11 @@ private:
     static const QLatin1String kRemoved;
     static const QLatin1String kModified;
 
-    bool isGroupKnown(const QString &groupId) const;
-
-    // Built-in snippets are specified in an XML embedded as a resource. Snippets created/
-    // modified/removed by the user are stored in another XML created dynamically in the
-    // user's folder.
-    QString m_builtInSnippetsPath;
+    // Built-in snippets are specified in XMLs distributed in a system's folder. Snippets
+    // created or modified/removed (if they are built-ins) by the user are stored in another
     QString m_userSnippetsPath;
-    QString m_snippetsFileName;
+    QString m_userSnippetsFile;
+    QStringList m_builtInSnippetsFiles;
 
     // Snippets for each group are kept in a list. However, not all of them are necessarily
     // active. Specifically, removed built-in snippets are kept as the last ones (for each
index bba57a2..86fa663 100644 (file)
@@ -5,6 +5,5 @@
         <file>TextEditor.mimetypes.xml</file>
         <file>images/refactormarker.png</file>
         <file>images/snippet.png</file>
-        <file>snippets/snippets.xml</file>
     </qresource>
 </RCC>