Fix no newlines warnings. Patch by Peter Oberndorfer
[kdevelopdvcssupport.git] / shell / languagecontroller.cpp
blob0edc570025c4684548207a88813d42f77dcbe350
1 /***************************************************************************
2 * Copyright 2006 Adam Treat <treat@kde.org> *
3 * Copyright 2007 Alexander Dymo <adymo@kdevelop.org> *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU Library General Public License as *
7 * published by the Free Software Foundation; either version 2 of the *
8 * License, or (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU Library General Public *
16 * License along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
20 #include "languagecontroller.h"
22 #include <QHash>
24 #include <kmimetype.h>
26 #include <interfaces/idocument.h>
27 #include <interfaces/idocumentcontroller.h>
28 #include <interfaces/iplugin.h>
29 #include <interfaces/iplugincontroller.h>
30 #include <language/interfaces/ilanguagesupport.h>
31 #include <language/backgroundparser/backgroundparser.h>
33 #include "core.h"
34 #include "language.h"
36 namespace KDevelop {
38 typedef QHash<QString, Language*> LanguageHash;
39 typedef QHash<QString, QList<ILanguage*> > LanguageCache;
41 struct LanguageControllerPrivate {
42 LanguageControllerPrivate(LanguageController *controller)
43 : backgroundParser(new BackgroundParser(controller)), m_controller(controller) {}
45 void documentActivated(KDevelop::IDocument *document)
47 KUrl url = document->url();
48 if (!url.isValid()) {
49 return;
52 foreach (ILanguage *lang, activeLanguages) {
53 lang->deactivate();
56 activeLanguages.clear();
58 QList<ILanguage*> languages = m_controller->languagesForUrl(url);
59 foreach (ILanguage *lang, languages) {
60 lang->activate();
61 activeLanguages << lang;
65 QList<ILanguage*> activeLanguages;
67 LanguageHash languages;
68 LanguageCache languageCache;
70 BackgroundParser *backgroundParser;
72 private:
73 LanguageController *m_controller;
76 LanguageController::LanguageController(QObject *parent)
77 : ILanguageController(parent)
79 d = new LanguageControllerPrivate(this);
82 LanguageController::~LanguageController()
84 delete d;
87 void LanguageController::initialize()
89 connect(Core::self()->documentController(), SIGNAL(documentActivated(KDevelop::IDocument*)),
90 SLOT(documentActivated(KDevelop::IDocument*)));
93 QList<ILanguage*> LanguageController::activeLanguages()
95 return d->activeLanguages;
98 ILanguage *LanguageController::language(const QString &name) const
100 if(d->languages.contains(name))
101 return d->languages[name];
102 else{
103 ILanguage* ret = 0;
104 QStringList constraints;
105 constraints << QString("'%1' in [X-KDevelop-Language]").arg(name);
106 QList<IPlugin*> supports = Core::self()->pluginController()->
107 allPluginsForExtension("ILanguageSupport", constraints);
108 if(!supports.isEmpty()) {
109 ILanguageSupport *languageSupport = supports[0]->extension<ILanguageSupport>();
110 ret = languageSupport->language();
112 return ret;
116 QList<ILanguage*> LanguageController::languagesForUrl(const KUrl &url)
118 KMimeType::Ptr mimeType = KMimeType::findByUrl(url);
120 QList<ILanguage*> languages;
121 LanguageCache::iterator it = d->languageCache.find(mimeType->name());
122 if (it != d->languageCache.constEnd()) {
123 languages = it.value();
124 } else {
125 QStringList constraints;
126 constraints << QString("'%1' in [X-KDevelop-SupportedMimeTypes]").arg(mimeType->name());
127 QList<IPlugin*> supports = Core::self()->pluginController()->
128 allPluginsForExtension("ILanguageSupport", constraints);
130 foreach (IPlugin *support, supports) {
131 ILanguageSupport *languageSupport = support->extension<ILanguageSupport>();
132 if (ILanguage *lang = language(languageSupport->name())) {
133 languages << lang;
134 } else {
135 Language *_lang = new Language(languageSupport, this);
136 d->languages.insert(languageSupport->name(), _lang);
137 languages << _lang;
140 d->languageCache.insert(mimeType->name(), languages);
143 return languages;
146 BackgroundParser *LanguageController::backgroundParser() const
148 return d->backgroundParser;
153 #include "languagecontroller.moc"