1
/***************************************************************************
3
* This file is part of the KDE project
4
* copyright (C)2004-2005 by Sebastian Sauer (mail@dipe.org)
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Library General Public
8
* License as published by the Free Software Foundation; either
9
* version 2 of the 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 GNU
13
* Library General Public License for more details.
14
* You should have received a copy of the GNU Library General Public License
15
* along with this program; see the file COPYING. If not, write to
16
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
* Boston, MA 02111-1307, USA.
18
***************************************************************************/
20
#include "eventslot.h"
22
#include "interpreter.h"
27
#include "../main/scriptcontainer.h"
28
#include "eventmanager.h"
30
#include <qvaluelist.h>
31
#include <qmetaobject.h>
33
using namespace Kross::Api;
35
EventSlot::EventSlot(EventManager* eventmanager)
36
: QObject(eventmanager, "EventSlot")
37
, m_eventmanager(eventmanager)
44
EventSlot* EventSlot::create(EventManager* eventmanager)
46
return new EventSlot(eventmanager);
49
QCString EventSlot::getSlot(const QCString& signal)
51
QString signature = QString(signal).mid(1);
52
int startpos = signature.find("(");
53
int endpos = signature.findRev(")");
54
if(startpos < 0 || startpos > endpos) {
55
kdWarning() << QString("EventSlot::getSlot(%1) Invalid signal.").arg(signal) << endl;
58
QString signalname = signature.left(startpos);
59
QString params = signature.mid(startpos + 1, endpos - startpos - 1);
60
//QStringList paramlist = QStringList::split(",", params);
61
QCString slot = QString("callback(" + params + ")").latin1(); //normalizeSignalSlot();
63
QMetaObject* mo = metaObject();
64
int slotid = mo->findSlot(slot, false);
66
kdDebug() << QString("EventSlot::getSlot(%1) No such slot '%2' avaiable.").arg(signal).arg(slot) << endl;
70
const QMetaData* md = mo->slot(slotid, false);
71
if(md->access != QMetaData::Public) {
72
kdDebug() << QString("EventSlot::getSlot(%1) The slot '%2' is not public.").arg(signal).arg(slot) << endl;
76
//QMember* member = md->member;
77
//const QUMethod *method = md->method;
79
kdDebug()<<"signal="<<signal<<" slot="<<slot<<" slotid="<<slotid<<" params="<<params<<" md->name="<<md->name<<endl;
80
return QCString("1" + slot); // Emulate the SLOT(...) macro by adding as first char a "1".
83
bool EventSlot::connect(EventManager* eventmanager, QObject* senderobj, const QCString& signal, QString function, const QCString& slot)
85
if(m_sender && ! disconnect())
88
const QCString& myslot = slot.isEmpty() ? getSlot(signal) : slot;
92
if(! m_eventmanager) {
93
EventSlot* eventslot = create(eventmanager);
94
eventslot->connect(eventmanager, senderobj, signal, function, slot);
95
m_slots.append(eventslot);
96
kdDebug() << QString("EventSlot::connect(%1, %2, %3) added child EventSlot !!!").arg(senderobj->name()).arg(signal).arg(function) << endl;
101
m_function = function;
103
if(! QObject::connect((QObject*)senderobj, signal, this, myslot)) {
104
kdDebug() << QString("EventSlot::connect(%1, %2, %3) failed.").arg(senderobj->name()).arg(signal).arg(function) << endl;
107
kdDebug() << QString("EventSlot::connect(%1, %2, %3) successfully connected.").arg(senderobj->name()).arg(signal).arg(function) << endl;
113
bool EventSlot::disconnect()
115
if(! m_sender) return false;
116
QObject::disconnect((QObject*)m_sender, m_signal, this, m_slot);
120
m_function = QString::null;
124
void EventSlot::call(const QVariant& variant)
126
kdDebug() << QString("EventSlot::call() sender='%1' signal='%2' function='%3'")
127
.arg(m_sender->name()).arg(m_signal).arg(m_function) << endl;
129
QValueList<Kross::Api::Object*> args;
130
if(variant.isValid())
131
args.append(Kross::Api::Variant::create(variant));
132
m_eventmanager->m_scriptcontainer->callFunction(
134
variant.isValid() ? Kross::Api::List::create(args) : 0
138
void EventSlot::callback() {
140
void EventSlot::callback(short s) {
142
void EventSlot::callback(int i) {
144
void EventSlot::callback(int i1, int i2) {
145
call(QVariant( QValueList<QVariant>() << i1 << i2 )); }
146
void EventSlot::callback(int i1, int i2, int i3) {
147
call(QVariant( QValueList<QVariant>() << i1 << i2 << i3 )); }
148
void EventSlot::callback(int i1, int i2, int i3, int i4) {
149
call(QVariant( QValueList<QVariant>() << i1 << i2 << i3 << i4 )); }
150
void EventSlot::callback(int i1, int i2, int i3, int i4, int i5) {
151
call(QVariant( QValueList<QVariant>() << i1 << i2 << i3 << i4 << i5 )); }
152
void EventSlot::callback(int i1, int i2, int i3, int i4, bool b) {
153
call(QVariant( QValueList<QVariant>() << i1 << i2 << i3 << i4 << b )); }
154
void EventSlot::callback(int i1, bool b) {
155
call(QVariant( QValueList<QVariant>() << i1 << b )); }
156
void EventSlot::callback(int i1, int i2, bool b) {
157
call(QVariant( QValueList<QVariant>() << i1 << i2 << b )); }
158
void EventSlot::callback(int i1, int i2, const QString& s) {
159
call(QVariant( QValueList<QVariant>() << i1 << i2 << s )); }
160
void EventSlot::callback(uint i) {
162
void EventSlot::callback(long l) {
163
call(QVariant((Q_LLONG)l)); }
164
void EventSlot::callback(ulong l) {
165
call(QVariant((Q_ULLONG)l)); }
166
void EventSlot::callback(double d) {
168
void EventSlot::callback(const char* c) {
170
void EventSlot::callback(bool b) {
172
void EventSlot::callback(const QString& s) {
174
void EventSlot::callback(const QString& s, int i) {
175
call(QVariant( QValueList<QVariant>() << s << i )); }
176
void EventSlot::callback(const QString& s, int i1, int i2) {
177
call(QVariant( QValueList<QVariant>() << s << i1 << i2 )); }
178
void EventSlot::callback(const QString& s, uint i) {
179
call(QVariant( QValueList<QVariant>() << s << i )); }
180
void EventSlot::callback(const QString& s, bool b) {
181
call(QVariant( QValueList<QVariant>() << s << b )); }
182
void EventSlot::callback(const QString& s, bool b1, bool b2) {
183
call(QVariant( QValueList<QVariant>() << s << b1 << b2 )); }
184
void EventSlot::callback(const QString& s, bool b, int i) {
185
call(QVariant( QValueList<QVariant>() << s << b << i )); }
186
void EventSlot::callback(const QString& s1, const QString& s2) {
187
call(QVariant( QValueList<QVariant>() << s1 << s2 )); }
188
void EventSlot::callback(const QString& s1, const QString& s2, const QString& s3) {
189
call(QVariant( QValueList<QVariant>() << s1 << s2 << s3 )); }
190
void EventSlot::callback(const QStringList& sl) {
191
call(QVariant(sl)); }
192
void EventSlot::callback(const QVariant& variant) {