QGIS API Documentation  master-59fd5e0
src/core/qgsfield.h
Go to the documentation of this file.
00001 /***************************************************************************
00002                qgsfield.h - Describes a field in a layer or table
00003                      --------------------------------------
00004                Date                 : 01-Jan-2004
00005                Copyright            : (C) 2004 by Gary E.Sherman
00006                email                : sherman at mrcc.com
00007  ***************************************************************************
00008  *                                                                         *
00009  *   This program is free software; you can redistribute it and/or modify  *
00010  *   it under the terms of the GNU General Public License as published by  *
00011  *   the Free Software Foundation; either version 2 of the License, or     *
00012  *   (at your option) any later version.                                   *
00013  *                                                                         *
00014  ***************************************************************************/
00015 
00016 #ifndef QGSFIELD_H
00017 #define QGSFIELD_H
00018 
00019 #include <QString>
00020 #include <QVariant>
00021 #include <QVector>
00022 
00029 class CORE_EXPORT QgsField
00030 {
00031   public:
00044     QgsField( QString name = QString(),
00045               QVariant::Type type = QVariant::Invalid,
00046               QString typeName = QString(),
00047               int len = 0,
00048               int prec = 0,
00049               QString comment = QString() );
00050 
00052     ~QgsField();
00053 
00054     bool operator==( const QgsField& other ) const;
00055     bool operator!=( const QgsField& other ) const;
00056 
00058     const QString & name() const;
00059 
00061     QVariant::Type type() const;
00062 
00069     const QString & typeName() const;
00070 
00071 
00076     int length() const;
00077 
00078 
00083     int precision() const;
00084 
00088     const QString & comment() const;
00089 
00094     void setName( const QString & nam );
00095 
00099     void setType( QVariant::Type type );
00100 
00105     void setTypeName( const QString & typ );
00106 
00111     void setLength( int len );
00112 
00117     void setPrecision( int prec );
00118 
00119 
00123     void setComment( const QString & comment );
00124 
00126     QString displayString( const QVariant& v ) const;
00127 
00128   private:
00129 
00131     QString mName;
00132 
00134     QVariant::Type mType;
00135 
00137     QString mTypeName;
00138 
00140     int mLength;
00141 
00143     int mPrecision;
00144 
00146     QString mComment;
00147 
00148 }; // class QgsField
00149 
00150 // key = field index, value=field data
00151 typedef QMap<int, QgsField> QgsFieldMap;
00152 
00153 
00154 
00155 class CORE_EXPORT QgsFields
00156 {
00157   public:
00158 
00159     enum FieldOrigin { OriginUnknown, OriginProvider, OriginJoin, OriginEdit };
00160     typedef struct Field
00161     {
00162       Field(): origin( OriginUnknown ), originIndex( -1 ) {}
00163       Field( const QgsField& f, FieldOrigin o, int oi ): field( f ), origin( o ), originIndex( oi ) {}
00164 
00165       QgsField field;
00166       FieldOrigin origin; // TODO[MD]: originIndex or QVariant originID?
00167       int originIndex;
00168     } Field;
00169 
00170     void clear() { mFields.clear(); mNameToIndex.clear(); }
00172     bool append( const QgsField& field, FieldOrigin origin = OriginProvider, int originIndex = -1 )
00173     {
00174       if ( mNameToIndex.contains( field.name() ) )
00175         return false;
00176 
00177       if ( originIndex == -1 && origin == OriginProvider )
00178         originIndex = mFields.count();
00179       mFields.append( Field( field, origin, originIndex ) );
00180 
00181       mNameToIndex.insert( field.name(), mFields.count() - 1 );
00182       return true;
00183     }
00184     void remove( int fieldIdx ) { mNameToIndex.remove( mFields[fieldIdx].field.name() ); mFields.remove( fieldIdx ); }
00185 
00186     inline bool isEmpty() const { return mFields.isEmpty(); }
00187     inline int count() const { return mFields.count(); }
00188     inline int size() const { return mFields.count(); } // TODO[MD]: delete?
00189     void extend( const QgsFields& other )
00190     {
00191       for ( int i = 0; i < other.count(); ++i )
00192       {
00193         append( other.at( i ), other.fieldOrigin( i ), other.fieldOriginIndex( i ) );
00194       }
00195     }
00196     inline const QgsField& operator[]( int i ) const { return mFields[i].field; }
00197     inline QgsField& operator[]( int i ) { return mFields[i].field; }
00198     const QgsField& at( int i ) const { return mFields[i].field; }
00199     QList<QgsField> toList() const { QList<QgsField> lst; for ( int i = 0; i < mFields.count(); ++i ) lst.append( mFields[i].field ); return lst; } // TODO[MD]: delete?
00200 
00201     const QgsField& field( int fieldIdx ) const { return mFields[fieldIdx].field; }
00202     const QgsField& field( const QString& name ) const { return mFields[ indexFromName( name )].field; }
00203     FieldOrigin fieldOrigin( int fieldIdx ) const { return mFields[fieldIdx].origin; }
00204     int fieldOriginIndex( int fieldIdx ) const { return mFields[fieldIdx].originIndex; }
00205 
00206     int indexFromName( const QString& name ) const { return mNameToIndex.value( name, -1 ); }
00207 
00208   protected:
00209     QVector<Field> mFields;
00210 
00212     QHash<QString, int> mNameToIndex;
00213 };
00214 
00215 
00216 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines