File indexing completed on 2024-06-02 04:34:46

0001 /***************************************************************************
0002                           datastscalar.cpp  -  a scalar from a data source
0003                              -------------------
0004     begin                : September, 2008
0005     copyright            : (C) 2008 by cbn
0006     email                : netterfield@astro.utoronto.ca
0007  ***************************************************************************/
0008 
0009 /***************************************************************************
0010  *                                                                         *
0011  *   This program is free software; you can redistribute it and/or modify  *
0012  *   it under the terms of the GNU General Public License as published by  *
0013  *   the Free Software Foundation; either version 2 of the License, or     *
0014  *   (at your option) any later version.                                   *
0015  *                                                                         *
0016  ***************************************************************************/
0017 #include "datascalar.h"
0018 
0019 #include <QDebug>
0020 #include <QTextDocument>
0021 #include <QXmlStreamWriter>
0022 
0023 
0024 #include "debug.h"
0025 #include "objectstore.h"
0026 #include "scalarscriptinterface.h"
0027 
0028 namespace Kst {
0029 
0030 const QString DataScalar::staticTypeString = "Data Scalar";
0031 const QString DataScalar::staticTypeTag = "datascalar";
0032 
0033 /** Create a DataVector: raw data from a file */
0034 DataScalar::DataScalar(ObjectStore *store)
0035 : Scalar(store), DataPrimitive(this) {
0036 
0037   setOrphan(true);
0038 }
0039 
0040 
0041 DataScalar::~DataScalar() {
0042 }
0043 
0044 
0045 QString DataScalar::_automaticDescriptiveName() const {
0046   QString name = _field;
0047 
0048   // un-escape escaped special characters so they aren't escaped 2x.
0049   name.replace("\\_", "_").replace("\\^","^").replace("\\[", "[").replace("\\]", "]");
0050   // now escape the special characters.
0051   name.replace('_', "\\_").replace('^', "\\^").replace('[', "\\[").replace(']', "\\]");
0052 
0053   return name;
0054 }
0055 
0056 
0057 const QString& DataScalar::typeString() const {
0058   return staticTypeString;
0059 }
0060 
0061 ScriptInterface* DataScalar::createScriptInterface() {
0062   return new ScalarDataSI(this);
0063 }
0064 
0065 
0066 /** return true if it has a valid file and field, or false otherwise */
0067 bool DataScalar::isValid() const {
0068   if (dataSource()) {
0069     dataSource()->readLock();
0070     bool rc = dataSource()->scalar().isValid(_field);
0071     dataSource()->unlock();
0072     return rc;
0073   }
0074   return false;
0075 }
0076 
0077 bool DataScalar::checkValidity(const DataSourcePtr& ds) const {
0078   if (ds) {
0079     ds->readLock();
0080     bool rc = ds->scalar().isValid(_field);
0081     ds->unlock();
0082     return rc;
0083   }
0084   return false;
0085 }
0086 
0087 void DataScalar::change(DataSourcePtr in_file, const QString &in_field) {
0088   Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED);
0089 
0090   _field = in_field;
0091   setDataSource(in_file);
0092 }
0093 
0094 void DataScalar::changeFile(DataSourcePtr in_file) {
0095   Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED);
0096 
0097   if (!in_file) {
0098     Debug::self()->log(tr("Data file for scalar %1 was not opened.").arg(Name()), Debug::Warning);
0099   }
0100   setDataSource(in_file);
0101 }
0102 
0103 
0104 /** Save data scalar information */
0105 void DataScalar::save(QXmlStreamWriter &s) {
0106   if (dataSource()) {
0107     s.writeStartElement("datascalar");
0108     saveFilename(s);
0109     s.writeAttribute("field", _field);
0110 
0111     saveNameInfo(s, SCALARNUM);
0112     s.writeEndElement();
0113   }
0114 }
0115 
0116 
0117 /** Update a data Scalar */
0118 void DataScalar::internalUpdate() {
0119   if (dataSource()) {
0120     dataSource()->writeLock();
0121     ReadInfo readInfo(&_value);
0122     dataSource()->scalar().read(_field, readInfo);
0123     dataSource()->unlock();
0124   }
0125 }
0126 
0127 
0128 PrimitivePtr DataScalar::makeDuplicate() const {
0129   Q_ASSERT(store());
0130   DataScalarPtr scalar = store()->createObject<DataScalar>();
0131 
0132   scalar->writeLock();
0133   scalar->change(dataSource(), _field);
0134   if (descriptiveNameIsManual()) {
0135     scalar->setDescriptiveName(descriptiveName());
0136   }
0137 
0138   scalar->registerChange();
0139   scalar->unlock();
0140 
0141   return kst_cast<Primitive>(scalar);
0142 }
0143 
0144 qint64 DataScalar::minInputSerial() const {
0145   if (dataSource()) {
0146     return (dataSource()->serial());
0147   }
0148   return LLONG_MAX;
0149 }
0150 
0151 qint64 DataScalar::maxInputSerialOfLastChange() const {
0152   if (dataSource()) {
0153     return (dataSource()->serialOfLastChange());
0154   }
0155   return NoInputs;
0156 }
0157 
0158 QString DataScalar::descriptionTip() const {
0159   QString IDstring;
0160 
0161   IDstring = tr(
0162       "Data Scalar: %1 = %4\n"
0163       "  %2\n"
0164       "  Field: %3"
0165   ).arg(Name()).arg(dataSource()->fileName()).arg(_field).arg(value());
0166   return IDstring;
0167 }
0168 
0169 
0170 QString DataScalar::propertyString() const {
0171   return tr("%2 of %1 = %3").arg(dataSource()->fileName()).arg(_field).arg(value());
0172 }
0173 
0174 void DataScalar::reload() {
0175   Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED);
0176 
0177   if (dataSource()) {
0178     dataSource()->writeLock();
0179     dataSource()->reset();
0180     dataSource()->unlock();
0181     reset();
0182     registerChange();
0183   }
0184 }
0185 
0186 void DataScalar::reset() {
0187     ReadInfo readInfo(&_value);
0188     dataSource()->scalar().read(_field, readInfo);
0189 }
0190 
0191 }
0192 // vim: ts=2 sw=2 et