Go to the documentation of this file.00001 #ifndef TEXTFILEMODEL_H
00002 #define TEXTFILEMODEL_H
00003
00004 #include <QAbstractTableModel>
00005 #include <QScopedPointer>
00006 #include <QFile>
00007 #include <QRegExp>
00008 #include <QVector>
00009 #include <QTextStream>
00010
00011 #include "tagcontainer.h"
00012
00013
00020 class ImportFileModel : public QAbstractTableModel
00021 {
00022 Q_OBJECT
00023 public:
00024 ImportFileModel(QObject *parent = 0);
00025 bool setFile(const QString &path);
00026 int rowCount(const QModelIndex & parent = QModelIndex()) const;
00027 int columnCount( const QModelIndex & parent = QModelIndex()) const;
00028 QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
00029 QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
00030 bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex & parent);
00031 Qt::DropActions supportedDropActions() const;
00032 Qt::ItemFlags flags(const QModelIndex &index) const;
00033 QStringList mimeTypes() const;
00034 void setSkipLinesCount(int newSkipLinesCount);
00035 void setDelimiter(QRegExp newDelimiter);
00036 void setMergeOnSplits(QVector<int> &mergeOnSplits);
00037 void setRowFilter(const QRegExp ®Exp);
00038 void unloadFile();
00039
00040 public slots:
00041 void setLimitedPreview(bool setLimitedPreview);
00042 void slot_syncFileParserWithTagContainer(TagContainer::GeneralTag tag, QString attrib);
00043
00044 private slots:
00045 void loadFile();
00046
00047 signals:
00048 void signal_maxColumns_changed(int oldValue, int newvalue);
00049 void signal_itemDropped(int column, TagContainer::ColumnTag role, QVariant data);
00050
00051 private:
00052 QScopedPointer<QFile> file;
00053 QScopedPointer<QTextStream> stream;
00054
00055 QRegExp delimiter;
00056 int skipLines;
00057 QVector<int> mergeOnSplits;
00058 QRegExp rowFilter;
00059
00060 int maxColumns;
00061 bool limitedPreview;
00062
00063 QVector<QStringList> preview;
00064 };
00065
00066 class StrategySettings;
00067
00075 class Strategy
00076 {
00077 public:
00078 enum StrategyType{
00079 StrategyNone,
00080 StrategyTimestamp,
00081 StrategySensorData,
00082 StrategySensorSqlData
00083 };
00084 enum StrategyFormatTypes {
00085 FormatTimestamp,
00086 FormatOffset,
00087 FormatFactor,
00088 FormatUnitIdFrom,
00089 FormatTreeId
00090 };
00091
00092 Strategy(StrategySettings &settings);
00093 virtual const QVariant process(const QVariant &input) const;
00094 virtual void reconfigure();
00095 virtual Strategy::StrategyType name() const;
00096
00097 protected:
00098 QVariant &setting(const Strategy::StrategyFormatTypes &fType) const;
00099
00100 private:
00101 StrategySettings &m_settings;
00102 };
00103
00107 class StrategySettings : public QHash<Strategy::StrategyFormatTypes, QVariant> {};
00108
00109 #include "simpleparser.h"
00110 #include "unitconvertor.h"
00111
00119 class TimestampStrategy : public Strategy
00120 {
00121 public:
00122 TimestampStrategy(StrategySettings &settings);
00123 const QVariant process(const QVariant &input) const;
00124 void reconfigure();
00125 Strategy::StrategyType name() const;
00126
00127 private:
00128 QString format;
00129 SimpleParser parser;
00130 };
00131
00136 class DataStrategy : public Strategy
00137 {
00138 public:
00139 DataStrategy(StrategySettings &settings);
00140 const QVariant process(const QVariant &input) const;
00141 void reconfigure();
00142 Strategy::StrategyType name() const;
00143
00144 protected:
00145 UnitConvertor &unitConvertor();
00146
00147 private:
00148 UnitConvertor unitConvert;
00149 };
00150
00155 class SqlDataStrategy : public DataStrategy
00156 {
00157 public:
00158 SqlDataStrategy(StrategySettings &settings);
00159 void reconfigure();
00160 Strategy::StrategyType name() const;
00161 };
00162
00164
00170 class Processor
00171 {
00172 public:
00173 Processor();
00174 Processor(const Processor &original);
00175 ~Processor();
00176 const QVariant operator()(const QVariant &input) const ;
00177 void setStrategy(const Strategy::StrategyType &type);
00178 void setStrategyFormat(const QVariant & data, const Strategy::StrategyFormatTypes & fType);
00179 const Strategy::StrategyType currentStrategy() const;
00180
00181 private:
00182 Strategy *strategy;
00183 StrategySettings m_settings;
00184 };
00185
00186 #include <QVector>
00187
00191 class ImportFileProcessorModel : public ImportFileModel
00192 {
00193 Q_OBJECT
00194 public:
00195 ImportFileProcessorModel (QObject *parent = 0);
00196 QVariant data(const QModelIndex & index, int role = Qt::DisplayRole ) const;
00197
00198 public slots:
00199 void slot_syncProcessorWithTagContainer(int column, TagContainer::ColumnTag tag, QVariant data);
00200 void slot_maxColumns_changed(int oldValue, int newValue);
00201
00202 private:
00203 void processorCountAdjust(int &column);
00204
00205 private:
00206 QVector<Processor> processors;
00207 };
00208
00209 #include <QFrame>
00210
00211 class QComboBox;
00212 class QVBoxLayout;
00213 class QLineEdit;
00214 class QLabel;
00215 class UnitComboBox;
00216
00220 class ImportFileHeaderSection : public QFrame
00221 {
00222 Q_OBJECT
00223 public:
00224 ImportFileHeaderSection(int column, QWidget *parent = 0);
00225 void adjustContent(const TagContainer::ColumnTag &role, const QVariant &data);
00226
00227 private slots:
00228 void slot_dataUnitTypeAssigned(int index);
00229 void slot_dataTypeAssigned(int index);
00230 void slot_timestampFormatChanged(QString data);
00231
00232 signals:
00233 void signal_userInteraction(int logicalIndex, TagContainer::ColumnTag tag, QVariant change);
00234
00235 private:
00236 void setupConnections();
00237 void setupUnitConversionLabel();
00238
00239 private:
00240 int logicalIndex;
00241
00242 QComboBox *dataTypeComboBox;
00243 QLineEdit *timestampFormatEditor;
00244 UnitComboBox *unitComboBox;
00245 QLabel *unitConversionLabel;
00246 QVBoxLayout *dataTypeLayout;
00247 QVBoxLayout *mainLayout;
00248
00249 QLabel *sectionName;
00250 QString defaultSectionName;
00251
00252 };
00253
00254 #include <QHeaderView>
00255 #include <QHash>
00256 #include <QPointer>
00257
00258 class ImportFileHeaderSection;
00259
00263 class ImportFileHeader : public QHeaderView
00264 {
00265 Q_OBJECT
00266 public:
00267 ImportFileHeader(QWidget *parent = 0);
00268 void setModel(ImportFileProcessorModel *model);
00269 ImportFileProcessorModel *model() const;
00270 void addSection(const int column);
00271 void deleteSection(const int column);
00272 bool sectionExists(const int column) const;
00273 QWidget *const sectionAt(const int column);
00274 int count() const;
00275 QSize sectionSizeFromContents(int logicalIndex) const;
00276
00277 public slots:
00278 void slot_syncSectionWithTagContainer(int section, TagContainer::ColumnTag columnTag, QVariant data);
00279
00280 private slots:
00281 void sectionCountAdjust(int oldCount, int newCount);
00282 void slot_sectionUserInteraction(int column, TagContainer::ColumnTag role, QVariant data);
00283
00284 protected:
00285 void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
00286
00287 signals:
00288 void signal_userInteraction(int column, TagContainer::ColumnTag role, QVariant data);
00289
00290 private:
00291 QHash< int, QPointer<ImportFileHeaderSection> > sections;
00292 };
00293
00294 #include <QTableView>
00295
00299 class ImportFileView : public QTableView
00300 {
00301 Q_OBJECT
00302 public:
00303 ImportFileView(QWidget *parent = 0, TagContainer *tagContainer = 0);
00304 void setModel(ImportFileProcessorModel *model);
00305 ImportFileProcessorModel *model();
00306 ImportFileHeader *horizontalHeader();
00307 TagContainer *tagContainer();
00308 void dragMoveEvent(QDragMoveEvent *event);
00309 void dragLeaveEvent(QDragLeaveEvent *event);
00310 QMenu *contextMenu();
00311 void setupAsPreviewer(QString &spCode);
00312
00313 private:
00314 void contextMenuEvent(QContextMenuEvent *event);
00315 void setupConnections();
00316
00317 private:
00318 QMenu *menu;
00319 TagContainer *m_tagContainer;
00320 };
00321
00322 #endif // TEXTFILEMODEL_H