Chris@392: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
Chris@392: 
Chris@392: /*
Chris@392:     Sonic Visualiser
Chris@392:     An audio file viewer and annotation editor.
Chris@392:     Centre for Digital Music, Queen Mary, University of London.
Chris@392:     This file copyright 2006 Chris Cannam.
Chris@392:     
Chris@392:     This program is free software; you can redistribute it and/or
Chris@392:     modify it under the terms of the GNU General Public License as
Chris@392:     published by the Free Software Foundation; either version 2 of the
Chris@392:     License, or (at your option) any later version.  See the file
Chris@392:     COPYING included with this distribution for more information.
Chris@392: */
Chris@392: 
Chris@392: #ifndef _CSV_FORMAT_H_
Chris@392: #define _CSV_FORMAT_H_
Chris@392: 
Chris@392: #include <QString>
Chris@392: #include <QStringList>
Chris@392: 
Chris@1047: #include "base/BaseTypes.h"
Chris@1047: 
Chris@392: class CSVFormat
Chris@392: {
Chris@392: public:
Chris@392:     enum ModelType {
Chris@392: 	OneDimensionalModel,
Chris@392: 	TwoDimensionalModel,
Chris@628:         TwoDimensionalModelWithDuration,
Chris@897:         TwoDimensionalModelWithDurationAndPitch,
Chris@392: 	ThreeDimensionalModel
Chris@392:     };
Chris@392:     
Chris@392:     enum TimingType {
Chris@392: 	ExplicitTiming,
Chris@392: 	ImplicitTiming
Chris@392:     };
Chris@628: 
Chris@392:     enum TimeUnits {
Chris@392: 	TimeSeconds,
Chris@990:         TimeMilliseconds,
Chris@392: 	TimeAudioFrames,
Chris@990: 	TimeWindows,
Chris@392:     };
Chris@392: 
Chris@629:     enum ColumnPurpose {
Chris@629:         ColumnUnknown,
Chris@629:         ColumnStartTime,
Chris@629:         ColumnEndTime,
Chris@629:         ColumnDuration,
Chris@629:         ColumnValue,
Chris@897:         ColumnPitch,
Chris@629:         ColumnLabel
Chris@629:     };
Chris@629: 
Chris@629:     enum ColumnQuality {
Chris@1021:         ColumnNumeric    = 1,
Chris@1021:         ColumnIntegral   = 2,
Chris@1021:         ColumnIncreasing = 4,
Chris@1021:         ColumnLarge      = 8,
Chris@1021:         ColumnNearEmpty  = 16,
Chris@629:     };
Chris@629:     typedef unsigned int ColumnQualities;
Chris@392: 
Chris@392:     CSVFormat() : // arbitrary defaults
Chris@392:         m_modelType(TwoDimensionalModel),
Chris@392:         m_timingType(ExplicitTiming),
Chris@392:         m_timeUnits(TimeSeconds),
Chris@392:         m_separator(","),
Chris@392:         m_sampleRate(44100),
Chris@392:         m_windowSize(1024),
Chris@629:         m_columnCount(0),
Chris@629:         m_variableColumnCount(false),
Chris@629:         m_allowQuoting(true),
Chris@629:         m_maxExampleCols(0)
Chris@392:     { }
Chris@629: 
Chris@629:     CSVFormat(QString path); // guess format
Chris@629: 
Chris@629:     /**
Chris@629:      * Guess the format of the given CSV file, setting the fields in
Chris@629:      * this object accordingly.  If the current separator is the empty
Chris@629:      * string, the separator character will also be guessed; otherwise
Chris@629:      * the current separator will be used.  The other properties of
Chris@629:      * this object will be set according to guesses from the file.
Chris@629:      */
Chris@629:     void guessFormatFor(QString path);
Chris@628:  
Chris@628:     ModelType    getModelType()     const { return m_modelType;     }
Chris@628:     TimingType   getTimingType()    const { return m_timingType;    }
Chris@628:     TimeUnits    getTimeUnits()     const { return m_timeUnits;     }
Chris@1047:     sv_samplerate_t getSampleRate() const { return m_sampleRate;    }
Chris@929:     int          getWindowSize()    const { return m_windowSize;    }
Chris@630:     int          getColumnCount()   const { return m_columnCount;   }
Chris@631:     bool         getAllowQuoting()  const { return m_allowQuoting;  }
Chris@631:     QChar        getSeparator()     const { 
Chris@631:         if (m_separator == "") return ' ';
Chris@631:         else return m_separator[0];
Chris@631:     }
Chris@630: 
Chris@628:     void setModelType(ModelType t)        { m_modelType    = t; }
Chris@628:     void setTimingType(TimingType t)      { m_timingType   = t; }
Chris@628:     void setTimeUnits(TimeUnits t)        { m_timeUnits    = t; }
Chris@631:     void setSeparator(QChar s)            { m_separator    = s; }
Chris@1047:     void setSampleRate(sv_samplerate_t r) { m_sampleRate   = r; }
Chris@1009:     void setWindowSize(int s)             { m_windowSize   = s; }
Chris@630:     void setColumnCount(int c)            { m_columnCount  = c; }
Chris@631:     void setAllowQuoting(bool q)          { m_allowQuoting = q; }
Chris@392: 
Chris@631:     QList<ColumnPurpose> getColumnPurposes() const { return m_columnPurposes; }
Chris@629:     void setColumnPurposes(QList<ColumnPurpose> cl) { m_columnPurposes = cl; }
Chris@631: 
Chris@631:     ColumnPurpose getColumnPurpose(int i);
Chris@631:     ColumnPurpose getColumnPurpose(int i) const;
Chris@631:     void setColumnPurpose(int i, ColumnPurpose p);
Chris@392:     
Chris@629:     // read-only; only valid if format has been guessed:
Chris@629:     QList<ColumnQualities> getColumnQualities() const { return m_columnQualities; }
Chris@629: 
Chris@629:     // read-only; only valid if format has been guessed:
Chris@392:     QList<QStringList> getExample() const { return m_example; }
Chris@392:     int getMaxExampleCols() const { return m_maxExampleCols; }
Chris@631: 	
Chris@392: protected:
Chris@628:     ModelType    m_modelType;
Chris@628:     TimingType   m_timingType;
Chris@628:     TimeUnits    m_timeUnits;
Chris@628:     QString      m_separator;
Chris@1047:     sv_samplerate_t m_sampleRate;
Chris@929:     int          m_windowSize;
Chris@392: 
Chris@629:     int          m_columnCount;
Chris@629:     bool         m_variableColumnCount;
Chris@629: 
Chris@629:     QList<ColumnQualities> m_columnQualities;
Chris@629:     QList<ColumnPurpose> m_columnPurposes;
Chris@629: 
Chris@629:     QList<float> m_prevValues;
Chris@629: 
Chris@629:     bool m_allowQuoting;
Chris@392: 
Chris@392:     QList<QStringList> m_example;
Chris@392:     int m_maxExampleCols;
Chris@629: 
Chris@629:     void guessSeparator(QString line);
Chris@629:     void guessQualities(QString line, int lineno);
Chris@629:     void guessPurposes();
Chris@629: 
Chris@629:     void guessFormatFor_Old(QString path);
Chris@629:  
Chris@392: };
Chris@392: 
Chris@392: #endif