/* * Copyright 2014 David Herberth kde@dav1d.de * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3, or any * later version accepted by the membership of KDE e.V. (or its * successor approved by the membership of KDE e.V.), which shall * act as a proxy defined in Section 6 of version 3 of the license. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . **/ #include "lumen.h" #include #include #include #include #include #include #include #include #include #include #include K_PLUGIN_FACTORY_DEFINITION( LumenPluginFactory, registerPlugin("ktexteditor_lumen"); ) K_EXPORT_PLUGIN( LumenPluginFactory( KAboutData( "ktexteditor_lumen", "ktexteditor_plugins", ki18n("Lumen"), "0.1", ki18n("Lumen"), KAboutData::License_LGPL_V2, ki18n("© David Herberth"), ki18n("D Autocompletion plugin using DCD as completion server.") ) ) ) LumenPluginView::LumenPluginView(LumenPlugin *plugin, KTextEditor::View *view): QObject(plugin),KXMLGUIClient(view),m_view(view),m_registered(false) { m_plugin = plugin; m_model = new LumenCompletionModel((QObject*)m_view, m_plugin->dcd()); KTextEditor::Document* document = view->document(); connect(document, SIGNAL(documentUrlChanged(KTextEditor::Document*)), this, SLOT(urlChanged(KTextEditor::Document*))); registerCompletion(); registerTextHints(); } void LumenPluginView::registerCompletion() { KTextEditor::CodeCompletionInterface *completion = qobject_cast(m_view); bool isD = m_view->document()->url().path().endsWith(".d") || m_view->document()->highlightingMode() == "D"; if (isD && !m_registered) { completion->registerCompletionModel(m_model); m_registered = true; } else if(!isD && m_registered) { completion->unregisterCompletionModel(m_model); m_registered = false; } } void LumenPluginView::registerTextHints() { KTextEditor::TextHintInterface *th = qobject_cast(m_view); th->enableTextHints(500); connect(m_view, SIGNAL(needTextHint(const KTextEditor::Cursor&, QString &)), this, SLOT(getTextHint(const KTextEditor::Cursor&, QString &))); } void LumenPluginView::getTextHint(const KTextEditor::Cursor& cursor, QString& text) { KTextEditor::Document* document = m_view->document(); KTextEditor::Cursor cursorEnd = document->documentEnd(); KTextEditor::Range range0c = KTextEditor::Range(0, 0, cursor.line(), cursor.column()); KTextEditor::Range rangece = KTextEditor::Range(cursor.line(), cursor.column(), cursorEnd.line(), cursorEnd.column()); QString text0c = document->text(range0c, false); QByteArray utf8 = text0c.toUtf8(); int offset = utf8.length(); utf8.append(document->text(rangece, false).toUtf8()); text = m_plugin->dcd()->doc(utf8, offset).trimmed().replace("\\n", "\n"); } LumenPluginView::~LumenPluginView() { } void LumenPluginView::urlChanged(KTextEditor::Document* document) { registerCompletion(); QStringList paths; for (KUrl url = document->url(); !url.equals(KUrl("/")); url = url.upUrl()) { url = url.directory(); url.addPath(".lumenconfig"); QFile file(url.path()); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { while (!file.atEnd()) { QString path = file.readLine().trimmed(); // KUrl doesn really provide this functionallity if (QDir::isRelativePath(path)){ path = QDir::cleanPath( url.directory() + QDir::separator() + path ); } paths.append(path); } } } if (!paths.isEmpty()) { m_plugin->dcd()->addImportPath(paths); } } LumenPlugin::LumenPlugin(QObject *parent, const QVariantList &): Plugin(parent) { m_dcd = new DCD(9166, "dcd-server", "dcd-client"); m_dcd->startServer(); } LumenPlugin::~LumenPlugin() { m_dcd->stopServer(); delete m_dcd; } DCD* LumenPlugin::dcd() { return m_dcd; } void LumenPlugin::addView(KTextEditor::View *view) { m_views.insert(view, new LumenPluginView(this, view)); } void LumenPlugin::removeView(KTextEditor::View *view) { delete m_views.take(view); } #include "moc_lumen.cpp"