OSDN Git Service

829bfa17ebbc564e575d8a7c6d683234c057a826
[qt-creator-jp/qt-creator-jp.git] / src / plugins / texteditor / generichighlighter / highlightersettings.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
8 **
9 ** No Commercial Usage
10 **
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
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 **
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.
24 **
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.
28 **
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
31 **
32 **************************************************************************/
33
34 #include "highlightersettings.h"
35
36 #include <coreplugin/icore.h>
37
38 #include <QtCore/QSettings>
39 #include <QtCore/QLatin1String>
40 #include <QtCore/QLatin1Char>
41 #include <QtCore/QDir>
42 #include <QtCore/QFile>
43 #include <QtCore/QStringList>
44 #ifdef Q_OS_UNIX
45 #include <QtCore/QProcess>
46 #endif
47
48 namespace TextEditor {
49 namespace Internal {
50
51 QString findFallbackDefinitionsLocation()
52 {
53     QDir dir;
54     dir.setNameFilters(QStringList(QLatin1String("*.xml")));
55
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")
60     };
61     static const int kateSyntaxCount =
62         sizeof(kateSyntax) / sizeof(kateSyntax[0]);
63
64     // Some wild guesses.
65     for (int i = 0; i < kateSyntaxCount; ++i) {
66         QStringList paths;
67         paths << QLatin1String("/usr") + kateSyntax[i]
68               << QLatin1String("/usr/local") + kateSyntax[i]
69               << QLatin1String("/opt") + kateSyntax[i];
70         foreach (const QString &path, paths) {
71             dir.setPath(path);
72             if (dir.exists() && !dir.entryInfoList().isEmpty())
73                 return dir.path();
74         }
75     }
76
77     // Try kde-config.
78     QStringList programs;
79     programs << QLatin1String("kde-config") << QLatin1String("kde4-config");
80     foreach (const QString &program, programs) {
81         QProcess process;
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())
90                     return dir.path();
91             }
92         }
93     }
94 #endif
95
96     dir.setPath(Core::ICore::instance()->resourcePath() + QLatin1String("/generic-highlighter"));
97     if (dir.exists() && !dir.entryInfoList().isEmpty())
98         return dir.path();
99
100     return QString();
101 }
102
103 } // namespace Internal
104 } // namespace TextEditor
105
106 namespace {
107
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");
114
115 QString groupSpecifier(const QString &postFix, const QString &category)
116 {
117     if (category.isEmpty())
118         return postFix;
119     return QString(category + postFix);
120 }
121
122 } // namespace anonymous
123
124 using namespace TextEditor;
125 using namespace Internal;
126
127 HighlighterSettings::HighlighterSettings() :
128     m_alertWhenNoDefinition(true), m_useFallbackLocation(true)
129 {}
130
131 void HighlighterSettings::toSettings(const QString &category, QSettings *s) const
132 {
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());
140     s->endGroup();
141 }
142
143 void HighlighterSettings::fromSettings(const QString &category, QSettings *s)
144 {
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();
150     else
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;
156         else
157             m_useFallbackLocation = true;
158     } else {
159         m_fallbackDefinitionFilesPath = s->value(kFallbackDefinitionFilesPath).toString();
160         m_useFallbackLocation = s->value(kUseFallbackLocation, true).toBool();
161     }
162     m_alertWhenNoDefinition = s->value(kAlertWhenDefinitionIsNotFound, true).toBool();
163     if (!s->contains(kIgnoredFilesPatterns))
164         assignDefaultIgnoredPatterns();
165     else
166         setIgnoredFilesPatterns(s->value(kIgnoredFilesPatterns, QString()).toString());
167     s->endGroup();
168 }
169
170 void HighlighterSettings::setIgnoredFilesPatterns(const QString &patterns)
171 {
172     setExpressionsFromList(patterns.split(QLatin1Char(','), QString::SkipEmptyParts));
173 }
174
175 QString HighlighterSettings::ignoredFilesPatterns() const
176 {
177     return listFromExpressions().join(QLatin1String(","));
178 }
179
180 void HighlighterSettings::assignDefaultIgnoredPatterns()
181 {
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);
191 }
192
193 void HighlighterSettings::assignDefaultDefinitionsPath()
194 {
195     const QString &path =
196         Core::ICore::instance()->userResourcePath() + QLatin1String("/generic-highlighter");
197     if (QFile::exists(path) || QDir().mkpath(path))
198         m_definitionFilesPath = path;
199 }
200
201 bool HighlighterSettings::isIgnoredFilePattern(const QString &fileName) const
202 {
203     foreach (const QRegExp &regExp, m_ignoredFiles)
204         if (regExp.indexIn(fileName) != -1)
205             return true;
206
207     return false;
208 }
209
210 bool HighlighterSettings::equals(const HighlighterSettings &highlighterSettings) const
211 {
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;
217 }
218
219 void HighlighterSettings::setExpressionsFromList(const QStringList &patterns)
220 {
221     m_ignoredFiles.clear();
222     QRegExp regExp;
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);
228     }
229 }
230
231 QStringList HighlighterSettings::listFromExpressions() const
232 {
233     QStringList patterns;
234     foreach (const QRegExp &regExp, m_ignoredFiles)
235         patterns.append(regExp.pattern());
236     return patterns;
237 }