30 #include <kio/netaccess.h>
34 using namespace Kross;
38 QPointer<QObject> object;
45 class ScriptingPlugin::ScriptingPluginPrivate
51 QHash<QString, Object> objects;
53 QDomElement menuFromName(
QString const& name,
const QDomDocument& document)
55 QDomElement menuBar = document.documentElement().firstChildElement(
"MenuBar");
56 QDomElement menu = menuBar.firstChildElement(
"Menu");
57 for(; !menu.isNull(); menu = menu.nextSiblingElement(
"Menu")) {
58 if(menu.attribute(
"name") == name) {
68 , d(new ScriptingPluginPrivate())
71 d->collectionName=
"scripting-plugin";
76 , d(new ScriptingPluginPrivate())
78 d->collectionName=collectionName;
79 d->userActionsFile = userActionsFile;
80 d->referenceActionsDir = referenceActionsDir;
85 if (QFile::exists(d->userActionsFile))
91 collection->deleteLater();
99 QDomDocument doc = buildDomDocument(document);
105 QString n = name.isNull() ?
object->objectName() : name;
111 QString n = name.isNull() ?
object->objectName() : name;
112 d->objects.insert(n,
Object(
object,options));
115 QDomDocument ScriptingPlugin::buildDomDocument(
const QDomDocument& document)
124 int pos=allActionFiles.indexOf(d->userActionsFile);
126 allActionFiles.append(allActionFiles.takeAt(pos));
127 else if (QFile::exists(d->userActionsFile))
128 allActionFiles.append(d->userActionsFile);
131 foreach(
const QString &file, allActionFiles) {
133 if (!f.open(QIODevice::ReadOnly))
141 QDomDocument doc(document);
142 buildDomDocument(doc, collection);
147 void ScriptingPlugin::buildDomDocument(QDomDocument& document,
150 QDomElement menuElement = d->menuFromName(collection->
name(), document);
153 QHashIterator<QString, Object> i(d->objects);
156 action->
addObject(i.value().object, i.key(), i.value().options);
160 if(menuElement.isNull()) {
161 menuElement = document.createElement(
"Menu");
162 menuElement.setAttribute(
"name", collection->
name());
163 menuElement.setAttribute(
"noMerge",
"0");
165 QDomElement textElement = document.createElement(
"text");
166 textElement.appendChild(document.createTextNode(collection->
text()));
167 menuElement.appendChild(textElement);
171 if(parentCollection) {
172 QDomElement parentMenuElement = d->menuFromName(parentCollection->
name(), document);
173 if(!parentMenuElement.isNull())
174 root=parentMenuElement;
177 root=document.documentElement().firstChildElement(
"MenuBar");
178 root.appendChild(menuElement);
182 QDomElement newActionElement = document.createElement(
"Action");
183 newActionElement.setAttribute(
"name", action->
name());
185 menuElement.appendChild(newActionElement);
189 connect (adaptor,SIGNAL(triggered()),action,SLOT(trigger()));
190 adaptor->setEnabled(action->
isEnabled());
191 adaptor->setIcon(action->icon());
192 actionCollection()->addAction(action->
name(), adaptor);
198 buildDomDocument(document, c);
203 void ScriptingPlugin::save()
205 QFile f(d->userActionsFile);
206 if(!f.open(QIODevice::WriteOnly))
210 bool collectionEmpty = !collection||(collection->
actions().empty()&&collection->
collections().empty());
212 if( !collectionEmpty ) {
214 searchPath.append(QFileInfo(d->userActionsFile).absolutePath());
215 if( collection->
writeXml(&f, 2, searchPath) ) {
216 kDebug() <<
"Successfully saved file: " << d->userActionsFile;
224 "Collection name attribute represents the name of the menu, e.g., to use menu \"File\" use \"file\" or \"Help\" use \"help\". You can add new menus."
226 "If you type a relative script file beware the this script is located in $KDEHOME/share/apps/applicationname/"
228 "The following example adds an action with the text \"Export...\" into the \"File\" menu"
232 "<collection name=\"file\" text=\"File\" comment=\"File menu\">"
234 "<script name=\"export\" text=\"Export...\" comment=\"Export content\" file=\"export.py\" />"
250 if(!KIO::NetAccess::exists(
KUrl(d->userActionsFile), KIO::NetAccess::SourceSide, 0)) {
252 KIO::NetAccess::mkdir(dir, 0);
258 KRun::runUrl(
KUrl(d->userActionsFile),
QString(
"text/plain"), 0,
false);
263 KIO::NetAccess::del(
KUrl(d->userActionsFile), 0);
266 #include "plugin.moc"