kexi
macroitem.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "macroitem.h"
00021
00022 #include <kdebug.h>
00023
00024 using namespace KoMacro;
00025
00026 namespace KoMacro {
00027
00032 class MacroItem::Private
00033 {
00034 public:
00038 KSharedPtr<Action> action;
00039
00043 QString comment;
00044
00048 Variable::Map variables;
00049
00055 inline const QVariant cast(const QVariant& variant, QVariant::Type type) const
00056 {
00057
00058
00059
00060
00061
00062 bool ok = false;
00063 QVariant v;
00064
00065
00066 switch(type) {
00067 case QVariant::Bool: {
00068 const QString s = variant.toString();
00069 ok = (s == "true" || s == "false" || s == "0" || s == "1" || s == "-1");
00070 v = QVariant( variant.toBool(), 0 );
00071 } break;
00072 case QVariant::Int: {
00073 v = variant.toInt(&ok);
00074
00075 Q_ASSERT(!ok || v.toString() == variant.toString());
00076 } break;
00077 case QVariant::UInt: {
00078 v = variant.toUInt(&ok);
00079 Q_ASSERT(!ok || v.toString() == variant.toString());
00080 } break;
00081 case QVariant::LongLong: {
00082 v = variant.toLongLong(&ok);
00083 Q_ASSERT(!ok || v.toString() == variant.toString());
00084 } break;
00085 case QVariant::ULongLong: {
00086 v = variant.toULongLong(&ok);
00087 Q_ASSERT(!ok || v.toString() == variant.toString());
00088 } break;
00089 case QVariant::Double: {
00090 v = variant.toDouble(&ok);
00091 Q_ASSERT(!ok || v.toString() == variant.toString());
00092 } break;
00093 case QVariant::String: {
00094 ok = true;
00095 v = variant.toString();
00096 } break;
00097 default: {
00098
00099 ok = v.cast(type);
00100 kdWarning()<<"MacroItem::Private::cast() Unhandled ok="<<ok<<" type="<<type<<" value="<<v<<endl;
00101 } break;
00102 }
00103
00104 return ok ? v : variant;
00105 }
00106
00107 };
00108
00109 }
00110
00111 MacroItem::MacroItem()
00112 : KShared()
00113 , d( new Private() )
00114 {
00115 }
00116
00117 MacroItem::~MacroItem()
00118 {
00119 delete d;
00120 }
00121
00122 QString MacroItem::comment() const
00123 {
00124 return d->comment;
00125 }
00126
00127 void MacroItem::setComment(const QString& comment)
00128 {
00129 d->comment = comment;
00130 }
00131
00132 KSharedPtr<Action> MacroItem::action() const
00133 {
00134 return d->action;
00135 }
00136
00137 void MacroItem::setAction(KSharedPtr<Action> action)
00138 {
00139 d->action = action;
00140 }
00141
00142 QVariant MacroItem::variant(const QString& name, bool checkaction) const
00143 {
00144 KSharedPtr<Variable> v = variable(name, checkaction);
00145 return v.data() ? v->variant() : QVariant();
00146 }
00147
00148 KSharedPtr<Variable> MacroItem::variable(const QString& name, bool checkaction) const
00149 {
00150 if(d->variables.contains(name))
00151 return d->variables[name];
00152 if(checkaction && d->action.data())
00153 return d->action->variable(name);
00154 return KSharedPtr<Variable>(0);
00155 }
00156
00157 Variable::Map MacroItem::variables() const
00158 {
00159 return d->variables;
00160 }
00161
00162 bool MacroItem::setVariant(const QString& name, const QVariant& variant)
00163 {
00164
00165
00166 KSharedPtr<Variable> actionvariable = d->action ? d->action->variable(name) : KSharedPtr<Variable>(0);
00167
00168
00169
00170 const QVariant v = actionvariable.data()
00171 ? d->cast(variant, actionvariable->variant().type())
00172 : variant;
00173
00174
00175 KSharedPtr<Variable> variable = d->variables[name];
00176 if(! variable.data()) {
00177
00178 kdDebug() << "MacroItem::setVariable() Creating new variable name=" << name << endl;
00179
00180 variable = KSharedPtr<Variable>( new Variable() );
00181 variable->setName(name);
00182 d->variables.replace(name, variable);
00183 }
00184
00185
00186 const QVariant oldvar = variable->variant();
00187
00188
00189 variable->setVariant(v);
00190
00191
00192
00193
00194 if(d->action && ! d->action->notifyUpdated(this, name)) {
00195 kdWarning() << "MacroItem::setVariable() Notify failed for variable name=" << name << endl;
00196 variable->setVariant(oldvar);
00197 return false;
00198 }
00199
00200
00201 return true;
00202 }
00203
00204 KSharedPtr<Variable> MacroItem::addVariable(const QString& name, const QVariant& variant)
00205 {
00206 Q_ASSERT(! d->variables.contains(name) );
00207
00208 KSharedPtr<Variable> variable = KSharedPtr<Variable>( new Variable() );
00209 variable->setName(name);
00210
00211
00212 d->variables.replace(name, variable);
00213
00214
00215 this->setVariant(name, variant);
00216 return variable;
00217 }
|