00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "qgsprojectproperty.h"
00019 #include "qgslogger.h"
00020
00021 #include <QDomDocument>
00022 #include <QStringList>
00023
00024 static const char * const ident_ = "$Id$";
00025
00026
00027 void QgsPropertyValue::dump( size_t tabs ) const
00028 {
00029 QString tabString;
00030 tabString.fill( '\t', tabs );
00031
00032 if ( QVariant::StringList == value_.type() )
00033 {
00034 QStringList sl = value_.toStringList();
00035
00036 for ( QStringList::const_iterator i = sl.begin(); i != sl.end(); ++i )
00037 {
00038 QgsDebugMsg( QString( "%1[%2] " ).arg( tabString ).arg( *i ) );
00039 }
00040 }
00041 else
00042 {
00043 QgsDebugMsg( QString( "%1%2" ).arg( tabString ).arg( value_.toString() ) );
00044 }
00045 }
00046
00047
00048
00049 bool QgsPropertyValue::readXML( QDomNode & keyNode )
00050 {
00051
00052 QDomElement subkeyElement = keyNode.toElement();
00053
00054
00055 QString typeString = subkeyElement.attribute( "type" );
00056
00057 if ( QString::null == typeString )
00058 {
00059 QgsDebugMsg( QString( "null ``type'' attribute for %1" ).arg( keyNode.nodeName() ) );
00060
00061 return false;
00062 }
00063
00064
00065
00066 value_.clear();
00067
00068
00069 QVariant::Type type = QVariant::nameToType( typeString.toLocal8Bit().constData() );
00070
00071
00072
00073
00074
00075
00076
00077
00078 switch ( type )
00079 {
00080 case QVariant::Invalid:
00081 QgsDebugMsg( QString( "invalid value type %1 .. " ).arg( typeString ) );
00082 return false;
00083
00084 case QVariant::Map:
00085 QgsDebugMsg( "no support for QVariant::Map" );
00086 return false;
00087
00088 case QVariant::List:
00089 QgsDebugMsg( "no support for QVariant::List" );
00090 return false;
00091
00092 case QVariant::String:
00093 value_ = subkeyElement.text();
00094 break;
00095
00096 case QVariant::StringList:
00097 {
00098 int i = 0;
00099 QDomNodeList values = keyNode.childNodes();
00100
00101
00102 QStringList valueStringList;
00103
00104 while ( i < values.count() )
00105 {
00106 if ( "value" == values.item( i ).nodeName() )
00107 {
00108 valueStringList.append( values.item( i ).firstChild().nodeValue() );
00109 }
00110 else
00111 {
00112 QgsDebugMsg( QString( "non <value> element ``%1'' in string list" ).arg( values.item( i ).nodeName() ) );
00113 }
00114
00115 ++i;
00116 }
00117
00118 value_ = valueStringList;
00119 break;
00120 }
00121
00122 case QVariant::Font:
00123 QgsDebugMsg( "no support for QVariant::Font" );
00124 return false;
00125
00126 case QVariant::Pixmap:
00127 QgsDebugMsg( "no support for QVariant::Pixmap" );
00128 return false;
00129
00130 case QVariant::Brush:
00131 QgsDebugMsg( "no support for QVariant::Brush" );
00132 return false;
00133
00134 case QVariant::Rect:
00135 QgsDebugMsg( "no support for QVariant::Rect" );
00136 return false;
00137
00138 case QVariant::Size:
00139 QgsDebugMsg( "no support for QVariant::Size" );
00140 return false;
00141
00142 case QVariant::Color:
00143 QgsDebugMsg( "no support for QVariant::Color" );
00144 return false;
00145
00146 case QVariant::Palette:
00147 QgsDebugMsg( "no support for QVariant::Palette" );
00148 return false;
00149
00150 case QVariant::Point:
00151 QgsDebugMsg( "no support for QVariant::Point" );
00152 return false;
00153
00154 case QVariant::Image:
00155 QgsDebugMsg( "no support for QVariant::Image" );
00156 return false;
00157
00158 case QVariant::Int:
00159 value_ = QVariant( subkeyElement.text() ).toInt();
00160 break;
00161
00162 case QVariant::UInt:
00163 value_ = QVariant( subkeyElement.text() ).toUInt();
00164 break;
00165
00166 case QVariant::Bool:
00167 value_ = QVariant( subkeyElement.text() ).toBool();
00168 break;
00169
00170 case QVariant::Double:
00171 value_ = QVariant( subkeyElement.text() ).toDouble();
00172 break;
00173
00174 case QVariant::ByteArray:
00175 value_ = QVariant( subkeyElement.text() ).toByteArray();
00176 break;
00177
00178 case QVariant::Polygon:
00179 QgsDebugMsg( "no support for QVariant::Polygon" );
00180 return false;
00181
00182 case QVariant::Region:
00183 QgsDebugMsg( "no support for QVariant::Region" );
00184 return false;
00185
00186 case QVariant::Bitmap:
00187 QgsDebugMsg( "no support for QVariant::Bitmap" );
00188 return false;
00189
00190 case QVariant::Cursor:
00191 QgsDebugMsg( "no support for QVariant::Cursor" );
00192 return false;
00193
00194 case QVariant::BitArray :
00195 QgsDebugMsg( "no support for QVariant::BitArray" );
00196 return false;
00197
00198 case QVariant::KeySequence :
00199 QgsDebugMsg( "no support for QVariant::KeySequence" );
00200 return false;
00201
00202 case QVariant::Pen :
00203 QgsDebugMsg( "no support for QVariant::Pen" );
00204 return false;
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 default :
00219 QgsDebugMsg( QString( "unsupported value type %1 .. not propertly translated to QVariant" ).arg( typeString ) );
00220 }
00221
00222 return true;
00223
00224 }
00225
00226
00230 bool QgsPropertyValue::writeXML( QString const & nodeName,
00231 QDomElement & keyElement,
00232 QDomDocument & document )
00233 {
00234 QDomElement valueElement = document.createElement( nodeName );
00235
00236
00237 valueElement.setAttribute( "type", value_.typeName() );
00238
00239
00240
00241
00242
00243
00244 if ( QVariant::StringList == value_.type() )
00245 {
00246 QStringList sl = value_.toStringList();
00247
00248 for ( QStringList::iterator i = sl.begin();
00249 i != sl.end();
00250 ++i )
00251 {
00252 QDomElement stringListElement = document.createElement( "value" );
00253 QDomText valueText = document.createTextNode( *i );
00254 stringListElement.appendChild( valueText );
00255
00256 valueElement.appendChild( stringListElement );
00257 }
00258 }
00259 else
00260 {
00261 QDomText valueText = document.createTextNode( value_.toString() );
00262 valueElement.appendChild( valueText );
00263 }
00264
00265 keyElement.appendChild( valueElement );
00266
00267 return true;
00268 }
00269
00270
00271
00272
00273 QgsPropertyKey::QgsPropertyKey( QString const name )
00274 : mName( name )
00275 {}
00276
00277 QgsPropertyKey::~QgsPropertyKey()
00278 {
00279 clearKeys();
00280 }
00281
00282 QVariant QgsPropertyKey::value() const
00283 {
00284 QgsProperty * foundQgsProperty;
00285
00286 if ( 0 == ( foundQgsProperty = mProperties.value( name() ) ) )
00287 {
00288 return foundQgsProperty->value();
00289 }
00290 else
00291 {
00292 QgsDebugMsg( "key has null child" );
00293
00294 return QVariant();
00295 }
00296 }
00297
00298
00299 void QgsPropertyKey::dump( size_t tabs ) const
00300 {
00301 QString tabString;
00302
00303 tabString.fill( '\t', tabs );
00304
00305 QgsDebugMsg( QString( "%1name: %2" ).arg( tabString ).arg( name() ) );
00306
00307 tabs++;
00308 tabString.fill( '\t', tabs );
00309
00310 if ( ! mProperties.isEmpty() )
00311 {
00312 QHashIterator < QString, QgsProperty* > i( mProperties );
00313 while ( i.hasNext() )
00314 {
00315 if ( i.next().value()->isValue() )
00316 {
00317 QgsPropertyValue * propertyValue =
00318 dynamic_cast<QgsPropertyValue*>( i.value() );
00319
00320 if ( QVariant::StringList == propertyValue->value().type() )
00321 {
00322 QgsDebugMsg( QString( "%1key: <%2> value:" ).arg( tabString ).arg( i.key() ) );
00323 propertyValue->dump( tabs + 1 );
00324 }
00325 else
00326 {
00327 QgsDebugMsg( QString( "%1key: <%2> value: %3" ).arg( tabString ).arg( i.key() ).arg( propertyValue->value().toString() ) );
00328 }
00329 }
00330 else
00331 {
00332 QgsDebugMsg( QString( "%1key: <%2> subkey: <%3>" )
00333 .arg( tabString )
00334 .arg( i.key() )
00335 .arg( dynamic_cast<QgsPropertyKey*>( i.value() )->name() ) );
00336 i.value()->dump( tabs + 1 );
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 }
00351 }
00352
00353 }
00354
00355
00356
00357 bool QgsPropertyKey::readXML( QDomNode & keyNode )
00358 {
00359 int i = 0;
00360 QDomNodeList subkeys = keyNode.childNodes();
00361
00362 while ( i < subkeys.count() )
00363 {
00364
00365
00366
00367 if ( subkeys.item( i ).hasAttributes() &&
00368 subkeys.item( i ).isElement() &&
00369 subkeys.item( i ).toElement().hasAttribute( "type" ) )
00370 {
00371 delete mProperties.take( subkeys.item( i ).nodeName() );
00372 mProperties.insert( subkeys.item( i ).nodeName(), new QgsPropertyValue );
00373
00374 QDomNode subkey = subkeys.item( i );
00375
00376 if ( !mProperties[subkeys.item( i ).nodeName()]->readXML( subkey ) )
00377 {
00378 QgsDebugMsg( QString( "unable to parse key value %1" ).arg( subkeys.item( i ).nodeName() ) );
00379 }
00380 }
00381 else
00382
00383 {
00384 addKey( subkeys.item( i ).nodeName() );
00385
00386 QDomNode subkey = subkeys.item( i );
00387
00388 if ( !mProperties[subkeys.item( i ).nodeName()]->readXML( subkey ) )
00389 {
00390 QgsDebugMsg( QString( "unable to parse subkey %1" ).arg( subkeys.item( i ).nodeName() ) );
00391 }
00392 }
00393
00394 ++i;
00395 }
00396
00397 return true;
00398 }
00399
00400
00405 bool QgsPropertyKey::writeXML( QString const &nodeName, QDomElement & element, QDomDocument & document )
00406 {
00407
00408
00409
00410 QDomElement keyElement = document.createElement( nodeName );
00411
00412 if ( ! mProperties.isEmpty() )
00413 {
00414 QHashIterator < QString, QgsProperty* > i( mProperties );
00415 while ( i.hasNext() )
00416 {
00417 i.next();
00418 if ( !i.value()->writeXML( i.key(), keyElement, document ) )
00419 {
00420 return false;
00421 }
00422 }
00423 }
00424
00425 element.appendChild( keyElement );
00426
00427 return true;
00428 }
00429
00430
00431
00434 void QgsPropertyKey::entryList( QStringList & entries ) const
00435 {
00436
00437 QHashIterator < QString, QgsProperty* > i( mProperties );
00438 while ( i.hasNext() )
00439 {
00440
00441 if ( i.next().value()->isLeaf() )
00442 {
00443 entries.append( i.key() );
00444 }
00445 }
00446 }
00447
00448
00449
00450 void QgsPropertyKey::subkeyList( QStringList & entries ) const
00451 {
00452
00453 QHashIterator < QString, QgsProperty* > i( mProperties );
00454 while ( i.hasNext() )
00455 {
00456
00457 if ( !i.next().value()->isLeaf() )
00458 {
00459 entries.append( i.key() );
00460 }
00461 }
00462 }
00463
00464
00465 bool QgsPropertyKey::isLeaf() const
00466 {
00467 if ( 0 == count() )
00468 {
00469 return true;
00470 }
00471 else if ( 1 == count() )
00472 {
00473 QHashIterator < QString, QgsProperty* > i( mProperties );
00474
00475 if ( i.hasNext() && i.next().value()->isValue() )
00476 {
00477 return true;
00478 }
00479 }
00480
00481 return false;
00482 }