1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #include "highlightersettings.h"
36 #include <coreplugin/icore.h>
38 #include <QtCore/QSettings>
39 #include <QtCore/QLatin1String>
40 #include <QtCore/QLatin1Char>
41 #include <QtCore/QDir>
42 #include <QtCore/QFile>
43 #include <QtCore/QStringList>
45 #include <QtCore/QProcess>
48 namespace TextEditor {
51 QString findFallbackDefinitionsLocation()
54 dir.setNameFilters(QStringList(QLatin1String("*.xml")));
56 #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
57 static const QLatin1String kateSyntax[] = {
58 QLatin1String("/share/apps/katepart/syntax"),
59 QLatin1String("/share/kde4/apps/katepart/syntax")
61 static const int kateSyntaxCount =
62 sizeof(kateSyntax) / sizeof(kateSyntax[0]);
65 for (int i = 0; i < kateSyntaxCount; ++i) {
67 paths << QLatin1String("/usr") + kateSyntax[i]
68 << QLatin1String("/usr/local") + kateSyntax[i]
69 << QLatin1String("/opt") + kateSyntax[i];
70 foreach (const QString &path, paths) {
72 if (dir.exists() && !dir.entryInfoList().isEmpty())
79 programs << QLatin1String("kde-config") << QLatin1String("kde4-config");
80 foreach (const QString &program, programs) {
82 process.start(program, QStringList(QLatin1String("--prefix")));
83 if (process.waitForStarted(5000)) {
84 process.waitForFinished(5000);
85 QString output = QString::fromLocal8Bit(process.readAllStandardOutput());
86 output.remove(QLatin1Char('\n'));
87 for (int i = 0; i < kateSyntaxCount; ++i) {
88 dir.setPath(output + kateSyntax[i]);
89 if (dir.exists() && !dir.entryInfoList().isEmpty())
96 dir.setPath(Core::ICore::instance()->resourcePath() + QLatin1String("/generic-highlighter"));
97 if (dir.exists() && !dir.entryInfoList().isEmpty())
103 } // namespace Internal
104 } // namespace TextEditor
108 static const QLatin1String kDefinitionFilesPath("UserDefinitionFilesPath");
109 static const QLatin1String kFallbackDefinitionFilesPath("FallbackDefinitionFilesPath");
110 static const QLatin1String kAlertWhenDefinitionIsNotFound("AlertWhenDefinitionsIsNotFound");
111 static const QLatin1String kUseFallbackLocation("UseFallbackLocation");
112 static const QLatin1String kIgnoredFilesPatterns("IgnoredFilesPatterns");
113 static const QLatin1String kGroupPostfix("HighlighterSettings");
115 QString groupSpecifier(const QString &postFix, const QString &category)
117 if (category.isEmpty())
119 return QString(category + postFix);
122 } // namespace anonymous
124 using namespace TextEditor;
125 using namespace Internal;
127 HighlighterSettings::HighlighterSettings() :
128 m_alertWhenNoDefinition(true), m_useFallbackLocation(true)
131 void HighlighterSettings::toSettings(const QString &category, QSettings *s) const
133 const QString &group = groupSpecifier(kGroupPostfix, category);
134 s->beginGroup(group);
135 s->setValue(kDefinitionFilesPath, m_definitionFilesPath);
136 s->setValue(kFallbackDefinitionFilesPath, m_fallbackDefinitionFilesPath);
137 s->setValue(kAlertWhenDefinitionIsNotFound, m_alertWhenNoDefinition);
138 s->setValue(kUseFallbackLocation, m_useFallbackLocation);
139 s->setValue(kIgnoredFilesPatterns, ignoredFilesPatterns());
143 void HighlighterSettings::fromSettings(const QString &category, QSettings *s)
145 const QString &group = groupSpecifier(kGroupPostfix, category);
146 s->beginGroup(group);
147 m_definitionFilesPath = s->value(kDefinitionFilesPath, QString()).toString();
148 if (!s->contains(kDefinitionFilesPath))
149 assignDefaultDefinitionsPath();
151 m_definitionFilesPath = s->value(kDefinitionFilesPath).toString();
152 if (!s->contains(kFallbackDefinitionFilesPath)) {
153 m_fallbackDefinitionFilesPath = findFallbackDefinitionsLocation();
154 if (m_fallbackDefinitionFilesPath.isEmpty())
155 m_useFallbackLocation = false;
157 m_useFallbackLocation = true;
159 m_fallbackDefinitionFilesPath = s->value(kFallbackDefinitionFilesPath).toString();
160 m_useFallbackLocation = s->value(kUseFallbackLocation, true).toBool();
162 m_alertWhenNoDefinition = s->value(kAlertWhenDefinitionIsNotFound, true).toBool();
163 if (!s->contains(kIgnoredFilesPatterns))
164 assignDefaultIgnoredPatterns();
166 setIgnoredFilesPatterns(s->value(kIgnoredFilesPatterns, QString()).toString());
170 void HighlighterSettings::setIgnoredFilesPatterns(const QString &patterns)
172 setExpressionsFromList(patterns.split(QLatin1Char(','), QString::SkipEmptyParts));
175 QString HighlighterSettings::ignoredFilesPatterns() const
177 return listFromExpressions().join(QLatin1String(","));
180 void HighlighterSettings::assignDefaultIgnoredPatterns()
182 QStringList patterns;
183 patterns << QLatin1String("*.txt")
184 << QLatin1String("LICENSE*")
185 << QLatin1String("README")
186 << QLatin1String("INSTALL")
187 << QLatin1String("COPYING")
188 << QLatin1String("NEWS")
189 << QLatin1String("qmldir");
190 setExpressionsFromList(patterns);
193 void HighlighterSettings::assignDefaultDefinitionsPath()
195 const QString &path =
196 Core::ICore::instance()->userResourcePath() + QLatin1String("/generic-highlighter");
197 if (QFile::exists(path) || QDir().mkpath(path))
198 m_definitionFilesPath = path;
201 bool HighlighterSettings::isIgnoredFilePattern(const QString &fileName) const
203 foreach (const QRegExp ®Exp, m_ignoredFiles)
204 if (regExp.indexIn(fileName) != -1)
210 bool HighlighterSettings::equals(const HighlighterSettings &highlighterSettings) const
212 return m_definitionFilesPath == highlighterSettings.m_definitionFilesPath &&
213 m_fallbackDefinitionFilesPath == highlighterSettings.m_fallbackDefinitionFilesPath &&
214 m_alertWhenNoDefinition == highlighterSettings.m_alertWhenNoDefinition &&
215 m_useFallbackLocation == highlighterSettings.m_useFallbackLocation &&
216 m_ignoredFiles == highlighterSettings.m_ignoredFiles;
219 void HighlighterSettings::setExpressionsFromList(const QStringList &patterns)
221 m_ignoredFiles.clear();
223 regExp.setCaseSensitivity(Qt::CaseInsensitive);
224 regExp.setPatternSyntax(QRegExp::Wildcard);
225 foreach (const QString &s, patterns) {
226 regExp.setPattern(s);
227 m_ignoredFiles.append(regExp);
231 QStringList HighlighterSettings::listFromExpressions() const
233 QStringList patterns;
234 foreach (const QRegExp ®Exp, m_ignoredFiles)
235 patterns.append(regExp.pattern());