1
/***************************************************************************
5
copyright : (C) 2005 The University of Toronto
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU General Public License as published by *
13
* the Free Software Foundation; either version 2 of the License, or *
14
* (at your option) any later version. *
16
***************************************************************************/
18
#include "bind_datamatrix.h"
19
#include "bind_datasource.h"
21
#include <kstdatasource.h>
22
#include <kstdatacollection.h>
26
KstBindDataMatrix::KstBindDataMatrix(KJS::ExecState *exec, KstRMatrixPtr v)
27
: KstBindMatrix(exec, v.data(), "DataMatrix") {
33
KstBindDataMatrix::KstBindDataMatrix(KJS::ExecState *exec, KJS::Object *globalObject)
34
: KstBindMatrix(exec, globalObject, "DataMatrix") {
40
KstBindDataMatrix::KstBindDataMatrix(int id)
41
: KstBindMatrix(id, "DataMatrix Method") {
45
KstBindDataMatrix::~KstBindDataMatrix() {
49
inline int d2i(double x) {
50
return int(floor(x+0.5));
54
KJS::Object KstBindDataMatrix::construct(KJS::ExecState *exec, const KJS::List& args) {
57
KstDataSourcePtr dp = extractDataSource(exec, args[0]);
58
// Constructor: DataMatrix(DataSource, field)
59
if (args.size() == 2) {
60
if (args[1].type() != KJS::StringType) {
61
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
62
exec->setException(eobj);
66
QString field = args[1].toString(exec).qstring();
68
v = new KstRMatrix(dp, field, QString::null, 0, 0, -1, -1, false, false, -1);
69
KST::addMatrixToList(KstMatrixPtr(v));
72
// Constructor: DataMatrix(DataSource, field, xStart, yStart, xCount, yCount)
73
if (args.size() == 6) {
74
if (args[1].type() != KJS::StringType ||
75
args[2].type() != KJS::NumberType ||
76
args[3].type() != KJS::NumberType ||
77
args[4].type() != KJS::NumberType ||
78
args[5].type() != KJS::NumberType) {
79
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
80
exec->setException(eobj);
84
QString field = args[1].toString(exec).qstring();
85
int xStart = d2i(args[2].toNumber(exec));
86
int yStart = d2i(args[3].toNumber(exec));
87
int xCount = d2i(args[4].toNumber(exec));
88
int yCount = d2i(args[5].toNumber(exec));
90
v = new KstRMatrix(dp, field, QString::null, xStart, yStart, xCount, yCount,false, false, -1);
91
KST::addMatrixToList(KstMatrixPtr(v));
94
// Constructor: DataMatrix(DataSource, field, xStart, yStart, xCount, yCount, skip)
95
if (args.size() == 7) {
96
if (args[1].type() != KJS::StringType ||
97
args[2].type() != KJS::NumberType ||
98
args[3].type() != KJS::NumberType ||
99
args[4].type() != KJS::NumberType ||
100
args[5].type() != KJS::NumberType ||
101
args[6].type() != KJS::NumberType) {
102
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
103
exec->setException(eobj);
104
return KJS::Object();
107
QString field = args[1].toString(exec).qstring();
108
int xStart = d2i(args[2].toNumber(exec));
109
int yStart = d2i(args[3].toNumber(exec));
110
int xCount = d2i(args[4].toNumber(exec));
111
int yCount = d2i(args[5].toNumber(exec));
112
int skip = d2i(args[6].toNumber(exec));
114
v = new KstRMatrix(dp, field, QString::null, xStart, yStart, xCount, yCount, false, true, skip);
115
KST::addMatrixToList(KstMatrixPtr(v));
119
// Constructor: DataMatrix(DataSource, field, xStart, yStart, xCount, yCount, skip, ave)
120
if (args.size() == 8) {
121
if (args[1].type() != KJS::StringType ||
122
args[2].type() != KJS::NumberType ||
123
args[3].type() != KJS::NumberType ||
124
args[4].type() != KJS::NumberType ||
125
args[5].type() != KJS::NumberType ||
126
args[6].type() != KJS::NumberType ||
127
args[7].type() != KJS::BooleanType) {
128
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
129
exec->setException(eobj);
130
return KJS::Object();
133
QString field = args[1].toString(exec).qstring();
134
int xStart = d2i(args[2].toNumber(exec));
135
int yStart = d2i(args[3].toNumber(exec));
136
int xCount = d2i(args[4].toNumber(exec));
137
int yCount = d2i(args[5].toNumber(exec));
138
int skip = d2i(args[6].toNumber(exec));
139
bool ave = d2i(args[7].toBoolean(exec));
141
v = new KstRMatrix(dp, field, QString::null, xStart, yStart, xCount, yCount, ave, true, skip);
142
KST::addMatrixToList(KstMatrixPtr(v));
146
KJS::Object eobj = KJS::Error::create(exec, KJS::SyntaxError);
147
exec->setException(eobj);
148
return KJS::Object();
151
return KJS::Object(new KstBindDataMatrix(exec, v));
155
struct DataMatrixBindings {
157
KJS::Value (KstBindDataMatrix::*method)(KJS::ExecState*, const KJS::List&);
161
struct DataMatrixProperties {
163
void (KstBindDataMatrix::*set)(KJS::ExecState*, const KJS::Value&);
164
KJS::Value (KstBindDataMatrix::*get)(KJS::ExecState*) const;
168
static DataMatrixBindings dataMatrixBindings[] = {
169
{ "changeFile", &KstBindDataMatrix::changeFile },
170
{ "change", &KstBindDataMatrix::change },
171
{ "reload", &KstBindDataMatrix::reload },
176
static DataMatrixProperties dataMatrixProperties[] = {
177
{ "valid", 0L, &KstBindDataMatrix::valid },
178
{ "skip", 0L, &KstBindDataMatrix::skip },
179
{ "boxcar", 0L, &KstBindDataMatrix::boxcar },
180
{ "xReadToEnd", 0L, &KstBindDataMatrix::xReadToEnd },
181
{ "yReadToEnd", 0L, &KstBindDataMatrix::yReadToEnd },
182
{ "xCountFromEnd", 0L, &KstBindDataMatrix::xCountFromEnd },
183
{ "yCountFromEnd", 0L, &KstBindDataMatrix::yCountFromEnd },
184
{ "skipLength", 0L, &KstBindDataMatrix::skipLength },
185
{ "field", 0L, &KstBindDataMatrix::field },
186
{ "dataSource", 0L, &KstBindDataMatrix::dataSource },
191
KJS::ReferenceList KstBindDataMatrix::propList(KJS::ExecState *exec, bool recursive) {
192
KJS::ReferenceList rc = KstBindMatrix::propList(exec, recursive);
194
for (int i = 0; dataMatrixProperties[i].name; ++i) {
195
rc.append(KJS::Reference(this, KJS::Identifier(dataMatrixProperties[i].name)));
202
bool KstBindDataMatrix::hasProperty(KJS::ExecState *exec, const KJS::Identifier& propertyName) const {
203
QString prop = propertyName.qstring();
204
for (int i = 0; dataMatrixProperties[i].name; ++i) {
205
if (prop == dataMatrixProperties[i].name) {
210
return KstBindMatrix::hasProperty(exec, propertyName);
214
void KstBindDataMatrix::put(KJS::ExecState *exec, const KJS::Identifier& propertyName, const KJS::Value& value, int attr) {
216
KstBindMatrix::put(exec, propertyName, value, attr);
220
QString prop = propertyName.qstring();
222
for (int i = 0; dataMatrixProperties[i].name; ++i) {
223
if (prop == dataMatrixProperties[i].name) {
224
if (!dataMatrixProperties[i].set) {
227
(this->*dataMatrixProperties[i].set)(exec, value);
232
KstBindMatrix::put(exec, propertyName, value, attr);
236
KJS::Value KstBindDataMatrix::get(KJS::ExecState *exec, const KJS::Identifier& propertyName) const {
238
return KstBindMatrix::get(exec, propertyName);
241
QString prop = propertyName.qstring();
242
for (int i = 0; dataMatrixProperties[i].name; ++i) {
243
if (prop == dataMatrixProperties[i].name) {
244
if (!dataMatrixProperties[i].get) {
247
return (this->*dataMatrixProperties[i].get)(exec);
251
return KstBindMatrix::get(exec, propertyName);
255
KJS::Value KstBindDataMatrix::call(KJS::ExecState *exec, KJS::Object& self, const KJS::List& args) {
258
KJS::Object eobj = KJS::Error::create(exec, KJS::GeneralError);
259
exec->setException(eobj);
260
return KJS::Undefined();
263
int start = KstBindMatrix::methodCount();
265
KstBindDataMatrix *imp = dynamic_cast<KstBindDataMatrix*>(self.imp());
267
KJS::Object eobj = KJS::Error::create(exec, KJS::GeneralError);
268
exec->setException(eobj);
269
return KJS::Undefined();
272
return (imp->*dataMatrixBindings[id - start - 1].method)(exec, args);
275
return KstBindMatrix::call(exec, self, args);
279
void KstBindDataMatrix::addBindings(KJS::ExecState *exec, KJS::Object& obj) {
280
int start = KstBindMatrix::methodCount();
281
for (int i = 0; dataMatrixBindings[i].name != 0L; ++i) {
282
KJS::Object o = KJS::Object(new KstBindDataMatrix(i + start + 1));
283
obj.put(exec, dataMatrixBindings[i].name, o, KJS::Function);
288
#define makeDataMatrix(X) dynamic_cast<KstRMatrix*>(const_cast<KstObject*>(X.data()))
290
KJS::Value KstBindDataMatrix::reload(KJS::ExecState *exec, const KJS::List& args) {
292
KstRMatrixPtr v = makeDataMatrix(_d);
294
KJS::Object eobj = KJS::Error::create(exec, KJS::GeneralError);
295
exec->setException(eobj);
296
return KJS::Undefined();
298
KstWriteLocker wl(v);
300
return KJS::Undefined();
304
KJS::Value KstBindDataMatrix::changeFile(KJS::ExecState *exec, const KJS::List& args) {
305
KstRMatrixPtr v = makeDataMatrix(_d);
307
KJS::Object eobj = KJS::Error::create(exec, KJS::GeneralError);
308
exec->setException(eobj);
309
return KJS::Undefined();
312
if (args.size() != 1) {
313
KJS::Object eobj = KJS::Error::create(exec, KJS::SyntaxError, "Requires exactly one argument.");
314
exec->setException(eobj);
315
return KJS::Undefined();
318
if (args[0].type() != KJS::ObjectType) {
319
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
320
exec->setException(eobj);
321
return KJS::Undefined();
324
KstBindDataSource *imp = dynamic_cast<KstBindDataSource*>(args[0].toObject(exec).imp());
326
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
327
exec->setException(eobj);
328
return KJS::Undefined();
331
#define makeSource(X) dynamic_cast<KstDataSource*>(const_cast<KstObject*>(X.data()))
332
KstDataSourcePtr s = makeSource(imp->_d);
334
KJS::Object eobj = KJS::Error::create(exec, KJS::GeneralError);
335
exec->setException(eobj);
336
return KJS::Undefined();
345
return KJS::Undefined();
349
KJS::Value KstBindDataMatrix::change(KJS::ExecState *exec, const KJS::List& args) {
350
KstRMatrixPtr v = makeDataMatrix(_d);
352
KJS::Object eobj = KJS::Error::create(exec, KJS::GeneralError);
353
exec->setException(eobj);
354
return KJS::Undefined();
357
if (args.size() > 3) {
358
if (args[0].type() != KJS::NumberType ||
359
args[1].type() != KJS::NumberType) {
360
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
361
exec->setException(eobj);
362
return KJS::Undefined();
365
KstWriteLocker wl(v);
366
int xStart = d2i(args[0].toNumber(exec));
367
int yStart = d2i(args[1].toNumber(exec));
368
int xCount = d2i(args[2].toNumber(exec));
369
int yCount = d2i(args[3].toNumber(exec));
370
int skip = v->doSkip() ? v->skip() : -1;
371
bool ave = v->doAverage();
373
if (args.size() > 4) {
374
if (args[4].type() != KJS::NumberType) {
375
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
376
exec->setException(eobj);
377
return KJS::Undefined();
380
skip = d2i(args[4].toNumber(exec));
382
if (args.size() > 5) {
383
if (args[5].type() != KJS::BooleanType) {
384
KJS::Object eobj = KJS::Error::create(exec, KJS::TypeError);
385
exec->setException(eobj);
386
return KJS::Undefined();
389
ave = d2i(args[5].toBoolean(exec));
393
v->change(v->dataSource(), v->field(), v->tagName(), xStart, yStart, xCount, yCount, skip, skip >= 0, ave);
394
return KJS::Undefined();
397
KJS::Object eobj = KJS::Error::create(exec, KJS::SyntaxError);
398
exec->setException(eobj);
399
return KJS::Undefined();
403
KJS::Value KstBindDataMatrix::valid(KJS::ExecState *exec) const {
405
KstRMatrixPtr v = makeDataMatrix(_d);
407
return KJS::Boolean(v->isValid());
411
KJS::Value KstBindDataMatrix::skip(KJS::ExecState *exec) const {
413
KstRMatrixPtr v = makeDataMatrix(_d);
415
return KJS::Boolean(v->doSkip());
419
KJS::Value KstBindDataMatrix::boxcar(KJS::ExecState *exec) const {
421
KstRMatrixPtr v = makeDataMatrix(_d);
423
return KJS::Boolean(v->doAverage());
427
KJS::Value KstBindDataMatrix::xReadToEnd(KJS::ExecState *exec) const {
429
KstRMatrixPtr v = makeDataMatrix(_d);
431
return KJS::Boolean(v->xReadToEnd());
435
KJS::Value KstBindDataMatrix::yReadToEnd(KJS::ExecState *exec) const {
437
KstRMatrixPtr v = makeDataMatrix(_d);
439
return KJS::Boolean(v->yReadToEnd());
443
KJS::Value KstBindDataMatrix::xCountFromEnd(KJS::ExecState *exec) const {
445
KstRMatrixPtr v = makeDataMatrix(_d);
447
return KJS::Boolean(v->xCountFromEnd());
451
KJS::Value KstBindDataMatrix::yCountFromEnd(KJS::ExecState *exec) const {
453
KstRMatrixPtr v = makeDataMatrix(_d);
455
return KJS::Boolean(v->yCountFromEnd());
459
KJS::Value KstBindDataMatrix::skipLength(KJS::ExecState *exec) const {
461
KstRMatrixPtr v = makeDataMatrix(_d);
463
return KJS::Number(v->skip());
467
KJS::Value KstBindDataMatrix::field(KJS::ExecState *exec) const {
469
KstRMatrixPtr v = makeDataMatrix(_d);
471
return KJS::String(v->field());
475
KJS::Value KstBindDataMatrix::dataSource(KJS::ExecState *exec) const {
476
KstRMatrixPtr v = makeDataMatrix(_d);
478
KstDataSourcePtr dp = v->dataSource();
480
return KJS::Undefined();
483
return KJS::Object(new KstBindDataSource(exec, dp));
486
#undef makeDataMatrix