scriptingpart.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "scriptingpart.h"
00013 #include <Python.h>
00014 #include <stdlib.h>
00015 #include <dcopclient.h>
00016 #include <dcopobject.h>
00017 #include <kaction.h>
00018 #include <kdebug.h>
00019 #include <kdevgenericfactory.h>
00020 #include <kstandarddirs.h>
00021
00022 #include "kdevcore.h"
00023 #include <qfile.h>
00024
00025
00026 static ScriptingPart *scripting_part;
00027 extern "C" {
00028 void initkdevelopc();
00029 void initpydcopc();
00030 int __kde_do_not_unload;
00031 }
00032
00033 typedef KDevGenericFactory<ScriptingPart> ScriptingFactory;
00034 static const KAboutData data("kdevscripting", ("Python Scripting Support"), "1.0");
00035 K_EXPORT_COMPONENT_FACTORY( libkdevscripting, ScriptingFactory( &data ) );
00036
00037 ScriptingPart::ScriptingPart(QObject *parent, const char *name, const QStringList &)
00038 : KDevPlugin("PythonScripting", "scripting", parent, name ? name : "ScriptingPart")
00039 {
00040 setInstance(ScriptingFactory::instance());
00041
00042 QString xml = QString::fromLatin1("<!DOCTYPE kpartgui SYSTEM \"kpartgui.dtd\">\n"
00043 "<kpartgui version=\"1\" name=\"editorpart\">\n"
00044 "<MenuBar>\n"
00045 "</MenuBar>\n"
00046 "</kpartgui>");
00047 guiDocument.setContent(xml);
00048 setDOMDocument(guiDocument);
00049
00050 scripting_part = this;
00051
00052 QString moddir = KGlobal::dirs()->findResourceDir("data", "kdevscripting/kdevelop.py") + "kdevscripting";
00053 char *env = strdup(QString::fromLatin1("PYTHONPATH=%1").arg(moddir).latin1());
00054 putenv(env);
00055 Py_Initialize();
00056 free(env);
00057
00058 kdDebug(9011) << "Init kdevelopc" << endl;
00059 initkdevelopc();
00060
00061 kdDebug(9011) << "Init pydcopc" << endl;
00062 initpydcopc();
00063
00064 kdDebug(9011) << "import kdevelop" << endl;
00065 PyRun_SimpleString((char*)"import kdevelop");
00066
00067 kdDebug(9011) << "from init import *" << endl;
00068 PyRun_SimpleString((char*)"from init import *");
00069
00070 #if 0
00071 QString initfile = locate("data", "kdevpython/init.py");
00072 FILE *f1 = fopen(QFile::encodeName(initfile), "r");
00073 kdDebug(9011) << "evaluate init.py" << endl;
00074 PyRun_SimpleFile(f1, QFile::encodeName(initfile));
00075 fclose(f1);
00076 #endif
00077 }
00078
00079
00080 extern DCOPObject *pydcopc_dispatcher;
00081
00082
00083 ScriptingPart::~ScriptingPart()
00084 {
00085 delete pydcopc_dispatcher;
00086 pydcopc_dispatcher = 0;
00087 }
00088
00089
00090 PyObject *ScriptingPart::addMenuItem(PyObject *args)
00091 {
00092 char *menu, *submenu;
00093 PyObject *func;
00094
00095 if (!PyArg_ParseTuple(args, (char*)"ssO", &menu, &submenu, &func))
00096 return 0;
00097
00098 if (!PyCallable_Check(func)) {
00099 kdDebug(9011) << "Scripting function not callable" << endl;
00100 return 0;
00101 }
00102
00103 QString menustr = QString::fromLatin1(menu);
00104 QString submenustr = QString::fromLatin1(submenu);
00105 QString ident = menustr + submenustr;
00106
00107 Py_XINCREF(func);
00108
00109 actions.insert(ident, func);
00110
00111 core()->insertNewAction( new KAction(submenustr, 0, this, SLOT(slotScriptAction()),
00112 actionCollection(), ident.latin1()) );
00113
00114 QDomElement el = guiDocument.documentElement();
00115 el = el.namedItem("MenuBar").toElement();
00116 QDomElement child = el.firstChild().toElement();
00117 while (!child.isNull()) {
00118 if (child.tagName() == "Menu" && child.attribute("name") == menustr)
00119 break;
00120 child = child.nextSibling().toElement();
00121 }
00122 if (child.isNull()) {
00123 child = guiDocument.createElement(QString::fromLatin1("Menu"));
00124 child.setAttribute(QString::fromLatin1("name"), menustr);
00125 el.appendChild(child);
00126 }
00127 el = child;
00128
00129 child = guiDocument.createElement(QString::fromLatin1("Action"));
00130 child.setAttribute(QString::fromLatin1("name"), ident);
00131 el.appendChild(child);
00132
00133 kdDebug(9011) << "New dom document: " << guiDocument.toString() << endl;
00134
00135 setDOMDocument(guiDocument);
00136
00137 Py_INCREF(Py_None);
00138 return Py_None;
00139 }
00140
00141
00142
00143 PyObject *ScriptingPart::appId(PyObject *args)
00144 {
00145 if (!PyArg_ParseTuple(args, (char*)""))
00146 return NULL;
00147
00148 return Py_BuildValue((char*)"s", DCOPClient::mainClient()->appId().data());
00149 }
00150
00151
00152 void ScriptingPart::slotScriptAction()
00153 {
00154 QString ident = QString::fromLatin1(sender()->name());
00155 kdDebug(9011) << "Action " << ident << " activated" << endl;
00156
00157 PyObject *arglist = Py_BuildValue((char*)"()");
00158 PyEval_CallObject(actions[ident], arglist);
00159 }
00160
00161
00162 extern "C" {
00163
00164 static PyObject *kdevelopc_addMenuItem(PyObject *, PyObject *args)
00165 {
00166 return scripting_part->addMenuItem(args);
00167 }
00168 static PyObject *kdevelopc_appId(PyObject *, PyObject *args)
00169 {
00170 return scripting_part->appId(args);
00171 }
00172
00173 static struct PyMethodDef kdevelopc_methods[] = {
00174 { (char*)"appId", kdevelopc_appId, METH_VARARGS, NULL },
00175 { (char*)"addMenuItem", kdevelopc_addMenuItem, METH_VARARGS, NULL },
00176 { NULL, NULL, 0, NULL }
00177 };
00178
00179 void initkdevelopc()
00180 {
00181 (void) Py_InitModule((char*)"kdevelopc", kdevelopc_methods);
00182 }
00183 }
00184
00185 #include "scriptingpart.moc"
This file is part of the documentation for KDevelop Version 3.1.2.