kexi

scriptIO.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #include "scriptIO.h"
00021 #include "formscript.h"
00022 #include "kexievents.h"
00023 
00024 #include "form.h"
00025 #include "objecttree.h"
00026 // Kross includes
00027 #include "main/scriptcontainer.h"
00028 
00029 bool
00030 ScriptIO::saveFormEvents(QDomNode &parentNode, FormScript *formScript)
00031 {
00032     QDomDocument domDoc = parentNode.ownerDocument();
00033 
00034     // Save the form's code
00035     if(!formScript->getCode().isEmpty()) {
00036         QDomElement  script = domDoc.createElement("script");
00037         script.setAttribute("language", formScript->scriptContainer()->getInterpreterName());
00038         parentNode.appendChild(script);
00039         QDomText scriptCode = domDoc.createTextNode(formScript->getCode());
00040         script.appendChild(scriptCode);
00041     }
00042 
00043     // Save all form events
00044     if(!formScript->eventList()->isEmpty())
00045         saveEventList(formScript->eventList(), parentNode);
00046     return true;
00047 }
00048 
00049 bool
00050 ScriptIO::loadFormEvents(QDomNode &parentNode, Form *form, ScriptManager *manager)
00051 {
00052     QDomElement script = parentNode.namedItem("script").toElement();
00053     QDomElement events = parentNode.namedItem("events").toElement();
00054 
00055     // Load script code
00056     FormScript *formScript = new FormScript(form, manager);
00057     if(!script.isNull()) {
00058         formScript->scriptContainer()->setInterpreterName(script.attribute("language"));
00059         formScript->setCode(script.text());
00060     }
00061 
00062     // Load all events in the EventList
00063     if(!events.isNull()) {
00064         for(QDomNode n = events.firstChild(); !n.isNull(); n = n.nextSibling())
00065             loadEvent(n, formScript->eventList(), form);
00066     }
00067     return true;
00068 }
00069 
00070 bool
00071 ScriptIO::saveAllEventsForWidget(QObject *widget, FormScript *formScript, QDomNode &node)
00072 {
00073     EventList *l = formScript->eventList()->allEventsForObject(widget);
00074     saveEventList(l, node);
00075     return true;
00076 }
00077 
00078 void
00079 ScriptIO::saveEvent(Event *event, QDomNode &parentNode)
00080 {
00081     if(!event)
00082         return;
00083 
00084     QDomDocument domDoc = parentNode.ownerDocument();
00085     QDomElement eventNode = domDoc.createElement("event");
00086     eventNode.setAttribute("type", event->type());
00087     parentNode.appendChild(eventNode);
00088 
00089     switch(event->type()) {
00090         case Event::Slot: {
00091             QDomElement sender = domDoc.createElement("sender");
00092             eventNode.appendChild(sender);
00093             QDomText senderText = domDoc.createTextNode(event->sender() ? event->sender()->name() : "");
00094             sender.appendChild(senderText);
00095 
00096             QDomElement signal = domDoc.createElement("signal");
00097             eventNode.appendChild(signal);
00098             QDomText signalText = domDoc.createTextNode(event->signal());
00099             signal.appendChild(signalText);
00100 
00101             QDomElement receiver = domDoc.createElement("receiver");
00102             eventNode.appendChild(receiver);
00103             QDomText receiverText = domDoc.createTextNode(event->receiver() ? event->receiver()->name() : "");
00104             receiver.appendChild(receiverText);
00105 
00106             QDomElement slot = domDoc.createElement("slot");
00107             eventNode.appendChild(slot);
00108             QDomText slotText = domDoc.createTextNode(event->slot());
00109             slot.appendChild(slotText);
00110             break;
00111         }
00112 
00113         case Event::UserFunction: {
00114             QDomElement sender = domDoc.createElement("sender");
00115             eventNode.appendChild(sender);
00116             QDomText senderText = domDoc.createTextNode(event->sender() ? event->sender()->name() : "");
00117             sender.appendChild(senderText);
00118 
00119             QDomElement signal = domDoc.createElement("signal");
00120             eventNode.appendChild(signal);
00121             QDomText signalText = domDoc.createTextNode(event->signal());
00122             signal.appendChild(signalText);
00123 
00124             QDomElement function = domDoc.createElement("function");
00125             eventNode.appendChild(function);
00126             QDomText functionText = domDoc.createTextNode(event->slot());
00127             function.appendChild(functionText);
00128             break;
00129         }
00130 
00131         case Event::Action:
00132             // !\todo
00133             break;
00134 
00135         default:
00136             break;
00137     }
00138 }
00139 
00140 void
00141 ScriptIO::saveEventList(EventList *list, QDomNode &parentNode)
00142 {
00143     if(!list || list->isEmpty())
00144         return;
00145 
00146     QDomDocument domDoc = parentNode.ownerDocument();
00147     QDomElement events = domDoc.createElement("events");
00148     parentNode.appendChild(events);
00149 
00150     QValueListConstIterator<Event*> endIt = list->constEnd();
00151     for(QValueListConstIterator<Event*> it =  list->constBegin(); it != endIt; ++it)
00152         saveEvent((*it), events);
00153 }
00154 
00155 void
00156 ScriptIO::loadEvent(QDomNode &node, EventList *list, Form *form)
00157 {
00158     int type = node.toElement().attribute("type").toInt();
00159     Event *event = new Event();
00160 
00161     switch(type) {
00162         case Event::Slot: {
00163             ObjectTreeItem *sender = form->objectTree()->lookup(node.namedItem("sender").toElement().text());
00164             event->setSender(sender ? sender->widget() : 0);
00165             event->setSignal(node.namedItem("signal").toElement().text().local8Bit());
00166             ObjectTreeItem *receiver = form->objectTree()->lookup(node.namedItem("receiver").toElement().text());
00167             event->setReceiver(receiver ? receiver->widget() : 0);
00168             event->setSlot(node.namedItem("slot").toElement().text().local8Bit());
00169             event->setType(Event::Slot);
00170             break;
00171         }
00172 
00173         case Event::UserFunction: {
00174             ObjectTreeItem *sender = form->objectTree()->lookup(node.namedItem("sender").toElement().text());
00175             event->setSender(sender ? sender->widget() : 0);
00176             event->setSignal(node.namedItem("signal").toElement().text().local8Bit());
00177             event->setSlot(node.namedItem("function").toElement().text().local8Bit());
00178             event->setType(Event::UserFunction);
00179             break;
00180         }
00181         default:  break;
00182     }
00183 
00184     list->addEvent(event);
00185 }
00186 
KDE Home | KDE Accessibility Home | Description of Access Keys