1 /***************************************************************************
2 * Copyright 2006 Adam Treat <treat@kde.org> *
3 * Copyright 2007 Alexander Dymo <adymo@kdevelop.org> *
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. *
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. *
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"
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>
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();
52 foreach (ILanguage
*lang
, activeLanguages
) {
56 activeLanguages
.clear();
58 QList
<ILanguage
*> languages
= m_controller
->languagesForUrl(url
);
59 foreach (ILanguage
*lang
, languages
) {
61 activeLanguages
<< lang
;
65 QList
<ILanguage
*> activeLanguages
;
67 LanguageHash languages
;
68 LanguageCache languageCache
;
70 BackgroundParser
*backgroundParser
;
73 LanguageController
*m_controller
;
76 LanguageController::LanguageController(QObject
*parent
)
77 : ILanguageController(parent
)
79 d
= new LanguageControllerPrivate(this);
82 LanguageController::~LanguageController()
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
];
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();
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();
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())) {
135 Language
*_lang
= new Language(languageSupport
, this);
136 d
->languages
.insert(languageSupport
->name(), _lang
);
140 d
->languageCache
.insert(mimeType
->name(), languages
);
146 BackgroundParser
*LanguageController::backgroundParser() const
148 return d
->backgroundParser
;
153 #include "languagecontroller.moc"